/* Cisoly — house style for portal and console.
   Light sidebar with section labels, white cards, indigo accent. */

:root {
  /* Spacing and radius tokens live in tokens.css; nothing is aliased here. */
}

* { box-sizing: border-box; }
body {
  margin: 0;
  font-family: var(--font-sans);
  background: var(--canvas);
  color: var(--ink);
  font-size: 14px;
  line-height: 1.5;
}
a { color: inherit; }
h1 { font-size: 1.6rem; font-weight: 600; margin: 0; letter-spacing: -.01em; }
h2 { font-size: 1.02rem; font-weight: 600; margin: 0; }
code { font-family: ui-monospace, Menlo, monospace; font-size: .85em; background: var(--canvas); border: 1px solid var(--hairline); padding: .1em .4em; border-radius: 6px; }
.icon { width: 18px; height: 18px; flex: none; }

/* --------------------------------------------------------------- layout */
.shell { display: flex; min-height: 100vh; }
.main { flex: 1; display: flex; flex-direction: column; min-width: 0; }
.content { padding: 1.7rem 2.2rem 3rem; display: flex; flex-direction: column; gap: 1.3rem; }
/* A form that wraps several cards gives them the same spacing as
   standalone cards. */
.content > form { display: flex; flex-direction: column; gap: 1.3rem; }

/* -------------------------------------------------------------- sidebar */
.sidebar {
  width: 250px; flex: none;
  background: var(--card);
  border-right: 1px solid var(--hairline);
  display: flex; flex-direction: column;
  padding: 1.3rem 1rem 1.1rem;
  gap: 1.1rem;
  /* Fixed at screen height: the menu scrolls inside, name and log out
     stay in view at all times. */
  position: sticky; top: 0; height: 100vh;
}
.brand { display: flex; align-items: center; gap: .6rem; padding: 0 .5rem .4rem; }
.brand-logo {
  width: 32px; height: 32px; border-radius: 9px;
  background: var(--violet); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-weight: 700; font-size: 1rem;
}
.brand-name { font-weight: 700; font-size: 1.05rem; letter-spacing: -.01em; }
.brand-sub, .workstrip-label { color: var(--secondary); font-size: .72rem; font-weight: 600; letter-spacing: .06em; }
.brand-sub { margin-left: auto; }

/* The menu scrolls against the sidebar's own border: the list reaches into
   the right padding (negative margin) and puts that padding back on its
   content, so the scrollbar sits at the edge and the items stay where they
   were. */
.side-nav { display: flex; flex-direction: column; gap: .1rem; flex: 1; overflow-y: auto;
  margin-right: -1rem; padding-right: 1rem; scrollbar-width: thin; }
.side-label {
  color: var(--secondary); font-size: .68rem; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase;
  padding: 1rem .6rem .35rem;
}
.side-nav > .side-label:first-child { padding-top: .2rem; }
.side-nav-item {
  display: flex; align-items: center; gap: .65rem;
  padding: .55rem .6rem; border-radius: 10px;
  text-decoration: none; color: var(--body); font-weight: 500;
}
.side-nav-item .icon, .acc-label .icon, .sot-notice .icon { color: var(--secondary); }
.side-nav-item:hover { color: var(--ink); background: var(--canvas); }
.side-nav-item:hover .icon { color: var(--body); }
.side-nav-item.active { color: var(--ink); background: var(--neutral-tint); font-weight: 600; }
.side-nav-item.active .icon { color: var(--violet-text); }

/* No border: the card sits flush at the foot of the sidebar, its top
   rule the only line; the sidebar's own padding around it is cut to 4px
   on the sides and the bottom. */
.sidebar-footer {
  border: 0; border-top: 1px solid var(--user-card-rule); border-radius: 0;
  padding: 10px 0 0; margin: 0 calc(4px - 1rem) calc(4px - 1.1rem);
  display: flex; flex-direction: column; gap: 8px;
}
.sidebar-footer .user-card-top, .sidebar-footer .user-card-foot { padding-left: 8px; padding-right: 8px; }
.sidebar-footer .user-card-foot { padding-bottom: 6px; }
.user-card-top { display: flex; align-items: center; gap: 10px; min-width: 0; }
.user-avatar {
  width: 36px; height: 36px; border-radius: 50%; flex: none;
  background: var(--violet-tint); color: var(--violet-text);
  display: flex; align-items: center; justify-content: center; font: 700 13px/1 var(--font-sans); letter-spacing: .02em;
}
.user-info { display: flex; flex-direction: column; min-width: 0; flex: 1; gap: 1px; }
.user-name, .file-drop-title, .call-advisor-name { font-weight: 600; font-size: 14px; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--ink); }
.user-mail, .otb-fr-tile .otb-fr-name, .cc-second, .call-advisor-sub { font-size: 12px; color: var(--secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.user-mail { line-height: 1.3; }
.user-more { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 4px; color: var(--secondary); }
.user-more:hover, .user-more:focus-visible { color: var(--violet-text); background: var(--violet-tint); }
/* The two rules of the card in the lightest grey there is (--skeleton), the
   version small and in the lightest text the brand allows. */
.user-card-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding-top: 8px; border-top: 1px solid var(--user-card-rule); }
.user-card-foot .brand-version { font-size: 11px; color: var(--user-card-text); }
.user-out, .attn4-more { color: var(--violet-text); font-size: 13px; font-weight: 600; text-decoration: none; }
.user-out:hover { text-decoration: underline; }
/* Signing out is a POST: the link is a button that looks like the link. */
.user-out-form { margin: 0; }
button.user-out { background: none; border: 0; padding: 0; font: inherit; font-size: 13px; font-weight: 600;
                  cursor: pointer; text-align: right; }

/* -------------------------------------------------------------- top bar */
.top-bar {
  display: flex; align-items: center; justify-content: space-between; gap: 1.2rem;
  padding: .85rem 2.2rem; background: var(--card); border-bottom: 1px solid var(--hairline);
}
.search-field {
  display: flex; align-items: center; gap: .6rem;
  width: min(420px, 42vw);
  border: 1px solid var(--hairline); border-radius: var(--r-control);
  padding: .5rem .8rem; background: var(--card); color: var(--body);
}
.search-field:focus-within { border-color: var(--violet); }
.search-field input { border: 0; outline: 0; flex: 1; font: inherit; color: var(--ink); background: transparent; }
.search-field kbd {
  font-family: inherit; font-size: .72rem; color: var(--body);
  border: 1px solid var(--hairline); border-radius: 6px; padding: .1rem .4rem; background: var(--canvas);
}
.top-bar-right { display: flex; align-items: center; gap: .85rem; }
/* The domain picker: the same shape as the language picker, a touch wider; a
   fixed domain (a user with a single domain) is shown as plain text. */
.top-bar-left { display: flex; align-items: center; gap: .85rem; }
.domain-picker { max-width: 260px; font-weight: 600; }
.sidebar-domain { display: none; padding: 10px 14px 4px; }
.sidebar-domain .domain-picker { display: block; width: 100%; max-width: 100%; margin-top: 6px; }
.domain-picker.fixed { display: inline-flex; align-items: center; height: 32px; padding: 0 10px; border: 1px solid var(--hairline);
  border-radius: 8px; font: 600 13px/1 var(--font-sans); color: var(--ink); white-space: nowrap; }
.top-avatar {
  width: 36px; height: 36px; border-radius: 50%;
  background: var(--violet-tint); color: var(--violet-text);
  display: flex; align-items: center; justify-content: center; font-weight: 700;
}
.top-who { display: flex; flex-direction: column; line-height: 1.25; }
.top-name { font-weight: 600; font-size: .88rem; }
.top-role { color: var(--body); font-size: .76rem; }

/* --------------------------------------------------------------- page */
.page-heading { display: flex; flex-direction: column; gap: .2rem; }
.page-sub { color: var(--body); }

/* The breadcrumb bar above the title of every portal page (core/crumbs.py,
   docs/FLOWS.md 7.174): Back, a divider, the path on one line that never
   wraps (a crumb gives way with an ellipsis). Below 768px: Back, the
   divider, ••• with the crumbs in between, and the parent crumb. */
.crumb-bar { display: flex; align-items: center; gap: 12px; min-height: 32px; min-width: 0; }
.crumb-bar > .button.crumb-back { flex: none; height: 32px; min-height: 32px; padding: 0 14px 0 10px; gap: 6px; border-radius: 4px;
  font: 600 14px/1 var(--font-sans); white-space: nowrap; text-decoration: none; }
.crumb-divider { flex: none; width: 1px; align-self: stretch; margin: 6px 0; background: var(--hairline); }
.crumbs { flex: 1 1 auto; min-width: 0; }
.crumbs ol { display: flex; align-items: center; min-width: 0; margin: 0; padding: 0; list-style: none; white-space: nowrap; overflow: hidden; }
.crumb { display: flex; align-items: center; min-width: 0; flex: 0 1 auto; color: var(--secondary); font: 400 14px/1.3 var(--font-sans); }
.crumb-middle { flex-shrink: 3; }
.crumb + .crumb::before { content: "\203A"; flex: none; margin: 0 8px; color: var(--secondary); }
.crumb > a, .crumb > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: inherit; text-decoration: none; }
.crumb > a:hover { color: var(--ink); text-decoration: underline; }
.crumb-current { color: var(--ink); font-weight: 600; }
.crumb-more { display: none; position: relative; flex: none; }
.crumb-more-button { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 4px;
  background: var(--neutral-tint); color: var(--body); font: 600 13px/1 var(--font-sans); letter-spacing: 1px; cursor: pointer; }
.crumb-more-menu { position: absolute; top: calc(100% + 4px); left: 0; z-index: 30; min-width: 200px; max-width: 280px; margin: 0; padding: 4px;
  list-style: none; background: var(--card); border: 1px solid var(--hairline); border-radius: 4px; box-shadow: var(--shadow-float); }
.crumb-more-menu[hidden] { display: none; }
.crumb-more-menu a { display: block; padding: 8px 10px; border-radius: 4px; color: var(--ink); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.crumb-more-menu a:hover { background: var(--canvas); }
@media (max-width: 767px) {
  .crumb-more { display: block; }
  .crumb-middle, .crumb-current { display: none; }
  .crumb-parent::before { display: none; }
}
@media print { .crumb-bar { display: none; } }

/* ----------------------------------------------------------------- cards */
.card {
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card);
  padding: 1.25rem 1.4rem;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .04);
}
.cards-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; }
.card.stat { display: flex; flex-direction: column; gap: .55rem; }
.stat-heading { display: flex; align-items: center; gap: .55rem; color: var(--body); font-weight: 500; font-size: .86rem; }
.stat-heading .icon {
  width: 30px; height: 30px; padding: 6px; border-radius: 9px;
  background: var(--canvas); border: 1px solid var(--hairline); color: var(--body);
}
.stat-rule { display: flex; align-items: center; gap: .6rem; }
.stat-value, .otd-figure .otd-value { font-size: 1.75rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.stat-value { letter-spacing: -.02em; }
.stat-delta { font-size: .76rem; font-weight: 600; padding: .17rem .5rem; border-radius: 999px; }
.stat-delta.good { color: var(--green-text); background: var(--green-tint); }
.stat-delta.attention { color: var(--red-text); background: var(--red-tint); }
.card-heading { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: 1.05rem; }
.card-heading-links { display: flex; align-items: center; gap: .6rem; }
.card-heading-links .icon { color: var(--body); }
.card-sub { color: var(--body); font-size: .8rem; }
.card-link { color: var(--violet-text); font-weight: 600; font-size: .84rem; text-decoration: none; }
.card-link:hover { text-decoration: underline; }
.card-links { display: flex; gap: 16px; flex: none; white-space: nowrap; }
.two-column { display: grid; grid-template-columns: 1.1fr 1.3fr; gap: 1rem; }
/* Equal width, not 1.1fr against 1.3fr: on the dashboard the two cards of a
   row carry the same weight -- IT risks beside OT risks -- so an even split
   is what a reader expects. Only the dashboard pairs its columns this way; a
   .two-column without .equal keeps the wider right-hand column. Stays above
   the max-width:980px rule, which has the same specificity and wins only by
   standing later.

   The gap is the 14px of a dashboard card (section 23), not the 24px the
   plain .two-column carries. That is what makes the seam between these two
   cards fall exactly where the seam between the stat cards above it falls:
   both grids then divide the same width by the same gutter, so an even
   number of stat cards lines up with the pair below. */
.two-column.equal { grid-template-columns: 1fr 1fr; gap: 14px; }

/* ------------------------------------------------------------- mobile */
.hamburger { display: none; border: 1px solid var(--hairline); background: var(--card);
             border-radius: 8px; padding: .45rem .55rem; cursor: pointer; color: var(--ink);
             align-items: center; }
.side-scrim { display: none; }
.only-narrow { display: none; }
@media (max-width: 980px) {
  .two-column, .two-column.equal { grid-template-columns: 1fr; }
  .sidebar { position: fixed; top: 0; bottom: 0; left: 0; z-index: 40; width: 264px;
             overflow-y: auto; transform: translateX(-105%); transition: transform .2s ease;
             box-shadow: 0 10px 40px rgba(15, 18, 34, .18); }
  .shell.sidebar-open .sidebar { transform: none; }
  .shell.sidebar-open .side-scrim { display: block; position: fixed; inset: 0; z-index: 30;
                                   background: rgba(15, 18, 34, .35); }
  .hamburger { display: inline-flex; }
  .search-field { display: none; }
  /* The domain picker moves out of the top bar into the menu. */
  .top-bar-left { display: none; }
  .sidebar-domain { display: block; }
  .top-bar { padding-left: .9rem; padding-right: .9rem; gap: .6rem; }
  .top-who { display: none; }
  .content { padding: 1rem .9rem 2.5rem; gap: 1rem; }
  h1 { font-size: 1.3rem; }
  /* Wide tables scroll inside their card instead of the page. */
  .card { overflow-x: auto; }
  /* ...but a card with a choice field or a record picker keeps its list of options whole (an absolute list
     inside a scrolling card was cut off, 2026-10-20). */
  .card:has(.link-pane) { overflow: visible; }
  .rule-form { flex-wrap: wrap; }
  .page-heading .page-sub { display: block; }
  /* An action that sits in the last table column on desktop falls out of
     view on a narrow screen; there it belongs under the name. */
  .only-narrow { display: block; margin-top: 4px; }
}
@media (max-width: 700px) {
  /* Inline grids (such as the control editor) stack into a single column. */
  .content [style*="grid-template-columns"] { display: block !important; }
  .content [style*="grid-template-columns"] > * { margin-bottom: .8rem; }
}

/* ------------------------------------------------------------------ bars */
.bars { display: flex; align-items: flex-end; gap: 1rem; height: 200px; padding-top: .4rem; }
.bar { flex: 1; display: flex; flex-direction: column; align-items: center; gap: .45rem; height: 100%; justify-content: flex-end; }
.bar i {
  display: block; width: 100%; max-width: 36px; height: var(--h);
  border-radius: 8px;
  background: linear-gradient(180deg, #7C7AF0 0%, #5B57E8 100%);
}
.bar:nth-child(2n) i { background: linear-gradient(180deg, #6EE7DA 0%, #2CC8B4 100%); }
.bar span { font-size: .74rem; color: var(--body); }


/* ------------------------------------------------ reports and forms */
.report { border-radius: 10px; padding: .7rem 1rem; font-weight: 500; border: 1px solid var(--hairline); background: var(--card); }
.report.success { border-color: #BFE8D4; background: var(--green-tint); color: var(--green-text); }
.report.error, .trust-flash.error { border-color: #F6C6C2; background: var(--red-tint); color: var(--red-text); }
.form { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: .9rem; align-items: end; }
.form label { display: flex; flex-direction: column; gap: .3rem; font-size: .8rem; font-weight: 600; color: var(--body); }
.form input[type="text"]:not(.link-pane-entry), .form input[type="email"], .form input:not([type]) {
  border: 1px solid var(--hairline); border-radius: var(--r-control); padding: .55rem .7rem; font: inherit; color: var(--ink);
}
.form .tick-mark { flex-direction: row; align-items: center; gap: .5rem; font-weight: 500; }
.button {
  background: var(--violet); color: #fff; border: 0; border-radius: 10px;
  padding: .6rem 1.1rem; font: inherit; font-weight: 600; cursor: pointer;
}
.button:hover { background: var(--violet-hover); }
.button.small { padding: .35rem .7rem; font-size: .78rem; background: var(--card); color: var(--ink); border: 1px solid var(--hairline); }
.button.small:hover { border-color: var(--body); }
.button.small.danger { color: var(--red-text); border-color: #F6C6C2; }
.button.small.danger:hover { background: var(--red-tint); }
.button.danger { background: var(--red-text); }
.button.danger:hover { background: #B91C1C; }
.language-picker { border: 1px solid var(--hairline); border-radius: 8px; background: var(--card);
              color: var(--ink); font: inherit; font-size: .8rem; padding: .3rem .5rem; }
.chips { display: flex; flex-wrap: wrap; gap: .4rem; }
.chip { display: inline-flex; align-items: center; gap: .35rem; background: var(--violet-tint);
        color: var(--violet-text); border-radius: 999px; padding: .25rem .7rem; font-size: .82rem;
        font-weight: 500; }
.chip-x { border: none; background: none; color: inherit; font-size: 1rem; cursor: pointer;
          line-height: 1; padding: 0; }
.toggle { appearance: none; position: relative; width: 40px; height: 22px; flex: 0 0 40px;
           background: #D1D5DB; border-radius: 999px; cursor: pointer; transition: background .15s; }
.toggle:checked { background: var(--violet); }
.toggle::after { content: ""; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;
                  border-radius: 50%; background: #fff; transition: transform .15s; }
.toggle:checked::after { transform: translateX(18px); }
.toggle:disabled { opacity: .55; cursor: default; }

/* ------------------------------------------------ document workspace */
.doc-workspace { display: grid; grid-template-columns: 260px 1fr; gap: 1rem; align-items: start; }
@media (max-width: 980px) { .doc-workspace { grid-template-columns: 1fr; } }
.doc-entry { border: 1px solid var(--hairline); border-radius: 8px; padding: .4rem .6rem;
              font: inherit; font-size: .85rem; }
.doc-section { border-top: 1px solid var(--hairline); padding: 1rem 0; }
.doc-section-title { border: none; background: transparent; font: inherit; font-weight: 600;
                    font-size: 1rem; width: 100%; padding: .2rem 0; }
.doc-section-title:focus { outline: 2px solid var(--violet); outline-offset: 2px; border-radius: 4px; }
.doc-toolbar { display: flex; gap: .25rem; margin: .4rem 0; }
.doc-toolbar button { border: 1px solid var(--hairline); background: var(--card); border-radius: 6px;
                      padding: .2rem .55rem; cursor: pointer; font-size: .8rem; color: var(--ink); }
.doc-toolbar button:hover { border-color: var(--violet); color: var(--violet-text); }
.doc-editor { border: 1px solid var(--hairline); border-radius: 10px; padding: .7rem .9rem;
              min-height: 90px; background: var(--card); font-size: .9rem; }
.doc-editor:focus { outline: 2px solid var(--violet); outline-offset: 1px; }
.doc-comments { margin-top: .6rem; display: flex; flex-direction: column; gap: .4rem; }
.doc-comment { display: flex; align-items: center; justify-content: space-between; gap: .6rem;
                 background: var(--canvas); border-radius: 8px; padding: .45rem .7rem; font-size: .84rem; }
.doc-comment.af { opacity: .5; }

/* The continuous document page (Confluence-like). */
.doc-canvas { padding: 2rem 2.6rem 2.2rem; }
.doc-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem;
           margin-bottom: .6rem; flex-wrap: wrap; }
.doc-title { font-size: 1.75rem; letter-spacing: -.02em; }
.doc-meta { display: flex; align-items: center; gap: .5rem; margin-top: .45rem; flex-wrap: wrap; }
.doc-toolbar.sticky { position: sticky; top: 0; z-index: 5; background: var(--card);
                        border-bottom: 1px solid var(--hairline); padding: .5rem 0; margin: .4rem 0 0;
                        align-items: center; }
.doc-flow { margin-top: 1.1rem; }
.doc-flow-heading { display: flex; align-items: center; justify-content: space-between; gap: .6rem; }
.doc-flow-title { font-size: 1.15rem; font-weight: 600; margin: 0; padding: .15rem 0; flex: 1; }
.doc-flow-title:focus { outline: 2px solid var(--violet); outline-offset: 3px; border-radius: 4px; }
.doc-flow-actions { display: flex; align-items: center; gap: 8px; }
.doc-comment-button { border: none; background: none; cursor: pointer; font-size: .85rem;
                      color: var(--body); padding: .2rem .4rem; border-radius: 6px; }
.doc-comment-button:hover { background: var(--canvas); }
.doc-editor.fluid { border: none; border-radius: 0; padding: .2rem 0 .6rem; min-height: 40px; }
.doc-editor.fluid:focus { outline: none; box-shadow: inset 3px 0 0 var(--violet-tint); padding-left: .6rem; }
.doc-comments.thread { background: var(--canvas); border-radius: 10px; padding: .7rem .8rem; margin: .3rem 0 .6rem; }
/* A statement in the editor (stcard, Rinat's design of 2026-10-31; templates/_statement_block.html): a card with the
   violet edge; its heading line (code, folder, links, and on the right its order, comment mark and Edit), the panel
   Edit opens, the change chip and the text, 10px apart. The version and changes views draw the same card. */
.statement-block, .srun-card { display: flex; flex-direction: column; gap: 10px; padding: 16px; min-width: 0;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.statement-block { margin: 8px 0; border-left: 3px solid var(--violet); scroll-margin-top: 72px; }   /* a link to it lands under the sticky toolbar */
.statement-heading { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; min-width: 0; min-height: 32px; }
.statement-heading > .doc-flow-actions { margin-left: auto; flex: none; }
.statement-block > .dm-line { margin: 0; }
.doc-editor.statement { border: none; padding: 0; min-height: 24px; font-size: 15px; line-height: 1.6; }
.doc-editor.statement:focus { outline: none; box-shadow: inset 3px 0 0 var(--green-tint); padding-left: .5rem; }

/* --------------------------------------------- collapsible menu groups */
.side-group { border: none; }
.side-group-heading { display: flex; align-items: center; gap: .55rem; padding: .5rem .55rem;
                border-radius: 9px; cursor: pointer; font-weight: 600; font-size: .86rem;
                color: var(--ink); list-style: none; user-select: none; }
.side-group-heading::-webkit-details-marker { display: none; }
.side-group-heading:hover { background: var(--canvas); }
.side-group-heading .icon { color: var(--body); }
/* The whole heading folds the group open or shut (it never opens a page);
   the arrow shows the state. */
.sidegroup-arrow { margin-left: auto; width: 14px; height: 14px; transition: transform .15s; box-sizing: content-box; padding: 6px; margin-right: -6px; }
.side-group[open] > .side-group-heading .sidegroup-arrow { transform: rotate(90deg); }
/* An open group hangs its items on a guide line: 1px hairline under the
   heading's icon (.55rem padding + half the 18px icon), drawn beside the
   items only: a category eyebrow stands flush with the line's x and without
   it, so every run of items has its own segment. The active item is a 2px
   violet segment with its label violet 600 (no pill), a hovered item a
   faint segment and a darker label. The rail's flyout copies sit outside
   .side-group and keep their own look. */
.side-group > .side-nav-item, .side-group > .side-nav-heading { margin-left: calc(.55rem + 8px); }
.side-group > .side-nav-item { padding-left: 16px; font-size: .84rem; background: none;
  border-radius: 0 var(--r-control) var(--r-control) 0; box-shadow: inset 1px 0 0 var(--hairline);
  transition: box-shadow .12s, color .12s; }
.side-group > .side-nav-heading { padding-left: 0; }
.side-group > .side-nav-item:hover { background: none; color: var(--ink);
  box-shadow: inset 2px 0 0 color-mix(in srgb, var(--violet-text) 35%, var(--hairline)); }
.side-group > .side-nav-item.active { background: none; color: var(--violet-text); font-weight: 600;
  box-shadow: inset 2px 0 0 var(--violet-text); }
td.actions { display: flex; gap: .4rem; flex-wrap: wrap; }
td.actions form { margin: 0; }

/* -------------------------------------------------------------- row forms */
.rule-form { display: flex; gap: .4rem; align-items: center; margin: 0; }
/* a form row that may wrap onto a second line, and the one field in it that takes the room left */
.rule-form.wraps { flex-wrap: wrap; }
.rule-form .grows { flex: 1; min-width: 220px; }
/* a card whose parts stand 10px apart by its gap (heading, table, form, note), never by their margins */
.card.card-stack { display: flex; flex-direction: column; gap: 10px; }
.card.card-stack > .card-heading { margin-bottom: 0; }
/* a table row opened for editing in place (its form under the row it edits) */
.data-table > tbody > tr.row-editing > td, .data-table > tbody > tr.row-editing:hover > td { background: var(--canvas); }
.rule-form select, .form select {
  border: 1px solid var(--hairline); border-radius: var(--r-control); padding: .45rem .6rem;
  font: inherit; color: var(--ink); background: var(--card);
}
.assignment { display: flex; gap: .9rem; align-items: center; flex-wrap: wrap; padding: .6rem 0; border-bottom: 1px solid var(--hairline); }
.assignment:last-of-type { border-bottom: none; }
.assignment .tick-marks { display: flex; gap: .9rem; flex-wrap: wrap; }
.tick-mark { display: flex; align-items: center; gap: .35rem; font-size: .85rem; color: var(--body); }

.report.customer_view { border-color: #D9D6FA; background: var(--violet-tint); color: var(--violet-text); }
.report.customer_view a { color: var(--violet-text); font-weight: 600; }

/* Customer logo top left (house style) */
.brand-image { height: 30px; max-width: 140px; object-fit: contain; border-radius: 6px; }
.button.small.subtle { background: transparent; color: var(--ink); border: 1px solid var(--hairline); }
.button.small.subtle:hover { background: var(--canvas); }

/* Document workspace: the controls (grey, process) apart from the paper (white, content) */
.doc-controls { background: var(--canvas); }
.doc-paper {
  background: var(--card); border: 1px solid var(--hairline); border-radius: 14px;
  padding: 1.6rem 2.4rem 2.2rem; margin-top: 1rem;
  box-shadow: 0 1px 4px rgba(20, 24, 40, .06);
}
.statement-tools { display: inline-block; position: relative; }
.statement-tools > summary { list-style: none; cursor: pointer; padding: 0;
  display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px;
  border: 1px solid var(--hairline); border-radius: 6px; color: var(--secondary); }
.statement-tools > summary::-webkit-details-marker { display: none; }
.statement-tools[open] > summary { background: var(--canvas); }
/* A statement's panel (stcard): folder, linked requirements, linked controls -- three labelled groups side by side on
   the violet tint, stacked on a narrow screen -- and the action row across them, Delete on the left and Done. */
.statement-panel { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 16px 24px; align-items: start; padding: 16px; background: var(--violet-tint); border-radius: var(--r-control); }
.statement-panel[hidden] { display: none; }
.statement-panel > .card-actions { grid-column: 1 / -1; margin: 0; }
.stmt-group { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.statement-panel .link-pane { min-height: 40px; padding: 4px 8px; gap: 6px; }
.statement-panel .link-pane .chip { height: 28px; padding: 0 4px 0 10px; font-size: 13px; }
.statement-panel .link-pane .chip.fixed { padding-right: 10px; }
.statement-panel .link-pane-entry { min-width: 150px; height: 28px; }
@media (max-width: 980px) { .statement-panel { grid-template-columns: 1fr; } }
.statement-tools[open] { display: block; }
@media (max-width: 700px) { .doc-paper { padding: 1rem; } }

/* Progress bars on the dashboard */
.progress-bar-row { display: flex; align-items: center; gap: .6rem; margin-top: .35rem; }
.progress-bar-label { color: var(--body); font-size: .78rem; width: 110px; flex: none; }
.progress-bar { flex: 1; height: 8px; background: var(--canvas); border: 1px solid var(--hairline);
         border-radius: 999px; overflow: hidden; }
.progress-bar i.second { background: var(--violet); }
.progress-bar-pct { width: 42px; text-align: right; font-size: .78rem; font-weight: 600;
             font-variant-numeric: tabular-nums; }

/* Link groups on the requirement page: a dropdown per framework/document */
.link-group-box { border-top: 1px solid var(--hairline); padding: .45rem 0; }
.link-group-box > summary { cursor: pointer; display: flex; align-items: center; gap: .55rem;
                         list-style: none; }
.link-group-box > summary::-webkit-details-marker { display: none; }
.link-group-box > summary::before { content: "▸"; color: var(--secondary); font-size: .8rem;
                                 transition: transform .15s ease; }
.link-group-box[open] > summary::before { transform: rotate(90deg); }
.link-group-box .tick-marks { display: flex; flex-wrap: wrap; gap: .35rem .8rem; margin: .55rem 0 .3rem 1.1rem; }

/* Process steps: a numbered series with arrows */
.process-steps { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; margin-top: .55rem; }
.process-step { display: inline-flex; align-items: center; gap: .45rem; background: var(--canvas);
               border: 1px solid var(--hairline); border-radius: 999px; padding: .3rem .8rem .3rem .35rem;
               font-size: .84rem; }
.process-step i { font-style: normal; width: 22px; height: 22px; border-radius: 50%; flex: none;
                 background: var(--violet); color: #fff; display: flex; align-items: center;
                 justify-content: center; font-size: .74rem; font-weight: 700; }
.process-arrow { color: var(--secondary); }

/* Tabs (manual) */
/* More tabs than the width allows: the bar scrolls inside itself, never the page. */
.tabbar { display: flex; gap: .3rem; border-bottom: 2px solid var(--hairline); overflow-x: auto; scrollbar-width: none; max-width: 100%; }
.tabbar::-webkit-scrollbar { display: none; }
.tabbar .tab { border: none; background: none; cursor: pointer; font: inherit;
                padding: .55rem 1rem; color: var(--body); font-weight: 600;
                border-bottom: 2px solid transparent; margin-bottom: -2px;
                display: flex; align-items: center; gap: .45rem; flex: none; white-space: nowrap; }
.tabbar .tab:hover { color: var(--ink); }
.tabbar .tab.active { color: var(--violet-text); border-bottom-color: var(--violet); }
.tabbar a.tab { text-decoration: none; }

/* Automatically maintained document sections (Version history, Reviewers, Approval) */
.auto-section { background: var(--canvas); border: 1px dashed var(--hairline); border-radius: 12px;
               padding: .7rem 1rem; margin: .8rem 0; }
.auto-section .doc-editor { opacity: .92; }

/* Text fragment maintained by Cisoly (version/date line) */
.cisoly-managed { background: var(--violet-tint); color: var(--violet-text);
                  border-radius: 6px; padding: .05em .4em; white-space: nowrap; }
.cisoly-managed::after { content: " ⟳"; font-size: .82em; opacity: .75; }


/* Relations section: manageable document relations, recognisable in amber */
.relation-section { background: #FFF8EC; border: 1px dashed #F0D9A8; border-radius: 12px;
                  padding: .7rem 1rem; margin: .8rem 0; }
.relation-block { display: inline-flex; align-items: center; gap: .45rem;
                background: #fff; border: 1px solid #F0D9A8; border-radius: 10px;
                padding: .35rem .7rem; font-size: .84rem; }
.relation-block .card-link { color: #92600A; }

/* Relation rows: one manageable block per line */
.relation-row { display: flex; align-items: center; gap: .6rem; background: #fff;
               border: 1px solid #F0D9A8; border-radius: 10px; padding: .5rem .8rem;
               font-size: .86rem; }
.relation-row.relation-new { background: transparent; border-style: dashed; }
.relation-comment { color: #92600A; font-size: .78rem; background: #FBEED3;
                     border-radius: 999px; padding: .15rem .6rem; }

/* Field cards: the control fields of a document, each in a box of its own
   with a clear label — console and portal. */
.field-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: .6rem; margin: .8rem 0; }
.field-card-content { display: flex; gap: .4rem; align-items: center; flex-wrap: wrap;
  min-width: 0; }
.field-card-sub { color: var(--body); font-size: .72rem; margin-top: auto; }
/* Fields and forms stay inside their box: they shrink and wrap rather
   than stick out or cut buttons off. */

/* Document typography: tables with visible borders and left-aligned
   content, calm paragraph and list spacing — console and portal. */
.doc-editor table { border-collapse: collapse; width: 100%; margin: .5rem 0 .9rem;
  font-size: .85rem; }
.doc-editor th, .doc-editor td, .read-content th { border: 1px solid var(--hairline); text-align: left; vertical-align: top; }
.doc-editor th, .doc-editor td { padding: .45rem .65rem; }
.doc-editor th, .read-content th { background: var(--canvas); font-weight: 600; }
.doc-editor td p, .doc-editor th p { margin: 0; }
/* The three registers Cisoly maintains inside a document -- version
   history, reviewers, approval. A document's own tables stay as the writer
   made them; these carry the table of section 23, so the record of who
   reviewed and who approved reads as a record and not as body text. */
.doc-editor table.cisoly-register { border: 1px solid #C9CCD8; border-radius: 4px;
  border-collapse: separate; border-spacing: 0; overflow: hidden; font-size: .82rem; }
.doc-editor table.cisoly-register th { background: var(--violet); color: #fff;
  height: 34px; padding: 0 .7rem; border: none; font-weight: 600;
  font-size: .72rem; text-transform: uppercase; letter-spacing: .06em;
  white-space: nowrap; }
.doc-editor table.cisoly-register td { border: none; border-top: 1px solid #DDE0E8;
  padding: .5rem .7rem; vertical-align: top; }
.doc-editor table.cisoly-register tbody tr:nth-child(even) td { background: #F7F8FA; }
.doc-editor table.cisoly-register tbody tr:first-child td { border-top: none; }
/* Version numbers and dates line up as figures, not as prose. */
.doc-editor table.cisoly-register td:first-child,
.doc-editor table.cisoly-register td:nth-child(2) { font-family: var(--font-mono);
  font-variant-numeric: tabular-nums; white-space: nowrap; }
/* The "nothing yet" row spans the table and is a sentence, not a figure. */
.doc-editor table.cisoly-register td[colspan] { font-family: var(--font-sans);
  color: var(--secondary); white-space: normal; }
.doc-editor p { margin: .3rem 0 .6rem; line-height: 1.6; }
.doc-editor ul, .doc-editor ol { margin: .3rem 0 .7rem; padding-left: 1.4rem; }
.doc-editor li { margin: .18rem 0; line-height: 1.55; }
.doc-flow { margin-top: 1.5rem; }
.doc-flow-title { font-size: 18px; }

/* Reading view: the document as calmly typeset policy text. */
.read-page { background: var(--card); border: 1px solid var(--hairline);
  border-radius: 12px; padding: 3rem 3.5rem; max-width: 860px; margin: 0 auto;
  font-family: Charter, Georgia, Cambria, "Times New Roman", serif;
  font-size: 1rem; line-height: 1.7; color: var(--ink); }
.read-cover { text-align: center; border-bottom: 3px double var(--hairline);
  padding-bottom: 1.6rem; margin-bottom: 1.6rem; }
.read-kind { text-transform: uppercase; letter-spacing: .25em; font-size: .8rem;
  color: var(--body); margin: 0 0 .6rem; }
.read-cover h1, .read-cover .read-name { font-size: 2rem; letter-spacing: -.01em; margin: 0 0 .4rem;
  font-weight: 700; }
.read-org { font-style: italic; color: var(--body); margin: 0 0 .8rem; }
.read-rule { font-size: .88rem; color: var(--body); margin: 0 0 .4rem; }
.read-status { display: inline-block; font-size: .78rem; font-family: var(--font, ui-sans-serif), system-ui, sans-serif;
  border: 1px solid var(--hairline); border-radius: 999px; padding: .15rem .7rem;
  color: var(--body); margin: 0; }
.read-status.good, .ote-step.ready, .call-button.booked { border-color: var(--green-text, #16a34a); color: var(--green-text, #16a34a); }
.read-table_of_contents { border: 1px solid var(--hairline); border-radius: 10px;
  padding: 1rem 1.4rem; margin-bottom: 1.8rem; background: var(--canvas); }
.read-table_of_contents ol { margin: 0; padding-left: 1.3rem; column-count: 2; column-gap: 2rem; }
/* chapters numbered in their own titles: no second number from the list (FLOWS 7.544) */
.read-table_of_contents ol.read-toc-own { list-style: none; padding-left: 0; }
.read-table_of_contents li { font-size: .88rem; margin: .15rem 0; }
.read-table_of_contents a { color: var(--ink); text-decoration: none; }
.read-table_of_contents a:hover { color: var(--violet-text); }
.read-chapter { margin: 1.8rem 0; }
.read-chapter h2 { font-size: 1.3rem; margin: 0 0 .7rem; padding-bottom: .3rem;
  border-bottom: 1px solid var(--hairline); font-weight: 700; }
.read-content p { margin: .4rem 0 .8rem; }
.read-content ul, .read-content ol { margin: .4rem 0 .8rem; padding-left: 1.6rem; }
.read-content table { border-collapse: collapse; width: 100%; margin: .6rem 0 1rem;
  font-size: .9rem; }
.read-content td { border: 1px solid var(--hairline);
  padding: .5rem .7rem; text-align: left; vertical-align: top; }
.read-content th { padding: .5rem .7rem; }
.read-content td p, .read-content th p { margin: 0; }
.read-content .cisoly-managed { background: none; }
.read-statement { display: flex; gap: .8rem; align-items: flex-start;
  border-left: 3px solid var(--violet); background: var(--canvas);
  border-radius: 0 8px 8px 0; padding: .6rem .9rem; margin: .6rem 0; }
.read-statement-code { font-family: ui-monospace, Menlo, monospace;
  font-weight: 700; font-size: .82rem; white-space: nowrap; padding-top: .15rem; }
.read-statement p { margin: 0; }
@media (max-width: 760px) { .read-page { padding: 1.4rem 1.2rem; }
  .read-table_of_contents ol { column-count: 1; } }
@media print {
  .sidebar, .side-scrim, .header-bar, .no-print, .report { display: none !important; }
  .main { margin: 0 !important; padding: 0 !important; }
  .read-page { border: none; padding: 0; max-width: none; }
  .read-chapter { break-inside: avoid-page; }
}

/* Matrix colours. */
.cell-layer { background: #e3f4e6 !important; }
.cell-middle { background: #fdf1dc !important; }
.cell-high { background: #fde5e5 !important; }
.cell-score { font-weight: 700; text-align: center; }

/* Form sections (2026-09-26): the one set of building blocks every form is
   drawn with, so a change of look is one edit here. The look is that of the
   newest designs: the register and the risk create forms, the risk
   settings, the control page.
   .form-section       a block of a padless form card; a hairline between blocks
   .form-section-head  its heading line: an h2/h3 of 15px/600 and a
                       .form-section-sub (13px, soft); a .form-fold-all on its right
   .form-grid          fields in columns of at least 210px, or .cols-2/3/4;
                       .form-wide takes the whole row; one column on a phone
   .form-field         a label over its control, 8px apart; .form-field-head a
                       label with an action on its right; .form-fieldset a group
   .form-label         the label, 14px/500 ink (--text-label); with .eyebrow the
                       mono uppercase label; .form-required its red mark,
                       .form-soft a soft note in it ("· optional")
   .form-hint          one line of 12px under a field or at the top of a fold
   .form-error         the message of a field in error, in words
   .form-fold          a fold (details) of a long form: its summary, the
                       .form-fold-digest of what is filled in, .form-fold-fields
                       a stack; .form-fold-all opens every fold, .form-fold-bar holds it
   .form-more          "More sections": a .form-more-title over a .form-more-list
                       of .form-more-row (.form-more-toggle with .form-more-chevron,
                       .form-more-name and .form-more-state; .form-more-region)
   and the action row, .card-actions, below. */
.form-section { display: flex; flex-direction: column; gap: 16px; padding: 16px; min-width: 0; }
.form-section + .form-section { border-top: 1px solid var(--hairline); }
.form-section-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; min-height: 24px; margin: 0; }
.form-section-head > h2, .form-section-head > h3, .form-section-head > .cp-legend-title, .rrc-score-head h2 { margin: 0; font: 600 15px/1.3 var(--font-sans); color: var(--ink);
  white-space: nowrap; flex: none; }
.form-section-head > .form-fold-all { margin-left: auto; }
.form-section-sub, .rs-line, .rcr-soft, .attn4-group-name, .spotlight-sub, .dash-fw-counts, .dash-sub, .dash-foot, .form-more-title, .tree-empty, .fstep-nav-dir, .data-table .rr-score .rr-sub, .isok-kv dt, .member-text .mono, .acct-meta-label, .ro-score-n, .ro-gap-id, .ro-level-range, .fwl-table td.fwl-version, .rpbd-status-count, .sck-group-tally, .sck-group-sub { font: 400 13px/1.4 var(--font-sans); }
.form-section-sub, .rs-line, .rcr-soft, .dash-fw-counts, .dash-sub, .dash-foot, .form-more-title, .tree-empty, .fstep-nav-dir, .isok-kv dt, .member-text .mono, .acct-meta-label, .ro-score-n, .ro-gap-id, .ro-level-range, .fwl-table td.fwl-version, .rpbd-status-count, .sck-tally, .sck-group-tally, .sck-group-sub { color: var(--secondary); }
.form-section-sub { min-width: 0; }
.form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 16px; align-items: start; }
.form-grid > * { min-width: 0; }
.form-grid.cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.form-grid.cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.form-grid.cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.form-grid.cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.form-wide { grid-column: 1 / -1; }
.form-field { display: flex; flex-direction: column; gap: 8px; min-width: 0; margin: 0; }
.form-field[hidden], .form-fieldset[hidden] { display: none; }
.form-field .doc-entry { width: 100%; }
.form-field-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.form-fieldset, .setup-tab fieldset.form.setup-form, .setup-tab fieldset.slx-many, .rn-fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
.form-fieldset > legend { padding: 0; margin-bottom: 8px; }
.form-label, .form-label.eyebrow { display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px; min-width: 0; margin: 0; }
.form-label:not(.eyebrow) { font: var(--text-label); color: var(--ink); }
.form-required { color: var(--red-text); font-weight: 600; }
.form-soft { font-style: normal; font-weight: 400; color: var(--secondary); text-transform: none; letter-spacing: 0; min-width: 0; }
.form-hint, .list-note, .share-ring-text small, .cmap-heat-sub, .soly-conv-link .soly-conv-meta, .setup-tab .setup-howto-example, .form-error, .assistant-note, .setup-tab .setup-help, .setup-tab .setup-card-sub, .facts dt, .step-meter-line { font: 400 12px/1.4 var(--font-sans); }
.form-hint, .list-note, .cmap-heat-sub, .soly-conv-link .soly-conv-meta, .setup-tab .setup-howto-example, .assistant-note, .setup-tab .setup-help, .setup-tab .setup-card-sub, .facts dt, .step-meter-line { color: var(--secondary); }
.form-hint, .list-note, .cmap-heat-sub, .form-error, .assistant-note, .setup-tab .setup-help { margin: 0; }
.form-error { color: var(--red-text); }
/* recommended, never asked (FLOWS 7.151): the word after a label and its hint in amber */
.form-soft.form-recommended, .form-hint.form-recommended { color: var(--amber-text); }
.form-fold { margin-top: 10px; border: 1px solid var(--hairline); border-radius: var(--r-card); padding: 0 12px; }
.form-fold.form-field { gap: 0; }
.form-fold > summary { cursor: pointer; list-style: none; display: flex; align-items: center; justify-content: space-between;
  gap: 12px; min-height: 36px; }
.form-fold > summary::-webkit-details-marker { display: none; }
.form-fold[open] > summary { border-bottom: 1px solid var(--hairline); margin-bottom: 8px; }
.form-fold > .form-grid { padding-bottom: 12px; }
.form-fold > .form-hint { margin-bottom: 10px; }
.form-fold-digest { flex: 1; min-width: 0; text-align: right; font: 400 12px/1.4 var(--font-mono); color: var(--secondary);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.form-fold[open] > summary .form-fold-digest { display: none; }
.form-fold-fields { display: flex; flex-direction: column; gap: 16px; padding-bottom: 12px; }
.form-fold-bar { display: flex; justify-content: flex-end; padding: 0 0 8px; }
.form-fold-all, .cp-link, .list-toggle, .intg-how { font: 600 13px/1 var(--font-sans); color: var(--violet-text); background: none; border: 0; cursor: pointer; white-space: nowrap; flex: none; }
.form-fold-all { padding: 8px 0; }
.form-fold-all:hover { text-decoration: underline; }
.form-section.form-more { gap: 10px; }
.form-more-list, .control-history .hist-items, .rdmp-links, .mr-checklist, .review-list, .inbox-list { list-style: none; margin: 0; padding: 0; border: 1px solid var(--hairline); border-radius: var(--r-card); }
.form-more-row + .form-more-row { border-top: 1px solid var(--hairline); }
.form-more-heading { margin: 0; font: inherit; }
.form-more-toggle { display: flex; align-items: center; gap: 12px; width: 100%; min-height: 48px; padding: 0 16px; margin: 0;
  background: none; border: 0; border-radius: var(--r-card); cursor: pointer; text-align: left; color: var(--ink);
  font: 600 14px/1.3 var(--font-sans); }
.form-more-toggle:hover { background: var(--violet-tint); }
.form-more-chevron, .attn4-chevron, .scp-chevron { width: 16px; height: 16px; flex: none; color: var(--secondary); fill: none; stroke: currentColor;
  stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; transition: transform var(--t-fast) var(--ease); }
.form-more-toggle[aria-expanded="true"] .form-more-chevron { transform: rotate(90deg); }
.form-more-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.form-more-state, .assistant-full, .page-title-timing { flex: none; white-space: nowrap; font: 400 13px/1.3 var(--font-sans); }
.form-more-state, .page-title-timing { color: var(--secondary); }
.form-more-region { padding: 4px 16px 16px 44px; }
@media (max-width: 1180px) { .form-grid.cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .form-grid.cols-5 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 720px) {
  .form-grid.cols-2, .form-grid.cols-3, .form-grid.cols-4, .form-grid.cols-5 { grid-template-columns: minmax(0, 1fr); }
  .form-more-region { padding-left: 16px; }
}
@media (prefers-reduced-motion: reduce) { .form-more-chevron { transition: none; } }
.field-row { display: flex; gap: .8rem; flex-wrap: wrap; align-items: center; }
/* One place for the primary action of a card or a form (brand book §23,
   scripts/save_buttons.py): the action row, right aligned, the last thing
   in the card or the form it saves, one per card and one shown per page.
   This is the only definition; a page never moves the row elsewhere.
   .entry-actions, .setting-actions, .rn-actions and .grp-footer each said
   this in their own way, and only two of the four aligned right: forty-eight
   save buttons sat on the left and fifteen on the right, so the reader had to
   look for the button on nearly every screen. */
.card-actions { display: flex; gap: var(--s-2); align-items: center; justify-content: flex-end;
  margin-top: var(--s-3); }
.card-actions .button { flex: none; min-height: 32px; }
/* A note or a hint may sit on the left of the row; it takes the free space so
   the buttons stay on the right. */
.card-actions .card-sub, .card-actions > span:first-child:not(.button) { margin-right: auto; text-align: left; }
/* In a grid form (.form) the row spans every column. */
.form > .card-actions { grid-column: 1 / -1; }

/* Filter bar above a register. */
.filter-bar { display: flex; gap: .45rem; flex-wrap: wrap; align-items: center;
  margin-bottom: .8rem; }
.filter-bar .doc-entry { font-size: .8rem; }

/* A tab that holds several cards (rather than one card) gets the same
   block spacing as the page itself. */
div.tab-panel { display: flex; flex-direction: column; gap: 1.3rem; }
div.tab-panel[hidden] { display: none; }
div.tab-panel > form { display: flex; flex-direction: column; gap: 1.3rem; }

/* Risk levels: freely configurable names on a fixed colour scale. */
.cell-green { background: var(--green-tint) !important; }
.cell-yellow { background: #FEF6E0 !important; }
.cell-orange { background: #FDECD9 !important; }
.cell-red { background: var(--red-tint) !important; }
.cell-darkred { background: #FBD9DA !important; }
.cell-lightgreen { background: #F1F9E3 !important; }

/* Control blocks on the framework page: one clearly framed block per
   control, with the chain and the evidence as rows inside that block. */
.control-block, .flow-figure { border: 1px solid var(--hairline); border-radius: 10px; background: var(--card); padding: .85rem 1rem; }
.control-block { margin-bottom: .9rem; }
.control-block > header { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  margin-bottom: .6rem; }
.control-block > header .control-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: .8rem; background: var(--canvas); border: 1px solid var(--hairline); border-radius: 6px;
  padding: .15rem .45rem; }
.control-block > header .control-title { font-weight: 600; }
.control-grid { display: grid; grid-template-columns: 2fr 1fr; gap: .8rem; }
@media (max-width: 760px) { .control-grid { grid-template-columns: 1fr; } }
.control-row { display: flex; gap: .5rem; align-items: center; flex-wrap: wrap;
  padding: .5rem 0 0; margin-top: .6rem; border-top: 1px dashed var(--hairline); }
.control-row > .field-card-label { min-width: 90px; }

/* =====================================================================
   House style layer — Cisoly Brand Book v1.2.
   Calm surfaces, a single violet, semantic colours only where they carry
   meaning, near-square corners, no shadow on cards at rest.
   ===================================================================== */
body { font-family: var(--font-sans); font-size: 15px; line-height: 1.6; color: var(--body); }
h1, h2, h3, .stat-value, .brand-name, strong, .otd-figure .otd-value { color: var(--ink); }
h1 { font: 600 28px/1.2 var(--font-sans); letter-spacing: -.015em; }
h2 { font: 600 18px/1.3 var(--font-sans); }
code, .control-code { font-family: var(--font-mono); }

/* Brand mark: a violet coin with an open ring, gap at the top right. */
.brand-logo { background: var(--violet); border-radius: var(--r-full); display: grid;
  place-items: center; width: 28px; height: 28px; }
.brand-logo i { width: 20px; height: 20px; border-radius: 50%; border: 4.5px solid #fff;
  border-right-color: rgba(255, 255, 255, .32); transform: rotate(-45deg); }
.brand-name { font-weight: 600; font-size: 20px; letter-spacing: -.02em; }
.brand-sub, .side-label, .workstrip-label{
  font: var(--text-eyebrow); letter-spacing: .1em; text-transform: uppercase; color: var(--secondary); }

/* Sidebar: white, a violet tinted pill for the active item. */
.sidebar { width: 260px; border-right: 1px solid var(--hairline); }
.side-nav-item, .side-group-heading { border-radius: var(--r-control); }
.side-nav-item { color: var(--secondary); font-weight: 400; }
.side-nav-item:hover, .side-group-heading:hover { background: var(--canvas); }
.side-nav-item.active { background: var(--violet-tint); color: var(--violet-text); font-weight: 600; }
.side-nav-item.active .icon { color: var(--violet-text); }
.side-group-heading { color: var(--body); font-weight: 500; }
.side-group-heading .icon, .side-nav-item .icon, .acc-label .icon, .sot-notice .icon, .evv-title .icon { color: var(--secondary); }
.sidebar-footer { border-color: var(--user-card-rule); }
.user-avatar, .top-avatar { background: var(--violet-tint); color: var(--violet-text); }

/* Top bar of 72px with a filled search field and no border. */
.top-bar { min-height: 72px; }
.search-field { background: var(--canvas); border: none; border-radius: var(--r-control); }
.search-field kbd { background: var(--card); border-color: var(--hairline); border-radius: var(--r-badge);
  font-family: var(--font-mono); }

/* Cards: 24px of air, a hairline, no shadow. */
.card { border-radius: var(--r-card); border: 1px solid var(--hairline); box-shadow: none;
  padding: var(--s-6); }
.cards-row { gap: var(--s-6); }
.content { gap: var(--s-6); padding: var(--s-6) var(--s-8) var(--s-16); }
.content > form, div.tab-panel, div.tab-panel > form { gap: var(--s-6); }

/* Stat card: the number on top, the label below it, the change after that,
   and one tinted disc at the top right. Nothing else. */
.card.stat { gap: var(--s-2); position: relative; }
.stat-rule { order: 1; }
.stat-heading { order: 2; color: var(--secondary); font: var(--text-label); }
.card.stat > .card-sub, .card.stat > .stat-rows { order: 3; }
.stat-heading .icon { position: absolute; top: var(--s-6); right: var(--s-6);
  width: 56px; height: 56px; padding: 16px; border: none;
  border-radius: var(--r-card); background: var(--violet-tint); color: var(--violet-text); }
.card.stat .stat-rule, .card.stat .stat-heading { padding-right: 68px; }
.stat-value, .otd-figure .otd-value { font: var(--text-stat); }
.stat-value { letter-spacing: -.02em; }
/* The change under the number is a sentence, not a badge — badges are for
   status. Only the colour carries the direction. */
.stat-delta { background: none; padding: 0; border-radius: 0; font-weight: 500;
  font-size: 13px; color: var(--secondary); }
.stat-delta.good { color: var(--green-text); background: none; }
.stat-delta.attention { color: var(--red-text); background: none; }
a.stat-delta { text-decoration: none; }
a.stat-delta:hover { text-decoration: underline; }
.stat-rule { flex-wrap: wrap; align-items: baseline; }
.stat-rows { display: flex; flex-direction: column; gap: var(--s-2); margin-top: var(--s-2); }
.stat-row { display: flex; justify-content: space-between; gap: var(--s-3); font-size: 14px; }
.stat-row .stat-row-value { font-weight: 600; font-variant-numeric: tabular-nums;
  white-space: nowrap; color: var(--ink); }

/* Buttons: 40px, 4px radius, 600; one primary per screen, never a shadow. */
.button { border-radius: var(--r-control); font-weight: 600; padding: .65rem 1.1rem;
  transition: background var(--t-fast) var(--ease); }
.button:hover { background: var(--violet-hover); }
.button.small { border-radius: var(--r-control); border-color: var(--hairline); color: var(--body); }
.button.small:hover { background: var(--canvas); border-color: var(--hairline); }
.button.danger { background: var(--red-deep); } .button.danger:hover { background: #A32C2D; }
.button.small.danger { color: var(--red-text); border-color: var(--red-tint); }
:where(a, button, input, select, textarea, summary, [contenteditable], [tabindex]):focus-visible {
  outline: 2px solid var(--focus-ring); outline-offset: 2px; box-shadow: none; }

/* Fields: white with a hairline, a violet focus ring with a tinted halo. */
.doc-entry, .form input, .form select, .rule-form select, .language-picker {
  border-radius: var(--r-control); border-color: var(--hairline); color: var(--ink); }
.doc-entry:focus, .form input:focus, .form select:focus {
  border-color: var(--violet); box-shadow: 0 0 0 3px var(--violet-tint); }
.doc-entry:focus-visible, .form input:focus-visible, .form select:focus-visible { box-shadow: none; }
.filter-bar .doc-entry { background: var(--canvas); border: none; }
.toggle:checked { background: var(--violet); }

/* Badges and chips: tint with deep text, 2px radius. Never a solid fill. */
.chip { border-radius: var(--r-badge); background: var(--violet-tint); color: var(--violet-text); }

/* Tabs: a 2px violet underline, the count in mono. */
.tabbar { border-bottom: 1px solid var(--hairline); }
.tabbar .tab { color: var(--secondary); font-weight: 500; }
.tabbar .tab.active { color: var(--violet-text); border-bottom-color: var(--violet); }
.tabbar a.tab { text-decoration: none; }

.control-code { font-size: 13px; }

/* Risk scale: six steps, always with black text so the level stays readable. */
.cell-score { color: var(--risk-text); font-variant-numeric: tabular-nums; }
.cell-lightgreen { background: var(--risk-2) !important; }
.cell-green { background: var(--risk-1) !important; }
.cell-yellow { background: var(--risk-3) !important; }
.cell-orange { background: var(--risk-4) !important; }
.cell-red { background: var(--risk-5) !important; }
.cell-darkred { background: var(--risk-6) !important; color: #fff; }
.cell-layer { background: var(--risk-2) !important; }
.cell-middle { background: var(--risk-3) !important; }
.cell-high { background: var(--risk-5) !important; }

/* Charts: violet first, then blue and teal; 3px bar radius. */
.bar i { background: var(--violet); border-radius: 3px; }
.bar:nth-child(2n) i { background: var(--blue); }
.progress-bar { background: var(--skeleton); border: none; }
 .progress-bar i.second { background: var(--violet); }
.process-step i { background: var(--violet); }
.process-step { border-radius: var(--r-control); }

/* Messages: tint, deep text, no border or stripe down the side. */
.report { border: none; border-radius: var(--r-control); font-weight: 400; }
.report.success { background: var(--green-tint); color: var(--green-text); }
.report.error, .trust-flash.error { background: var(--red-tint); color: var(--red-text); }
.report.customer_view { background: var(--violet-tint); color: var(--violet-text); }
.report.warning { background: var(--amber-tint); color: var(--amber-text); }   /* saved, something still to know (FLOWS 7.151) */
.report { padding: 12px 16px; font-size: 14px; line-height: 1.4; }
.report a { color: inherit; font-weight: 600; text-decoration: underline; text-underline-offset: 2px; }

/* Blocks, documents and registers follow the same shape. */
.control-block, .auto-section, .doc-paper, .read-page, .doc-editor, .relation-section, .relation-row, .relation-block, .statement-block, .doc-comment, .flow-figure {
  border-radius: var(--r-card); }
.control-block, .flow-figure { border: 1px solid var(--hairline); background: var(--card); padding: var(--s-6); }
.control-block > header .control-code { background: var(--canvas); border: none;
  border-radius: var(--r-badge); }
.relation-section { background: var(--amber-tint); border-color: var(--amber); }
.cisoly-managed { background: var(--violet-tint); color: var(--violet-text); border-radius: var(--r-badge); }

/* Motion explains a change, it never decorates. */
@media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } }

/* ---------------------------------------------------------------------
   Corrections after the brand book audit: touch targets, states, neutral
   labels, mono, and everything that still fell outside the tokens.
   --------------------------------------------------------------------- */

/* Touch targets: 40px on desktop, 44px for touch input. */
.button { padding: 0 var(--s-4); min-height: 40px; display: inline-flex;
  align-items: center; justify-content: center; gap: var(--s-2); }
.button.small { padding: 0 var(--s-3); min-height: 40px; font-size: 13px;
  background: var(--card); color: var(--body); border: 1px solid var(--hairline); }
.chip-x, .doc-comment-button { min-width: 24px; min-height: 24px; }
@media (pointer: coarse) { .button, .button.small { min-height: 44px; } }

/* States: pressed, disabled, loading. */
.button:active { background: #3A2FA0; }
.button.small:active { background: var(--table-head); }
.button:disabled, .button.small:disabled, .doc-entry:disabled, .form input:disabled,
.form select:disabled, .rule-form select:disabled, .button[aria-disabled="true"] {
  color: var(--disabled); background: var(--canvas); border-color: var(--hairline);
  cursor: default; }
.button:disabled { background: var(--canvas); }
/* Busy: the ring of the logo (from 12 o'clock anticlockwise to 3 o'clock; the
   quarter between 12 and 3 stays open) fills from 12 o'clock anticlockwise
   to 3 o'clock and then runs back again, to and fro, inside the button
   itself, next to the text. A button with data-loading gets this state when its
   form is submitted (static/js/loads.js). The animation lives in the svg
   itself (SMIL), so a single background image is enough and no extra markup
   is needed. */
.button.loading, .doc-changes-toggle.loading, .chg-switch.loading { position: relative; pointer-events: none; display: inline-flex;
  align-items: center; justify-content: center; gap: 8px; }
.button.loading::before, .doc-changes-toggle.loading::before, .chg-switch.loading::before { content: ""; flex: none; width: 16px; height: 16px; border-radius: 50%;
  background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='16' fill='%237367F0'/><g transform='rotate(90 16 16) translate(32 0) scale(-1 1)'><circle cx='16' cy='16' r='8.857' fill='none' stroke='%23A098F5' stroke-width='5.143'/><circle cx='16' cy='16' r='8.857' fill='none' stroke='%23fff' stroke-width='5.143' pathLength='100' stroke-dasharray='100 100' stroke-dashoffset='100'><animate attributeName='stroke-dashoffset' values='100;25;100' keyTimes='0;0.5;1' calcMode='spline' keySplines='0.4 0 0.6 1;0.4 0 0.6 1' dur='1.6s' repeatCount='indefinite'/></circle></g></svg>") center / contain no-repeat; }
.button.small.loading::before { width: 14px; height: 14px; }
.button.loading:disabled { background: var(--violet); color: #fff; opacity: .85; }
.skeleton { background: var(--skeleton); border-radius: var(--r-control); min-height: 14px; }

/* Focus: a 2px ring in the focus colour with 2px of space, on
   :focus-visible only (a click leaves no ring, the keyboard always gets
   one), never removed. An outline, not a shadow: a shadow disappears in
   forced-colour modes and under overflow: hidden. The editors keep the
   shadow ring as well, because their outline would cut through the text. */
.doc-section-title:focus, .doc-flow-title:focus, .doc-editor:focus,
.doc-editor.fluid:focus, .doc-editor.statement:focus {
  outline: none; box-shadow: var(--focus); }
.doc-editor.fluid:focus { padding-left: 0; }
.search-field:focus-within { box-shadow: var(--focus); }

.mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
.nowrap { white-space: nowrap; }
.table-wrap { overflow-x: auto; }
.card-link.subtle { color: var(--ink); }
/* A card-link that submits a form is still a link. A <button> arrives with
   the browser's own chrome -- a fill, a border, its own padding -- and
   .card-link only ever repainted the text on top of it, so "Switch off" and
   "Delete" sat in native boxes and, where that chrome is the accent colour,
   in the same colour as their own text. */
button.card-link { background: none; border: 0; padding: 0; margin: 0;
  font: inherit; font-weight: 600; font-size: .84rem; line-height: inherit;
  cursor: pointer; }
button.card-link:hover { text-decoration: underline; }
/* Removing something does not read the same as opening it. */
.card-link.danger { color: var(--red-text); }
.doc-entry.compact { font-size: 13px; padding: var(--s-1) var(--s-2); }
.field-error-entry { border-color: var(--red); }
code { border: none; background: var(--canvas); border-radius: var(--r-badge);
  font-size: 13px; padding: .1em .4em; }
.tabbar { border-bottom: 2px solid var(--hairline); }
.hamburger, .brand-image, .doc-toolbar button, .doc-comment-button,
.statement-tools > summary, .statement-panel { border-radius: var(--r-control); }
.doc-comments.thread { border-radius: var(--r-card); }
.sidebar { box-shadow: none; }
.card.stat .stat-rule, .card.stat .stat-heading { padding-right: 80px; }
input[type="checkbox"], input[type="radio"] { accent-color: var(--violet);
  width: 18px; height: 18px; }
.toggle { height: 24px; background: var(--disabled);
  transition: background var(--t-fast) var(--ease); }
.toggle::after { top: 3px; background: var(--card); transition: transform var(--t-fast) var(--ease); }
.sidegroup-arrow { transition: transform var(--t-fast) var(--ease); }
.link-group-box > summary::before { transition: transform var(--t-fast) var(--ease); }
.process-step i { border-radius: var(--r-badge); font: 500 11px/1 var(--font-mono); }

/* Risk colours always carry black text and the level. */
.cell-darkred { color: var(--risk-text-dark); }

/* Document relations are data, not a warning: blue instead of amber. */
.relation-section { background: var(--blue-tint); border: 1px solid var(--blue-tint); }
.relation-block, .relation-row { background: var(--card); border: 1px solid var(--hairline);
  border-radius: var(--r-card); }
.relation-block .card-link { color: var(--blue-text); }
.relation-comment { color: var(--blue-text); background: var(--blue-tint); font-size: 12px;
  border-radius: var(--r-badge); padding: var(--s-1) var(--s-2); }
.auto-section { border: 1px solid var(--hairline); }
.doc-paper { box-shadow: none; }
.cisoly-managed::after { content: none; }

/* Reading view: the same typeface as the rest, set more calmly. */
.read-page { font-family: var(--font-sans); font: var(--text-body);
  font-family: var(--font-sans); }
.read-cover { border-bottom: 1px solid var(--hairline); }
.read-kind { font: var(--text-eyebrow); letter-spacing: .1em; text-transform: uppercase; }
.read-cover h1, .read-cover .read-name { font: var(--text-h2); letter-spacing: -.015em; }
.read-org { font-style: normal; color: var(--secondary); }
.read-status { font: 500 12px/1.4 var(--font-sans); border: none;
  background: var(--table-head); color: var(--secondary); border-radius: var(--r-badge); }
.read-status.good, .ote-step.ready { background: var(--green-tint); color: var(--green-text); }
.read-table_of_contents { border-radius: var(--r-card); }
.read-chapter h2 { font: 600 18px/1.3 var(--font-sans); }
.read-chapter h2 { font: var(--text-h2); }
.read-statement { border: 1px solid var(--hairline); border-radius: var(--r-card); }
.read-statement-code { font: 500 13px/1.4 var(--font-mono); }

/* Framework coverage: an 8px bar, threshold colour, percentage in mono. */
.progress-bar { border-radius: var(--r-badge); }
.progress-bar-pct { width: 48px; font: 500 13px/1.4 var(--font-mono); }
.progress-bar-label { font: var(--text-label); width: 112px; }

/* Empty and error state: a disc, one sentence, one action. */
.is-empty { display: flex; flex-direction: column; align-items: center;
  gap: var(--s-2); padding: var(--s-8) var(--s-6); text-align: center; }
.is-empty .disc { width: 56px; height: 56px; border-radius: var(--r-card);
  background: var(--violet-tint); color: var(--violet-text); display: grid; place-items: center; }
.is-empty.error .disc { background: var(--red-tint); color: var(--red-text); }
.is-empty h3, .is-empty h2, .rs-label, .cp-card-choice strong, .setup-tab .setup-back-text h3, .setup-tab .setup-howto h3, .seg-name, .distribution-heading .mono, .sknw-label, .procd-empty-title, .rqx-h3, .member-switch .toggle-row, .members-side .mfa-policy .toggle-row, .soly-conv-link .soly-conv-title, .dl-ask-text > strong, .soly-task-card-name, .rep-choice-name, .help-tip-title, .form-fold > summary > .form-fold-text, .aside-note > h3, .mock-sender, .inbox-subject { font: 600 18px/1.3 var(--font-sans); color: var(--ink); }
.is-empty h3, .is-empty h2, .setup-tab .setup-back-text h3, .setup-tab .setup-howto h3, .aside-note > h3 { margin: 0; }
.is-empty p, .rv-empty, .mr-count, .page-skeleton-text { color: var(--secondary); margin: 0; }

/* Audit log: dots on a hairline spine. */
.timeline { display: flex; flex-direction: column; gap: var(--s-3);
  border-left: 1px solid var(--hairline); padding-left: var(--s-4); }
.timeline-row { position: relative; display: flex; gap: var(--s-3);
  align-items: baseline; justify-content: space-between; }
.timeline-row::before { content: ""; position: absolute; left: calc(var(--s-4) * -1 - 5px);
  top: 6px; width: 10px; height: 10px; border-radius: var(--r-full); background: var(--secondary); }
.timeline-row.good::before { background: var(--green); }
.timeline-row.attention::before { background: var(--amber); }
.timeline-row.error::before { background: var(--red); }
.timeline-row strong { font-weight: 600; }
.timeline-row .time, .doc-stored { font: 500 12px/1.4 var(--font-mono); color: var(--secondary); }

/* The 64px rail from the brand book asks for an icon per menu item; our
   items only carry an icon at group level. Until that set exists the
   sidebar stays a drawer below 1280px — see the report. */

/* Dark mode: the same tokens, different neutrals. Light is the
   default; dark only comes on when the user chooses it. */
:root[data-theme="dark"] {
  color-scheme: dark;
  --canvas: #1C1F2E; --card: #252838; --hairline: #33374A; --table-head: #2B2F41;
  --ink: #F3F4F8; --body: #B4B8C8; --secondary: #9196A9; --skeleton: #2B2F41;
  --violet-text: #9D94F4; --blue-text: #66A3EB;
    --neutral-tint: #2B2F41; --table-rule: #3A3E52;
  --violet-tint: rgba(115, 103, 240, .18); --green-tint: rgba(40, 199, 111, .16);
  --red-tint: rgba(234, 84, 85, .18); --amber-tint: rgba(245, 185, 66, .16);
  --blue-tint: rgba(43, 127, 227, .18); --teal-tint: rgba(60, 197, 192, .16);
  --green-text: #4ED897; --red-text: #FF8A8A; --amber-text: #F5B942;
  --focus: 0 0 0 2px #1C1F2E, 0 0 0 4px var(--focus-ring);
}
body { background: var(--canvas); color: var(--body); }
.sidebar, .card, .top-bar .search-field { background: var(--card); }
.theme-button { border: none; background: none; color: var(--secondary); cursor: pointer;
  padding: var(--s-2); border-radius: var(--r-control); display: inline-flex; }
.theme-button:hover { background: var(--canvas); color: var(--ink); }

/* Icons inside a badge or chip are at text size, not at nav size. */
.chip .icon, .stat-delta .icon { width: 14px; height: 14px; }
.button .icon, .button.small .icon { width: 16px; height: 16px; }
.doc-toolbar button .icon { width: 16px; height: 16px; }

:root[data-theme="light"] { color-scheme: light; }

/* Stat cards: four per row on desktop, two on tablet, one on mobile —
   the 12-column grid from the brand book, with 24px gutters. */
.cards-row { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.two-column { gap: var(--s-6); }
@media (max-width: 767px) { .cards-row { grid-template-columns: 1fr; } }

/* =====================================================================
   Brand Book v1.3
   ===================================================================== */

/* Risk scale: six saturated levels, black text — white on Critical. */
.cell-lightgreen { background: var(--risk-2) !important; }
.cell-green      { background: var(--risk-1) !important; }
.cell-yellow       { background: var(--risk-3) !important; }
.cell-orange     { background: var(--risk-4) !important; }
.cell-red       { background: var(--risk-5) !important; }
.cell-darkred { background: var(--risk-6) !important; color: #fff; }
.cell-layer { background: var(--risk-2) !important; }
.cell-middle { background: var(--risk-3) !important; }
.cell-high { background: var(--risk-5) !important; }
.cell-lightgreen, .cell-green, .cell-yellow, .cell-orange, .cell-red { color: var(--risk-text); }
/* Opportunity scale (opprisk, docs/FLOWS.md 7.173): four greens of their own,
   the matrix toggle "Opportunities" and the list's opportunity levels. */
.cell-opp1 { background: var(--opp-1) !important; }
.cell-opp2 { background: var(--opp-2) !important; }
.cell-opp3 { background: var(--opp-3) !important; }
.cell-opp4 { background: var(--opp-4) !important; }
.cell-opp1, .cell-opp2, .cell-opp3, .cell-opp4 { color: var(--risk-text); }

.data-table .cell-score { font-family: var(--font-mono); }

/* Framework coverage: violet, 12px, 2px radius, a hairline as the track.
   The percentage carries the judgement — no threshold colours. */
.progress-bar { height: 12px; background: transparent; border: 1px solid var(--hairline);
  border-radius: var(--r-badge); }
.progress-bar i.second, .progress-bar i.coverage-good, .progress-bar i.coverage-middle, .progress-bar i.coverage-layer { background: var(--violet); border-radius: var(--r-badge); }

/* Document workspace: a sheet of paper, not a form. */
.doc-paper { max-width: none; padding: 40px; }
.read-page { max-width: 760px; padding: 40px; margin-inline: auto; }
.doc-canvas { max-width: none; }
.doc-editor, .read-content { font: 400 15px/1.7 var(--font-sans); }
.doc-toolbar button { width: 28px; height: 28px; padding: 0; display: inline-flex;
  align-items: center; justify-content: center; color: var(--body); }
.doc-toolbar button.active { background: var(--violet-tint); color: var(--violet-text); }
.doc-comments.thread { background: var(--amber-tint); box-shadow: inset 0 -2px 0 var(--amber); }
.doc-comment.af { background: transparent; opacity: .6; }

/* Print: no canvas grey, no tints, no shadow; risk fills stay, with a
   point scale and a repeating table header. */
@media print {
  :root { --canvas: #fff; --card: #fff; --hairline: #9DA2B4; --table-head: #EEF0F4;
    --table-rule: #9DA2B4; --ink: #111; --body: #4A4F63; --secondary: #4A4F63;
    --shadow-float: none; }
  @page { size: A4; margin: 20mm; }
  body { font: 10.5pt/15pt var(--font-sans); color: var(--ink); background: #fff; }
  h1 { font: 600 22pt/26pt var(--font-sans); border-bottom: 1.5pt solid var(--violet);
    padding-bottom: 6pt; }
  h2 { font: 600 15pt/20pt var(--font-sans); }
  h3 { font: 600 12pt/16pt var(--font-sans); }
  .data-table, table { font-size: 9.5pt; }
  .data-table th, table th { background: var(--ink); color: #fff; }
  .data-table td, .data-table th, table td, table th { border: .5pt solid var(--table-rule); }
  thead { display: table-header-group; }
  tr { break-inside: avoid; }
  .chip { background: none !important; border: .5pt solid var(--hairline);
    color: var(--ink) !important; }
  .cell-score, [class*="cell-"] { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  .cell-darkred { color: #fff !important; }
  .no-print, nav, aside, .sidebar, .top-bar, .status-strip, .side-scrim, .report { display: none !important; }
  .doc-paper, .read-page { max-width: none; padding: 0; border: none; }
}

/* In a filled risk cell everything inherits the cell colour — otherwise a
   bold count turns ink-coloured again on dark red. */
[class*="cell-"] strong, [class*="cell-"] b, [class*="cell-"] a,
.pill[class*="level-"] strong { color: inherit; }

/* Stat card v1.3: title → count → change on the left, and on the right a
   ring meter with the percentage. Counts keep the icon tile and set the
   count large. */
.card.stat { display: flex; flex-direction: column; gap: var(--s-2);
  padding: 22px var(--s-6); position: relative; }
.card.stat > * { min-width: 0; }
/* The ring sits beside the content on the right and does not set the height. */
.card.stat > .stat-meter { position: absolute; top: 50%; right: var(--s-6);
  transform: translateY(-50%); }
.card.stat.meter { min-height: 128px; justify-content: center; }
.card.stat.meter > *:not(.stat-meter) { padding-right: 108px; }
.stat-heading { order: 1; font: var(--text-label); color: var(--body); }
.stat-rule { order: 2; }
.card.stat > .stat-delta { order: 3; }
.card.stat > .card-sub, .card.stat > .stat-rows, .card.stat > .field-row { order: 4; }
.card.stat.meter .stat-value { font: 600 22px/1 var(--font-sans); letter-spacing: -.02em; }
.card.stat.meter .stat-delta { margin-top: var(--s-2); }
.stat-delta { font: 600 13px/1.4 var(--font-sans); }
.stat-unit, .otd-figure .otd-label { font: var(--text-label); color: var(--body); }
.stat-meter-trace { fill: none; stroke: var(--skeleton); }
.stat-meter-value { fill: none; stroke: var(--violet); }
.stat-meter-text { font: 600 14px/1 var(--font-sans); fill: var(--ink); }
/* The icon tile of a count card: 56px, tinted, vertically centred. */
.card.stat .stat-heading .icon { position: absolute; top: 50%; right: var(--s-6);
  transform: translateY(-50%); width: 56px; height: 56px; padding: 16px;
  border-radius: var(--r-card); background: var(--violet-tint); color: var(--violet-text);
  border: none; }
.card.stat:not(.meter) .stat-rule, .card.stat:not(.meter) .stat-heading { padding-right: 80px; }
/* On a count card the change sits under the number, not beside it. */
.card.stat .stat-rule { display: flex; flex-wrap: wrap; align-items: baseline;
  gap: var(--s-1) var(--s-2); }
.card.stat:not(.meter) .stat-rule .stat-delta { flex-base: 100%; }
/* A button that happens to be a link stays a button. */
a.button, a.button:hover { text-decoration: none; }

/* Library rail (§18): categories with a mono count{ padding: var(--s-4) var(--s-3); }
/* Workflow strip (§18): 44px under the heading, 24px avatars, deadline in
   mono, the actions on the right. */
.workstrip { display: flex; align-items: center; gap: var(--s-6); min-height: 44px;
  padding-bottom: var(--s-3); margin-bottom: var(--s-4);
  border-bottom: 1px solid var(--hairline); flex-wrap: wrap; }
.workstrip-group { display: flex; align-items: center; gap: var(--s-2); }
.workstrip-right { margin-left: auto; display: flex; align-items: center; gap: var(--s-2);
  flex-wrap: wrap; }
.avatar { width: 24px; height: 24px; border-radius: var(--r-full); background: var(--violet-tint);
  color: var(--violet-text); font: 600 10px/24px var(--font-sans); text-align: center;
  display: inline-block; flex: none; letter-spacing: .02em; }
/* A reviewer who marked the current round as reviewed: a 2px ring in the
   platform green on the avatar (also over the violet ring of a group member,
   iso.css .avatar.via) and on a group's chip once one of its people did. */
.avatar.reviewed, .avatar.via.reviewed { box-shadow: 0 0 0 2px var(--green); }
.chip.grp-reviewer.reviewed { box-shadow: 0 0 0 2px var(--green); }
.avatar.dotted { background: transparent; border: 1px dashed var(--disabled);
  color: var(--secondary); line-height: 22px; cursor: pointer; }
.avatar.dotted:hover { border-color: var(--violet); color: var(--violet-text); }
.avatar-shape { display: inline-flex; position: relative; margin: 0; }
.avatar-gone { position: absolute; top: -6px; right: -6px; width: 16px; height: 16px;
  border-radius: var(--r-full); border: none; background: var(--ink); color: var(--card);
  font-size: 11px; line-height: 16px; padding: 0; cursor: pointer; opacity: 0;
  min-width: 0; min-height: 0; }
.avatar-shape:hover .avatar-gone, .avatar-shape:focus-within .avatar-gone { opacity: 1; }
.avatar-add { position: relative; }
.avatar-add > summary::-webkit-details-marker { display: none; }
.avatar-add > summary { list-style: none; }
.avatar-add[open] > form { position: absolute; top: 30px; left: 0; z-index: 5;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card);
  box-shadow: var(--shadow-float); padding: var(--s-2); }

/* One height for every control: fields, select lists and buttons are
   40px (32px when compact), so that they line up. */
.doc-entry, .form input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not(.link-pane-entry),
.form select, .rule-form select, .rule-form input:not([type="file"]):not(.link-pane-entry),
.filter-bar .doc-entry, .language-picker, select.doc-entry {
  box-sizing: border-box; height: 40px; min-height: 40px; padding: 0 var(--s-3);
  line-height: 38px; font-size: 14px; vertical-align: middle; }
select.doc-entry, .form select, .rule-form select, .language-picker, .choice-field .link-pane.pick {
  padding-right: 32px; -webkit-appearance: none; appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236E7388' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9l6 6 6-6'/></svg>");
  background-repeat: no-repeat; background-position: right 10px center; }
textarea.doc-entry { height: auto; min-height: 80px; line-height: 1.6; padding: var(--s-2) var(--s-3); }
.doc-entry.compact, select.doc-entry.compact, .rule-form select.compact, .filter-bar .doc-entry.compact, .filter-bar select.doc-entry.compact { height: 32px; min-height: 32px; line-height: 30px; font-size: 13px; }
.doc-entry.compact, select.doc-entry.compact, .rule-form select.compact { padding: 0 var(--s-2); }
select.doc-entry.compact { padding-right: 28px; }
.rule-form select.compact { padding: 0 var(--s-2); }
.button.small.compact { min-height: 32px; }
.rule-form { align-items: center; }

/* Dashboard blocks: distribution bars, checklist, work list, recent. */
.distributions { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--s-8); }
.distribution-heading { display: flex; justify-content: space-between; align-items: baseline;
  font: 600 15px/1.3 var(--font-sans); color: var(--ink); margin-bottom: var(--s-2); }
.distribution-gauge { display: flex; height: 12px; border-radius: var(--r-badge); overflow: hidden;
  background: var(--skeleton); gap: 2px; }
.distribution-part { display: block; min-width: 4px; }
.distribution-legend { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-4); margin-top: var(--s-2);
  font-size: 13px; color: var(--body); }
.distribution-legend span { display: inline-flex; align-items: center; gap: var(--s-1); }
.series-1 { background: var(--violet); } .series-2 { background: var(--blue); }
.series-3 { background: var(--teal); } .series-4 { background: var(--amber); }
.series-rest { background: var(--disabled); }
.distribution-part.good, .distribution-legend i.good { background: var(--green); }
.distribution-part.attention, .distribution-legend i.attention { background: var(--amber); }
.distribution-part.error, .distribution-legend i.error { background: var(--red); }
.risk-lightgreen { background: var(--risk-2); } .risk-green { background: var(--risk-1); }
.risk-yellow { background: var(--risk-3); } .risk-orange { background: var(--risk-4); }
.risk-red { background: var(--risk-5); } .risk-darkred { background: var(--risk-6); }
.three-column { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--s-6); }
.checklist, .work_list, .recent { list-style: none; margin: 0; padding: 0; }
.checklist li, .work_list li, .recent li { display: flex; align-items: center; gap: var(--s-3);
  padding: var(--s-3) 0; border-top: 1px solid var(--hairline); font-size: 14px; }
.checklist li:first-child, .work_list li:first-child, .recent li:first-child { border-top: none; padding-top: 0; }
.checklist .tick { width: 18px; height: 18px; border-radius: var(--r-badge); flex: none;
  border: 1px solid var(--disabled); display: grid; place-items: center; }
.checklist li.ready .tick, .rset-step.ready .rset-tick, .step.active .step-bullet, .rdmp-phase-row.selected .rdmp-num, .raw-switch.on { background: var(--violet); border-color: var(--violet); color: #fff; }
.checklist .tick .icon { width: 12px; height: 12px; stroke-width: 2.5; }
.checklist li.ready a { color: var(--secondary); }
.work_list .dot { width: 10px; height: 10px; border-radius: var(--r-full); flex: none; }
.work_list .dot.good { background: var(--green); } .work_list .dot.attention { background: var(--amber); }
.work_list .dot.error { background: var(--red); }
.work_list a, .recent a { flex: 1; min-width: 0; }
.work_list .days { color: var(--secondary); white-space: nowrap; }
.work_list .days.error { color: var(--red-text); font-weight: 600; }
.recent .icon { color: var(--secondary); flex: none; }
.recent .time { color: var(--secondary); text-align: right; line-height: 1.2; white-space: nowrap; }
.recent .time small { font-size: 10px; }
.legend-level { display: inline-flex; align-items: center; gap: var(--s-2);
  color: var(--ink); text-decoration: none; font-weight: 500; }
.legend-level:hover { color: var(--violet-text); }

/* Matrix & settings: large filled cells with white seams, axes in
   mono, the appetite line as a dotted top border, settings on the right. */
.matrix-layout { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(320px, .85fr); gap: var(--s-6); align-items: start; }
@media (max-width: 1100px) { .matrix-layout { grid-template-columns: 1fr; } }
.matrix-side-column { display: flex; flex-direction: column; gap: var(--s-6); }
.matrix-side-column form, .matrix-layout > form { display: flex; flex-direction: column; gap: var(--s-6); }
.matrix-raster { display: grid; grid-template-columns: 40px repeat(var(--columns), minmax(0, 1fr)); gap: 3px; }
.matrix-cell { aspect-ratio: 1.6; min-height: 56px; display: grid; place-items: center;
  font: 600 20px/1 var(--font-sans); color: var(--risk-text); position: relative; }
.matrix-cell.cell-darkred { color: #fff; }
.matrix-cell.empty .matrix-score { font: 400 14px/1 var(--font-mono); opacity: .55; }
.matrix-cell.appetite { box-shadow: inset 0 3px 0 0 var(--ink); }
.matrix-cell.appetite::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 0;
  border-top: 3px dashed var(--ink); }
.matrix-cell.appetite { box-shadow: none; }
.matrix-as { display: grid; place-items: center; font: 500 12px/1 var(--font-mono); color: var(--secondary); }
.matrix-legend { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-4); margin-top: var(--s-4);
  font: 500 11px/1.4 var(--font-mono); text-transform: uppercase; letter-spacing: .06em; color: var(--body); }
.matrix-legend span { display: inline-flex; align-items: center; gap: var(--s-2); }
.matrix-legend i { width: 14px; height: 14px; border-radius: var(--r-badge); display: inline-block; }
.matrix-legend i.appetite-line { width: 18px; height: 0; border-top: 3px dashed var(--ink); border-radius: 0; }
.segment, .ctrend-toggle { display: inline-flex; border: 1px solid var(--hairline); border-radius: var(--r-control); overflow: hidden; }
.segment-button { background: var(--card); color: var(--body); border: none; border-right: 1px solid var(--hairline);
  padding: 0 var(--s-4); min-height: 40px; font: 600 14px/1 var(--font-sans); cursor: pointer;
  display: inline-flex; align-items: center; }
.segment-button:last-child { border-right: none; }
.segment-button.active { background: var(--violet-tint); color: var(--violet-text); }
.segment-button input { position: absolute; opacity: 0; width: 0; height: 0; }
.segment-button:has(input:disabled) { cursor: default; }

/* rsettings (2026-09-26, Rinat's mock-up): the Settings tab of the IT and
   the OT risk register (templates/_risk_settings.html). One form in
   sections on the left, each a card with a heading band (title 18px/600,
   one soft line of 13px) over a hairline and its fields; the framework's
   checklist on the right, sticky. Fields 40px, labels 14px/500, values
   15px; the level table's head 40px violet; the swatches and the preview
   bar in the risk scale (--risk-1..6). The type measured on the mock-up
   (a 1.43x capture), the spacing held to §23. The selectors carry two
   classes, so the later generic rules (.card, .doc-entry, .segment-button)
   do not undo them. */
.rset-layout { display: grid; grid-template-columns: minmax(0, 1fr) 352px; gap: 16px; align-items: start; }
.rset-layout > .rset-form { display: flex; flex-direction: column; gap: 16px; min-width: 0; container-type: inline-size; }
/* Four fields in a row need the width of the mock-up's column; narrower
   (the sidebar open on a 1400px screen) they go two by two. */
@container (max-width: 760px) { .rset-card .form-grid.cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.card.rset-card { padding: 0; }
.rset-card .rset-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 14px 16px 12px;
  border-bottom: 1px solid var(--hairline); }
.rset-head .rset-head-words { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rset-head .rset-head-words h2 { font: 600 18px/1.4 var(--font-sans); color: var(--ink); margin: 0; }
.soly-task-meta, .rset-head .rset-sub, .call-plan-line { font-size: 13px; line-height: 1.4; color: var(--secondary); margin: 0; }
.rset-head .rset-head-link { flex: none; white-space: nowrap; margin-top: 4px; min-height: 0; padding: 0; border: 0; background: none; cursor: pointer;
  font: 600 13px/1.4 var(--font-sans); color: var(--violet-text); text-decoration: none; }
.rset-head .rset-head-link:hover { text-decoration: underline; }
.rset-head .rset-head-link:disabled { color: var(--secondary); cursor: default; text-decoration: none; }
.rset-card .rset-body { padding: 16px; }
.rset-card .rset-stack { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.rset-card .doc-entry { width: 100%; font-size: 15px; }
.rset-card textarea.doc-entry { min-height: 88px; }
.rset-card .rset-axis { display: flex; flex-direction: column; gap: 8px; }
/* The scale as a segmented control: four equal cells, the chosen one tinted. */
.segment.rset-segment { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); width: 100%; height: 40px;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); }
.rset-segment .segment-button { position: relative; display: flex; align-items: center; justify-content: center; min-height: 0; height: 100%;
  padding: 0; border-right: 1px solid var(--hairline); font: 600 15px/1 var(--font-sans); color: var(--ink); background: var(--card); cursor: pointer; }
.rset-segment .segment-button:last-child { border-right: 0; }
.rset-segment .segment-button.active, .rset-segment .segment-button:has(input:checked) { background: var(--violet-tint); color: var(--violet-text); }
.rset-segment .segment-button:has(input:focus-visible), .cq-choice .segment-button:has(input:focus-visible), .cq-progress .segment-button:has(input:focus-visible), .soly-fill-segment .segment-button:has(input:focus-visible), .sck-scope .segment-button:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: -4px; }
.rset-segment .segment-button:has(input:disabled) { cursor: default; }
/* A number with its unit inside the field, soft, on the right. */
.rset-card .rset-suffixed, .form-card .rset-suffixed, .rcr-card .rset-suffixed { position: relative; display: block; }
.rset-suffixed .doc-entry { padding-right: 72px; }
.rset-suffixed .rset-suffix { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); font-size: 13px; color: var(--secondary); pointer-events: none; }
/* Scoring: read-only, grey, a lock in front. */
.rset-card .rset-locked { display: flex; align-items: center; gap: 8px; height: 40px; padding: 0 12px; border: 1px solid var(--hairline);
  border-radius: var(--r-control); background: var(--canvas); font-size: 15px; color: var(--ink); white-space: nowrap; overflow: hidden; }
.rset-locked .rset-locked-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
/* The assessment owner: the person picker at 40px with a search glyph. */
.rset-card .rset-person { position: relative; }
.rset-person > .icon { position: absolute; left: 12px; top: 12px; width: 16px; height: 16px; color: var(--secondary); z-index: 1; pointer-events: none; }
.rset-person .record-picker .link-pane.pick { min-height: 40px; padding: 4px 8px 4px 36px; }
.rset-person .record-picker .link-pane.pick .link-pane-entry { font-size: 15px; height: 30px; }
.rset-body > .form-hint { margin-top: 12px; }
/* Level labels: a table from edge to edge under the heading band. */
.rset-card .rset-table-wrap { overflow-x: auto; }
.rset-card .rset-levels { width: 100%; border-collapse: collapse; }
.rset-levels thead th { height: 40px; padding: 0 12px; background: var(--table-head-bg); color: #fff; text-align: left; white-space: nowrap;
  font: 600 12px/1 var(--font-sans); letter-spacing: .06em; text-transform: uppercase; border: 0; }
.rset-levels th:first-child, .rset-levels td:first-child { padding-left: 16px; }
.rset-levels th:last-child, .rset-levels td:last-child { padding-right: 16px; }
.rset-levels tbody td { height: 60px; padding: 0 12px; border-bottom: 1px solid var(--hairline); vertical-align: middle; }
.rset-levels th:nth-child(2) { width: 140px; }
.rset-levels th:nth-child(3) { width: 200px; }
.rset-levels th:nth-child(4) { width: 96px; }
.rset-levels th:nth-child(5) { width: 44px; }
.rset-levels .rset-level-name { position: relative; display: block; min-width: 160px; }
.rset-levels .rset-level-name .doc-entry { height: 36px; min-height: 36px; line-height: 34px; padding-left: 32px; }
.rset-level-name .rset-dot { position: absolute; left: 12px; top: 50%; width: 10px; height: 10px; margin-top: -5px; border-radius: var(--r-badge); }
.rset-levels .doc-entry.rset-until { height: 36px; min-height: 36px; line-height: 34px; }
.rset-levels .rset-swatches { display: flex; align-items: center; gap: 8px; }
.rset-swatches .rset-swatch { position: relative; flex: none; width: 24px; height: 24px; border-radius: var(--r-badge); cursor: pointer; }
.rset-swatch input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
.rset-swatches .rset-swatch:has(input:checked) { outline: 2px solid var(--ink); outline-offset: 2px; }
.rset-swatches .rset-swatch:has(input:focus-visible) { box-shadow: 0 0 0 6px var(--card), 0 0 0 8px var(--focus-ring); }
.rset-swatches .rset-swatch:has(input:disabled) { cursor: default; }
.rset-levels .rset-range { font: 600 15px/1 var(--font-sans); color: var(--ink); white-space: nowrap; font-variant-numeric: tabular-nums; }
/* the 28px icon button of a table row: a level's trash here, the caret of a row that opens (.row-fold-toggle, FLOWS 7.375),
   the console's "?" help (.help-tip-button, FLOWS 7.423) */
.rset-levels .rset-remove, .row-fold-toggle, .help-tip-button { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; min-height: 0; padding: 0; border: 0;
  border-radius: var(--r-control); background: none; color: var(--secondary); cursor: pointer; }
.rset-remove .icon { width: 16px; height: 16px; }
.rset-levels .rset-remove:hover { color: var(--red-text); background: var(--red-tint); }
.rset-card .sw-lightgreen { background: var(--risk-2); }
.rset-card .sw-green { background: var(--risk-1); }
.rset-card .sw-yellow { background: var(--risk-3); }
.rset-card .sw-orange { background: var(--risk-4); }
.rset-card .sw-red { background: var(--risk-5); }
.rset-card .sw-darkred { background: var(--risk-6); }
.rset-card .rset-preview { display: flex; flex-direction: column; gap: 8px; padding: 12px 16px 16px; background: var(--canvas); }
.rset-preview .rset-preview-label { font-size: 12px; color: var(--secondary); }
.rset-preview .rset-bar { display: flex; gap: 2px; height: 8px; }
.rset-bar i { display: block; min-width: 2px; border-radius: var(--r-badge); flex-grow: var(--span); }
/* The form's one Save at the foot of the last card: the rule of .cp-card .cp-split + div. */
/* The framework's checklist, sticky beside the form. */
.rset-layout > .rset-side { position: sticky; top: 64px; min-width: 0; }
.card.rset-check { padding: 0; }
.rset-check .rset-check-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 16px 16px 12px; }
.rset-check .rset-check-head h2, .tapp-side-head h2, .sacc-empty-title, .aplan-framework dd, .cp-score-title, .sacc-level-name, .link-heading strong, .ntf-digest-head h3, .soly-day-label, .call-range-label, .call-day-heading, .xf-q-text, .xf-progress-head h2, .rec-delete-text > h2 { font: 600 15px/1.4 var(--font-sans); }
.rset-check .rset-check-head h2, .tapp-side-head h2, .sacc-empty-title, .aplan-framework dd, .cp-score-title, .sacc-level-name, .link-heading strong, .ntf-digest-head h3, .call-range-label, .call-day-heading, .xf-q-text, .xf-progress-head h2, .rec-delete-text > h2 { color: var(--ink); }
.rset-check .rset-check-head h2, .tapp-side-head h2, .sacc-empty-title, .aplan-framework dd, .cp-score-title, .card.infra-card > .card-heading h2, .ntf-digest-head h3, .xf-q-text, .xf-progress-head h2, .rec-delete-text > h2 { margin: 0; }
.rset-check .rset-check-head h2, .xf-q-text { min-width: 0; }
.rset-met strong { font-weight: 600; color: var(--ink); }
.rset-check .rset-steps { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--hairline); }
.rset-steps .rset-step { display: flex; align-items: flex-start; gap: 12px; padding: 10px 16px; }
.rset-steps .rset-step + .rset-step { border-top: 1px solid var(--hairline); }
.rset-step .rset-tick { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 18px; height: 18px; margin-top: 2px;
  border-radius: 50%; border: 1.5px solid var(--field-rule); background: var(--card); }
.rset-tick .icon { width: 12px; height: 12px; stroke-width: 2.5; }
.rset-step .rset-code { flex: none; width: 44px; white-space: nowrap; font: 400 13px/22px var(--font-mono); color: var(--secondary); }
.rset-step .rset-step-words { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rset-step .rset-step-title { font-size: 15px; line-height: 1.45; color: var(--ink); text-decoration: none; }
.rset-step .rset-step-title:hover { color: var(--violet-text); text-decoration: underline; }
.rset-step .rset-fix { font: 600 13px/1.5 var(--font-sans); color: var(--violet-text); text-decoration: none; white-space: nowrap; }
.rset-step .rset-fix:hover { text-decoration: underline; }
@media (max-width: 1180px) {
  .rset-layout { grid-template-columns: minmax(0, 1fr); }
  .rset-layout > .rset-side { position: static; }
}
@media (max-width: 640px) {
  .rset-card .rset-head { flex-wrap: wrap; }
}
.coverage-heading { display: flex; justify-content: space-between; align-items: baseline; gap: var(--s-3); flex-wrap: wrap; }
/* display:grid beats the hidden attribute; hidden grids are explicitly gone. */
.matrix-raster[hidden] { display: none; }

/* Framework cards (portal): name with a mono subline, ring meter on the right,
   one sentence, Open plus gap report or a tonal update button. Suggested
   frameworks are dotted cards with an Add button. */
.page-heading-row { flex-direction: row; align-items: flex-start; justify-content: space-between;
  gap: var(--s-4); flex-wrap: wrap; }
.page-heading-row > div { flex: 1 1 320px; min-width: 0; }
.page-heading-row > .button { flex: none; }
.fw-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: var(--s-6); }
.fw-card { display: flex; flex-direction: column; gap: var(--s-4); }
.fw-heading { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s-4); min-height: 48px; }
.fw-heading > div { flex: 1 1 auto; min-width: 0; }
.fw-heading > .stat-meter { flex: none; }
.fw-name { font: 600 18px/1.3 var(--font-sans); color: var(--ink); margin: 0 0 var(--s-1); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.fw-eyebrow { font: var(--text-eyebrow); font-size: 12px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--secondary); display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fw-text { margin: 0; color: var(--body); flex: 1; }
.fw-actions { display: flex; align-items: center; gap: var(--s-4); min-height: 32px; }
.fw-card.proposal { border-style: dashed; flex-direction: row; align-items: center;
  justify-content: space-between; }
.fw-card.proposal form { margin: 0; }
.button.small.tonal { background: var(--violet-tint); color: var(--violet-text); border-color: transparent; }
.button.small.tonal:hover { background: var(--violet); color: #fff; }

/* People (portal): count cards, a member row with avatar and mono e-mail,
   roles as segmented buttons (several at once), MFA dot and last active. */
.stat-grid.four { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--s-4); margin-bottom: var(--s-6); }
.stat-value.red { color: var(--red-text, #B42318); }
.data-table.members td { vertical-align: middle; }
.member { display: flex; align-items: center; gap: var(--s-3); }
.member-avatar { width: 36px; height: 36px; font-size: 12px; flex: none; }
.avatar.tint-1, .avatar.tint-6 { background: #E3E9FB; color: #3E4C8A; }
.avatar.tint-2, .avatar.tint-7 { background: #DDF4F1; color: #1E6B62; }
.avatar.tint-3, .avatar.tint-8 { background: #FBF0D5; color: #7A5A12; }
.avatar.tint-4, .avatar.tint-9 { background: #E9E6FB; color: #5B4FD9; }
.avatar.tint-5, .avatar.tint-10 { background: #DFF3E1; color: #1F6B32; }
.member-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.member-text strong { font-weight: 600; color: var(--ink); }
.member-text .mono, .ro-score-n, .ro-gap-id, .ro-level-range, .fwl-table td.fwl-version, .rpbd-status-count { font-family: var(--font-mono); }
.data-table.members tr.out .member-text strong { color: var(--secondary); }
.data-table.members .segment-button, .cq-choice .segment-button { min-height: 32px; padding: 0 var(--s-3); font-size: 13px; }
.segment-button:has(input:checked) { background: var(--violet-tint); color: var(--violet-text); }
.data-table.members .dot { display: inline-block; width: 10px; height: 10px; border-radius: var(--r-full); }
.data-table.members .dot.good { background: var(--green); } .data-table.members .dot.attention { background: var(--amber); }
.data-table.members .dot.error { background: var(--red); }

/* Setup (portal): a two-column card with title and explanation on the left,
   fields with mono labels on the right and the button aligned right. */
.card.setting { display: grid; grid-template-columns: minmax(200px, 300px) minmax(0, 1fr);
  gap: var(--s-6); align-items: start; }
.setting-heading p { margin: 0; color: var(--body); }
.setting-content { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
.eyebrow { font: 500 12px/1.4 var(--font-mono); letter-spacing: .08em; text-transform: uppercase;
  color: var(--secondary); display: block; }
.field-value { color: var(--ink); font-weight: 500; }
.field-value.mono, .doc-entry.mono { font-family: var(--font-mono); }
.button-row { display: flex; gap: var(--s-3); flex-wrap: wrap; }
.toggle-row { display: inline-flex; align-items: center; gap: var(--s-2); min-height: 40px; color: var(--body); }
/* The console's "What Soly AI may read" card: one switch per manifest item,
   in columns that wrap (docs/FLOWS.md 7.41). */
.ai-reading { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 0 var(--s-4);
  align-items: start; }
.ai-reading .toggle-row { min-width: 0; }
/* A setting with a single toggle: the state sits at the top in one sentence on a
   tinted surface (§13: tint, deep accent text, no border), the toggle with
   its label below it on one row. */
.setting-toggle { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
.setting-state { margin: 0; align-self: stretch; padding: 10px 12px; border-radius: var(--r-control);
  background: var(--violet-tint); color: var(--violet-text); font: 400 13px/1.45 var(--font-sans); }
[data-theme="dark"] .setting-state { color: var(--violet-text); }
.setting-toggle .toggle-row { gap: 10px; min-height: 36px; font-size: 13px; color: var(--ink); }
.setting-toggle .toggle-row > span { min-width: 0; line-height: 1.3; }
.logo-row { display: flex; gap: var(--s-6); align-items: flex-start; }
.logo-box { width: 144px; height: 144px; flex: none; border: 1px dashed var(--disabled); border-radius: var(--r-card);
  display: flex; align-items: center; justify-content: center; text-align: center; overflow: hidden; padding: var(--s-3); }
.logo-box img { max-width: 100%; max-height: 100%; object-fit: contain; }
.logo-explanation { display: flex; flex-direction: column; gap: var(--s-2); }
.logo-explanation p { margin: 0; color: var(--body); }
.upload-link { color: var(--violet-text); font-weight: 600; cursor: pointer; width: fit-content; }
.upload-link:hover { text-decoration: underline; }
.upload-link input { display: none; }
.account-row { display: flex; align-items: center; gap: var(--s-4); }
.avatar.large { width: 64px; height: 64px; font-size: 18px; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  line-height: 1; }
.account-row .pill { margin-left: auto; }
@media (max-width: 800px) {
  .card.setting { grid-template-columns: 1fr; }
}

/* Roles per member: assigned roles as chips with a cross, a select
   list adds a role and saves it straight away. */
.role-chips { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
.role-chip { display: inline-flex; align-items: center; gap: var(--s-1); padding-right: var(--s-1); }
.chip-gone { border: none; background: transparent; color: inherit; font: 600 14px/1 var(--font-sans);
  cursor: pointer; padding: 0 var(--s-1); border-radius: var(--r-badge); opacity: .7; }
.chip-gone:hover { opacity: 1; background: rgba(0,0,0,.08); }
.role-select { width: auto; min-width: 130px; }
/* Users and access in a domain (templates/users_domain.html): Add member opens
   a grey band in the members card, under its heading; Remove stands on the
   right of its row. */
.list-card > .dm-add { display: flex; flex-direction: column; gap: 16px; background: var(--canvas); border-bottom: 1px solid var(--hairline); }
.list-card > .dm-add[hidden] { display: none; }
.dm-table td.dm-action { width: 1%; text-align: right; }

/* Sign-in log: a filter bar above the table and paging below it. */
.log-filter { gap: var(--s-3); align-items: flex-end; }
.log-filter .doc-entry { width: auto; min-width: 150px; }
.log-date { display: flex; flex-direction: column; gap: 2px; }
.pagination { display: flex; justify-content: space-between; align-items: center; gap: var(--s-4); flex-wrap: wrap; }
.pagination-buttons { display: flex; align-items: center; gap: var(--s-2); }
.hist-filter { display: flex; align-items: center; gap: var(--s-2); margin-bottom: 10px; flex-wrap: wrap; }
.hist-filter input { width: 260px; max-width: 100%; }
.control-history .pagination { margin-top: 10px; }


/* Toggles: the generic rule for input[type="checkbox"] (18x18) has a
   higher specificity than .toggle and squeezed the toggle into a little
   square. Hence the same selector plus the class, with an equal margin
   of 3px around the knob in both positions. */
input[type="checkbox"].toggle { appearance: none; -webkit-appearance: none; box-sizing: border-box;
  position: relative; width: 40px; height: 24px; flex: 0 0 40px; padding: 0; margin: 0;
  background: var(--hairline); border: none; border-radius: var(--r-full); cursor: pointer;
  transition: background var(--t-fast) var(--ease); }
input[type="checkbox"].toggle::after { content: ""; position: absolute; top: 3px; left: 3px;
  width: 18px; height: 18px; border-radius: var(--r-full); background: #fff;
  box-shadow: 0 1px 2px rgba(15, 18, 32, .25);
  transition: transform var(--t-fast) var(--ease); }
input[type="checkbox"].toggle:checked { background: var(--violet); }
input[type="checkbox"].toggle:checked::after { transform: translateX(16px); }
input[type="checkbox"].toggle:disabled { opacity: .55; cursor: default; }

:root[data-theme="dark"] input[type="checkbox"].toggle { background: #3F4459; }

/* Profile photo: the same round shape as the initials avatar. */
.avatar.photo, .user-avatar.photo, .top-avatar.photo { object-fit: cover; padding: 0;
  border-radius: var(--r-full); background: var(--neutral-tint); }
.photo-rule { display: flex; flex-direction: column; gap: var(--s-2); }
.photo-rule p { margin: 0; }

/* MFA: the policy above the member table and per row the state with one action. */
.mfa-policy { display: flex; align-items: center; gap: var(--s-4); flex-wrap: wrap;
  margin-bottom: var(--s-4); }
.mfa-cell { display: flex; align-items: center; gap: var(--s-2); }
.mfa-cell .card-link { background: none; border: none; padding: 0; cursor: pointer; font: inherit;
  color: var(--violet-text); font-weight: 600; }
.mfa-cell .card-link:hover { text-decoration: underline; }

/* Framework workspace (console): draft bar, control tree with badges and
   the detail with text, kind, rhythm, links and change log. */
.draft-bar { display: flex; align-items: center; gap: var(--s-4); flex-wrap: wrap;
  background: var(--violet-tint); border: 1px solid var(--hairline); border-radius: var(--r-card);
  padding: var(--s-4) var(--s-6); margin-bottom: var(--s-6); }
.draft-bar.quiet { background: var(--neutral-tint); }
.draft-text { color: var(--body); flex: 1; min-width: 220px; }
.draft-text strong { color: var(--ink); }
.draft-buttons { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; }
.draft-buttons form { margin: 0; }
.notice-card { background: var(--amber-tint); }
.notice-row { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; }
.diff-panel { margin-bottom: var(--s-6); }
.diff-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: var(--s-6); }
.diff-grid > div { display: flex; flex-direction: column; gap: var(--s-1); }
.control-heading { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap;
  margin-bottom: var(--s-4); }
.control-code-chip { background: var(--neutral-tint); border: 1px solid var(--hairline);
  border-radius: var(--r-control); padding: var(--s-2) var(--s-3); font-size: 14px; }
.chip-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
.link-row { margin-top: var(--s-4); }
.control-gone { margin-top: var(--s-3); display: flex; justify-content: flex-end; }
.log-list { display: flex; flex-direction: column; gap: var(--s-2); }
.log-line { display: flex; gap: var(--s-4); color: var(--body); }
.log-line .mono { color: var(--secondary); white-space: nowrap; }

/* The action in a log line: an outlined chip, so the column stays calm
   next to the free-text detail beside it. */
.action-chip { display: inline-block; padding: var(--s-2) var(--s-3);
  border: 1px solid var(--hairline); border-radius: var(--r-badge);
  background: var(--card); color: var(--ink); font-weight: 600; font-size: 13px;
  line-height: 1.2; white-space: nowrap; }
.log-search { min-width: 220px; }

/* The right-hand column of a workspace stacks its cards with the same
   spacing as the rest of the page; without this rule they stick
   together. */
.doc-page { display: flex; flex-direction: column; gap: var(--s-6); min-width: 0; }   /* the control workspace's column */
.control-form { display: flex; flex-direction: column; gap: var(--s-4); }
.version-new { display: flex; align-items: center; gap: var(--s-2); margin: 0; }
.version-new .doc-entry { width: 110px; }
.draft-bar .back-arrow { margin-right: var(--s-3); }
/* Document workspace (console): heading with reference and title, one action row,
   the management panels side by side and the templates card under the tree. */
.doc-main { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap;
  margin-bottom: var(--s-4); }
.control-heading h1, .doc-main-title { font: 600 22px/1.3 var(--font-sans); color: var(--ink); margin: 0; }
.doc-main-meta { margin-left: auto; white-space: nowrap; }
.panel-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--s-3); margin-top: var(--s-4); align-items: start; }
/* Closed, the panels sit side by side as one row of headings; an opened
   panel takes the full width, so that tables and buttons really fit
   inside instead of spilling out of a narrow column. */
.panel[open] { grid-column: 1 / -1; }
.panel, .acc-fields { border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--card); }
.panel > summary { list-style: none; cursor: pointer; }
.panel > summary::-webkit-details-marker { display: none; }
.panel-heading { display: flex; align-items: center; gap: var(--s-3); padding: var(--s-4);
  color: var(--ink); font-weight: 500; }
.panel-heading::before { content: "›"; color: var(--secondary); font-size: 16px; line-height: 1;
  transition: transform var(--t-fast) var(--ease); }
.panel[open] > .panel-heading::before { transform: rotate(90deg); }
.panel-heading .icon { color: var(--secondary); flex: none; }
.panel-heading > span:not(.panel-count) { flex: 1; min-width: 0; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.panel-count { color: var(--secondary); font-size: 13px; }
.panel > *:not(summary) { padding: 0 var(--s-4) var(--s-4); max-height: 22rem;
  overflow: auto; }
/* Everything inside a panel stays inside the border: forms wrap and
   input fields shrink along. */
.panel .rule-form { flex-wrap: wrap; }
.panel .doc-entry, .panel input, .panel select { min-width: 0; max-width: 100%; }
.panel .data-table { min-width: 34rem; }
.panel .doc-comment { flex-wrap: wrap; }
.stored-on { color: var(--secondary); }
.template-card { display: flex; flex-direction: column; gap: var(--s-1); text-decoration: none;
  margin-top: var(--s-4); padding-top: var(--s-4); border-top: 1px solid var(--hairline); }
.template-card-title { display: flex; align-items: center; gap: var(--s-2); color: var(--ink);
  font-weight: 600; }
.template-card:hover .template-card-title { color: var(--violet-text); }

/* The toolbar turns every button into a square 28px icon button. That
   does not apply to the primary button or to buttons with text in them. */
.doc-toolbar .button { width: auto; height: auto; min-height: 40px; padding: 0 var(--s-4);
  background: var(--violet); color: #fff; border: none; border-radius: var(--r-control);
  font: 600 14px/1 var(--font-sans); }
.doc-toolbar .button:hover { background: var(--violet-hover); border-color: transparent; color: #fff; }
.doc-toolbar button:not(:has(.icon)):not(.button) { width: auto; padding: 0 var(--s-2); white-space: nowrap; flex: none; }
/* Show changes: a hairline toggle right of the formatting buttons, on the
   same 28px line as the inline buttons; `on` while the marks are shown. */
.doc-toolbar .button.doc-changes-toggle, .doc-changes-toggle { min-height: 28px; padding: 0 10px; font-size: 12px;
  font-weight: 600; background: var(--card); color: var(--body); border: 1px solid var(--hairline);
  border-radius: var(--r-control); text-decoration: none; display: inline-flex; align-items: center;
  white-space: nowrap; flex: none; }
.doc-toolbar .button.doc-changes-toggle:hover, .doc-changes-toggle:hover { background: var(--canvas); color: var(--ink);
  border-color: var(--hairline); }
.doc-toolbar .button.doc-changes-toggle.on, .doc-changes-toggle.on { color: var(--violet-text); border-color: var(--violet); }
.doc-changes-sub { margin: 8px 0 0; }
.doc-changes-pill { display: inline-block; white-space: normal; line-height: 1.4; }
/* The marks themselves (docs/FLOWS.md 7.103), one look wherever a change is
   shown -- the text, a draft's detail, the History card: an insertion in
   green on a soft green ground without an underline, a deletion struck
   through in red on a soft red one; the theme's -text and tint tokens, so
   the dark theme reads the same. Each mark carries its word for a screen
   reader (a visually hidden "added:" / "removed:"); the title on an
   insertion says who and when. */
ins.doc-ins, ins.dm-ins, ins.hist2-new, .chg-key-added { background: var(--green-tint); color: var(--green-text);
  text-decoration: none; border-radius: 2px; padding: 0 1px; }
del.doc-del, del.dm-del, del.hist2-old, .chg-key-removed { background: var(--red-tint); color: var(--red-text);
  text-decoration: line-through; border-radius: 2px; padding: 0 1px; }
/* The legend beside Show changes: the two colours with their words. */
.chg-legend { display: inline-flex; align-items: center; gap: 6px; flex: none; white-space: nowrap; font: 600 12px/1 var(--font-sans); }
.chg-key-added, .chg-key-removed { display: inline-flex; align-items: center; min-height: 22px; padding: 0 6px; }
.chg-legend-dot { color: var(--secondary); }
.chg-legend-line { display: flex; margin: 0 0 8px; }
.dm-bar .chg-switch { margin-left: auto; }
.chg-bar { margin: 0 0 10px; }
.read-statement.chg-removed { border-left-color: var(--red-text); }
/* The History card's old and new value: the word for a screen reader as
   visually hidden generated text, from the element's own data-sr
   (translated in _history_table.html), so the line's own text stays. */
del.hist2-old::before, ins.hist2-new::before { position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; content: attr(data-sr); }
.doc-flow-title del.doc-del { font-weight: 400; font-size: .9rem; }
/* Who else has the editor open (the lease, docs/FLOWS.md 7.4): one line at
   the top of the editor card with an avatar per person. Hidden when nobody. */
.doc-editors { display: flex; align-items: center; gap: 8px; min-height: 34px; padding: 0 10px; margin-bottom: 8px;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--canvas);
  color: var(--body); font-size: 13px; }
.doc-editors-avatars { display: inline-flex; gap: 4px; flex: none; }
.doc-editors-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* A section refused by the save because someone else saved it first: the
   posted text stays on the page, marked, so nothing is lost. */
.doc-flow.doc-conflict > .doc-editor, .doc-editor.doc-conflict { outline: 2px solid var(--red); outline-offset: 4px; border-radius: 2px; }
.doc-conflict-note { margin: 4px 0 8px; color: var(--red-text); }
/* The version page: a section this version added or the one before had. */
.doc-flow.doc-added > .doc-editor { border-left: 3px solid var(--green); padding-left: 10px; }
.doc-flow.doc-removed { opacity: .8; }
.empty-row, .xdoc-empty, .tprm-empty { display: flex; align-items: center; gap: 12px; min-height: 40px; color: var(--secondary); font-size: 13px; }
.empty-row .icon, .xdoc-empty .icon, .tprm-empty .icon { width: 24px; height: 24px; flex: none; color: var(--violet-text); }
.empty-row span { min-width: 0; }
.empty-row .button { flex: none; margin-left: auto; }
.read-versions { margin-top: var(--s-4); }

/* Control detail in the portal follows the workspace from the console:
   on the left the controls of the same framework{ display: inline-block; margin-top: var(--s-2); }
/* Status dot per control in the rail: green when met, orange when in
   progress, empty with a border when open{ background: var(--green); }
/* Controls of a single framework: every control is a card of its own with
   its own header bar, so the separation between controls shows at once.
   The two bottom lines (design and operation) sit as a strip of their own
   with a mono label on the left, the content in the middle and the actions on the right. */
.control-block, .flow-figure { padding: 0; overflow: hidden; }
.control-block + .control-block { margin-top: 0; }
.control-headerbar { background: var(--neutral-tint); border-bottom: 1px solid var(--hairline);
  padding: var(--s-3) var(--s-4); gap: var(--s-3); }
.control-block > form, .control-block > .control-row { padding: var(--s-4); margin: 0; }
.control-block > .control-row { border-top: 1px solid var(--hairline); }
.control-block > form + .control-row { border-top: 1px solid var(--hairline); }
.control-row { display: grid; grid-template-columns: 170px minmax(0, 1fr) auto;
  gap: var(--s-4); align-items: start; }
.control-row-label { padding-top: 10px; }
.control-row-content { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2);
  min-height: 40px; min-width: 0; }
.control-row-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2);
  justify-content: flex-end; }
.control-row-actions .rule-form { flex-wrap: wrap; }
.control-row-actions .doc-entry { min-width: 170px; max-width: 220px; }
.control-row-actions input[type="file"].doc-entry { min-width: 190px; }
.control-save { margin-top: var(--s-4); }
@media (max-width: 900px) {
  .control-row { grid-template-columns: 1fr; }
  .control-row-actions { justify-content: flex-start; }
}

/* Controls per framework as collapsible cards: closed, one row with
   code, title, status and counters; open, a violet header bar with the
   control's own text, the status and the two strips design and operation below it. */
.explanation-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: var(--s-4); margin-bottom: var(--s-6); }
.explanation-card { display: flex; gap: var(--s-3); align-items: flex-start; background: var(--card);
  border: 1px solid var(--hairline); border-radius: var(--r-card); padding: var(--s-4); }
.explanation-card p { margin: 0; color: var(--body); }
.explanation-icon, .lnk-open { display: inline-flex; align-items: center; justify-content: center; flex: none;
  width: 28px; height: 28px; border-radius: var(--r-control); }
.explanation-icon.setup { background: var(--violet-tint); color: var(--violet-text); }
.explanation-icon.operation { background: var(--green-tint); color: var(--green-text); }

details.control-block { padding: 0; overflow: hidden; }
details.control-block + details.control-block { margin-top: 0; }
details.control-block > summary { list-style: none; cursor: pointer; }
details.control-block > summary::-webkit-details-marker { display: none; }
.control-headerbar { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap;
  padding: var(--s-3) var(--s-4); background: var(--card); }
details.control-block[open] > .control-headerbar { background: var(--violet-tint);
  border-bottom: 1px solid var(--hairline); }
.control-headerbar .control-title { font-weight: 600; color: var(--ink); }
.control-counters { margin-left: auto; display: flex; gap: var(--s-2); flex-wrap: wrap; }
.counter { display: inline-flex; align-items: center; gap: var(--s-2); border: 1px solid var(--hairline);
  border-radius: var(--r-control); padding: var(--s-1) var(--s-3); color: var(--secondary);
  font-size: 13px; background: var(--card); }
.counter strong { color: var(--ink); }
.counter .icon { width: 14px; height: 14px; }
.control-chevron { color: var(--secondary); font-size: 18px; line-height: 1;
  transition: transform var(--t-fast) var(--ease); }
details.control-block[open] .control-chevron { transform: rotate(90deg); }
.control-body > .control-grid { padding: var(--s-6); gap: var(--s-6); }
.control-open { margin-left: var(--s-2); }
.control-side { display: flex; flex-direction: column; gap: var(--s-3); }
.control-buttons { display: flex; gap: var(--s-3); flex-wrap: wrap; }
.original { margin-top: var(--s-2); }
.original > summary { list-style: none; cursor: pointer; display: flex; gap: var(--s-3);
  align-items: center; }
.original > summary::-webkit-details-marker { display: none; }
.original p { margin: var(--s-2) 0 0; }

/* The design and operation strips: label on the left, next to it first what
   is already there and below that the form. On one line it all became unreadable. */
.control-body .control-row { grid-template-columns: 150px minmax(0, 1fr);
  gap: var(--s-3) var(--s-6); padding: var(--s-4) var(--s-6);
  border-top: 1px solid var(--hairline); }
.control-body .control-row-label { grid-column: 1; grid-row: 1; padding-top: 10px; }
.control-body .control-row-content { grid-column: 2; grid-row: 1; min-height: 0; }
.control-body .control-row-actions { grid-column: 2; grid-row: 2; justify-content: flex-start; }
.control-body .control-row-actions .rule-form { flex-wrap: wrap; gap: var(--s-2); width: 100%; }
.control-body .control-row-actions .doc-entry { flex: 1 1 190px; min-width: 170px; max-width: 260px; }
.control-body .chip { white-space: nowrap; }
@media (max-width: 900px) {
  .control-body .control-row { grid-template-columns: 1fr; }
  .control-body .control-row-label, .control-body .control-row-content,
  .control-body .control-row-actions { grid-column: 1; grid-row: auto; }
}

/* Link field: the search box and the select list belong together and wrap
   together, so that the row does not fall apart into loose pieces. */
.link-field-box { display: flex; align-items: center; gap: var(--s-2); flex: 1 1 300px;
  min-width: 0; max-width: 380px; }
.link-field-box select { flex: 1 1 160px; min-width: 0; }
.control-body .control-row-actions .link-field-box .doc-entry { max-width: none; }

/* The controls form one list: the page keeps its normal spacing around
   them, between the lines themselves it stays tight. */
.control-items { display: flex; flex-direction: column; gap: 0; }
.control-items > details.control-block { border-radius: 0; margin-top: -1px; }
.control-items > details.control-block:first-child { border-radius: var(--r-card) var(--r-card) 0 0;
  margin-top: 0; }
.control-items > details.control-block:last-child { border-radius: 0 0 var(--r-card) var(--r-card); }
.control-items > details.control-block[open] { margin: var(--s-4) 0; border-radius: var(--r-card);
  position: relative; z-index: 1; }

/* Domain sections: the controls of a framework are grouped by subject,
   with a heading above them and the count after it. */
.domain-section + .domain-section { margin-top: var(--s-6); }
.domain-heading { font: var(--text-eyebrow); font-size: 12px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--secondary); margin: 0 0 var(--s-2);
  display: flex; align-items: center; gap: var(--s-2); }
.domain-heading .mono { color: var(--secondary); }
.domain-section[hidden] { display: none; }

/* An action cell stayed a table cell: with display:flex it fell out of the
   table layout and stuck out past the border. The buttons now sit next to
   each other inside the cell and wrap when it gets tight. */
td.actions { display: table-cell; vertical-align: middle; }
td.actions > form, td.actions > a, td.actions > button { display: inline-flex; margin: 0;
  vertical-align: middle; }
td.actions > * + * { margin-left: var(--s-2); }

/* An empty state inside a table stays a table cell; with display:flex the
   cell fell out of the table and did not span its columns. */
td.is-empty, th.is-empty { display: table-cell; text-align: center;
  padding: var(--s-6); color: var(--secondary); }

/* Compliance chain on the control detail: the linked requirements on a
   line of their own, the link fields below that, and only then the table. */
.chain-row { display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap;
  margin-bottom: var(--s-3); }
.chain-label { flex: 0 0 auto; margin-right: var(--s-2); }
.chain-actions { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap;
  margin: var(--s-3) 0; }
.chain-actions .rule-form { flex-wrap: wrap; gap: var(--s-2); }

/* A badge stays on one line. "In progress" must not break into "In" with
   "progress" below it; if it really does not fit, the row around it may
   wrap or scroll, but never the wording of the badge itself. */
.chip, .counter, .action-chip, .control-code, .control-code-chip {
  white-space: nowrap; max-width: 100%; }
.chip { display: inline-flex; align-items: center; gap: var(--s-1); }
.chip > .icon { flex: none; }

/* My account: the photo as a block of its own with the file field and the
   buttons on one line, and the account details as fields with mono labels. */
.photo-block { display: flex; flex-direction: column; gap: var(--s-2);
  padding: var(--s-4) 0; border-top: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline); }
.photo-row { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; }
.photo-row input[type="file"] { max-width: 260px; }
.account-row .member-text .mono { font-size: 13px; }

/* Import wizard: step bar, section list with a handle and a checkbox, and
   the document details beside it. */
.stepbar { display: flex; align-items: center; gap: var(--s-3); margin-bottom: var(--s-6);
  flex-wrap: wrap; }
.step { display: inline-flex; align-items: center; gap: var(--s-2); color: var(--secondary); }
.step-bullet { width: 28px; height: 28px; border-radius: var(--r-full); display: inline-flex;
  align-items: center; justify-content: center; border: 1px solid var(--hairline);
  font: 600 13px/1 var(--font-sans); flex: none; }
.step.active { color: var(--ink); font-weight: 600; }
.step.ready { color: var(--green-text); }
.step.ready .step-bullet, .rdmp-state.done, .data-table .button.small.approve { background: var(--green-deep); border-color: var(--green-deep); color: #fff; }
.step-line { flex: 1 1 40px; height: 2px; background: var(--hairline); min-width: 24px; }
.step-line.ready { background: var(--green); }
/* A step bar that is a navigation (the management review's steps): every step a link. */
a.step { text-decoration: none; border-radius: var(--r-control); }
a.step:hover .step-name { text-decoration: underline; }
.wizard-shape { display: flex; flex-direction: column; gap: var(--s-6); }
.wizard-two { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
  gap: var(--s-6); align-items: start; }
.wizard-side { display: flex; flex-direction: column; gap: var(--s-4); }
.section-list { list-style: none; margin: 0; padding: 0; }
.section-row { display: flex; align-items: center; gap: var(--s-3); padding: var(--s-3) var(--s-2);
  border-bottom: 1px solid var(--hairline); cursor: grab; }
.section-row:last-child { border-bottom: none; }
.section-row.dragging { opacity: .5; }
.section-row.out .section_title { text-decoration: line-through; color: var(--secondary); }
.section-row .grip { color: var(--disabled); cursor: grab; }
.section-number { color: var(--secondary); min-width: 34px; }
.section_title { flex: 1; color: var(--ink); font-weight: 500; }
.section-row .level-pill { font-family: var(--font-mono); }
.example-paper { max-height: 22rem; overflow: auto; }
.source-example > summary { list-style: none; cursor: pointer; }
.source-example > summary::-webkit-details-marker { display: none; }
.wizard-footer { display: flex; align-items: center; justify-content: space-between;
  gap: var(--s-4); border-top: 1px solid var(--hairline); padding-top: var(--s-4); }
.wizard-footer-right { display: flex; align-items: center; gap: var(--s-3); }

/* Control card exactly as in the mockup: labels with a small icon, a
   character before the status, grey strips with a drop zone for evidence
   and the chevron in a little box of its own. */
.icon.mini { width: 14px; height: 14px; vertical-align: -2px; }
.eyebrow .icon.mini { color: var(--disabled); margin-right: var(--s-1); }
.field-with-character { position: relative; display: block; }
.field-with-character .character { position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  pointer-events: none; }
.field-with-character.good .character { color: var(--green); }
.field-with-character.busy .character { color: var(--amber); }
.field-with-character.open .character { color: var(--secondary); }
.field-with-character select { padding-left: 34px; width: 100%; }
.control-body .control-row { background: var(--canvas); }
/* The file drop zone (templates/_file_drop.html, static/js/file_drop.js,
   docs/FLOWS.md 7.154; Rinat's design of 2026-09-28): the one look of every
   file field in the portal and the console. A full-width box, 64px, the
   violet tint with a dashed violet border; the upload glyph in a 40px
   circle of a stronger tint, two lines (what to do, 14px/600; the types and
   the size the field takes, 13px), "or", and Browse as a hairline button
   with violet words, the real input hidden inside it. A file dragged over
   it: a solid border and a stronger tint. A chosen file: its name in the
   first line and a cross to clear it. On a narrow screen it wraps. */
.file-drop { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px 12px;
  width: 100%; min-width: 0; min-height: 64px; padding: 12px 16px; box-sizing: border-box;
  border: 1px dashed color-mix(in srgb, var(--violet) 45%, transparent); border-radius: var(--r-control);
  background: color-mix(in srgb, var(--violet-tint) 60%, var(--card)); cursor: pointer;
  transition: background-color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); }
.file-drop-glyph { width: 40px; height: 40px; flex: none; display: grid; place-items: center; border-radius: 50%;
  background: color-mix(in srgb, var(--violet) 14%, transparent); color: var(--violet-text); }
.file-drop-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 0 1 auto; text-align: left; }
/* the first line is the user card's name (.user-name, 14px/600 ink with an
   ellipsis); the second the backing line's 13px secondary (.cpsc-backing);
   "or" the 13px secondary count (.dctl-count and its kind) */
.file-drop-title { line-height: 1.4; }
.file-drop-or { white-space: nowrap; }
.file-drop .file-drop-browse { position: relative; flex: none; display: inline-flex; align-items: center; height: 32px; padding: 0 12px;
  border: 1px solid color-mix(in srgb, var(--violet) 35%, var(--hairline)); border-radius: var(--r-control);
  background: var(--card); color: var(--violet-text); font-size: 13px; font-weight: 600; white-space: nowrap; cursor: pointer; }
.file-drop .file-drop-browse:hover { border-color: var(--violet); }
.file-drop .file-drop-browse:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.file-drop-clear { flex: none; display: grid; place-items: center; width: 28px; height: 28px; padding: 0;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); color: var(--body); cursor: pointer; }
.file-drop-clear[hidden] { display: none; }
.file-drop-clear:hover { border-color: var(--body); }
.file-drop-clear .icon { width: 16px; height: 16px; }
.file-drop.is-over { border-style: solid; border-color: var(--violet); background: color-mix(in srgb, var(--violet) 12%, var(--card)); }
.file-drop.is-chosen { border-style: solid; }
.file-drop.is-disabled { cursor: not-allowed; opacity: .6; }
.file-drop.is-disabled .file-drop-browse { cursor: not-allowed; }
/* Beside a small submit (an import row): the box takes the room, the button stays its size. */
.file-drop-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.file-drop-row > .file-drop { flex: 1 1 320px; width: auto; }
@media (max-width: 480px) { .file-drop { justify-content: flex-start; } .file-drop-text { flex: 1 1 0; } .file-drop-title { white-space: normal; overflow-wrap: anywhere; } }
/* The trust centre's Appearance tab (templates/_trust_appearance.html,
   docs/FLOWS.md 7.78): the form is a form card (below, "The form card") with
   its segment tracks and drop row; what is its own is the logo's thumbnail
   in the drop row, the accent swatches, the hex field with its colour, the
   address with its prefix, Reset as a text button left in the foot band,
   and beside the card the preview, a small browser frame drawn from the
   custom properties the script sets. */
.tapp-layout { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 16px; align-items: start; }
.tapp-thumb { width: 48px; height: 48px; flex: none; display: grid; place-items: center; overflow: hidden;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); color: var(--secondary); }
.tapp-thumb img { max-width: 44px; max-height: 44px; object-fit: contain; }
.tapp-thumb img[hidden], .tapp-thumb svg[hidden] { display: none; }
/* the hero image's thumbnail: wide, the picture cropped as the hero crops it */
.tapp-thumb.tapp-thumb-wide { width: 80px; }
.tapp-thumb.tapp-thumb-wide img { width: 100%; height: 100%; max-width: none; max-height: none; object-fit: cover; }
/* the logo's and the hero's thumbnail beside their state, under the drop zone */
.tapp-current { display: flex; align-items: center; gap: 12px; min-width: 0; }
.tapp-accent { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.tapp-swatch { position: relative; width: 48px; height: 48px; flex: none; cursor: pointer; border-radius: var(--r-control);
  background: var(--sw); background-clip: padding-box; border: 2px solid transparent; }
.tapp-swatch:has(input:checked) { border-color: var(--ink); box-shadow: inset 0 0 0 2px var(--card); }
.tapp-swatch:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.tapp-swatch input { position: absolute; opacity: 0; width: 0; height: 0; }
.tapp-hex { position: relative; width: 180px; flex: none; }
.tapp-hex .tapp-hex-chip { position: absolute; left: 14px; top: 50%; width: 16px; height: 16px; transform: translateY(-50%);
  border-radius: var(--r-badge); pointer-events: none; background: var(--chip); }
.tapp-hex .doc-entry { width: 100%; padding-left: 40px; }
.tapp-segment { align-self: flex-start; }
.list-foot .button.tapp-reset { margin-right: auto; border-color: transparent; background: transparent; color: var(--body); padding: 0; }
.list-foot .button.tapp-reset:hover { text-decoration: underline; background: transparent; }
/* The trust centre's Controls tab (templates/_trust_controls.html, docs/FLOWS.md
   7.79; Rinat's design 2026-09-28): two list cards, the frameworks as a picker on
   the left ("Controls met" on the right of its heading; per row the name, n/m in
   mono and a thin bar in the violet; the chosen one tinted and in 600), the chosen
   framework's controls on the right with a switch each; a long list scrolls inside
   its card. Show all met confirms in place of its link, in the heading line. */
.tctl-layout { display: grid; grid-template-columns: minmax(0, 280px) minmax(0, 1fr); gap: 16px; align-items: start; }
.list-card > ul.tctl-fw-list { list-style: none; margin: 0; padding: 8px; display: flex; flex-direction: column; gap: 4px; }
.tctl-fw { display: flex; flex-direction: column; gap: 6px; padding: 8px 16px; border-radius: var(--r-control); color: var(--ink); text-decoration: none; }
.tctl-fw:not(.is-current) .tctl-fw-name { font-weight: 500; }
.tctl-confirm[hidden] { display: none; }
.tctl-fw:hover { background: var(--canvas); text-decoration: none; }
.tctl-fw.is-current { background: var(--violet-tint); }
.tctl-fw-line { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; min-width: 0; }
.tctl-fw-name, .scp-row-title, .cmap-cell-name, .srun-title, .srun-done-title, .sckl-param-name { font: 600 16px/1.3 var(--font-sans); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tctl-fw-name { min-width: 0; }
.tctl-fw-count, .flow-picker-steps { font-size: 14px; color: var(--secondary); white-space: nowrap; flex: none; }
.tctl-bar, .ap-gauge, .sot-bar, .scp-bar, .rcr-bar, .rset-check .rset-progress, .tpr-bar, .player-progress { height: 4px; border-radius: 2px; background: var(--hairline); overflow: hidden; }
.tctl-bar, .tpr-bar { display: block; }
.tctl-bar i, .rset-progress i, .trust-meter i, .scp-bar > span, .tpr-bar i, .player-progress i { display: block; height: 100%; background: var(--violet); }
.tctl-wrap { max-height: 640px; overflow-y: auto; }
.data-table .tctl-public-col { width: 96px; text-align: right; }
@media (max-width: 1180px) { .tctl-layout { grid-template-columns: minmax(0, 1fr); gap: 16px; } }
.tapp-side { position: sticky; top: 64px; display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.tapp-side-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.tapp-side-head .tapp-open { font-weight: 600; white-space: nowrap; flex: none; }
/* The preview (2026-09-26, the product owner's mock): a wireframe of the
   public page, not its text -- the browser bar with the address, the header
   with the logo tile, a bar for the name and the Request pill, the hero with
   the real headline and intro, the tab strip, and on the canvas the badges
   card, a small card and the table card. Everything is drawn from --pv-*
   properties the script sets from the form: the accent, the corners, the
   header (data-pv-header) and the theme (data-pv-theme). Decorative: the
   frame is aria-hidden, one sr-only sentence stands before it. */
.tapp-frame { --pv-canvas: #F1F2F6; --pv-card: #FFFFFF; --pv-line: #DDE0E8; --pv-bar: #E4E6EC; --pv-bar-strong: #C9CCD8; --pv-thead: #2F3349;
  --pv-r: var(--pv-radius, 4px);
  border: 1px solid var(--hairline); border-radius: var(--r-card); overflow: hidden; background: var(--pv-canvas); }
.tapp-frame[data-pv-theme="dark"] { --pv-canvas: #1C1F2E; --pv-card: #252838; --pv-line: #33374A; --pv-bar: #33374A; --pv-bar-strong: #464B63; --pv-thead: #151827; }
.tapp-frame i { display: block; font-style: normal; }
.tapp-bar { display: flex; align-items: center; gap: 6px; padding: 8px 10px; background: var(--canvas); border-bottom: 1px solid var(--hairline); }
.tapp-bar .tapp-url { flex: 1; min-width: 0; margin-left: 6px; padding: 3px 10px; font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  border-radius: 999px; background: var(--card); border: 1px solid var(--hairline); color: var(--secondary); }
/* the header: light, dark or the accent */
.tapp-frame .tapp-top { --pv-namebar: #E4E6EC; display: flex; align-items: center; gap: 8px; height: 40px; padding: 0 12px;
  background: #FFFFFF; border-bottom: 1px solid #E4E6EC; }
.tapp-frame[data-pv-header="dark"] .tapp-top { --pv-namebar: #464B63; background: #1C1F2E; border-bottom-color: #33374A; }
.tapp-frame[data-pv-header="accent"] .tapp-top { --pv-namebar: rgba(255, 255, 255, .35); background: var(--pv-accent); border-bottom-color: transparent; }
.tapp-tile { width: 22px; height: 22px; flex: none; display: grid; place-items: center; overflow: hidden; border-radius: var(--pv-r);
  background: var(--pv-accent); color: #FFFFFF; font: 700 10px/1 var(--font-sans); }
.tapp-frame[data-pv-header="accent"] .tapp-tile { background: rgba(255, 255, 255, .22); }
.tapp-tile.has-logo { background: transparent; }
.tapp-tile img { width: 100%; height: 100%; object-fit: contain; }
.tapp-tile img[hidden], .tapp-tile span[hidden] { display: none; }
.tapp-namebar { width: 64px; height: 8px; border-radius: 2px; background: var(--pv-namebar); }
.tapp-pill { width: 52px; height: 18px; margin-left: auto; flex: none; border-radius: var(--pv-r); background: var(--pv-accent); }
.tapp-frame[data-pv-header="accent"] .tapp-pill { background: #FFFFFF; }
/* the hero: navy with a grid fading to the accent, or the image under the scrim */
.tapp-hero { display: flex; flex-direction: column; gap: 6px; padding: 18px 14px 20px; color: #FFFFFF;
  background: linear-gradient(to right, rgba(255, 255, 255, .06) 1px, transparent 1px) 0 0 / 14px 14px,
    linear-gradient(to bottom, rgba(255, 255, 255, .06) 1px, transparent 1px) 0 0 / 14px 14px,
    linear-gradient(100deg, #2F3349 45%, color-mix(in srgb, var(--pv-accent) 80%, #2F3349) 100%); }
.tapp-hero.has-image { background: linear-gradient(rgba(21, 24, 39, .88), rgba(21, 24, 39, .88)), var(--pv-hero) center / cover no-repeat, #151827; }
.tapp-hero .tapp-h { margin: 0; font: 700 14px/1.25 var(--font-sans); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.tapp-hero .tapp-intro { margin: 0; font-size: 10px; line-height: 1.45; color: #C3C6D4; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
/* the tab strip: the first one the accent */
.tapp-tabs { display: flex; align-items: center; gap: 10px; height: 26px; padding: 0 12px; background: var(--pv-card); border-bottom: 1px solid var(--pv-line); }
.tapp-tabs i { width: 30px; height: 6px; border-radius: 2px; background: var(--pv-bar); }
.tapp-tabs i:first-child { background: var(--pv-accent); }
/* the canvas: the badges and a small card on the left, the table on the right */
.tapp-canvas { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr); gap: 8px; align-items: start; padding: 10px; }
.tapp-col { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.tapp-card { padding: 8px; border: 1px solid var(--pv-line); border-radius: var(--pv-r); background: var(--pv-card); min-width: 0; }
.tapp-badges { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
.tapp-badges i { aspect-ratio: 1; border-radius: var(--pv-r); border: 1.5px solid color-mix(in srgb, var(--pv-accent) 55%, transparent);
  background: color-mix(in srgb, var(--pv-accent) 8%, transparent); }
.tapp-lines { display: flex; flex-direction: column; gap: 6px; }
.tapp-lines i { height: 5px; border-radius: 2px; background: var(--pv-bar); }
.tapp-lines i + i { width: 60%; }
.tapp-table { padding: 0; overflow: hidden; }
.tapp-thead { height: 14px; background: var(--pv-thead); }
.tapp-row { display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-top: 1px solid var(--pv-line); }
.tapp-row:first-of-type { border-top: 0; }
.tapp-row i:first-child { flex: 1; height: 5px; border-radius: 2px; background: var(--pv-bar); }
.tapp-row i + i { width: 20px; height: 6px; flex: none; border-radius: 2px; background: var(--pv-bar-strong); }
.tapp-row:first-of-type i + i { background: var(--amber); }
@media (max-width: 1180px) { .tapp-layout { grid-template-columns: minmax(0, 1fr); } .tapp-side { position: static; } }
@media (max-width: 720px) { .form-section.tapp-group { grid-template-columns: minmax(0, 1fr); } }
.control-chevron { display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px; border: 1px solid var(--hairline); border-radius: var(--r-control);
  color: var(--secondary); background: var(--card); flex: none; }

/* ================================================================
   Brand book §23 — the layout contract. Hard numbers, and therefore the
   last layer: height follows content, spacing is fixed, nothing stretches.
   ================================================================ */
.content { padding: 20px; gap: 14px; }
.card { padding: 16px; }
.card-heading { min-height: 32px; margin-bottom: 10px; align-items: center; }
.page-heading { gap: 4px; margin-bottom: 4px; }

/* Cards never stretch to match their neighbours. Exception: a row of stat cards
   is one band of equal height (§23 gives them 72-88px), so those do stretch. */
.fw-grid, .link-grid, .panel-grid,
.two-column, .three-column, .explanation-grid, .distribution-grid,
.control-grid, .wizard-two, .diff-grid { align-items: start; }
.cards-row, .stat-grid { align-items: stretch; grid-auto-rows: 1fr; }
.cards-row > *, .stat-grid > * { height: 100%; }
.cards-row > .card.stat, .stat-grid > .card.stat { min-height: 88px; }
.cards-row, .stat-grid, .fw-grid, .link-grid { gap: 14px; }

/* Buttons and fields equally tall, so that a row keeps one line. */
.button { min-height: 32px; padding: 0 12px; font-size: 13px; }
.button.small { min-height: 28px; padding: 0 10px; font-size: 12px; }
.doc-entry, .form input, .form select, .form textarea,
.rule-form input, .rule-form select, .form-field input, .form-field select,
.segment-button, .search-field { min-height: 32px; }
.doc-entry.compact { min-height: 28px; }
textarea.doc-entry { min-height: 64px; }
@media (pointer: coarse) { .button, .button.small { min-height: 40px; } }


/* Empty state: one line on the left, no illustration filling the page. */
.is-empty { flex-direction: row; align-items: center; justify-content: flex-start;
  text-align: left; padding: 12px; gap: 8px; min-height: 56px; }
.is-empty .disc { width: 20px; height: 20px; border-radius: var(--r-control);
  background: none; color: var(--secondary); }
.is-empty .disc svg { width: 16px; height: 16px; }
.is-empty h3, .is-empty h2, .rs-label, .cp-card-choice strong, .setup-tab .setup-back-text h3, .setup-tab .setup-howto h3, .seg-name, .distribution-heading .mono, .sknw-label, .procd-empty-title, .rqx-h3, .member-switch .toggle-row, .members-side .mfa-policy .toggle-row, .soly-conv-link .soly-conv-title, .dl-ask-text > strong, .soly-task-card-name, .rep-choice-name, .help-tip-title, .form-fold > summary > .form-fold-text, .aside-note > h3, .mock-sender, .inbox-subject { font: 600 14px/1.3 var(--font-sans); }
.is-empty p, .rv-empty { font-size: 13px; }

/* Nothing inside the content is screen height. */
.content .card, .content section, .content article { min-height: 0; }

/* [hidden] must always win: our own display rules would otherwise push
   it aside, which makes hidden blocks appear after all. */
[hidden] { display: none !important; }

/* On the dashboard the cards sit side by side at equal height: the row then
   reads as one row. Elsewhere the contract from section 23 applies, where a
   card explicitly does not stretch to match its neighbour. */
.equal { align-items: stretch; }
/* Equal height across several grid rows too: otherwise the second row of
   tiles ends up shorter than the first. */
.equal { grid-auto-rows: 1fr; }
.equal > * { height: 100%; }
.equal > .card.stat { min-height: 88px; }

/* ---------------------------------------------------------------- links
   Card grid per §21.5: for each group a heading with icon tile, title and
   count, below it cards with a monogram, name, one sentence and at the
   bottom the status with one action. Roomier than the registers: this is a
   catalogue, not a table. */

.link-banner { display: flex; align-items: center; gap: 12px; background: var(--violet-tint);
  border-radius: var(--r-card); padding: 14px 16px; color: var(--body); font-size: 14px;
  margin: 16px 0 24px; }
.link-banner span { flex: 1; min-width: 0; }
.link-banner .card-link { white-space: nowrap; font-size: 14px; }

.link-group + .link-group { margin-top: 28px; }
.link-group-heading { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.link-group-heading .explanation-icon { width: 32px; height: 32px; }
.link-group-heading .eyebrow { font-size: 12px; letter-spacing: .08em; color: var(--secondary); }
.link-group-heading .group-show { margin-left: auto; background: none; border: none; padding: 0;
  font: 600 13px/1 var(--font-sans); color: var(--violet-text); cursor: pointer; }
.link-group-heading .group-show:hover { text-decoration: underline; }

.link-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px; align-items: stretch; grid-auto-rows: 1fr; }
.link-card { display: flex; flex-direction: column; gap: 12px; background: var(--card);
  border: 1px solid var(--hairline); border-radius: var(--r-card); padding: 20px; height: 100%; }
.link-heading { display: flex; align-items: center; gap: 12px; }
.link-target { margin: 0; flex: 1; color: var(--body); font-size: 14px; line-height: 1.45; }

/* Per integration card a compact disclosure at the top right: how it stays
   secure, what we provision and what the other side sets up. */
.link-card { position: relative; }
.link-more > summary { list-style: none; cursor: pointer; position: absolute; top: 12px; right: 12px;
  width: 28px; height: 28px; border: 1px solid var(--hairline); border-radius: var(--r-control);
  display: inline-flex; align-items: center; justify-content: center; color: var(--secondary);
  background: var(--card); }
.link-more > summary::-webkit-details-marker { display: none; }
.link-more > summary .icon { transform: rotate(90deg); transition: transform var(--t-fast) var(--ease); }
.link-more[open] > summary .icon { transform: rotate(-90deg); }
.link-more > summary:hover { color: var(--violet-text); border-color: var(--violet); }
.link-explanation { margin: 44px 0 0; padding: 10px 12px; background: var(--canvas);
  border-radius: var(--r-control); display: grid; grid-template-columns: 52px minmax(0, 1fr);
  gap: 4px 10px; font-size: 12px; line-height: 1.4; color: var(--body); }
.link-explanation dt, .link-explanation-heading { font: 500 11px/1.5 var(--font-mono); letter-spacing: .06em;
  text-transform: uppercase; color: var(--secondary); }
.link-explanation dd { margin: 0; }
.link-card .link-heading { padding-right: 36px; }

/* Two disclosure buttons at the top right of an integration card: features
   (list icon) and the secure setup (chevron). */
.link-explanation-heading { grid-column: 1 / -1; }
.link-function { display: block; }
.link-function ul { margin: 4px 0 0; padding-left: 16px; }
.link-function li { margin: 2px 0; }
.link-card .link-heading { padding-right: 36px; }

/* Features below the setup, in the same disclosure. */
.link-explanation + .link-function { margin-top: 8px; }

/* The direction at the head of each feature line (Cisoly → Slack) reads as a label. */
.link-function li { color: var(--body); }

/* The reason at the top of the disclosure: which problem the integration solves. */
.link-explanation .link-why { color: var(--ink); font-weight: 500; }

/* Product overview under Settings: four disclosure panels stacked. */
.panel-grid.one-column { grid-template-columns: 1fr; }
.prod-items ul { margin: 0; padding-left: 18px; }
.prod-items li { margin: 4px 0; color: var(--body); line-height: 1.5; }
.prod-main { margin: 0 0 8px; color: var(--ink); font-weight: 600; }

/* Product overview: requirements list with red for whatever is not met yet */
.prod-legend{font-size:12px;color:#464B63;margin:0 0 6px}
.prod-group{font-size:13px;font-weight:600;margin:10px 0 4px;color:#1B1F3B}
.prod-group:first-of-type{margin-top:0}
.prod-counter{font-family:"IBM Plex Mono",monospace;font-weight:500;color:#6E7388;margin-left:6px}
.requirements-wrap{overflow-x:auto;margin-bottom:6px}
.requirements-table{width:100%;min-width:640px}
.requirements-table td{vertical-align:top;font-size:13px;line-height:1.35}
.requirements-table td:first-child{width:26%}
.requirements-table td:last-child,.requirements-table th:last-child{white-space:nowrap;width:1%}
.requirements-table td.prod-no,.requirements-table td.prod-no strong{color:var(--red-text,#C93A3B)}
.requirements-table td em{font-style:normal;color:#6E7388}
/* Product overview across the full width: heading above, tables below */
#product_overview.card.setting { grid-template-columns: 1fr; }
#product_overview .panel > *:not(summary) { max-height: 34rem; }
#product_overview .panel .requirements-table { min-width: 0; width: 100%; }
.requirements-table td:first-child { width: 22%; }
.requirements-table th { white-space: nowrap; }

/* Security and support access: an identity card, below it a field
   list with a pictogram, a value and an action per row (§23). */
.acc-card { display: flex; align-items: center; justify-content: space-between; gap: 16px;
  flex-wrap: wrap; padding: 16px; border: 1px solid var(--hairline);
  border-radius: var(--r-card); background: var(--card); }
.acc-level { display: inline-flex; align-items: center; gap: 6px; }
.acc-field { display: grid; grid-template-columns: minmax(150px, 13rem) minmax(0, 1fr) auto;
  align-items: center; gap: 14px; margin: 0; padding: 16px; }
.acc-field + .acc-field { border-top: 1px solid var(--hairline); }
.acc-label { display: inline-flex; align-items: center; gap: 10px; min-width: 0;
  font-weight: 600; color: var(--ink); white-space: nowrap; }
.acc-value { min-width: 0; color: var(--body); line-height: 1.45; }
.acc-value.mono { font-family: var(--font-mono); color: var(--ink); }
.acc-action { display: inline-flex; align-items: center; gap: 8px; justify-self: end;
  white-space: nowrap; flex: none; }
.acc-action.subtle { color: var(--secondary); font-size: 13px; }
.acc-action .icon.mini { margin-right: 2px; }
label.button.small { cursor: pointer; }
.acc-footer { display: flex; align-items: center; gap: 8px; margin: 0;
  color: var(--secondary); font-size: 13px; }
.acc-footer .icon { flex: none; }
@media (max-width: 760px) {
  .acc-field { grid-template-columns: 1fr; gap: 6px; }
  .acc-action { justify-self: start; }
}

/* Import flows at the sizes of brand book §21.4: step bar as a card with
   22px dots and 1px lines; list card without inner margin and rows of
   12px; assignment on the right with eyebrows; footer as a separate bar. */
.stepbar { background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card);
  padding: 12px 16px; margin: 0; gap: 0; font-size: 12px; flex-wrap: nowrap; }
.step { gap: 8px; white-space: nowrap; }
.step-bullet { width: 22px; height: 22px; font: 600 11px/1 var(--font-sans); }
.step-line { height: 1px; margin: 0 12px; flex: 1 1 40px; }
.wizard-shape { gap: 14px; }
.wizard-two { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 14px; }
/* one column on a narrow screen: after the two-column rule above, which overrode it when it stood earlier */
@media (max-width: 900px) { .wizard-two { grid-template-columns: 1fr; } }
.wizard-side { gap: 14px; }
.wiz-list-card { padding: 0; overflow: hidden; }
.wiz-list-card > .card-heading { padding: 10px 14px; margin: 0; border-bottom: 1px solid var(--hairline); }
.wiz-list-card > .card-heading h2 { font-size: 13px; }
.wiz-list-card > .card-heading .card-sub { font-size: 12px; }
.section-list { font-size: 12px; }
.section-row { padding: 8px 14px; gap: 10px; border-bottom: 1px solid #EEF0F4; }
.section-row.sub { padding-left: 34px; }
.section-row.heading { cursor: default; background: var(--canvas); }
.section-row.heading .section_title { font-weight: 600; }
.section-row:last-child { border-bottom: none; }
.section-number { font: 500 11px/1.4 var(--font-mono); color: var(--body); min-width: 24px; }
.section_title { font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.section-row .level-pill, .level-pill { font: 500 10px/1.4 var(--font-mono); color: var(--secondary);
  background: none; padding: 0; flex: none; }
.section-row:hover { background: var(--canvas); }
.section-row:focus-within, .section-row.selected { background: #F1F0FE; box-shadow: inset 2px 0 0 var(--violet); outline: none; }
.section-row:focus-within .section_title, .section-row:focus-within .section-number, .section-row:focus-within .level-pill { color: #5B4FD9; }
.section-row.out, .section-row.out .section-number, .section-row.out .level-pill { color: var(--secondary); }
.section-row.out .section_title { font-weight: 400; }
.section-row .grip { font-size: 14px; }
.section-row .tick-mark input { width: 14px; height: 14px; margin: 0; }
.wiz-assignment { gap: 12px; display: flex; flex-direction: column; }
.wiz-assignment > .card-heading { margin: 0; }
.wiz-assignment > .card-heading h2 { font-size: 13px; }
.wiz-assignment .eyebrow { font-size: 10.5px; display: flex; align-items: center; gap: 5px; margin-bottom: 6px; }
.wiz-assignment .eyebrow .icon { width: 12px; height: 12px; color: var(--disabled); }
.wiz-assignment .doc-entry { min-height: 32px; font-size: 12px; }
.wiz-assignment .field-value { font-size: 12px; min-height: 32px; display: flex; align-items: center;
  border: 1px solid var(--hairline); border-radius: var(--r-control); padding: 0 10px; }
.wiz-assignment .segment { height: 30px; font-size: 12px; font-weight: 600; width: 100%; }
.wiz-assignment .segment-button { flex: 1; justify-content: center; }
.wiz-assignment .form-grid.cols-2 { gap: 12px; }
.source-example > summary.card-heading { margin: 0; font-size: 12px; }
.source-example > summary h2 { font-size: 13px; }
.source-example > summary .card-link { color: var(--violet-text); font-weight: 600; font-size: 12px; }
.source-example[open] > summary { margin-bottom: 10px; }
.report.notice { background: #FDF4E0; border: 1px solid #F5B942; color: #7A5A0E; font-size: 12px;
  line-height: 1.5; border-radius: var(--r-card); padding: 10px 12px; margin: 0; }
.wizard-footer { background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card);
  padding: 10px 20px; min-height: 52px; }
.wizard-footer .button { min-height: 32px; font-size: 12px; }
.wizard-footer .wizard-footer-right { gap: 8px; }

/* Stat card at the sizes of §23: card 72–88px, ring 48px, value 18px/600,
   label 12px #464B63. Replaces the larger sizes of v1.3, which put the
   cards at 110–166px. */
.card.stat { padding: 16px; gap: 6px; min-height: 72px; }
.card.stat.meter { min-height: 88px; }
.stat-value, .card.stat.meter .stat-value, .otd-figure .otd-value, .date-tile-day { font: 600 18px/1.2 var(--font-sans); }
.stat-value, .card.stat.meter .stat-value { letter-spacing: -.01em; }
.stat-heading { font: 500 12px/1.4 var(--font-sans); color: var(--body); }
.stat-delta, .card.stat.meter .stat-delta, .risk-page .form-label .rp-label-link { font: 500 12px/1.4 var(--font-sans); }
.stat-delta, .card.stat.meter .stat-delta { margin-top: 0; }
.stat-unit, .otd-figure .otd-label { font: 500 12px/1.4 var(--font-sans); }
.card.stat > .stat-meter { right: 16px; width: 48px; height: 48px; }
.stat-meter-text { font: 600 16px/1 var(--font-sans); }
.card.stat .stat-rule, .card.stat .stat-heading,
.card.stat.meter > *:not(.stat-meter) { padding-right: 64px; }
.stat-heading .icon { top: 16px; right: 16px; width: 40px; height: 40px; padding: 10px; }
.cards-row > .card.stat, .stat-grid > .card.stat { min-height: 72px; }

/* Nothing runs underneath the icon tile or the ring meter. The old rules
   only kept space free for the heading and the number, so an extra line or
   a link below did run through after all. Now it applies to every line in
   the card, in portal and console. */
.card.stat:has(> .stat-meter) > *:not(.stat-meter),
.card.stat:has(.stat-heading .icon) > * { padding-right: 64px; }
.card.stat > .stat-meter, .stat-heading .icon { padding-right: 0; }
.stat-heading .icon { padding: 10px; }

/* Stat card: a long unbroken text must never run under the tile. */
.card.stat > * { overflow-wrap: anywhere; }

/* OT segmentation board (the OT overview's map, templates/_ot_segmentation.html,
   FLOWS 7.434): per Purdue level one row with the layer on the left and on the
   right the zones as tiles -- the name (to the zone) and the asset count on the
   first line, SL-T, the measured SL-A with its word and the SL-C below target
   (to the security levels) on the second. The conduits are drawn as lines by
   static/js/ot_segmentation.js. The legend is the one line under the heading. */
.seg-body { display: flex; flex-direction: column; gap: 10px; }
.seg-legend { display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  font: 500 11px/1 var(--font-mono); letter-spacing: .06em; text-transform: uppercase;
  color: var(--secondary); }
.seg-legend > span { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.seg-plane { width: 12px; height: 12px; border-radius: 2px; border: 1.5px solid; flex: none; }
.seg-plane.good { border-color: var(--green); background: var(--green-tint); }
.seg-plane.under { border-color: var(--red); background: var(--red-tint); }
.seg-line { width: 16px; height: 2px; background: var(--violet); border-radius: 1px; flex: none; }
.seg-plate { border: 1px solid var(--hairline); border-radius: var(--r-card); overflow: hidden;
  background: var(--canvas); }
.seg-row { display: grid; grid-template-columns: 200px minmax(0, 1fr); }
.seg-row + .seg-row { border-top: 1px solid var(--hairline); }
.seg-level { display: flex; align-items: center; gap: 12px; padding: 18px 16px;
  border-right: 1px solid var(--hairline); }
.seg-code { font: 500 13px/1 var(--font-mono); color: var(--violet-text); flex: none; min-width: 38px; }
.seg-name { min-width: 0; }
.seg-zones { display: flex; flex-wrap: wrap; gap: 14px 20px; padding: 18px 16px; min-width: 0; align-items: flex-start; }
.seg-chips { display: flex; flex-wrap: wrap; gap: 10px; }
.seg-zone { display: inline-flex; align-items: center; gap: 8px; min-width: 0;
  border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--card);
  padding: 7px 12px; }
.seg-zone.under { border-color: var(--red); }
.seg-zone-name { font: 600 14px/1.3 var(--font-sans); color: var(--ink); max-width: 160px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.seg-sl { font: 500 12px/1 var(--font-mono); border: 1px solid var(--hairline);
  border-radius: var(--r-badge); padding: 4px 7px; color: var(--body);
  white-space: nowrap; flex: none; }
.seg-sl.good { background: var(--green-tint); border-color: transparent; color: var(--green-text); }
.seg-sl.under { background: var(--red-tint); border-color: transparent; color: var(--red-text); }
.seg-assets { font: 500 12px/1 var(--font-mono); color: var(--secondary);
  white-space: nowrap; flex: none; text-transform: uppercase; letter-spacing: .04em; }
/* No fixed tint per layer; the row lights up on hover. */
.seg-row:hover, .seg-row:hover .seg-level { background: var(--violet-tint); }
/* Columns; the board scrolls inside itself (sideways, and down above 480px),
   the level column stays on the left. */
.seg-plate { overflow: auto; max-height: 480px; position: relative; }
.seg-row { grid-template-columns: 200px max-content; min-width: 100%; }
.seg-level { position: sticky; left: 0; z-index: 3; background: var(--canvas); }
/* Per row a fixed space above the zones for the incoming lines (34px for
   one, 16px extra for each next one), so that all zones in the row line up. */
.seg-zones { display: grid; grid-template-columns: repeat(var(--seg-columns, 1), minmax(300px, 340px));
  gap: 0 24px; padding: calc(14px + 34px * min(var(--in, 0), 1) + 16px * max(var(--in, 0) - 1, 0)) 16px
    calc(18px + 30px * min(var(--side, 0), 1));
  align-items: stretch; }
.seg-cell { display: flex; flex-direction: column; min-width: 0; }
.seg-zone { padding: 9px 14px; gap: 8px 10px; width: 100%; box-sizing: border-box; position: relative; z-index: 2; flex-wrap: wrap; }
.seg-zone-name { max-width: none; flex: 1 1 0; min-width: 0; text-decoration: none; }
a.seg-zone-name:hover { color: var(--violet-text); text-decoration: underline; }
.seg-levels { display: flex; flex-wrap: wrap; gap: 6px; flex-basis: 100%; text-decoration: none; }
a.seg-levels:hover .seg-sl { border-color: var(--violet-text); }
.seg-sl { padding: 4px 8px; font-size: 12.5px; }
.seg-assets { margin-left: auto; }
/* The line layer covers the whole (scrollable) board. */
svg.seg-lines { position: absolute; left: 0; top: 0; z-index: 1; pointer-events: none; overflow: visible; }
.seg-line { fill: none; stroke: var(--violet); stroke-width: 2; stroke-linejoin: round; }
.seg-label { font: 500 12px var(--font-mono); fill: var(--violet-text); }
.seg-line-link { pointer-events: auto; cursor: pointer; }
.seg-line-link:hover .seg-label, .seg-line-link:focus .seg-label { text-decoration: underline; }
.seg-line-link:hover .seg-line { stroke-width: 3; }
/* A pair of zones an OT platform saw talk without a conduit between them (FLOWS 7.502): a finding of the checks,
   never a conduit -- dashed, in amber, its label in amber's text colour; the legend's swatch dashed the same way. */
.seg-line.observed { stroke: var(--amber); stroke-dasharray: 6 4; }
.seg-label.observed { fill: var(--amber-text); }
i.seg-line.observed { background: repeating-linear-gradient(90deg, var(--amber) 0 4px, transparent 4px 7px); }
/* A one-way conduit's arrowhead and a data diode's dotted line (FLOWS 7.515); their legend swatches. */
.seg-arrow { fill: var(--violet); }
.seg-line.diode { stroke-width: 3; stroke-dasharray: 1 4; stroke-linecap: round; }
/* a conduit below its target (an FR short of its own SL-T): red, its legend swatch the same */
.seg-line.under { stroke: var(--red); }
i.seg-line.under { background: var(--red); }
i.seg-line.diode { background: repeating-linear-gradient(90deg, var(--violet) 0 2px, transparent 2px 5px); height: 3px; }
i.seg-line.one-way { position: relative; }
i.seg-line.one-way::after { content: ""; position: absolute; right: -2px; top: -3px; border-left: 6px solid var(--violet);
                            border-top: 4px solid transparent; border-bottom: 4px solid transparent; }
.seg-conduit-data, .seg-in, .seg-stubs { display: none; }
@media (max-width: 760px) { .seg-row { grid-template-columns: 1fr; }
  .seg-level { border-right: none; border-bottom: 1px solid var(--hairline); } }

/* Criticality as a full colour block in the last column of the register. */
.data-table td.crit { padding: 0; }
.data-table td.crit > span { display: flex; align-items: center; height: 100%; min-height: 36px;
  padding: 8px 16px; font: 600 13px/1.4 var(--font-sans); color: var(--risk-text); }
.data-table td.crit.high > span { background: #B3261E; }
.data-table td.crit.middle > span { background: #E07B39; }
.data-table td.crit.layer > span { background: var(--green); }

/* Asset register: criticality as a colour block with
   its score in the brand book risk scale (--risk-1 to --risk-6, text --risk-text). */
.data-table td.crit > span { gap: 8px; }
.data-table td.crit > span small { font: 500 12px/1 var(--font-mono); opacity: .85; }
.data-table td.crit.c1 > span { background: var(--risk-1); color: var(--risk-text); }
.data-table td.crit.c2 > span { background: var(--risk-2); color: var(--risk-text); }
.data-table td.crit.c3 > span { background: var(--risk-3); color: var(--risk-text); }
.data-table td.crit.c4 > span { background: var(--risk-4); color: var(--risk-text); }
.data-table td.crit.c5 > span { background: var(--risk-5); color: var(--risk-text); }
.data-table td.crit.c6 > span { background: var(--risk-6); color: var(--risk-text-dark); }
.data-table td.crit.c6 > span small { color: var(--risk-text-dark); }
.data-table td.crit > span small { color: var(--risk-text); opacity: .7; }

/* Sub-headings inside a sidebar group (Settings: Organisation / Personal). */
.side-nav-heading { display: block; padding: 12px 12px 4px; font: 500 11px/1 var(--font-mono);
  letter-spacing: .1em; text-transform: uppercase; color: var(--secondary); }
.side-nav-item .icon, .acc-label .icon, .sot-notice .icon { width: 18px; height: 18px; flex: none; }

/* The score stays on the line (elsewhere small renders as a block). */
.data-table td.crit > span > small { display: inline-block !important; margin: 0; }

/* Zones on the board are links into the asset register, filtered by that zone. */
a.seg-zone { color: inherit; text-decoration: none; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
a.seg-zone:hover { border-color: var(--violet); box-shadow: 0 0 0 2px var(--violet-tint); }
a.seg-zone:hover .seg-zone-name { color: var(--violet-text); }

/* The conduit that was jumped to from the board. */
tr:target { background: var(--violet-tint) !important; }
tr:target td { box-shadow: inset 2px 0 0 var(--violet); }

/* Audit programme: scope choice in the list style of the import wizard, and
   the execution table with one form per row. */
.scope-items { border: 1px solid var(--hairline); border-radius: var(--r-card); margin-top: 10px; max-height: 26rem; overflow: auto; }
.scope-items .section-row { cursor: default; }
.audit-table tr.audit-group td { background: var(--canvas); font-weight: 600; }
.audit-table .doc-entry.compact { min-height: 28px; font-size: 12.5px; }
.audit-ref + .audit-ref { margin-top: 8px; }
.audit-table td.actions { white-space: nowrap; }

/* Framework cards (imported, available, suggested) at equal height in one row. */
.fw-grid { align-items: stretch; grid-auto-rows: 1fr; }
.fw-grid > .fw-card { height: 100%; box-sizing: border-box; }
.fw-card.proposal { align-items: center; }

/* Needs attention, the full list (/attention/): a card per cause, its
   lines as a column of pills. The dashboard card is attn4 at the end. */
/* a line is a sentence: its pill may wrap, never cut */
.attention-cause-card .pill { height: auto; min-height: 26px; padding: 4px 8px; line-height: 1.4; white-space: normal; }
.attention-cause-n { font: 600 18px/1.2 var(--font-sans); color: var(--body); }
.chip-col { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
.attention-list { display: flex; flex-direction: column; gap: 16px; }
.attention-cause-card h2 .attention-cause-n { margin-right: 2px; }

/* §23 stat card, exact: three lines beside the ring or the icon tile —
   heading 12px, value 18px, label 12px — each on one line with an
   ellipsis. The dashboard grew to 149px because the change sat on a line
   of its own and the caption wrapped; now 72–88px, in the equal-height
   grid as well. */
.card.stat, .card.stat.meter { padding: 12px 16px; gap: 4px; min-height: 72px;
  max-height: 88px; justify-content: center; }
.card.stat > .stat-heading { display: block; font: 500 12px/1.3 var(--font-sans);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.card.stat .stat-rule { flex-wrap: nowrap; align-items: baseline; gap: 0 8px;
  min-width: 0; line-height: 1.2; }
.card.stat .stat-rule .stat-value { flex: none; }
.card.stat:not(.meter) .stat-rule .stat-delta { flex-base: auto; }
.card.stat .stat-delta, .card.stat .stat-unit { min-width: 0; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.card.stat > .card-sub { display: block; margin: 0; min-width: 0;
  font: 400 12px/1.3 var(--font-sans); white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
.card.stat > .card-sub .card-link { white-space: nowrap; }
.card.stat > .stat-rows { gap: 2px; margin-top: 0; }
.card.stat > .stat-rows .stat-row { font: 400 12px/1.3 var(--font-sans); }

/* ------------------------------------------------ workspace tree
   The list on the left of a workspace, one shape for controls and documents,
   in portal and console: a heading with feedback, percentage and a
   search field; groups as a violet bar with a progress meter; rows of 44px
   with a status stripe on the left; at the bottom the legend and the actions
   of the page. The list scrolls internally from 480px (§23), so the tree
   never stretches the page. */
.tree { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.tree-heading, .tree-footer, .cp-score { display: flex; flex-direction: column; background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card); }
.tree-heading, .tree-footer { gap: 10px; }
.tree-heading, .cp-score { padding: 14px; }
.tree-heading-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.tree-back { flex: none; white-space: nowrap; text-decoration: none;
  font: 600 13px/1.2 var(--font-sans); color: var(--violet-text); }
.tree-back:hover { color: var(--violet-text); text-decoration: underline; }
.tree-pct { flex: none; white-space: nowrap; padding: 4px 6px; border-radius: var(--r-badge);
  font: 600 12px/1 var(--font-mono); color: var(--green-text); background: var(--green-tint); }
.tree-search { width: 100%; height: 32px; padding: 0 10px; background: var(--canvas);
  border: 1px solid var(--hairline); border-radius: var(--r-control);
  font: 400 13px/1 var(--font-sans); color: var(--ink); }
.tree-search::placeholder { color: var(--secondary); }
.tree-search:focus { border-color: var(--violet); }

.tree-items { display: flex; flex-direction: column; gap: 8px; padding: 8px; max-height: 520px;
  overflow: auto; background: var(--canvas); border: 1px solid var(--hairline);
  border-radius: var(--r-card); }
.tree-group[hidden] { display: none; }
.tree-group > summary { display: flex; align-items: center; gap: 8px; height: 44px; padding: 0 12px;
  list-style: none; cursor: pointer; background: var(--card); color: var(--ink);
  border: 1px solid var(--hairline); border-radius: var(--r-card);
  font: 600 14px/1.2 var(--font-sans); }
.tree-group > summary::-webkit-details-marker { display: none; }
.tree-group > summary:hover { background: var(--canvas); }
.tree-group[open] > summary { border-radius: var(--r-card) var(--r-card) 0 0;
  border-bottom-color: var(--hairline); }
.tree-arrow, .hist-arrow { flex: none; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; }
.tree-arrow { border-left: 5px solid var(--ink); }
.tree-group[open] .tree-arrow { transform: rotate(90deg); }
.tree-group-code { flex: none; font: 600 13px/1 var(--font-mono); color: var(--violet-text); }
.tree-group-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
.tree-meter { flex: none; display: flex; width: 56px; height: 6px; overflow: hidden;
  border-radius: var(--r-full); background: var(--skeleton); }
.tree-meter-part { flex: none; height: 100%; }
.tree-meter-part.k-good { background: var(--green); }
.tree-meter-part.k-busy { background: var(--amber); }
.tree-meter-part.k-rest { background: var(--skeleton); }

.tree-rows { max-height: 300px; overflow-y: auto; background: var(--card);
  border: 1px solid var(--hairline); border-top: none;
  border-radius: 0 0 var(--r-card) var(--r-card); }
.tree-row { display: flex; align-items: center; gap: 8px; height: 44px; padding: 0 10px;
  text-decoration: none; color: var(--ink); border-left: 4px solid var(--table-rule);
  border-bottom: 1px solid var(--hairline); }
.tree-row:last-child { border-bottom: none; }
.tree-row[hidden] { display: none; }
.tree-row.k-good { border-left-color: var(--green); }
.tree-row.k-busy { border-left-color: var(--amber); }
.tree-row:hover { background: var(--canvas); }
.tree-row.active { background: var(--violet-tint); }
.tree-row.active .tree-row-code, .tree-row.active .tree-row-name { color: var(--violet-text); font-weight: 600; }
.tree-row-code, .rdmp-count, .hist-time, .soly-msg-time, .cmap-domain .mono { flex: none; font: 500 12px/1 var(--font-mono); color: var(--secondary); }
.tree-row-name, .hist-what, .pint-redirect code, .member-panel-sub, .sck-tally { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font: 400 13px/1.3 var(--font-sans); }
.tree-row-name, .hist-what { flex: 1; }
.tree-row-arrow { flex: none; opacity: 0; font-size: 15px; line-height: 1; color: var(--violet-text); }
.tree-row.active .tree-row-arrow { opacity: 1; }

.tree-footer { padding: 12px 14px; }
.tree-legend { display: flex; flex-wrap: wrap; gap: 6px 14px;
  font: 400 12px/1.3 var(--font-sans); color: var(--secondary); }
.tree-legend span { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.tree-legend span::before { content: ""; flex: none; width: 3px; height: 12px; border-radius: 1px;
  background: var(--table-rule); }
.tree-legend .k-good::before { background: var(--green); }
.tree-legend .k-busy::before { background: var(--amber); }
.tree-heading .button, .tree-footer .button, .tree-footer .button.small { width: 100%; }
.tree-footer details > summary { list-style: none; cursor: pointer; }
.tree-footer details > summary::-webkit-details-marker { display: none; }
.tree-footer details > form { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
.tree-footer .doc-entry { width: 100%; }

/* The workspace gets a little more room on the left: code plus title then
   fit on one line in the tree. */
.doc-workspace { grid-template-columns: 280px 1fr; }
@media (max-width: 980px) { .doc-workspace { grid-template-columns: 1fr; } }

/* Without the search field the top-bar-right is the only block in the top
   bar; it belongs against the right edge, also when the hamburger on the
   left joins in on narrow screens. */
.top-bar-right { margin-left: auto; }

/* ------------------------------------------------ top bar account menu
   The block at the top right is a button: clicking it opens a menu with
   your own account page and log out. The menu hangs under the button, is
   32px per line and follows the card line of §23. */
.top-account { position: relative; }
.top-account-button { display: flex; align-items: center; gap: 10px; padding: 4px 6px;
  background: none; border: 1px solid transparent; border-radius: var(--r-card);
  cursor: pointer; color: inherit; font: inherit; text-align: left; }
.top-account-button:hover { background: var(--violet-tint); }
.top-account-button[aria-expanded="true"] { background: var(--violet-tint); border-color: var(--hairline); }
.top-account-button .top-who { align-items: flex-start; }
.top-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 40; min-width: 200px;
  display: flex; flex-direction: column; padding: 4px; background: var(--card);
  border: 1px solid var(--hairline); border-radius: var(--r-card);
  box-shadow: 0 6px 20px rgba(47, 51, 73, .12); }
.top-menu-item { display: flex; align-items: center; gap: 8px; height: 32px; padding: 0 8px;
  border-radius: var(--r-control); text-decoration: none; color: var(--ink);
  font: 500 13px/1 var(--font-sans); white-space: nowrap; }
.top-menu-item:hover { background: var(--violet-tint); color: var(--violet-text); }
.top-menu-item .icon { width: 16px; height: 16px; flex: none; }
.top-menu form { margin: 0; display: flex; flex-direction: column; }
button.top-menu-item { width: 100%; background: none; border: 0; cursor: pointer; text-align: left; }


/* The explanation with a control: what the standard asks and how you meet it.
   Reading text, so a wider line height and a maximum line length. */
.card.control-explanation { display: block; }
.control-explanation .explanation-text { margin: 0; max-width: 72ch;
  font: 400 14px/1.6 var(--font-sans); color: var(--body); }

/* ------------------------------------------------ history per control
   One line per event: arrow, glyph, what happened, who and when. Clicking
   expands the note or the explanation below it. Rows of 40px, tinted
   alternately, like a table in §23. */
.control-history .hist-items { overflow: hidden; }
.hist-rule + .hist-rule { border-top: 1px solid var(--hairline); }
.hist-rule:nth-child(even) { background: var(--canvas); }
.hist-rule > details > summary { display: flex; align-items: center; gap: 10px; min-height: 40px;
  padding: 6px 12px; list-style: none; cursor: pointer; }
.hist-rule > details > summary::-webkit-details-marker { display: none; }
.hist-rule > details > summary:hover { background: var(--violet-tint); }
.hist-rule > details.bare > summary { cursor: default; }
.hist-rule > details.bare > summary:hover { background: none; }
.hist-rule > details.bare .hist-arrow { visibility: hidden; }
.hist-arrow { border-left: 5px solid var(--disabled); }
.hist-rule > details[open] .hist-arrow { transform: rotate(90deg); }
.hist-what, .pint-redirect code { line-height: 1.4; color: var(--ink); }
.hist-who { flex: none; max-width: 180px; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; font: 400 12px/1.4 var(--font-sans); color: var(--secondary); }
.hist-detail { padding: 2px 12px 12px 41px; }
.hist-text { margin: 0; max-width: 72ch; font: 400 13px/1.6 var(--font-sans); color: var(--body); }
.hist-text.empty { color: var(--secondary); font-style: italic; }
.hist-detail .card-link { display: inline-block; margin-top: 6px; }
@media (max-width: 700px) { .hist-who { display: none; } }

/* ------------------------------------------------ sidebar as a rail
   Option from brand book §14: the sidebar collapses into a 64px rail with
   glyphs only, the logo as the brand mark and the active group in a violet
   tint. A click on a glyph (or Enter, Space, an arrow key) opens the menu of
   that group beside it, names included; the glyph carries an aria-label and
   aria-expanded. */
.rail-button { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 32px;
  padding: 0 10px; background: none; border: none; border-radius: var(--r-control);
  cursor: pointer; color: var(--secondary); font: 500 13px/1.2 var(--font-sans); }
.rail-button:hover { background: var(--canvas); color: var(--ink); }
/* The sidebar's foot (templates/base.html, K5 phase 2): the call button, a hairline, Collapse menu and the user
   card, 8px apart: the foot pulls the card up from the sidebar's own 1.1rem gap. */
.side-foot { display: flex; flex-direction: column; gap: 8px; flex: none; }
/* The line above Collapse menu is the same line as the one above the user
   card (.sidebar-footer): same colour, same width to the sidebar's edges. */
.side-collapse { border-top: 1px solid var(--user-card-rule); padding: 8px calc(1rem - 4px) 0; margin: 0 calc(4px - 1rem); }
.sidebar > .side-foot + .sidebar-footer { margin-top: calc(8px - 1.1rem); }
.rail .side-foot { align-items: center; width: 100%; }
.rail .side-collapse { display: flex; justify-content: center; width: auto; padding-left: 0; padding-right: 0; }
.rail-button .icon { width: 16px; height: 16px; flex: none; }

.rail .sidebar { width: 64px; padding: 14px 8px 12px; gap: 10px; align-items: center;
  overflow: visible; z-index: 50; }
.rail .sidebar .brand { padding: 0; justify-content: center; }
.rail .brand-name, .rail .brand-sub, .rail .side-nav-heading, .rail .sidegroup-arrow,
.rail .side-group-heading > span, .rail .user-info, .rail .rail-button-text { display: none; }
.rail .user-card-top { justify-content: center; }
.rail .side-nav { align-items: center; gap: 4px; overflow: visible; width: 100%; }
.side-group-sleeve { display: contents; }
.rail .side-group-sleeve { display: block; position: relative; width: 100%; }
.rail .side-group { width: 100%; display: flex; flex-direction: column; align-items: center; }
.rail .side-group > .side-nav-item { display: none; }
.rail .side-group-heading, .rail .rail-button, .rail .call-button { width: 36px; height: 36px; padding: 0; justify-content: center; }
.rail .side-group-heading { border-radius: var(--r-control); }
.rail .side-group-heading .icon { width: 18px; height: 18px; }
.rail .side-group-sleeve:has(.side-nav-item.active) .side-group-heading { background: var(--violet-tint); }
.rail .side-group-sleeve:has(.side-nav-item.active) .side-group-heading .icon { color: var(--violet-text); }
.rail .rail-button .icon { transform: rotate(180deg); }
.rail .sidebar-footer { border: none; padding: 0; margin: 0; align-items: center; }

/* The flyout is an ordinary card: a hairline all round, 4px corners, and it
   floats eight pixels off the rail. It opens on a click and stays until a
   click outside, Escape, or the focus leaving it (templates/base.html). */
.rail-tile { display: none; position: absolute; left: calc(100% + 8px); top: -6px; z-index: 60;
  min-width: 208px; max-height: 70vh; overflow-y: auto; padding: 6px;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card);
  box-shadow: 0 8px 24px -6px rgba(47, 51, 73, .22); }
.rail .side-group-sleeve.flyout-open > .rail-tile { display: block; }
.rail .side-group-sleeve.flyout-open .side-group-heading { background: var(--canvas); }

.rail-tile-heading { display: block; padding: 4px 8px 6px; font: 600 13px/1.3 var(--font-sans);
  color: var(--ink); }
.rail-tile .side-nav-item { display: flex; white-space: nowrap; padding-left: 8px;
  font-size: 13px; }

/* Below 980px the sidebar is already a drawer behind the hamburger; a rail
   makes no sense there, so the collapsed state does not count. */
@media (max-width: 980px) {
  .rail .sidebar { width: 264px; padding: 1.3rem 1rem 1.1rem; align-items: stretch;
    z-index: 40; }
  .rail .brand-name, .rail .brand-sub, .rail .rail-button-text { display: block; }
  .rail .side-group-heading > span { display: inline; }
  .rail .user-info { display: flex; }
  .rail .side-nav-heading { display: block; }
  .rail .sidegroup-arrow { display: inline-block; }
  .rail .side-group > .side-nav-item { display: flex; }
  .rail .side-group-heading { width: auto; height: auto; padding: .5rem .55rem;
    justify-content: flex-start; }
  .rail .rail-button { width: 100%; height: auto; min-height: 32px; padding: 0 10px;
    justify-content: flex-start; }
  .rail .rail-button .icon { transform: none; }
  .rail .rail-tile { display: none !important; }
  .rail .sidebar-footer { border: 0; border-top: 1px solid var(--user-card-rule); padding: 10px 0 0; margin: 0 calc(4px - 1rem) calc(4px - 1.1rem); }
  .rail .user-card-top { justify-content: flex-start; }
  html.rail .user-card-foot, html.rail .user-more { display: flex; }
  /* The rail centres everything for its 64px; the drawer is the full menu
     again, so the brand, the groups and their items stand left as always. */
  .rail .sidebar .brand { padding: 0 .5rem .4rem; justify-content: flex-start; }
  .rail .side-nav { align-items: stretch; gap: .1rem; overflow-y: auto; }
  .rail .side-group { display: block; align-items: stretch; }
  .rail .side-group-sleeve { display: contents; }
  .rail .sidebar-footer { align-items: stretch; }
}

/* ------------------------------------------------ the dark sidebar (docs/FLOWS.md 7.317)
   Rinat's design, 2026-10-11: the left menu of the portal and the console in dark navy, in the light and the
   dark theme alike; the page beside it stays as it is. Colours only: the parts of the sidebar take the
   --side-* tokens (static/css/tokens.css) in place of the page's own, so every rule above keeps drawing them
   and nothing is set twice. The rail's flyout (.rail-tile) sits outside these parts and stays an ordinary
   card. The pills in the menu keep their own pairs. */
.sidebar { background: var(--side-bg); border-right-color: var(--side-bg); }
.sidebar > .brand, .sidebar-domain, .side-group, .side-foot, .sidebar-footer {
  color-scheme: dark;
  --card: var(--side-bg); --ink: var(--side-text); --body: var(--side-text); --secondary: var(--side-muted);
  --canvas: var(--side-hover); --hairline: var(--side-line); --user-card-rule: var(--side-rule);
  --user-card-text: var(--side-muted); --field-rule: var(--side-muted); --focus-ring: var(--side-active);
  --violet-text: var(--side-active); --violet-tint: var(--side-tint);
  --green-text: var(--side-green); --green-tint: var(--side-green-tint); }
.side-nav { scrollbar-color: var(--side-line) transparent; }
.rail-tile { scrollbar-color: auto; }
/* An open group's items in the lighter grey, Collapse menu too; the group's name white at 600. */
.side-group > .side-nav-item, .side-collapse { --secondary: var(--side-sub); }
.side-group > .side-group-heading { font-weight: 600; }
/* The line above the call button, as the ones above Collapse menu and the user card: in the middle of the gap
   between the menu and the foot, drawn without taking room. */
.side-foot:has(.call-button) { position: relative; }
.side-foot:has(.call-button)::before { content: ""; position: absolute; left: calc(4px - 1rem); right: calc(4px - 1rem);
  top: -.55rem; border-top: 1px solid var(--side-rule); }
.rail .side-foot:has(.call-button)::before { left: 6px; right: 6px; top: -5px; }
/* On a violet tint the violet text stays under 4.5:1, so the words there are white. */
.side-foot .call-button.default:hover, .side-foot .call-button.default[aria-current="page"] { border-color: var(--side-active); }
.side-foot .call-button.default[aria-current="page"], .side-group .pill.planned { color: var(--side-text); }
.sidebar-footer .user-avatar { background: var(--side-avatar); color: var(--side-sub); }

/* The status dot: one shape for work lists, member tables and the
   two-factor column in the console. */
.dot { display: inline-block; width: 10px; height: 10px; border-radius: var(--r-full);
  flex: none; background: var(--disabled); }
.dot.good { background: var(--green); }
.dot.attention { background: var(--amber); }
.dot.error { background: var(--red); }

/* ------------------------------------------------ toggle
   The knob filled almost the whole track and the track was nearly white, so
   a switched-off toggle looked like a loose dot. Now a track of 36x20 with
   a hairline, a knob of 16px with equal margins, and violet with a white
   knob when it is on. */
input[type="checkbox"].toggle { width: 36px; height: 20px; flex: 0 0 36px;
  /* Inside a form every input field gets a 32px minimum height; a
     toggle is not an input field and keeps its own size. */
  min-height: 20px; max-height: 20px;
  background: var(--skeleton); border: 1px solid var(--hairline); }
input[type="checkbox"].toggle::after { top: 1px; left: 1px; width: 16px; height: 16px;
  box-shadow: 0 1px 2px rgba(15, 18, 32, .18); }
input[type="checkbox"].toggle:hover { border-color: var(--table-rule); }
input[type="checkbox"].toggle:checked { background: var(--violet); border-color: var(--violet); }
input[type="checkbox"].toggle:checked:hover { background: var(--violet-hover);
  border-color: var(--violet-hover); }
input[type="checkbox"].toggle:checked::after { transform: translateX(16px); }
:root[data-theme="dark"] input[type="checkbox"].toggle { background: #3F4459;
  border-color: #4A5068; }
/* (ssheetd, FLOWS 7.385) the dark track above outweighed :checked, so a switch that was on stayed grey in the dark
   theme and only its knob said so: on is violet in both themes */
:root[data-theme="dark"] input[type="checkbox"].toggle:checked { background: var(--violet); border-color: var(--violet); }

/* Sensitive text in the customer view: red for whoever is looking on or
   editing, invisible to the customer themselves and to elevated support.
   The colour is a marking, not security — that comes with the encryption. */
/* "To be encrypted": for support below elevated this shows not the value
   but a dotted chip with a padlock and the field name. Input fields with
   such a value get the same dotted line and blurred text. */
.sensitive { display: inline-flex; align-items: center; gap: 6px; padding: 2px 8px; vertical-align: middle;
  border: 1px dashed #A098F5; border-radius: var(--r-control); color: #6E7388; background: transparent;
  font: 500 13px/1.4 var(--font-sans); white-space: nowrap; text-decoration: none; }
.sensitive::before { content: ""; width: 12px; height: 12px; flex: none; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='11' width='16' height='10' rx='2'/%3E%3Cpath d='M8 11V7a4 4 0 0 1 8 0v4'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='11' width='16' height='10' rx='2'/%3E%3Cpath d='M8 11V7a4 4 0 0 1 8 0v4'/%3E%3C/svg%3E") center / contain no-repeat; }
a.sensitive, .sensitive a { color: inherit; }
.sensitive.hidden { border-color: #C9CCD8; color: #6E7388; }
/* No longer decryptable: the customer's key is gone or unreachable. */
.sensitive.unreadable { border-color: #F5B5A8; color: var(--red-text, #bf2600); }
/* Input fields with a hidden value: padlock on the left, blurred text; the normal border stays. */
[data-sensitive="1"] { color: transparent !important; text-shadow: 0 0 7px rgba(70, 75, 99, .6);
  padding-left: 34px !important; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236E7388' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='11' width='16' height='10' rx='2'/%3E%3Cpath d='M8 11V7a4 4 0 0 1 8 0v4'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important; background-position: 10px center !important; background-size: 16px 16px !important; }
[data-sensitive="1"]::placeholder { color: transparent; }

/* Design block of a control: requirements and statements as chips in one
   input box, with a select list under the box as soon as you type (link_pane.js).
   Grey counts, amber dotted with a dot is a document that has not been
   approved yet, red dotted is missing its source. */
.link-block { display: flex; flex-direction: column; gap: 10px; margin-top: 16px; }
.link-heading { display: flex; justify-content: space-between; align-items: baseline; gap: var(--s-3); min-height: 24px; }
.link-heading h3, .fstep-card .form-section-head > h2, .prp-card .afw-sec h3 { margin: 0; font: 600 16px/1.3 var(--font-sans); color: var(--ink); }
.link-field { position: relative; }
.link-pane { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 8px 10px; min-height: 56px;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); cursor: text; }
.link-pane:focus-within { border-color: var(--violet); box-shadow: 0 0 0 3px var(--violet-tint); }
.link-pane .chip { display: inline-flex; align-items: center; gap: 6px; padding: 0 6px 0 12px; height: 36px;
  font: 500 14px/1 var(--font-mono); border-radius: var(--r-badge); border: 1px solid transparent;
  background: var(--violet-tint); color: var(--violet-text); text-decoration: none; white-space: nowrap; flex: none; }
.link-pane .chip.fixed { padding-right: 12px; }
.link-pane .chip:not(.mono) { font: 500 14px/1 var(--font-sans); }
.link-items li.new .option-lines > .cell-main { color: var(--violet-text); }
.link-pane .chip.ok { background: var(--canvas); color: var(--ink); }
.link-pane .chip.draft { background: transparent; border: 1px dashed var(--amber); color: var(--amber-text); }
.link-pane .chip.draft::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--amber); flex: none; }
.link-pane .chip.source-gone > .icon { width: 16px; height: 16px; color: var(--amber-text); flex: none; }
.link-pane .chip form { display: inline; }
.link-pane .chip-x { min-width: 24px; min-height: 24px; padding: 0; font: 600 16px/1 var(--font-sans); color: inherit;
  border: 0; background: transparent; border-radius: var(--r-badge); cursor: pointer; opacity: .7; }
.link-pane .chip-x:hover { opacity: 1; background: rgba(0, 0, 0, .06); }
.link-pane-entry { flex: 1 1 180px; min-width: 140px; height: 36px; padding: 0 4px; border: 0; outline: 0;
  font: 400 15px/1.3 var(--font-sans); color: var(--ink); background: transparent; }
.link-pane-entry::placeholder { color: var(--secondary); }
.link-pane-entry:disabled { cursor: default; }
/* The box itself carries the focus ring; the field inside it does not. And
   the select list may run past the card edge. */
.link-pane .link-pane-entry:focus, .link-pane .link-pane-entry:focus-visible { box-shadow: none; outline: none; border: 0; }
.card.design { overflow: visible; }
.link-items { position: absolute; left: 0; right: 0; top: calc(100% + 2px); z-index: 30; margin: 0; padding: 0; list-style: none;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-control); box-shadow: 0 8px 24px rgba(47, 51, 73, .12);
  max-height: 320px; overflow: auto; }
.link-items li { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 16px; align-items: center;
  min-height: 56px; padding: 6px 16px; border-top: 1px solid var(--hairline); cursor: pointer; }
.link-items li:first-child { border-top: 0; }
.link-items li:hover, .link-items li.active { background: var(--canvas); }
.link-items li.empty { grid-template-columns: 1fr; color: var(--secondary); cursor: default; }
/* The record picker (templates/_record_picker.html, core/pickers.py): the
   same pane at the height of a form control (brand book §23: 32px in a
   form, chips with the badge radius), the "create it first" link in the
   empty state, and a chip from before the picker -- a stored value the
   platform does not know -- drawn as a hairline chip until it is changed. */
.record-picker .link-pane.pick { min-height: 32px; padding: 2px 8px; gap: 6px; }
.record-picker .link-pane.pick .chip { height: 24px; padding: 0 2px 0 8px; font-size: 13px; border-radius: var(--r-badge); }
.record-picker .link-pane.pick .chip-x { min-width: 20px; min-height: 20px; font-size: 14px; }
.record-picker .link-pane.pick .link-pane-entry { height: 26px; min-width: 120px; flex: 1 1 120px; font-size: 14px; }
.record-picker.compact .link-pane.pick { min-height: 32px; }
.record-picker.compact .link-items li { min-height: 40px; gap: 10px; padding: 6px 10px; }
.record-picker .link-items li { min-height: 40px; }
/* The choice field (templates/_choice_field.html, FLOWS 7.403): the record picker over a fixed list, the
   one control for a choice -- a dropdown to type in, the choice a chip. As tall as the fields beside it
   (40px, 32px compact in a row), the select's caret on the right (the caret rule of select.doc-entry), and
   the options under the heading of their group (a select's optgroups) in mono uppercase. */
.choice-field .link-pane.pick { min-height: 40px; padding-right: 32px; }
.choice-field.compact .link-pane.pick { min-height: 32px; }
.choice-field .link-pane.pick .link-pane-entry { flex-basis: 48px; min-width: 48px; }
.choice-field.compact { flex: 1 1 200px; min-width: 160px; max-width: 320px; }
.record-picker .link-items li.link-group { display: block; min-height: 0; padding: 10px 16px 4px; border-top: 0; cursor: default;
  font: 500 11px/1.4 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; color: var(--secondary); }
.record-picker .link-items li.link-group:hover { background: none; }
.link-pane .chip.legacy { background: var(--card); border: 1px solid var(--hairline); color: var(--body); font-style: italic; }
.link-items .link-create { color: var(--violet-text); font-weight: 600; text-decoration: none; white-space: nowrap; }
.link-items .link-create:hover { text-decoration: underline; }
/* One option of a picker in two lines (picktwo, FLOWS 7.391; core/picker_options.py, link_pane.js optionLines):
   line one the name or the title (.cell-main, 14px), line two what tells the options apart (.cell-code-sub,
   12px mono: the e-mail or the code, then the group, role, status or place). The one growing column of the
   row; each line cut with an ellipsis, so nothing runs into the next column at any width. The link panes'
   choice list, the Insert flow palette and the connector's Link to item. */
.option-lines { display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; }
.option-lines > .cell-main, .option-lines > .cell-code-sub { overflow: hidden; text-overflow: ellipsis; }
.pp-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 15px; color: var(--ink); }
.kl-status { font-size: 14px; white-space: nowrap; flex: none; }
.kl-status.ok { color: var(--green-text); }
.kl-status.draft { color: var(--amber-text); }
/* The Controls card of a risk page (templates/_risk_controls.html): a chip
   is a link to the control with its status pill beside it; a lock marks a
   link a group wrote; a control whose framework is gone is a source-gone chip. */
.rctl-chip a { color: inherit; text-decoration: none; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.rctl-chip a:hover { text-decoration: underline; }
.rctl-lock { display: inline-flex; align-items: center; color: var(--secondary); padding: 0 4px; }
.rctl-lock .icon { width: 16px; height: 16px; }
[data-risk-controls] > .card-sub { display: block; margin-bottom: var(--s-2); }
/* The statements without a source, one row each: code, what is wrong, the step that mends it. */
.link-missing-row { display: flex; align-items: center; gap: 24px; min-height: 40px; padding: 8px 14px; font-size: 14px; color: var(--body);
  border-bottom: 1px solid var(--hairline); }
.link-missing-row:last-child { border-bottom: 0; }
.link-missing-code { flex: none; min-width: 72px; color: var(--ink); }
.link-missing-why { flex: 1 1 auto; min-width: 0; }
.link-missing-row .card-link { flex: none; font-weight: 600; white-space: nowrap; }
/* The Documents block of a control's Design card (templates/measure_detail.html):
   one 40px row per document that substantiates the control -- code, title,
   the reason, the state pill, × for one attached from the page -- inside a
   hairline box, the picker below it like the other two blocks. */
.link-heading h3 .cdoc-count { margin-left: 10px; font-weight: 500; color: var(--secondary); }
.cdoc-row { display: flex; align-items: center; gap: 16px; min-height: 40px; padding: 6px 14px; font-size: 14px; color: var(--body);
  border-bottom: 1px solid var(--hairline); }
.cdoc-row:last-child { border-bottom: 0; }
.cdoc-row:nth-child(even) { background: var(--canvas); }
.cdoc-code { flex: none; min-width: 72px; color: var(--ink); white-space: nowrap; }
.cdoc-title { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cdoc-title .card-link { font-weight: 600; }
.cdoc-title .icon.mini { width: 14px; height: 14px; vertical-align: -2px; }
.cdoc-origin { flex: none; max-width: 40%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cdoc-gone { display: inline; flex: none; }
.cdoc-gone .chip-x { min-width: 24px; min-height: 24px; padding: 0; font: 600 16px/1 var(--font-sans); color: var(--secondary); border-radius: var(--r-badge); }
.cdoc-gone .chip-x:hover { color: var(--ink); background: rgba(0, 0, 0, .06); }
@media (max-width: 720px) { .cdoc-row { flex-wrap: wrap; row-gap: 4px; } .cdoc-origin { max-width: 100%; flex-basis: 100%; } }
/* The other way round (templates/_document_controls.html, solytx): the controls a document substantiates in
   the aside, per framework (its name and count as the section's label), each control one line -- the code,
   the title that gives way with an ellipsis, the statements or requirements it comes through as small chips
   -- the first two open and the rest behind "Show all n". */
.dctl-head { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.dctl-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dctl-count { white-space: nowrap; }
.dctl-rows { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
/* a control the document backs (dctlcard): its full code and title, never cut, and the line under it that says how */
.dctl-row { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.dctl-link { display: flex; align-items: baseline; gap: 8px; min-width: 0; color: var(--ink); text-decoration: none; }
.dctl-link:hover .dctl-title { color: var(--violet-text); text-decoration: underline; }
.dctl-code, .xf-qcode { flex: none; white-space: nowrap; font-size: 13px; color: var(--body); }
.dctl-title { min-width: 0; overflow-wrap: anywhere; font-size: 14px; }
.dctl-more > summary.card-link { font-size: 13px; cursor: pointer; }
.dctl-more > .dctl-rows { padding-top: 8px; }

/* Add risk (IT): the risk on the left, the assessment with a live score on
   the right. Fields 44px, labels 14px/600, "optional" in grey. */
.rn-form { margin: 16px -16px -16px; }
.rn-columns { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); border-top: 1px solid var(--hairline); }
.rn-links { padding: 24px 24px 28px; display: flex; flex-direction: column; gap: 18px; }
.rn-right { padding: 24px 24px 28px; background: var(--canvas); border-left: 1px solid var(--hairline);
  display: flex; flex-direction: column; gap: 18px; }
.rn-right .eyebrow { margin-bottom: -6px; }
.rn-columns > .form-field { gap: 8px; }
.rn-standard { font-weight: 500; color: var(--body); letter-spacing: .04em; }
.rn .doc-entry { min-height: 44px; font-size: 15px; padding: 10px 14px; background: var(--card); }
.rn textarea.doc-entry { min-height: 84px; }
.rn select.doc-entry { height: 44px; padding-top: 0; padding-bottom: 0; padding-right: 40px; line-height: normal;
  appearance: none; -webkit-appearance: none; background-repeat: no-repeat; background-position: right 14px center;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23464B63' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-size: 18px 18px; }
.rn .link-pane { background: var(--card); }
.rn-line { border: 0; border-top: 1px solid var(--hairline); margin: 2px 0; }
.rn-score { background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-control); padding: 20px 22px;
  display: flex; flex-direction: column; gap: 14px; }
.rn-score-heading { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
.rn-score-value { display: inline-flex; align-items: center; gap: 10px; }
.rn-score-value b, .rn-rest b { font: 600 22px/1 var(--font-sans); font-variant-numeric: tabular-nums; }
.rn-strook { display: grid; grid-template-columns: repeat(var(--columns), minmax(0, 1fr)); gap: 6px; }
.rn-cell { height: 30px; border-radius: 4px; display: grid; place-items: center; font: 600 13px/1 var(--font-mono);
  color: var(--risk-text); border: 2px solid transparent; }
.rn-cell.active { border-color: var(--ink); }
.rn-rest { display: flex; align-items: center; gap: 12px; }
.rn-rest-label { color: var(--body); font-size: 15px; }
.rn-ticks { display: flex; flex-wrap: wrap; gap: 10px; }
.rn-tick { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; padding: 0 16px; cursor: pointer;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); font-size: 15px; color: var(--ink); }
.rn-tick input { width: 18px; height: 18px; margin: 0; }
.rn-tick:has(input:checked) { border-color: var(--violet); background: var(--violet-tint); color: var(--violet-text); }
.rn-cancel { min-height: 48px; padding: 0 24px; font-size: 15px; }
.rn-make { flex: 1; min-height: 48px; font-size: 15px; }
@media (max-width: 960px) { .rn-columns { grid-template-columns: 1fr; } .rn-right { border-left: 0; border-top: 1px solid var(--hairline); } }

/* Risk register: heading with count and buttons, a filter row with a search field
   and select lists that light up as chips as soon as they filter something, and a
   table with the title in bold, level as a coloured dot and status as the only field. */
.rr-heading { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; }
.rr-heading-links { display: flex; min-width: 0; }
.rr-heading-right { display: flex; align-items: center; }
.rr-search { position: relative; }
.rr-search .doc-entry { width: 100%; }
.rr-search .icon { position: absolute; right: 14px; top: 50%; transform: translateY(-50%); color: var(--secondary); pointer-events: none; }
.rr-clear { border: 0; background: transparent; color: var(--violet-text); cursor: pointer; padding: 0 4px; }
.rr-clear:hover { text-decoration: underline; }
.rr-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.rr-consequences { color: var(--secondary); }
.rr-point, .cmap-sq, .distribution-legend i, .trend-legend .swatch, .cc-legend .swatch, .cc-type .swatch, .mr-level-dot, .eyebrow > .swatch,
.fleet-strip-row .swatch { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }
.rr-point, .cmap-sq, .fleet-strip-row .swatch { flex: none; }
.rr-id-link { text-decoration: none; }
/* One explanatory line under a card header, before the input grid. */
.card-explanation { margin: -4px 0 10px; }
/* Processing: the DPIA status as a link in the register. */
.pill-link { text-decoration: none; }
.pill-link:hover .pill { outline: 2px solid var(--violet); outline-offset: 1px; }
/* The domain number under (register) or beside (detail) the organisation-wide id. */
.rr-id-domain, .dm-event-when, .fleet-checked > .mono, .deadline-chart-aware { font-size: 12px; color: var(--secondary); white-space: nowrap; }
.rr-id-link:hover, .rr-title:hover { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
.rr-footer { display: flex; justify-content: space-between; align-items: center; gap: 16px; flex-wrap: wrap; }
.rr-footer .mono { font-size: 12px; letter-spacing: .06em; text-transform: uppercase; }


/* The audit list per layer of the domain tree (audsty 2026-09-27): the
   table's cells are the shared ones; a layer is a group row with its
   chevron, name and count, indented by its depth (--depth), and the audits
   below it indent their code as far plus the chevron's width. */
.audit-list tr.group-row td { padding-left: calc(var(--table-inset) + var(--depth, 0) * 24px); }
.audit-list tr.group-row strong { font-size: 14px; }
.audit-list tr.group-row strong.subtle { font-weight: 600; }
.audit-list td.audit-indent { padding-left: calc(var(--table-inset) + var(--depth, 0) * 24px + 34px); }
.audit-list .group-button { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px;
  border: 0; background: none; color: var(--secondary); cursor: pointer; vertical-align: middle; margin-right: 6px; }
.audit-list .group-button .icon { width: 16px; height: 16px; transition: transform .15s; }
.audit-list .group-button[aria-expanded="false"] .icon { transform: rotate(-90deg); }
.audit-list .eyebrow.inline { display: inline; margin-left: 10px; }
.page-sub .eyebrow.inline { display: inline; margin-left: 6px; }

/* Statement of applicability as one form (soastyle, 2026-09-28; FLOWS
   7.160): the reason cell a stack of the chips, "No reason yet" and Add
   reason (a fold with the three a person ticks); an excluded control's
   title in the secondary grey. The shared cell patterns do the rest
   (.cell-code, .cell-title, .cell-word, .cell-links, the zebra rows). */
.data-table.soa [hidden] { display: none; }
.data-table.soa .soa-tick { width: 40px; }
.data-table.soa .soa-stack { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; min-width: 200px; }
.data-table.soa .soa-chips { display: flex; flex-wrap: wrap; gap: 4px; }
.data-table.soa .soa-chips:not(:has(> :not([hidden]))) { display: none; }
.data-table.soa .soa-add > summary { display: inline-flex; align-items: center; gap: 4px; margin: 0; cursor: pointer; list-style: none; }
.data-table.soa .soa-add > summary::-webkit-details-marker { display: none; }
.data-table.soa .soa-reason { display: block; font-size: 12px; color: var(--body); line-height: 1.6; white-space: nowrap; }
.data-table.soa .soa-reason input { width: 13px; height: 13px; vertical-align: -2px; margin-right: 4px; }
.data-table.soa .soa-justification { width: 100%; min-width: 200px; }
.data-table.soa .soa-coverage { max-width: 260px; }
.data-table.soa .soa-coverage .cell-links:first-child { margin-top: 0; }
.data-table.soa tr.out .cell-title { color: var(--secondary); }
.soa-card .soa-warn { color: var(--red-text); }
/* Bulk edit (isoB, FLOWS 7.240; templates/bulk_edit.html): the line that sets a
   value for every ticked row, three fields side by side over one hint; a row
   whose values differ from what is stored carries the light violet tint until
   Apply or its Undo. The table is the statement's (.data-table.soa). */
.bulk-set { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; align-items: start; }
.bulk-set > .form-hint { grid-column: 1 / -1; margin: 0; }
/* (isoC, 7.247) the evidence's one drop box takes the line's full width, its file choice and date under it */
.bulk-set > .bulk-files { grid-column: 1 / -1; }
.data-table.bulk-table tr.bulk-changed > td { background: var(--violet-tint); }
.bulk-card .bulk-empty { display: flex; align-items: center; gap: 10px; min-height: 34px; }
/* Apply's progress under the heading, batch by batch, then the result and the rows not saved (like Import all). */
.bulk-state { display: flex; flex-direction: column; gap: 8px; }
.bulk-state[hidden], .bulk-state [hidden] { display: none; }
.bulk-state .progress-bar-row { margin: 0; }
.bulk-state .bulk-refused { color: var(--red-text); }
/* A derived reason's chip (templates/_control_reason_chip.html): its why in
   the dark tip under it on hover and on keyboard focus, as .dm-why does. */
.crsn-tip { position: relative; display: inline-flex; flex: none; }
.crsn-tip > .dm-why { left: 0; right: auto; }
.crsn-tip > .crsn-chip:is(:hover, :focus-visible) + .dm-why { display: block; }
/* In a table's last row the tip opens upwards, inside the scrolling wrap. */
.data-table > tbody > tr:last-child .crsn-tip > .dm-why { top: auto; bottom: calc(100% + 6px); }

/* Dashboard: the view choice (this domain / per domain / consolidated) on
   the right of the page header, and the table per domain: one growing name
   column, figures in mono on one line, rows of 40px, total row at the bottom. */
/* Scope of the dashboard: a label with below it one select field with an
   icon on the left and a chevron on the right (the pattern for every styled choice). */
.dash-scope { flex: none; display: grid; gap: 6px; justify-items: start; }
/* On the dashboard the scope sits on the right of the title row, top aligned. */
.dash-heading { align-items: flex-start; }
.dash-heading > .dash-scope { flex: none; margin-left: auto; }
.dash-scope-heading, .member-label, .milestones-name, .rdmp-label, .intg-field .link-text-mode, .control-explanation .explanation-heading, .rdt-linked-name, .otb-fr-tile .otb-fr-level, .soly-ask .form-label { font: 600 13px/1.2 var(--font-sans); color: var(--ink); }
.select-field { position: relative; display: inline-flex; align-items: center; }
.select-field-icon { position: absolute; left: 12px; width: 18px; height: 18px; color: var(--violet-text); pointer-events: none; }
.select-field-select { appearance: none; height: 40px; min-width: 220px; padding: 0 40px 0 40px;
  font: 400 15px/1 var(--font-sans); color: var(--ink); background: var(--card);
  border: 1px solid var(--hairline); border-radius: var(--r-card); cursor: pointer; }
.select-field-select:hover { border-color: var(--rule); }
.selectfield-arrow { position: absolute; right: 15px; width: 8px; height: 8px; pointer-events: none;
  border-right: 1.75px solid var(--secondary); border-bottom: 1.75px solid var(--secondary);
  transform: translateY(-3px) rotate(45deg); }
.dash-domains th, .dash-domains td { white-space: nowrap; border-left: 1px solid var(--hairline); }
.dash-domains th:first-child, .dash-domains td:first-child { border-left: none; }
.dash-domains td.dash-number { text-align: right; }
.dash-domains tbody td, .dash-domains tfoot td { vertical-align: middle;
  font-family: var(--font-mono); font-size: 13px; color: var(--secondary); }
.dash-domains td b { font-weight: 500; color: var(--ink); }
.dash-domains td.dash-domain { font-family: var(--font-sans); min-width: 220px; white-space: nowrap; }
.dash-branch { font-family: var(--font-mono); color: var(--rule); margin-right: 10px; }
.dash-name { color: var(--violet-text); font-weight: 600; font-size: 14px; text-decoration: none; }
.dash-name:hover { text-decoration: underline; text-underline-offset: 2px; }
.dash-code { font-family: var(--font-mono); font-size: 12px; color: var(--secondary); margin-left: 6px; }
.dash-current { display: inline-block; margin-left: 8px; padding: 1px 8px; border-radius: 2px; background: var(--violet-tint);
  color: var(--violet-text); font: 500 11px/1.6 var(--font-mono); letter-spacing: .08em; text-transform: uppercase; }
.dash-gauge { min-width: 200px; }
.dash-fraction { display: inline-block; min-width: 56px; }
.dash-fraction.nul b { color: var(--secondary); font-weight: 400; }
.dash-meter { display: inline-block; vertical-align: middle; width: 56px; height: 6px; margin: 0 14px; border-radius: 3px;
  background: var(--hairline); overflow: hidden; }
.dash-meter i, .isoj-progress .gauge i, .srun-fill { display: block; height: 100%; background: var(--violet); border-radius: 3px; }
.dash-pct { display: inline-block; min-width: 32px; }
.dash-nul { color: var(--secondary); }
.dash-red { color: var(--red-text); font-weight: 600; }
.dash-point { color: var(--secondary); margin: 0 8px; }
.dash-domains tfoot td { background: var(--canvas); border-top: 1px solid var(--rule); font-weight: 600; }
.dash-domains tfoot td.dash-domain { color: var(--ink); }
.dash-domains tfoot td b, .dash-domains tfoot .dash-pct { color: var(--ink); }

/* Welcome screen after signing in (templates/welcome.html): one card in the
   middle of the screen, the brand above it, below that the steps with their
   state on the right. This is the shell of that screen, so screen height is allowed here. */
.welcome { min-height: 100vh; display: flex; align-items: center; justify-content: center;
  background: var(--canvas); padding: var(--s-5); }
.welcome-card { background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card);
  box-shadow: 0 1px 2px rgba(20, 24, 40, .04); padding: 34px 32px 30px; width: min(420px, 100%);
  display: flex; flex-direction: column; gap: 26px; }
.welcome-brand { display: flex; justify-content: center; }
.welcome-image { width: 84px; height: 84px; border-radius: 50%; object-fit: cover; }
/* The brand mark (.cisoly-mark): the same loading icon as in every save button
   (.button.loading), larger; on the sign-in page and the welcome screen. One drawing
   for all three, so that they can never drift apart. */
.cisoly-mark, .welcome-mark { display: block; width: 84px; height: 84px; border-radius: 50%;
  background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='16' fill='%237367F0'/><g transform='rotate(90 16 16) translate(32 0) scale(-1 1)'><circle cx='16' cy='16' r='8.857' fill='none' stroke='%23A098F5' stroke-width='5.143'/><circle cx='16' cy='16' r='8.857' fill='none' stroke='%23fff' stroke-width='5.143' pathLength='100' stroke-dasharray='100 100' stroke-dashoffset='100'><animate attributeName='stroke-dashoffset' values='100;25;100' keyTimes='0;0.5;1' calcMode='spline' keySplines='0.4 0 0.6 1;0.4 0 0.6 1' dur='1.6s' repeatCount='indefinite'/></circle></g></svg>") center / contain no-repeat; }
/* Static brand mark (sign-in page): the same drawing in its full state, without motion. */
.cisoly-mark.subtle { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='16' fill='%237367F0'/><g transform='rotate(90 16 16) translate(32 0) scale(-1 1)'><circle cx='16' cy='16' r='8.857' fill='none' stroke='%23A098F5' stroke-width='5.143'/><circle cx='16' cy='16' r='8.857' fill='none' stroke='%23fff' stroke-width='5.143' pathLength='100' stroke-dasharray='100 100' stroke-dashoffset='25'></circle></g></svg>"); }
/* The steps (Rinat's design of 2026-09-24): a mono number, the step, and on
   the right a violet tick when done or a turning ring while busy; the busy
   row on a violet tint, what is still to come in the lightest text colour.
   Below, a strip with the shield and one sentence true for every client
   (own key or Cisoly-managed). */
.welcome-who { display: flex; flex-direction: column; align-items: center; gap: 2px; text-align: center; margin-top: -10px; }
.welcome-person { font-size: 13px; color: var(--secondary); overflow-wrap: anywhere; }
.welcome-steps { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.welcome-steps li { display: flex; align-items: center; gap: 18px; min-height: 44px; padding: 0 14px;
  border-radius: 4px; font: 400 16px/1.35 var(--font-sans); color: var(--secondary); }
.welcome-steps li.ready { color: var(--body); }
.welcome-steps li.busy { background: var(--violet-tint); color: var(--ink); font-weight: 600; }
.welcome-num { flex: none; width: 20px; font: 600 13px/1 var(--font-mono); color: var(--secondary); }
.welcome-steps li.busy .welcome-num { color: var(--violet-text); }
.welcome-text { flex: 1; min-width: 0; }
.welcome-state { flex: none; width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; }
.welcome-check { display: none; width: 20px; height: 20px; fill: none; stroke: var(--violet); stroke-width: 2.25;
  stroke-linecap: round; stroke-linejoin: round; }
.welcome-steps li.ready .welcome-check { display: block; }
.welcome-spin { display: none; width: 18px; height: 18px; border-radius: 50%;
  border: 2.5px solid color-mix(in srgb, var(--violet) 22%, transparent); border-top-color: var(--violet);
  animation: welcome-run .9s linear infinite; }
.welcome-steps li.busy .welcome-spin { display: block; }
.welcome-noscript { margin: 0; text-align: center; }
.welcome-foot { display: flex; align-items: center; gap: 10px; margin: 0 -32px -30px; padding: 16px 32px;
  background: var(--canvas); border-top: 1px solid var(--hairline); border-radius: 0 0 var(--r-card) var(--r-card);
  font-size: 14px; color: var(--body); }
.welcome-foot svg { flex: none; width: 18px; height: 18px; fill: none; stroke: var(--violet); stroke-width: 1.75;
  stroke-linejoin: round; }
/* The same card over the dashboard right after a sign-in (core/welcome.py):
   the whole screen, above every layer of the shell, while the tiles load
   under it. */
.welcome-over { position: fixed; inset: 0; z-index: 200; overflow-y: auto; }
@keyframes welcome-run { to { transform: rotate(360deg); } }
@keyframes welcome-pols { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
@media (prefers-reduced-motion: reduce) {
  .welcome-spin { animation: none; border-color: var(--violet); }
}
/* On a phone the card keeps 16px from both edges of the screen. */
@media (max-width: 480px) {
  .welcome { padding: 16px; }
  .welcome-card { padding: 28px 20px 24px; }
  .welcome-foot { margin: 0 -20px -24px; padding: 14px 20px; }
  .welcome-steps li { gap: 12px; padding: 0 10px; font-size: 15px; }
}

/* Product overview (console): the status per requirement as a select list,
   coloured to match the state; below it who set it and when. */
.prod-status { white-space: nowrap; }
.prod-status .doc-entry.compact { min-width: 150px; font-weight: 500; }
.prod-status .vst-ok { color: var(--green-text, #1E7A52); }
.prod-status .vst-busy { color: var(--violet-text); }
.prod-status .vst-pending { color: var(--amber-text, #A66808); }
.prod-status .vst-excluded { color: var(--secondary); }
.prod-set { display: block; margin-top: 3px; font-size: 11px; color: var(--secondary); }

/* The review board in Rinat's design (document_reviews.html, FLOWS 7.112),
   measured on his drawing at 1.4 image px per CSS px: three columns 24px
   apart in the card's body; a column heading of 32px -- the name 16px/600,
   its count in a 2px-radius badge, the sub on the right -- over a 2px rule in
   the column's tone (grey, amber, green); 10px down, one bordered card per
   document 8px apart: the mono violet code and the title (600, one line,
   ellipsis) over the mono version and what the column says; the one action
   on the right, 28px. The reviewers as 22px avatars in their tints, +n
   past three. */
.rv-bord { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; align-items: start; }
.rv-column { display: grid; gap: 8px; min-width: 0; align-content: start; }
.rv-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 36px;
  padding: 0 14px; margin-bottom: 2px; background: var(--table-head-bg); border-radius: var(--r-card); }   /* Rinat's column bars, 2026-09-28: the table head's violet */
.rv-heading h3 { display: flex; align-items: center; gap: 10px; margin: 0; font: 600 16px/1.3 var(--font-sans); color: #fff; white-space: nowrap; }
.rv-count { display: inline-block; flex: none; min-width: 26px; height: 22px; padding: 0 7px; border-radius: var(--r-badge);
  background: rgba(255, 255, 255, .22); color: #fff; font: 600 13px/22px var(--font-sans); text-align: center; }
.rv-heading .rv-sub { min-width: 0; overflow: hidden; text-overflow: ellipsis; color: #fff; }
.rv-card { display: flex; align-items: center; gap: 12px; padding: 12px 16px; min-width: 0;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card); }
.rv-text { display: grid; gap: 4px; flex: 1 1 auto; min-width: 0; }
.rv-title { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.rv-code { flex: none; white-space: nowrap; font: 500 14px/20px var(--font-mono); color: var(--violet-text); text-decoration: none; }
.rv-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 600 15px/20px var(--font-sans); color: var(--ink); text-decoration: none; }
.rv-name:hover, .rv-code:hover { text-decoration: underline; text-underline-offset: 2px; }
.rv-meta { display: flex; align-items: center; gap: 8px; min-width: 0; min-height: 22px; font: 400 13px/1.3 var(--font-sans); color: var(--secondary); }
.rv-version { flex: none; font: 400 13px/1 var(--font-mono); color: var(--body); }
.rv-dot, .rv-meta .pill { flex: none; }
.rv-progress, .rv-mine, .rv-changes { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rv-mine { color: var(--violet-text); font-weight: 500; }
.rv-changes { color: var(--red-text); font-weight: 500; }
.rv-avatars { display: inline-flex; gap: 2px; flex: none; }
.rv-avatars .avatar { width: 22px; height: 22px; font: 600 9px/22px var(--font-mono); }
.rv-avatars .avatar.rv-more-people { background: var(--neutral-tint); color: var(--body); }
.rv-actions { display: flex; flex: none; }
.rv-actions form { margin: 0; }
.rv-actions .button { height: 28px; min-height: 28px; padding: 0 12px; font: 600 13px/1 var(--font-sans); white-space: nowrap; text-decoration: none; }
.rv-more { justify-self: start; padding: 2px 0; font: 600 14px/20px var(--font-sans); color: var(--violet-text); text-decoration: none; }
.rv-more:hover { text-decoration: underline; text-underline-offset: 2px; }
@media (max-width: 980px) { .rv-bord { grid-template-columns: 1fr; } }

/* Change history (_history_table.html): the day over the time, the
   initials in a grey circle and the name, field, old -> new; a line
   without a field is its action behind a round dot (histcard 2026-09-26). */
.hist2 td { vertical-align: middle; }
.hist2 .cell-date { font: 400 16px/22px var(--font-sans); }
.hist2 .avatar { width: 32px; height: 32px; font: 600 12px/32px var(--font-sans); background: var(--canvas); color: var(--body); }
.hist2 .cell-level { font: 600 15px/22px var(--font-sans); }
.hist2 .cell-dot { border-radius: 50%; }
.hist2-field { font: 600 15px/22px var(--font-sans); color: var(--ink); margin-right: 6px; }
.hist2-old:not(del) { color: var(--secondary); }
.hist2-arrow { color: var(--secondary); margin: 0 4px; }
.hist2-new { color: var(--ink); }

/* Import and export centre: tabs in the card, intro with an action, a table with a button per row. */
.ie { display: grid; gap: 16px; }
.ie-tabs { margin: 0; }
.ie-intro { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 32px; }
.ie-intro p, .scp-lead { margin: 0; font-size: 14px; color: var(--secondary); }
.ie-intro p { min-width: 0; }
.ie-intro form { margin: 0; flex: none; }
.ie-table th:first-child, .ie-table td:first-child { width: 56%; }
.ie-table td { vertical-align: middle; }
.ie-code { color: var(--violet-text); margin-right: 8px; }
.ie-action { text-align: right; white-space: nowrap; }
.ie-action .button.small { height: 28px; padding: 0 12px; font-size: 13px; line-height: 26px; }

/* TPRM: supplier footprint across IT and OT (templates/_tprm.html). */
.tprm-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px 24px; align-items: start; }
.tprm-block { display: grid; gap: 8px; min-width: 0; }
.tprm-block .chip-row { gap: 6px; }
.tprm-reasons { margin: -4px 0 10px; }
.tprm-table td.chip-row { display: flex; flex-wrap: wrap; gap: 6px; }
.tprm-let { color: var(--red-text); font-weight: 600; }
.tprm-obligations { display: grid; gap: 8px; margin-top: 14px; }
.data-table.questionnaire tr.questions-heading td { background: var(--canvas); padding-top: 12px; }
@media (max-width: 900px) { .tprm-grid { grid-template-columns: 1fr; } }

.tprm-items { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; font-size: 14px; }
.tprm-items li.ok { color: var(--secondary); }
.tprm-tick { display: inline-block; width: 18px; color: var(--green); font-weight: 600; }
.tprm-items li.open .tprm-tick { color: var(--amber); }
.tprm-stats { margin-bottom: 14px; }

/* ---- roadmap (templates/approach.html and its parts _approach_phases/_next/_phase.html; Rinat's design, 2026-09-26):
   the phases in a sticky 360px card on the left, 36px apart from the next step and the chosen phase's steps on the
   right. The page opens with the phases by name and a loading card per part (templates/_dashboard_deferred.html). */
.rdmp-grid { display: grid; grid-template-columns: 360px minmax(0, 1fr); gap: 36px; align-items: start; }
.rdmp-main { display: grid; gap: 16px; min-width: 0; align-items: start; }
.card.rdmp-phases { position: sticky; top: 64px; padding: 8px 0; display: block; }
.rdmp-phase-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
.rdmp-phase-row { display: flex; gap: 12px; align-items: center; padding: 10px 16px; text-decoration: none; color: var(--ink); }
.rdmp-phase-row:hover { background: var(--canvas); }
.rdmp-phase-row.selected { background: var(--violet-tint); }
.rdmp-num { flex: none; width: 32px; height: 32px; border-radius: 50%; border: 1px solid var(--hairline); background: var(--card);
  display: inline-flex; align-items: center; justify-content: center; font: 600 13px/1 var(--font-mono); color: var(--secondary); }
.rdmp-phase-text { display: grid; gap: 6px; min-width: 0; flex: 1 1 auto; }
.rdmp-phase-line { display: flex; align-items: center; gap: 8px; min-width: 0; }
.rdmp-phase-name { min-width: 0; font: 600 16px/22px var(--font-sans); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rdmp-phase-row.selected .rdmp-phase-name { color: var(--violet-text); }
.rdmp-now { flex: none; white-space: nowrap; padding: 2px 6px; border-radius: 2px; background: var(--violet-tint); color: var(--violet-text);
  font: 600 12px/16px var(--font-sans); }
.rdmp-phase-row.selected .rdmp-now { background: var(--card); }
.rdmp-bar-line { display: flex; align-items: center; gap: 10px; min-width: 0; }
.rdmp-bar-line .ap-gauge, .rdmp-all .ap-gauge { flex: 1 1 auto; }
.rdmp-count, .soly-msg-time { line-height: 16px; }
.rdmp-count, .hist-time, .soly-msg-time { white-space: nowrap; }
.hist-time { line-height: 1.4; }
.ap-gauge.rdmp-bar-loading { background-image: linear-gradient(90deg, var(--hairline) 0%, var(--canvas) 50%, var(--hairline) 100%);
  background-size: 200% 100%; animation: dash-deferred-sheen 1.6s infinite linear; }
.rdmp-all { display: grid; gap: 8px; margin-top: 8px; padding: 12px 16px 6px; border-top: 1px solid var(--hairline); }
.rdmp-all .rdmp-phase-line { justify-content: space-between; }
.rdmp-all .rdmp-phase-name { font-size: 14px; }
.rdmp-phases.failed .rdmp-all-loading { color: var(--red-text); }
/* The next step. */
.card.rdmp-next { display: grid; gap: 10px; padding: 16px 24px; }
.rdmp-next-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.rdmp-eyebrow { min-width: 0; font: 500 12px/1.4 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; color: var(--violet-text); }
.rdmp-next-head .pill, .rdmp-status-line .pill { white-space: nowrap; flex: none; }
.rdmp-lead, .rdmp-col p { margin: 0; font: 400 16px/1.55 var(--font-sans); }
.rdmp-lead { color: var(--body); }
.rdmp-two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: 6px; padding: 14px 0; border-top: 1px solid var(--hairline);
  border-bottom: 1px solid var(--hairline); }
.rdmp-two > .rdmp-col + .rdmp-col { border-left: 1px solid var(--hairline); padding-left: 24px; }
.rdmp-two > .rdmp-col:first-child { padding-right: 24px; }
.rdmp-col { display: grid; gap: 6px; align-content: start; min-width: 0; }
/* The roadmap's titles above each part (What to do, Why it matters, Done when, Where in Cisoly, ...): black and bold (Rinat, 2026-09-28). */
.rdmp-col p { color: var(--ink); }
.rdmp-evidence { display: block; margin: 4px 0 0; font: 400 12px/18px var(--font-mono); color: var(--secondary); }
.rdmp-foot { margin-top: 4px; justify-content: space-between; flex-wrap: wrap; }
.rdmp-where a { color: var(--violet-text); font-weight: 600; text-decoration: none; white-space: nowrap; }
.rdmp-where a:hover { text-decoration: underline; text-underline-offset: 2px; }
.rdmp-where a + a::before { content: "\00b7"; display: inline-block; margin: 0 6px; color: var(--secondary); font-weight: 400; }
/* The chosen phase: the card's list head (the name at 22px, the count as its
   eyebrow, the state pill on the right, a 15px line under it), the steps as
   a table edge to edge. */
.list-head.rdmp-phase-head { row-gap: 6px; padding: 16px 24px 14px; }
.rdmp-phase-head .list-head-title { align-items: center; }
.rdmp-phase-head .list-head-title h2 { font-size: 22px; }
.rdmp-phase-head .list-head-title .eyebrow { flex: none; white-space: nowrap; }
.rdmp-phase-head .rdmp-phase-sub { flex-basis: 100%; margin: 0; font-size: 15px; line-height: 1.5; }
.data-table.rdmp-steps { table-layout: auto; }
/* The step table (Rinat's design, 2026-09-28): a row per step, striped per step, its fold below it in the same stripe. */
.rdmp-steps .rdmp-c-icon { width: 48px; }
.rdmp-steps .rdmp-c-id { width: 56px; }
.rdmp-steps .rdmp-c-status { width: 176px; }
.rdmp-steps .rdmp-c-where { width: 220px; }
.rdmp-steps > tbody > tr.rdmp-step > td { vertical-align: middle; }
.rdmp-steps > tbody.even > tr > td { background: var(--canvas); }
.rdmp-steps > tbody > tr.rdmp-detail:hover > td { background: var(--card); }
.rdmp-steps > tbody.even > tr.rdmp-detail:hover > td { background: var(--canvas); }
.rdmp-steps > tbody.open > tr.rdmp-step > td { border-bottom: 0; }
.rdmp-steps > tbody > tr.rdmp-detail > td { padding-top: 0; padding-bottom: 20px; }
.rdmp-state { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%;
  border: 2px solid var(--violet); background: var(--card); }
.rdmp-state.done .icon { width: 14px; height: 14px; stroke-width: 2.25; }
.rdmp-state.busy::after { content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--violet); }
.rdmp-state.na { border: 1.5px dashed var(--secondary); background: none; }
.rdmp-state.na::before { content: ""; width: 8px; height: 1.5px; background: var(--secondary); }
.rdmp-toggle { display: inline-flex; align-items: center; gap: 8px; max-width: 100%; padding: 0; border: 0; border-radius: 2px; background: none;
  color: inherit; font: inherit; text-align: left; cursor: pointer; }
.rdmp-toggle .rdmp-step-title { min-width: 0; font-weight: 500; font-size: 15px; }
.rdmp-toggle .icon { transition: transform var(--t-fast) var(--ease); }
.rdmp-toggle[aria-expanded="true"] .icon { transform: rotate(180deg); }
.rdmp-step-title, .fwl-name-text { display: block; font: 600 16px/22px var(--font-sans); color: var(--ink); }
.rdmp-step.busy .rdmp-step-title { color: var(--violet-text); }
.rdmp-step.na .rdmp-step-title { color: var(--secondary); }
.rdmp-c-status .pill { white-space: nowrap; flex: none; }
.rdmp-when { display: block; margin-top: 6px; font: 400 13px/18px var(--font-sans); color: var(--secondary); white-space: nowrap; }
.rdmp-c-where a { display: inline-flex; align-items: center; gap: 6px; }
.rdmp-c-where a .icon, .rdmp-links a .icon { transform: rotate(-90deg); }
.rdmp-c-where a .icon { flex: none; width: 14px; height: 14px; }
.rdmp-off-hint { display: block; font-size: 13px; color: var(--secondary); }
/* The fold: the text on the left, a grey side with where in Cisoly and the guidelines. */
.rdmp-panel { display: grid; grid-template-columns: minmax(0, 1fr) minmax(240px, 390px); border: 1px solid var(--hairline); border-radius: 4px;
  background: var(--card); overflow: hidden; }
.rdmp-panel-main { display: grid; gap: 18px; align-content: start; min-width: 0; padding: 22px 24px; }
.rdmp-panel-side { display: grid; gap: 18px; align-content: start; min-width: 0; padding: 22px 24px; background: var(--canvas);
  border-left: 1px solid var(--hairline); }
.rdmp-pair { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
.rdmp-panel .rdmp-col p, .rdmp-lines { font-size: 14px; }
.rdmp-links { background: var(--card); }
.rdmp-links li + li { border-top: 1px solid var(--hairline); }
.rdmp-links a, .rdmp-link-off { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 38px; padding: 0 14px;
  font: 500 14px/20px var(--font-sans); color: var(--ink); text-decoration: none; }
.rdmp-links a:hover { background: var(--violet-tint); }
.rdmp-link-off { color: var(--secondary); }
.rdmp-off-word { font-size: 12px; }
.rdmp-lines { list-style: none; margin: 0; padding: 0; line-height: 1.5; display: grid; gap: 8px; color: var(--ink); }
.rdmp-lines li { display: flex; gap: 10px; align-items: flex-start; }
.rdmp-lines .icon { margin-top: 2px; }
.rdmp-panel .rdmp-na { padding-top: 14px; border-top: 1px solid var(--hairline); }
.rdmp-na-form { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0; }
.rdmp-na-form input.doc-entry { flex: 1 1 240px; min-width: 0; height: 32px; min-height: 32px; }
.rdmp-na-note { font-size: 12px !important; color: var(--secondary) !important; }
/* Shared with the dashboard tile (the gauge) and the control's state (the caret). */
.ap-gauge { display: block; }
.ap-gauge i, .ro-bar i, .infra-bar > span, .sot-bar-fill, .progress-bar i { display: block; height: 100%; background: var(--violet); border-radius: 2px; }
.progress-bar i { transition: width var(--t-slow) var(--ease); }
.ap-caret { color: var(--secondary); font-size: 11px; transition: transform .15s; flex: none; }
details[open] > summary .ap-caret { transform: rotate(90deg); }
@media (max-width: 1100px) {
  .rdmp-grid { grid-template-columns: minmax(0, 1fr); gap: 16px; }
  .card.rdmp-phases { position: static; }
}
@media (max-width: 720px) {
  .rdmp-two { grid-template-columns: minmax(0, 1fr); }
  .rdmp-two > .rdmp-col + .rdmp-col { border-left: 0; padding-left: 0; padding-top: 14px; }
  .rdmp-two > .rdmp-col:first-child { padding-right: 0; }
  .card.rdmp-next, section.list-card > .rdmp-phase-head { padding-left: 16px; padding-right: 16px; }
  .rdmp-steps .rdmp-c-icon, .rdmp-steps .rdmp-c-id { width: auto; }
  .rdmp-steps .rdmp-c-status, .rdmp-steps .rdmp-c-where { width: auto; }
  .rdmp-panel, .rdmp-pair { grid-template-columns: minmax(0, 1fr); }
  .rdmp-panel-side { border-left: 0; border-top: 1px solid var(--hairline); }
}
@media (prefers-reduced-motion: reduce) {
  .ap-gauge.rdmp-bar-loading { animation: none; }
}
/* Decision by the owner on the treatment of a risk (templates/_treatment_decision.html). */
.mgmt-rule { margin: 0; font-size: 14px; }
.mgmt-form { display: grid; gap: 10px; padding-top: 10px; border-top: 1px solid var(--hairline); }
/* riskaccept (docs/FLOWS.md 7.265): the treatment as it will be or was accepted,
   label and value per row (_treatment_facts.html), the decided ones in a fold
   (_treatment_record_fold.html); the client's words wrap, a code never does. */
.racc { display: flex; flex-direction: column; gap: 10px; min-width: 0; padding-bottom: 10px; }
.racc-block { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.racc-block > h3 { margin: 0; }
.racc-facts { margin: 0; display: flex; flex-direction: column; gap: 8px; }
.racc-fact { display: grid; grid-template-columns: minmax(120px, 200px) minmax(0, 1fr); gap: 12px; align-items: baseline;
  font-size: 13px; line-height: 1.5; }
.racc-fact > dt { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; color: var(--secondary); }
.racc-fact > dd { margin: 0; min-width: 0; color: var(--ink); white-space: pre-line; overflow-wrap: anywhere; }
.racc-fold { margin-top: 0; }
.racc-fold > .racc { padding-bottom: 12px; }
@media (max-width: 480px) { .racc-fact { grid-template-columns: minmax(0, 1fr); gap: 2px; } }

/* ---- Notifications (core/notifications.py) ---- */
.top-bell { position: relative; text-decoration: none; }
.top-bell-count { position: absolute; top: 2px; right: 2px; min-width: 16px; height: 16px; padding: 0 4px;
  border-radius: var(--r-full); background: var(--violet); color: #fff; font: 600 10px/16px var(--font-mono);
  text-align: center; }
.ntf-table tr.unread td { font-weight: 600; }
.ntf-table tr.unread .card-sub { font-weight: 400; }
.ntf-what { display: flex; align-items: center; gap: 8px; min-width: 0; }
.ntf-what > :last-child { min-width: 0; }
.dot.sev-info { background: var(--hairline); }
.dot.sev-notice { background: var(--violet); }
.dot.sev-warning { background: var(--amber); }
.dot.sev-critical { background: var(--red-text); }
.ntf-inline { display: flex; gap: 6px; margin: 0; }
.ntf-error { color: var(--red-text); }
.ntf-add { display: flex; flex-direction: column; gap: 10px; margin-top: 14px; }
.ntf-groups { display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: center; }
.ntf-check { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; white-space: nowrap; }
.link-state { display: flex; flex-direction: column; gap: 8px; }
.link-state .ntf-inline { margin: 0; }
/* The text-mode choice stacks: label above, the select as wide as the card. */
.link-text-mode { display: flex; flex-direction: column; align-items: stretch; gap: 4px; width: 100%; }
.link-text-mode select { width: 100%; }
.ntf-address { display: flex; flex-direction: column; gap: 6px; margin-top: 12px; max-width: 420px; font-size: 13px; font-weight: 600; }
.ntf-address .card-sub { font-weight: 400; }
.ntf-older > summary { list-style: none; cursor: pointer; }
.ntf-older > summary::-webkit-details-marker { display: none; }
.ntf-older > summary h2::before { content: "▸ "; color: var(--secondary); }
.ntf-older[open] > summary h2::before { content: "▾ "; }
.ntf-older .table-wrap { margin-top: 10px; }

/* Pull connectors (templates/connector_mapping.html): the cards stack with
   the form gap and never stretch; the settings row sits 10px under the
   mapping table; the mapping selects size to their content, like the
   notification preferences. Layout only, so the dark theme needs nothing. */
.conn-stack { display: grid; gap: var(--s-4); align-items: start; }
/* A connector's page (connconf, Rinat's design of 2026-09-29, docs/FLOWS.md 7.177). Settings: the
   connection's required card with its amber note, the field mapping (Mapped / Not mapped / All, a row's
   rules below it, the unmapped fields as dashed chips), the Sync card; one form, one Save. */
.conn-form { margin: 0; }
.conn-req-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(220px, 320px); gap: 16px; align-items: start; }
.conn-req-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; align-items: start; }
.conn-req-mark { color: var(--red-text); }
.conn-req .doc-entry.is-missing { background: var(--amber-tint); }
.report.conn-req-note { display: flex; align-items: flex-start; gap: 8px; margin: 0; border-radius: var(--r-control); font-size: 13px; }
.conn-req-note .icon, .conn-from .icon, .form-banner .icon { flex: none; width: 18px; height: 18px; }
.conn-seg { margin-left: auto; flex: none; }
.conn-seg .segment-button { display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; font: 600 13px/1 var(--font-sans); white-space: nowrap; cursor: pointer; }
.conn-map .conn-map-arrow { width: 32px; text-align: center; color: var(--secondary); }
.conn-map select.doc-entry { width: auto; max-width: 260px; }
.conn-rule-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.conn-map-edit { text-align: right; }
.conn-map-panel > td { background: var(--canvas); }
.conn-map-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; align-items: start; padding: 4px 0; }
.conn-soft { font-weight: 400; color: var(--secondary); }
.conn-choice-rows, .conn-map-ticks { display: flex; flex-direction: column; gap: 8px; }
.conn-choice-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
.conn-choice-row .doc-entry { min-width: 0; flex: 1 1 0; }
.conn-choice-add { align-self: flex-start; }
.conn-details-toggle, .infra-copy { flex: none; }
.conn-unmapped { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px 12px; align-items: center; margin-top: 14px; }
.conn-unmapped[hidden] { display: none; }
.conn-problem-line, .conn-unmapped-text { min-width: 0; margin: 0; font: 400 13px/1.4 var(--font-sans); color: var(--body); }
.conn-unmapped .conn-chips { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 8px; }
.conn-chip { flex: none; white-space: nowrap; padding: 4px 10px; border: 1px dashed var(--field-rule); border-radius: var(--r-badge);
  background: var(--card); color: var(--ink); font: 500 13px/1.4 var(--font-sans); cursor: pointer; }
.conn-chip:hover { border-color: var(--violet); color: var(--violet-text); }
.conn-chip:focus-visible, .conn-more-item:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.conn-sync-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px; align-items: start; }
.conn-titles { display: flex; flex-direction: column; gap: 6px; margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--hairline); }
.card-actions .conn-keys { margin-right: auto; }
/* Matches: the bulk actions in the filter row, the bulk bar, a row's problem with its Details, the ••• menu and the item picker. */
.conn-bulk-all { display: flex; flex-wrap: wrap; gap: 8px; margin-left: auto; }
.conn-bulkbar { display: flex; align-items: center; gap: 10px; padding: 8px 24px; background: var(--violet-tint); }
.conn-bulkbar[hidden] { display: none; }
.conn-bulk-count { font-size: 13px; color: var(--ink); white-space: nowrap; }
.conn-bulkbar .conn-bulk-clear { margin-left: auto; }
.conn-matches .conn-tick { width: 44px; }
.conn-rec { display: flex; align-items: center; gap: 8px; min-width: 0; }
.conn-rec .pill { flex: none; }
.conn-problem { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; min-width: 0; }
.conn-problem .pill { flex: none; }
.conn-detail { display: flex; flex-direction: column; gap: 10px; margin-top: 8px; padding: 10px 12px;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.conn-detail[hidden] { display: none; }
.conn-detail-list { margin: 0; padding-left: 18px; font-size: 13px; }
.conn-detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; align-items: start; }
.conn-detail-block { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.conn-detail-head { font: 500 12px/1.3 var(--font-mono); text-transform: uppercase; letter-spacing: .04em; color: var(--secondary); }
.conn-pairs { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 4px 12px; margin: 0; font-size: 13px; }
.conn-pairs dt { color: var(--secondary); }
.conn-pairs dd { margin: 0; overflow-wrap: anywhere; color: var(--ink); }
.conn-actions { display: flex; align-items: center; justify-content: flex-end; gap: 6px; margin: 0; }
.conn-actions .button { flex: none; white-space: nowrap; }
.conn-more > summary { list-style: none; cursor: pointer; }
.conn-more > summary::-webkit-details-marker { display: none; }
.conn-more-menu { position: fixed; z-index: 40; display: flex; flex-direction: column; min-width: 200px; padding: 4px;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-control); box-shadow: 0 8px 24px rgba(20, 22, 40, .12); }
.conn-more-item { display: block; width: 100%; padding: 8px 12px; border: 0; border-radius: var(--r-control); background: none;
  text-align: left; text-decoration: none; white-space: nowrap; color: var(--ink); font: 500 14px/1.4 var(--font-sans); cursor: pointer; }
.conn-more-item:hover { background: var(--violet-tint); }
.flow-picker.conn-pick { position: fixed; top: 0; left: 0; }
@media (max-width: 760px) { .conn-req-body { grid-template-columns: minmax(0, 1fr); } .conn-bulkbar { padding: 8px 16px; flex-wrap: wrap; } }

/* ---- Risk trend (dashboard tile risk_trend) ---- */
.risk-trend { margin: 0; }
.trend-legend { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; }
.trend-legend .legend-level { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--body); text-decoration: none; white-space: nowrap; }
.swatch.trend-it, .trend-point.trend-it, .trend-stop.trend-it { background: var(--violet); fill: var(--violet); stop-color: var(--violet); }
.swatch.trend-ot, .trend-point.trend-ot, .trend-stop.trend-ot { background: var(--blue); fill: var(--blue); stop-color: var(--blue); }
.trend-line { fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.trend-line.trend-it { stroke: var(--violet); }
.trend-line.trend-ot { stroke: var(--blue); }
.trend-point { stroke: var(--card); stroke-width: 1; }
.trend-point:hover { r: 4; }
.trend-sub { display: block; margin-top: 4px; }
.trend-wrap { margin-top: 10px; overflow: hidden; }
.trend-wrap .trend { display: block; width: 100%; height: auto; }
.trend-grid { stroke: var(--hairline); stroke-width: 1; }
.trend-axis { font: 400 9px var(--font-mono); fill: var(--secondary); }
.trend-wrap.months, .trend-sub.months { display: none; }
@media (max-width: 640px) {
  .trend-wrap.weeks, .trend-sub.weeks { display: none; }
  .trend-wrap.months, .trend-sub.months { display: block; }
  /* On a phone the legend goes under the title, full width, one row. */
  .risk-trend .card-heading { flex-wrap: wrap; row-gap: 6px; }
  .risk-trend .card-heading-links { flex: 1 1 100%; min-width: 0; }
  .risk-trend .trend-legend { flex: 1 1 100%; gap: 12px; }
  .trend-wrap.months .trend { height: 140px; }
}

/* ---- Resources and roles (templates/iso_k_assets.html) ---- */
.isok-gone { margin-top: 12px; }

/* ---- Leadership cards: a label/value list under the heading ---- */
.isok-kv { display: grid; grid-template-columns: auto 1fr; gap: 10px 16px; margin: 4px 0 0; flex: 1; align-content: start; }
.fstep-nav-dir, .isok-kv dt, .acct-meta-label { white-space: nowrap; }
.isok-kv dt { align-self: baseline; }
.isok-kv dd { margin: 0; text-align: right; font-weight: 600; color: var(--ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.isok-kv dd .mono { font-weight: 600; }
.isok-lead-block { display: flex; flex-direction: column; }

/* Workflows: the strip on a subject's page (templates/_workflow_strip.html) */
.wf-strip .wf-start { margin-top: 10px; }
.wf-strip .table-wrap + .wf-start { margin-top: 8px; }
/* A card heading's right side with meta and one small action (templates/register_detail.html) */
.card-heading-meta { display: flex; gap: 10px; align-items: center; flex: none; }
.card-heading-meta .rule-form { margin: 0; }

/* Groups: the explainer, the search line and the cards (templates/groups.html) */
.grp-explainer { margin-bottom: 14px; }
.grp-explainer > .grp-uses:last-child { padding-bottom: 0; }
.grp-kinds-row { display: grid; grid-template-columns: 1fr 1fr; }
.grp-kinds-row > article { padding: 16px 20px 16px 0; display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.grp-kinds-row > article + article { border-left: 1px solid var(--hairline); padding-left: 20px; padding-right: 0; }
.grp-kinds-row p, .grp-uses-row p { margin: 0; color: var(--ink); line-height: 1.5; }
.grp-kinds-row .eyebrow { margin-top: 6px; }
.grp-uses { border-top: 1px solid var(--hairline); padding: 14px 0 16px; }
.grp-uses > .eyebrow { display: block; margin-bottom: 10px; }
.grp-uses-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; }
.grp-uses-row article { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
/* The groups list (templates/groups.html): a count of nothing stays grey, a count of something in the ink. */
.grp-list .data-table > tbody > tr > td.is-zero { color: var(--secondary); }
@media (max-width: 720px) { .grp-kinds-row { grid-template-columns: 1fr; } .grp-kinds-row > article + article { border-left: none; border-top: 1px solid var(--hairline); padding: 16px 0 0; } }

/* Trust centre: the public page (templates/trust_public.html, trust_access.html) and the portal page */
.trust-body, .xf-body { margin: 0; background: var(--canvas); color: var(--ink); font-family: var(--font-sans); }
.trust-top { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 20px; background: #fff; border-bottom: 1px solid var(--hairline); flex-wrap: wrap; }
.trust-brand { display: flex; align-items: center; gap: 10px; min-width: 0; }
.trust-logo { height: 28px; width: auto; max-width: 140px; }
.trust-name { font: 600 16px/1.2 var(--font-sans); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.trust-nav { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; }
.trust-nav a { color: var(--secondary); text-decoration: none; font-size: 13px; font-weight: 500; }
.trust-nav a:hover { color: var(--violet-text); }
.trust-nav .trust-lang { font-family: var(--font-mono); font-size: 12px; letter-spacing: .06em; border: 1px solid var(--hairline); border-radius: 4px; padding: 2px 8px; }
.trust-main { max-width: 960px; margin: 0 auto; padding: 20px; display: flex; flex-direction: column; gap: 14px; }
.trust-main .card { margin: 0; }
.trust-intro { margin: 10px 0 0; line-height: 1.55; color: var(--ink); max-width: 72ch; }
.trust-intro.mono a { font-size: 13px; word-break: break-all; }
.trust-list { margin: 8px 0 0 20px; padding: 0; line-height: 1.55; color: var(--ink); max-width: 72ch; }
.trust-list li { margin: 2px 0; }
.trust-flash { padding: 10px 14px; }
.trust-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 14px; align-items: start; }
.trust-tile-name { font-weight: 600; }
.trust-meter, .ro-bar, .xf-bar { display: block; height: 6px; border-radius: 2px; overflow: hidden; }
.trust-meter { background: var(--violet-tint); }
.trust-faq { display: flex; flex-direction: column; gap: 6px; }
.trust-q { border: 1px solid var(--hairline); border-radius: 4px; padding: 8px 12px; }
.trust-q > summary { cursor: pointer; font-weight: 600; list-style: none; display: flex; gap: 8px; align-items: center; }
.trust-q > summary::-webkit-details-marker { display: none; }
.trust-q p { margin: 8px 0 0; line-height: 1.55; color: var(--ink); }
.trust-checks { display: flex; flex-direction: column; gap: 6px; }
.trust-checks label, .trust-accept { display: flex; gap: 8px; align-items: flex-start; font-size: 13px; }
.trust-hp { position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0; }
.trust-nda { border: 1px solid var(--hairline); border-radius: 4px; padding: 8px 12px; margin-bottom: 8px; }
.trust-nda > summary { cursor: pointer; font-weight: 600; }
.trust-nda p { margin: 8px 0 0; white-space: pre-wrap; line-height: 1.5; }
.trust-footer { text-align: center; padding: 20px; color: var(--secondary); font-size: 12px; }
.trust-kv { margin-top: 10px; }
.trust-kv dd { white-space: normal; text-align: right; }

/* The shareable report link (templates/_report_share_link.html, _report_sharing.html, report_public.html) */
.rep-share-row { display: flex; gap: 8px; align-items: center; min-width: 0; }
.rep-share-row .doc-entry { flex: 1 1 auto; min-width: 0; text-overflow: ellipsis; }
.rep-share-row .button { flex: none; white-space: nowrap; }
.rep-share-row .button .icon { width: 16px; height: 16px; vertical-align: -3px; }
.rep-key-value { font-size: 16px; letter-spacing: .12em; }
/* The card on the setup page (templates/_report_sharing.html): the link with its two ticks, the two texts, the key, one under the other */
.rep-share-actions { margin-top: 10px; align-items: center; }
.rep-share-actions .icon { width: 16px; height: 16px; vertical-align: -3px; }
.rep-share-actions .card-link { margin-left: auto; font-size: 13px; white-space: nowrap; }
.rep-share-ticks { display: flex; flex-wrap: wrap; gap: 8px 20px; margin-top: 8px; }
.rep-setup { display: flex; flex-direction: column; gap: 16px; }
.rep-setup-block { border-top: 1px solid var(--hairline); padding-top: 14px; }
.rep-setup-block .card-heading { margin-bottom: 8px; }
.rep-setup-block .card-heading .eyebrow { margin-left: 4px; }
.rep-setup-block .form-field { margin-top: 10px; }
.rep-texts { display: flex; flex-direction: column; gap: 12px; margin-top: 10px; }
.rep-text-head { display: flex; align-items: center; gap: 8px; min-width: 0; margin-bottom: 4px; }
.rep-text-head .form-label { flex: none; white-space: nowrap; margin: 0; }
.rep-text-head .eyebrow { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rep-share-text { width: 100%; box-sizing: border-box; resize: vertical; line-height: 1.5; }
.rep-public-main { max-width: 760px; }
.rep-public-main .card-heading > .button { white-space: nowrap; flex: none; }

/* Own frameworks: the two ways in, side by side (templates/frameworks.html,
   Rinat's design of 2026-09-27): two form cards in equal columns, 32px
   apart; in the upload card the columns the importer reads as chips and
   the drop row for the file. */
.fw-own-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px; align-items: start; }
.fwown-body { display: flex; flex-direction: column; gap: 20px; }
.fwown-columns { display: flex; flex-direction: column; gap: 10px; }
.soly-plan-who, .soly-plan-tokens, .cpsc-date, .rset-check .rset-met, .sot-count, .pp-meta, .dctl-count, .file-drop-or, .fleet-strip-state { flex: none; font-size: 13px; color: var(--secondary); }
.cpsc-date { margin-left: auto; }
@media (max-width: 1100px) { .fw-own-grid { grid-template-columns: minmax(0, 1fr); gap: 16px; } }
.prod-ai { min-width: 220px; }
.prod-ai .card-sub { display: block; max-width: 420px; }

/* ---- Document page (Rinat's design of 2026-09-27, second round; docs/FLOWS.md 7.102): the page
   heading "Documents" with the guide's ?, outside the cards; on the left the heading card and the
   editor card; on the right a narrow column of 300px with a card per concern (Approval first), its
   title 18px/600 over a hairline. Both columns start at the same line; each card as tall as its
   content. The version page shares the heading card. ---- */
.doc-view { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 16px; align-items: start; }
/* .doc-main is the heading strip of the older workspace (above); the page's two columns carry their own names. */
.doc-view-main, .doc-side { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
/* The heading card (templates/_doc_head.html): the type in violet; the title 20px/600 with the chip
   "Version | 1.0" (a grey label segment and a mono value segment in one hairline box) and the status
   pill; the meta row of 13px items (a 16px glyph and its words, "Based on published v0.9" with the
   version as a violet link); on the right Version history (its count in a grey badge) and Reading
   view, 40px hairline; the grey strip over a hairline: the steps and, at the right, the next step. */
.card.doc-lead { padding: 0; overflow: hidden; border-color: var(--hairline); border-radius: var(--r-card); box-shadow: none; }
.doc-head-main { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 20px 24px 16px; }
.doc-head-text { display: flex; flex-direction: column; gap: 6px; flex: 1 1 auto; min-width: 0; }
.doc-crumb { margin: 0; font-size: 13px; line-height: 20px; }
.doc-crumb a { color: var(--violet-text); font-weight: 600; text-decoration: none; }
.doc-crumb a:hover { text-decoration: underline; }
.doc-head-title { display: flex; align-items: center; gap: 6px 12px; min-width: 0; flex-wrap: wrap; }
.doc-head-title .doc-head-name { margin: 0; min-width: 0; font: 600 20px/1.3 var(--font-sans); letter-spacing: -.01em; color: var(--ink); overflow-wrap: anywhere; }
.doc-ver-chip { display: inline-flex; align-items: stretch; height: 26px; flex: none; box-sizing: border-box; overflow: hidden;
  border: 1px solid var(--hairline); border-radius: var(--r-control); font-size: 13px; line-height: 24px; white-space: nowrap; }
.doc-ver-key { padding: 0 8px; background: var(--neutral-tint); color: var(--body); border-right: 1px solid var(--hairline); }
.doc-ver-value { padding: 0 8px; background: var(--card); color: var(--ink); font-weight: 500; }
.doc-head-actions { display: flex; align-items: center; gap: 8px; flex: none; }
.doc-head-button { gap: 8px; height: 40px; font-size: 14px; white-space: nowrap; flex: none; text-decoration: none; }
.doc-head-button .icon, .doc-head-meta .icon { width: 16px; height: 16px; flex: none; }
.doc-head-count { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 5px;
  box-sizing: border-box; border-radius: var(--r-badge); background: var(--neutral-tint); color: var(--body); font-size: 12px; font-weight: 500; }
.doc-head-meta { display: flex; flex-wrap: wrap; gap: 6px 16px; margin: 2px 0 0; padding: 0; list-style: none; font-size: 13px; line-height: 20px; color: var(--secondary); }
.doc-head-meta li { display: inline-flex; align-items: center; gap: 6px; min-width: 0; white-space: nowrap; }
.doc-head-meta .doc-based { color: var(--violet-text); font-weight: 600; text-decoration: none; }
.doc-head-meta a.doc-based:hover { text-decoration: underline; }
.doc-head-strip { display: flex; align-items: center; justify-content: space-between; gap: 8px 16px; flex-wrap: wrap;
  padding: 12px 24px; border-top: 1px solid var(--hairline); background: var(--canvas); }
.doc-steps { display: flex; align-items: center; gap: 8px; margin: 0; padding: 0; list-style: none; flex-wrap: wrap; }
.doc-step { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; line-height: 20px; color: var(--secondary); white-space: nowrap; }
.doc-step + .doc-step::before { content: ""; width: 24px; height: 1px; margin-right: 2px; background: var(--rule); }
.doc-step-dot { display: inline-flex; align-items: center; justify-content: center; width: 12px; height: 12px; flex: none; box-sizing: border-box;
  border: 1.5px solid var(--rule); border-radius: 50%; background: var(--card); }
.doc-step-dot svg { width: 8px; height: 8px; fill: none; stroke: #fff; stroke-width: 3.5; stroke-linecap: round; stroke-linejoin: round; }
.doc-step-sub { font-weight: 400; color: var(--body); }
.doc-step.done { color: var(--body); }
.doc-step.done .doc-step-dot { border-color: var(--violet); background: var(--violet); }
.doc-step.current { color: var(--ink); font-weight: 600; }
.doc-step.current .doc-step-dot { border-color: var(--violet); box-shadow: 0 0 0 3px var(--violet-tint); }
/* A step with an outcome (the release flow, docs/FLOWS.md 7.331): done green with a check,
   failed red with a cross, running a violet ring, unknown a dashed ring; the word beside it
   says the same, so the colour is never the only sign. */
.doc-steps.outcomes .doc-step.done .doc-step-dot { border-color: var(--green-deep); background: var(--green-deep); }
.doc-step.failed { color: var(--red-text); font-weight: 600; }
.doc-step.failed .doc-step-dot { border-color: var(--red-deep); background: var(--red-deep); }
.doc-step.running { color: var(--ink); font-weight: 600; }
.doc-step.running .doc-step-dot { border-color: var(--violet); box-shadow: 0 0 0 3px var(--violet-tint); }
.doc-step.unknown .doc-step-dot { border-style: dashed; }
/* The step path (shared; first on the release pipeline, docs/FLOWS.md 7.339, 7.352, Rinat's
   design "Pipeline Details v2"): a series of steps as tiles left to right, a hairline arrow
   between them. A tile is a link (a tab once the page's script makes the path a tablist):
   its eyebrow line with the step's number on the left and its time or state on the right,
   the shared dot-step with its name, one summary line. The chosen tile is tinted violet with
   a violet border. Any series of steps that opens a detail per step uses it: ol.step-path
   (with .doc-steps.outcomes for the dots) > li > a.step-tile (.step-tile-top.eyebrow,
   .doc-step, .step-tile-sum) + .step-path-arrow on every step but the last. */
.step-path { align-items: stretch; gap: 12px 0; }
.step-path > li { display: flex; align-items: stretch; }
.step-path-arrow { position: relative; align-self: center; width: 19px; height: 1px; margin-right: 5px; flex: none; background: var(--rule); }
.step-path-arrow::after { content: ""; position: absolute; right: -5px; top: -4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 5px solid var(--rule); }
.step-tile { display: flex; flex-direction: column; gap: 6px; min-width: 150px; box-sizing: border-box; padding: 16px;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); color: var(--ink); text-decoration: none;
  transition: background var(--t-fast) var(--ease); }
.step-tile:hover { background: var(--canvas); }
.step-tile[aria-current="true"], .step-tile[aria-selected="true"] { background: var(--violet-tint); border-color: var(--violet); }
.step-tile-top { display: flex; justify-content: space-between; gap: 12px; white-space: nowrap; }
.step-tile .doc-step { font-size: 15px; font-weight: 600; }
.step-tile .doc-step:not(.failed) { color: var(--ink); }
.step-tile-sum { font-size: 13px; line-height: 20px; color: var(--body); white-space: nowrap; }
.doc-head-next, .doc-head-note { font-size: 13px; line-height: 20px; color: var(--secondary); }
.doc-head-end { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; min-width: 0; text-align: right; }
.doc-head-alert { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; line-height: 20px; font-weight: 600; color: var(--red-text); }
.doc-head-alert .icon { width: 16px; height: 16px; flex: none; }
/* a superseded version in the Versions fold: grey, the label struck through */
.ver-superseded, .card-link .ver-superseded { color: var(--secondary); font-size: 13px; }
.doc-head-note { min-width: 0; color: var(--body); }
@media (max-width: 760px) { .doc-head-main { flex-direction: column; } }
/* The Approval card (docs/FLOWS.md 7.109): Published and Comments rows like Status, the step's own
   fields in the card (no pop-up) over a hairline, and the state of the text in words above the action. */
.doc-side-value { font-size: 14px; color: var(--ink); white-space: nowrap; flex: none; }
a.doc-published { color: var(--violet-text); font-weight: 600; text-decoration: none; }
a.doc-published:hover, a.doc-side-link:hover .doc-side-value { text-decoration: underline; }
a.doc-side-link { color: inherit; text-decoration: none; }
.doc-step-form { padding-top: 10px; border-top: 1px solid var(--hairline); }
.doc-side-hint { display: flex; align-items: flex-start; gap: 6px; margin: 0; }
.doc-side-hint .icon { width: 16px; height: 16px; flex: none; }
/* Rinat's Approval card (docui, 7.125): the rows, then -- only while the text is unsaved -- a full-width amber
   band "Unsaved changes", then the grey foot with the one full-width action (40px) and the step's text action. */
.doc-side-count { display: inline-flex; align-items: center; justify-content: center; min-width: 32px; height: 22px; padding: 0 8px;
  box-sizing: border-box; flex: none; border-radius: var(--r-badge); background: var(--neutral-tint); color: var(--ink);
  font-size: 14px; font-weight: 500; }
.doc-save-band { margin: 0; padding: 10px 20px; border-top: 1px solid var(--hairline); background: var(--amber-tint);
  color: var(--amber-text); font-size: 14px; font-weight: 600; line-height: 20px; }
.doc-save-band[hidden] { display: none; }
.doc-side-foot { display: flex; flex-direction: column; gap: 10px; padding: 16px 20px; border-top: 1px solid var(--hairline);
  border-radius: 0 0 var(--r-card) var(--r-card); background: var(--canvas); }
.doc-save-band + .doc-side-foot { border-top: 0; }
.doc-side-foot .doc-side-actions .button { min-height: 40px; font-size: 14px; }
/* the toolbar's one Save: "Saved" with a check on a hairline while stored, "Save changes" violet without a
   dot and with Soly AI's glass flare sweeping across it (docui, 7.125; the flare with the badge's rules below) */
.doc-toolbar .doc-save { position: relative; overflow: hidden; isolation: isolate; display: inline-flex; align-items: center; gap: 8px;
  white-space: nowrap; flex: none; }
.doc-toolbar .doc-save[data-save-state="clean"] { background: var(--card); color: var(--body); box-shadow: inset 0 0 0 1px var(--hairline); }
.doc-toolbar .doc-save[data-save-state="clean"]:hover { background: var(--canvas); color: var(--ink); }
.doc-save[data-save-state="dirty"] .doc-save-check { display: none; }
.doc-save .doc-save-check { color: var(--green-text); }
/* Changes waits for a save (7.125): greyed while the text differs from what is stored, its reason in a tip
   under it on hover and on keyboard focus (also its description). */
.dm-changes { position: relative; display: inline-flex; flex: none; }
.doc-view .doc-toolbar .doc-changes-toggle[aria-disabled="true"] { color: var(--secondary); cursor: not-allowed; }
.doc-view .doc-toolbar .doc-changes-toggle[aria-disabled="true"]:hover { background: none; border-color: transparent; color: var(--secondary); }
.dm-why { display: none; position: absolute; top: calc(100% + 6px); right: 0; z-index: 31; width: max-content; max-width: 260px;
  padding: 6px 10px; border-radius: var(--r-control); background: var(--ink); color: var(--card); font-size: 12px; font-weight: 500;
  line-height: 1.4; white-space: normal; box-shadow: 0 4px 12px rgba(47, 51, 73, .16); pointer-events: none; }
.doc-changes-toggle[aria-disabled="true"]:hover + .dm-why, .doc-changes-toggle[aria-disabled="true"]:focus-visible + .dm-why { display: block; }
/* The working comments (7.109): the Comments card, the mark in a section's margin, the floating Comment. */
.dcm-title { display: flex; align-items: baseline; gap: 10px; }
.dcm-eyebrow { font: 500 11px/1 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; color: var(--secondary); white-space: nowrap; }
.dcm-list { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
.dcm-item.resolved { background: var(--canvas); }
.dcm-item:target, .dcm-item.dcm-target { border-color: var(--violet); }
.dcm-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
.dcm-head .avatar, .dcm-head .pill { flex: none; }
.dcm-who { min-width: 0; overflow: hidden; font-size: 13px; font-weight: 600; color: var(--ink); text-overflow: ellipsis; white-space: nowrap; }
.dcm-time { margin-left: auto; font-size: 11px; color: var(--secondary); white-space: nowrap; flex: none; }
.dcm-quote { margin: 0; padding: 2px 0 2px 8px; border-left: 2px solid var(--amber); font-size: 13px; line-height: 1.45;
  color: var(--body); overflow-wrap: anywhere; }
.dcm-quote a { color: inherit; text-decoration: none; }
.dcm-quote a:hover { text-decoration: underline; }
.dcm-text { margin: 0; font-size: 14px; line-height: 1.45; color: var(--ink); white-space: pre-wrap; overflow-wrap: anywhere; }
.dcm-reply { display: flex; flex-direction: column; gap: 4px; margin-left: 12px; padding-left: 10px; border-left: 1px solid var(--hairline); }
.dcm-actions { display: flex; align-items: flex-start; gap: 8px; flex-wrap: wrap; }
.dcm-actions > form { margin: 0; }
.dcm-reply-fold > summary { list-style: none; cursor: pointer; }
.dcm-reply-fold > summary::-webkit-details-marker { display: none; }
.dcm-reply-fold[open] { flex: 1 1 100%; }
.dcm-reply-form { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; margin-top: 8px; }
.dcm-empty { display: flex; align-items: center; gap: 10px; min-height: 34px; margin: 0; font-size: 14px; color: var(--body); }
.dcm-resolved > summary { font-size: 14px; cursor: pointer; }
.dcm-resolved[open] > summary { margin-bottom: 8px; }
.dcm-kept { margin: 0; }
.doc-view .doc-flow-heading > .doc-flow-title { flex: 1 1 auto; min-width: 0; }
.dcm-margin { display: inline-flex; align-items: center; gap: 4px; height: 28px; min-width: 28px; padding: 0 6px; flex: none;
  border: 1px solid transparent; border-radius: var(--r-control); background: none; color: var(--secondary); cursor: pointer; opacity: 0; }
.doc-flow:hover > .doc-flow-heading .dcm-margin, .doc-flow:focus-within > .doc-flow-heading .dcm-margin,
.statement-block:hover .dcm-margin, .statement-block:focus-within .dcm-margin, .dcm-margin:focus-visible, .dcm-margin.has { opacity: 1; }
.dcm-margin:hover { border-color: var(--hairline); background: var(--card); color: var(--violet-text); }
.dcm-margin.has { color: var(--amber-text); }
.dcm-margin .icon { width: 16px; height: 16px; }
.dcm-margin-n { font-size: 12px; }
/* a statement's comment mark (7.193) stands in its heading's actions on the right; its up and down (stcard) show the
   same way: on hover or focus, always on a touch screen */
.statement-heading .order-moves { opacity: 0; }
.statement-block:hover .order-moves, .statement-block:focus-within .order-moves { opacity: 1; }
@media (hover: none) { .dcm-margin, .statement-heading .order-moves { opacity: 1; } }
.dcm-float { position: fixed; z-index: 30; color: var(--violet-text); box-shadow: 0 4px 12px rgba(47, 51, 73, .16); }
::highlight(dcm) { background-color: var(--amber-tint); }
::highlight(dcm-active) { background-color: var(--violet-tint); }
/* The editor's comments without a card (docui, 7.125; static/js/doc_comments.js): a gutter at the right of the
   text with a pin per thread at the words it quotes -- amber while open, violet for a Soly AI finding, faint
   once resolved or kept with the approved version -- and one floating card over the text, anchored at the pin,
   the section's comment mark or the selected words. */
.doc-view .doc-body.dcm-gutter { position: relative; padding-right: 56px; }
.dcm-gutter > .doc-flow { position: relative; }
.dcm-pin { position: absolute; right: -44px; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px;
  padding: 0; flex: none; border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card);
  color: var(--amber-text); cursor: pointer; }
.dcm-pin .icon { width: 16px; height: 16px; }
.dcm-pin[data-soly] { border-color: var(--violet-tint); background: var(--violet-tint); color: var(--violet-text); }
.dcm-pin[data-state="resolved"], .dcm-pin[data-state="kept"] { border-style: dashed; color: var(--secondary); }
.dcm-pin:hover, .dcm-pin[aria-expanded="true"] { border-color: var(--violet); color: var(--violet-text); }
.dcm-doc-pins { position: absolute; top: 8px; right: 16px; display: flex; flex-direction: column; gap: 4px; }
.dcm-doc-pins > .dcm-pin { position: static; }
.dcm-pop { position: absolute; z-index: 29; display: flex; flex-direction: column; gap: 8px; width: min(340px, calc(100% - 16px));
  max-height: 480px; overflow-y: auto; padding: 12px 14px 14px; background: var(--card); border: 1px solid var(--hairline);
  border-radius: var(--r-control); box-shadow: 0 8px 24px rgba(47, 51, 73, .18); }
.dcm-pop[hidden], .dcm-pop-new[hidden], .dcm-pop-thread[hidden] { display: none; }
.dcm-pop-head { display: flex; justify-content: flex-end; margin: -4px -6px -8px 0; }
.dcm-pop-x { width: 24px; height: 24px; padding: 0; flex: none; border: 0; border-radius: var(--r-badge); background: none;
  font: 600 16px/1 var(--font-sans); color: var(--secondary); cursor: pointer; }
.dcm-pop-x:hover { color: var(--ink); background: var(--canvas); }
.dcm-pop .dcm-item { padding: 0; border: 0; background: none; }
/* at its pin the card needs no "On <section>" nor the quote: the words are highlighted beside it; the quote
   comes back when its words are no longer in the text */
/* a statement's thread keeps its line: the code names which statement the pin stands at (7.193); so does the source
   a suggestion or a flag of Soly AI rests on (docrel, 7.561: before, the card hid it with the section's line) */
.dcm-pop .dcm-where:not([data-dcm-where-statement]):not([data-dcm-source]), .dcm-pop:not(.dcm-quote-lost) .dcm-item > .dcm-quote { display: none; }
.dcm-pop-new { display: flex; flex-direction: column; gap: 8px; margin: 0; }
.dcm-pop-new textarea { width: 100%; min-height: 72px; resize: vertical; }
.dcm-pop-actions { display: flex; justify-content: flex-end; gap: 8px; }
.dcm-pop .form-error { margin: 0; }
.dcm-ver-count { display: inline-flex; align-items: center; gap: 3px; margin-left: 4px; font-size: 12px; color: var(--secondary); white-space: nowrap; }
.dcm-ver-count .icon { width: 14px; height: 14px; }
/* Soly AI on a document (docsoly, docs/FLOWS.md 7.123): a finding's writer with the Soly glyph, its suggested
   wording under the why, and the Undo beside the heading of a part Soly filled in the editor. */
.avatar.dcm-soly { background: var(--violet-tint); color: var(--violet-text); }
.avatar.dcm-soly .icon { width: 14px; height: 14px; }
.dcm-suggestion { display: flex; flex-direction: column; gap: 4px; padding: 6px 0 6px 8px; border-left: 2px solid var(--violet); }
.dcm-suggestion-label { font-size: 11px; color: var(--secondary); }
.dcm-suggestion-text { margin: 0; font-size: 13px; line-height: 1.45; color: var(--ink); white-space: pre-wrap; overflow-wrap: anywhere; }
.soly-doc-undo { flex: none; margin-left: 8px; white-space: nowrap; }
/* the version page's text card: its heading inset like the text below it (.doc-body) */
.doc-view .doc-version > .card-heading { padding: 16px 24px 0; }
/* a version read back has no side column: the heading and the text take the width */
.doc-view.doc-view-wide { grid-template-columns: minmax(0, 1fr); }
.rset-step .otc-zcr-explanation, .attn4-source, .rep-choice-sub { font-size: 12px; line-height: 1.4; color: var(--secondary); }
.scp-row-sub { font-size: 14px; line-height: 1.4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* The editor card: the toolbar as a band across the top -- the formatting
   buttons, the state ("First draft"), Changes and the one Save at the right. */
.doc-view .doc-canvas { position: relative; padding: 0; overflow: visible; }
.doc-view .doc-toolbar.sticky { margin: 0; padding: 10px 24px; gap: 8px; align-items: center; background: var(--canvas);
  border-bottom: 1px solid var(--hairline); border-radius: var(--r-card) var(--r-card) 0 0; }
.doc-view .doc-toolbar .button { margin-left: auto; }
.doc-toolbar .doc-toolbar-state { flex: 1 1 auto; min-width: 0; padding-left: 8px; font-size: 13px; font-weight: 400;
  color: var(--secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.doc-view .doc-toolbar .doc-changes-toggle { width: auto; min-height: 32px; background: none; border-color: transparent;
  color: var(--violet-text); font-size: 13px; }
.doc-view .doc-toolbar .doc-changes-toggle.on { border-color: var(--violet); }
.doc-body { padding: 8px 24px 20px; }
.doc-view .doc-new-statement { margin: var(--s-4) 24px 20px; }
/* A section Cisoly keeps (version history, reviewers, approval): a section like
   the others, its note at the right of the heading; its register a small table. */
.doc-view .auto-section { background: none; border: none; border-radius: 0; padding: 0; }
.doc-flow-note, .soly-feedback-ask, .soly-feedback-done { flex: none; font-size: 12px; color: var(--secondary); white-space: nowrap; }
/* A key/value table (Document control): hairline rows, the key secondary, what
   Cisoly fills in and a link in violet. */
.doc-view .doc-editor table:not(.cisoly-register):not(:has(thead)) td { border: none; border-bottom: 1px solid var(--hairline); padding: 8px 12px 8px 0; }
.doc-view .doc-editor table:not(.cisoly-register):not(:has(thead)) tr:first-child td { border-top: 1px solid var(--hairline); }
.doc-view .doc-editor table:not(.cisoly-register):not(:has(thead)) td:first-child { width: 36%; color: var(--secondary); }
.doc-view .doc-editor table:not(.cisoly-register):not(:has(thead)) td:first-child strong { font-weight: 400; }
.doc-view .doc-editor td .cisoly-managed { background: none; padding: 0; }
.doc-view .doc-editor a { color: var(--violet-text); }
.relation-list { display: flex; flex-direction: column; gap: var(--s-1); }
.relation-name { flex: 1; min-width: 0; }
.doc-new-statement .stmt-code { max-width: 110px; }
.doc-new-statement .stmt-text { flex: 1; min-width: 200px; }
.button.hairline, .list-text-button, .link-pane .chip.source-gone, .card-heading > .button.small, .card-heading > .card-heading-meta .button.small, .page-heading-row > .button.small, .card-heading > form .button.small { background: var(--card); color: var(--ink); border: 1px solid var(--hairline); }
.button.hairline:hover, .list-text-button:hover { background: var(--canvas); border-color: var(--body); }
/* off: the hairline look above would otherwise keep the ink of an active button (Request review waiting for a save, 7.109) */
.button.hairline:disabled, .button.hairline[aria-disabled="true"] { color: var(--disabled); background: var(--canvas); border-color: var(--hairline); cursor: not-allowed; }
/* The right column: a card per concern, its title over a hairline. */
.doc-side > .doc-side-card { display: flex; flex-direction: column; padding: 0; }
.doc-side-title { margin: 0; padding: 16px 20px; border-bottom: 1px solid var(--hairline); font: 600 18px/1.3 var(--font-sans); color: var(--ink); }
.doc-side-body { display: flex; flex-direction: column; gap: 10px; padding: 16px 20px 20px; min-width: 0; }
.doc-side-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 32px; }
.doc-side-label, .people-none, .doc-side-none { font-size: 14px; color: var(--secondary); }
.doc-side-form { display: flex; flex-direction: column; gap: 10px; }
.doc-field { display: flex; flex-direction: column; gap: 4px; }
.doc-field-label { font-size: 13px; color: var(--body); }
.doc-side .doc-entry { width: 100%; min-width: 0; box-sizing: border-box; }
.doc-side .doc-entry.mono { max-width: 150px; }
.doc-side-actions { display: flex; flex-direction: column; gap: 8px; }
.doc-side-actions .button { width: 100%; justify-content: center; }
/* After the approval (docs/FLOWS.md 7.115): the decision of a review step as a segment across the card
   (the step's own choice and Request changes; the one button below does what it says). Retire and
   Reinstate (docsoly): a small text action under the one action, its confirmation opening in the card --
   the reason, then Cancel and the red-outlined Retire (or Reinstate) on the right. */
.segment.doc-decide { display: flex; width: 100%; }
.doc-decide .segment-button { flex: 1 1 auto; justify-content: center; }
.doc-side-more { display: flex; flex-direction: column; gap: 10px; }
.doc-side-more-link { align-self: center; font-size: 13px; font-weight: 600; color: var(--secondary); white-space: nowrap; }
.doc-side-more-link:hover { color: var(--ink); }
.doc-side-inline { display: flex; justify-content: flex-end; gap: 8px; }
.doc-side-inline > .button { flex: none; white-space: nowrap; }
.doc-side-body.people-rows { gap: 0; }
.people-rows { display: flex; flex-direction: column; }
/* A row: the label on its own line with the Add on its right, the people under it, */
/* left aligned and wrapping from the left. "Not set" stands in the same place. */
.people-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px 10px; padding: 10px 0; border-top: 1px solid var(--hairline); }
.people-row:first-child { border-top: none; padding-top: 0; }
.people-label { grid-column: 1; font-size: 14px; color: var(--secondary); white-space: nowrap; }
.people-add { grid-column: 2; grid-row: 1; justify-self: end; white-space: nowrap; }
.people-who { grid-column: 1 / -1; display: flex; align-items: center; justify-content: flex-start; gap: 8px; flex-wrap: wrap; min-width: 0; }
/* A person takes the room the row has (Rinat 2026-09-27: no cut at 170px): */
/* the name grows with the column and ends in an ellipsis only when the row is full. */
.people-one { display: inline-flex; align-items: center; gap: 8px; min-width: 0; max-width: 100%; }
.people-one > .avatar { flex: none; }
/* The people picker (templates/_people_picker.html, Rinat's design 2026-09-27):
   the popover under the Add of a people role -- the search, Suggested and
   Everyone, a checkbox, the initials avatar (its tint fixed per person, a
   group grey) and the name per row, "n people" beside a group, the foot with
   the count and Done. */
.pp { position: relative; grid-column: 2; grid-row: 1; justify-self: end; }
/* a text button: a link's look, a button's job (the people picker's Add; a connector page's Details, Hide, + Add value, Clear selection) */
.pp-open, .conn-choice-add, .conn-unmapped-hide, .conn-bulk-clear, .conn-details-toggle, .infra-copy { padding: 0; border: 0; background: none; cursor: pointer; white-space: nowrap; }
.pp-pop { position: fixed; top: 0; left: 0; z-index: 60; width: 300px; max-width: calc(100vw - 32px);
  background: var(--card); border: 1px solid var(--hairline); border-radius: 4px; box-shadow: var(--shadow-float); text-align: left; }
.pp-pop[hidden], .pp-row[hidden], .pp-eyebrow[hidden], .pp-none[hidden] { display: none; }
.pp-search { display: flex; align-items: center; gap: 10px; min-height: 44px; padding: 0 14px; border-bottom: 1px solid var(--hairline); color: var(--secondary); }
.pp-search .icon { flex: none; width: 18px; height: 18px; }
.pp-query { flex: 1; min-width: 0; min-height: 32px; border: 0; border-radius: 4px; background: transparent; font: 400 15px/1.4 var(--font-sans); color: var(--ink); }
.pp-list { display: flex; flex-direction: column; max-height: 320px; overflow-y: auto; padding: 8px 0; }
.pp-eyebrow { padding: 4px 14px; font-size: 13px; color: var(--secondary); }
.pp-row { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 4px 14px; cursor: pointer; }
.pp-row:hover { background: var(--violet-tint); }
.pp-row input { flex: none; width: 18px; height: 18px; margin: 0; accent-color: var(--violet); }
.pp-avatar { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 50%;
  font: 600 12px/1 var(--font-sans); }
.pp-avatar.tone-0 { background: var(--violet-tint); color: var(--violet-text); }
.pp-avatar.tone-1 { background: var(--green-tint); color: var(--green-text); }
.pp-avatar.tone-2 { background: var(--amber-tint); color: var(--amber-text); }
.pp-avatar.tone-3 { background: var(--blue-tint); color: var(--blue-text); }
.pp-avatar.group { background: var(--neutral-tint); color: var(--body); border-radius: 4px; }
.pp-avatar.group .icon { width: 16px; height: 16px; }
.pp-kind { font-size: 13px; color: var(--secondary); }
.pp-name { flex: 1 1 auto; }
.pp-meta { white-space: nowrap; }
.pp-none { padding: 8px 14px; font-size: 13px; color: var(--secondary); }
.pp-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 14px; border-top: 1px solid var(--hairline); }
.pp-count { white-space: nowrap; font-size: 13px; color: var(--body); }
.pp-done { flex: none; min-height: 32px; padding: 0 16px; }
.people-name { font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.people-row .card-link, .doc-side-body > details > summary.card-link { font-size: 14px; cursor: pointer; }
.doc-side .avatar-add > summary.card-link { list-style: none; }
.doc-side .avatar-add[open] > form { left: auto; right: 0; min-width: 240px; }
.doc-prop { display: flex; flex-direction: column; gap: 8px; padding-top: 14px; border-top: 1px solid var(--hairline); }
.doc-prop:first-of-type { border-top: none; padding-top: 0; }
.doc-prop > .doc-field-label { font-size: 14px; font-weight: 600; color: var(--ink); }
.doc-prop-form { display: flex; flex-direction: column; gap: 8px; }
.doc-prop-row { display: flex; gap: 8px; align-items: center; }
.doc-prop-row .doc-entry { flex: 1 1 auto; }
.doc-prop-row .button { flex: none; white-space: nowrap; }
.doc-prop .chips, .doc-side-body > .chips { display: flex; flex-wrap: wrap; gap: 6px; }
.doc-record > summary { list-style: none; align-self: flex-start; }
.doc-record > summary::-webkit-details-marker { display: none; }
.doc-record[open] > form { margin-top: 10px; }
.chip-form { display: inline; margin: 0; }
@media (max-width: 1100px) { .doc-view { grid-template-columns: 1fr; } }

/* ---- Risk trend: the figures of a period on hover (open, new, closed per domain) ---- */
.risk-trend { position: relative; }
.trend-hit { fill: transparent; cursor: pointer; }
.trend-tip { position: absolute; z-index: 6; pointer-events: none; background: var(--card);
  border: 1px solid var(--hairline); border-radius: var(--r-card); box-shadow: var(--shadow-float);
  padding: 8px 10px; min-width: 200px; font-size: 12px; color: var(--ink); }
.trend-tip-head { font: 500 11px var(--font-mono); color: var(--secondary); margin-bottom: 6px; white-space: nowrap; }
.trend-tip table { border-collapse: collapse; width: 100%; }
.trend-tip th { font: 500 10px var(--font-mono); text-transform: uppercase; letter-spacing: .06em; color: var(--secondary);
  text-align: right; padding: 0 0 3px 10px; }
.trend-tip th:first-child { text-align: left; padding-left: 0; }
.trend-tip td { padding: 2px 0 2px 10px; text-align: right; font-family: var(--font-mono); }
.trend-tip td:first-child { text-align: left; padding-left: 0; font-family: var(--font-sans); white-space: nowrap; }
.trend-tip td:first-child .swatch { width: 8px; height: 8px; display: inline-block; margin-right: 5px; border-radius: var(--r-badge); vertical-align: middle; }
.trend-tip tr.is-hover td { font-weight: 600; }

/* The linked controls of a register item, under its form: chips that open the control pages. */
.rn-controls { margin-top: 10px; }
.rn-controls .chip { white-space: nowrap; flex: none; text-decoration: none; }

/* The customer-view banner of a console user: its actions are buttons, on the right. */
.cv-actions { margin-left: auto; display: flex; gap: 8px; align-items: center; flex: none; white-space: nowrap; }
.cv-actions .button, .cv-note .button { text-decoration: none; height: 28px; display: inline-flex; align-items: center; }
.cv-note { display: flex; align-items: center; gap: 12px; margin-top: .5rem; }
.cv-note-text { flex: 1; min-width: 0; }
.cv-note .button { flex: none; white-space: nowrap; }

/* The desk (templates/portal_base.html, templates/desk.html): the button
   beside the bell with what waits on me, the count on the menu entry, and
   the trail column of My reports. */
.side-nav-count { margin-left: auto; }
.rail-tile .side-nav-count { margin-left: 8px; }
/* My reports: the register table; a row opens the report (data-href), the
   question column says whether one waits for me. */
.me-rep-heading { margin-bottom: 4px; }
.me-rep-sub { max-width: 70ch; margin-bottom: 14px; }
.me-rep-row { cursor: pointer; }
.me-rep-q { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; color: var(--body); white-space: nowrap; }
.me-rep-q .icon { width: 16px; height: 16px; }
.me-rep-q.waiting { color: #7A5A12; }
.me-rep-code { font-weight: 600; }
.me-trail .eyebrow { display: inline; margin-right: 4px; }
/* One report for its triager (reportui, Rinat's design 2026-10-04; templates/report_detail.html): one card --
   "Report" and its status pill, the reporter's words in a violet band (eyebrow, the quote on a violet bar,
   one meta line), a hairline, "Your decision" as three equal choice cards whose radio and border turn violet
   when chosen, the chosen decision's fields, one button in the action row. */
.rep-card { display: flex; flex-direction: column; gap: 16px; }
.rep-card > .card-actions, .rep-decide .card-actions { margin-top: 0; }
.rep-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 32px; }
.rep-head .pill { flex: none; white-space: nowrap; }
.rep-band { display: flex; flex-direction: column; gap: 10px; padding: 14px 16px; border-radius: var(--r-control);
  background: var(--violet-tint); min-width: 0; }
.rep-band-eyebrow { display: inline-flex; align-items: center; gap: 6px; font: 500 11px/1 var(--font-mono);
  letter-spacing: .08em; text-transform: uppercase; color: var(--violet-text); white-space: nowrap; }
.rep-band-eyebrow .icon { width: 16px; height: 16px; }
.rep-quote { margin: 0; padding: 2px 0 2px 14px; border-left: 3px solid var(--violet); font: 400 20px/1.45 var(--font-sans);
  color: var(--ink); white-space: pre-line; overflow-wrap: anywhere; }
.rep-meta { margin: 0; font-size: 13px; line-height: 1.6; color: var(--body); }
.rep-meta-who { font-weight: 600; color: var(--ink); }
.rep-meta-sep { margin: 0 4px; }
.rep-settled, .rep-decide h3 { margin: 0; }
.rep-decide { display: flex; flex-direction: column; gap: 12px; }
.rep-choices { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; align-items: stretch; }
.rep-choice { display: flex; align-items: flex-start; gap: 10px; min-width: 0; padding: 12px 14px; cursor: pointer;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.rep-choice:hover { border-color: var(--field-rule); }
.rep-choice.active, .rep-choice:has(input:checked) { border-color: var(--violet); box-shadow: inset 0 0 0 1px var(--violet); }
.rep-choice.disabled { cursor: not-allowed; }
.rep-choice input { flex: none; width: 18px; height: 18px; margin: 1px 0 0; accent-color: var(--violet); }
.rep-choice-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rep-fields { margin: 0; }
@media (max-width: 720px) { .rep-choices { grid-template-columns: 1fr; } }
/* The conversation with the reporter (reportqa, Rinat's design 2026-10-04; templates/report_detail.html): the
   list card's heading line (its full-width hairline) with the state chip on the right, then a timeline -- a 28px avatar per
   entry (the reporter filled dark with an initial, a colleague light grey with initials, what comes next a dashed
   ring with its glyph) on a thin violet line, the meta line "<who> <verb> · <date, time>" and the message in a box
   (the reporter's in the violet tint, a question in a hairline box); the last row's hairline buttons on the right. */
.rqa > .list-head > .pill { flex: none; white-space: nowrap; }
.rqa-thread { display: flex; flex-direction: column; gap: 16px; margin: 0; list-style: none; }
.rqa-entry { position: relative; display: flex; align-items: flex-start; gap: 14px; min-width: 0; }
.rqa-entry:not(:last-child)::before { content: ""; position: absolute; left: 13px; top: 32px; bottom: -12px; width: 2px;
  border-radius: 1px; background: color-mix(in srgb, var(--violet) 30%, transparent); }
.rqa-avatar { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; flex: none;
  border-radius: 50%; background: var(--neutral-tint); color: var(--ink); font: 600 11px/1 var(--font-sans); }
.rqa-avatar.is-reporter { background: var(--ink); color: var(--card); }
.rqa-avatar.is-next { background: transparent; border: 1.5px dashed var(--disabled); color: var(--secondary); }
.rqa-avatar .icon { width: 14px; height: 14px; }
.rqa-body { display: flex; flex-direction: column; gap: 6px; flex: 1 1 auto; min-width: 0; }
.rqa-meta, .rqa-next-text { margin: 0; font-size: 14px; line-height: 20px; color: var(--secondary); overflow-wrap: anywhere; }
.rqa-meta { padding-top: 4px; }
.rqa-who { font-weight: 600; color: var(--ink); }
.rqa-msg { padding: 12px 14px; border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card);
  font-size: 15px; line-height: 1.5; color: var(--ink); white-space: pre-line; overflow-wrap: anywhere; }
.rqa-msg.is-reporter { border-color: transparent; background: var(--violet-tint); }
.rqa-next { align-items: center; flex-wrap: wrap; }
.rqa-next-text { flex: 1 1 240px; }
.rqa-next-actions { display: flex; align-items: center; gap: 10px; flex: none; margin-left: auto; }
.rqa-next-actions form { margin: 0; }
.rqa-next-actions .button { white-space: nowrap; flex: none; text-decoration: none; }

/* A section's heading line (the dashboard's sections, Rinat's design v9;
   the fleet's server page): the contract's section heading -- one line of
   32px, the h2 (18px/600, the shared section title) on the left, the counts
   after it as one mono eyebrow (several eyebrows a middle dot apart), the
   section's link or button on the right. */
.dash-row-heading { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 12px; min-height: 32px; }
.dash-row-heading > .dash-row-meta { min-width: 0; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dash-row-heading > .dash-row-meta + .dash-row-meta::before { content: "·"; margin-right: 12px; }
.dash-row-heading > .dash-row-link, .dash-row-heading > .button { flex: none; margin-left: auto; white-space: nowrap; }
.dash-row-heading > .dash-row-link { font: 600 14px/1.4 var(--font-sans); }
.dash-row-heading .icon { display: none; }

/* My account (templates/account.html; the product owner's design of
   2026-09-27, measured at 1.4 image px per CSS px like the list card):
   three list cards, 16px apart. Profile: the person (56px avatar, name
   18px/600 over the mono e-mail) with Role and Clearance as labelled chips
   on the right, then one row per field under a full-width hairline -- the
   20px icon and the 15px/600 label in a fixed column, the value, the
   actions on the right (32px hairline buttons). Under it My desk beside
   the administrators (.two-column.equal): the desk one row per part, the
   count mono on the right, ink when there is something, grey at nought. */
.acct-page { display: flex; flex-direction: column; gap: 16px; }
.acct-card > .list-head { min-height: 64px; }
.list-card > .list-body.acct-body { padding: 0; }
.acct-top { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; padding: 20px 24px; }
.acct-person { display: flex; align-items: center; gap: 16px; min-width: 0; }
.avatar.acct-avatar { width: 56px; height: 56px; display: inline-flex; align-items: center; justify-content: center;
  font: 600 18px/1 var(--font-sans); object-fit: cover; }
.acct-name { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.acct-name > * { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.acct-name .mono, .otz-count.is-zero, .setup-tab .setup-count, .rl-arrow, .dr-score { font: 400 14px/20px var(--font-mono); color: var(--secondary); }
/* a count in a Setup tab's heading: medium weight, tight (it stood in ot.css, the OT quality review of 2026-10-23) */
.setup-tab .setup-count { font-weight: 500; line-height: 1; }
.rl-arrow { font-family: var(--font-sans); }
.acct-meta { display: flex; align-items: flex-start; gap: 24px; flex-wrap: wrap; }
.acct-meta-block { display: flex; flex-direction: column; gap: 6px; }
.acct-meta-label { line-height: 18px; }
.acct-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.acct-row { display: grid; grid-template-columns: 222px minmax(0, 1fr) auto; align-items: center; column-gap: 12px;
  min-height: 56px; margin: 0; padding: 12px 24px; border-top: 1px solid var(--hairline); }
.acct-label { display: flex; align-items: center; gap: 10px; min-width: 0; font: 600 15px/22px var(--font-sans); color: var(--ink); }
.acct-label > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.acct-value { min-width: 0; font: 400 15px/22px var(--font-sans); color: var(--body); }
.acct-value.mono { font-family: var(--font-mono); color: var(--ink); }
.acct-value.acct-drop { display: flex; flex-direction: column; gap: 4px; }
.acct-action { display: flex; align-items: center; justify-content: flex-end; gap: 8px; white-space: nowrap; flex: none; }
.acct-action .button.small, .button.hairline.ro-gap-action, .soly-task-actions .button { min-height: 32px; height: 32px; border-radius: var(--r-control); font: 600 13px/1 var(--font-sans); white-space: nowrap; flex: none; text-decoration: none; }
.acct-action .button.small { padding: 0 16px; }
.desk-card-rows { display: flex; flex-direction: column; }
.desk-card-row { display: flex; align-items: center; gap: 10px; min-height: 46px; padding: 12px 24px; border-top: 1px solid var(--hairline);
  color: var(--ink); text-decoration: none; font: 400 15px/22px var(--font-sans); }
.desk-card-row:first-child { border-top: none; }
.desk-card-row > span:first-child { flex: 1; min-width: 0; }
.desk-card-row:hover > span:first-child { color: var(--violet-text); }
.desk-card-count { min-width: 24px; text-align: right; font: 400 15px/22px var(--font-mono); color: var(--secondary); flex: none; }
.desk-card-count.is-set { font-weight: 600; color: var(--ink); }
@media (max-width: 720px) {
  .acct-top, .acct-row, .desk-card-row { padding-left: 16px; padding-right: 16px; }
  .acct-row { grid-template-columns: minmax(0, 1fr); row-gap: 6px; }
  .acct-action { justify-content: flex-start; flex-wrap: wrap; }
}

/* Linked documents (capability external_docs, templates/_linked_documents.html,
   register.html and register_detail.html for kind external_doc): the
   opens-elsewhere glyph beside a title, a chip that opens elsewhere, the
   empty state as one left-aligned row with a glyph, one sentence and one
   action (brand book §23), and the connect fold on a documentation
   platform's card (templates/links.html). */
.xdoc-open { display: inline-flex; align-items: center; margin-left: 4px; color: var(--secondary); vertical-align: -1px; }
.xdoc-open:hover { color: var(--violet-text); }
.chip.external { text-decoration: none; }
.chip.external .icon.mini { flex: none; }
.xdoc-empty { text-align: left; }
.xdoc-empty span { min-width: 0; }
.xdoc-empty .button { flex: none; margin-left: auto; }
.xdoc-resolve { display: block; margin-top: 4px; }
/* A row action of a linked document (acknowledge, check now): beside the pills, 28px, never wrapping the title. */
.xdoc-row-action { display: inline-flex; margin-left: 4px; vertical-align: middle; }
/* The Google Drive picker: the breadcrumb row with the search on the right; the table as every register. */
.drive-crumbs { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.drive-crumb-row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
.drive-crumb-row .chip { white-space: nowrap; flex: none; }
.drive-search { flex: none; }
.drive-table .rr-title .icon { vertical-align: -3px; color: var(--violet-text); }
.link-docs-connect { padding: 10px 12px; background: var(--canvas); border-radius: var(--r-control); }
.link-docs-form { display: flex; flex-direction: column; gap: 8px; }
.link-docs-form label { display: flex; flex-direction: column; gap: 4px; }
/* The steps a client walks at Notion (an internal integration, the pages
   shared with it) in the card's fold: a numbered list at the card-sub size. */
.link-docs-steps { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 4px; }
/* The console's Integrations page (templates/console/platform_integrations.html):
   the portal's groups in the portal's order, one card per row, every card
   the full width of the page (2026-09-19: the cards were three to a row,
   which made the ones with a form the odd ones out). */
.pint-group + .pint-group { margin-top: 28px; }
.pint-grid { display: grid; grid-template-columns: 1fr; gap: 14px; align-items: start; }
.pint-card { margin: 0; min-width: 0; }
.pint-card.wide { grid-column: 1 / -1; }
.pint-card > .card-heading { margin-bottom: 10px; min-height: 32px; }
.pint-card > .card-heading .card-heading-links { min-width: 0; }
.pint-card > .card-heading h2 { margin: 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* The right of the heading line: the state pill(s) and the switch for every client. */
.pint-state { display: flex; align-items: center; gap: 8px; flex: none; }
.pint-switch { display: flex; align-items: center; margin: 0; }
.pint-line { margin: 0; line-height: 1.45; }
/* The redirect URI: one mono line that truncates, the copy button beside it. */
.pint-redirect { display: flex; align-items: center; gap: 8px; margin-top: 10px; min-width: 0; }
.pint-redirect .eyebrow { flex: none; white-space: nowrap; }
.pint-redirect code { font-family: var(--font-mono); flex: 1 1 auto; }
.pint-redirect .button { flex: none; }
.pint-fold { margin-top: 10px; }
.pint-fold > summary { cursor: pointer; font-size: 13px; list-style: none; }
.pint-fold > summary::-webkit-details-marker { display: none; }
.pint-fold > summary::before { content: "▸"; color: var(--secondary); font-size: .8rem; margin-right: 6px;
  display: inline-block; transition: transform var(--t-fast) var(--ease); }
.pint-fold[open] > summary::before { transform: rotate(90deg); }
.pint-steps { margin: 8px 0 0; padding-left: 20px; font-size: 13px; line-height: 1.5; color: var(--body);
  display: grid; gap: 6px; }
.pint-env { margin: 10px 0 0; }
/* The empty form that Test and Forget submit through their form= attribute:
   no fields, nothing to see. */
.pint-act { display: none; }
.pint-form { margin-top: 14px; }
.pint-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 12px 16px; align-items: start; }
.pint-secret { display: flex; align-items: center; gap: 8px; min-height: 32px; }
.pint-secret .field-value { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pint-secret .button { flex: none; }
.pint-clients-heading { margin: 16px 0 8px; }
.pint-clients td { font-size: 13px; }
/* Readiness (2026-09-21): the counts under the title, the filter pills in
   one 40px row, and per card the platform checklist -- one line per
   prerequisite, a glyph for a verified one, a checkbox for a manual tick
   -- and the one line with the switch and what the client enters. */
.pint-summary { display: block; margin-top: 2px; }
.pint-filter { margin-top: 12px; margin-bottom: 14px; }
.pint-filter-empty { margin: 0 0 14px; }
.pint-ready { display: grid; gap: 8px; margin-top: 10px; }
.pint-checks { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.pint-check, .soly-plan-step { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; line-height: 1.45; color: var(--body); min-width: 0; }
.pint-check > .icon { width: 16px; height: 16px; flex: none; margin-top: 2px; }
.pint-check[data-done="1"] > .icon { color: var(--green-text); }
.pint-check[data-done="0"] > .icon { color: var(--red-text); }
.pint-check .mono { font-family: var(--font-mono); font-size: 12px; color: var(--ink); }
.pint-check-done { color: var(--green-text); }
.pint-check-open { color: var(--red-text); }
.pint-tick { display: flex; align-items: flex-start; gap: 8px; margin: 0; min-width: 0; }
.pint-tick input[type="checkbox"] { flex: none; margin: 2px 0 0; width: 16px; height: 16px; accent-color: var(--violet); }
.pint-tick label { cursor: pointer; min-width: 0; }
.pint-client-line { margin: 0; line-height: 1.45; }
.pint-nothing { display: block; }
/* The E-mail (SMTP) card (mailcard, 2026-10-04): the platform mail's state
   in one line, the sender domain's check in the fold, the test mail as one
   inline row (address and its small Send) above the provider form. */
.pint-mail-state { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 13px; line-height: 1.45; }
.pint-mail-state > .pill { flex: none; white-space: nowrap; }
.pint-mail-dns { display: grid; gap: 10px; margin-top: 8px; min-width: 0; }
.pint-mail-dns > .card-sub { margin: 0; }
.pint-mail-test { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 14px; }
.pint-mail-test > .eyebrow, .pint-mail-test > .button { flex: none; white-space: nowrap; }
.pint-mail-test > .doc-entry { flex: 0 1 320px; min-width: 0; }
@media (max-width: 720px) {
  .pint-redirect { flex-wrap: wrap; }
}

/* ================================================================
   List style — the IT risk register as the product owner drew it is
   the reference for every list page, table, tab bar and filter bar in
   portal and console (2026-09-15). The page heading, the pill tabs,
   the card heading with its mono eyebrow, the filter row, the table,
   the pills and the inline status control. The last layer: it wins
   over everything above.
   ================================================================ */

/* Page heading: title 24px/600, below it one 14px line with the links in violet. */
.page-heading h1 { font: 600 24px/1.25 var(--font-sans); letter-spacing: -.01em; color: var(--ink); }
.page-heading .page-sub { font-size: 14px; line-height: 1.5; color: var(--secondary); }
.page-sub .card-link { color: var(--violet-text); font-weight: 500; font-size: 14px; }

/* Tabs: menu pills (2026-09-26, the product owner's image; it replaces
   §23's filled violet tab). The bar is a white box with a hairline, radius
   4px and 4px of room inside, as wide as its tabs, on the page background.
   A tab is a pill of 34px, 14px/600 ink, 12px either side, 4px apart. The
   active one sits on the violet tint in ink, its count a violet badge with
   a white number (20px, radius 2px); an inactive count is a neutral badge.
   A tab with sub-pills (templates/_tab_menu.html) carries a chevron,
   turned up while its menu is open: a white card with a hairline and a
   shadow, 4px under the bar and aligned to the tab, a soft 12px heading
   (the tab's name), then one row per view -- its name 14px ink, one soft
   12px line under it -- on a light grey tint on hover and when current.
   static/js/tabs.js opens it and moves it into .tabbar-host, a wrapper
   around the bar, so a bar that scrolls sideways does not clip it. */
.tabbar { display: flex; align-items: center; gap: 4px; width: fit-content; max-width: 100%;
  box-sizing: border-box; padding: 4px; background: var(--card);
  border: 1px solid var(--hairline); border-radius: var(--r-card);
  overflow-x: auto; scrollbar-width: none; }
.tabbar[hidden] { display: none; }
.tabbar .tab { display: inline-flex; align-items: center; gap: 8px; flex: none;
  height: 34px; min-height: 34px; padding: 0 12px; margin: 0; border: 0;
  border-radius: var(--r-control); background: transparent; cursor: pointer;
  font: 600 14px/1 var(--font-sans); color: var(--ink); white-space: nowrap; text-decoration: none;
  transition: background var(--t-fast) var(--ease); }
.tabbar .tab:hover, .tabbar .tab[aria-expanded="true"] { background: var(--canvas); color: var(--ink); }
.tabbar .tab.active, .tabbar .tab.active:hover, .tabbar .tab.active[aria-expanded="true"] {
  background: var(--violet-tint); color: var(--ink); }
.tabbar .tab:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.tab-count { display: inline-flex; align-items: center; justify-content: center; flex: none;
  min-width: 30px; height: 20px; padding: 0 8px; box-sizing: border-box; margin: 0; border: 0;
  border-radius: var(--r-badge); background: var(--neutral-tint); color: var(--ink);
  font: 600 12px/1 var(--font-sans); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tab-count.open { background: var(--amber-tint); color: var(--amber-text); }
.tab-count.danger { background: var(--red-tint); color: var(--red-text); }
.tab-count.active-green { background: var(--green-tint); color: var(--green-text); }
.tab-count.planned { background: var(--violet-tint); color: var(--violet-text); }
.tabbar .tab.active .tab-count { background: var(--violet); color: #fff; }
.tab-caret { width: 14px; height: 14px; flex: none; margin-left: -2px; color: var(--secondary);
  transition: transform var(--t-fast) var(--ease); }
.tab[aria-expanded="true"] .tab-caret { transform: rotate(180deg); }
.tabbar-host { position: relative; width: fit-content; max-width: 100%; }
.tab-menu { position: absolute; top: calc(100% + 4px); left: 0; z-index: 40;
  display: flex; flex-direction: column; gap: 2px; box-sizing: border-box;
  min-width: 264px; max-width: min(360px, calc(100vw - 32px)); padding: 6px;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-card);
  box-shadow: 0 8px 24px rgba(47, 51, 73, .12); }
.tab-menu[hidden] { display: none; }
/* (menus2, FLOWS 7.446) The room between a tab and its menu -- the bar's 4px inside, its line, the 4px under it --
   belongs to the menu for the pointer: going down from the tab, the mouse is in the menu at once. It ends at the
   tab's lower edge (the menu's line included), so it never covers a tab. */
.tabbar-host > .tab-menu::before { content: ""; position: absolute; left: 0; right: 0; top: -10px; height: 10px; }
.tab-menu-head { padding: 6px 12px 4px; font: 600 12px/16px var(--font-sans); color: var(--secondary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tab-menu-item { display: flex; flex-direction: column; gap: 2px; min-width: 0; padding: 8px 12px;
  border-radius: var(--r-control); color: var(--ink); text-decoration: none; }
.tab-menu-item:hover, .tab-menu-item.is-current { background: var(--canvas); }
/* The item whose page is on the screen says so in words' colour too, not by the tint alone (FLOWS 7.413). */
.tab-menu-item.is-current .tab-menu-name { color: var(--violet-text); font-weight: 600; }
.tab-menu-item:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; background: var(--canvas); }
.tab-menu-name, .asset-list .al-zone-name, .ro-gap-name { font: 500 14px/20px var(--font-sans); color: var(--ink); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.tab-menu-sub { font: 400 12px/16px var(--font-sans); color: var(--secondary); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
@media (prefers-reduced-motion: reduce) { .tabbar .tab, .tab-caret { transition: none; } }

/* Card: white, a 1px frame in the rule colour, 4px radius, 16px of padding. */
.card { border: 1px solid var(--rule); border-radius: var(--r-card); padding: 16px; }

/* Card heading: one line of 32px, the title 18px/600 with the mono eyebrow
   beside it on the left, the actions on the right: hairline buttons and
   one violet primary, 40px in this line. */
.rr-heading, .card-heading { min-height: 32px; margin-bottom: 10px; gap: 16px; }
.rr-heading-links { align-items: baseline; gap: 12px; }
.rr-count, .card-heading .rr-count { font: 500 12px/1.4 var(--font-mono); letter-spacing: .06em;
  text-transform: uppercase; color: var(--secondary); white-space: nowrap; flex: none; }
.card-heading-links .rr-count { margin-left: 4px; }
/* No glyph before a card title: the heading is the title and its eyebrow. */
.card-heading-links > .icon { display: none; }
.rr-heading-right { gap: 10px; flex: none; }
.rr-heading-right .button, .rr-heading-right .button.small, .tph-actions .button, .card-heading > .button, .card-heading > .card-heading-meta .button, .card-heading > form .button, .page-heading-row > .button, .guide-unclear-form .button, .rdmp-foot .button, .cc-fetch .button, .cc-filters .cc-show, .logs-card .log-filter > .button, .list-filters > .button, .guide-foot .button.primary, .assistant-dialog .assistant-actions .button, .form-section-head > .button, .card.spotlight > .button { min-height: 40px; font: 600 14px/1 var(--font-sans); }
.rr-heading-right .button, .rr-heading-right .button.small, .tph-actions .button, .card-heading > .button, .card-heading > .card-heading-meta .button, .card-heading > form .button, .page-heading-row > .button, .guide-unclear-form .button, .rdmp-foot .button, .cc-fetch .button, .cc-filters .cc-show, .logs-card .log-filter > .button, .list-filters > .button, .form-section-head > .button, .card.spotlight > .button { padding: 0 16px; }
.rr-heading-right .button.small, .guide-unclear-form .button {
  color: var(--ink); background: var(--card); border: 1px solid var(--hairline); }
.rr-heading-right .button.small:hover, .card-heading > .button.small:hover { background: var(--canvas); }
.card-heading .card-sub { font-size: 12px; color: var(--secondary); }

/* Filter bar: one row with a gap of 10px; the search field takes what is
   left, the filters are drawn as buttons of 40px with a hairline, the
   label in ink 14px/600 and a small caret. All the same height and radius. */
.filter-bar { gap: 10px; align-items: center; margin-bottom: 14px; }
.filter-bar.rr-filters { gap: 10px; }
.rr-search { flex: 1 1 240px; min-width: 200px; }
.rr-search .doc-entry, .filter-bar > input[type="search"].doc-entry, .filter-bar > .doc-entry[type="search"],
.filter-bar > label > input[type="search"].doc-entry {
  height: 40px; min-height: 40px; font: 400 14px/38px var(--font-sans); color: var(--ink);
  background: var(--card) !important; border: 1px solid var(--hairline) !important; border-radius: var(--r-control);
  padding: 0 14px; }
.rr-search .doc-entry { padding-right: 40px; }
.filter-bar > input[type="search"].doc-entry { flex: 1 1 240px; min-width: 200px; width: auto; }
.rr-search .doc-entry::placeholder, .filter-bar > input[type="search"].doc-entry::placeholder { color: var(--secondary); }
.filter-bar select.rr-filter, .filter-bar > select.doc-entry, .filter-bar > label > select.doc-entry, select.tph-select {
  height: 40px; min-height: 40px; padding: 0 34px 0 14px; font: 600 14px/38px var(--font-sans) !important;
  color: var(--ink); background-color: var(--card) !important; border: 1px solid var(--hairline) !important;
  border-radius: var(--r-control); appearance: none; -webkit-appearance: none; cursor: pointer; flex: none; max-width: 100%;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232F3349' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important; background-position: right 10px center !important; background-size: 16px 16px !important; }
.filter-bar select.rr-filter:hover, .filter-bar > select.doc-entry:hover, select.tph-select:hover { border-color: var(--rule) !important; }
.filter-bar select.rr-filter.active { border-color: var(--violet) !important; color: var(--violet-text);
  background-color: var(--violet-tint) !important; }
.rr-clear { font: 600 14px/1 var(--font-sans); }
:root[data-theme="dark"] .filter-bar select.rr-filter, :root[data-theme="dark"] .filter-bar > select.doc-entry, :root[data-theme="dark"] select.tph-select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23F3F4F8' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important; }

/* Score: a 10px square with the level word, an arrow, the residual after it. */
.data-table .rr-score { white-space: normal; }
/* The score cell stacks: the inherent level, an arrow down, the residual. */
.rr-score-line { display: inline-flex; flex-direction: column; align-items: flex-start; gap: 2px; }
.rr-level { display: inline-flex; align-items: center; font: 600 14px/1.4 var(--font-sans); color: var(--ink); gap: 8px; white-space: nowrap; }
.rr-level.rest { font-weight: 400; }
.rr-arrow { display: block; font-size: 14px; line-height: 1; padding: 0 0 0 1px; color: var(--secondary); }
/* A status that changes from the row: a small dropdown button, 32px, hairline, caret. */
.data-table select, .data-table select.doc-entry, .data-table select.doc-entry.compact, .data-table .rule-form select,
.data-table .rr-status select {
  height: 32px; min-height: 32px; line-height: 30px; padding: 0 28px 0 10px; font: 600 13px/30px var(--font-sans);
  color: var(--ink); background-color: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-control);
  cursor: pointer; }
.data-table select:hover { border-color: var(--rule); }
.data-table .button, .data-table .button.small { min-height: 28px; padding: 0 10px; font-size: 12px; color: var(--ink);
  background: var(--card); border: 1px solid var(--hairline); white-space: nowrap; }
.data-table .button.danger, .data-table .button.small.danger { color: var(--red-text); border-color: var(--red-tint); }
/* The footer under a register: 13px, the count in mono. */
.rr-footer { font-size: 13px; color: var(--secondary); margin-top: 10px; }

@media print { .tabbar .tab.active { background: none; color: var(--ink); text-decoration: underline; } }

/* ---- Risks, 16 September: the calculated residual, the impact per aspect,
   the relations between risks and the cost-benefit view. */
.rcalc-line { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: 0; font-size: 14px; color: var(--ink); }
.rcalc-line .rcalc-arrow { color: var(--secondary); }
.rr-aspects { font: 500 12px/1.4 var(--font-mono); letter-spacing: .04em; color: var(--body); }
.rn-aspects { flex-wrap: wrap; }
.rrel-form { margin-top: var(--s-3); }
/* ---- Compliance over time (dashboard tile compliance_trend, templates/_dashboard_compliance_trend.html) ----
   The risk trend's card with one line per framework in the palette's series
   colours, two toggles in the heading (weeks/months, compliance/maturity)
   drawn as 28px hairline pills, the active one violet. */
.compliance-trend .ctrend-wrap[hidden], .compliance-trend .ctrend-sub[hidden], .compliance-trend .legend-level[hidden],
.compliance-trend .trend-tip th[hidden] { display: none; }
.swatch.series-1, .trend-point.series-1, .trend-stop.series-1 { background: var(--violet); fill: var(--violet); stop-color: var(--violet); }
.swatch.series-2, .trend-point.series-2, .trend-stop.series-2 { background: var(--blue); fill: var(--blue); stop-color: var(--blue); }
.swatch.series-3, .trend-point.series-3, .trend-stop.series-3 { background: var(--teal); fill: var(--teal); stop-color: var(--teal); }
.swatch.series-4, .trend-point.series-4, .trend-stop.series-4 { background: var(--amber); fill: var(--amber); stop-color: var(--amber); }
.swatch.series-rest, .trend-point.series-rest, .trend-stop.series-rest { background: var(--disabled); fill: var(--disabled); stop-color: var(--disabled); }
.trend-line.series-1 { stroke: var(--violet); } .trend-line.series-2 { stroke: var(--blue); }
.trend-line.series-3 { stroke: var(--teal); } .trend-line.series-4 { stroke: var(--amber); }
.trend-line.series-rest { stroke: var(--disabled); }
.ctrend-toggles { display: inline-flex; gap: 8px; align-items: center; flex: none; }
.ctrend-toggle .button.small { height: 28px; padding: 0 10px; border: 0; border-radius: 0; font: 600 13px/1 var(--font-sans); white-space: nowrap; }
.ctrend-toggle .button.small + .button.small { border-left: 1px solid var(--hairline); }
.ctrend-toggle .button.small.active { background: var(--violet); color: #fff; }
@media (max-width: 640px) {
  .compliance-trend .ctrend-toggles { flex: 1 1 100%; }
}

/* The "Stored values" switch of a console user in a customer view (top bar,
   docs/FLOWS.md 6.9): a 28px inline control beside the language select, the
   storage glyph, the label and the state. On, it fills violet like an active
   pill; at elevated level it is disabled, because there is nothing to switch. */
.raw-switch-form { display: inline-flex; margin: 0; }
.raw-switch { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 8px;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card);
  color: var(--secondary); font: 600 12px/1 var(--font-sans); cursor: pointer; white-space: nowrap; flex: none; }
.raw-switch .icon { width: 16px; height: 16px; }
.raw-switch:hover:not(:disabled) { color: var(--ink); background: var(--canvas); }
.raw-switch:disabled { cursor: not-allowed; opacity: .55; }
.raw-switch-state { font: 600 11px/1 var(--font-mono); text-transform: uppercase; letter-spacing: .04em;
  padding: 3px 5px; border-radius: var(--r-badge); background: var(--canvas); color: var(--secondary); }
.raw-switch.on:hover:not(:disabled) { background: var(--violet-hover); color: #fff; }
.raw-switch.on .raw-switch-state { background: rgba(0,0,0,.2); color: #fff; }
@media (max-width: 640px) { .raw-switch-label { display: none; } }

/* A stored value on the page (core/sensitive.py stored, the {% g %} tag with
   the switch on): the text as it stands in the database in mono, escaped,
   wrapping anywhere because ciphertext has no spaces, and the pill "stored"
   beside it. Never a decrypted value: this reader has no key. */
.stored { display: inline-flex; align-items: baseline; gap: 6px; max-width: 100%; min-width: 0; vertical-align: middle; }
.stored-value { font: 12px/1.5 var(--font-mono); color: var(--ink); min-width: 0; overflow-wrap: anywhere; word-break: break-all; }

/* Requirements filter on the product overview (console) */
.prod-filters { margin: 0 0 12px; }
.prod-block[hidden] { display: none; }

/* Obligations library: the applicability fold on the form, the facts card
   and the demands page (console, core/views_library_obligations.py), and
   the preview on the portal's adopt page (core/views_registers.py
   obligations_library). */
.obld-fold { margin: 12px 0 0; }
.obld-fold > .form-grid.cols-2 { max-height: none; padding-top: 0; }
.obld-facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 8px 16px; margin: 0; }
.obld-facts dt { font: 600 11px/1.6 var(--font-mono); text-transform: uppercase; letter-spacing: .04em; color: var(--secondary); white-space: nowrap; }
.obld-facts dd { margin: 0; min-width: 0; font-size: 13px; line-height: 1.5; color: var(--ink); overflow-wrap: anywhere; }
.card-heading-actions { display: flex; align-items: center; gap: 8px; flex: none; }
.obld-preview { margin: 6px 0 0; }
.obld-preview > summary::-webkit-details-marker { display: none; }
.obld-preview ul { margin: 6px 0 0; padding: 0; list-style: none; display: grid; gap: 6px; }
.obld-preview li { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 2px 8px; align-items: baseline; font-size: 12px; line-height: 1.5; }
.obld-preview li .pill { grid-row: span 2; }
.obld-preview li .card-sub { grid-column: 2; }
.obld-line { font-size: 12px; line-height: 1.5; color: var(--secondary); margin-top: 2px; }

/* Obligation demands (core/tenantdata_obligation_demands.py): the Demands
   card on an obligation's page, the summary strip, the context fold, the
   mark control in a row and the "Asked by" chips on the item pages. */
.obdm-strip { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 10px 0 0; min-height: 34px; }
.obdm-strip .card-sub { margin: 0; }
.obdm-sync { white-space: nowrap; }
.obdm-context { margin: 10px 0 0; }
.obdm-context > summary { cursor: pointer; list-style: none; display: flex; align-items: center; gap: 8px; min-height: 32px; }
.obdm-context > summary::-webkit-details-marker { display: none; }
.obdm-context[open] > summary { margin-bottom: 8px; }
.obdm .table-wrap { margin-top: 10px; }
.obdm-guidance { margin-top: 4px; }
.obdm-guidance > summary, .obld-preview > summary { cursor: pointer; list-style: none; font: 600 12px/1.6 var(--font-sans); color: var(--violet-text); }
.obdm-guidance > summary::-webkit-details-marker { display: none; }
.obdm-guidance p { margin: 6px 0 0; font-size: 13px; line-height: 1.5; color: var(--ink); }
.obdm-actions { white-space: nowrap; }
.obdm-actions .button { margin-right: 6px; }
.obdm-mark { display: inline-block; vertical-align: middle; }
.obdm-mark > summary { list-style: none; display: inline-flex; cursor: pointer; }
.obdm-mark > summary::-webkit-details-marker { display: none; }
.obdm-mark[open] > summary { margin-bottom: 6px; }
.obdm-mark .rule-form { flex-wrap: wrap; }
.obdm-mark .rule-form input.doc-entry { width: 200px; height: 32px; font-size: 13px; }
.obdm-empty, .member-panel-empty, .mr-empty { display: flex; align-items: center; gap: 10px; min-height: 40px; color: var(--secondary); font-size: 14px; }
.obdm-empty { margin-top: 10px; }
.obdm-empty .icon { width: 20px; height: 20px; color: var(--disabled); flex: none; }

/* Obligation instructions (core/tenantdata_obligation_demands.py phase 3):
   the Instructions card of an obligation, the procedure card of an item. */
.obin-group { margin-top: 12px; }
.obin-group-head { display: flex; align-items: center; gap: 10px; min-height: 28px; flex-wrap: wrap; }
.obin-group-head .rr-title { font: 600 15px/1.3 var(--font-sans); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.obin-group-head .card-sub { margin: 0; }
.obin-steps { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.obin-step { border: 1px solid var(--hairline); border-radius: var(--r-card); padding: 12px 14px; background: var(--card); }
.obin-step-line { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; min-height: 28px; }
.obin-step-line .rr-title { font: 600 15px/1.3 var(--font-sans); flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.obin-step-line .chip { white-space: nowrap; flex: none; }
.obin-instruction { margin: 8px 0 0; font-size: 14px; line-height: 1.5; color: var(--ink); }
.obin-content { margin-top: 8px; }
.obin-content ul, .obdu-table .obdm-guidance ul { margin: 4px 0 0; padding-left: 18px; font-size: 13px; line-height: 1.5; }
.obin-meta { display: flex; flex-wrap: wrap; gap: 6px 18px; margin-top: 8px; }
.obin-meta .card-sub { margin: 0; }
.obin-meta .eyebrow { margin-right: 4px; }
.obin-done { margin-top: 10px; flex-wrap: wrap; }
.obin-done input.doc-entry { width: 280px; max-width: 100%; height: 32px; font-size: 13px; }
.obin-closed { display: block; margin-top: 8px; }
/* the gate (docs/FLOWS.md 7.17): one line above the instruction list until the obligation acts */
.obin-gate { display: flex; align-items: center; gap: 10px; min-height: 40px; margin-top: 10px; padding: 0 12px; border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--table-head); font-size: 14px; color: var(--ink); }
.obin-clock { margin: 8px 0 0; }
/* the duties card: one row per notification duty an acting obligation asks of a register */
.obdu .table-wrap { margin-top: 10px; }
.obdu-table .rr-id { white-space: nowrap; }
.obin-open-steps { margin-top: 8px; }
.chip.danger { background: var(--red-tint); color: var(--red-text); }
.chip.subtle { opacity: .7; }
.obin-log { margin-top: 12px; }
.obin-log > summary { cursor: pointer; list-style: none; display: flex; align-items: center; gap: 8px; min-height: 32px; }
.obin-log > summary::-webkit-details-marker { display: none; }
.obin-pill { margin-left: 4px; }


/* ---------------------------------------------------------------------
   Accessibility (WCAG 2.1 AA, 2026-09-17). The design is the same; these
   are the rules that make it hold for a keyboard, a screen reader, a
   zoomed page and a colour-blind reader. docs/FLOWS.md 9, CLAUDE.md 23.
   --------------------------------------------------------------------- */

/* A form field is identified by its border: 3:1 against the card and the
   canvas (--field-rule), where the hairline stood at 1.3:1. Cards, tables
   and buttons keep the hairline; they carry text and need no boundary. */
.doc-entry, .form input:not([type="checkbox"]):not([type="radio"]):not([type="file"]),
.form select, .form textarea, .rule-form input:not([type="file"]), .rule-form select,
.form-field input, .form-field select, .form-field textarea, .language-picker, select.doc-entry,
.filter-bar .doc-entry, .filter-bar select.rr-filter, .tree-search, .link-pane, .search-field {
  border-color: var(--field-rule); }
.filter-bar .doc-entry { border: 1px solid var(--field-rule); }
input[type="checkbox"].toggle { border: 1px solid var(--field-rule); }
input[type="checkbox"].toggle:checked { border-color: var(--violet); }

/* A page whose title is the heading of its first card: an <h1> drawn as
   the card heading, so that every page has exactly one <h1>. */
.card-heading h1.card-title, .rr-heading-links h1.card-title, h1.card-title { margin: 0; }
.card-heading h1.card-title, .rr-heading-links h1.card-title, h1.card-title { letter-spacing: 0; }
.setting-heading h1.card-title { margin: 0 0 var(--s-2); }

/* Skip link: the first focusable element of every page, visible on focus
   only, and it lands on <main id="content">. */
.skip-link { position: absolute; left: 20px; top: -100px; z-index: 100; padding: 0 var(--s-4);
  min-height: 40px; display: inline-flex; align-items: center; border-radius: var(--r-control);
  background: var(--violet); color: #fff; font: 600 14px/1 var(--font-sans); text-decoration: none; }
.skip-link:focus, .skip-link:focus-visible { top: 8px; }
main:focus { outline: none; }

@media print { .skip-link { display: none; } }

/* Text for assistive technology only: the word beside a colour, the name
   of an icon-only control, the count behind a dot. */
.sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

/* A field in error says so in words (.form-error, or the message on top of
   the page); the red border alone is not enough. */
[aria-invalid="true"] { border-color: var(--red-text); }

.side-nav-item:focus-visible, .side-group-heading:focus-visible, .top-menu-item:focus-visible { outline-offset: -2px; }

/* Reflow: at 320px nothing needs a horizontal scroll but a table in its
   own scroll container; the filter row wraps, buttons wrap, the page
   heading stacks. */
@media (max-width: 480px) {
  .filter-bar, .rr-filters, .card-actions, .rr-heading, .rr-heading-right, .page-heading { flex-wrap: wrap; }
  .rr-filters .doc-entry, .rr-search { width: 100%; min-width: 0; }
  .card-actions .button, .rr-heading-right .button { max-width: 100%; }
  .content, .main .content { padding: var(--s-3); }
}

/* Motion: nothing moves for a reader who asked for calm; the loading ring
   still turns because it is the only signal that something is under way. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition: none !important; animation: none !important; scroll-behavior: auto !important; }
}

/* Linked documents: the Browse row under the Lives-in select */
.xdoc-browse { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: -4px 0 8px; }

/* The Report button in the top bar (core/portal_nav.py report_button,
   templates/base.html): a 28px hairline button to the right of the domain
   picker, always in the same place; on a narrow screen it follows the
   picker into the menu block. */
/* The Report button in the top bar: violet, the picker's 40px (the rule outranks .button.small). */
.button.small.top-report { white-space: nowrap; flex: none; font-weight: 600; min-height: 40px; height: 40px; padding: 0 var(--s-4); font-size: 14px;
  background: var(--violet); color: #fff; border-color: var(--violet); }
.button.small.top-report:hover { background: var(--violet-hover, var(--violet)); color: #fff; }
.sidebar-domain .top-report { margin-top: 8px; }
/* A record picker inside a scrolling table: while its list is open the
   wrap lets it out instead of clipping it. */
.table-wrap:has(.record-picker .link-items:not([hidden])) { overflow: visible; }

/* How requirements work (templates/_requirements_explained.html, the
   Requirements tab of the frameworks page, docs/FLOWS.md 7.25): the six
   steps as 8px rows with a 24px number tile, two inline SVG diagrams that
   take their colours from the tokens (so the dark theme holds), the legend
   of the scope diagram and the reach of the set as stat cards. Nothing here
   is screen-height; the diagrams scale with their column and stop at 520px. */
.rqx-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.rqx-step { display: flex; align-items: flex-start; gap: 10px; min-width: 0; }
.rqx-n { flex: none; width: 24px; height: 24px; border-radius: var(--r-control); background: var(--violet-tint);
  color: var(--violet-text); font: 600 12px/24px var(--font-mono); text-align: center; }
/* a step's text, and the "?" help's lines (FLOWS 7.423) */
.rqx-step > div, .help-tip-text { min-width: 0; font: 400 13px/1.5 var(--font-sans); color: var(--body); }
.rqx-step strong { color: var(--ink); font-weight: 600; }
.rqx-where { color: var(--secondary); font-size: 12px; }
.rqx-figures { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px; align-items: start; margin-top: 16px; }
.rqx-figure { margin: 0; min-width: 0; }
.rqx-figure figcaption { font: 500 12px/1.4 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; color: var(--secondary); margin-bottom: 8px; }
.rqx-figure svg { display: block; width: 100%; max-width: 520px; height: auto; font-family: var(--font-sans); }
.rqx-box { fill: var(--card); stroke: var(--rule); stroke-width: 1; }
.rqx-box.tint { fill: var(--violet-tint); stroke: var(--violet); }
.rqx-box.violet { fill: var(--violet); stroke: var(--violet); }
.rqx-region { fill: var(--violet-tint); stroke: var(--violet); stroke-width: 1; stroke-dasharray: 4 3; }
.rqx-title { fill: var(--ink); font: 600 12px var(--font-sans); }
.rqx-sub { fill: var(--body); font: 400 11px var(--font-sans); }
.rqx-code { fill: var(--body); font: 500 11px var(--font-mono); }
.rqx-mono { font-family: var(--font-mono); font-weight: 500; }
.rqx-eyebrow { fill: var(--body); font: 500 10px var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }
.rqx-title.on-violet, .rqx-sub.on-violet { fill: #fff; }
.rqx-glyph { color: var(--body); }
.rqx-glyph.violet { color: var(--violet-text); }
.rqx-glyph.on-violet { color: #fff; }
.rqx-line { fill: none; stroke: var(--rule); stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.rqx-line.violet { stroke: var(--violet); }
.rqx-line.dashed { stroke: var(--violet); stroke-dasharray: 4 3; }
.rqx-arrow { fill: var(--violet); }
.rqx-out .rqx-box { fill: var(--canvas); stroke: var(--disabled); stroke-dasharray: 4 3; }
.rqx-out .rqx-title, .rqx-out .rqx-sub, .rqx-out .rqx-code { fill: var(--secondary); }
.rqx-legend { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 4px;
  font: 400 12px/1.5 var(--font-sans); color: var(--body); }
.rqx-legend li { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
.rqx-swatch { flex: none; width: 12px; height: 12px; margin-top: 3px; border-radius: var(--r-badge); border: 1px solid var(--violet); background: var(--violet-tint); }
.rqx-swatch.out { border: 1px dashed var(--disabled); background: var(--canvas); }
.rqx-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 14px; align-items: start; }
.rqx-stats > .card.stat { height: auto; min-height: 72px; }
/* No meter and no icon tile in these four: the space kept for one goes to the words. */
.rqx-stats .card.stat .stat-rule, .rqx-stats .card.stat .stat-heading { padding-right: 0; }
/* On a phone the eyebrow drops under the title instead of running out of the card. */
.rqx .rr-heading-links { flex-wrap: wrap; row-gap: 2px; }
.rqx-note { margin: 8px 0 0; }
:root[data-theme="dark"] .rqx-box.violet { fill: var(--violet); }
:root[data-theme="dark"] .rqx-out .rqx-box { stroke: var(--secondary); }

/* The mark of a framework (core/templatetags/framework_marks.py): the short
   name in its colour, in line with the name, never stretched. */
.fw-mark { display: inline-block; vertical-align: middle; flex: none; }

/* The console's proposals (templates/console/library_proposals.html): one
   condensed row per proposal, a hairline between rows, 16px apart. */
.prop-list { display: flex; flex-direction: column; }
.prop-row:first-child { border-top: 0; padding-top: 0; }
.prop-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.prop-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.prop-head .mono { white-space: nowrap; flex: none; }
.prop-text { margin: 0; color: var(--secondary); font-size: 13px; line-height: 1.45; }
.prop-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.prop-form { display: flex; align-items: center; gap: 8px; flex: 1 1 auto; min-width: 0; margin: 0; }
.prop-form input[name="answer"] { flex: 1 1 220px; min-width: 0; }
.prop-remove { margin: 0; flex: none; }

/* The main domain's frameworks on the frameworks page (templates/frameworks.html):
   one 72px row per framework with a hairline between them, the mark 150px
   wide, the description truncating. The library on the Available tab has
   its own cards since 2026-09-26 (.fwl-*, below). */
.fw-library { padding: 0; overflow: hidden; }
.fw-lib-row { display: flex; align-items: center; gap: 16px; min-height: 72px; padding: 12px 16px; border-top: 1px solid #DDE0E8; }
.fw-lib-name { font: 600 16px/1.3 var(--font-sans); color: var(--ink); white-space: nowrap; flex: none; min-width: 200px; }
.fw-lib-text { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--secondary); font-size: 15px; }
.fw-lib-version, .aprog-check-count { flex: none; color: var(--secondary); font-size: 13px; }
.fw-lib-import { flex: none; min-width: 96px; justify-content: center; color: var(--violet-text); border-color: var(--violet); }
.fw-mark.wide { width: 150px; }
/* A framework's logo (its badge) at 56px, its own proportions, also where the wordmark is wide. */
.fw-mark.fw-logo, .fw-mark.fw-logo.wide, .fw-mark.fw-square { width: 56px; height: 56px; object-fit: contain; }
.fw-lib-actions { display: flex; align-items: center; gap: 8px; flex: none; margin: 0; }
.fw-lib-row .stat-meter { flex: none; width: 48px; height: 48px; }
@media (max-width: 720px) {
  .fw-lib-row { flex-wrap: wrap; gap: 8px 12px; }
  .fw-lib-name { min-width: 0; white-space: normal; }
  .fw-lib-text { flex-basis: 100%; white-space: normal; }
}

/* The pager under a long table (templates/base.html): one line, the count
   as an eyebrow on the left, the two hairline buttons on the right. */
tr.paged-out { display: none; }
.table-pager { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.table-pager .eyebrow { flex: 1 1 auto; min-width: 0; }
.table-pager .button { flex: none; }

/* ---- The table (2026-09-26): one component for every list and register ----
   The risk register list's table (templates/_risk_list.html) made general, so
   a table's look is this one block: a violet header of 40px with white 13px/600
   uppercase labels, white rows parted by one hairline, a violet tint on hover,
   the cells top aligned with 15px above and below. The outer columns sit at
   the container's inset: --table-inset is 12px, 16px when the table fills a
   card from edge to edge, 24px in a list card. A row header (tbody th) is the
   violet bar of the header; a foot row (tfoot) the canvas band.
   The cell patterns: .cell-code with .cell-code-sub under it; .cell-title with
   .cell-links or .cell-sub under it; .cell-level (.cell-dot and a word);
   .cell-main or .cell-date with .cell-sub (.cell-late) under it; .cell-word
   with .cell-state; .cell-num for figures; .cell-empty for the one-line empty
   row. The registers' older cell names (.rr-id, .rr-title, .rr-sub, .rr-date,
   .rr-risk, .rr-status, .num, .r) are aliases here until no template uses
   them. A table of its own (the flow step table, the members, the matrix of a
   training) adds a modifier class and its few rules after this block. */
.data-table { --table-inset: 12px; width: 100%; border-collapse: collapse; border-spacing: 0; border: 0; border-radius: 0;
  margin: 0; background: var(--card); font-variant-numeric: tabular-nums; }
/* The side padding is 12px; the outer columns take the inset through
   --cell-l and --cell-r, so a modifier that sets a cell's padding still wins
   the way it always did. */
.data-table > * > tr > * { --cell-l: 12px; --cell-r: 12px; }
.data-table > * > tr > :first-child { --cell-l: var(--table-inset); }
.data-table > * > tr > :last-child { --cell-r: var(--table-inset); }
.data-table > thead > tr { background: var(--table-head-bg); }   /* no seam between the header cells */
.data-table > thead > tr > th { height: 40px; padding: 0 var(--cell-r) 0 var(--cell-l); background: var(--table-head-bg); color: #fff;
  border: 0; font: 600 13px/1 var(--font-sans); font-variant-numeric: tabular-nums; letter-spacing: .04em;
  text-transform: uppercase; text-align: left; vertical-align: middle; white-space: nowrap; }
.data-table > tbody > tr > td { padding: 15px var(--cell-r) 15px var(--cell-l); border: 0; border-bottom: 1px solid var(--hairline);
  vertical-align: top; font: 400 14px/20px var(--font-sans); font-variant-numeric: tabular-nums; color: var(--ink); background: var(--card); }
.data-table > tbody > tr > th { padding: 15px var(--cell-r) 15px var(--cell-l); border: 0; border-bottom: 1px solid rgba(255, 255, 255, .28);
  vertical-align: top; text-align: left; font: 600 14px/20px var(--font-sans); font-variant-numeric: tabular-nums; color: #fff;
  background: var(--table-head-bg); }
/* A pill or code in a row header needs no surface of its own: the violet is the background;
   its second line (.cell-sub, the scope under a name) is white as well. */
.data-table > tbody > tr > th :is(.pill.neutral, .pill, code, .cell-sub) { background: none; border: 0; color: #fff; padding: 0; }
.data-table > tfoot > tr > * { padding: 15px var(--cell-r) 15px var(--cell-l); border: 0; border-top: 1px solid var(--hairline);
  vertical-align: top; font: 600 14px/20px var(--font-sans); font-variant-numeric: tabular-nums; color: var(--ink); background: var(--canvas); }
/* A column that sorts (table sorting, 2026-10-11, static/js/table_sort.js):
   its title is a button in the header, in the header's own type and white,
   with the caret beside it -- both chevrons while it does not sort, one
   pointing down (descending) or up (ascending) when it does. The 40px
   violet header stays as it is; the ring is white on the violet. */
.data-table > thead > tr > th > .th-sort { display: inline-flex; align-items: center; gap: 4px; height: 28px; margin: 0 -4px;
  padding: 0 4px; border: 0; border-radius: var(--r-control); background: none; color: inherit; font: inherit;
  letter-spacing: inherit; text-transform: inherit; white-space: nowrap; cursor: pointer; }
.data-table > thead > tr > th > .th-sort:hover { background: rgba(255, 255, 255, .16); }
.data-table > thead > tr > th > .th-sort:focus-visible { outline: 2px solid #fff; outline-offset: 0; }
.data-table > thead > tr > th > .th-sort .th-sort-caret { width: 14px; height: 14px; flex: none; opacity: .75; }
.data-table > thead > tr > th[aria-sort] > .th-sort .th-sort-caret { opacity: 1; }
.data-table > thead > tr > th[aria-sort="ascending"] > .th-sort .th-sort-caret { transform: rotate(180deg); }
.data-table > tbody > tr:hover > td, .data-table > tbody > tr:target > td { background: var(--violet-tint); }
/* Alternating rows (layout contract: #fff and #F7F8FA), the hover tint still on top. */
.data-table.zebra > tbody > tr:nth-child(even) > td { background: var(--canvas); }
.data-table.zebra > tbody > tr:nth-child(even):hover > td { background: var(--violet-tint); }
.data-table > tbody > tr[data-href] { cursor: pointer; }
.data-table > tbody > tr.group-row > td { padding-top: 6px; padding-bottom: 6px; background: var(--canvas); border-top: 1px solid var(--hairline); }
.data-table > tbody > tr.group-row:hover > td { background: var(--canvas); }
.data-table > tbody > tr > td.cell-empty { color: var(--secondary); }
.data-table :is(th, td):is(.cell-num, .num, .r) { text-align: right; white-space: nowrap; }
/* Where the table sits: edge to edge in a card, and in a list card. */
.card > .table-wrap > .data-table { --table-inset: 16px; }
.list-card .list-wrap > .data-table, .list-card > .data-table { --table-inset: 24px; }
.card > .table-wrap:last-child > .data-table > tbody:last-of-type > tr:last-child > td,
.card > .table-wrap:has(+ .list-foot) > .data-table > tbody:last-of-type > tr:last-child > td,
.list-card .list-wrap > .data-table > tbody:last-of-type > tr:last-child > *,
.list-card > .data-table > tbody:last-of-type > tr:last-child > * { border-bottom: 0; }
@media (max-width: 720px) {
  .list-card .list-wrap > .data-table, .list-card > .data-table { --table-inset: 16px; }
}
@media print {
  .data-table > thead > tr > th { background: var(--ink); color: #fff; }
  .data-table > tbody > tr:hover > td { background: var(--card); }
}
/* A table whose rows open a side panel (.panel-rows; the pre-assessment in
   Rinat's design of 2026-10-04, docs/FLOWS.md 7.228): the cells centred in
   the row, the growing column's facts on one line with an ellipsis, the
   last cell right aligned with a Details button (the panel glyph, hairline,
   violet on hover and focus) that reads Open, filled violet, on the row
   whose panel is open; that row is tinted violet. The audit's Fieldwork
   tints its open row the same way. */
.data-table.panel-rows > tbody > tr > td { vertical-align: middle; }
.data-table.panel-rows > tbody > tr > td.panel-rows-main { width: 100%; max-width: 0; }
.data-table.panel-rows .cell-one-line { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.data-table.panel-rows > tbody > tr > td.actions { text-align: right; }
.data-table.panel-rows a.cell-code { text-decoration: none; }
.data-table.panel-rows a.cell-code:hover { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
.audit-table tr.is-open > td, .data-table.panel-rows > tbody > tr.is-open > td { background: var(--violet-tint); }
.data-table.panel-rows .button.row-details { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 12px;
  font: 600 13px/1 var(--font-sans); vertical-align: middle; }
.data-table.panel-rows .button.row-details .icon { width: 16px; height: 16px; flex: none; }
.data-table.panel-rows .button.row-details:is(:hover, :focus-visible) { background: var(--card); border-color: var(--violet); color: var(--violet-text); }
.data-table.panel-rows .button.row-details.is-open, .data-table.panel-rows .button.row-details.is-open:is(:hover, :focus-visible) {
  background: var(--violet); border-color: var(--violet); color: #fff; }
/* The recorded years of Settings -> Resources (Rinat's design, 2026-10-20): rows of 72px with the cells centred,
   the year in mono 15px/600, the budget and the FTE right aligned in one mono line (15px, tabular figures) with the currency grey before
   the amount and fixed column widths so the figures sit together, who set it with the date in mono under it as the growing column, the status pill last. Its own class: .isok-table is the dashboard's compact top-5 table (iso.css). */
.data-table.isok-years-table > tbody > tr > td { height: 72px; vertical-align: middle; }
.data-table.isok-years-table .isok-col-year { width: 112px; }
.data-table.isok-years-table .isok-col-budget { width: 176px; }
.data-table.isok-years-table .isok-col-fte { width: 88px; }
.data-table.isok-years-table .isok-col-by { padding-left: 40px; min-width: 0; }
.data-table.isok-years-table .isok-col-status { width: 160px; }
.data-table.isok-years-table td.isok-fig { font-variant-numeric: tabular-nums; }
.isok-years-table .isok-cur { color: var(--secondary); }
.isok-years-table .isok-year { font: 600 15px/22px var(--font-mono); }
.isok-years-table .isok-by { overflow: hidden; text-overflow: ellipsis; }
/* The cells. */
.cell-code, .data-table .rr-id { font: 500 13px/20px var(--font-mono); color: var(--ink); white-space: nowrap; }
.cell-code { display: block; }
.cell-code-sub { display: block; margin-top: 1px; font: 400 12px/18px var(--font-mono); color: var(--secondary); white-space: nowrap; }
.rr-sub { color: var(--secondary); }
.data-table .rr-sub, .data-table .rr-id-domain, .data-table.ro-recent .cell-sub .mono { font: 400 12px/18px var(--font-mono); }
.data-table .rr-sub, .data-table .rr-id-domain { color: var(--secondary); }
.cell-title, .rr-title { display: block; font: 600 15px/22px var(--font-sans); color: var(--ink); text-decoration: none;
  overflow-wrap: normal; word-break: normal; hyphens: manual; }
/* The entry's title in a register table (Rinat, 2026-09-26): a fixed
   minimum width, and words wrap whole, never split in pieces.
   Low specificity on purpose: a title that truncates in a flex row keeps its
   own min-width: 0; the fixed-layout tables (flow, schedule) keep theirs. */
:where(.data-table:not(.flow-table, .sch-table, .ntf-defaults) td) :is(.cell-title, .rr-title) { min-width: 240px; }
.rr-id-link { color: var(--ink); }
a.cell-title:hover, .rr-title:hover, .rr-id-link:hover { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
.cell-links { display: block; margin-top: 4px; font: 500 13px/20px var(--font-sans); color: var(--violet-text); }
.cell-links a { color: var(--violet-text); text-decoration: none; white-space: nowrap; }
.cell-links a:hover { text-decoration: underline; text-underline-offset: 2px; }
.cell-links .grp-brand { margin-left: 6px; vertical-align: -3px; }
.cell-main, .cell-date, .data-table .rr-date { font: 500 14px/20px var(--font-sans); color: var(--ink); white-space: nowrap; }
.cell-main, .cell-date { display: block; }
.cell-sub, .ro-matrix-note { font: 400 13px/20px var(--font-sans); color: var(--secondary); }
.cell-sub { display: block; }
.cell-sub.cell-late { color: var(--red-text); }
.cell-sub.cell-soon { color: var(--amber-text); }   /* a deadline this week (FLOWS 7.176) */
.cell-sub.cell-marks { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }   /* small word pills under a cell's lines (FLOWS 7.151) */
.cell-level, .setup-tab .slx-ticks label.tick-mark, .tctl-confirm { display: inline-flex; align-items: center; gap: 8px; font: 500 14px/20px var(--font-sans); color: var(--ink);
  white-space: nowrap; flex: none; }
.setup-tab .slx-ticks label.tick-mark { font-weight: 400; line-height: 1.4; }
.cell-level.cell-sub { display: inline-flex; font: 500 14px/20px var(--font-sans); color: var(--secondary); }
.cell-dot { display: inline-block; flex: none; width: 8px; height: 8px; border-radius: var(--r-badge); background: var(--disabled); }
.cell-dot.lvl-green { background: var(--risk-1); }
.cell-dot.lvl-lightgreen { background: var(--risk-2); }
.cell-dot.lvl-yellow { background: var(--risk-3); }
.cell-dot.lvl-orange { background: var(--risk-4); }
.cell-dot.lvl-red { background: var(--risk-5); }
.cell-dot.lvl-darkred { background: var(--risk-6); }
.cell-dot.lvl-none { background: var(--hairline); }
.cell-dot.lvl-opp1 { background: var(--opp-1); box-shadow: inset 0 0 0 1px var(--opp-3); }
.cell-dot.lvl-opp2 { background: var(--opp-2); }
.cell-dot.lvl-opp3 { background: var(--opp-3); }
.cell-dot.lvl-opp4 { background: var(--opp-4); }
.cell-word { display: flex; align-items: center; gap: 8px; font: 500 14px/20px var(--font-sans); white-space: nowrap; }
.cell-state, .pill .dot { display: inline-block; flex: none; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.cell-word.tone-amber { color: var(--amber-text); }
.cell-word.tone-red { color: var(--red-text); }
.cell-word.tone-green { color: var(--green-text); }
.cell-word.tone-grey { color: var(--secondary); }
/* Audit-ready in the control list (templates/measures.html): three small
   segments, one filled green per criterion met, beside "n/3" in the
   cell-word's tone; the words under it say what is missing. */
.ctl-ready-segs { display: inline-flex; gap: 3px; flex: none; }
.ctl-ready-seg { width: 14px; height: 6px; border-radius: var(--r-badge); background: var(--hairline); }
.ctl-ready-seg.on { background: var(--green); }
.ctl-ready-n { font-family: var(--font-mono); font-size: 13px; }
.data-table .rr-risk { min-width: 260px; }
.data-table .rr-status { min-width: 150px; }
.data-table .card-sub { color: var(--secondary); font-size: 12px; }
.data-table .rr-meta { font-size: 12px; margin-top: 4px; }
.data-table .rr-context, .data-table .rr-treatment { font-size: 14px; color: var(--ink); line-height: 1.45; }
.data-table td.mono, .data-table td .mono, .data-table td code { font-family: var(--font-mono); font-size: 13px; }
.data-table td code { background: none; border: 0; padding: 0; color: var(--ink); }
.rr-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
/* The line under a pill or a value: 13px sans in the mid grey (a date, a name, "not sent"). */
.rr-line, .rr-none { display: block; margin-top: 6px; font: 400 13px/1.4 var(--font-sans); color: var(--secondary); }
.rr-line.mono { font-family: var(--font-mono); font-size: 12px; }
/* Score: the inherent pill, an arrow, the residual pill or the grey words. */
.rr-inline { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; }
.rr-inline .rr-arrow { display: inline; padding: 0; }

/* A table fills its card from edge to edge (2026-09-19): the wrap cancels
   the card's 16px padding on the sides and, when the table is the last
   thing in the card, at the bottom; the header then meets the card's border.
   Only tables: nothing else in a card moves. */
.card > .table-wrap { margin-left: -16px; margin-right: -16px; }
.card > .table-wrap:last-child { margin-bottom: -16px; }
/* The foot band of a list (templates/_list_foot.html) under such a table
   runs edge to edge as well, its words on the table's 16px inset, and
   closes the card when it is the last thing in it. */
.card:not(.list-card) > .table-wrap + .list-foot { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; }
.card:not(.list-card) > .table-wrap + .list-foot:last-child { margin-bottom: -16px; border-radius: 0 0 var(--r-card) var(--r-card); }
.card.fw-library { padding: 0; }

/* ---- The risk page (IT and OT) as the product owner's mock-up of 2026-09-20 ----
   The heading is one line: the mono id, the title, Back to register on the
   right. Two columns: the three form cards on the left (a six-column grid
   inside: a field takes three, a third takes two, a wide one all six), the
   sticky Risk state card on the right with a violet header bar like a
   table's and its parts parted by hairlines, and the page's one Save. The
   form is display: contents, so the columns are the grid's own children and
   the cards below the form stay in the left column. Under 960px the columns
   stack, the state card first. Labels 14px/600 in ink, fields 40px. */
.risk-page-heading { flex-direction: row; align-items: baseline; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.risk-page-heading h1 { min-width: 0; }
.risk-layout { display: grid; grid-template-columns: minmax(0, 1fr) 400px; grid-template-rows: auto auto; gap: 16px 24px; align-items: start; }
.risk-layout > .risk-form { display: contents; }
.risk-main, .risk-rest { grid-column: 1; display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.risk-main { grid-row: 1; }
.risk-rest { grid-row: 2; }
.risk-rest:empty { display: none; }
.risk-state { grid-column: 2; grid-row: 1 / -1; position: sticky; top: 20px; min-width: 0; }
.risk-page .card { padding: 16px; }
.risk-page .card-heading { margin-bottom: 14px; }
.risk-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 16px 20px; }
.risk-grid > .form-field { grid-column: span 3; }
.risk-grid > .field-third { grid-column: span 2; }
.risk-grid > .form-wide { grid-column: 1 / -1; }
.risk-page .form-label .eyebrow { margin: 0; }
.risk-page .form-label .rp-label-link { margin-left: auto; }
.risk-page .doc-entry { border-color: var(--field-rule); border-radius: var(--r-control); }
.risk-page textarea.doc-entry.short { min-height: 40px; height: 40px; line-height: 22px; padding: 8px 12px; resize: vertical; }
.risk-page .link-pane { min-height: 40px; padding: 3px 8px; gap: 6px; border-color: var(--field-rule); }
.risk-page .link-pane .chip { height: 30px; }
.risk-page .link-pane .link-pane-entry { flex: 1 1 100px; min-width: 100px; height: 32px; }
/* The cards under the form keep their heading on one line in the narrower column. */
.risk-rest .card-heading-links h2 { white-space: nowrap; }
/* The consequence toggles: one row of pills, the chosen ones violet with white text, the rest a hairline outline. */
.risk-ticks { display: flex; flex-wrap: wrap; gap: 8px; }
.risk-tick { position: relative; display: inline-flex; align-items: center; min-height: 36px; padding: 0 16px; cursor: pointer;
  border: 1px solid var(--field-rule); border-radius: var(--r-full); background: var(--card); font: 500 14px/1 var(--font-sans); color: var(--ink);
  white-space: nowrap; flex: none; }
.risk-tick input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; pointer-events: none; }
.risk-tick > span { display: inline-block; }
.risk-tick > span::first-letter { text-transform: uppercase; }
.risk-tick:hover { border-color: var(--violet); }
.risk-tick:has(input:checked) { background: var(--violet); border-color: var(--violet); color: #fff; font-weight: 600; }
.risk-tick:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
/* A field with a unit inside it, on the right: the currency of a cost. */
.field-suffix { position: relative; display: block; min-width: 0; }
.field-suffix .doc-entry { padding-right: 56px; -moz-appearance: textfield; appearance: textfield; }
.field-suffix .doc-entry::-webkit-outer-spin-button, .field-suffix .doc-entry::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.field-suffix .suffix { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); pointer-events: none;
  font: 500 13px/1 var(--font-mono); color: var(--secondary); }
/* The legacy control text with its Convert beside it. */
.rp-legacy { flex-wrap: nowrap; gap: 8px; }
.rp-legacy .doc-entry { flex: 1 1 auto; min-width: 0; }
.rp-legacy .button { flex: none; min-height: 40px; }
/* The Risk state card. */
.risk-page .risk-state-card { padding: 0; overflow: hidden; }
.risk-state-body { padding: 0 16px 16px; display: flex; flex-direction: column; }
.rs-part { display: flex; flex-direction: column; gap: 8px; padding: 14px 0; border-bottom: 1px solid var(--hairline); min-width: 0; }
.rs-part:has(+ .rs-actions) { border-bottom: 0; }
.rs-line.mono { font-family: var(--font-mono); font-size: 12px; }
.rs-line:empty { display: none; }
.rs-origins { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.rs-origins:not(:has(*)) { display: none; }
.rs-pills { flex-wrap: wrap; white-space: normal; row-gap: 6px; }
.rs-pills .rr-arrow { display: inline; padding: 0; }
.rs-decision { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.rs-dates { flex-direction: row; gap: 16px; }
.rs-dates > div { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.rs-dates .mono, .call-slot-time, .call-when-time { font: 500 14px/1.4 var(--font-mono); color: var(--ink); }
.risk-state .rs-actions { margin-top: 16px; gap: 12px; }
.risk-state .rs-actions .button[type="submit"] { flex: 1 1 auto; min-height: 40px; }
.risk-state .rs-actions .button.small { min-height: 40px; text-decoration: none; }
@media (max-width: 960px) {
  .risk-layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: none; }
  .risk-main, .risk-rest, .risk-state { grid-column: 1; grid-row: auto; }
  .risk-state { order: -1; position: static; }
}
@media (max-width: 640px) {
  .risk-grid > .form-field, .risk-grid > .field-third { grid-column: 1 / -1; }
  .rs-dates { flex-direction: column; }
}

/* A chip's title as a link to the record it names (2026-09-20): ink, underlined on hover. */
.chip .chip-link { color: inherit; text-decoration: none; }
.chip .chip-link:hover { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
/* The toggle carries its box (2026-09-20): a 22px rounded square before the
   word -- hairline and white when off; white with a violet tick on the
   violet pill when on. The box is drawn, the real checkbox stays hidden. */
.risk-tick { gap: 10px; padding: 0 18px 0 12px; min-height: 40px; font-size: 15px; }
.risk-tick::before { content: ""; display: inline-block; width: 22px; height: 22px; flex: none; box-sizing: border-box;
  border: 2px solid #C9CCD8; border-radius: 6px; background: #fff; }
.risk-tick:has(input:checked)::before { border-color: #fff; background: #fff center / 14px 14px no-repeat
  url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236456EE' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='5 12.5 10 17.5 19 7'/></svg>"); }
:root[data-theme="dark"] .risk-tick::before { background: var(--card); border-color: var(--field-rule); }
/* Compact and square (2026-09-20): the buttons' 4px radius, 32px tall, 14px. */
.risk-tick { border-radius: var(--r-control); min-height: 32px; padding: 0 12px 0 8px; gap: 8px; font-size: 14px; }
.risk-tick::before { width: 18px; height: 18px; border-radius: 4px; }
.risk-tick:has(input:checked)::before { background-size: 12px 12px; }

/* A picture in a document section (2026-09-20: a diagram from a Word import): never wider than its column. */
.doc-section img, .doc-editor img, .doc-body img, .document-content img { max-width: 100%; height: auto; display: block; margin: 8px 0; }

/* Process flows (core/flow_svg.py, 2026-09-20): the drawing fills its card
   edge to edge like a table, scaled by its viewBox; it reads the tokens of
   both themes through var() inside the SVG. */
/* The drawing of a flow (core/flow_svg.py): 16px around it, no taller than
   --flow-max-height (420px; 360px inside a document), centred; the SVG's own
   min-width keeps its text legible and the figure scrolls sideways instead. */
.flow-figure { margin: 0; }
.flow-figure .flow-svg-box { padding: 16px; overflow-x: auto; overflow-y: hidden; }
.flow-figure svg { display: block; }
.flow-figure figcaption { padding: 8px 12px; border-top: 1px solid var(--hairline); }
.flow-figure.full { --flow-max-height: 100000px; }
.doc-flow-figure { margin: 0 0 16px; --flow-max-height: 360px; }
/* Inside a document the drawing's own min-width (the SVG keeps its text
   legible, core/flow_svg.py) must not widen the sheet: the read page is a
   flex item sized to its content, and without containment the SVG's
   576px pushed the whole page past a phone's width (2026-09-21). With it
   the box takes the column and the SVG scrolls inside, as designed. */
.doc-flow-figure .flow-svg-box { contain: inline-size; }
.flow-open-full { white-space: nowrap; flex: none; font-size: 12px; }
.flow-legend { display: flex; align-items: center; gap: 6px; margin-top: 8px; }
.flow-legend-amber { display: inline-block; width: 2px; height: 14px; background: var(--amber-text); flex: none; }
/* A flow placed in a document (docs/FLOWS.md 7.28): the card the editor
   draws inside the marker, the block the read page draws in its place. */
.cisoly-flow { display: block; }
.flow-card { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 12px; min-height: 40px; padding: 8px 12px;
             border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--canvas); color: var(--body);
             font-size: 13px; line-height: 1.3; user-select: none; }
.flow-card > .icon, .obin-gate .icon, .soly-empty .icon, .sot-empty .icon, .dcm-empty .icon, .srun-empty .icon { width: 20px; height: 20px; flex: none; color: var(--violet-text); }
.flow-card-text { flex: 1 1 200px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); }
.flow-card-text b { font-weight: 600; }
.flow-card .toggle-row-small, .toggle-row-small.chg-switch { min-height: 28px; font-size: 12px; gap: 6px; white-space: nowrap; flex: none; }
.flow-card .toggle-row-small .toggle, .chg-switch.toggle-row-small .toggle { width: 32px; height: 18px; flex: 0 0 32px; }
.flow-card .toggle-row-small .toggle::after, .chg-switch.toggle-row-small .toggle::after { width: 14px; height: 14px; top: 2px; left: 2px; }
.flow-card .toggle-row-small .toggle:checked::after, .chg-switch.toggle-row-small .toggle:checked::after { transform: translateX(14px); }
.flow-card-open { white-space: nowrap; flex: none; }
.flow-card .chip-x { flex: none; font-size: 18px; color: var(--secondary); padding: 0 2px; }
.flow-card .chip-x:hover { color: var(--red-text); }
.flow-card.retired { opacity: .7; }
/* The library template's two switches (console, the details form): stacked, one per line. */
.flow-defaults { gap: 0; }
.flow-defaults .toggle-row { min-height: 36px; }
.flow-defaults .card-sub { margin: 2px 0 0; }
.doc-flow-block { margin: 12px 0; }
.doc-flow-block.retired .flow-figure, .doc-flow-block.retired .flow-table-wrap,
.flow-retired .flow-figure { opacity: .55; filter: grayscale(1); }
.doc-flow-notice { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; min-height: 40px; padding: 8px 12px; margin: 0 0 8px;
                   border: 1px solid var(--hairline); border-left: 3px solid var(--amber-text); border-radius: var(--r-card); background: var(--canvas);
                   font-size: 13px; color: var(--body); }
.doc-flow-notice > .icon { width: 18px; height: 18px; flex: none; color: var(--amber-text); }
.doc-flow-notice-text { flex: 1 1 240px; min-width: 0; }
.doc-flow-notice-text .rr-sub { display: block; }
.doc-flow-notice-card { padding: 0; border: none; background: none; }
.doc-flow-notice-card .doc-flow-notice { margin: 0; }
.inline-form { display: inline; }
.flow-table-wrap { margin: 0 0 8px; }
/* the step table inside a document: denser than a register, the text wraps.
   The selector outweighs the table's `.data-table > * > tr > *` (15px 12px),
   which used to win and gave the cells a register's padding (2026-09-21). */
.flow-table th, .flow-table td, .data-table.flow-table > tbody > tr > td { padding: 8px 10px; font-size: 13px; line-height: 1.4; vertical-align: top; white-space: normal; }
/* On the document's read page the table fills the sheet edge to edge, the
   way a register table fills its card (the wrap cancels the sheet's padding
   on the sides; no corner radius on the table then). The product owner's
   "very small table" of 2026-09-21: the sheet is a 760px column and the
   table sat 40px inside it on each side. */
.read-page .flow-table-wrap { margin-left: -40px; margin-right: -40px; }
@media (max-width: 760px) { .read-page .flow-table-wrap { margin-left: -1.2rem; margin-right: -1.2rem; } }
/* the header of the step table is the document's, not a register's: white,
   bold 14px labels in the text colour, a 2px rule above and a hairline under
   (the selector outweighs the table head's `.data-table > thead > tr > th`) */
.data-table.flow-table > thead > tr > th, .data-table.flow-table > thead > tr > th:first-child, .data-table.flow-table > thead > tr > th:last-child {
  background: var(--card); color: var(--ink); font: 600 14px/20px var(--font-sans); text-transform: none; letter-spacing: 0;
  border: 0; border-top: 2px solid var(--ink); border-bottom: 1px solid var(--hairline); border-radius: 0; height: 40px; padding: 8px 10px; }
.data-table.flow-table > tbody > tr:hover > td { background: var(--card); }
.data-table.flow-table { table-layout: fixed; }   /* Activity takes what the fixed columns leave */
.flow-table .flow-th-n { width: 40px; }
.flow-table .flow-th-actor { width: 16%; }
.flow-table .flow-th-io { width: 15%; }
.flow-table .flow-th-next { width: 18%; }
.flow-next-list { display: flex; flex-direction: column; gap: 2px; }
.flow-next-step { white-space: normal; }
.flow-next-step > .mono { margin-right: 4px; }
.flow-table tr { min-height: 0; }
.flow-table .rr-title { font-size: 13px; }
.flow-table .rr-meta { margin-top: 2px; }
/* On a phone the table is one column: every row a block, each cell on its
   own line with the column's name before it (data-label), the header row
   kept for a screen reader; nothing scrolls sideways. */
@media (max-width: 640px) {
  .data-table.flow-table, .data-table.flow-table > tbody, .data-table.flow-table > tbody > tr, .data-table.flow-table > tbody > tr > td { display: block; width: auto; height: auto; }
  .data-table.flow-table > thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .data-table.flow-table > tbody > tr { padding: 8px 0; border-bottom: 1px solid var(--hairline); }
  .data-table.flow-table > tbody > tr > td, .flow-table td { padding: 2px 16px; border: 0; }
  .data-table.flow-table > tbody > tr > td[data-label]::before { content: attr(data-label) ": "; font: 600 12px/1.4 var(--font-sans); color: var(--secondary); }
  .data-table.flow-table > tbody > tr > td.flow-td-n::before { content: "#"; margin-right: 6px; font: 500 12px/1.4 var(--font-mono); color: var(--secondary); }
  .data-table.flow-table > tbody > tr > td.flow-td-n { font-weight: 600; }
  .flow-next-list { display: inline-flex; flex-direction: row; flex-wrap: wrap; gap: 2px 10px; }
}
.doc-flow-caption { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 16px; padding: 8px 12px; border-top: 1px solid var(--hairline);
                    font-size: 12px; color: var(--body); }
.doc-flow-caption-text { display: inline-flex; align-items: center; gap: 6px; flex: 1 1 220px; min-width: 0; }
.doc-flow-caption-text .icon, .rdmp-lines .icon, .sck-glyph { width: 16px; height: 16px; flex: none; color: var(--violet-text); }
.doc-flow-caption-toggles { display: inline-flex; align-items: center; gap: 4px 16px; flex-wrap: wrap; }
.doc-flow-caption-toggles .toggle-row-small { min-height: 28px; font-size: 12px; gap: 6px; }
.doc-flow-caption-toggles .toggle-row-small .toggle { width: 32px; height: 18px; flex: 0 0 32px; }
.doc-flow-caption-toggles .toggle-row-small .toggle::after { width: 14px; height: 14px; top: 2px; left: 2px; }
.doc-flow-caption-toggles .toggle-row-small .toggle:checked::after { transform: translateX(14px); }
.read-content .doc-flow-block { margin: 16px 0; }
.read-content .flow-figure { border-radius: var(--r-card); }
.flow-insert { position: relative; display: inline-flex; }
/* The Insert flow picker (templates/_flow_picker.html, 2026-09-25): a command
   palette -- the search row with its Esc hint, the count, the rows (code,
   name, steps; the active one tinted, its code violet), the list scrolling
   inside, the grey foot with the keys and + New flow. The search field keeps
   the focus, so the ring is drawn round its row. */
.flow-picker { position: absolute; top: calc(100% + 6px); left: 0; z-index: 30; width: 400px; max-width: calc(100vw - 32px);
               display: flex; flex-direction: column; overflow: hidden; font: 400 14px/1.4 var(--font-sans);
               border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--card); box-shadow: 0 8px 24px rgba(47, 51, 73, .12); }
.flow-picker[hidden] { display: none; }
.flow-picker-search { display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 0 12px 0 16px; border-bottom: 1px solid var(--hairline); }
.flow-picker-search:focus-within { box-shadow: inset 0 0 0 2px var(--focus-ring); }
.flow-picker-search input { flex: 1; min-width: 0; height: 46px; padding: 0; border: 0; background: transparent; color: var(--ink); font: 400 16px/1.4 var(--font-sans); }
.flow-picker-search input::placeholder { color: var(--secondary); opacity: 1; }
.flow-picker-search input:focus-visible { outline: none; }
.flow-picker-kbd { flex: none; white-space: nowrap; padding: 2px 6px; border: 1px solid var(--hairline); border-radius: var(--r-badge);
                   color: var(--secondary); font: 500 12px/1.4 var(--font-mono); }
.flow-picker-count { margin: 0; padding: 12px 20px 4px; color: var(--secondary); font: 500 12px/1.4 var(--font-mono); text-transform: uppercase; letter-spacing: .04em; }
.flow-picker-list { list-style: none; margin: 0; padding: 0 8px 8px; max-height: 308px; overflow-y: auto; overscroll-behavior: contain; }
.flow-picker-list[hidden] { display: none; }
.flow-picker-item { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 4px 12px; border-radius: var(--r-control); cursor: pointer; }
.flow-picker-item[hidden] { display: none; }
.flow-picker-item[aria-selected="true"] { background: var(--violet-tint); }
/* the row is the shared two-line option (.option-lines, FLOWS 7.391): the name, the code under it */
.flow-picker-item[aria-selected="true"] .option-lines > .cell-code-sub { color: var(--violet-text); }
.infra-fact strong { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); font: 600 15px/1.4 var(--font-sans); }
/* --body on the tint: --secondary stops at 4.0:1 on it in the dark theme */
.flow-picker-item[aria-selected="true"] .flow-picker-steps { color: var(--body); }
.flow-picker-empty { display: flex; align-items: center; gap: 10px; min-height: 44px; margin: 0 8px 8px; padding: 0 12px; color: var(--body); }
.flow-picker-empty[hidden] { display: none; }
.flow-picker-empty-text { flex: 1; min-width: 0; }
.flow-picker-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 40px; padding: 0 16px;
                    border-top: 1px solid var(--hairline); background: var(--canvas); }
.flow-picker-hint, .cpss-reason, .mr-check-state, .plan-domain, .plan-sub { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--secondary); font-size: 13px; }
.flow-picker-new { flex: none; white-space: nowrap; color: var(--violet-text); font-weight: 600; font-size: 14px; text-decoration: none; }
.flow-picker-new:hover { text-decoration: underline; }
.flow-adopt-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.flow-adopt-list .tick-mark { align-items: flex-start; }
@media print { .doc-flow-caption-toggles, .doc-flow-notice form { display: none; } }
.chip-row label.chip { cursor: pointer; }
.chip-row label.chip input { margin: 0; }

/* ---- Users and access → Members (2026-09-20, the product owner's mock-up):
   the members table on the left, the member panel on the right, sticky on a
   desktop and stacked under the table on a phone. ---- */
.members-layout { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 16px 24px; align-items: start; }
.members-card { min-width: 0; }
.members-card .rr-search { flex: 1 1 160px; min-width: 140px; }
.members-side { position: sticky; top: 20px; min-width: 0; display: flex; flex-direction: column; gap: 16px; }
.members-side .mfa-policy { flex-direction: column; align-items: stretch; gap: 8px; margin-bottom: 0; }
/* The table: 72px rows, no zebra, the selected row a violet tint with a
   4px violet left edge; a row is a target (the link on the name is the
   no-script way in). */
.data-table.members > tbody > tr[data-member] { cursor: pointer; }
.data-table.members > tbody > tr > td { height: 72px; padding-top: 12px; padding-bottom: 12px; vertical-align: middle; }
.data-table.members .member-link { text-decoration: none; }
.data-table.members .member-link:hover { text-decoration: underline; text-underline-offset: 2px; }
.data-table.members .member-text .mono { font-size: 12px; }
.data-table.members > tbody > tr.is-selected > td, .data-table.members > tbody > tr.is-selected:hover > td { background: var(--violet-tint); }
.data-table.members > tbody > tr.is-selected > td:first-child { box-shadow: inset 4px 0 0 var(--violet); }
.data-table.members > tbody > tr[data-member]:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; }
.member-roles, .infra-stat-value, .sknw-value .chip { font: 500 13px/1.4 var(--font-sans); color: var(--ink); }
.member-roles { white-space: nowrap; }
.member-roles .rr-none { margin-top: 0; }
.members-empty { display: inline-flex; align-items: center; gap: 10px; min-height: 40px; }
/* The panel: the person's head line, then sections parted by hairlines,
   each with a mono eyebrow, and the action row last. */
.member-panel { display: flex; flex-direction: column; min-width: 0; }
.member-panel-head { display: flex; align-items: center; gap: 12px; min-height: 40px; }
.member-panel-head .member-avatar, .data-table.members .member-avatar { width: 40px; height: 40px; font-size: 13px; font-weight: 600; }
.member-panel-head .member-avatar .icon { width: 20px; height: 20px; }
.member-panel-head .member-text { flex: 1 1 auto; min-width: 0; }
.member-panel-head .member-text .mono { font-size: 12px; }
.member-panel-name:focus { outline: none; }
.member-panel-close { flex: none; width: 40px; height: 40px; min-height: 40px; padding: 0; display: inline-flex; align-items: center; justify-content: center; text-decoration: none;
  background: var(--card); color: var(--ink); border: 1px solid var(--hairline); }
.member-panel-close:hover { border-color: var(--body); }
/* Rinat's design (respons, 2026-09-29): "e-mail · active 13 Sep, 17:27"
   under the name; the access section's scope and clearance side by side;
   the MFA switch on the right of its label; the remove as a red text link. */
.member-panel-sub { color: var(--secondary); }
.member-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-items: start; }
.member-mfa-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.member-actions .card-link.danger { font-size: 13px; }
.member-panel-close .icon { width: 18px; height: 18px; }
.member-form { display: flex; flex-direction: column; }
.member-section { display: flex; flex-direction: column; gap: 10px; padding: 14px 0; border-top: 1px solid var(--hairline); min-width: 0; }
.member-panel-head + .member-form, .member-panel-head + .member-section { margin-top: 14px; }
.member-section > .eyebrow { margin: 0; }
.member-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.member-field .doc-entry { width: 100%; height: 40px; min-height: 40px; box-sizing: border-box; font-size: 14px; }
.member-label, .control-explanation .explanation-heading, .rdt-linked-name, .otb-fr-tile .otb-fr-level { line-height: 1.3; }
.control-explanation .explanation-heading { margin: 14px 0 6px; }
.invite-roles { display: flex; flex-direction: column; gap: 8px; }
.invite-roles .tick-mark { display: flex; align-items: center; gap: 8px; font: 500 14px/1.3 var(--font-sans); color: var(--ink); }
.member-panel .role-chips { gap: 8px; }
.member-panel .role-chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 4px 4px 10px; font: 500 13px/1.3 var(--font-sans); color: var(--ink);
  background: var(--neutral-tint); border: 1px solid var(--hairline); border-radius: var(--r-badge); white-space: nowrap; flex: none; }
.member-panel .chip-gone { width: 20px; height: 20px; padding: 0; border-radius: var(--r-badge); opacity: .8; }
.member-panel .rr-none { margin-top: 0; }
.member-switch { display: flex; flex-direction: column; gap: 8px; }
.member-switch .toggle-row { min-height: 24px; }
.members-side .mfa-policy .toggle-row { min-height: 24px; }
.member-switch .rs-line, .member-mfa-state { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 10px; }
.member-switch .rs-line .button, .button.small-plus, .member-mfa-state .button { min-height: 28px; padding: 0 10px; font-size: 12px; }
.member-facts { gap: 6px; }
.member-facts .mono { color: var(--ink); }
.member-actions { margin-top: 0; padding-top: 14px; border-top: 1px solid var(--hairline); justify-content: flex-start; flex-wrap: wrap; }
.member-actions .button { min-height: 32px; }
.member-actions .button.small { text-decoration: none; }
.member-remove { margin-left: auto; align-self: center; }
.member-panel-empty .icon { width: 20px; height: 20px; flex: none; }
:root[data-theme="dark"] .member-panel .role-chip { background: var(--table-head); }
@media (max-width: 1024px) {
  .members-layout { grid-template-columns: minmax(0, 1fr); }
  .members-side { position: static; }
}

/* The stat card's glyph box sits where the ring sits and is as large:
   48px, centred on the right at 16px (2026-09-20). */
.card.stat .stat-heading .icon { top: 50%; right: 16px; transform: translateY(-50%); width: 48px; height: 48px; padding: 12px; }

/* ---- The risk overview: /it/ and /ot/ (the product owner's design of
   2026-09-26, measured at 1.4 image px per CSS px like the list card) ----
   One stat row on top (.cards-row, every stat card of the page), then two
   columns -- Worklist and Recently changed on the left (1.35fr), the
   distribution and the framework's steps on the right (1fr) -- and the
   matrix full width under both. Every card is a .list-card: the heading
   line with its grey count, the body at the 24px inset; the three cards
   on the right and the matrix have no rule under the heading
   (.list-head.plain). Each card as tall as its content; one column under
   1024px. */
.ro-layout { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr); gap: 16px; align-items: start; scroll-margin-top: 64px; }
.ro-main, .ro-side { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.ro-card { min-width: 0; }
.ro-card .list-head-actions .card-link, .tpub-card .list-head-actions .card-link { font-size: 14px; white-space: nowrap; }
/* The worklist: one block per gap kind under a full-width hairline: the
   red count, the title 15px/600 with the grey line of the step it blocks,
   the hairline action on the right; then the first three risks as rows
   (the mono id, the title, a chevron) and "+ n more" to the register. */
.list-card > .list-body.ro-gaps { padding: 0; }
.ro-gap { padding: 16px 24px 10px; }
.ro-gap + .ro-gap { border-top: 1px solid var(--hairline); }
.ro-gap-head { display: grid; grid-template-columns: 40px minmax(0, 1fr) auto; align-items: center; column-gap: 0; }
.ro-gap-count { font: 600 16px/22px var(--font-sans); color: var(--red-text); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ro-gap-words { display: flex; flex-direction: column; min-width: 0; }
.ro-gap-title { font: 600 15px/22px var(--font-sans); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ro-gap-note { font: 400 13px/18px var(--font-sans); color: var(--secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.button.hairline.ro-gap-action { margin-left: 16px; padding: 0 12px; }
.ro-gap-list { list-style: none; margin: 12px 0 0; padding: 0; }
.ro-gap-row { display: grid; grid-template-columns: 68px minmax(0, 1fr) 16px; align-items: center; min-height: 34px;
  border-top: 1px solid var(--hairline); color: var(--ink); text-decoration: none; }
.ro-score-n, .ro-gap-id, .ro-level-range, .fwl-table td.fwl-version { line-height: 20px; }
.ro-gap-id { white-space: nowrap; }
.ro-gap-row .icon { width: 16px; height: 16px; color: var(--disabled); transform: rotate(-90deg); }
.ro-gap-row:hover .ro-gap-name { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
.ro-gap-row:hover .icon { color: var(--violet-text); }
.ro-gap-more, .otz-assign { display: inline-block; font: 600 14px/20px var(--font-sans); color: var(--violet-text); text-decoration: none; white-space: nowrap; }
.ro-gap-more { margin-left: 68px; padding: 7px 0; }
.ro-gap-more:hover { text-decoration: underline; text-underline-offset: 2px; }
.ro-empty { display: flex; align-items: center; gap: 10px; min-height: 34px; font-size: 14px; color: var(--ink); }
.ro-empty .icon { width: 20px; height: 20px; color: var(--green-text); flex: none; }
/* Recently changed: the list card's table edge to edge, the six newest,
   the score as the level's dot, word and grey number, the status pill as
   wide as its column, the grey foot band with "Showing 6 of n". */
/* narrower than that the wrap scrolls sideways instead of squeezing the title */
.data-table.ro-recent { min-width: 620px; }
.data-table.ro-recent col.ro-c-score { width: 166px; }
.data-table.ro-recent col.ro-c-owner { width: 156px; }
.data-table.ro-recent col.ro-c-status { width: 136px; }
.data-table.ro-recent > tbody > tr > td { vertical-align: middle; }
.data-table.ro-recent .rl-assign { font-size: 14px; font-weight: 600; }
.data-table.ro-recent .pill { display: flex; width: 100%; }
/* Distribution across levels: rows of 30px -- the level's square and
   name, the mono range, one violet bar on the grey track, the count on
   the right (grey at zero). */
.ro-level { display: grid; grid-template-columns: 108px 60px minmax(0, 1fr) 40px; align-items: center; min-height: 30px; }
.ro-level-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ro-level-range { white-space: nowrap; }
.ro-bar { background: var(--neutral-tint); }
.ro-level-n { font: 400 14px/20px var(--font-sans); color: var(--secondary); text-align: right; font-variant-numeric: tabular-nums; }
.ro-level-n.has { font-weight: 600; color: var(--ink); }
/* The framework's steps: a strip of one segment per step (violet when
   met), then the steps as rows under hairlines -- a green check in a small
   circle or an empty red circle, the number, the step (600 when not met)
   and on the right the violet Fix link. */
.ro-strip { display: flex; gap: 4px; margin-bottom: 14px; }
.ro-strip i { flex: 1 1 0; height: 4px; border-radius: var(--r-badge); background: var(--neutral-tint); }
.ro-strip i.met { background: var(--violet); }
.ro-steps { list-style: none; margin: 0; padding: 0; }
.ro-step { display: grid; grid-template-columns: 28px 30px minmax(0, 1fr) auto; align-items: center; min-height: 34px; padding: 7px 0;
  border-top: 1px solid var(--hairline); box-sizing: border-box; }
.ro-step-mark { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; flex: none; }
.ro-step-mark.met { background: var(--green-tint); color: var(--green-text); }
.ro-step-mark.met .icon { width: 11px; height: 11px; stroke-width: 2.5; }
.ro-step-mark.open { width: 18px; height: 18px; margin-left: -1px; border: 1.5px solid var(--red-text); box-sizing: border-box; }
.ro-step-text { font: 400 14px/20px var(--font-sans); color: var(--ink); min-width: 0; }
.ro-step[data-ready="0"] .ro-step-text { font-weight: 600; }
.ro-fix { margin-left: 12px; font: 600 14px/20px var(--font-sans); color: var(--violet-text); text-decoration: none; text-align: right; max-width: 220px; }
.ro-fix:hover { text-decoration: underline; text-underline-offset: 2px; }
/* The matrix in the client's settings: the impact words down the left,
   the likelihood words under it; a cell is the pale of its level with the
   score in grey, a cell holding risks the level's full colour with a dark
   edge, the count large and the score small (a link to the register on
   that cell); the legend of the levels bottom left, the key bottom right.
   --lvl carries the level's colour from the scale's tokens. */
.lvl-green { --lvl: var(--risk-1); }
.lvl-lightgreen { --lvl: var(--risk-2); }
.lvl-yellow { --lvl: var(--risk-3); }
.lvl-orange { --lvl: var(--risk-4); }
.lvl-red { --lvl: var(--risk-5); }
.lvl-darkred { --lvl: var(--risk-6); }
/* The border spacing bleeds 6px past the table's edges; the wrap takes
   that in, so the cells line up with the card's inset. */
.ro-matrix-wrap { margin: -6px; overflow-x: auto; overflow-y: hidden; }
.ro-matrix { width: 100%; min-width: 480px; border-collapse: separate; border-spacing: 6px; table-layout: fixed; }
.ro-matrix col.ro-matrix-label { width: 90px; }
.ro-matrix th.ro-matrix-impact { padding: 0 4px 0 0; text-align: right; font: 400 14px/20px var(--font-sans); color: var(--body); white-space: nowrap; }
.ro-matrix th.ro-matrix-likelihood { padding: 6px 0 0; text-align: center; font: 400 14px/20px var(--font-sans); color: var(--body); white-space: nowrap; }
.ro-matrix td { padding: 0; min-width: 64px; }
.ro-cell { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; height: 52px; border-radius: var(--r-badge);
  background: color-mix(in srgb, var(--lvl, var(--neutral-tint)) 32%, var(--card)); text-decoration: none; }
.ro-cell-score { font: 500 12px/14px var(--font-mono); color: var(--body); }
.ro-cell.has { background: var(--lvl, var(--neutral-tint)); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--lvl, var(--hairline)) 65%, #000); }
.ro-cell-n { font: 700 20px/22px var(--font-sans); color: var(--risk-text); font-variant-numeric: tabular-nums; }
.ro-cell.has .ro-cell-score { color: var(--risk-text); }
.ro-cell.has.lvl-darkred .ro-cell-n, .ro-cell.has.lvl-darkred .ro-cell-score { color: var(--risk-text-dark); }
a.ro-cell.has:hover { box-shadow: inset 0 0 0 2px var(--ink); }
.ro-matrix-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px 24px; flex-wrap: wrap; margin-top: 14px; }
.ro-legend { display: flex; flex-wrap: wrap; gap: 6px 20px; }
.ro-legend .cell-level { font-weight: 400; }
/* The register's Matrix cell filter shows while it is on (the overview
   links to it); risk_new.js marks an active select. */
.filter-bar select.rr-filter.rr-filter-cell:not(.active) { display: none; }
@media (max-width: 1024px) {
  .ro-layout { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 720px) {
  .ro-gap { padding-left: 16px; padding-right: 16px; }
  .ro-gap-head { grid-template-columns: 32px minmax(0, 1fr); row-gap: 8px; }
  .button.hairline.ro-gap-action { grid-column: 2; justify-self: start; margin-left: 0; }
  .ro-gap-row { grid-template-columns: 60px minmax(0, 1fr) 16px; }
  .ro-gap-more { margin-left: 60px; }
  .ro-level { grid-template-columns: minmax(80px, auto) 52px minmax(0, 1fr) 32px; column-gap: 8px; }
  .ro-step { grid-template-columns: 26px 24px minmax(0, 1fr); }
  .ro-fix { grid-column: 3; margin-left: 0; text-align: left; }
  .ro-matrix col.ro-matrix-label { width: 72px; }
}

/* The imported frameworks (templates/frameworks.html, Rinat's design of
   2026-09-27): the library table's badge and name (.fwl-*, below), then
   what is not met (red mono, right), the version (mono), the coverage as
   the roadmap's 4px gauge with its figure, and the one violet link. */
.data-table.fwl-table.fwim-table { min-width: 1000px; }
.fwim-table col.fwim-c-open { width: 120px; }
.fwim-table col.fwim-c-version { width: 110px; }
.fwim-table col.fwim-c-coverage { width: 230px; }
.fwim-table col.fwim-c-action { width: 200px; }
.fwim-name-line { display: flex; align-items: center; gap: 10px; min-width: 0; }
.fwim-name-line .pill { flex: none; white-space: nowrap; }
a.fwim-name { text-decoration: none; }
a.fwim-name:hover { text-decoration: underline; text-underline-offset: 2px; }
.fwim-sub { display: block; margin-top: 4px; font: 400 15px/22px var(--font-sans); color: var(--secondary); }
.fwl-table td.fwim-open, .data-table.isok-years-table td.isok-fig { font: 500 15px/22px var(--font-mono); }
.fwl-table td.fwim-open { color: var(--secondary); }
.fwl-table td.fwim-open.is-open { color: var(--red-text); }
.fwl-table td.fwim-version { font: 400 15px/22px var(--font-mono); color: var(--ink); white-space: nowrap; }
.fwim-bar-line { display: flex; align-items: center; gap: 16px; }
.fwim-bar-line .ap-gauge { flex: 1 1 auto; }
.fwim-pct { flex: none; min-width: 44px; text-align: right; font: 500 15px/22px var(--font-mono); color: var(--ink); }
.fwim-action .inline-form { display: inline-flex; margin: 0; }

/* the running version under the user card at the foot of the sidebar
   (docs/RELEASES.md): one line of 10px mono in the lightest text, never
   louder than the menu */
.brand-version { font: 400 12px/1.4 var(--font-mono); color: var(--secondary); letter-spacing: .02em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: center; }
html.rail .user-card-foot, html.rail .user-more { display: none; }   /* the 64px rail shows the avatar only */


/* Fleet -> Releases: the restore form in the heading line, the state line */
.release-restore-form { display: flex; align-items: center; gap: 8px; flex: none; }
.release-restore-form .doc-entry { width: 220px; height: 40px; }
.release-state { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 0 0 10px; font-size: 12px; }
.release-change { font-size: 12px; line-height: 1.35; }
.release-more summary { cursor: pointer; font-size: 12px; }
.release-notes-form { display: flex; gap: 6px; align-items: center; min-width: 220px; }
.release-notes-form .doc-entry { height: 28px; font-size: 12px; }
.release-policy-form { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 12px; margin: 0 0 10px; font-size: 12px; }
.release-policy-now { font-size: 12px; font-weight: 600; }
.release-policy-now.is-held { color: var(--green-text); }
.release-policy-now.is-auto { color: var(--amber-text); }


/* The guide of a capability page (core/guides.py): a 40px square "?" on the
   right of the page heading line (beside the actions that stand there, or
   alone at the top right), and the dialog it opens: title 20px/600 with the
   hint and a close cross, two columns of 15px text under mono eyebrows, a
   footer with the link to the method and one violet Got it. Radius 4px. */
/* The ? is placed at the top right only inside the heading it joined (any
   heading: the title line of a restyled page is not always .page-heading);
   anywhere else it stays in the flow, never floating over the top bar. */
.has-guide { position: relative; padding-right: 52px; }
.page-heading-row.has-guide { padding-right: 0; }
.has-guide > .guide-button:not(.guide-button-inline) { position: absolute; right: 0; top: 0; }
.guide-button { position: static; width: 40px; height: 40px; padding: 0; flex: none; display: inline-grid; place-items: center;
                font: 600 16px/1 var(--font-sans); color: var(--violet-text); border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); cursor: pointer; }
.guide-button.guide-button-inline { position: static; margin: 0; }
/* inside a row heading the generic `.page-heading-row > .button` rule (wide,
   violet) must not reach the ?: it stays a 40px hairline square at the far
   right of the line */
.page-heading > .button.guide-button, .page-heading-row > .button.guide-button {
  width: 40px; min-width: 40px; height: 40px; min-height: 40px; padding: 0; margin-left: auto; align-self: flex-start;
  background: var(--card); color: var(--violet-text); border: 1px solid var(--hairline); border-radius: var(--r-control); font: 600 16px/1 var(--font-sans); }
.page-heading > .button.guide-button:hover, .page-heading-row > .button.guide-button:hover,
.page-heading > .button.guide-button:focus-visible, .page-heading-row > .button.guide-button:focus-visible { background: var(--violet-hover); border-color: var(--violet-hover); color: #fff; }
/* A portal page's title line (Rinat's design 2026-10-22, FLOWS 7.460; the
   one component {% page_title %}, core/templatetags/page_title.py): the
   title, optionally one status pill (.pill in its tone with its .dot and
   words) and one timing detail (grey words, the date in mono), nothing
   else. It wraps on a narrow screen. */
.page-title-row { display: flex; align-items: center; gap: 8px 12px; min-width: 0; flex-wrap: wrap; }
.page-title-row h1 { margin: 0; min-width: 0; }
/* .page-title-timing: grey 13px words with the date in .mono, one look with .form-more-state (above) */
.page-heading-row .page-title-row { flex: 1 1 320px; }
.guide-button:hover, .guide-button:focus-visible { background: var(--violet-hover); border-color: var(--violet-hover); color: #fff; }   /* the ? stays visible: white on the violet the other buttons take on hover */
.guide-dialog, .assistant-dialog, .confirm-dialog { max-width: none; padding: 0; border: 0; border-radius: var(--r-control); background: var(--card); color: var(--body); box-shadow: 0 24px 64px rgba(15, 18, 34, .28); }
.guide-dialog { width: min(1100px, calc(100vw - 40px)); }
.guide-dialog::backdrop, .confirm-dialog::backdrop { background: rgba(31, 34, 51, .38); }
/* (b4ux, D16) the question before an irreversible action (base.html #cisoly-confirm): the action's name as an 18px
   title (the shared heading line's words, below), the question, and the card's action row -- Cancel hairline, the
   action violet */
.confirm-dialog { width: min(440px, calc(100vw - 32px)); }
.confirm-dialog-body { margin: 0; padding: 16px; display: flex; flex-direction: column; gap: 10px; }
.confirm-dialog-text { margin: 0; font-size: 14px; line-height: 1.5; color: var(--body); white-space: pre-line; overflow-wrap: anywhere; }
.guide-head { display: flex; align-items: center; gap: 16px; padding: 20px 24px; border-bottom: 1px solid var(--hairline); }
.guide-title, .intg-section-heading h2, .soly-title { margin: 0; font: 600 20px/1.3 var(--font-sans); color: var(--ink); min-width: 0; }
.guide-title, .soly-title { flex: 1 1 auto; }
.guide-hint, .dash-kv dt, .aplan-sub { font: 400 14px/1.3 var(--font-sans); color: var(--secondary); white-space: nowrap; flex: none; }
.guide-close { width: 32px; height: 32px; padding: 0; border: 0; background: none; color: var(--secondary); cursor: pointer; display: inline-grid; place-items: center; border-radius: var(--r-control); flex: none; }
.guide-close .icon { width: 20px; height: 20px; }
.guide-close:hover { color: var(--ink); background: var(--tint, #F3F0FF); }
.guide-body { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px 40px; padding: 8px 24px 24px; align-items: start; }
.guide-column { display: flex; flex-direction: column; gap: 20px; min-width: 0; }
.guide-block { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.guide-block p { margin: 0; font: 400 15px/1.55 var(--font-sans); color: var(--body); }
.guide-eyebrow { font: 500 12px/1.4 var(--font-mono); letter-spacing: .1em; text-transform: uppercase; color: var(--secondary); padding-top: 16px; }
.guide-steps { margin: 0; padding-left: 22px; font: 400 15px/1.55 var(--font-sans); color: var(--body); display: flex; flex-direction: column; gap: 6px; }
.guide-foot { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 16px 24px; border-top: 1px solid var(--hairline); }
.guide-unclear-form { display: inline-flex; align-items: center; gap: 12px; min-width: 0; }
.guide-unclear-form .button:hover { background: var(--violet-hover); color: #fff; border-color: var(--violet-hover); }
.guide-foot .button.primary { padding: 0 20px; }
@media (max-width: 720px) { .guide-body { grid-template-columns: 1fr; } }
/* the switches on the console's flow card inside a document (the same
   caption toggles as the portal): a mono eyebrow, then the two switches */
.flow-card-toggles { display: inline-flex; align-items: center; gap: 4px 14px; margin-left: 12px; }
.flow-card-toggles .eyebrow { font-size: 10px; }
.flow-card-toggles .flow-toggle-form { display: inline-flex; }
/* the imported-frameworks table sits flush with the card's bottom: the wrap
   pulls itself 16px down, so the card must hold those 16px (it had 0 and
   the card's overflow cut the last row, 2026-09-21) */
.card.fw-library { padding-bottom: 16px; }

/* Fleet -> Infrastructure (templates/console/fleet_infrastructure.html):
   four figures on top with a coloured left bar, cards whose heading carries
   the state pill and the facts, meters (label, value, bar, sub), key/value
   rows, a note box, a database list with bars. */
.infra-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; align-items: start; }
.card.infra-stat { display: flex; flex-direction: column; gap: 4px; padding: 14px 16px 14px 20px; position: relative; min-height: 72px; }
.card.infra-stat::before { content: ""; position: absolute; left: 8px; top: 12px; bottom: 12px; width: 4px; border-radius: 2px; background: var(--hairline); }
.card.infra-stat.tone-green::before { background: var(--green); }
.card.infra-stat.tone-violet::before { background: var(--violet); }
.card.infra-stat.tone-amber::before { background: var(--amber); }
.card.infra-stat.tone-red::before { background: var(--red); }
.card.infra-stat.tone-grey::before { background: var(--hairline); }
.infra-stat-value strong { font: 600 18px/1.2 var(--font-sans); margin-right: 2px; }
.infra-stat-sub { font-size: 12px; color: var(--secondary); }
/* The page's column puts 14px between its cards (.content's gap); a card adds no margin of its own (FLOWS 7.413). */
.card.infra-card > .card-heading { padding-bottom: 12px; border-bottom: 1px solid var(--hairline); margin-bottom: 14px; flex-wrap: wrap; }
.card.infra-card > .card-heading .card-heading-links { gap: 10px; flex-wrap: wrap; min-width: 0; }
.infra-meta strong, .infra-meta code { color: var(--ink); }
.infra-meters { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; align-items: start; }
.infra-meter { min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.card.infra-card > .card-heading > .card-sub, .card.infra-card > .card-heading > .card-link { flex: none; white-space: nowrap; margin-left: auto; }
/* A metric (restyle 2026-10-11, FLOWS 7.292): a small label, the value large
   ("26%" with "of 7.6 GB" small), a thin violet bar, a secondary sub-line. */
.infra-meter-line, .infra-fact { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; font-size: 13px; color: var(--secondary); min-width: 0; }
.infra-meter-line strong { white-space: nowrap; }
.infra-meter-line strong small, .infra-tile small { font: 400 13px/1.3 var(--font-sans); color: var(--secondary); }
.infra-bar { height: 4px; border-radius: 2px; background: var(--skeleton); overflow: hidden; }
.infra-bar.bar-green > span { background: var(--green); }
.infra-meter-sub { font-size: 12px; color: var(--secondary); }
.infra-text { margin: 0 0 12px; font-size: 14px; line-height: 1.5; color: var(--body); max-width: 72ch; }
/* Not visible / needs a right: the sentence, then a tinted box with the
   rights as a mono list, the link to the provider and Copy all. */
.infra-note, .bil-doc-form, .aside-note.aside-state { border: 1px solid var(--hairline); border-radius: 4px; padding: 14px 16px; display: flex; flex-direction: column; gap: 10px; background: var(--canvas); }
.infra-note strong { font-size: 13px; }
.infra-rights { margin: 0; font: 400 13px/1.6 var(--font-mono); color: var(--ink); white-space: pre-wrap; overflow-wrap: anywhere; }
.infra-note-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 16px; }
.infra-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.infra-chips .chip { font-size: 12px; padding: 3px 8px; border-radius: 2px; background: var(--skeleton); color: var(--ink); }
.infra-cols { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 24px; align-items: start; }
/* Key/value: the label in secondary text, the value at 600 (or mono) beside it. */
.infra-kv { display: grid; grid-template-columns: minmax(120px, max-content) minmax(0, 1fr); gap: 8px 24px; margin: 8px 0 0; align-items: baseline; }
.infra-kv dt, .rv-sub, .infra-meta { font-size: 13px; color: var(--secondary); white-space: nowrap; }
.infra-kv dd { margin: 0; text-align: left; font-weight: 600; color: var(--ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.infra-kv dd .mono, .infra-kv dd code { font-weight: 500; }
.infra-kv.rules { gap: 0 24px; margin: 0 0 10px; }
.infra-kv.rules dt, .infra-kv.rules dd { padding: 9px 0; border-bottom: 1px solid var(--hairline); }
/* .wrap: the value wraps instead of being cut, so nothing in it is clipped -- a long code breaks, a link keeps its
   whole focus ring (FLOWS 7.375) */
.infra-kv.wrap dd { white-space: normal; overflow: visible; overflow-wrap: anywhere; }
.infra-section { border-top: 1px solid var(--hairline); margin-top: 14px; padding-top: 6px; }
.infra-checks { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.infra-host { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 1px solid var(--hairline); border-radius: 4px; background: var(--canvas); margin-bottom: 14px; min-width: 0; }
.infra-host code { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
.infra-copy { font: inherit; }
.infra-dbs-heading { display: flex; align-items: baseline; gap: 10px; margin: 18px 0 8px; }
.infra-split > div > .infra-dbs-heading:first-child { margin-top: 0; }
.infra-dbs { display: flex; flex-direction: column; }
/* Databases by size: the mono name, a bar, the size right-aligned. */
.infra-db { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 3fr) 64px; gap: 12px; align-items: center; padding: 5px 0; }
.infra-db code { font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.infra-db strong { text-align: right; font-size: 13px; white-space: nowrap; }
.infra-more { background: none; border: 0; padding: 0; margin-top: 8px; cursor: pointer; font: inherit; font-size: 13px; }
.infra-grid-2 { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 14px; align-items: start; }
/* A card in two halves (the database: its address and meters, its databases by size). */
.infra-split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 20px; align-items: start; }
.infra-split > div { min-width: 0; }
.infra-split > div + div { border-left: 1px solid var(--hairline); padding-left: 20px; }
.infra-split .infra-meters { grid-template-columns: minmax(0, 1fr); gap: 14px; }
.infra-facts { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; }
.infra-facts + .infra-host { margin-top: 14px; margin-bottom: 0; }
/* The security scan's figures: three tiles (Blocking in a red tint), then the
   severities as chips, the tools on one mono line. */
.infra-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; align-items: start; margin-bottom: 12px; }
.infra-tile { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 16px; border: 1px solid var(--hairline); border-radius: 4px; background: var(--canvas); font-size: 13px; color: var(--secondary); text-decoration: none; }
.infra-tile.tone-red, .pill.count.danger { background: var(--red-tint); border-color: var(--red-tint); color: var(--red-text); }
.infra-tile.tone-red strong { color: var(--red-text); }
.infra-tools { margin: 10px 0 0; font: 400 13px/1.6 var(--font-mono); color: var(--secondary); overflow-wrap: anywhere; }
.card.infra-card > .table-wrap:last-child { margin-bottom: -16px; }
/* Fleet -> Overview: the summary strip, one small card per subject; a row is a
   status dot, its label and its state in words (the dot never alone). */
.fleet-strip { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; align-items: start; margin-top: 14px; }
.fleet-strip-col { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.card.fleet-strip-card { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
/* the heading line: the eyebrow and its pill on the left, Open -> on the right (Rinat's design of 2026-10-21) */
.fleet-strip-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 32px; }
.fleet-strip-title { display: flex; align-items: center; gap: 10px; min-width: 0; }
.fleet-strip-head .eyebrow { margin: 0; min-width: 0; font-size: 13px; color: var(--ink); }
.fleet-strip-head .pill, .fleet-strip-head .card-link { flex: none; white-space: nowrap; }
.fleet-strip-head .card-link { font-size: 14px; font-weight: 600; }
/* the parts: a hairline under the heading line and between rows, a long name wraps */
.fleet-strip-rows { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; border-top: 1px solid var(--hairline); }
.fleet-strip-row { display: flex; align-items: baseline; gap: 10px; min-width: 0; padding: 12px 0; font-size: 15px; line-height: 1.4; }
.fleet-strip-row + .fleet-strip-row { border-top: 1px solid var(--hairline); }
.fleet-strip-row:last-child { padding-bottom: 0; }
.fleet-strip-row .dot { width: 8px; height: 8px; flex: none; transform: translateY(-2px); }
.fleet-strip-label { flex: 1 1 auto; min-width: 0; color: var(--ink); }
.fleet-strip-state { white-space: nowrap; font-size: 15px; }
.fleet-strip-state.tone-bad { color: var(--red-text); font-weight: 600; }
.fleet-strip-state.tone-warn { color: var(--amber-text); font-weight: 600; }
.fleet-strip-foot { font-size: 13px; }
@media (max-width: 1024px) { .infra-stats, .infra-meters, .infra-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .infra-stats, .infra-meters, .infra-facts, .infra-grid-2, .infra-cols, .infra-split { grid-template-columns: minmax(0, 1fr); } .infra-split > div + div { border-left: 0; padding-left: 0; } .infra-db { grid-template-columns: minmax(0, 1fr) 64px; } .infra-db .infra-bar { grid-column: 1 / -1; } }

/* The loading state of Fleet view (static/js/page_loading.js): right after a
   click to another Fleet page, a thin violet bar runs along the top of the
   content and a grey skeleton of the cards stands where they will be; the
   shell, the sidebar and the tabs stay. Static under reduced motion. */
.page-loading-hidden { display: none !important; }
.page-skeleton { display: flex; flex-direction: column; gap: 14px; }
.page-skeleton-bar { position: relative; height: 3px; border-radius: 2px; background: var(--violet-tint); overflow: hidden; }
.page-skeleton-bar::before { content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: 35%; border-radius: 2px; background: var(--violet); animation: page-skeleton-run 1.2s ease-in-out infinite; }
.page-skeleton-text { font-size: 13px; }
.page-skeleton .fleet-strip { margin-top: 0; }
.page-skeleton .skeleton { animation: page-skeleton-shimmer 1.4s ease-in-out infinite; }
.page-skeleton .skeleton.line { height: 14px; width: 60%; }
.page-skeleton .skeleton.head { height: 22px; width: 40%; }
.page-skeleton .skeleton.value { height: 22px; width: 50%; }
.page-skeleton .skeleton.bar { height: 4px; min-height: 4px; width: 100%; }
@keyframes page-skeleton-run { 0% { transform: translateX(-100%); } 100% { transform: translateX(300%); } }
@keyframes page-skeleton-shimmer { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
@media (prefers-reduced-motion: reduce) {
  .page-skeleton-bar::before { animation: none; width: 100%; }
  .page-skeleton .skeleton { animation: none; }
}

/* Fleet view's heading meta (FLOWS 7.307): "Checked 40s ago" in mono, Not
   current as a pill when the snapshot is stale, Check now small and hairline. */
.fleet-checked { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 8px; vertical-align: middle; }
.fleet-checked > .pill, .fleet-check-form { flex: none; }
.fleet-check-form { display: inline; margin: 0; }

/* Fleet -> Database backup: four figures (title, value line, bar, sub)
   with a coloured left bar; the last run and the restore points side by side. */
.card.bk-stat { display: flex; flex-direction: column; gap: 8px; padding: 14px 16px 14px 20px; position: relative; min-height: 88px; }
.card.bk-stat::before { content: ""; position: absolute; left: 8px; top: 12px; bottom: 12px; width: 4px; border-radius: 2px; background: var(--hairline); }
.card.bk-stat.tone-green::before { background: var(--green); }
.card.bk-stat.tone-red::before { background: var(--red); }
/* Not known yet (the source copy before its first run): never green, never red. */
.card.bk-stat.tone-amber::before { background: var(--amber); }
/* The restore steps on Fleet -> Source code: a numbered list with the commands
   in a scrolling block each. */
.srcb-steps { margin: 0; padding-left: 20px; display: flex; flex-direction: column; gap: 10px; }
.srcb-steps pre { margin: 6px 0 0; padding: 10px 12px; overflow-x: auto; background: var(--canvas);
                  border: 1px solid var(--hairline); border-radius: var(--r-control); font-size: 12px; }
/* Developer onboarding (docs/FLOWS.md 7.293): a step's line in those steps -- its name, who
   ticks it, the live check, the tick with who and when, and its per-row actions. */
.devonb-step-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; min-height: 28px; }
.card.bk-stat.tone-amber::before { background: var(--amber); }
.bk-points code.bk-key-other { color: var(--amber-text); }
.bk-stat-title { font-size: 13px; color: var(--secondary); }
.bk-stat-value { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--secondary); min-height: 24px; }
.bk-stat-value strong, .cp-score-value { font: 600 22px/1.1 var(--font-sans); color: var(--ink); }
.bk-stat-after { color: var(--secondary); }
.bk-stat-sub { font-size: 12px; color: var(--secondary); }
.infra-bar.bar-red > span { background: var(--red); }
.bk-points { list-style: none; margin: 0; padding: 0; }
.bk-points li { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--hairline); font-size: 14px; }
.bk-points li:last-child { border-bottom: 0; }
.bk-points code { font-size: 13px; }
.bk-point-right { display: inline-flex; align-items: center; gap: 10px; white-space: nowrap; }
.bk-free { margin-bottom: 0; }

/* Fleet -> Schema versions: the storage column is a figure and a bar
   against the largest database; the table fits a desktop width. */
.sch-table { table-layout: fixed; }
.sch-table th:nth-child(1) { width: 22%; }
.sch-table th.sch-storage-th { width: 30%; }
.sch-table th:nth-child(3) { width: 14%; }
.sch-table th:nth-child(4) { width: 9%; }
.sch-storage-line { display: grid; grid-template-columns: 64px minmax(0, 1fr); align-items: center; gap: 12px; }
.sch-storage-line strong { text-align: right; font-size: 13px; white-space: nowrap; }
.sch-table td { overflow: hidden; text-overflow: ellipsis; }

/* Security levels measured per requirement (templates/ot_b_zone.html):
   the FR's own line of fields, the requirement rows, the fold beyond target. */
.otb-fr-line { display: grid; grid-template-columns: 160px 200px minmax(0, 1fr) minmax(0, 1fr); gap: 12px 16px; align-items: start; margin-bottom: 12px; }
.data-table.otb-sr-table > tbody > tr > td { vertical-align: top; }
.otb-sr-table .otb-sr-cell { min-width: 220px; }
.otb-sr-table .otb-controls-cell { min-width: 220px; }
.otb-sr-row.state-met .otb-sr-cell .mono { color: var(--green-text); }
.otb-sr-row.state-na .otb-sr-cell .mono, .otb-sr-row.state-compensated .otb-sr-cell .mono { color: var(--secondary); }
.otb-beyond { margin-top: 10px; }
.otb-beyond > summary { cursor: pointer; font-size: 13px; }
@media (max-width: 1024px) { .otb-fr-line { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Soly, the assistant (templates/_assistant.html, _assistant_panel.html,
   assistant.html): the button beside the bell, the modal panel it opens and
   the page that shows the same conversation full width. The thread scrolls
   inside itself and is never screen-height; one violet button (Send) in the
   action row with Clear beside it as a hairline. */
/* The button wears the language select's shape and height, so the two sit on
   one line in the top bar (the product owner's mock-up of 2026-09-22): the
   same hairline, the same 8px radius, the same type, the glyph and the word
   in violet. */
/* Soly's launcher: the domain picker's twin on the other side of the top bar
   -- 40px, the hairline border and the control radius, so the three controls
   in the bar read as one set. The glyph and the mono word carry the violet.
   Hover and the open panel both tint it and draw the border in the violet,
   the two states the account button has; the ring is the platform's on
   :focus-visible only. */
.top-assistant, .top-status-button { box-sizing: border-box; height: 40px; min-height: 40px; display: inline-flex; position: relative;
                 align-items: center; gap: 6px; white-space: nowrap; flex: none; padding: 0 var(--s-3);
                 border: 1px solid var(--field-rule); border-radius: var(--r-control);
                 background: var(--card); color: var(--violet-text); cursor: pointer;
                 transition: border-color .15s ease, background-color .15s ease; }
.top-assistant-word { font-family: var(--font-mono); font-size: 13px; font-weight: 600;
                      letter-spacing: .04em; line-height: 1; color: currentColor; }
.top-assistant .icon { width: 16px; height: 16px; flex: none; color: currentColor; }
.top-assistant:hover, .top-status-button:hover:enabled { border-color: var(--violet); background: var(--violet-tint); }
.top-assistant[aria-expanded="true"], .top-status-button[aria-expanded="true"] { border-color: var(--violet); background: var(--violet-tint); }
.top-assistant:focus-visible, .top-status-button:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
/* The console's status bar (docs/FLOWS.md 7.355, templates/console/_status_bar.html): This month, Servers,
   Databases and Encryption in the top bar for its administrators. A chip is one of the bar's controls (the
   launcher's rules above: 40px, the field's border, the control radius, the violet border and tint while
   hovered or open, the ring on :focus-visible), standing on its own: the eyebrow over the value, the value a
   state's dot and word or an amount, in ink. Its card opens under it: the Overview's strip card
   (.fleet-strip-card, its head, rows and foot) floating like a tab's menu. Until it is filled a chip shows
   its eyebrow and a dash at the same width (the eyebrow sets it, at least 112px), so nothing moves. Below
   1280px the top bar's name and role give way to it (the avatar and its menu stay; the name is in the
   sidebar's card), and at 1024px or less the bar is left out. */
.top-status { display: flex; align-items: center; gap: 8px; min-width: 0; }
.top-status [hidden] { display: none; }
.top-status-item { position: relative; flex: none; }
.top-status-button { flex-direction: column; align-items: flex-start; justify-content: center; gap: 0; min-width: 112px;
  color: var(--ink); font-family: var(--font-sans); text-align: left; }
.top-status-button:disabled { cursor: default; }
.top-status-value { display: inline-flex; align-items: center; gap: 6px; font: 600 14px/18px var(--font-sans); color: var(--ink); white-space: nowrap; }
.top-status-value .dot, .status-strip-item .dot { width: 8px; height: 8px; }
.top-status-card { position: absolute; top: calc(100% + 6px); left: 0; z-index: 40; box-sizing: border-box; width: 360px;
  max-width: calc(100vw - 32px); box-shadow: 0 8px 24px rgba(47, 51, 73, .12); }
.top-status-card .card-sub { margin: 0; }
@media (prefers-reduced-motion: reduce) { .top-status-button { transition: none; } }
@media (min-width: 1025px) and (max-width: 1279px) { .top-bar:has(.top-status) .top-who { display: none; } }
@media (max-width: 1024px) { .top-status { display: none; } }
/* The status strip under the portal's top bar: the protection bar (docs/FLOWS.md 7.384,
   templates/_protection_bar.html). It continues the top bar -- the card's background, a hairline under it, the
   page's 20px at the sides -- and is as tall as one line of 13px with 10px above and below. First the verdict,
   its glyph and word in its tone (Protected in green with the shield only when every item holds), then a fact
   per item: the status dot of 8px (never alone), the label in the body colour and the value in ink at 600.
   Labels and values never wrap and never shrink; on a narrow screen the facts wrap onto the next line inside
   the strip (no page scroll), and a provider's name beside the MFA share may wrap itself. */
.status-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 20px; box-sizing: border-box; min-height: 39px;
  padding: 10px 20px; background: var(--side-bg); border-bottom: 1px solid var(--side-rule);
  font: 400 13px/18px var(--font-sans); color: var(--side-sub); }
/* (Rinat, 2026-10-19: "the same background color as the menu on the left") the strip stands on the sidebar's navy
   in both themes, with the sidebar's own measured words: labels --side-sub 7.4:1, values --side-text 12.4:1,
   Protected --side-green 6.7:1, Needs attention --side-amber 7.0:1, Not confirmed and Checking --side-muted 5.2:1;
   the dots in the same tones (decorative, the words carry the meaning). */
.status-strip-verdict { display: inline-flex; align-items: center; gap: 6px; flex: none; white-space: nowrap; font-weight: 600; }
.status-strip-verdict .icon { width: 16px; height: 16px; }
.status-strip-verdict.tone-good { color: var(--side-green); }
.status-strip-verdict.tone-attention { color: var(--side-amber); }
.status-strip-verdict.tone-unknown, .status-strip-verdict.tone-checking { color: var(--side-muted); }
.status-strip-items { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 20px; min-width: 0; margin: 0; padding: 0; list-style: none; }
.status-strip-item { display: inline-flex; align-items: center; gap: 6px; flex: none; max-width: 100%; white-space: nowrap; }
.status-strip-item .dot.good { background: var(--side-green); }
.status-strip-item .dot.attention { background: var(--side-amber); }
.status-strip-item .dot:not(.good):not(.attention):not(.error) { background: var(--side-muted); }
.status-strip-value { font-weight: 600; color: var(--side-text); }
.status-strip-extra { min-width: 0; white-space: normal; overflow-wrap: anywhere; color: var(--side-muted); }
.status-strip a:focus-visible { outline-color: var(--side-active); }
@media (max-width: 980px) { .status-strip { padding: 8px .9rem; gap: 4px 14px; } .status-strip-items { gap: 4px 14px; } }
/* The launcher's signal (drw 2026-09-27; glass 2026-09-27, Rinat: no dot),
   set by the drawer's script while the drawer is closed: the button turns
   violet with white text and a glass flare sweeps across it -- over and over
   while Soly AI answers (data-soly-badge="busy"), every few seconds once a
   new answer is there ("new"); opening the drawer clears it. The button's
   aria-label says the same in words. Under prefers-reduced-motion the flare
   stands still as a sheen on the upper half. The document editor's Save
   carries the same glass while it reads "Save changes" (docui, 7.125), with
   the resting sweep. */
.top-assistant[data-soly-badge], .doc-toolbar .doc-save[data-save-state="dirty"] { overflow: hidden; isolation: isolate; border-color: var(--violet); color: #fff;
  background: linear-gradient(180deg, color-mix(in srgb, var(--violet) 78%, #fff) 0%, var(--violet) 55%, color-mix(in srgb, var(--violet) 88%, #000) 100%); }
.top-assistant[data-soly-badge]:hover, .doc-toolbar .doc-save[data-save-state="dirty"]:hover { background: var(--violet); color: #fff; }
.top-assistant[data-soly-badge]::after, .doc-toolbar .doc-save[data-save-state="dirty"]::after { content: ""; position: absolute; inset: -2px auto -2px 0; width: 45%;
  z-index: -1; pointer-events: none; transform: translateX(-160%) skewX(-20deg);
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.55), transparent); }
.top-assistant[data-soly-badge="busy"]::after { animation: soly-glass 1.4s ease-in-out infinite; }
.top-assistant[data-soly-badge="new"]::after, .doc-toolbar .doc-save[data-save-state="dirty"]::after { animation: soly-glass-rest 3.2s ease-in-out infinite; }
@keyframes soly-glass { from { transform: translateX(-160%) skewX(-20deg); } to { transform: translateX(360%) skewX(-20deg); } }
@keyframes soly-glass-rest { 0% { transform: translateX(-160%) skewX(-20deg); } 40%, 100% { transform: translateX(360%) skewX(-20deg); } }
@media (prefers-reduced-motion: reduce) {
  .top-assistant[data-soly-badge]::after, .doc-toolbar .doc-save[data-save-state="dirty"]::after { animation: none; transform: none; inset: 0 0 50% 0; width: auto;
    background: linear-gradient(180deg, rgba(255,255,255,.28), rgba(255,255,255,0)); }
}
/* Soly AI's drawer (drw, 2026-09-27): it floats over the page against the
   right edge, from under the top bar (--soly-top, kept by the drawer's
   script as the bar scrolls away) to the bottom of the screen, so the page
   never narrows or reflows when it opens. It scrolls with nothing: the
   thread and the panels scroll inside it. Closed it slides out and is
   hidden and inert, but keeps its layout, so the thread's scroll position,
   the tab and the typed question are all still there when it comes back.
   Above the content, below the menus of the top bar, the dialogs (top
   layer) and the skip link; on a phone it is the whole width. */
.soly-drawer { position: fixed; top: var(--soly-top, 72px); right: 0; bottom: 0; z-index: 35;
               width: 360px; max-width: 100vw; overflow: hidden; background: var(--card);
               border-left: 1px solid var(--hairline); box-shadow: -8px 0 24px rgba(15, 18, 34, .16);
               transform: translateX(100%); visibility: hidden;
               transition: transform .18s ease, visibility 0s linear .18s; }
.shell.soly-open .soly-drawer { transform: none; visibility: visible; transition: transform .18s ease, visibility 0s; }
@media (prefers-reduced-motion: reduce) { .soly-drawer, .shell.soly-open .soly-drawer { transition: none; } }
.soly-drawer-inner { width: 100%; height: 100%; display: flex; flex-direction: column; min-height: 0; }
/* The head (Rinat's design, drawertop 2026-10-04): the round violet avatar
   with the sparkle, "Soly AI" 20px/600, the close x on the right as a plain
   soft glyph; a hairline under it. */
.soly-head { display: flex; align-items: center; gap: 12px; padding: 10px 12px 10px 16px;
             border-bottom: 1px solid var(--hairline); flex: none; }
.soly-mark, .soly-fill-tile { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; flex: none; background: var(--violet); color: #fff; }
.soly-mark { width: 34px; height: 34px; border-radius: 50%; }
.soly-mark .icon { width: 18px; height: 18px; }
.soly-close:hover { background: var(--canvas); color: var(--ink); }
.soly-close .icon { width: 20px; height: 20px; }
.soly-close:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
/* The tab bar (Rinat's design, drawertop 2026-10-04): no frame, the tabs
   share the drawer's width. The tab on screen is a 40px violet-tint pill
   three shares wide with its glyph and its name in violet 15px/600; every
   other tab is its 20px glyph alone in the soft colour, centred in one
   share, so the glyphs stand evenly spaced; its name stays in the button for
   screen readers (and is its tooltip). A count is a small violet badge with
   a white mono number at the glyph's top right; in the pill it follows the
   name. */
.soly-drawer .tabbar.soly-tabs { width: auto; gap: 0; padding: 0; border: 0; border-radius: 0;
                                 background: transparent; overflow: hidden; }
.soly-drawer .soly-tabs .tab { position: relative; flex: 1 1 0; min-width: 40px; height: 40px; min-height: 40px;
                               justify-content: center; gap: 8px; padding: 0 8px; color: var(--secondary);
                               font: 600 15px/1 var(--font-sans); }
.soly-drawer .soly-tabs .tab:hover { background: var(--canvas); color: var(--ink); }
.soly-drawer .soly-tabs .tab.active, .soly-drawer .soly-tabs .tab.active:hover {
  flex: 3 1 0; min-width: max-content; padding: 0 12px; background: var(--violet-tint); color: var(--violet-text); }
.soly-drawer .soly-tabs .tab .icon { width: 20px; height: 20px; flex: none; }
.soly-drawer .soly-tabs .tab:not(.active) .tab-label { position: absolute; width: 1px; height: 1px; margin: -1px;
                                                       overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
.soly-drawer .soly-tabs .tab-count, .soly-drawer .soly-tabs .tab.active .tab-count {
  min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--violet); color: #fff;
  font: 600 10px/1 var(--font-mono); }
.soly-drawer .soly-tabs .tab:not(.active) .tab-count { position: absolute; top: 4px; left: calc(50% + 3px);
                                                       box-shadow: 0 0 0 2px var(--card); }
.soly-drawer .soly-tabs .tab-count[hidden] { display: none; }
.soly-drawer .soly-panel { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 14px 16px;
              display: flex; flex-direction: column; gap: 10px; }
.soly-drawer .soly-panel[hidden] { display: none; }
/* The Chat tab is the list of chats or one conversation
   (templates/_assistant_chat.html) and nothing else. The list scrolls inside
   itself under its eyebrow; the thread fills the whole height between the
   "All chats" line and the composer's rule and scrolls inside itself. It
   reads bottom up, as a chat does: the first message takes the free space
   above it (margin-top:auto), so one or two messages sit right above the
   composer and older ones stack upward; the DOM, the reading order and the
   keyboard stay oldest first, and the script opens it scrolled to the
   newest. */
.soly-drawer .soly-panel[data-panel="chat"] { padding: 0; overflow: hidden; gap: 0; }
.soly-drawer .soly-chat { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.soly-drawer .soly-chat > .assistant-thread {
  flex: 1 1 auto; min-height: 0; max-height: none; overflow-y: auto;
  border: 0; border-radius: 0; padding: 14px 16px; }
.soly-drawer .soly-chat > .assistant-thread > :first-child { margin-top: auto; }
.soly-drawer .soly-chat > .assistant-thread:focus-visible { outline-offset: -2px; }
.soly-drawer .soly-history { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 14px 16px; }
/* The list: a row per conversation, a button named by the first question
   (15px/600, one line with an ellipsis) over its 12px mono line (the moment
   of the last message and the count), and the row's small x beside it. The
   page draws the same list inside its card. */
.soly-chat { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.soly-history { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.assistant-card .soly-history { max-height: 460px; overflow-y: auto; }
.soly-convs { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.soly-conv { display: flex; align-items: center; gap: 8px; min-width: 0; }
.soly-conv-open { flex: 1 1 auto; min-width: 0; margin: 0; }
.soly-conv-meta { display: block; min-width: 0; font-size: 12px; line-height: 1.4; color: var(--secondary);
                  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.soly-conv-delete { flex: none; margin: 0; }
.soly-conv-x, .soly-back { display: inline-flex; align-items: center; justify-content: center; gap: 4px;
                           min-height: 28px; white-space: nowrap; flex: none; }
.soly-conv-x { width: 28px; padding: 0; }
.soly-conv-x .icon, .soly-back .icon { width: 16px; height: 16px; flex: none; }
/* One conversation: the small "All chats" control above the thread. */
.soly-conv-head { flex: none; display: flex; align-items: center; gap: 8px; min-width: 0; }
.soly-drawer .soly-conv-head { padding: 10px 16px 0; }
.soly-conv-head form { margin: 0; }
/* No chats yet: one row with the glyph, one sentence and one action. */
.soly-empty { display: flex; align-items: center; gap: 10px; min-height: 34px; min-width: 0; }
.soly-empty p { margin: 0; flex: 1 1 auto; min-width: 0; font-size: 13px; line-height: 1.4; color: var(--body); }
.soly-empty .button { flex: none; white-space: nowrap; }
.soly-scope { display: grid; grid-template-columns: auto 1fr; gap: 8px 12px; margin: 0; align-items: start; }
.soly-scope dt { font-size: 13px; color: var(--body); min-width: 0; }
.soly-scope dd { margin: 0; font-size: 13px; font-weight: 600; color: var(--ink); text-align: right; min-width: 0; }
.soly-foot .assistant-budget { margin-right: auto; font-size: 11px; flex: 1 1 auto; min-width: 0;
                               white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.soly-foot .assistant-actions { flex-wrap: nowrap; gap: 8px; }
.soly-foot .form-label { position: absolute; width: 1px; height: 1px; overflow: hidden;
                          clip-path: inset(50%); white-space: nowrap; }
.soly-foot .assistant-actions .button { min-height: 32px; }
.soly-sources { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.soly-sources li { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.soly-sources .mono { font-size: 11px; color: var(--secondary); overflow: hidden; text-overflow: ellipsis; }
.soly-foot { flex: none; border-top: 1px solid var(--hairline); padding: 12px 16px;
             display: flex; flex-direction: column; gap: 8px; }
.soly-foot .assistant-ask { display: flex; flex-direction: column; gap: 8px; }
.soly-foot .assistant-thread { display: none; }
@media (max-width: 600px) {
  .soly-drawer { width: 100vw; }
}
.assistant-dialog { width: min(560px, calc(100vw - 40px)); }
.assistant-dialog::backdrop { background: rgba(31, 34, 51, .38); }
.assistant-title { margin: 0; font: 600 18px/1.3 var(--font-sans); color: var(--ink); min-width: 0; flex: 1 1 auto; }
.assistant-full { color: var(--violet-text); }
.assistant-body { padding: 14px 20px 16px; display: flex; flex-direction: column; gap: 10px; }
.assistant-thread { list-style: none; margin: 0; display: flex; flex-direction: column; gap: 8px; max-height: 380px;
                    overflow-y: auto; border: 1px solid var(--hairline); border-radius: var(--r-control); padding: 12px; }
.assistant-thread:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
/* A line added in place (the answer posted in the background, templates/
   _assistant_ask.html) keeps its line breaks the way |linebreaksbr keeps them
   for a line from the server; the waiting line is quieter. */
.assistant-text-live { white-space: pre-line; }
/* A Soly AI draft under its answer: a hairline card with what it is, the
   drafted title and two per-row actions (open the form, set it aside). */
.assistant-draft, .dcm-item { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; min-width: 0; max-width: 100%;
                   border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.assistant-draft-head { font: 600 11px/1.2 var(--font-mono); letter-spacing: .04em; text-transform: uppercase;
                        color: var(--violet-text); }
.assistant-draft-title { font-size: 13px; color: var(--ink); overflow-wrap: anywhere; }
.assistant-draft-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.assistant-draft-actions form { margin: 0; }
.assistant-waiting .assistant-text { color: var(--secondary); font-style: italic; }
.assistant-error { margin: 0; color: var(--red-text); }
.assistant-line { display: flex; flex-direction: column; gap: 4px; align-items: flex-start; min-width: 0; }
.assistant-line.assistant-from-me { align-items: flex-end; }
.assistant-who { font: 500 11px/1.4 var(--font-mono); letter-spacing: .08em; text-transform: uppercase; color: var(--secondary); flex: none; }
.assistant-text { margin: 0; font: 400 14px/1.55 var(--font-sans); color: var(--body); min-width: 0; max-width: 88%;
                  padding: 8px 12px; border-radius: var(--r-control); background: var(--table-head); }
.assistant-from-me .assistant-text { background: var(--violet-tint); color: var(--ink); }
.assistant-link { margin-top: 2px; flex: none; }
.assistant-ask { display: flex; flex-direction: column; gap: 10px; }
.assistant-ask .form-field { gap: 6px; }
.assistant-actions { display: flex; align-items: center; justify-content: flex-end; gap: 12px; flex-wrap: wrap; }
.assistant-budget { margin-right: auto; font-size: 12px; color: var(--secondary); min-width: 0; }
/* In the dialog the actions are 40px, as the guide's footer is; on the page
   the form keeps the 32px every other form has. */
.assistant-dialog .assistant-actions .button { padding: 0 18px; }
.assistant-card .assistant-thread { max-height: 460px; }
/* Soly AI Usage, the tab of the Soly AI page (templates/assistant_usage.html): two cards side by side
   that never stretch to each other, numbers right aligned in mono, a name
   with its 12px mono second line, and the month as bars over a hairline with
   its legend in words and its table below. */
.asu-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
@media (max-width: 1000px) { .asu-grid { grid-template-columns: minmax(0, 1fr); } }
.asu-table td.mono { white-space: nowrap; }
.asu-name { min-width: 0; }
.asu-second { display: block; font-size: 12px; color: var(--secondary); white-space: nowrap; }
.asu-unrecorded td { color: var(--secondary); }
.asu-unrecorded .asu-title { font-weight: 400; color: var(--body); }
.asu-legend { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; color: var(--body);
              white-space: nowrap; flex: none; }
.asu-swatch { display: inline-block; width: 12px; height: 12px; border-radius: 2px; background: var(--violet); flex: none; }
.asu-chart { padding: 4px 0 0; }
.asu-chart svg { display: block; width: 100%; height: 88px; }
.asu-bar { fill: var(--violet); }
.asu-base { stroke: var(--hairline); stroke-width: 1; vector-effect: non-scaling-stroke; }
@media (max-width: 720px) { .assistant-text { max-width: 100%; } }

/* ---- Costs (console Fleet -> Costs and Clients -> Costs, core/views_cloud_costs.py) ----
   The period filter in one row of 40px controls; the stacked bars in the
   series tokens, one colour per resource type in a fixed order (never by
   rank), a 2px gap of the card's colour between segments, every bar
   focusable with its figures as its title, and the same figures as a table
   in the fold under it; the amounts right-aligned in mono. */
.cc-filters, .content > form.cc-filters { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 10px; }
.cc-legend { margin-top: 2px; }
.cc-filters [hidden] { display: none !important; }
.cc-filters .cc-date { display: inline-flex; align-items: center; gap: 8px; flex: none; }
.cc-filters .cc-date .doc-entry { height: 40px; min-height: 40px; width: auto; padding: 0 10px; font-size: 14px;
  color: var(--ink); background: var(--card); border: 1px solid var(--field-rule); border-radius: var(--r-control); }
.cc-filters .cc-show { height: 40px; flex: none; }
.cc-filters .cc-range { margin-left: auto; white-space: nowrap; color: var(--secondary); flex: none; }
.cc-fetch { flex: none; }
.cc-fetch .button { white-space: nowrap; }
.swatch.cc-s-instance, .cc-seg.cc-s-instance { background: var(--violet); fill: var(--violet); }
.swatch.cc-s-database, .cc-seg.cc-s-database { background: var(--teal); fill: var(--teal); }
.swatch.cc-s-storage, .cc-seg.cc-s-storage { background: var(--blue); fill: var(--blue); }
.swatch.cc-s-disk, .cc-seg.cc-s-disk { background: var(--amber); fill: var(--amber); }
.swatch.cc-s-other, .cc-seg.cc-s-other { background: var(--disabled); fill: var(--disabled); }
/* outside OVHcloud's bill, stacked on top (FLOWS 7.444): Mistral AI as Cisoly counts it, Scaleway's mail */
.swatch.cc-s-mistral, .cc-seg.cc-s-mistral { background: var(--green); fill: var(--green); }
.swatch.cc-s-mail, .cc-seg.cc-s-mail { background: var(--red); fill: var(--red); }
.cc-legend .swatch { flex: none; }
.cc-type .swatch { flex: none; }
.cc-chart { margin-top: 10px; }
.cc-chart svg { display: block; width: 100%; height: auto; max-height: 280px; }
.cc-chart .trend-axis { font-size: 10px; }
.cc-seg { stroke: var(--card); stroke-width: 2px; }
.cc-hit { fill: transparent; }
.cc-bar { cursor: default; }
.cc-bar:hover .cc-hit, .cc-bar:focus-visible .cc-hit { fill: var(--violet-tint); }
.cc-bar:focus-visible .cc-hit { stroke: var(--focus-ring); stroke-width: 2px; }
.cc-base { stroke: var(--rule); stroke-width: 1; }
.cc-fold { margin-top: 10px; }
.cc-fold > summary { cursor: pointer; font-size: 13px; }
.cc-table .r { text-align: right; white-space: nowrap; }
.cc-name { min-width: 0; max-width: 460px; }
.cc-title, .soly-conv-title, .asu-title { display: block; font: 600 15px/1.35 var(--font-sans); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cc-title { text-decoration: none; }
.soly-conv-title { min-width: 0; }
a.cc-title:hover { text-decoration: underline; }
.cc-second { display: block; }
.cc-name > .cc-title, .cc-name > .cc-second { max-width: 420px; }
.cc-clients .cc-name > .cc-title, .cc-clients .cc-name > .cc-second { max-width: 240px; }
.cc-type { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.cc-table tfoot th, .cc-table tfoot td { font-weight: 600; border-top: 1px solid var(--rule); background: var(--canvas); color: var(--ink); text-align: left; }
.cc-table tfoot td.r { text-align: right; }
.cc-table tbody tr.cc-shared > td { background: var(--canvas); }
.cc-problems > summary { cursor: pointer; list-style: none; }
.cc-problems > summary::-webkit-details-marker { display: none; }
.cc-problem-list { margin: 10px 0 0; padding-left: 20px; display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: var(--body); }
.cc-rights { margin: 6px 0 0; padding-left: 18px; }
.cc-sum { margin: 10px 0 0; }
@media (max-width: 640px) { .cc-filters .cc-range { margin-left: 0; } }

/* Setup restyle: settings tabs (2026-09-23) */
/* The tabs of Setup -> Settings (templates/settings.html with
   _settings_environment, iso_k_assets, _settings_branding,
   _settings_encryption, _report_sharing and _settings_custom_domain), all
   scoped to .setup-tab, the class of each tab panel. No title under the
   tab bar (Rinat, 2026-09-26): a tab opens with its first card, 14px under
   the bar; cards of one anatomy, 16px apart and 16px
   inside: a heading of glyph and h2 with the state pill on the right, at
   most one 12px line, a two-column grid of 13px/600 labels above 40px
   fields (read-only facts in three columns), closed folds for what is not
   needed every day, and the one action row at the bottom right. */
div.tab-panel.setup-tab, .setup-tab .setup-stack { display: flex; flex-direction: column; gap: 16px; min-width: 0; }

/* the card: heading, one 12px line, content, action row */
.setup-tab .card { padding: 16px; min-width: 0; }
.setup-tab .card-heading { margin-bottom: 10px; min-height: 28px; gap: 12px; }
.setup-tab .card-heading-links { min-width: 0; gap: 8px; }
.setup-tab .card-heading-links > h2 { margin: 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.setup-tab .card-heading-links > .icon { width: 20px; height: 20px; flex: none; }
.setup-tab .card-heading-links > .eyebrow, .setup-tab .card-heading > .eyebrow { flex: none; white-space: nowrap; margin: 0; }
.setup-tab .setup-pills { display: inline-flex; align-items: center; gap: 6px; flex: none; white-space: nowrap; }

/* fields: labels above, two columns (one on a phone), same widths on every tab */
.setup-tab .form.setup-form { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px 20px; align-items: start; margin: 0; }
.setup-tab .setup-form > label, .setup-tab .setup-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.setup-tab .setup-label { font: 600 13px/1.3 var(--font-sans); color: var(--body); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.setup-tab .setup-value, .sknw-value, .facts dd { font: 400 14px/1.4 var(--font-sans); color: var(--ink); overflow-wrap: anywhere; }
.setup-tab .setup-value { min-width: 0; }
.setup-tab .setup-value.mono { font-family: var(--font-mono); font-size: 13px; }
.setup-tab .setup-form .doc-entry { width: 100%; }
.setup-tab .setup-help, .assistant-note, .setup-tab .setup-card-sub { line-height: 1.5; }
.assistant-note { margin: 0; }
.setup-tab .setup-card-sub { margin: -4px 0 12px; }
.setup-tab .setup-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px 20px; align-items: start; }
.setup-tab .setup-form label.toggle-row, .setup-tab .setup-form label.tick-mark, .setup-tab .setup-ticks label.tick-mark {
  flex-direction: row; align-items: center; gap: 8px; font: 400 14px/1.4 var(--font-sans); color: var(--ink); }
.setup-tab .setup-form label.toggle-row { min-height: 40px; }
@media (max-width: 720px) {
  .setup-tab .form.setup-form, .setup-tab .setup-facts { grid-template-columns: minmax(0, 1fr); }
}

/* the logo: the box, then the file drop zone (_file_drop.html) and the hint */
.setup-tab .setup-logo { display: flex; gap: 16px; align-items: flex-start; min-width: 0; }
.setup-tab .setup-logo .logo-box { width: 96px; height: 96px; }
.setup-tab .setup-logo-side { flex: 1; display: flex; flex-direction: column; align-items: stretch; gap: 8px; min-width: 0; }

/* folds inside a card: a hairline, then a violet summary with a chevron */
.setup-tab details.setup-fold { margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--hairline); min-width: 0; }
.setup-tab details.setup-fold > summary { list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; min-height: 28px;
  font: 600 13px/1.3 var(--font-sans); color: var(--violet-text); white-space: nowrap; }
.setup-tab details.setup-fold > summary::-webkit-details-marker { display: none; }
.setup-tab details.setup-fold > summary::before { content: "\203A"; color: var(--secondary); font-size: 16px; line-height: 1;
  transition: transform var(--t-fast) var(--ease); }
.setup-tab details.setup-fold[open] > summary::before { transform: rotate(90deg); }
.setup-tab details.setup-fold[open] > summary { margin-bottom: 10px; }
.setup-tab details.card-fold > summary .setup-count { margin-left: 2px; }
.setup-tab .setup-fold-body { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.setup-tab .setup-fold-body > .report { margin: 0; }
.setup-tab .setup-fold-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.setup-tab .setup-fold-row .doc-entry { flex: 1 1 240px; max-width: 360px; }
.setup-tab .setup-fold-row .button { flex: none; }
@media (prefers-reduced-motion: reduce) { .setup-tab details.setup-fold > summary::before { transition: none; } }

/* encryption: the vaults' steps, the table of earlier keys, the way back */
.soly-asks, .setup-tab fieldset.setup-vault, .ccopy-sources, .sck-reasons { border: 0; padding: 0; margin: 0; min-width: 0; display: flex; flex-direction: column; }
.setup-tab fieldset.setup-vault { gap: 12px; }
.setup-tab fieldset.setup-vault[hidden] { display: none; }
.setup-tab .setup-steps, .setup-tab .setup-howto { margin: 0; padding-left: 20px; display: flex; flex-direction: column; font: 400 13px/1.5 var(--font-sans); color: var(--body); }
.setup-tab .setup-steps { gap: 4px; }
.setup-tab .setup-cell-wrap { overflow-wrap: anywhere; }
.setup-tab .setup-key-name { min-width: 0; }
.setup-tab .setup-key-title { display: block; font: 600 15px/1.35 var(--font-sans); color: var(--ink); }
.setup-tab .setup-row-actions { text-align: right; white-space: nowrap; width: 1%; }
.setup-tab .setup-row-actions .button { white-space: nowrap; }
.setup-tab .setup-inline-form { display: block; margin: 6px 0 0; }
.setup-tab .setup-access-row > td { padding: 16px; }
.setup-tab .setup-back { display: flex; align-items: center; gap: 16px; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--hairline); }
.setup-tab .setup-back-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.setup-tab .setup-back-text h3, .setup-tab .setup-howto h3, .distribution-heading .mono, .sknw-label, .procd-empty-title, .rqx-h3, .dl-ask-text > strong, .rep-choice-name, .help-tip-title { line-height: 1.4; }
.cp-card-choice strong { line-height: 1.3; }
.rs-label { line-height: 1.3; }
.rqx-h3 { margin: 16px 0 8px; }
.setup-tab .setup-back .button { flex: none; white-space: nowrap; }

/* reporting: the link, the two texts side by side, the key */
.setup-tab .setup-ticks { margin-top: 12px; }
.setup-tab .setup-texts { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: 16px 20px; align-items: start; margin: 0; }
.setup-tab .setup-label-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
.setup-tab .setup-label-row .setup-label { flex: none; }
.setup-tab .setup-label-row .eyebrow { margin: 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 900px) { .setup-tab .setup-texts { grid-template-columns: minmax(0, 1fr); } }

/* custom domain: the record values in 12px mono, the address to open */
.setup-tab .setup-records td.mono { font-size: 12px; }
/* custom domain, one list card per hostname (_settings_custom_domain.html):
   the heading line the name 18/600 with its kind as the mono eyebrow and the
   state pill on the right, the line of the last check (.list-note, 12px) 10px
   under it in the same head -- the title column grows along the line and
   never in height (a column wrapper turned its 320px basis into 320px of
   white, FLOWS 7.590); the two records edge to edge, name and
   value in mono with a 32px icon-only copy button beside each, the result
   right aligned as a dot and a word; the foot band with the address (or
   what happens next) on the left and Remove and Check now on the right. */
.cdom-card .list-head { row-gap: 10px; }
.cdom-card .list-head-title { flex: 1 1 0; flex-wrap: nowrap; }
.cdom-card .list-head-title h2 { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.cdom-card .list-head-title .eyebrow { flex: none; margin: 0; white-space: nowrap; }
.cdom-card .list-head > .cdom-head-line { flex-basis: 100%; padding: 0; }
.data-table.cdom-records > tbody > tr > td { vertical-align: middle; }
.cdom-records .cdom-type { width: 1%; white-space: nowrap; }
.cdom-copy-line { display: flex; align-items: center; gap: 8px; min-width: 0; }
.cdom-records code.cdom-code { font: 500 13px/20px var(--font-mono); color: var(--ink); background: none; border: 0; padding: 0;
  min-width: 0; overflow-wrap: anywhere; word-break: break-all; }
.button.small.cdom-copy { display: inline-flex; align-items: center; justify-content: center; flex: none; white-space: nowrap;
  min-width: 32px; height: 32px; min-height: 32px; padding: 0 8px; }
.cdom-copy .icon { width: 16px; height: 16px; }
.cdom-records .cdom-result { width: 1%; text-align: right; white-space: nowrap; }
.cdom-records td.cdom-result > .cell-sub { display: block; min-width: 160px; max-width: 280px; margin-left: auto;
  white-space: normal; overflow-wrap: anywhere; font-size: 12px; line-height: 18px; }
.cdom-card .list-foot { gap: 8px 16px; }
.cdom-card .cdom-open, .cdom-card .cdom-next { flex: 1 1 320px; min-width: 0; }
.cdom-link { font: 500 13px/20px var(--font-mono); color: var(--violet-text); text-decoration: none; overflow-wrap: anywhere; }
.cdom-link:hover { text-decoration: underline; text-underline-offset: 2px; }
.cdom-actions { display: flex; align-items: center; gap: 8px; flex: none; margin: 0 0 0 auto; }
.cdom-actions .button.small { height: 32px; min-height: 32px; padding: 0 12px; font: 600 13px/1 var(--font-sans); white-space: nowrap; flex: none; }
.cdom-actions .button.small.cdom-remove { color: var(--red-text); }
.cdom-actions .button.small.cdom-remove:hover { background: var(--red-tint); }
/* custom domain, the set-up fold: numbered steps, a table of records per
   hostname (its caption the kind and the name), notes, the lookups */
.setup-tab .setup-howto { gap: 16px; }
.setup-tab .setup-howto > li { min-width: 0; padding-left: 4px; }
.setup-tab .setup-howto-step { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.setup-tab .setup-howto > li::marker { font: 600 14px/1.4 var(--font-sans); color: var(--ink); }
.setup-tab .setup-howto h3 { margin: 0; }
.setup-tab .setup-howto p { margin: 0; }
.setup-tab .setup-howto-records caption { caption-side: top; text-align: left; padding: 0 0 6px;
  font: 600 13px/1.4 var(--font-sans); color: var(--ink); }
.setup-tab .setup-howto-records caption .mono { font-weight: 500; }
.setup-tab .setup-howto-name { font-size: 13px; font-weight: 600; color: var(--ink); }
.setup-tab .setup-howto-records .rr-line { margin-top: 2px; font-size: 12px; }
.setup-tab .setup-howto-notes { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 4px; }
.setup-tab .setup-howto-notes .pill { margin-right: 4px; }
.setup-tab .setup-howto-commands { margin: 0; padding: 10px 12px; overflow-x: auto; background: var(--canvas);
  border: 1px solid var(--hairline); border-radius: var(--r-control); font: 400 12px/1.6 var(--font-mono); color: var(--ink); }

/* Setup restyle: organisation, integrations, import, export (2026-09-23) */
/* The cards of Domains (templates/domains.html, domain_edit.html), the
   import centre, the export centre and the CSV wizard (import_page.html,
   export.html, import_csv.html): the heading line, at most one 12px line,
   the content, the action row, spaced by gap and not by margins. */
.dom-card, .ie-card, .icsv-card { display: flex; flex-direction: column; gap: 10px; }
.dom-card > .card-heading, .ie-card > .card-heading, .icsv-card > .card-heading { margin: 0; }
.dom-line, .ie-line, .icsv-line { margin: 0; font-size: 12px; line-height: 1.5; color: var(--secondary); }
/* 4px of gap and the action row's own 12px above it: 16px between the fields and the row. */
.dom-form { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.dom-card .form-hint { margin-top: 4px; }
/* A table cell of two lines: the title 15px/600, below it the 12px line. */
.ie-table .rr-title, .dom-table .rr-title, .icsv-card .data-table .rr-title { display: block; }
.ie-table .rr-sub, .dom-table .rr-sub, .icsv-card .data-table .rr-sub, .dom-table .dom-note { display: block; margin-top: 2px; }
.ie-table .rr-meta { display: block; margin-top: 4px; }
.dom-name { display: flex; align-items: center; gap: 8px; min-width: 0; }
.dom-name .rr-title { display: inline; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ie-table td.ie-action, .dom-table td.ie-action, .icsv-card .data-table td.ie-action { width: 1%; text-align: right; white-space: nowrap; }
.ie-table td.ie-action form { display: inline-flex; margin: 0; }
/* The empty state: one row, the glyph, one sentence, one action, left aligned. */
.dom-card .is-empty, .ie-card .is-empty { min-height: 40px; padding: 0; gap: 8px; font-size: 14px; color: var(--body); }
.dom-table td .is-empty { min-height: 0; }
.dom-card .is-empty .icon, .ie-card .is-empty .icon, .rset-locked .icon, .acc-level .icon, .hist-rule > details > summary > .icon, .rdmp-toggle .icon, .member-mfa-lock, .dl-collapsed-line .icon, .srun-fold-toggle .icon, .srun-chevron, .stb-caret { width: 16px; height: 16px; color: var(--secondary); flex: none; }
.dom-card .is-empty .card-link, .ie-card .is-empty .card-link { font-size: 14px; white-space: nowrap; flex: none; }
/* The CSV wizard's file field: the browser's own button drawn as a hairline button. */
.icsv-card input[type="file"].doc-entry { padding: 3px 4px; }
.icsv-card input[type="file"]::file-selector-button { height: 30px; margin-right: 10px; padding: 0 12px; cursor: pointer;
  font: 600 13px/1 var(--font-sans); color: var(--ink); background: var(--card);
  border: 1px solid var(--hairline); border-radius: var(--r-control); }
.icsv-card input[type="file"]::file-selector-button:hover { background: var(--canvas); }

/* Integrations (templates/links.html): per group a section heading line
   (the title, the mono count, "Only this group" at the right) and a grid of
   cards of one anatomy: the monogram and the name, one sentence, the fold
   with how it works, the state lines, and per connection one row with its
   pill at the left and its hairline actions at the right. Cards keep their
   own height (align-items: start). The .link-heading and .link-footer rules
   of the linked-documents block above are undone here for these cards. */
.link-group + .link-group { margin-top: 10px; }
.link-group-heading { min-height: 32px; margin-bottom: 10px; gap: 12px; align-items: baseline; }
.link-group-heading .eyebrow { font: 500 12px/1.4 var(--font-mono); letter-spacing: .06em; color: var(--secondary); white-space: nowrap; }
.link-group-heading .group-show { align-self: center; white-space: nowrap; font-size: 13px; }
.link-grid { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 14px; align-items: start; grid-auto-rows: auto; }
.link-card { height: auto; padding: 16px; gap: 10px; border: 1px solid var(--rule); border-radius: var(--r-card); }
.link-card .link-heading { display: flex; justify-content: flex-start; align-items: center; gap: 12px;
  min-height: 40px; padding-right: 0; }
.link-card .link-target { flex: none; font-size: 14px; line-height: 1.45; color: var(--body); }
.link-card .link-more > summary { position: static; width: auto; height: auto; border: 0; background: none;
  display: inline-flex; align-items: center; gap: 6px; padding: 0; font: 600 13px/1.4 var(--font-sans);
  color: var(--violet-text); list-style: none; cursor: pointer; }
.link-card .link-more > summary:hover { text-decoration: underline; text-underline-offset: 2px; }
.link-card .link-more > summary .icon { transform: none; transition: transform var(--t-fast) var(--ease); }
.link-card .link-more[open] > summary .icon { transform: rotate(90deg); }
.link-card .link-explanation { margin: 8px 0 0; }
.link-card .link-state { gap: 4px; }
.link-card .link-state .card-sub { font-size: 12px; line-height: 1.5; }
.link-card .link-actions { display: inline-flex; align-items: center; justify-content: flex-end; flex-wrap: wrap;
  gap: 6px; margin-left: auto; min-width: 0; }
.link-card .link-actions .ntf-inline { gap: 6px; }
.link-card .link-docs-form .button {
  min-height: 32px; padding: 0 12px; font: 600 13px/1 var(--font-sans); white-space: nowrap; flex: none;
  color: var(--ink); background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-control);
  display: inline-flex; align-items: center; gap: 6px; }
.link-card .link-docs-form .button:hover { background: var(--canvas); }
@media (prefers-reduced-motion: reduce) { .link-card .link-more > summary .icon { transition: none; } }
/* Setup restyle: logs, trust, notifications, account (2026-09-23) */
/* The pages Logs, Log export, Trust centre, Notification settings,
   Notifications, My account and Security as the brand book draws them
   (§23): the heading line of a card with its eyebrow, at most one 12px line
   under it, the content, the primary at the foot; cards 16px apart. */
.card .sp-line { display: block; margin: 0 0 10px; font-size: 12px; line-height: 1.5; color: var(--secondary); max-width: 100%; }
.card > .table-wrap + .sp-line, .card > form > .table-wrap + .sp-line { margin: 10px 0 0; }
.card .sp-line:empty { display: none; }
.sp-stack, div.tab-panel.sp-stack { display: flex; flex-direction: column; gap: 16px; }
/* A card that is itself the form keeps the card's own rhythm, not the
   page's gap between cards (.content > form). */
.content > form.card.sp-form { display: block; }
div.tab-panel.sp-stack[hidden] { display: none; }
.sp-strong { font-weight: 600; color: var(--ink); }
/* A closed fold for the long explanation a card keeps (the push of the log export). */
.sp-fold { margin-top: 12px; border-top: 1px solid var(--hairline); padding-top: 10px; }
.sp-fold > summary { cursor: pointer; font: 600 13px/1.4 var(--font-sans); color: var(--violet-text); width: max-content; max-width: 100%; }
.sp-fold[open] > summary { margin-bottom: 8px; }
.sp-fold > p { margin: 0 0 8px; font-size: 12px; line-height: 1.55; color: var(--body); max-width: 860px; }
.sp-fold > p:last-child { margin-bottom: 0; }
/* Logs: the filter row -- the search takes the room, the action select, the
   two dates each with its mono label in the same line, Filter; all 40px. */
.logs-card .log-filter { align-items: center; }
.logs-card .log-filter .doc-entry { min-width: 0; }
.logs-card .log-filter .rr-search { flex: 1 1 160px; min-width: 150px; }
.logs-card .log-filter .rr-search .doc-entry { height: 40px; min-height: 40px; padding: 0 40px 0 14px; font-size: 14px;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); }
.logs-card .log-filter select.rr-filter { max-width: 180px; }
.logs-card .log-date { flex-direction: row; align-items: center; gap: 8px; flex: none; }
.logs-card .log-date .eyebrow { margin: 0; white-space: nowrap; }
.logs-card .log-date .doc-entry { height: 40px; min-height: 40px; width: 136px; padding: 0 8px; font-size: 14px;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); color: var(--ink); }
.logs-card .log-filter > .button { flex: none; }
.logs-card .log-filter .rr-clear { white-space: nowrap; flex: none; }
.logs-card .log-detail { font-size: 13px; line-height: 1.45; color: var(--body); min-width: 220px; }
.logs-card .pagination { margin-top: 10px; }
.card .data-table td .empty-row { min-height: 40px; }
/* Trust centre: the decision beside a pending request, one line. */
.sp-decide { display: flex; align-items: center; gap: 6px; margin: 0; }
.sp-decide .sp-days { width: 72px; flex: none; }
.ntf-table .rr-sub { display: block; margin-top: 2px; }
/* Setup -> Notification settings (docs/FLOWS.md 7.156): the defaults table,
   a group with its line in the first column and a segmented choice per
   channel, centred in the row; below it the daily digest, its title with
   the line beside it and the hour. */
.ntf-defaults td.ntf-group { width: 290px; min-width: 200px; }
.ntf-defaults td.ntf-cell { vertical-align: middle; white-space: nowrap; }
.ntf-defaults td.ntf-cell .card-link { font-size: 13px; }
.list-card > .list-form > .list-body.ntf-digest { display: flex; flex-direction: column; gap: 10px; border-top: 1px solid var(--hairline); }
.ntf-digest-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 10px; }
.ntf-digest-field { display: flex; align-items: center; gap: 12px; }
.ntf-digest-field .form-label { margin: 0; white-space: nowrap; }
.ntf-digest-field .doc-entry { width: 120px; height: 40px; min-height: 40px; font-size: 14px; }
/* The person's own choices (Notifications -> Preferences, the same table):
   in a cell without an own choice nothing is chosen and the organisation's
   default is outlined dashed, its words in the legend at the left of the
   grey band; Reset beside a row with own choices, in a narrow last column;
   the organisation's digest hour read only. */
.ntf-personal .segment:not(:has(input:checked)) .segment-default { outline: 1px dashed var(--violet-text); outline-offset: -2px; color: var(--violet-text); }
.ntf-defaults td.ntf-reset-col, .ntf-defaults th.ntf-reset-col { width: 1%; text-align: right; }
.ntf-legend { display: inline-flex; align-items: center; gap: 8px; margin-right: auto; font-size: 12px; color: var(--secondary); white-space: nowrap; flex: none; }
.ntf-legend-mark { width: 24px; height: 16px; border: 1px dashed var(--violet-text); border-radius: var(--r-control); flex: none; }
.ntf-digest-field .mono { font-size: 14px; color: var(--ink); }
.card .form-grid.sp-fields { margin-top: 12px; }
/* Security: the label column wide enough for the longest
   label in either language ("Tweefactorauthenticatie"). */
@media (min-width: 761px) {
  [data-security-card] .acc-field { grid-template-columns: minmax(200px, 16rem) minmax(0, 1fr) auto; }
}
@media (max-width: 720px) {
  .logs-card .log-date { flex: 1 1 100%; }
  .logs-card .log-date .doc-entry { flex: 1 1 auto; width: auto; }
}

/* A desk row of another domain (core/domains.elsewhere): the title plain, the way there under it. */
.rr-id-link.is-away { color: var(--secondary); }
.rr-away { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 4px; font-size: 12px; line-height: 1.4; color: var(--secondary); }
.rr-away .button.small { flex: none; }

/* Custom domain steps: what to copy stands in a mono box with its Copy button;
   the preview shows the two records as a provider's DNS list would. */
.setup-copy-line { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.setup-copy-value { font: 500 13px/1.4 var(--font-mono); color: var(--ink); background: var(--canvas); border: 1px solid var(--hairline); border-radius: var(--r-badge); padding: 3px 8px; word-break: break-all; min-width: 0; }
.setup-copy { flex: none; }
.setup-howto-map { margin: 8px 0; padding: 8px 12px; border-left: 3px solid var(--violet); background: var(--violet-tint); font-size: 13px; color: var(--ink); }
.setup-preview { margin: 12px 0; padding: 12px; border: 1px dashed var(--rule); border-radius: var(--r-control); background: var(--canvas); }
.setup-preview figcaption { font-size: 13px; margin-bottom: 8px; }
.setup-preview-table { width: 100%; border-collapse: collapse; font: 500 12.5px/1.4 var(--font-mono); background: var(--card); }
.setup-preview-table th { text-align: left; font: 600 11px var(--font-mono); text-transform: uppercase; letter-spacing: .06em; color: var(--secondary); padding: 6px 10px; border-bottom: 1px solid var(--hairline); }
.setup-preview-table td { padding: 8px 10px; border-bottom: 1px solid var(--hairline); color: var(--ink); word-break: break-all; }
.setup-preview-table tr:last-child td { border-bottom: 0; }

/* ---- People → Domains: the table in the shape of the tree (templates/domains.html,
   Rinat's design of 2026-09-23). Column one draws the tree: per level 30px, the
   chevron of level L centred at 28 + 30L, the name 18px to its right; guide lines
   1px in --rule join a row to its parent's chevron. Numbers right aligned in mono,
   the state a dot with its word, the footer the counts per level. ---- */
.dom-table { --dom-step: 30px; --dom-x0: 28px; }
.dom-table thead th { font: 600 13px/1 var(--font-mono); letter-spacing: .1em; text-transform: uppercase; }
.dom-table tbody tr > td, .dom-table tbody tr:nth-child(even) > td { background: var(--card); }
.dom-table tbody tr:hover > td { background: var(--violet-tint); }
.dom-table tbody tr[hidden] { display: none; }
.dom-table th.dom-num, .dom-table td.dom-num { text-align: right; }
.dom-table td.dom-num { font-size: 14px; color: var(--ink); }
.dom-table td.dom-code { font-size: 14px; color: var(--ink); }
.dom-tree-cell { position: relative; min-width: 260px; max-width: 420px;
  padding-left: calc(var(--dom-x0) + var(--lv) * var(--dom-step) + 18px) !important; }
.dom-tree-cell .dom-name { display: flex; align-items: center; gap: 10px; min-width: 0; }
.dom-tree-cell .rr-title { font-size: 15px; font-weight: 600; color: var(--ink); }
.dom-tree-cell .dom-note { display: block; margin-top: 2px; font-size: 12px; line-height: 1.5; color: var(--body);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dom-tree-cell .dom-note.none { color: var(--secondary); }
.dom-guide { position: absolute; pointer-events: none; background: var(--rule); }
/* a parent's line running on past this row */
.dom-guide.dom-through { top: 0; bottom: 0; width: 1px; left: calc(var(--dom-x0) + var(--at) * var(--dom-step)); }
/* from the parent's chevron down to this row: to its middle when it is the last child */
.dom-guide.dom-up { top: 0; bottom: 0; width: 1px; left: calc(var(--dom-x0) + (var(--lv) - 1) * var(--dom-step)); }
.dom-guide.dom-up.last { bottom: 50%; }
/* across to the chevron, or to just before the name */
.dom-guide.dom-elbow { top: 50%; height: 1px; left: calc(var(--dom-x0) + (var(--lv) - 1) * var(--dom-step));
  width: calc(var(--dom-step) + 10px); }
.dom-guide.dom-elbow.to-toggle { width: calc(var(--dom-step) - 12px); }
/* from this row's chevron down to its first child */
.dom-guide.dom-down { top: calc(50% + 10px); bottom: 0; width: 1px; left: calc(var(--dom-x0) + var(--lv) * var(--dom-step)); }
.is-folded .dom-guide.dom-down { display: none; }
.dom-toggle { position: absolute; top: 50%; left: calc(var(--dom-x0) + var(--lv) * var(--dom-step) - 10px);
  transform: translateY(-50%); width: 20px; height: 20px; padding: 0; border: 0; border-radius: 4px; background: transparent;
  color: var(--secondary); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.dom-toggle:hover { color: var(--ink); background: var(--violet-tint); }
.dom-toggle svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round;
  stroke-linejoin: round; transition: transform var(--t-fast) var(--ease); }
.dom-toggle[aria-expanded="false"] svg { transform: rotate(-90deg); }
.dom-state { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; font-weight: 600; font-size: 14px; color: var(--secondary); }
.dom-state.on { color: var(--green-text); }
/* the 8px state dot: a domain's row, the trust page preview's window bar, an OT requirement's evidence point (one
   rule; it stood in ot.css, the OT quality review of 2026-10-23) */
.otb-point, .tapp-bar > i, .dom-state .dom-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--disabled); flex: none; }
.dom-state.on .dom-dot { background: var(--green); }
.dom-table tfoot td { background: var(--canvas); border-top: 1px solid var(--hairline); padding: 12px 16px; }
.dom-foot { display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; font-size: 12px;
  letter-spacing: .1em; text-transform: uppercase; color: var(--body); }
@media (prefers-reduced-motion: reduce) { .dom-toggle svg { transition: none; } }

/* GDPR fixes 2026-09-23 (docs/FLOWS.md 7.42): the record of processing in folds.
   The problems a fold names under its heading, and the screening checklist of
   the DPIA (article 35(3) and the EDPB criteria) as a grid of tick marks. */
.proc-problems { margin: 0 0 10px; padding-left: 18px; display: grid; gap: 4px; font-size: 12px; color: var(--red-text); }
.proc-checks { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 6px 16px; margin: 0; padding: 0; border: 0; min-width: 0; }
.proc-checks legend { padding: 0; }
.proc-checks .tick-mark, .proc-checks .tick-mark span { min-width: 0; }
/* ---- scope fixes (2026-09-23): the framework line under a library obligation ---- */
.obld-framework { margin-top: 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 13px; }
.obld-framework .isog-tick { display: inline-flex; align-items: center; gap: 6px; }

/* ---- Form folds (task wtforms, 2026-09-24; docs/FLOWS.md 7.47) ----
   A long form is kept to one screen: the identity and the required fields
   stand open, the rest in named folds. A fold's summary line carries the
   name on the left and, while it is closed, a mono digest of what is
   inside on the right; "Show all fields" above the columns opens every
   fold at once. In the content column the folds stack their fields one
   under the other (form-fold-fields); in the assessment they keep the
   two-column row. */
.rn-links > .form-fold { margin-top: 0; }
.rn-form .form-fold-bar { padding: 8px 24px 0; }
/* the same fold as a card of a page that is one form in sections (the OT
   asset, the continuity plan): the summary is the card heading, the digest
   stands where the card's sub line stands and goes when the fold opens; a
   register-style heading line (rr-heading) folds the same way */
details.card-fold > summary.card-heading .form-fold-digest { flex: none; text-align: left; }
details.card-fold[open] > summary.card-heading .form-fold-digest { display: none; }

/* The flow step (templates/flow_step.html, Rinat's design of 2026-09-26):
   the form card of Assurance with its sections full width (the heading
   over the fields, "Step" 20px with its mono code), the flags as bordered
   checkboxes of the fields' height, a white foot; under it the previous and
   next step as two cards; on the right "In this flow", the numbered steps
   with this one filled violet on a violet tint, and "Open diagram". */
.fstep-layout { display: grid; grid-template-columns: minmax(0, 1fr) 420px; gap: 36px; align-items: start; }
.fstep-main { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.form-card.fstep-card .list-form > .form-section, .form-card.form-stacked .list-form > .form-section { display: flex; flex-direction: column; gap: 20px; }
.form-card.form-stacked .list-form > .form-section { align-items: stretch; }
.fstep-card .form-section-head { flex-direction: row; align-items: baseline; gap: 10px; }
.fstep-card .fstep-head > h2 { font-size: 20px; }
.fstep-code { font: 500 14px/1 var(--font-mono); color: var(--secondary); white-space: nowrap; flex: none; }
.fstep-card .card-actions.list-foot { background: var(--card); padding: 16px 24px; }
.fstep-flags { display: flex; flex-wrap: wrap; gap: 12px; }
.fstep-flag { display: inline-flex; align-items: center; gap: 10px; height: 48px; padding: 0 16px; border: 1px solid var(--field-rule);
  border-radius: var(--r-control); background: var(--card); font: 400 15px/1 var(--font-sans); color: var(--ink);
  white-space: nowrap; flex: none; cursor: pointer; }
.fstep-flag:has(input:checked) { border-color: var(--violet); background: var(--violet-tint); }
.fstep-flag input { margin: 0; width: 16px; height: 16px; }
.fstep-pager { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.card.fstep-nav { display: flex; flex-direction: column; gap: 4px; padding: 14px 20px; min-width: 0; text-decoration: none; color: var(--ink); }
.card.fstep-nav:hover { border-color: var(--violet); }
.card.fstep-nav.fstep-next { grid-column: 2; align-items: flex-end; text-align: right; }
.fstep-nav-name, .aplan-name { max-width: 100%; font: 600 15px/1.4 var(--font-sans); color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fstep-flow .list-head { flex-wrap: nowrap; }
.fstep-flow .list-head-title h2 { font-size: 16px; }
.fstep-flow .list-head > .eyebrow { flex: none; white-space: nowrap; }
.fstep-steps { list-style: none; margin: 0; padding: 12px; display: flex; flex-direction: column; gap: 8px; }
.fstep-step { display: flex; align-items: center; gap: 16px; min-height: 52px; padding: 0 12px; border-radius: var(--r-control);
  font: 500 16px/1.3 var(--font-sans); color: var(--ink); text-decoration: none; }
.fstep-step:hover { background: var(--canvas); }
.fstep-step[aria-current] { background: var(--violet-tint); color: var(--violet-text); font-weight: 600; }
.fstep-num { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; flex: none;
  border: 1px solid var(--field-rule); border-radius: 50%; font: 600 13px/1 var(--font-sans); color: var(--ink); }
.fstep-step[aria-current] .fstep-num { background: var(--violet); border-color: var(--violet); color: #fff; }
.fstep-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fstep-flow-foot { padding: 16px 24px; border-top: 1px solid var(--hairline); }
.fstep-open, .dash-fw-name { font: 600 15px/1.4 var(--font-sans); text-decoration: none; }
.fstep-open { color: var(--violet-text); }
.fstep-open:hover { text-decoration: underline; text-underline-offset: 2px; }
@media (max-width: 1180px) { .fstep-layout { grid-template-columns: minmax(0, 1fr); gap: 16px; } }
@media (max-width: 720px) {
  .fstep-pager { grid-template-columns: minmax(0, 1fr); }
  .card.fstep-nav.fstep-next { grid-column: 1; }
  .form-card.fstep-card .list-form > .form-section, .form-card.form-stacked .list-form > .form-section { padding: 16px; }
}


/* The requirements set on the Frameworks page (templates/frameworks.html,
   Rinat's design of 2026-09-24): current beside latest in one box, the
   latest cell tinted violet when it is newer, one line and one action below. */
.creq-card { display: flex; flex-direction: column; gap: 16px; }
.creq-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin: 0; }
.creq-titles { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.creq-titles h2 { margin: 0; }
.creq-heading .button { flex: none; white-space: nowrap; }
.creq-box { display: grid; grid-template-columns: 1fr 1fr; border: 1px solid var(--hairline); border-radius: 4px; overflow: hidden; }
.creq-cell { display: flex; flex-direction: column; gap: 6px; padding: 16px 20px; min-width: 0; }
.creq-cell + .creq-cell { border-left: 1px solid var(--hairline); }
.creq-cell.is-new { background: var(--violet-tint); }
.creq-cell.is-new .eyebrow, .creq-cell.is-new .creq-version { color: var(--violet-text); }
.creq-version { display: flex; align-items: center; gap: 10px; font: 600 22px/1.2 var(--font-mono); color: var(--ink); }
.creq-meta { font-size: 14px; color: var(--secondary); }
.creq-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.creq-count { font-size: 15px; color: var(--body); }
.creq-count b { color: var(--ink); font-weight: 600; }
.creq-sep { margin: 0 8px; color: var(--secondary); }
@media (max-width: 640px) {
  .creq-box { grid-template-columns: 1fr; }
  .creq-cell + .creq-cell { border-left: 0; border-top: 1px solid var(--hairline); }
}

/* ---- scoring (package A, 2026-09-24): the score card of a control on a
   maturity framework (templates/_score_card.html) and the score cards of
   the frameworks page (templates/_framework_scores.html) ---- */
.score-block { display: flex; flex-direction: column; gap: 10px; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--hairline); }
.score-heading { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.score-status { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.score-na { display: flex; flex-direction: column; gap: 8px; }
.fw-score { display: flex; flex-direction: column; gap: 10px; }
.fw-score-rules { display: flex; flex-direction: column; gap: 4px; margin: 0; padding: 0; list-style: none; }
.fw-score-rules li { font-size: 13px; color: var(--body); }
.fw-score-table tr.fw-score-function td { font-weight: 600; background: var(--violet-tint); }
.fw-score-settings { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; align-items: start; }

/* wtscored (package D, 2026-09-24): Assessments (templates/assessment_detail.html,
   assessment_compare.html, maturity_detail.html). The facts of an assessment as a
   two-column list; a long control table scrolls inside its card (layout contract). */
.asm-facts { display: grid; grid-template-columns: minmax(120px, max-content) 1fr; gap: 8px 16px; margin: 0; font-size: 13px; }
.asm-facts dt { color: var(--secondary); font-weight: 600; white-space: nowrap; }
.asm-facts dd { margin: 0; min-width: 0; color: var(--ink); }
.asm-scroll { max-height: 480px; overflow-y: auto; }
/* wtcopyimport (2026-09-24): identical controls copied once. The import's
   tick per source framework (templates/framework_import.html) and the source
   row of Copy from identical control (templates/control_copy.html). */
.ccopy-sources { gap: 8px; }
.ccopy-sources legend { padding: 0; margin-bottom: 4px; }
.ccopy-source { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 8px; }
.ccopy-source .form-field { min-width: 240px; max-width: 420px; }
/* wtfwavail (2026-09-24, docs/FLOWS.md 7.55): a framework's availability.
   In the framework library (templates/_framework_library_card.html, .fwl-*)
   the pill and the state of a request in the status cell; on the console's framework page
   (templates/console/library_framework.html) the five choices with what
   each means; the decide row of Library -> Access requests. */
.fwav-options { display: flex; flex-direction: column; gap: 8px; margin: 0 0 10px; }
.fwav-option { display: grid; grid-template-columns: 140px 1fr; gap: 12px; align-items: center; padding: 6px 8px; border-radius: 4px; }
.fwav-option.current { background: var(--violet-tint); }
.fwav-option dt { margin: 0; }
.fwav-option dd { margin: 0; min-width: 0; font-size: 13px; color: var(--body); }
.fwav-decide { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0; }
.fwav-decide input { min-width: 180px; flex: 1 1 180px; }
@media (max-width: 720px) { .fwav-option { grid-template-columns: 1fr; gap: 4px; } }
/* control_page (2026-09-24, docs/FLOWS.md 7.57): the control page's tabs as
   one card in two columns -- the work on the left, the facts on a tinted
   column on the right -- with the action row across the foot
   (templates/measure_detail.html, _score_card.html, _control_exclusion.html,
   _control_last_change.html). Eyebrow labels in mono, choices as 40px
   chips around a real radio or checkbox, notices with a glyph and words. */
.card.cp-card { padding: 0; overflow: hidden; }
.cp-banner { margin: 0; padding: 10px 16px; background: var(--violet-tint); color: var(--violet-text); font-size: 13px; border-bottom: 1px solid var(--hairline); }
.cp-split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(260px, 320px); }
.cp-main, .cp-aside { display: flex; flex-direction: column; gap: 16px; padding: 16px; min-width: 0; }
.cp-aside { background: var(--canvas); border-left: 1px solid var(--hairline); }
/* the action row under the two columns: the same row, drawn across the card's foot */
.cp-card .cp-split + div, .rset-card .card-actions.rset-actions { margin: 0; padding: 12px 16px; border-top: 1px solid var(--hairline); }
.cp-body { font-size: 14px; color: var(--body); }
/* A line a reader can follow (scompd, docs/FLOWS.md 7.393, Rinat's design of Make this control compliant): an
   explanation in a wide card stops at 72 characters, the house's measure (the history's text, the guidance, the
   infrastructure's and the onboarding's intros each set it on their own). */
.text-measure { max-width: 72ch; }
.cp-link { padding: 0; line-height: 1.4; }
.cp-link:hover { text-decoration: underline; }
.cp-link-quiet { color: var(--body); font-weight: 500; }
.cp-link-text { color: var(--violet-text); }
details > summary.cp-link { display: inline; list-style: none; }
details > summary.cp-link::-webkit-details-marker { display: none; }
.cp-libtext { padding: 10px 12px; border: 1px dashed var(--rule); border-radius: var(--r-control); background: var(--canvas); display: flex; flex-direction: column; gap: 4px; }
.cp-libtext[hidden] { display: none; }
.cp-libtext p, .cov-preview, .bil-term, .bil-next, .aside-note > p { margin: 0; font-size: 14px; color: var(--body); }
.cp-two { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; align-items: start; }
.cp-row { display: flex; gap: 16px; flex-wrap: wrap; align-items: flex-start; }
.cp-narrow { flex: 0 0 180px; }
.cp-grow { flex: 1 1 260px; }
.cp-self-start { align-self: flex-start; }
/* choices: the status chips, Not applicable, the attestation's outcome cards */
.cp-choices { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.cp-choice { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 12px; border: 1px solid var(--field-rule);
  border-radius: var(--r-control); background: var(--card); font: 500 14px/1 var(--font-sans); color: var(--ink); cursor: pointer; white-space: nowrap; flex: none; }
.cp-choice input { margin: 0; accent-color: var(--violet); width: 16px; height: 16px; }
.cp-choice:has(input:checked), .cp-choice[aria-pressed="true"] { border-color: var(--violet); background: var(--violet-tint); color: var(--violet-text); }
.cp-choice:has(input:focus-visible), .cp-card-choice:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.cp-choice.locked .icon { color: var(--secondary); }
.cp-choice.disabled { cursor: default; color: var(--secondary); border-style: dashed; }
.cp-choice-rule, .dl-head-rule { width: 1px; height: 24px; background: var(--hairline); flex: none; }
.cp-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; }
.cp-card-choice { display: flex; align-items: flex-start; gap: 10px; padding: 12px; border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); cursor: pointer; }
.cp-card-choice input { margin: 2px 0 0; accent-color: var(--violet); width: 16px; height: 16px; flex: none; }
.cp-card-choice > span { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cp-card-choice:has(input:checked) { border-color: var(--violet); background: var(--violet-tint); }
.cp-status-line { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 40px; }
.cp-exclusion { display: flex; flex-direction: column; gap: 8px; padding: 12px; border-left: 2px solid var(--rule); background: var(--canvas); }
.cp-exclusion[hidden] { display: none; }
/* notices: a glyph, the point in bold, the rest in words */
.cp-notice { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border-radius: var(--r-control); font-size: 14px; }
.cp-notice > .icon { margin-top: 1px; }
.cp-notice-body { margin: 0; display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.cp-notice-body p { margin: 0; }
.cp-notice.info { background: var(--blue-tint); color: var(--blue-text); }
.cp-notice.warn { background: var(--amber-tint); color: var(--amber-text); }
.cp-notice.danger { background: var(--red-tint); color: var(--red-text); }
.cp-notice .card-sub, .cp-notice .tick-mark { color: inherit; }
.cp-notice .ctl-override { display: flex; flex-direction: column; gap: 8px; }
/* the right-hand column's facts */
.cp-facts { display: flex; flex-direction: column; gap: 8px; margin: 0; font-size: 14px; }
.cp-facts > div { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; }
.cp-facts dt { color: var(--secondary); white-space: nowrap; }
.cp-facts dd { margin: 0; color: var(--ink); font-weight: 600; text-align: right; min-width: 0; }
.cp-facts .cp-bad { color: var(--red-text); }
.cp-facts .cp-warn { color: var(--amber-text); }
.cp-rule-top { border-top: 1px solid var(--hairline); padding-top: 12px; }
.cp-quick { display: flex; flex-wrap: wrap; gap: 8px; }
.cp-quick .button.small { min-height: 32px; }
.cp-owner { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.cp-owner .avatar { width: 32px; height: 32px; flex: none; }
.cp-owner-name { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.cp-owner-name strong, .cp-owner-name .card-sub { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cp-owner .button.small { min-height: 28px; flex: none; }
/* the score block of a maturity framework */
.cp-score { gap: 12px; }
.cp-score-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 12px; }
.cp-score-title { line-height: 1.2; }
.cp-score-value { line-height: 1; }
.cp-score-date { margin-left: auto; }
.cp-scorebar { display: inline-flex; gap: 4px; align-self: center; flex: 1 1 160px; max-width: 280px; }
.cp-scorebar i { flex: 1; height: 6px; border-radius: 2px; background: var(--hairline); }
.cp-scorebar i.on { background: var(--violet); }
.cp-scorebar i.need { box-shadow: inset 0 0 0 1px var(--violet-text); }
.cp-score-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px 16px; align-items: start; }
.cp-score-more { display: flex; flex-wrap: wrap; gap: 16px; }
.cp-score-how { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 4px; font-size: 13px; color: var(--body); }
.cp-score-how[hidden] { display: none; }
/* policy: chips with their titles, rows of statements and documents */
.cp-pane .chip { max-width: 100%; }
.cp-chip-title { font: 500 13px/1 var(--font-sans); color: var(--body); overflow: hidden; text-overflow: ellipsis; max-width: 220px; }
.link-pane .chip.fixed[data-req-locked] { background: var(--canvas); color: var(--ink); border-color: var(--hairline); }
.link-pane .chip.fixed[data-req-locked] > .icon { color: var(--secondary); }
.cp-row-item { display: flex; align-items: center; gap: 12px; padding: 10px 12px; min-height: 56px; }
.cp-row-item + .cp-row-item, .cp-rows > .cdoc-row + .cdoc-row { border-top: 1px solid var(--hairline); }
.cp-rows > .cdoc-row { gap: 12px; padding: 10px 12px; min-height: 56px; border-bottom: 0; background: var(--card); color: var(--body); }
.cp-row-text .cdoc-origin { max-width: none; flex: none; }
.cp-row-item > .button, .cp-row-code { flex: none; white-space: nowrap; }
/* (intev, FLOWS 7.295) a row's own actions side by side, never wrapped: Not relevant and Accept */
.cp-row-item > .cp-row-actions { display: inline-flex; gap: 6px; flex: none; margin: 0; }
.cp-row-actions > .button { white-space: nowrap; }
.cp-row-text { display: flex; flex-direction: column; gap: 2px; flex: 1 1 auto; min-width: 0; }
.cp-row-title, .resp-chip-name { font-size: 14px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cp-row-item .chip-x, .cp-rows > .cdoc-row .chip-x { min-width: 28px; min-height: 28px; border: 0; background: none; font: 600 16px/1 var(--font-sans); color: var(--body); border-radius: var(--r-badge); cursor: pointer; flex: none; }
.cp-row-item .chip-x:hover, .cp-rows > .cdoc-row .chip-x:hover { background: var(--canvas); }
.gone[data-row] .cp-row-text, .gone[data-row] .cp-row-code, .gone[data-row] .cdoc-code { text-decoration: line-through; opacity: .7; }
.gone[data-row] .chip-x[aria-pressed="true"] { color: var(--red-text); }
/* tests and guidance */
.cp-heading { display: flex; flex-direction: column; gap: 4px; }
.cp-inline-actions { justify-content: flex-end; margin-top: 12px; }
.cp-lead { margin: 0; font-size: 16px; line-height: 1.6; color: var(--ink); }
.cp-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.cp-steps li { display: flex; gap: 14px; font-size: 15px; line-height: 1.55; color: var(--ink); }
.cp-step-n { color: var(--violet-text); font-weight: 600; flex: none; min-width: 22px; }
.cp-evidence-box { display: flex; gap: 12px; align-items: baseline; padding: 12px 14px; border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--violet-tint); font-size: 14px; color: var(--ink); }
.cp-evidence-box .form-label { color: var(--violet-text); }
.cp-mapped { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; max-height: 320px; overflow-y: auto; }
.cp-mapped li { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; font-size: 14px; }
.cp-mapped-fw { color: var(--body); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cp-mapped .mono { flex: none; font-weight: 600; }
@media (max-width: 900px) {
  .cp-split { grid-template-columns: minmax(0, 1fr); }
  .cp-aside { border-left: 0; border-top: 1px solid var(--hairline); }
  .cp-two { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 480px) {
  .cp-row-item, .cp-rows > .cdoc-row { flex-wrap: wrap; }
  .cp-narrow { flex: 1 1 100%; }
  .cp-evidence-box { flex-direction: column; }
}

/* control_priority (2026-09-25, docs/FLOWS.md 7.58): the framework's own
   marking of a control beside its code, and "In scope" where the model
   never lets a control be excluded. */

/* control_score_status (2026-09-25): the Status & owner tab of a control on a
   maturity framework in two columns -- "Status · from score" with the pill
   alone and the note under it on the left, the scope in one 40px box on the
   right (In scope with the lock and the reason on one line, or the Not
   applicable tick). The figures stay in the score card below. */
.cpss-status { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.cpss-scope-box { display: flex; align-items: center; gap: 10px; height: 40px; padding: 0 8px; border: 1px solid var(--hairline); border-radius: 4px; background: var(--canvas); min-width: 0; }
.cpss-reason { flex: 1 1 auto; }

/* control_score_status, the score card (2026-09-25): one heading line --
   Score, the value, "of" the threshold, the five-step bar with the target
   outlined, the day -- then three equal columns with a 48px select whose
   level number is a badge drawn over it, one backing line each, and the
   two links at the foot. What explains lives in the "How scoring works"
   fold. */
.cpsc-bar { display: flex; gap: 8px; }
.cpsc-bar i { flex: 1; height: 6px; border-radius: 4px; background: var(--hairline); }
.cpsc-bar i.on { background: var(--violet); }
.cpsc-bar i.target { background: none; box-shadow: inset 0 0 0 2px var(--violet); }
.cpsc-bar i.on.target { background: var(--violet); box-shadow: 0 0 0 2px var(--card), 0 0 0 3px var(--violet); }
.cpsc-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; align-items: start; }
.cpsc-badge { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; flex: none; border-radius: 2px;
  font: 600 13px/1 var(--font-sans); background: var(--violet-tint); color: var(--violet-text); white-space: nowrap; }
.cpsc-badge.plain { background: var(--neutral-tint); color: var(--ink); }
.cpsc-backing, .file-drop-meta { font-size: 13px; line-height: 1.4; color: var(--secondary); }
.cpsc-backing strong { font-weight: 600; color: var(--ink); }
.cpsc-warn { display: flex; align-items: center; gap: 8px; margin: 0; font-size: 13px; line-height: 1.4; color: var(--red-text); }
.cpsc-warn .icon { flex: none; }
.cpsc-more { display: flex; flex-wrap: wrap; align-items: center; gap: 24px; }
.cp-link.cpsc-quiet { color: var(--ink); }
.cpsc-how { display: flex; flex-direction: column; gap: 10px; padding: 12px 14px; border: 1px solid var(--hairline); border-radius: 4px; background: var(--canvas); font-size: 13px; color: var(--body); }
.cpsc-how[hidden] { display: none; }
.cpsc-how p { margin: 0; }
.cpsc-how ul { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 4px; }
.cpsc-levels { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
.cpsc-levels > div { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.cpsc-levels ol { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 6px; }
.cpsc-levels li { display: flex; align-items: flex-start; gap: 8px; }
.cpsc-levels strong { color: var(--ink); font-weight: 600; }
@media (max-width: 900px) {
  .cpsc-grid, .cpsc-levels { grid-template-columns: minmax(0, 1fr); }
  .cpsc-date { margin-left: 0; }
}
/* cped (2026-09-27, Rinat's two designs of the control's edit card): the
   main column in sections with a hairline between -- Description (the
   18px title, its line under it, Show library text on the right), Status
   (Follows from the score / Set by hand beside the heading), Score on a
   maturity framework, Reason for inclusion (the derived reasons on the
   right of its heading) -- the grey rail in blocks with a hairline
   between, and the grey band across the foot with the one Save. Labels
   14px/600; the status and scope sit in the score's three columns. */
.cp-edit .cp-main, .cp-edit .cp-aside { padding: 0; gap: 0; }
.cp-edit .cp-main > .form-section { padding: 24px; }
.cp-edit .cp-aside > * { padding: 20px; }
.cp-edit .cp-aside > * + * { border-top: 1px solid var(--hairline); }
.cp-edit .form-label:not(.eyebrow) { font-weight: 600; }
.cp-edit .form-fieldset > legend.form-section-head { margin-bottom: 16px; }
.cp-edit .cp-split + .list-foot { padding: 16px 24px; }
.cp-section-title { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cp-head-end { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; margin-left: auto; }
.cp-choice.cp-choice-wide { display: flex; width: 100%; }
.cp-choice.locked { color: var(--secondary); }
.cp-edit .link-pane { min-height: 40px; padding: 0 12px; }
.cp-edit .link-pane-entry { height: 38px; }
.link-pane-glyph { color: var(--secondary); }
/* ctld (2026-09-27, Rinat's design): the Documentation and the Evidence
   cards of the control page are drawn as the edit card above (.cp-edit):
   the heading as the first section, a section per part with its sub on
   the heading line, the pieces of evidence as rows like the statements
   (an inherited one on grey), the grey band at the foot. */
.cp-rows > .cp-row-item.evr-inherited { background: var(--canvas); }
.cp-row-item .cp-row-text > .card-sub, .cp-row-item .cp-row-text > .cell-code-sub { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ovrst (2026-09-25): "Compliant is locked" as one tinted panel -- the
   missing parts in bold, a hairline, and for an administrator the tick
   "Mark compliant anyway" with its reason under it (folded since ovrdd). */
.cp-notice.cp-lock { flex-direction: column; align-items: stretch; gap: 0; padding: 0; color: var(--ink); border: 1px solid var(--hairline); }
.cp-notice.cp-lock.info { background: var(--violet-tint); border-color: color-mix(in srgb, var(--violet) 22%, transparent); }
.cp-lock-line { display: flex; align-items: flex-start; gap: 10px; padding: 14px 16px; }
.cp-lock-line > .icon { margin-top: 1px; flex: none; }
.cp-lock-line p { margin: 0; min-width: 0; }
.cp-notice.cp-lock.info .cp-lock-line > .icon { color: var(--violet-text); }
.cp-notice.cp-lock.warn .cp-lock-line > .icon { color: var(--amber-text); }
.cp-lock-line strong { font-weight: 600; color: var(--ink); }
.cp-lock .ctl-override { padding: 12px 16px 12px 44px; border-top: 1px solid; border-top-color: inherit; }
/* ovrdd (2026-09-25): "Mark compliant anyway" is a native fold -- the summary
   row with its own chevron, the tick, reason and trail line only when open. */
.cp-lock .ovr-summary { display: flex; align-items: flex-start; gap: 12px; list-style: none; cursor: pointer;
  font-size: 14px; line-height: 20px; border-radius: var(--r-control); }
.cp-lock .ovr-summary::-webkit-details-marker { display: none; }
.cp-lock .ovr-summary > span { min-width: 0; }
.cp-lock .ovr-summary:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.cp-lock .ovr-caret, .xf-file > .icon { flex: none; width: 20px; height: 20px; color: var(--body); }
.cp-lock .ovr-caret { transition: transform var(--t-fast) var(--ease); }
.cp-lock .ctl-override[open] > .ovr-summary .ovr-caret { transform: rotate(90deg); }
.cp-lock .ovr-body { display: grid; grid-template-columns: 20px minmax(0, 1fr); column-gap: 12px; row-gap: 8px; margin-top: 12px; }
.cp-lock .ovr-tick { display: contents; cursor: pointer; }
.cp-lock .ovr-tick input { width: 20px; height: 20px; margin: 0; accent-color: var(--violet); cursor: pointer; }
.cp-lock .ovr-tick input:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.cp-lock .ovr-tick > span { font-size: 14px; line-height: 20px; min-width: 0; }
/* --body, not --secondary: #686D81 stops at 4.45:1 on the blue tint (4.0 in the dark theme) */
.cp-lock .ovr-soft { color: var(--body); font-weight: 400; }
.cp-lock .ovr-summary strong { color: var(--violet-text); font-weight: 600; }
.cp-lock .ovr-summary > span > .ovr-soft { color: var(--ink); }
.cp-lock .ovr-reason { grid-column: 2; width: 100%; box-sizing: border-box; min-height: 56px; padding: 8px 12px; resize: vertical;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); color: var(--ink); font: 400 14px/1.4 var(--font-sans); }
.cp-lock .ovr-reason::placeholder { color: var(--secondary); opacity: 1; }
.cp-lock .ovr-reason:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.cp-lock .ovr-trail { grid-column: 2; display: inline-flex; align-items: center; gap: 6px; font-size: 12px; }

/* white_selects (2026-09-25): a select list that can be used is white with
   the field border, never grey -- grey reads as disabled. A disabled one
   keeps its grey (.form select:disabled above). The caret stays: only the
   colour is set, not the background image. */
select:not(:disabled) { background-color: var(--card); }
.filter-bar select.doc-entry:not(:disabled) { background-color: var(--card); border: 1px solid var(--field-rule); }
/* ---- trust_compact (2026-09-25, docs/FLOWS.md 7.59): the trust centre's Controls tab,
   one block per framework inside the card: a heading line (name, state, count),
   one line on where the list comes from, the table. */
.tcmp-fw { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; }
.tcmp-fw-head { display: flex; align-items: center; gap: 10px; min-height: 32px; min-width: 0; }
.tcmp-fw-head h3 { margin: 0; font-size: 15px; font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tcmp-fw-head .rr-count { flex: none; white-space: nowrap; }
/* the console's picker on the framework page (library_framework.html) */
.thl-search { max-width: 320px; }
.thl-list { display: flex; flex-direction: column; gap: 0; max-height: 360px; overflow-y: auto; border: 1px solid var(--hairline); border-radius: 4px; }
.thl-row { display: flex; align-items: center; gap: 10px; min-height: 36px; padding: 4px 12px; border-bottom: 1px solid var(--hairline); font-size: 13px; color: var(--body); min-width: 0; cursor: pointer; }
.thl-row:last-child { border-bottom: 0; }
.thl-row input { flex: none; }
.thl-row code { flex: none; white-space: nowrap; }
.thl-row .thl-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.thl-row.is-checked { background: var(--violet-tint); }
.thl-actions { display: flex; justify-content: flex-end; }

/* ovrkeep (2026-09-25): the standing "Mark compliant anyway" read-only for
   whoever may not override -- the tick disabled, the reason readable but
   not editable; nothing in it invites a click. */
.cp-lock .ovr-tick input:disabled { cursor: default; }
.cp-lock .ovr-reason[readonly] { cursor: default; resize: none; }

/* ---- draft_marks (2026-09-25, docs/FLOWS.md 7.61): what changed in a draft
   since the last approved version. The summary line on top with Show
   changes; a violet bar on every block added or changed and a chip with the
   word, who and when (never colour alone); a compact line where statements
   were taken out; the detail Show changes opens: insertions underlined in
   green, deletions struck through in red, each with its word for a screen
   reader. */
.dm-bar { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 4px 12px; margin: 10px 0 0;
  border: 1px solid var(--hairline); border-left: 3px solid var(--violet); border-radius: var(--r-control);
  background: var(--card); color: var(--body); font-size: 13px; min-width: 0; }
.dm-bar > .icon, .doc-editors .icon, .link-banner .icon { width: 18px; height: 18px; flex: none; color: var(--violet-text); }
.dm-bar .doc-changes-pill { flex: 1; min-width: 0; }
.dm-summary { flex: 1; min-width: 0; font-weight: 600; color: var(--ink); }
.dm-bar .doc-changes-toggle { flex: none; }
button.doc-changes-toggle { cursor: pointer; font-family: inherit; }
.doc-flow[data-dm], .read-chapter[data-dm] { border-left: 3px solid var(--violet); padding-left: 12px; }
.read-statement[data-dm] { border-left: 3px solid var(--violet); }
.read-statement-text { flex: 1; min-width: 0; }
.dm-line { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; margin: 4px 0 6px; }
.dm-chip { display: inline-flex; align-items: center; gap: 4px; max-width: 100%; min-height: 22px; padding: 0 8px;
  border-radius: var(--r-badge); background: var(--violet-tint); color: var(--violet-text);
  font: 600 12px/1.3 var(--font-sans); }
.dm-chip .icon { width: 14px; height: 14px; flex: none; }
.dm-chip-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dm-chip[data-dm-kind="removed"] { background: var(--red-tint); color: var(--red-text); }
.dm-detail { display: flex; flex-direction: column; gap: 8px; margin: 4px 0 8px; padding: 8px 12px;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--canvas);
  color: var(--body); font-size: 13px; }
.dm-detail[hidden] { display: none; }
.dm-detail p { margin: 0; }
.dm-label { font-weight: 600; color: var(--ink); }
.dm-events { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.dm-event-what { font-weight: 600; color: var(--ink); }
.dm-events-none { color: var(--secondary); }
.dm-removed { margin: 6px 0; }
/* The guide's ? on the document pages: at the right end of the line that
   names itself (data-guide-head), after the links, never beside the title. */
.guide-button.guide-button-end { margin-left: auto; align-self: center; }
/* soly_live (2026-09-25, docs/FLOWS.md 7.63): Soly AI acts in the portal.
   The composer's month line: a 24px ring (violet arc on a light track, 3px,
   rounded cap), "84% used" and a soft "· 160k left", one line; amber from
   90%, red at the limit, where the words say "Limit reached". */
.soly-meter { display: inline-flex; align-items: center; gap: 8px; margin-right: auto; min-width: 0;
              white-space: nowrap; overflow: hidden; }
.soly-ring { width: 24px; height: 24px; flex: none; transform: rotate(-90deg); }
.soly-ring circle { fill: none; stroke-width: 3; }
.soly-ring-track { stroke: var(--violet-tint); }
.soly-ring-arc { stroke: var(--violet); stroke-linecap: round; }
.soly-meter.warn .soly-ring-arc { stroke: var(--amber); }
.soly-meter.full .soly-ring-arc { stroke: var(--red); }
.soly-meter-used { font-size: 15px; font-weight: 600; color: var(--ink); flex: none; }
.soly-meter.full .soly-meter-used { color: var(--red-text); }
.soly-meter-left { font-size: 15px; color: var(--secondary); min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.soly-meter-left::before { content: "· "; white-space: pre; }
/* What Soly just did, one line under the drawer's head. */
.soly-step { flex: none; margin: 0; padding: 6px 16px; font-size: 12px; color: var(--violet-text);
             background: var(--violet-tint); border-bottom: 1px solid var(--hairline);
             white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.soly-going, .dcm-where, .dcm-by { margin: 0; font-size: 12px; color: var(--secondary); }
/* (taskpane, Rinat's design 2026-10-12, FLOWS 7.310) The person's processes as ONE pane at the top of Soly's
   drawer, under its head and above the chat (templates/_soly_taskbar.html), on the canvas grey with hairlines:
   - the head, one 40px button: the eyebrow TASK (mono), the title while folded (13px/600, one line), "+n", the chip
     (2px radius: the state's mark -- a dot, a ring while it runs, a check, "!" -- its word and "2 of 3" while it runs,
     on the state's tint in its -text colour) and the caret (up while open); a hairline under it;
   - the sheet: 16px in, the title 15px/600 over one 12px grey line, then the steps (an 18px mark: a green check, a
     turning violet ring -- amber while it needs the person, still while paused --, a dashed circle; a red "!"
     where it stopped), the step's sentence and what Soly filled under the step it stands on, or the fields (40px,
     choices as two 32px hairline buttons, the chosen one on the violet tint with a check); the action row last
     across the full width under a hairline: the estimate in 12px mono on the left, the 32px buttons on the right;
   - under the open pane the grab bar: white, a hairline above and below, a 36x4 handle; dragged (or its arrow keys)
     the body takes that height and scrolls inside itself; nothing moves by animation.
   With several processes a compact list (one 40px row each, the chosen one on the violet tint) above the sheet.
   The drawer is 440px wide while a sheet is open (tbstyle), 360px folded and closed; the full width on a phone.
   When even then the drawer is too short, the drawer's column scrolls as a whole (static/js/soly_tasks.js, fit()).
   The page's button the person presses carries Soly's one ring (.soly-highlight, 7.167), never pressed. */
.soly-task-slot { flex: none; min-width: 0; }
.stb { display: flex; flex-direction: column; min-width: 0; background: var(--canvas); color: var(--ink); }
.stb-top { position: relative; display: flex; align-items: center; min-width: 0; border-bottom: 1px solid var(--hairline); }
.stb-toggle { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 0 16px;
              border: 0; border-radius: 0; background: none; color: inherit; font: 400 13px/1.3 var(--font-sans);
              text-align: left; cursor: pointer; }
.stb-toggle:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; }
.stb-eyebrow { flex: none; font: 600 11px/1 var(--font-mono); letter-spacing: .08em; text-transform: uppercase; color: var(--body); }
.stb-text { flex: 1 1 auto; min-width: 0; display: flex; }
.stb-lead { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; color: var(--ink); }
.stb-lead.mono, .stb-row-text.mono { font-family: var(--font-mono); font-weight: 500; }
/* open, the title stands in the sheet: the head keeps it for screen readers only */
.stb[data-open] .stb-text { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
.stb-more { flex: none; font: 600 12px/1 var(--font-mono); color: var(--body); white-space: nowrap; }
.stb-more[hidden] { display: none; }
.stb-chip { margin-left: auto; height: 22px; padding: 0 8px; gap: 5px; }
.stb-mark { flex: none; width: 10px; height: 10px; display: inline-grid; place-items: center; }
.stb-mark .dot { width: 6px; height: 6px; }
.stb-mark .srun-ring { width: 10px; height: 10px; border-width: 2px; }
.stb-mark .icon { width: 12px; height: 12px; }
.stb-bang { font: 600 12px/1 var(--font-sans); }
.stb[data-open] .stb-caret { transform: rotate(180deg); }
.stb-progress { position: absolute; left: 0; bottom: 0; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); }
.stb-progress[hidden] { display: none; }
.stb-body { display: flex; flex-direction: column; min-width: 0; }
.stb:not([data-open]) .stb-body, .stb:not([data-open]) .stb-grip { display: none; }
/* the drawer 440px wide while a sheet is open; when the drawer is too short the column scrolls as a whole */
.soly-drawer-inner:has(.stb[data-open]) { overflow-y: auto; }
@media (min-width: 601px) { .soly-drawer:not(.is-strip):has(.stb[data-open]) { width: 440px; } }
@media (min-width: 1280px) { .shell.soly-docked:has(.stb[data-open]) .main > :not(.top-bar) { margin-right: 440px; } }
/* the grab bar between the pane and the chat */
.stb-grip { flex: none; display: grid; place-items: center; height: 12px; border-top: 1px solid var(--hairline);
            border-bottom: 1px solid var(--hairline); background: var(--card); cursor: row-resize; touch-action: none; }
.stb-grip-bar { width: 36px; height: 4px; border-radius: 2px; background: var(--rule); }
.stb-grip:hover .stb-grip-bar, .stb-grip:focus-visible .stb-grip-bar { background: var(--field-rule); }
.stb-grip:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; }
.stb-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; border-bottom: 1px solid var(--hairline); }
.stb-row { width: 100%; min-width: 0; display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 0 16px; border: 0;
           background: none; color: var(--ink); font: 400 13px/1.3 var(--font-sans); text-align: left; cursor: pointer; }
.stb-row:hover { background: var(--card); }
.stb-row[aria-pressed="true"] { background: var(--violet-tint); }
.stb-row:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; }
.stb-row-text { flex: 1 1 auto; min-width: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.stb-row .stb-chip { margin-left: 0; }
.stb-sheet { display: none; flex-direction: column; min-width: 0; }
.stb-sheet[data-current] { display: flex; }
.stb-sheet:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; }
.stb-sheet-main { display: flex; flex-direction: column; gap: 14px; min-width: 0; padding: 14px 16px 16px; }
.stb-sheet-title { margin: 0; min-width: 0; font: 600 15px/1.3 var(--font-sans); }
.soly-task-full { display: flex; flex-direction: column; min-width: 0; }
.stf-fold-form { display: none; }
.soly-task-head { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.soly-task-title { min-width: 0; margin: 0; font: 600 15px/1.35 var(--font-sans); color: var(--ink); overflow-wrap: anywhere; }
.stb-code, .stb-made .soly-made a { font-family: var(--font-mono); font-weight: 600; color: var(--violet-text); text-decoration: none; }
a.stb-code:hover, .stb-made .soly-made a:hover { text-decoration: underline; }
.soly-task-meta, .stb-sheet .soly-task-now, .stb-sheet .soly-task-next, .soly-task-say, .soly-task-filled { margin: 0; min-width: 0; font-size: 12px; line-height: 1.5; color: var(--secondary); overflow-wrap: anywhere; }
.soly-task-where { display: flex; flex-direction: column; gap: 2px; min-width: 0; margin: 0; }
.soly-task-now, .soly-task-next { min-width: 0; margin: 0; }
.soly-task-count { white-space: nowrap; }
.stb-guide .soly-task-now { font-size: 13px; color: var(--ink); }
.stf-spacer { flex: 1 1 auto; }
/* the steps: an 18px mark, the name 13px (400 when done, 600 where it stands, grey after), what is under a name 12px grey */
.soly-plan { display: flex; flex-direction: column; gap: 12px; margin: 0; padding: 0; list-style: none; }
.soly-plan-name { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
.soly-plan-step.current > .soly-plan-name, .soly-plan-step.stopped > .soly-plan-name { font-weight: 600; color: var(--ink); }
.soly-plan-step.later > .soly-plan-name { color: var(--secondary); }
.soly-plan-who, .soly-plan-tokens { white-space: nowrap; }
.soly-plan-who { font-size: 12px; line-height: 18px; color: var(--secondary); }
.soly-plan-why { font-size: 12px; line-height: 1.5; font-weight: 400; color: var(--amber-text); }
.soly-plan-step.done .soly-plan-name s { color: var(--secondary); }
.stb-step-mark { flex: none; width: 18px; height: 18px; box-sizing: border-box; display: inline-grid; place-items: center;
                 border-radius: 50%; border: 1.5px dashed var(--field-rule); color: var(--card); font: 600 12px/1 var(--font-sans); }
.stb-step-mark.done { border: 0; background: var(--green-deep); }
.stb-step-mark.done .icon { width: 12px; height: 12px; }
.stb-step-mark.current { border: 2px solid var(--violet-tint); border-top-color: var(--violet); animation: srun-turn .9s linear infinite; }
.stb-step-mark.current.needs { border-color: var(--amber); animation: none; }
.stb-step-mark.current.still { border-color: var(--violet); animation: none; }
.stb-step-mark.stopped { border: 0; background: var(--red-deep); }
@media (prefers-reduced-motion: reduce) { .stb-step-mark.current { animation: none; border-color: var(--violet); } .stb-step-mark.current.needs { border-color: var(--amber); } }
/* what stands under the step the process stands on: its sentence (the button in bold), what Soly filled, the help
   line, "Show me what's missing" as a violet text link */
.stb-step-now { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; min-width: 0; font-weight: 400; }
.soly-task-say { font-weight: 400; }
.soly-task-say strong { font-weight: 600; color: var(--ink); }
.soly-task-help { display: flex; flex-direction: column; gap: 4px; }
.soly-task-help[hidden], .soly-task-strip[hidden] { display: none; }
.stb-made { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.stb-next .button.small { min-height: 28px; height: 28px; }
.stb-made .soly-task-card-name { font-size: 12px; font-weight: 400; line-height: 1.5; color: var(--secondary); }
.soly-made { margin: 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 13px; line-height: 1.5; }
.soly-task-card { display: flex; flex-direction: column; gap: 4px; padding: 12px; border: 1px solid var(--hairline);
                  border-radius: 4px; background: var(--card); }
.soly-task-card.blocked { background: var(--amber-tint); border-color: var(--amber); }
.soly-task-card-name { margin: 0; overflow-wrap: anywhere; }
.stb-sheet .soly-task-card .soly-task-say { font-size: 13px; color: var(--body); }
.soly-task-form { display: flex; flex-direction: column; margin: 0; }
/* the action row: the last thing in the sheet, across its full width under a hairline; the estimate on the left */
.soly-task-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; margin: 0;
                     padding: 10px 16px; border-top: 1px solid var(--hairline); }
.soly-task-actions .button { padding: 0 14px; }
.soly-task-actions .soly-plan-tokens { margin-right: auto; font: 400 12px/1 var(--font-mono); color: var(--secondary); }
/* (task 9, FLOWS 7.208) the text buttons -- Back, Skip, Change answers, Cancel, the help line's -- no violet */
.soly-text-button { flex: none; min-height: 32px; padding: 0 4px; border: 0; border-radius: 4px; background: none;
                    color: var(--body); font: 600 13px/1 var(--font-sans); white-space: nowrap; cursor: pointer; }
.soly-text-button:hover { color: var(--ink); text-decoration: underline; }
.soly-task-actions .soly-text-button:first-child { margin-left: -4px; }
.stb-step-now .stf-missing { min-height: 0; padding: 2px 0; color: var(--violet-text); }
/* (demo, FLOWS 7.328) a demo stop: the model's narration in the ink at 13px; the presenter's note folded under it
   (one violet summary line); a chapter of the stepper is a text button that jumps to it */
.stb-sheet[data-soly-demo] .stb-step-now > .soly-task-say { font-size: 13px; color: var(--ink); }
/* (demo journeys) .stb-demo-line: the record the journey goes on with, "Save to continue the journey", what the
   removal did */
.stb-demo-notes, .stb-demo-line { margin: 6px 0 0; font-size: 12px; line-height: 1.5; color: var(--ink); }
.stb-demo-line { overflow-wrap: anywhere; }
.stb-demo-notes > summary { width: max-content; color: var(--violet-text); font-weight: 600; cursor: pointer; }
.stb-demo-notes > p { margin: 6px 0 0; overflow-wrap: anywhere; }
.stb-demo-notes > p.mono { color: var(--secondary); }.stb-line > .stb-jump { display: inline; min-height: 0; padding: 0; font: inherit; color: inherit; white-space: normal; text-align: left; }
/* (the compact bar, 2026-10-12) a long process: a chapter's count beside its name, the current chapter's own steps
   under it, "+n" for the steps left out, every step behind "Show all n steps" -- the list never fills the drawer */
.stb-count { font-weight: 400; color: var(--secondary); }
.stb-steps.stb-sub { margin: 6px 0 0; }
.stb-steps > .stb-more { padding-left: 26px; font-size: 12px; color: var(--secondary); }
.stb-all { margin: 4px 0 0; font-size: 12px; }
.stb-all > summary { width: max-content; color: var(--violet-text); font-weight: 600; cursor: pointer; }
.stb-all > .soly-plan { margin-top: 6px; }
/* the fields Soly needs: a label 13px/600 over a 40px field; a choice of two and How much to fill in as two 32px
   hairline buttons 8px apart (a choice is a field: --field-rule), the chosen one on the violet tint with a check */
.soly-asks { gap: 12px; }
.soly-ask { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.soly-ask .doc-entry { width: 100%; min-height: 40px; background-color: var(--card); }
.segment.soly-fill-segment { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; width: 100%; height: 32px; padding: 0;
  border: 0; background: none; }
.soly-fill-segment .segment-button { position: relative; justify-content: center; gap: 6px; min-width: 0; min-height: 0; padding: 0 8px;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card);
  font-size: 13px; font-weight: 400; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.soly-fill-segment .segment-button:has(input:checked) { border-color: var(--violet); background: var(--violet-tint); color: var(--violet-text); font-weight: 600; }
.soly-fill-segment .segment-button:has(input:checked)::before { content: ""; flex: none; width: 14px; height: 14px; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / contain no-repeat; }
.soly-fill-segment .segment-button input { inset: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; }
.soly-fill-segment .segment-button:has(input:disabled) { color: var(--secondary); }
/* a background job's sheet: its title, its bar and fraction, who · started · tokens, Stop in the action row */
.stb-job .srun-meta { margin: 0; }
/* a field a step still needs: its reason under it in violet while it is rung (9.4) */
.form-hint.soly-need { color: var(--violet-text); }
/* (9.10) the drawer never covers the rung control: docked beside the content from 1280px while a process waits,
   else collapsed to a strip at the bottom right (the full width on a phone) with the step in words and ▲ */
/* the top bar keeps the full width; only what stands under it makes room for the drawer (Rinat, 2026-10-04) */
@media (min-width: 1280px) { .shell.soly-docked .main > :not(.top-bar) { margin-right: 360px; } }
.soly-task-strip { display: flex; align-items: center; gap: 8px; min-width: 0; padding: 0 12px; height: 64px; }
.soly-task-strip-text { flex: 1 1 auto; min-width: 0; font-size: 13px; line-height: 1.4; color: var(--body);
                        overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.soly-drawer.is-strip { top: auto; height: 64px; }
.soly-drawer.is-strip .soly-drawer-inner > :not(.soly-task-slot) { display: none; }
.soly-drawer.is-strip .soly-task-slot { padding: 0; border-top: 0; }
.soly-drawer.is-strip .stb-top, .soly-drawer.is-strip .stb-list, .soly-drawer.is-strip .stb-sheet:not(.soly-task) { display: none; }
.soly-drawer.is-strip .stb-body { display: block; max-height: none; border: 0; background: none; }
.soly-drawer.is-strip .soly-task { display: flex; padding: 0; }
.soly-drawer.is-strip .soly-task > :not(.soly-task-strip):not(script) { display: none; }
.soly-drawer.is-strip .stb-grip { display: none; }
html:has(.shell.soly-stripped) { scroll-padding-bottom: 80px; }
@media (max-width: 767px) { .soly-drawer.is-strip { width: 100vw; } }
/* A field Soly filled: ringed violet on a violet tint with its "Soly AI"
   mark, until the person saves the form or edits the field. The focus ring
   stays the outline, so both show. */
.rn-form .soly-filled { box-shadow: 0 0 0 2px var(--violet); background-color: var(--violet-tint); }
.rn-form .soly-filling { box-shadow: 0 0 0 2px var(--violet); transition: box-shadow .15s ease; }
.soly-field-mark { display: inline-block; flex: none; margin-left: 6px; padding: 1px 4px; border-radius: 2px;
                   font: 600 11px/1.4 var(--font-mono); color: var(--violet-text); background: var(--violet-tint);
                   white-space: nowrap; vertical-align: middle; }
.report.soly-draft { display: flex; align-items: center; gap: 8px; }
.report.soly-draft > span { min-width: 0; }
.soly-draft .soly-undo { margin-left: auto; flex: none; white-space: nowrap; }
/* The statement or roadmap step Soly opened the page at. */
.soly-focus { box-shadow: 0 0 0 2px var(--violet); background-color: var(--violet-tint); border-radius: 4px; }
@media (prefers-reduced-motion: reduce) { .rn-form .soly-filling { transition: none; } }


/* solymodels (2026-09-25): the thumbs up or down under one of Soly AI's
   answers (templates/_soly_feedback.html) -- one row of small hairline
   buttons, the pressed one tinted and outlined in violet, its state in
   aria-pressed; the reason field beside them after a thumbs down. */
.soly-feedback { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 2px 0 0; min-width: 0; }
.soly-feedback .soly-vote { flex: none; min-height: 28px; padding: 0 6px; }
.soly-feedback .soly-vote .icon { width: 16px; height: 16px; }
.soly-feedback .soly-vote[aria-pressed="true"] { background: var(--violet-tint); border-color: var(--violet); color: var(--violet-text); }
.soly-feedback-reason { flex: 1 1 160px; min-width: 0; margin: 0; }
.soly-feedback-reason input { width: 100%; min-height: 28px; font-size: 12px; }
/* the console's Models and routing page (templates/console/ai_models.html) */
.sm-table input.sm-price { width: 7.5rem; }
.sm-table input.sm-label { width: 100%; min-width: 8rem; }
.sm-table .sm-name { min-width: 0; }
/* solythink: Soly AI's thinking state (templates/_assistant_ask.html) --
   the answer's bubble with three violet dots lit in turn and "Thinking";
   with reduced motion the dots stand still, the middle one darker. The
   word in --body: --secondary stops at 4.497:1 on the bubble (#EEF0F4). */
.soly-think-bubble { display: inline-flex; align-items: center; gap: 10px; }
.soly-think-dots { display: inline-flex; gap: 5px; flex: none; }
.soly-think-dots span { width: 8px; height: 8px; border-radius: 50%; background: var(--violet); opacity: .55;
                        animation: soly-think 1.2s ease-in-out infinite; }
.soly-think-dots span:nth-child(2) { animation-delay: .2s; }
.soly-think-dots span:nth-child(3) { animation-delay: .4s; }
.soly-think-word { font-size: 15px; color: var(--body); white-space: nowrap; flex: none; }
@keyframes soly-think { 0%, 60%, 100% { opacity: .55; transform: none; } 30% { opacity: 1; transform: translateY(-2px); } }
@media (prefers-reduced-motion: reduce) {
  .soly-think-dots span { animation: none; }
  .soly-think-dots span:nth-child(2) { opacity: 1; }
}

/* tprm_link (2026-09-25): the proof files on the response's page (questionnaire_response.html); the
   supplier's page itself is the external form since 7.315 (the xf- block) */
.qn-proofs { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.qn-proofs li { display: flex; gap: 6px; align-items: center; min-width: 0; }
.qn-proofs a { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.qn-proofs .mono { flex: none; white-space: nowrap; }
/* ---- solytabs (2026-09-25): the Soly drawer's Scope and Sources tabs ----
   Scope: a soft notice with the info glyph, then soft labels over bold
   values, the items it may read as violet-tinted chips (radius 2px) with a
   dashed "+ n more", the month as two budgets with a thin bar each, and what
   it never sees as plain lines. Sources: one row per page named, a 40px tile
   with the menu's own glyph, the name, a soft second line and an arrow. */
.soly-drawer .soly-panel[data-panel="scope"] { gap: 14px; }
.sot-notice { margin: 0; display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px;
              background: var(--canvas); color: var(--body); border-radius: 4px; font-size: 13px; line-height: 1.45; }
.sot-notice .icon { margin-top: 1px; }
.sot-notice span { min-width: 0; }
.sot-block { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.sot-label { margin: 0; font-size: 13px; font-weight: 400; line-height: 1.3; color: var(--secondary); }
.sot-line { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; min-width: 0; }
.sot-line .sot-label { min-width: 0; }
.cpsc-date, .rset-check .rset-met, .sot-count { white-space: nowrap; }
.sot-domain { margin: 0; font-size: 15px; line-height: 1.35; color: var(--ink); min-width: 0; overflow-wrap: anywhere; }
.sot-domain strong, .sot-value strong, .sot-kept strong { font-weight: 600; color: var(--ink); }
.sot-soft { color: var(--secondary); font-weight: 400; }
.sot-none { margin: 0; font-size: 13px; line-height: 1.4; color: var(--body); }
.sot-chips { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
.sot-chip { flex: none; max-width: 100%; padding: 4px 8px; border-radius: 2px; background: var(--violet-tint);
            color: var(--ink); font-size: 13px; line-height: 1.35; white-space: nowrap; overflow: hidden;
            text-overflow: ellipsis; }
.sot-chip[hidden] { display: none; }
.sot-chip-more { flex: none; display: flex; }
.sot-more { flex: none; white-space: nowrap; padding: 3px 8px; border: 1px dashed var(--violet-text); border-radius: 2px;
            background: transparent; color: var(--violet-text); font: 600 13px/1.35 var(--font-sans); cursor: pointer; }
.sot-more:hover { background: var(--violet-tint); color: var(--ink); }
.sot-month, .sot-never { border-top: 1px solid var(--hairline); padding-top: 14px; }
.sot-budgets { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 16px; align-items: start; }
.sot-budget { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.sot-value { font-size: 15px; line-height: 1.35; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sot-bar { display: block; }
.sot-budget.warn .sot-bar-fill { background: var(--amber); }
.sot-budget.full .sot-bar { background: var(--red); }
.sot-word { font-size: 12px; font-weight: 600; line-height: 1.3; white-space: nowrap; }
.sot-budget.warn .sot-word { color: var(--amber-text); }
.sot-budget.full .sot-word { color: var(--red-text); }
.sot-kept { margin: 0; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; font-size: 15px; color: var(--ink); }
.sot-kept .sot-label { flex: none; }
.sot-lines { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px;
             font-size: 15px; line-height: 1.35; color: var(--ink); }
.sot-sources { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.sot-source { display: flex; align-items: center; gap: 12px; min-height: 56px; padding: 8px 6px; border-radius: 4px;
              color: var(--ink); text-decoration: none; min-width: 0; }
.sot-source:hover { background: var(--violet-tint); color: var(--ink); }
.sot-tile .icon { width: 20px; height: 20px; }
.sot-source-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.sot-source-name { font-size: 15px; font-weight: 600; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sot-source-detail { font-size: 13px; line-height: 1.3; color: var(--secondary); white-space: nowrap; overflow: hidden;
                     text-overflow: ellipsis; }
.sot-source-detail .mono { font-size: 12px; }
.sot-arrow, .acct-label .icon, .flow-picker-search .icon, .flow-picker-empty .icon, .members-empty .icon, .intg-empty .icon, .fwl-empty .icon, .mr-empty .icon, .mr-check > .icon { flex: none; width: 20px; height: 20px; color: var(--secondary); }
.sot-source:hover .sot-arrow { color: var(--violet-text); }
.sot-empty { margin: 0; display: flex; align-items: center; gap: 10px; min-height: 34px; font-size: 13px;
             line-height: 1.4; color: var(--body); }
.sot-empty span { min-width: 0; }
/* Soly AI's Running tab (solybg, 2026-09-27; drawn to Rinat's design in jobsbar, 2026-09-30, FLOWS 7.191;
   core/soly_running.py, templates/_soly_running.html). "Background jobs" in 14px secondary; nothing running is one
   dashed box with the sparkle; a running job is a hairline card: a small violet ring (turning while queued or
   running, still when paused and under reduced motion) with "<kind> · <subject>" 16px/600, a 6px bar with its mono
   "6 / 10", and the 14px line with Stop as a red text button; Stop asks inline on a soft strip. Below a hairline,
   Finished folds with its grey count and Clear; each finished row links to its result: a tinted round mark (green
   check, red cross, grey when stopped), the title, two 14px lines and a chevron. */
.soly-drawer .soly-panel.srun-panel { gap: 16px; }
.srun-label, .soly-eyebrow { margin: 0; font: 400 14px/20px var(--font-sans); color: var(--secondary); }
.srun-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.srun-list[hidden], .srun-empty[hidden], .srun-finished[hidden], .srun-confirm[hidden] { display: none; }
.srun-empty { margin: 0; display: flex; align-items: center; gap: 10px; min-height: 34px; padding: 16px;
  border: 1px dashed var(--hairline); border-radius: var(--r-control); font: 400 15px/1.4 var(--font-sans); color: var(--ink); }
.srun-empty span { min-width: 0; }
/* .srun-card: the card it shares with the statement card, at .statement-block */
.srun-head, .srun-bar-line, .srun-foot { display: flex; align-items: center; gap: 10px; min-width: 0; }
.srun-ring { width: 14px; height: 14px; flex: none; box-sizing: border-box; border-radius: 50%;
  border: 2px solid var(--violet-tint); border-top-color: var(--violet); animation: srun-turn .9s linear infinite; }
.srun-ring.still { animation: none; border-color: var(--violet); }
@keyframes srun-turn { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .srun-ring { animation: none; border-color: var(--violet); } }
.srun-title { flex: 1 1 auto; min-width: 0; text-decoration: none; }
.srun-title:hover { color: var(--violet-text); }
.srun-track { flex: 1 1 auto; min-width: 0; display: block; height: 6px; border-radius: 3px; background: var(--violet-tint); overflow: hidden; }
.srun-fraction { flex: none; white-space: nowrap; font: 400 13px/1 var(--font-mono); color: var(--secondary); }
.srun-meta, .srun-done-meta { font: 400 14px/1.4 var(--font-sans); color: var(--secondary); white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
.srun-meta { flex: 1 1 auto; min-width: 0; }
.srun-text-button { flex: none; display: inline-flex; align-items: center; min-height: 28px; padding: 0 6px; margin: 0 -6px 0 0;
  border: 0; border-radius: var(--r-control); background: none; cursor: pointer; white-space: nowrap;
  font: 600 14px/1 var(--font-sans); color: var(--ink); }
.srun-text-button:hover { background: var(--canvas); }
.srun-text-button.danger { color: var(--red-text); }
.srun-text-button.danger:hover { background: var(--red-tint); }
.srun-text-button.violet { color: var(--violet-text); }
.srun-text-button.violet:hover { background: var(--violet-tint); }
.srun-text-button[hidden] { display: none; }
.srun-confirm { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 4px;
  background: var(--canvas); }
.srun-confirm-text { flex: 1 1 100%; font-size: 13px; line-height: 1.4; color: var(--ink); }
.srun-finished { padding-top: 8px; border-top: 1px solid var(--hairline); }
.srun-fold-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 34px; }
.srun-fold-toggle { display: inline-flex; align-items: center; gap: 8px; min-height: 28px; padding: 0; border: 0; background: none;
  cursor: pointer; white-space: nowrap; font: 600 14px/1 var(--font-sans); color: var(--ink); }
.srun-fold-toggle[aria-expanded="false"] .icon, .srun-chevron { transform: rotate(-90deg); }
.srun-done-list { gap: 0; }
.srun-done + .srun-done { border-top: 1px solid var(--hairline); }
.srun-done-link { display: flex; align-items: center; gap: 12px; padding: 12px 0; min-width: 0; color: var(--ink); text-decoration: none; }
.srun-done-link:hover .srun-done-title { color: var(--violet-text); }
.srun-mark { width: 32px; height: 32px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  border-radius: 50%; background: var(--neutral-tint); color: var(--secondary); }
.srun-mark .icon { width: 16px; height: 16px; }
.srun-mark.done { background: var(--green-tint); color: var(--green-text); }
.srun-mark.failed { background: var(--red-tint); color: var(--red-text); }
.srun-done-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
/* solyctx (2026-09-25): Soly AI -> Company Knowledge, About your organisation
   (templates/_settings_soly.html, a .setup-tab panel of the Soly AI page). The ticks of a field with several codes
   in a fieldset like any field; a fold's fields in the tab's two columns;
   the link of a fact Soly also knows, in the violet text colour. */
.setup-tab fieldset.slx-many > legend { padding: 0; margin-bottom: 6px; }
.setup-tab .slx-ticks { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; min-height: 40px; }
.setup-tab .form-fold > .setup-form { padding-bottom: 12px; }
.setup-tab .form-fold-bar.form-wide { padding: 0; }
/* solychat (2026-09-25): Soly AI's thread as full-width rows between
   hairlines (templates/_assistant_message.html), no bubbles and no
   uppercase labels. A 40px avatar -- the person's initials in a grey
   circle, Soly AI's violet tile (radius 4px, the rest's radius) with the
   white sparkle -- then the name 15px/600 and the time in a soft 13px mono,
   the words 16px/1.5 below. Soly AI's rows lie on the canvas tint, the
   person's on the card; the thumbs at the top right of Soly's row; the codes
   it named violet and bold (never colour alone); the statement it wrote a
   quote with a 3px violet bar; one action row of 32px buttons. The same in
   the drawer (narrow) and on the page; long words wrap. */
.assistant-thread.soly-thread { gap: 0; padding: 0; }
.soly-drawer .soly-chat > .assistant-thread.soly-thread { padding: 0; }
.soly-row { min-width: 0; background: var(--card); border-bottom: 1px solid var(--hairline); }
.soly-row:last-child { border-bottom: 0; }
.soly-row-soly { background: var(--canvas); }
.soly-msg { display: grid; grid-template-columns: 40px minmax(0, 1fr); gap: 14px; align-items: start;
            padding: 16px; min-width: 0; }
.soly-avatar { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px;
               flex: none; }
.soly-avatar-me { border-radius: 50%; background: var(--neutral-tint); color: var(--body);
                  font: 600 14px/1 var(--font-mono); letter-spacing: .02em; }
.soly-avatar-soly { border-radius: var(--r-control); background: var(--violet); color: #fff; }
.soly-avatar-soly .icon { width: 20px; height: 20px; }
.soly-msg-body { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.soly-msg-head { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 10px; min-width: 0; min-height: 28px; }
.soly-msg-name { font: 600 15px/1.3 var(--font-sans); color: var(--ink); min-width: 0;
                 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.soly-msg-text { margin: 0; font: 400 16px/1.5 var(--font-sans); color: var(--ink); min-width: 0;
                 overflow-wrap: anywhere; }
.soly-msg-live { white-space: pre-line; }
.soly-code { color: var(--violet-text); font-weight: 600; text-decoration: none; border-radius: var(--r-badge); }
.soly-code:hover { text-decoration: underline; }
.soly-code:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.soly-quote { margin: 0; padding: 8px 16px; border-left: 3px solid var(--violet);
              font: 400 15px/1.55 var(--font-sans); color: var(--body); overflow-wrap: anywhere; }
.soly-msg-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; min-width: 0; }
.soly-msg-actions:empty { display: none; }
.soly-msg-actions .button { display: inline-flex; align-items: center; justify-content: center; min-height: 32px;
                            padding: 0 14px; border-radius: var(--r-control); font: 600 13px/1 var(--font-sans);
                            white-space: nowrap; flex: none; text-decoration: none; margin: 0; }
.soly-msg-actions .button:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.soly-msg-actions > p { flex: 1 0 100%; }
/* The thumbs at the top right: two small icon buttons, their question
   kept for the screen reader; the reason field wraps under them. */
.soly-msg-head .soly-feedback { margin: 0 0 0 auto; gap: 4px; justify-content: flex-end; }
.soly-msg-head .soly-feedback-ask { position: absolute; width: 1px; height: 1px; overflow: hidden;
                                    clip-path: inset(50%); white-space: nowrap; }
.soly-msg-head .soly-feedback .soly-vote { width: 28px; padding: 0; justify-content: center;
                                           border-color: transparent; background: transparent; color: var(--secondary); }
.soly-msg-head .soly-feedback .soly-vote:hover { border-color: var(--hairline); color: var(--ink); }
.soly-msg-head .soly-feedback .soly-vote[aria-pressed="true"] { background: var(--violet-tint);
                                                                border-color: var(--violet); color: var(--violet-text); }
.soly-msg-head .soly-feedback .soly-vote:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
/* Thinking: the dots and the word where the words come. */
.soly-think-line { display: inline-flex; align-items: center; gap: 10px; }
.soly-row .assistant-draft { max-width: 100%; }
.soly-drawer .soly-msg { gap: 12px; padding: 14px 16px; }
/* solychat, drawn to Rinat's design (drawertop, 2026-10-04): the list of
   chats grouped by day (templates/_assistant_chat.html) under "All chats ·
   35" in soft 14px -- the day ("Today") 15px/600 ink, then a row per chat
   of 44px: the whole row a link with its title 16px ink on one line with an
   ellipsis ("09:43 · 5 messages" is its tooltip and is read by screen
   readers), the trash on the right in the soft colour (darker on hover and
   focus); a row on hover and the chat last open on a light grey, radius
   4px. The same on the page. */
.soly-day { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.soly-day-label { margin: 0; color: var(--ink); }
.soly-day .soly-convs { gap: 2px; }
.soly-day .soly-conv { gap: 4px; padding-right: 6px; border-radius: var(--r-control); background: transparent; }
.soly-day .soly-conv:hover { background: var(--canvas); }
.soly-day .soly-conv-current, .soly-day .soly-conv-current:hover { background: var(--neutral-tint); }
.soly-conv-link { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; justify-content: center;
                  min-height: 44px; padding: 8px 10px; border-radius: var(--r-control); color: var(--ink);
                  text-decoration: none; }
.soly-conv-link:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.soly-conv-link .soly-conv-title { font: 400 16px/1.4 var(--font-sans); }
.soly-day .soly-conv-x { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px;
                         min-height: 28px; padding: 0; border: 0; border-radius: var(--r-control); background: transparent;
                         color: var(--secondary); cursor: pointer; flex: none; }
.soly-day .soly-conv-x:hover, .soly-day .soly-conv-x:focus-visible { color: var(--ink); background: var(--hairline); }
.soly-day .soly-conv-x:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.soly-day .soly-conv-x .icon { width: 18px; height: 18px; }

/* solytabs, budget usage (2026-09-25): the two budgets stacked, the bar the
   share used, red when the limit is reached. */
.sot-budgets { grid-template-columns: minmax(0, 1fr); }
.sot-budget.full .sot-bar-fill { background: var(--red); }

/* solysize (2026-09-25): the thread at the size of the design, measured on
   a 2.09x capture of the 360px drawer: a 28px avatar (initials 11px, the
   sparkle 16px), 14px padding and a 10px gap to the words; the name
   13px/600 on a 16px line, the time 12px mono, the words 14px/1.5 two
   pixels under the name; the quote 13px/1.5 behind a 2px violet bar with a
   12px inset; 10px between the blocks; the thumbs 24px squares with a 14px
   glyph; the actions 28px inline buttons, 13px/600, 10px side padding. The
   same on the page. (The list of chats: drawertop, under solychat.) */
.soly-msg, .soly-drawer .soly-msg { grid-template-columns: 28px minmax(0, 1fr); gap: 10px; padding: 14px; }
.soly-avatar { width: 28px; height: 28px; }
.soly-avatar-me { font-size: 11px; }
.soly-avatar-soly .icon { width: 16px; height: 16px; }
.soly-msg-body { gap: 10px; }
.soly-msg-head { min-height: 16px; gap: 2px 8px; }
.soly-msg-head + .soly-msg-text { margin-top: -8px; }
.soly-msg-name { font: 600 13px/16px var(--font-sans); }
.soly-msg-time { font-weight: 400; }
.soly-msg-text { font: 400 14px/1.5 var(--font-sans); }
.soly-quote { padding: 7px 0 7px 12px; border-left-width: 2px; font: 400 13px/1.5 var(--font-sans); }
.soly-msg-actions .button { min-height: 28px; padding: 0 10px; font: 600 13px/1 var(--font-sans); }
/* An older answer's button that is done (core/soly_behaviour/stale_actions.py):
   disabled, and drawn as a word -- no border, no fill -- so it never looks
   clickable (stepstates, FLOWS 7.618: "older messages kept their greyed
   buttons"); the one the person picked stands in the ink, the rest grey. */
.soly-msg-actions .button:disabled { color: var(--secondary); background: transparent; border-color: transparent; }
.soly-msg-actions .soly-choice[aria-pressed="true"]:disabled { color: var(--ink); }
.soly-msg-head .soly-feedback .soly-vote { width: 24px; height: 24px; min-height: 24px; }
.soly-msg-head .soly-feedback .soly-vote .icon { width: 14px; height: 14px; }
.soly-think-dots { gap: 4px; }
.soly-think-dots span { width: 6px; height: 6px; }
.soly-think-line .soly-think-word { font-size: 14px; }
/* ---- tprmreg (2026-09-25): the third party's lifecycle, clauses, supply chain,
   the register's overview cards and settings (docs/FLOWS.md 7.66) ---- */
/* The third party's header card (Rinat's design, tphead 2026-09-28): code and
   name with Other status and the one violet Move to on one line, a hairline,
   the lifecycle as seven numbered steps joined by thin lines. */
.tph { padding: 0; display: flex; flex-direction: column; }
.tph-bar { display: flex; align-items: center; gap: 12px; padding: 16px; min-width: 0; }
.tph-ident { margin: 0; display: flex; align-items: baseline; gap: 12px; min-width: 0; flex: 1 1 auto; font: 600 22px/1.25 var(--font-sans); color: var(--ink); }
.tph-code { flex: none; font-size: 16px; font-weight: 500; color: var(--violet-text); }
.tph-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tph-bar > .pill { flex: none; }
.tph-actions { display: flex; align-items: center; gap: 12px; flex: none; margin-left: auto; }
.tph-actions form { margin: 0; }
.tph-next { white-space: nowrap; flex: none; }
.tph-steps { list-style: none; margin: 0; padding: 14px 16px; border-top: 1px solid var(--hairline);
  display: flex; align-items: center; gap: 0; font-size: 14px; min-width: 0; }
.tph-steps .step { white-space: nowrap; flex: none; gap: 10px; color: var(--body); }
.tph-steps .step-bullet { width: 26px; height: 26px; font: 600 13px/1 var(--font-sans); border: 1px solid var(--field-rule); color: var(--body); background: var(--card); }
.tph-steps .step.active { color: var(--ink); font-weight: 600; }
.tph-steps .step.ready { color: var(--body); }
.tph-steps .step.ready .step-bullet { background: var(--card); border-color: var(--violet); color: var(--violet-text); }
.tph-steps .step.ready .step-bullet .icon { width: 14px; height: 14px; }
.tph-steps .step-line { list-style: none; flex: 1 1 24px; min-width: 12px; height: 1px; margin: 0 12px; background: var(--hairline); }
.tph-steps .step-line.ready { background: var(--violet); }
@media (max-width: 1100px) {
  .tph-bar { flex-wrap: wrap; }
  .tph-steps { flex-wrap: wrap; row-gap: 10px; }
  .tph-steps .step-line { flex: 0 1 16px; }
}
@media (max-width: 640px) {
  .tph-actions { width: 100%; flex-wrap: wrap; }
  .tph-steps .step-line { display: none; }
  .tph-steps { gap: 10px 16px; }
}
.tprm-clauses td .doc-entry.compact { height: 32px; min-width: 150px; }
.tprm-chain-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
.tprm-chain-row .chip { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tprm-chain-row form { flex: none; }
.tprm-chain-add { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.tprm-chain-add select { min-width: 0; flex: 1 1 200px; }
.tprm-note-lines { display: grid; gap: 8px; margin-top: 14px; }
.tprm-note-name { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; }
.tprm-overview { display: flex; flex-direction: column; gap: 14px; }
.tprm-overview .stat-grid.four { margin-bottom: 0; gap: 14px; align-items: start; }
.tprm-empty { margin: 0; }
.rr-case { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 8px; }
.tprm-cadence { display: flex; flex-direction: column; gap: 16px; }
.tprm-cadence-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; align-items: start; }

/* regnew (2026-09-25, docs/FLOWS.md 7.72): the create form of a register
   (templates/_register_create.html). The form card and, beside it, the
   preview and the completeness; the side column sticks on a wide screen
   and goes under the form on a narrow one. The card's blocks are divided
   by hairlines; the action row closes the card on the canvas colour. */
.rcr, div.tab-panel.rcr { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 16px; align-items: start; }
div.tab-panel.rcr[hidden] { display: none; }
.rcr-card { padding: 0; min-width: 0; }
.rcr-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; min-height: 32px;
  margin: 0; padding: 16px; border-bottom: 1px solid var(--hairline); }
.rcr-heading-text { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.rcr-lead, .soly-task-help { margin: 0; font-size: 12px; line-height: 1.4; color: var(--secondary); }
.rcr .rn-form.rcr-form { margin: 0; }
.rcr-form > .soly-draft { margin: 16px 16px 0; }
.rcr-soft { min-width: 0; }
.rcr-form > .card-actions, .rdt-footer, .scp-footer.card-actions { margin: 0; padding: 12px 16px; border-top: 1px solid var(--hairline); background: var(--canvas);
  border-radius: 0 0 var(--r-card) var(--r-card); }
.rcr .rn-cancel, .rcr .rn-make { flex: none; min-height: 32px; padding: 0 16px; font-size: 13px; }
.rcr-dirty:empty { display: none; }
.rcr-side { display: flex; flex-direction: column; gap: 16px; position: sticky; top: 16px; min-width: 0; }
.rcr-preview { display: flex; flex-direction: column; gap: 12px; }
.rcr-preview-head { display: flex; align-items: center; gap: 12px; min-width: 0; }
.rcr-tile, .sot-tile { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; background: var(--violet-tint); color: var(--violet-text); }
.rcr-tile, .sot-tile { border-radius: var(--r-control); }
.rcr-tile .icon { width: 20px; height: 20px; }
.rcr-preview-text { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.rcr-preview-name { margin: 0; font: 600 15px/1.3 var(--font-sans); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rcr-preview-name.unnamed { color: var(--secondary); }
.rcr-preview-sub { margin: 0; font-size: 12px; line-height: 1.4; color: var(--secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rcr-pills { display: flex; flex-wrap: wrap; gap: 8px; }
.rcr-complete { display: flex; flex-direction: column; gap: 10px; }
.rcr-complete .card-heading { margin: 0; }
.rcr-count, .xf-file-size { flex: none; white-space: nowrap; font-size: 12px; color: var(--body); }
.rset-check .rset-progress { margin: 0 16px 12px; }
.rcr-bar > span { display: block; height: 100%; background: var(--violet); transition: width var(--t-base) var(--ease); }
.rcr-checklist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.rcr-check { display: flex; align-items: baseline; gap: 8px; min-width: 0; font-size: 14px; line-height: 1.4; color: var(--ink); }
.rcr-check .icon { width: 16px; height: 16px; flex: none; align-self: center; }
.rcr-check.done .icon { color: var(--green-text); }
.rcr-check.partly .icon { color: var(--amber-text); }
.rcr-check.todo .icon { color: var(--secondary); }
.rcr-check.todo .icon circle { fill: none; stroke: currentColor; stroke-width: 1.75; }
.rcr-check.todo { color: var(--body); }
.rcr-check-name { flex: none; white-space: nowrap; }
.rcr-check .rcr-soft { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rcr-rule { margin: 0; padding-top: 10px; border-top: 1px solid var(--hairline); font-size: 12px; line-height: 1.5; color: var(--secondary); }
/* recpage (2026-10-12, docs/FLOWS.md 7.330): the pieces of an opened record's
   page in Rinat's remote access design, for every record page that has them
   (the OT asset follows): the chips of the heading line; a form section's
   mono eyebrow; a field two columns wide; a checkbox drawn as a field, tinted
   while ticked; a select with its status dot (the option's data-tone); the
   Extend buttons under a date; the short mono tag in a chip (SL2); the saved
   line of the action row that steps aside for "Unsaved changes"; the Needs
   attention card's line past its date; the Delete card of an administrator. */
.rec-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 4px; }
.rec-chips .pill { flex: none; white-space: nowrap; }
.form-section > h3.eyebrow { margin: 0; }
.form-grid > .form-span-2 { grid-column: span 2; }
.field-check { display: flex; align-items: center; gap: 10px; box-sizing: border-box; height: 40px; padding: 0 12px; min-width: 0;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); color: var(--ink);
  font: 400 14px/1.3 var(--font-sans); cursor: pointer; }
.field-check > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.field-check input { flex: none; width: 16px; height: 16px; margin: 0; accent-color: var(--violet); }
.field-check:has(input:checked) { border-color: var(--violet); background: var(--violet-tint); }
.select-dot { position: relative; display: block; min-width: 0; }
.select-dot > .dot { position: absolute; left: 12px; top: 50%; width: 8px; height: 8px; margin-top: -4px; pointer-events: none; background: var(--secondary); }
.select-dot > select.doc-entry { padding-left: 28px; }
.select-dot:has(option[data-tone="good"]:checked) > .dot { background: var(--green-text); }
.select-dot:has(option[data-tone="attention"]:checked) > .dot { background: var(--amber-text); }
.select-dot:has(option[data-tone="error"]:checked) > .dot { background: var(--red-text); }
.form-imported { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; min-width: 0; }
.form-imported[hidden] { display: none; }
.form-imported > button.card-link { text-align: left; }
.date-extend { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.date-extend .button { flex: none; white-space: nowrap; }
.chip .chip-tag { flex: none; font: 500 11px/1 var(--font-mono); color: var(--body); }
.card-actions:has(.rcr-dirty:not(:empty)) > .rec-saved { display: none; }
.rcr-check.late .icon { color: var(--red-text); }
.rec-delete { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.rec-delete-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.rec-delete-text > .card-sub { margin: 0; }
.rec-delete form { margin: 0; flex: none; }
/* the Delete… of a record's Delete card: the small danger button with a red rule you can see (3:1 against the card) */
.button.small.danger.danger-line { border-color: var(--red-text); }
@media (max-width: 720px) { .form-grid > .form-span-2 { grid-column: 1 / -1; } }
/* crg (2026-09-27): the summary layout's Summary card (templates/_rcr_summary.html):
   the facts as label/value rows over a hairline, a toned value with its level
   dot beside the word, "Filled in n / m" over the bar, the required name in red. */
.rcr-summary { display: flex; flex-direction: column; gap: 10px; }
.rcr-summary > .card-heading { margin: 0; }
.rcr-facts { margin: 0; padding: 0 0 10px; display: flex; flex-direction: column; gap: 8px; border-bottom: 1px solid var(--hairline); }
.rcr-fact { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-width: 0; font-size: 13px; line-height: 1.4; }
.rcr-fact > dt { flex: none; color: var(--secondary); }
.rcr-fact > dd { margin: 0; min-width: 0; display: inline-flex; align-items: center; gap: 6px; color: var(--ink); white-space: nowrap; }
.rcr-filled, .rcr-required { margin: 0; font-size: 12px; line-height: 1.4; overflow-wrap: anywhere; }
.rcr-filled { color: var(--body); }
.rcr-required { color: var(--red-text); }
.rcr-required[hidden], .rcr-hint[hidden], .rcr-fact .dot[hidden] { display: none; }
.dot.level-green { background: var(--risk-1); }
.dot.level-lightgreen { background: var(--risk-2); }
.dot.level-yellow { background: var(--risk-3); }
.dot.level-orange { background: var(--risk-4); }
.dot.level-red { background: var(--risk-5); }
.dot.level-darkred { background: var(--risk-6); }
@media (max-width: 1100px) {
  .rcr, div.tab-panel.rcr { grid-template-columns: minmax(0, 1fr); }
  .rcr-side { position: static; }
}
@media (prefers-reduced-motion: reduce) {
  .rcr-bar > span { transition: none; }
}
/* recdetail (2026-09-26): an opened record in the card of its create form
   (templates/_risk_detail.html for the IT and OT risks, _register_create.html
   with `editing` for every register). "More sections" is one list drawn
   in two: the rows inside the form, then -- after the form, since they
   carry forms of their own -- the rows that follow, joined without a seam.
   A card a row holds (the owner's decision, the workflows, the demands)
   loses its frame there; the action row closes the card on the canvas. */
.rdt-more-head { padding-bottom: 0; }
.rdt-more-head > .form-more-list { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
.rdt-more-tail { padding-top: 0; }
.rdt-more-tail > .form-more-list { border-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; }
.rdt-region { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.rdt-region[hidden] { display: none; }
.rdt-region > .card { margin: 0; padding: 0; border: 0; box-shadow: none; background: transparent; }
.rdt-region > .card + .card { padding-top: 16px; border-top: 1px solid var(--hairline); }
.rdt-region > .card > .card-heading { min-height: 0; }
.rdt-facts { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px;
  font-size: 12px; line-height: 1.4; color: var(--secondary); }
.rdt-facts > li { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rdt-record .rdt-score-line { white-space: normal; }
.rdt-remove { flex-wrap: wrap; }
.rdt-remove > input { flex: 1 1 260px; min-width: 0; }
.rdt-actions .rule-form { margin: 0; }
.rdt-linked { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.rdt-linked-name { margin: 0; }
/* the consequences as toggle chips: the word starts with a capital, as the chips of the risk form did */
.rdt-ticks .rn-tick > span { display: inline-block; }
.rdt-ticks .rn-tick > span::first-letter { text-transform: uppercase; }
/* procdetail (2026-09-28, docs/FLOWS.md 7.155): the record design of a page
   that is not a register's (the processing record and its DPIA). The record
   card's tile carries the kind's letters instead of a glyph; a section of
   the completeness still missing something says what on a second line; the
   card heading holds plain text links on its right; a row of More sections
   whose state is a problem says it in red (the word stays); a picker in
   error turns its border red like a field; a section heading holds its one
   hairline action on the right (40px, the heading-line rule above). */
.rcr-tile-letters { font: 600 14px/1 var(--font-mono); letter-spacing: .02em; }
.rcr-lines .rcr-check { flex-wrap: wrap; }
.rcr-lines .rcr-check > .rcr-soft { flex: 1 0 100%; padding-left: 24px; font-size: 12px; }
.rcr-heading-links { display: flex; align-items: center; gap: 16px; flex: none; white-space: nowrap; }
.form-more-state.danger { color: var(--red-text); }
.link-pane:has([aria-invalid="true"]) { border-color: var(--red-text); }
.form-error-action { color: inherit; font-weight: 600; text-decoration: underline; }
.form-section-head > .button { margin-left: auto; flex: none; white-space: nowrap; }
.form-grid[hidden] { display: none; }
.tabbar .tab.active .tab-count.danger { background: var(--red-tint); color: var(--red-text); }
.procd-empty > td { padding: 24px 16px; text-align: center; }
.procd-empty-title { display: block; }
.procd-empty-line { display: block; padding-top: 4px; font-size: 13px; line-height: 1.4; color: var(--secondary); }
.dot.muted { background: var(--secondary); }
.procl-dpia { display: inline-flex; align-items: center; gap: 8px; font-weight: 600; color: var(--ink); }
/* solypage (2026-09-25, docs/FLOWS.md 7.73): a field Soly filled on the page
   that was open (the risk page's form, the control page, a register's form),
   ringed and marked the same way as the soly_live fill; a chip field rings
   its whole pane. */
[data-soly-form] .soly-filled { box-shadow: 0 0 0 2px var(--violet); background-color: var(--violet-tint); }
[data-soly-form] .soly-filling { box-shadow: 0 0 0 2px var(--violet); transition: box-shadow .15s ease; }
.soly-page-offer, .soly-row-soly .soly-undo { white-space: nowrap; flex: none; }
@media (prefers-reduced-motion: reduce) { [data-soly-form] .soly-filling { transition: none; } }
/* solyhighlight (2026-09-29, static/js/soly_highlight.js): the field or the button Soly AI points at --
   a violet ring in the focus ring's colour that breathes every 2 s; a recommended field's ring is
   thinner and lighter; still under prefers-reduced-motion. The answer names each one in words. */
.soly-highlight { position: relative; z-index: 1; box-shadow: 0 0 0 3px var(--focus-ring);
  animation: soly-highlight-pulse 2s ease-in-out infinite; }
.soly-highlight.soly-highlight-soft { box-shadow: 0 0 0 2px color-mix(in srgb, var(--focus-ring) 60%, transparent);
  animation-name: soly-highlight-soft; }
@keyframes soly-highlight-pulse {
  0%, 100% { box-shadow: 0 0 0 3px var(--focus-ring); }
  50% { box-shadow: 0 0 0 3px var(--focus-ring), 0 0 0 8px color-mix(in srgb, var(--focus-ring) 25%, transparent); } }
@keyframes soly-highlight-soft {
  0%, 100% { box-shadow: 0 0 0 2px color-mix(in srgb, var(--focus-ring) 60%, transparent); }
  50% { box-shadow: 0 0 0 2px color-mix(in srgb, var(--focus-ring) 60%, transparent),
    0 0 0 6px color-mix(in srgb, var(--focus-ring) 15%, transparent); } }
.soly-highlight-stop { white-space: nowrap; flex: none; }
@media (prefers-reduced-motion: reduce) { .soly-highlight, .soly-highlight.soly-highlight-soft { animation: none; } }

/* riskform (2026-09-25, docs/FLOWS.md 7.74): the risk registers' create form
   (templates/_risk_create.html) on the register create's grid (the rcr
   classes above): the form card on the left, the inherent score on the
   client's own matrix and the residual on the right; and the banner and
   the chips of every form Soly AI fills (templates/_soly_draft_banner.html,
   static/js/soly_marks.js). */
/* the residual before any treatment: a dashed box until "Set now" */
.rrc-residual > summary.rrc-residual-box, .rrc-residual-note { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; min-height: 44px; margin: 0; padding: 8px 14px; border: 1px dashed var(--field-rule); border-radius: var(--r-control);
  background: var(--canvas); font: 400 13px/1.4 var(--font-sans); color: var(--body); }
.rrc-residual > summary.rrc-residual-box { cursor: pointer; }
.rrc-residual[open] > summary { display: none; }
.rrc-residual-empty { flex: 1 1 auto; min-width: 0; }
.rrc-set-now { flex: none; white-space: nowrap; font-weight: 600; color: var(--violet-text); }
.rrc-residual > summary:hover .rrc-set-now { text-decoration: underline; text-underline-offset: 2px; }
.rrc-residual .rrc-residual-fields { padding: 0; }
/* the accordion rows are folds (details): Show all fields, Soly AI's fill and a refused field open them */
.rrc-row.form-fold, .rrc-residual.form-fold { margin: 0; padding: 0; border: 0; border-radius: 0; }
.rrc-row.form-fold > summary.form-more-toggle, .rrc-row.form-fold[open] > summary.form-more-toggle { min-height: 48px; margin: 0; padding: 0 16px; border-bottom: 0; }
.rrc-row > .form-more-region { gap: 16px; }
/* the right column: the inherent score on the matrix, the residual under it */
.rrc-score { display: flex; flex-direction: column; gap: 12px; }
.rrc-score-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 32px; }
.rrc-score-value { display: inline-flex; align-items: center; gap: 8px; flex: none; }
.rrc-score-value[hidden] { display: none; }
.rrc-score-value b { font: 600 28px/1 var(--font-sans); font-variant-numeric: tabular-nums; color: var(--ink); }
.rrc-rest .rrc-score-value b { font-size: 18px; }
.rrc-matrix-wrap { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.rrc-axis-y, .rrc-axis-x, .figure-label { font: 400 12px/1.3 var(--font-sans); color: var(--body); white-space: nowrap; }
.rrc-axis-x { align-self: flex-end; }
.rrc-matrix { display: grid; grid-template-columns: 16px repeat(var(--columns), minmax(0, 1fr)); gap: 4px; min-width: 0; }
.rrc-tick { font-size: 11px; line-height: 1; color: var(--body); text-align: center; align-self: center; }
.rn-cell.rrc-cell { height: auto; min-height: 28px; aspect-ratio: 4 / 3; border-radius: var(--r-control); font: 600 13px/1 var(--font-mono); }
.rn-cell.rrc-cell.active { border-color: var(--ink); box-shadow: inset 0 0 0 1px var(--card); }
.rrc-soft { margin: 0; font-size: 13px; line-height: 1.5; color: var(--secondary); }
.rrc-soft[hidden], .rrc-bar[hidden] { display: none; }
.rrc-bar { position: relative; display: flex; gap: 2px; height: 8px; margin: 4px 0; }
.rrc-bar > span { display: block; height: 100%; border-radius: var(--r-badge); flex: var(--share); }
.rrc-bar > i { position: absolute; top: -4px; left: 0; width: 2px; height: 16px; border-radius: 1px; background: var(--ink); transform: translateX(-1px); }
/* Soly AI filled this form: the violet sparkle tile, the count in bold,
   the soft line, Undo fill on the right; the chip beside each label. */
.report.soly-fill-banner { align-items: flex-start; gap: 12px; padding: 12px 14px; background: var(--violet-tint); color: var(--ink); }
.report.soly-fill-banner[hidden] { display: none; }
.soly-fill-tile { border-radius: var(--r-control); }
.soly-fill-tile .icon { width: 18px; height: 18px; }
.soly-fill-text { flex: 1 1 auto; min-width: 0; margin: 0; align-self: center; font-size: 14px; line-height: 1.4; color: var(--ink); }
.soly-fill-text strong { font-weight: 600; }
.soly-fill-soft { color: var(--body); }
.soly-fill-banner .soly-undo { flex: none; align-self: flex-start; min-height: 28px; white-space: nowrap; }
/* (fixb O8) a fill made from the drawer: while the drawer is open its answer carries the one Undo fill, the page's banner none (static/js/soly_page.js) */
.shell.soly-open [data-soly-page-banner] .soly-undo { display: none; }
/* The controls Soly fills with the person (solyctl, 7.104): the banner's design as the run's bar above the page, its buttons on the right; the drawer's one line with a thin progress bar. */
.soly-run-bar { margin-bottom: 14px; }
.soly-run-actions { display: flex; flex: none; gap: 8px; align-items: center; margin: 0 0 0 auto; }
.soly-run-line { display: flex; align-items: center; gap: 8px; padding: 8px 0; border-bottom: 1px solid var(--rule); }
.soly-run-text { display: flex; flex-direction: column; gap: 4px; flex: 1 1 auto; min-width: 0; font-size: 13px; }
.soly-run-text .card-link { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.soly-run-track { display: block; height: 4px; border-radius: 2px; background: var(--violet-tint); overflow: hidden; }
.soly-run-done { display: block; height: 100%; background: var(--violet); }
.soly-field-mark.soly-chip { display: inline-flex; align-items: center; gap: 4px; padding: 1px 6px; font: 600 11px/1.4 var(--font-sans); }
.soly-chip .icon { width: 12px; height: 12px; flex: none; }
/* the same banner drawn by soly_marks.js at the top of a form filled on the open page: a whole row of a grid form */
[data-soly-page-banner] { grid-column: 1 / -1; margin: 0 0 16px; }
.rcr-form > [data-soly-page-banner] { margin: 16px 16px 0; }

/* cp_stack (2026-09-25, Rinat): when the control card is too narrow for its
   two columns, the grey side column (owner, review, last changed) goes ON
   TOP of the white one. Measured on the card itself, so an open Soly
   panel or a narrow window both count. */
.cp-card { container-type: inline-size; }
@container (max-width: 760px) {
  .cp-split { grid-template-columns: minmax(0, 1fr); }
  .cp-aside { order: -1; border-left: 0; border-top: 0; border-bottom: 1px solid var(--hairline); }
  .cp-two { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 900px) {
  .cp-aside { order: -1; border-top: 0; border-bottom: 1px solid var(--hairline); }
}

/* attn4 (Rinat, 2026-09-26; his design v9, 2026-10-19): the dashboard's
   Needs attention (templates/_dashboard_attention.html). The heading line is
   the section's (.dash-row-heading); under it the causes as four cards side
   by side, 16px apart, each with its tone on its top edge (.tone-edge), its
   name, its total and at most three rows (the count in its severity's
   colour, the words, the page below them, a chevron); one line under the
   cards for the causes not shown. Two columns on a tablet, one on a phone. */
.attn4 { display: flex; flex-direction: column; gap: 10px; }
.attn4-groups { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); align-items: stretch; gap: 16px; }
.attn4-group { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.attn4-group[hidden] { display: none; }
.attn4-group-head { display: flex; flex-direction: column; gap: 4px; margin: 0; min-width: 0; }
.attn4-group-name { color: var(--secondary); min-width: 0; }
.attn4-rows { list-style: none; margin: 0; padding: 0; }
.attn4-rows > li { border-top: 1px solid var(--hairline); }
.attn4-row { display: flex; align-items: flex-start; gap: 10px; padding: 8px 4px; margin: 0 -4px; border-radius: var(--r-control); color: var(--ink); text-decoration: none; }
.attn4-row:hover { background: var(--violet-tint); }
.attn4-n { font: 600 15px/1.4 var(--font-sans); color: var(--amber-text); flex: none; white-space: nowrap; min-width: 20px; }
.attn4-n.error { color: var(--red-text); }
.attn4-words { display: flex; flex-direction: column; gap: 2px; flex: 1 1 auto; min-width: 0; }
.attn4-cause { font-size: 14px; line-height: 1.4; color: var(--ink); overflow-wrap: anywhere; }
.attn4-chevron { margin-top: 3px; }
.attn4-more { margin-top: auto; white-space: nowrap; }
.attn4-more:hover { text-decoration: underline; }
.attn4-foot { display: flex; align-items: center; gap: 8px; }
.attn4-foot-text { font-size: 13px; color: var(--secondary); }
.list-toggle { padding: 0; line-height: 1.4; }
.list-toggle:hover { text-decoration: underline; }
@media (max-width: 1024px) { .attn4-groups { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .attn4-groups { grid-template-columns: minmax(0, 1fr); } }

/* The list card (templates/_risk_list.html and every page with a filter row,
   2026-09-26): one card, the heading line and the filter row each under a
   hairline, the table edge to edge, a grey foot band with the range and the
   pager. Sizes measured on the design (1.4 image px per CSS px, calibrated on
   its 40px table header; each word's ink width matched against IBM Plex) and
   set to the brand type scale: heading 18, the eyebrow and the filters 14. */
section.card.list-card, details.card.list-card { padding: 0; overflow: hidden; display: block; }
/* The fold card (histcard 2026-09-26, every fold 2026-09-27): a card that
   folds shut is one heading line, whatever it holds -- the History card
   (_history.html: details.list-card, summary.list-head) and every
   details.card.card-fold (summary.card-heading; the remove and delete
   folds, the OT asset's cards, the settings folds, the group explainer).
   16px 24px around the line; first the chevron (.form-more-chevron: 16px,
   --secondary, 1.75 stroke), 12px to the title (18px/600); the chevron
   turns down when open, a hairline under an open line and none under a
   closed one. A card-fold's body keeps 24px at the sides and 16px under
   the rule and at the bottom. No glyph between chevron and title. */
details.list-card > summary.list-head, details.card-fold > summary.card-heading { cursor: pointer; list-style: none; }
details.list-card > summary.list-head::-webkit-details-marker,
details.card-fold > summary.card-heading::-webkit-details-marker { display: none; }
details.list-card:not([open]) > summary.list-head { border-bottom: 0; }
details.list-card > summary .list-head-title,
details.card-fold > summary.card-heading .card-heading-links,
details.card-fold > summary.card-heading .rr-heading-links { align-items: center; gap: 12px; }
details.card-fold > summary.card-heading .form-more-chevron { display: block; width: 16px; height: 16px; color: var(--secondary); }
details[open] > summary .form-more-chevron { transform: rotate(90deg); }   /* also the opened risk's rows (.rrc-row) */
details.card.card-fold { display: block; padding: 0 24px; }
details.card.card-fold[open] { padding-bottom: 16px; }
details.card-fold > summary.card-heading { min-height: 0; margin: 0 -24px; padding: 16px 24px; }
details.card-fold[open] > summary.card-heading { margin-bottom: 16px; border-bottom: 1px solid var(--hairline); }
.list-head { display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 16px 24px; margin: 0; border-bottom: 1px solid var(--hairline); flex-wrap: wrap; }
/* A card whose heading needs no rule under it (the overview's distribution,
   steps and matrix): the heading line without the hairline, the body 14px
   under it. */
.list-head.plain { border-bottom: 0; padding-bottom: 0; }
.list-card > .list-head.plain + .list-body { padding-top: 14px; }
/* the growing column of the heading line: its counts wrap inside it, so the section's actions keep the top right
   corner beside it (Rinat, 2026-10-26: "we always put them in the section top right corner"; FLOWS 7.568) */
.list-head-title { display: flex; align-items: baseline; gap: 12px; min-width: 0; flex-wrap: wrap; flex: 1 1 320px; }
/* a heading line with actions: they hold the top of the line; the title column is as tall as they are and centres its
   one line in it, a second line of counts goes under it -- never the actions */
.list-head:has(> .list-head-actions) { align-items: flex-start; }
.list-head:has(> .list-head-actions) > .list-head-title { min-height: 40px; align-content: center; }
.bil-price strong, .bil-stat strong, h2.spotlight-title, .attn4-group-n, .bil-fact strong, .bil-split-head h2, .list-head-title h2, .dash-row-heading h2, .infra-meter-line strong, .infra-tile strong, .cmap-heat-title h2, .cp-title, .ctl-state-title h2, .grp-heading h2, .welcome-company, .tree-title, .member-panel-name, .sacc-section-head h2, .card-heading h1.card-title, .rr-heading-links h1.card-title, h1.card-title, .scp-head-text h2, .sacc-head h2, .cp-heading h2, .rr-heading-links h2, .link-group-heading h2, .card-heading h2, .acct-name strong, .cp-big, .read-table_of_contents h2, .setting-heading h2, .rcr-heading-text h2, .rep-head h2, .confirm-dialog-title, .call-when-day, .call-day-number, .xf-card-title, .xf-done-head h1, .xf-done-head h2, .figure h2, .figure strong, .card-heading h5, .rr-heading-links h5, .story-ending h3, .medal-words strong { font: 600 18px/1.3 var(--font-sans); color: var(--ink); }
.list-head-title h2, .dash-row-heading h2, .cmap-heat-title h2, .ctl-state-title h2, .grp-heading h2, .welcome-company, .tree-title, .member-panel-name, .sacc-section-head h2, .scp-head-text h2, .sacc-head h2, .cp-heading h2, .rr-heading-links h2, .link-group-heading h2, .rcr-heading-text h2, .confirm-dialog-title, .figure h2, .card-heading h5, .rr-heading-links h5 { margin: 0; }
.list-head-title h2, .dash-row-heading h2, .attn4-group-n, .cmap-heat-title h2, .ctl-state-title h2, .grp-heading h2, .tree-title, .member-panel-name, .sacc-section-head h2, .figure h2, .figure strong { white-space: nowrap; }
.tree-title { overflow: hidden; text-overflow: ellipsis; }
.member-panel-name { overflow: hidden; text-overflow: ellipsis; }
.read-table_of_contents h2 { margin: 0 0 .5rem; }
.setting-heading h2 { margin: 0 0 var(--s-2); }
.welcome-company, .confirm-dialog-title { overflow-wrap: anywhere; }
.list-eyebrow, .rdmp-where, .rs-muted, .dash-frameworks .dash-fw-counts, .guide-unclear-thanks, .acct-note { font: 400 14px/1.4 var(--font-sans); }
.list-eyebrow, .rdmp-where, .rs-muted, .dash-frameworks .dash-fw-counts, .acct-note { color: var(--secondary); }
.acct-note { line-height: 20px; }
.guide-unclear-thanks { color: var(--green-text); }
.list-head-actions { display: flex; align-items: center; gap: 14px; flex: none; min-height: 40px; }
/* A section's action in the top right corner of its heading line: always a bordered button -- the hairline look above
   (`.button.hairline`), 40px -- never link text (Rinat, 2026-10-26: "make all of these buttons with borders on all the
   pages"). Nothing stands beside the page title's ?: a page's actions are in their section's corner. */
.list-text-button { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 16px; border-radius: var(--r-control);
  font: 600 14px/1 var(--font-sans); color: var(--ink); text-decoration: none; white-space: nowrap; flex: none; }
button.list-text-button { cursor: pointer; }   /* a button that opens a panel of the page, or submits its form */
.list-head-actions .button.list-add, .data-table .button.hairline.evv-row-button { display: inline-flex; align-items: center; gap: 8px; min-height: 40px; height: 40px;
  padding: 0 16px; font: 600 14px/1 var(--font-sans); border-radius: var(--r-control); white-space: nowrap; flex: none; }
.list-add .icon { width: 16px; height: 16px; }
.list-note { padding: 8px 24px 0; }
/* Import all in the Available list's heading (isoG, docs/FLOWS.md 7.245): the version and the date at the
   heading line's 40px beside its one button; the progress and the result under the heading. */
.doc-import-all { gap: 8px; flex-wrap: wrap; }
.doc-import-all .doc-entry { height: 40px; box-sizing: border-box; }
.doc-import-all-version { width: 72px; }
.doc-import-all-state { display: flex; flex-direction: column; gap: 8px; }
.doc-import-all-state[hidden] { display: none; }
.doc-import-all-state .progress-bar-row { margin: 0; }
.filter-bar.list-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0;
  padding: 12px 24px; border-bottom: 1px solid var(--hairline); }
.list-filters .list-search { position: relative; flex: 0 1 300px; min-width: 200px; }
.list-filters .list-search .icon { position: absolute; left: 14px; right: auto; top: 50%; transform: translateY(-50%);
  width: 16px; height: 16px; color: var(--secondary); pointer-events: none; z-index: 1; }
.filter-bar.list-filters > label.list-search > input.doc-entry { width: 100%; padding: 0 14px 0 38px; font: 400 14px/38px var(--font-sans); }
/* A select is as wide as its label (the chosen option), not as its longest option. */
.list-filters select.rr-filter { font: 500 14px/38px var(--font-sans) !important; padding: 0 34px 0 14px;
  field-sizing: content; width: auto; min-width: 0; max-width: 240px; flex: none; }
.list-filters .rr-clear { font: 600 14px/1 var(--font-sans); }
.list-card .table-wrap.list-wrap { overflow-x: auto; border: 0; border-radius: 0; margin: 0; }
/* The risk list's own: seven columns of a fixed width, the score as two
   levels with an arrow, the owner's link, the status pill. */
.data-table.rl-table { min-width: 1108px; table-layout: auto; }
.rl-table col.rl-c-id { width: 99px; }
.rl-table col.rl-c-score { width: 155px; }
.rl-table col.rl-c-treatment { width: 155px; }
.rl-table col.rl-c-decision { width: 177px; }
.rl-table col.rl-c-date { width: 123px; }
.rl-table col.rl-c-status { width: 139px; }
.rl-score-line { display: flex; flex-wrap: wrap; align-items: center; column-gap: 10px; row-gap: 6px; }
.rl-arrow { flex: none; }
.rl-assign { display: block; font: 500 13px/20px var(--font-sans); color: var(--violet-text); text-decoration: none; white-space: nowrap; }
.rl-assign:hover { text-decoration: underline; text-underline-offset: 2px; }
/* Risks you own (templates/_my_risks.html, the desk's My risks tab,
   2026-09-27): the risk list's cells; the decisions waiting in amber in the
   heading's counts, the score beside the level word, a title of at most two
   lines, and a risk of another domain grey with its domain chip and the
   switch beside it. */
.dr-decide { color: var(--amber-text); font-weight: 600; }
.dr-table .cell-title { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.dr-table .cell-sub { white-space: nowrap; }
.cell-code.is-away, .cell-title.is-away { color: var(--secondary); }
.dr-away { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; margin-top: 6px; }
/* Assigned to me (templates/_my_assigned.html, FLOWS 7.176): What's next as
   the state pill with the step's button under it, the date column wide
   enough for its words ("Reassessment due · 1 Jan 2024"), the reason under
   the item on one line. */
.da-table col.da-c-role { width: 130px; }
.da-table col.da-c-next { width: 170px; }
.da-table col.da-c-date { width: 230px; }
.da-next { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
.da-next > .pill, .da-next > .button { flex: none; white-space: nowrap; }
.da-why { overflow: hidden; text-overflow: ellipsis; max-width: 420px; }
/* The Cost-benefit tab (templates/_risk_costs_tab.html): the risk list's
   cells, the risk grows, the four amounts and the ratio right aligned. */
.data-table.rc-table { min-width: 1100px; table-layout: auto; }
.rc-table col.rc-c-id { width: 99px; }
.rc-table col.rc-c-score { width: 165px; }
.rc-table col.rc-c-num { width: 130px; }
.list-foot .rc-toggle { font-size: 14px; white-space: nowrap; flex: none; }
/* The risk assessments list, IT and OT alike (templates/_assessment_list.html):
   the assessment grows, its description one line with an ellipsis. */
.data-table.asl-table { min-width: 1100px; table-layout: auto; }
.asl-table col.asl-c-id { width: 120px; }
.asl-table col.asl-c-scope { width: 18%; }
.asl-table col.asl-c-date { width: 13%; }
.asl-table col.asl-c-assessor { width: 11%; }
.asl-table col.asl-c-status { width: 9%; }
.asl-table col.asl-c-findings { width: 15%; }
.asl-clip { width: 0; min-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* The asset list, IT and OT alike (templates/_asset_list.html): the code,
   then the asset, which grows and wraps; the other columns keep their width.
   The zone carries its security level as a hairline mono chip, the
   criticality is a dot and a word, the flag one pill. */
.data-table.asset-list { min-width: 1040px; table-layout: auto; }
.asset-list col.al-c-id { width: 110px; }
.asset-list col.al-c-where { width: 190px; }
.asset-list col.al-c-zone { width: 300px; }
.asset-list col.al-c-criticality { width: 170px; }
.asset-list col.al-c-owner { width: 170px; }
.asset-list col.al-c-flags { width: 200px; }
.asset-list col.al-c-links { width: 130px; }
.asset-list col.al-c-status { width: 150px; }
.asset-list td.al-asset { min-width: 0; }
.asset-list td.al-crit { white-space: nowrap; }
.asset-list td.al-crit .pill { display: flex; width: max-content; margin-top: 4px; }
.asset-list .pill { white-space: nowrap; flex: none; }
.asset-list .al-zone { display: inline-flex; align-items: center; gap: 10px; min-width: 0; max-width: 100%; }
.asset-list .al-zone-name, .ro-gap-name { min-width: 0; }
.ro-gap-name { font-weight: 400; }
.asset-list td.al-status { white-space: nowrap; }
/* The third-party list (templates/_supplier_list.html, Rinat's design,
   tpreg 2026-09-27): the party grows, its name followed by the IT/OT chip;
   the questionnaire's count as a code over a thin bar of 108px. */
.data-table.tpr-table { min-width: 1100px; table-layout: auto; }
.tpr-table col.tpr-c-id { width: 100px; }
.tpr-table col.tpr-c-tier { width: 124px; }
.tpr-table col.tpr-c-questions, .tpr-table col.tpr-c-owner { width: 178px; }
.tpr-table col.tpr-c-date { width: 135px; }
.tpr-table col.tpr-c-status { width: 154px; }
.tpr-name { display: flex; align-items: center; gap: 10px; min-width: 0; }
.tpr-name > .cell-title { min-width: 0; }
/* A title and its source tags on one line (docs/FLOWS.md 7.119): the title
   keeps its ellipsis, the tags never wrap; the same line holds a candidate
   of a connector's Matches tab, its code, its name and its Link. */
.src-line, .conn-cand { display: flex; align-items: center; gap: 6px; min-width: 0; }
.src-line > :is(.cell-title, .rr-title), .conn-cand-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.conn-cand + .conn-cand, .conn-pick { margin-top: 6px; }
.conn-pick input { width: 220px; }
.tpr-bar { width: 108px; margin-top: 6px; }
.tpr-bar i.tpr-bar-done { background: var(--green); }
.tpr-bar i.tpr-bar-no { background: var(--red); }
/* The linked documents' list (templates/_external_doc_list.html, Rinat's
   design, lnkdoc 2026-09-27): the document grows, a 32px square tile in its
   source's tint beside a title on one line with an ellipsis; the row's
   actions (Validate link, the address in a new tab) at the right. */
.data-table.lnk-table { min-width: 1180px; table-layout: auto; }
.lnk-table col.lnk-c-id { width: 96px; }
.lnk-table col.lnk-c-link { width: 232px; }
.lnk-table col.lnk-c-owner { width: 160px; }
.lnk-table col.lnk-c-review { width: 164px; }
.lnk-table col.lnk-c-status { width: 132px; }
.lnk-table col.lnk-c-actions { width: 200px; }
.lnk-table > tbody > tr > td { vertical-align: middle; }   /* as drawn: the cells centred on the row */
.lnk-table td.lnk-doc { min-width: 300px; }
.lnk-doc-name { display: flex; align-items: center; gap: 12px; min-width: 0; }
.lnk-doc-text { flex: 1; min-width: 0; }
.lnk-doc-text > .cell-title { width: 0; min-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lnk-doc-text > .cell-sub { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lnk-tile { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 32px; height: 32px;
  border-radius: var(--r-control); background: var(--neutral-tint); color: var(--body); font: 600 12px/1 var(--font-mono); }
.lnk-tile .icon { width: 16px; height: 16px; }
.lnk-tile.tone-confluence { background: var(--violet-tint); color: var(--violet-text); }
.lnk-tile.tone-google_drive { background: var(--green-tint); color: var(--green-text); }
.lnk-tile.tone-sharepoint { background: var(--blue-tint); color: var(--blue-text); }
.lnk-table .lnk-fix { color: var(--violet-text); font-weight: 500; text-decoration: none; }
.lnk-table .lnk-fix:hover { text-decoration: underline; text-underline-offset: 2px; }
.lnk-table .lnk-set { font-size: 14px; }
.lnk-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; white-space: nowrap; }
.lnk-row-form, .lnk-head-form { display: inline-flex; margin: 0; flex: none; }
.lnk-open { color: var(--secondary); }   /* the 28px square: with .explanation-icon */
.lnk-open:hover { background: var(--canvas); color: var(--violet-text); }
.lnk-open .icon { width: 18px; height: 18px; }
.lnk-validate-all { gap: 8px; }
.lnk-validate-all .icon { width: 16px; height: 16px; }
.list-eyebrow .lnk-broken-count { color: var(--red-text); }
.list-foot { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  padding: 12px 24px; min-height: 44px; background: var(--canvas); border-top: 1px solid var(--hairline);
  font: 400 13px/20px var(--font-sans); color: var(--secondary); }
.list-foot .table-pager { display: flex; align-items: center; gap: 8px; margin: 0 0 0 auto; }
@media (max-width: 720px) {
  .list-head, .filter-bar.list-filters { padding-left: 16px; padding-right: 16px; }
  details.card.card-fold { padding-left: 16px; padding-right: 16px; }
  details.card-fold > summary.card-heading { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; }
  .list-filters .list-search { flex: 1 1 100%; }
  /* the actions shrink to the line and wrap there, never past the card (FLOWS 7.365: three of them at 375px) */
  .list-head-actions { flex-wrap: wrap; flex-shrink: 1; min-width: 0; }
}

/* Content in a list card that is not the table (an empty row, cards, notes,
   a pager) keeps a 16px 24px margin, or sits in .list-body. */
.list-card > .list-body, .list-card > .list-form > .list-body { padding: 16px 24px; }
.list-card > .list-foot, .list-card > .list-form > .list-foot { margin: 0; }
.list-card > :not(.list-head, .list-filters, .list-wrap, .table-wrap, table, .list-foot, .list-note, .table-pager, .list-body, .list-form, script, template, input) { margin: 16px 24px; }
.list-card > .list-body > :first-child { margin-top: 0; }
.list-card > .list-body > :last-child { margin-bottom: 0; }
.list-card > .table-pager, .list-card > .list-form > .table-pager { margin: 0; padding: 12px 24px; border-top: 1px solid var(--hairline); }
.list-card > .list-form { margin: 0; }
.list-card > .list-form > :not(.list-head, .list-filters, .list-wrap, .table-wrap, table, .list-foot, .list-note, .table-pager, .list-body, script, template, input) { margin: 16px 24px; }
.list-filters > .button { height: 40px; flex: none; }
.filter-bar.list-filters:last-child { border-bottom: 0; }
/* The log filter's own sizes (.logs-card .log-filter, above) give way to the list row's. */
.logs-card .log-filter.list-filters .list-search { flex: 0 1 300px; min-width: 200px; }
.logs-card .log-filter.list-filters .list-search .doc-entry { padding: 0 14px 0 38px; }
.logs-card .log-filter.list-filters select.rr-filter { max-width: 240px; }
.list-filters > select.doc-entry:not(.rr-filter) { font: 500 14px/38px var(--font-sans); padding: 0 34px 0 14px;
  field-sizing: content; width: auto; min-width: 0; max-width: 240px; flex: none; }
@media (max-width: 720px) {
  /* (ssheetd, FLOWS 7.385) the line under the heading and the foot band keep the heading's 16px on a phone too */
  .list-card > .list-body, .list-card > .table-pager, .list-card > .list-note, .list-card > .list-foot { padding-left: 16px; padding-right: 16px; }
  .list-card > :not(.list-head, .list-filters, .list-wrap, .table-wrap, table, .list-foot, .list-note, .table-pager, .list-body, .list-form, script, template, input) { margin-left: 16px; margin-right: 16px; }
}

/* The form card (secform, 2026-09-26, the Assurance design; sizes to Rinat's
   single sign-on design 2026-10-11: line under the title 12px, group 15px/600,
   its line 13px): a settings
   form drawn from the list card and the form blocks, nothing of its own
   but the modifiers below. Markup:
     section.card.list-card.form-card
       .list-head > .list-head-title > h2 + p.list-eyebrow (one line: what the data is used for)
       form.list-form
         .list-body.form-section             one group per row, a hairline between
           .form-section-head > h3 + p.form-section-sub   the group, left, a quarter
           .form-grid.cols-2 > .form-field   its fields, right; .form-wide spans both
         .card-actions.list-foot             the grey band with the one Save
   A unit inside a field: .rset-suffixed > input + .rset-suffix. A second
   word after a label: .form-soft. The group stacks over its fields below 900px. */
section.card.list-card.form-card { overflow: visible; }
.form-card .list-head-title { flex-direction: column; align-items: flex-start; gap: 2px; }
.form-card .list-head-title > .list-eyebrow { margin: 0; font-size: 12px; }
.form-card .list-form > .form-section { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); gap: 24px; padding: 24px; align-items: start; }
.form-card .form-section-head { flex-direction: column; align-items: flex-start; gap: 4px; }
.form-card .form-section-head > h3 { font-size: 15px; white-space: normal; }
.form-card .form-section-sub { margin: 0; font-size: 13px; }
.form-card .form-grid { gap: 20px 24px; }
.form-card .form-label:not(.eyebrow) { font: 600 15px/1.4 var(--font-sans); }
.form-card .form-hint { font-size: 13px; }
.form-card .form-grid .doc-entry:not(textarea) { height: 48px; min-height: 48px; line-height: 46px; font-size: 15px; }
.form-card.form-stacked .form-grid .record-picker .link-pane.pick, .aplan-layout .form-card .form-grid .record-picker:not(.compact) .link-pane.pick, .form-card .form-grid .choice-field:not(.compact) .link-pane.pick { min-height: 48px; padding: 4px 12px; border-color: var(--field-rule); }
/* the choice field's caret keeps its room in the form card too */
.form-card .form-grid .choice-field:not(.compact) .link-pane.pick { padding-right: 32px; }
.card-actions.list-foot { justify-content: flex-end; margin: 0; border-radius: 0 0 var(--r-card) var(--r-card); }
/* A foot band that stays in view (ssheetd, docs/FLOWS.md 7.385, Rinat's design "Prepared by Soly AI"): a card
   longer than the screen keeps its one action row at the bottom of the window while the person reads it, and the
   row lands in its place at the card's foot. The card clips instead of hiding its overflow, so the band can stick.
   It fits every long card with one Accept or Save at its foot (Soly's review sheet; the pre-assessment drawer's
   foot does the same in its own panel). */
section.card.list-card:has(> .card-actions.list-foot.foot-in-view) { overflow: clip; }
.card-actions.list-foot.foot-in-view { position: sticky; bottom: 0; z-index: 1; }
/* The review list (ssheetd, docs/FLOWS.md 7.385, Rinat's design "Prepared by Soly AI"): what a person goes through
   and decides one row at a time -- Soly AI's review sheet of a control (templates/_soly_sheet_row.html); it fits
   every list of proposals with a decision per row (Soly's proposals in the drawer, the pre-assessment's findings,
   the evidence an integration offers a control). The box is the bordered list above (.form-more-list); each row
   three columns that every row of the list shares, so the titles line up: the kind as a .pill.small in its tone,
   the text, and the row's own actions at the top right (a small Decline and a switch, or its result).
     ul.review-list > li.review-row(.declined)
       > .review-kind > .pill.small.<tone>
       > .review-text > .review-title (> .review-who) + .card-sub (its words, one per line)
                        + dl.review-facts (label and value pairs on the canvas) + .review-meta (the source, 12px soft,
                        and its chips: .pill.small)
       > .review-actions
   The title wraps to two lines and then ends in an ellipsis; a declined row's title is struck through. Below 720px
   the kind and the actions share the first line and the text runs under them across the row. */
/* the kind column: 72px for the pill at least (every kind in English fits), 16px of the row's padding inside it */
.review-list { display: grid; grid-template-columns: minmax(88px, max-content) minmax(0, 1fr) auto; column-gap: 12px; }
.review-row { grid-column: 1 / -1; display: grid; grid-template-columns: 72px minmax(0, 1fr) auto;
  grid-template-columns: subgrid; gap: 12px; align-items: start; padding: 14px 16px; min-width: 0; }
.review-row + .review-row { border-top: 1px solid var(--hairline); }
.review-kind { display: flex; min-width: 0; }
.review-text { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.review-title { font: 600 14px/20px var(--font-sans); color: var(--ink); overflow: hidden; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.review-who { font-weight: 400; color: var(--secondary); }
.review-row.declined .review-title { text-decoration: line-through; color: var(--secondary); }
.review-facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 4px 12px; margin: 0; padding: 8px 12px;
  border-radius: var(--r-control); background: var(--canvas); font: 400 13px/1.5 var(--font-sans); }
.review-facts dt { color: var(--secondary); white-space: nowrap; }
.review-facts dd { margin: 0; min-width: 0; color: var(--ink); overflow-wrap: anywhere; }
.review-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; min-width: 0;
  font: 400 12px/1.4 var(--font-sans); color: var(--secondary); }
.review-meta strong { font-weight: 600; color: var(--ink); }
.review-actions { display: flex; align-items: center; justify-content: flex-end; gap: 12px; flex: none; }
@media (max-width: 720px) {
  .review-list { display: block; }
  .review-row { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "kind actions" "text text"; padding: 12px; }
  .review-kind { grid-area: kind; }
  .review-text { grid-area: text; }
  .review-actions { grid-area: actions; }
  .review-facts { grid-template-columns: minmax(0, 1fr); gap: 2px; }
}
/* In a form card (the trust centre's Content): the segmented choice on a
   grey track, the chosen segment white and raised; the drop row for a
   file (the drop zone across the column, its file field focusable); rows
   of a switch with its label and a line under it, a hairline between. */
.segment.segment-track { background: var(--canvas); padding: 3px; gap: 3px; }
.segment-track .segment-button { position: relative; min-height: 40px; border: 0; border-radius: var(--r-control); background: transparent; color: var(--body); white-space: nowrap; }
.segment-track .segment-button:has(input:checked) { background: var(--card); color: var(--ink); box-shadow: 0 1px 2px rgba(17, 20, 45, .14); }
.segment-track .segment-button:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: -2px; }
/* The same track on white, the chosen segment tinted violet (the OT conduit's direction). */
.segment.segment-track.segment-tint { background: var(--card); border-color: var(--field-rule); }
.segment-tint .segment-button:has(input:checked) { background: var(--violet-tint); color: var(--violet-text); box-shadow: none; }
/* The same track at the height of a control in a table row (32px): the
   notification defaults' At once / Digest / Off per group and channel. */
.segment.segment-compact { padding: 1px; gap: 2px; }
.segment-compact .segment-button { min-height: 28px; padding: 0 8px; font-size: 13px; }
.switch-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 56px; padding: 8px 0; cursor: pointer; }
.switch-row + .switch-row { border-top: 1px solid var(--hairline); }
.switch-row-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
/* Pieces of a settings form card (Rinat's single sign-on design, 2026-10-11),
   shared so the next settings card draws them the same way:
     p.report.warning.form-banner   the amber band under the card head: a glyph,
                                    the bold first words, the sentence
     .form-box                      a hairline box inside a section's fields
     .form-box.form-status          a status line in it: .dot, .form-status-text
                                    (the status in words), an action on the right
     .switch-rows.form-box          switch rows in a box
     .copy-field                    a read-only value to register elsewhere: mono
                                    on grey, a dashed border, Copy on its right
     .form-fold summary             .form-more-chevron, .form-fold-text, a .form-soft
                                    word on the right ("Optional")
     .form-box > .map-row           a mapping: .map-labels (eyebrows) over rows of
                                    a value, .map-arrow, a choice and its x
     .map-foot                      under it: Add on the left, a hint on the right */
.report.form-banner { display: flex; align-items: flex-start; gap: 10px; margin: 16px 24px 0; font-size: 13px; }
.form-box { border: 1px solid var(--hairline); border-radius: var(--r-card); min-width: 0; }
.form-box.form-status { display: flex; align-items: center; gap: 10px; min-height: 56px; padding: 8px 8px 8px 14px; }
.form-status-text { flex: 1 1 auto; min-width: 0; font: 400 14px/1.4 var(--font-sans); color: var(--ink); }
.form-status > .button, .copy-field > .button { flex: none; white-space: nowrap; }
.switch-rows.form-box { padding: 0 14px; }
.copy-field { display: flex; align-items: center; gap: 8px; min-height: 48px; padding: 6px 6px 6px 14px;
  border: 1px dashed var(--field-rule); border-radius: var(--r-control); background: var(--canvas); min-width: 0; }
.copy-field > code { flex: 1 1 auto; min-width: 0; font: 400 14px/1.4 var(--font-mono); color: var(--ink); overflow-wrap: anywhere; }
.form-grid > .form-fold { margin-top: 0; }
.form-fold > summary > .form-fold-text { flex: 1 1 auto; min-width: 0; }
.form-fold > summary > .form-soft { flex: none; white-space: nowrap; font-size: 13px; }
.form-fold[open] > summary .form-more-chevron { transform: rotate(90deg); }
.map-row { display: grid; grid-template-columns: minmax(0, 1fr) 24px minmax(0, 1fr) 32px; gap: 8px; align-items: center; padding: 8px 8px 8px 12px; }
.map-row + .map-row { border-top: 1px solid var(--hairline); }
.map-row > .doc-entry { width: 100%; min-width: 0; }
.map-row.map-labels { min-height: 36px; padding-top: 4px; padding-bottom: 4px; background: var(--canvas); border-radius: var(--r-card) var(--r-card) 0 0; }
.map-arrow { text-align: center; color: var(--secondary); }
.map-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px 16px; flex-wrap: wrap; }
.map-foot > .form-hint { min-width: 0; text-align: right; }
@media (max-width: 900px) { .form-card .list-form > .form-section { grid-template-columns: minmax(0, 1fr); gap: 16px; } }
@media (max-width: 720px) { .form-card .list-form > .form-section { padding: 16px; } }
/* Work with notes beside it (Rinat's Clearance design, 2026-10-18, FLOWS 7.379; shared, for any card
   whose work needs a few lines of explanation next to it): the body of a card in two columns, the work
   on the left and a column of notes of 340px on the right, each as tall as its content. The work keeps
   at least 70% of the width; where the notes would squeeze it below that, they go under it (no
   breakpoint: a card in the rail, a narrow screen and a phone all follow from it). A table in the
   work is framed (the layout contract: 1px, 4px), as it does not run edge to edge. Markup:
     .aside-split > .aside-main      the work: a .form-section-head, a table, a .form-hint under it
                  > aside.aside-notes  the notes, 20px apart
     .aside-note                     one note: an h3 of 14px/600 and its text of 14px, 10px apart
     .aside-note.aside-state         the note that says the state: the tinted box (one rule with the
                                     console's .infra-note), a pill in its h3 when it is Not usable */
.aside-split { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 24px; }
.aside-main { flex: 999 1 0; min-width: 70%; display: flex; flex-direction: column; gap: 10px; }
.aside-notes { flex: 1 1 340px; min-width: 0; display: flex; flex-direction: column; gap: 20px; }
.aside-note { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.aside-main > .table-wrap { border: 1px solid var(--table-rule); border-radius: var(--r-card); }
/* A matrix of choices (Setup -> Clearance; the notification defaults have the same look of their own,
   .ntf-defaults, which could move onto it): a row per thing, its name in the first column, a select per
   column -- centred in the row, each select as wide as its column and never narrower than its words. */
.data-table.choice-grid > tbody > tr > td { vertical-align: middle; }
.data-table.choice-grid select { width: 100%; min-width: max-content; }

/* "Soly also knows" (sknw, 2026-09-26, Rinat's design at its real size --
   the design images are about 1.4x): the list card's heading line (the
   shared 18px title, its line beside it, the hairline under it), then one
   row per fact of 48px, a hairline between: the label 14px/600 in a 190px
   column, the value (text, or grey chips and a soft "+N more"; "Not set"
   and "Not read" soft), the link on the right. */
.list-card > .sknw-rows { margin: 0; }
.sknw-row { display: grid; grid-template-columns: 190px minmax(0, 1fr) auto; align-items: center; gap: 16px;
  min-height: 48px; padding: 8px 24px; }
.sknw-row + .sknw-row { border-top: 1px solid var(--hairline); }
.sknw-row > dd { margin: 0; min-width: 0; }
.sknw-value .chips { align-items: center; gap: 6px; }
.sknw-value .chip { background: var(--neutral-tint); }
.sknw-soft { color: var(--secondary); white-space: nowrap; }
.sknw-link .card-link, .fwim-action .card-link { font-size: 14px; white-space: nowrap; }
@media (max-width: 720px) {
  .sknw-row { grid-template-columns: minmax(0, 1fr) auto; row-gap: 6px; padding: 12px 16px; }
  .sknw-value { grid-column: 1 / -1; grid-row: 2; }
}

/* risklist + rsettings (2026-09-26): the register's domain log under the settings form, in its column. */
.rset-layout > .rset-log, .rset-layout > details.list-card { grid-column: 1; }


/* dash_deferred (2026-09-26): the loading card of a slow dashboard tile --
   three violet dots in turn and one line of words, then three soft bars;
   still under prefers-reduced-motion. */
.dash-deferred { display: flex; flex-direction: column; gap: 14px; padding: 16px; }
.dash-deferred-head { display: flex; align-items: center; gap: 10px; }
.dash-deferred-mark { display: inline-flex; gap: 4px; flex: none; }
.dash-deferred-mark i { width: 6px; height: 6px; border-radius: 50%; background: var(--violet); opacity: .35;
  animation: dash-deferred-dot 1.2s infinite ease-in-out; }
.dash-deferred-mark i:nth-child(2) { animation-delay: .2s; }
.dash-deferred-mark i:nth-child(3) { animation-delay: .4s; }
.dash-deferred-text { font: 500 14px/1.4 var(--font-sans); color: var(--body); }
.dash-deferred-lines { display: flex; flex-direction: column; gap: 8px; }
.dash-deferred-lines i { display: block; height: 10px; border-radius: 2px; background: var(--canvas);
  background-image: linear-gradient(90deg, var(--canvas) 0%, var(--hairline) 50%, var(--canvas) 100%);
  background-size: 200% 100%; animation: dash-deferred-sheen 1.6s infinite linear; }
.dash-deferred-lines i:nth-child(1) { width: 72%; }
.dash-deferred-lines i:nth-child(2) { width: 58%; }
.dash-deferred-lines i:nth-child(3) { width: 40%; }
/* The height of the tile a loading card stands in for (core/dashboard.SIZES),
   so the page keeps its place when the tile arrives. */
.dash-deferred-stat { min-height: 72px; justify-content: center; }
.dash-deferred-banner { min-height: 120px; }
.dash-deferred-attention { min-height: 280px; }
.dash-deferred-card { min-height: 280px; }
.dash-deferred-chart { min-height: 300px; }
.dash-deferred-lead { min-height: 360px; }
.dash-deferred-table { min-height: 200px; }
.dash-deferred.failed .dash-deferred-mark, .dash-deferred.failed .dash-deferred-lines { display: none; }
.dash-deferred.failed .dash-deferred-text { color: var(--red-text); }
@keyframes dash-deferred-dot { 0%, 80%, 100% { opacity: .35; } 40% { opacity: 1; } }
@keyframes dash-deferred-sheen { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) {
  .dash-deferred-mark i, .dash-deferred-lines i { animation: none; }
  .dash-deferred-mark i:nth-child(2) { opacity: 1; }
}

/* access_page (2026-09-26, Rinat): Support access -- two cards side by side.
   Left the approval per access level (three rows with hairlines, a switch or
   a locked chip on the right, a grey foot band about the audit log); right the
   open requests and the active access, each a section with a count chip and
   a dashed empty box (icon tile, one line, one soft line). */
.sacc-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; align-items: start; }
.sacc-card { padding: 0; overflow: hidden; min-width: 0; }
.sacc-section { display: flex; flex-direction: column; gap: 12px; padding: 20px 24px; min-width: 0; }
.sacc-section + .sacc-section { border-top: 1px solid var(--hairline); }
.sacc-head { display: flex; flex-direction: column; gap: 4px; }
.sacc-sub, .cmap-cell-why { margin: 0; font: 400 14px/1.4 var(--font-sans); color: var(--body); }
.sacc-section-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 32px; }
.sacc-section-head h2 { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.sacc-count { flex: none; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center;
  min-width: 36px; height: 24px; padding: 0 8px; border: 1px solid var(--hairline); border-radius: var(--r-badge);
  background: var(--canvas); font: 600 12px/1 var(--font-mono); color: var(--ink); }
.sacc-levels { list-style: none; margin: 0; padding: 0; }
.sacc-level { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 72px; padding: 12px 0; }
.sacc-level + .sacc-level { border-top: 1px solid var(--hairline); }
.sacc-level-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.sacc-switch { margin: 0; flex: none; }
.sacc-switch .toggle-row { min-height: 32px; gap: 12px; font: 500 14px/1 var(--font-sans); color: var(--body);
  white-space: nowrap; cursor: pointer; }
.sacc-locked { flex: none; white-space: nowrap; display: inline-flex; align-items: center; gap: 8px; height: 32px;
  padding: 0 12px; border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--canvas);
  font: 600 13px/1 var(--font-sans); color: var(--ink); }
.sacc-foot { display: flex; align-items: center; gap: 10px; margin: 0; min-height: 44px; padding: 12px 24px;
  background: var(--canvas); border-top: 1px solid var(--hairline); font: 400 13px/1.4 var(--font-sans); color: var(--body); }
.sacc-foot .icon, .sacc-locked .icon { width: 16px; height: 16px; color: var(--secondary); }
.sacc-foot span { min-width: 0; }
.sacc-empty { display: flex; align-items: center; gap: 16px; padding: 20px; border: 1px dashed var(--rule);
  border-radius: var(--r-card); background: var(--canvas); }
.sacc-empty-tile { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); color: var(--secondary); }
.sacc-empty-tile .icon { width: 18px; height: 18px; }
.sacc-empty-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.sacc-empty-title, .sacc-level-name, .link-heading strong, .card.infra-card > .card-heading h2, .xf-progress-head h2 { line-height: 1.3; }
.sacc-reason { min-width: 0; }
.sacc-row-actions { display: inline-flex; gap: 8px; align-items: center; }
.sacc-card td form { margin: 0; }
.sacc-search { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.sacc-search .doc-entry { width: 240px; max-width: 100%; }
@media (max-width: 1100px) { .sacc-grid { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 480px) {
  .sacc-section { padding: 16px; }
  .sacc-foot { padding: 12px 16px; }
  .sacc-level { flex-wrap: wrap; }
}
/* ---- The dashboard's Leadership, Risks and Compliance rows (Rinat's
   design, 2026-09-26; templates/iso_k_leadership_card.html and
   templates/_dashboard_*.html). The shared parts carry the look -- the card
   and its heading line, .data-table with .cell-level and .cell-dot, the pill
   tones, .button.small, .card-link, .progress-bar -- and this block adds
   only what the dashboard alone has: the soft line under a card heading,
   the label/value rows, the big count with the level bar, the small tables
   with soft headers, the framework rows and the trend's line marks. ---- */
/* The rows: 14px between the cards (section 23), and a row that lost a
   tile (no OT, no frameworks) lets the rest take its width. */
.three-column.equal { gap: 14px; }
.two-column.equal > :only-child { grid-column: 1 / -1; }
.card > .dash-sub:last-child { margin-bottom: 0; }
/* Label/value rows parted by hairlines: the label soft on the left, the value in ink on the right. */
.dash-kv { display: flex; flex-direction: column; margin: 0; }
.dash-kv > div { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 44px;
  border-top: 1px solid var(--hairline); }
.dash-kv > div:first-child { border-top: 0; }
.dash-kv dt { line-height: 1.4; }
.dash-kv dd { flex: 1 1 auto; min-width: 0; margin: 0; text-align: right; font: 600 15px/1.4 var(--font-sans); color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dash-kv dd .card-link { font-size: 15px; }
/* A small table with soft headers: the risk levels, the follow-up. */
.dash-mini { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
.dash-mini th, .dash-mini td { padding: 0 0 0 12px; height: 36px; border: 0; border-top: 1px solid var(--hairline);
  text-align: left; vertical-align: middle; background: none; }
.dash-mini :is(th, td):first-child { padding-left: 0; }
.dash-mini thead th { height: 28px; border-top: 0; font: 500 13px/1.4 var(--font-sans); color: var(--secondary); white-space: nowrap; }
.dash-mini thead abbr { text-decoration: none; }
.dash-mini tbody th { font: 400 15px/1.4 var(--font-sans); color: var(--secondary); min-width: 0; }
.dash-mini tbody td { font: 400 15px/1.4 var(--font-sans); color: var(--secondary); white-space: nowrap; }
.dash-mini tr.is-on th, .dash-mini tr.is-on td { font-weight: 600; color: var(--ink); }
.dash-mini .cell-level { font: inherit; color: inherit; text-decoration: none; }
.dash-mini a.cell-level:hover { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
.dash-mini .cell-num { width: 56px; text-align: right; }
.dash-mini td.dash-delta { font-weight: 600; }
.dash-mini td.dash-delta:not(.worse):not(.better) { font-weight: 400; color: var(--secondary); }
.dash-mini td.dash-delta.worse { color: var(--red-text); }
.dash-mini td.dash-delta.better { color: var(--green-text); }
.pill.dash-count { display: inline-block; min-width: 32px; text-align: center; text-decoration: none; font-weight: 600; }
.dash-foot { margin: 10px 0 0; }
.dash-sub { margin: -6px 0 10px; }
.form-more-title, .tree-empty { margin: 0; }
.tree-empty { padding: 12px; }
/* The trend: a line as the legend's mark, the legend in 14px ink, the axes readable. */
.trend-legend .swatch.trend-line-mark { width: 16px; height: 2px; border-radius: 1px; }
[data-tile="risk_trend"] .trend-legend .legend-level { font-size: 14px; color: var(--ink); }
[data-tile="risk_trend"] .trend-legend .legend-level .mono { color: var(--secondary); }
[data-tile="risk_trend"] .trend-sub { margin: -6px 0 0; }
[data-tile="risk_trend"] .trend-axis { font-size: 11px; }
/* Compliance per framework: a row per framework, parted by hairlines. */
.dash-fw, .prop-row { display: flex; flex-direction: column; gap: 8px; padding: 12px 0; border-top: 1px solid var(--hairline); }
.card-heading + .dash-fw { padding-top: 0; border-top: 0; }
.dash-fw:last-child { padding-bottom: 0; }
.dash-fw-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 10px; margin: 0; min-width: 0; }
.dash-fw-name { color: var(--ink); }
.dash-fw-name:hover { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
.dash-fw-bar { display: flex; align-items: center; gap: 12px; }
.progress-bar.thin { display: block; flex: 1; height: 6px; border: 0; background: var(--skeleton); overflow: hidden; }
.progress-bar.thin i { display: block; height: 100%; }
.dash-fw-pct { flex: none; min-width: 44px; text-align: right; font: 600 14px/1.4 var(--font-sans); color: var(--ink); }
.dash-fw-pct.is-zero { font-weight: 400; color: var(--secondary); }
/* Registers at a glance (Rinat's design v9): the registers side by side,
   each its share ring over its name and total, its legend under that (a
   square, the name, the count), one per line. */
.distributions { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 20px; align-items: start; }
.distribution { display: flex; flex-direction: column; align-items: stretch; gap: 8px; min-width: 0; }
.distribution > .share-ring { align-self: center; }
.distribution-legend { display: grid; grid-template-columns: minmax(0, 1fr); gap: 6px; margin: 0; padding: 0;
  list-style: none; font: 400 14px/1.4 var(--font-sans); color: var(--ink); }
.distribution-legend li { display: flex; align-items: center; gap: 8px; min-width: 0; }
.distribution-legend i { flex: none; }
.distribution-name { display: block; flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.distribution-n { flex: none; font-weight: 600; font-variant-numeric: tabular-nums; }
.distribution-heading .card-link.subtle, .dash-frameworks .dash-fw-pct, .rep-decide-title { font: 600 15px/1.4 var(--font-sans); }
.distribution-gauge { height: 8px; }

/* The console's component page (templates/console/design_components.html,
   2026-09-26): one card per shared component, the samples in rows, the
   class under each sample in mono. */
.dsc-stack { display: flex; flex-direction: column; gap: 16px; }
.dsc-card { display: flex; flex-direction: column; gap: 10px; }
.dsc-card > .card-heading, .dsc-card > .card-sub { margin: 0; }
.dsc-classes { font: 400 12px/1.4 var(--font-mono); color: var(--secondary); background: none; border: 0; padding: 0; min-width: 0; }
.dsc-group { display: flex; flex-direction: column; gap: 8px; }
.dsc-group-title { margin: 0; font: 500 12px/1.4 var(--font-mono); letter-spacing: .08em; text-transform: uppercase; color: var(--secondary); }
.dsc-row { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 16px; }
.dsc-item { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; min-width: 0; }
.dsc-item > code { display: inline-flex; align-items: center; gap: 8px; font: 400 12px/1.4 var(--font-mono); color: var(--secondary); background: none; border: 0; padding: 0; }
.dsc-notices { display: flex; flex-direction: column; gap: 8px; }
.dsc-form { padding: 0; }
.dsc-notices .dsc-item, .dsc-notices .report { align-self: stretch; margin: 0; }

/* ================================================================
   Pills (2026-09-26): the one shared set for every status, state, count
   and label that stands beside a word. The risk list's status pill and
   the control page's status pill are the reference. A look changes here
   and nowhere else; the console's component page (/design/components/)
   shows every one of them. The last layer: a context may place a pill
   (margin, alignment) but never restyle it.

     .pill               26px, 13px/600, 2px radius, the neutral tint
     .pill.small         20px, 12px: in a chip, a tree row, the menu
     tones               .active-green  green: done, met, ok
                         .open          amber: waits, due soon, partial
                         .danger        red: wrong, overdue, missing
                         .planned       violet: in progress, proposed, the platform's own
                         .neutral       grey: identity, a kind, not applicable
                         .info          blue: a relation, data rather than a state
                         .source        amber: an integration's tag, its name as text
     .pill.code          a hairline outline, mono 12px: codes, versions, kinds
     .pill.level-<c>     the risk scale's fills, for a risk level only
                         (green, lightgreen, yellow, orange, red, darkred; grey)
     .pill .dot          a status dot in the pill's own colour
   ================================================================ */
.pill { display: inline-flex; align-items: center; gap: 4px; height: 26px; max-width: 100%; padding: 0 8px;
  border: 0; border-radius: var(--r-badge); background: var(--neutral-tint); color: var(--ink);
  font: 600 13px/1 var(--font-sans); white-space: nowrap; flex: none; text-decoration: none; box-sizing: border-box; }
.pill.mono { font-family: var(--font-mono); font-weight: 500; }
.pill.small { height: 20px; padding: 0 6px; gap: 3px; font-size: 12px; }
.pill .icon { width: 14px; height: 14px; flex: none; }
.pill.small .icon { width: 12px; height: 12px; }
a.pill:hover { text-decoration: underline; text-underline-offset: 2px; }
.pill.active-green { background: var(--green-tint); color: var(--green-text); }
/* .source: an integration's tag ("Veeam Backup", "via Veeam Backup"), one look for every connector (smallb) */
.pill.open, .pill.level-amber, .pill.source { background: var(--amber-tint); color: var(--amber-text); }   /* level-amber: a create form's waiting pill (crg) */
.pill.danger { background: var(--red-tint); color: var(--red-text); }
.pill.planned { background: var(--violet-tint); color: var(--violet-text); }
.pill.neutral, .pill.level-grey { background: var(--neutral-tint); color: var(--ink); }
.pill.info { background: var(--blue-tint); color: var(--blue-text); }
.pill.code { background: transparent; border: 1px solid var(--hairline); color: var(--ink); font: 500 12px/1 var(--font-mono); }
/* .count: a count with its word in a hairline box, 32px like the heading line ("9 changed"); .count.danger (in
   .infra-tile.tone-red's rule) the red tint for what is late, the word always there (FLOWS 7.299) */
.pill.count { height: 32px; padding: 0 12px; gap: 6px; background: transparent; border: 1px solid var(--hairline); font-size: 14px; font-weight: 400; }
.pill.count strong { font-weight: 600; }
/* A choice drawn as its pill (the trust centre's visibility, Rinat's design
   2026-09-28): a span.pill-select in a tone around the row's select; the
   select takes the tone's tint and text, 32px like every row select, the
   pill's 2px radius, its caret in the text's colour (a mask over
   currentColor, so both themes follow the tokens). */
.pill-select { position: relative; display: inline-flex; flex: none; vertical-align: top; color: var(--ink); }
.pill-select::after { content: ""; position: absolute; right: 8px; top: 50%; width: 14px; height: 14px; margin-top: -7px;
  background: currentColor; pointer-events: none;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") center / 14px 14px no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") center / 14px 14px no-repeat; }
.pill-select > select, .data-table .pill-select > select { height: 32px; min-height: 32px; margin: 0; padding: 0 28px 0 10px;
  border: 0; border-radius: var(--r-badge); background: var(--neutral-tint); background-image: none; color: inherit;
  font: 600 13px/32px var(--font-sans); white-space: nowrap; cursor: pointer; appearance: none; -webkit-appearance: none; }
.pill-select.tone-green { color: var(--green-text); }
.pill-select.tone-green > select { background-color: var(--green-tint); }
.pill-select.tone-amber { color: var(--amber-text); }
.pill-select.tone-amber > select { background-color: var(--amber-tint); }
.pill-select > select option { color: var(--ink); background: var(--card); }
.pill.level-green { background: var(--risk-1); color: var(--risk-text); }
.pill.level-lightgreen { background: var(--risk-2); color: var(--risk-text); }
.pill.level-yellow { background: var(--risk-3); color: var(--risk-text); }
.pill.level-orange { background: var(--risk-4); color: var(--risk-text); }
.pill.level-red { background: var(--risk-5); color: var(--risk-text); }
.pill.level-darkred { background: var(--risk-6); color: var(--risk-text-dark); }
.pill.level-opp1 { background: var(--opp-1); color: var(--risk-text); }
.pill.level-opp2 { background: var(--opp-2); color: var(--risk-text); }
.pill.level-opp3 { background: var(--opp-3); color: var(--risk-text); }
.pill.level-opp4 { background: var(--opp-4); color: var(--risk-text); }
/* A pill on the violet of a table header: a darker translucent badge, so
   white keeps 4.5:1. A tab's count is .tab-count, not a pill. */
.data-table thead .pill { background: rgba(0, 0, 0, .2); color: #fff; border-color: transparent; }
@media print {
  .pill { background: none !important; border: .5pt solid var(--hairline); color: var(--ink) !important; }
}

/* dash_fw rows (2026-09-26, Rinat's design): per framework one row under a
   hairline -- name over its counts on the left, a short bar and the
   percentage on the right; the row tints on hover. */
.dash-frameworks .dash-fw { display: grid; grid-template-columns: minmax(0, 1fr) 180px 56px; align-items: center; gap: 16px;
  padding: 14px 16px; margin: 0 -16px; border-top: 1px solid var(--hairline); color: var(--ink); text-decoration: none; }
.dash-frameworks .card-heading + .dash-fw { padding-top: 14px; border-top: 1px solid var(--hairline); }
.dash-frameworks .dash-fw:last-child { padding-bottom: 14px; }
.dash-frameworks .dash-fw:hover { background: var(--canvas); }
.dash-fw-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.dash-frameworks .dash-fw-name { font: 500 16px/1.4 var(--font-sans); color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dash-frameworks .dash-fw:hover .dash-fw-name { color: var(--ink); text-decoration: none; }
.dash-frameworks .progress-bar.thin { flex: none; width: 180px; height: 6px; border-radius: 3px; }
.dash-frameworks .dash-fw-pct { text-align: right; }
.dash-frameworks .dash-fw-pct.is-zero { font-weight: 400; color: var(--secondary); }
@media (max-width: 640px) { .dash-frameworks .dash-fw { grid-template-columns: minmax(0, 1fr) 96px 48px; } .dash-frameworks .progress-bar.thin { width: 96px; } }

/* One tab alone (2026-09-26): hidden before the script runs where the
   browser knows :has(); static/js/tabs.js does the same for the rest. */
.tabbar:not(:has(.tab ~ .tab)):not(:has([data-tab-menu])) { display: none; }

/* The tab bar and its menu take the cards' border colour (2026-09-26, Rinat:
   the hairline was too light next to the cards). */
.tabbar, .tab-menu { border-color: var(--rule); }

/* Soly drawer (2026-09-26): the Chats tab carries the way back ("< Chats")
   while a chat is open and it is the tab on screen: the chevron takes the
   place of its glyph; the separate back row is not shown in the drawer (its
   form stays for the scripts). */
.soly-drawer .soly-tabs .tab .tab-back-icon { display: none; }
.soly-drawer .soly-tabs .tab.is-back.active .tab-back-icon { display: inline-block; }
.soly-drawer .soly-tabs .tab.is-back.active .tab-glyph { display: none; }
.soly-drawer .soly-conv-head { display: none; }

/* Soly drawer (drawertop, 2026-10-04): the tab bar on a row of its own,
   16px in from the drawer's edges, 8px above and below, a hairline under
   it as under the head. */
.soly-tabs-row { padding: 8px 16px; border-bottom: 1px solid var(--hairline); flex: none; }

/* TPRM overview, Open cases (2026-09-26): count in red, the case over its
   next step, the suppliers as hairline chips (code grey, name ink), four
   and a "+ n more"; the empty cases in the foot after a green check. */
.tprm-case-table th.tprm-c-count, .tprm-case-table td.tprm-c-count { width: 96px; text-align: center; }
.tprm-case-table .tprm-c-case { width: 34%; }
.tprm-case-n { font: 600 18px/1 var(--font-sans); color: var(--red-text); font-variant-numeric: tabular-nums; }
.tprm-case-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.tprm-sup { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border: 1px solid var(--hairline);
  border-radius: var(--r-control); background: var(--card); font: 500 14px/1 var(--font-sans); color: var(--ink);
  text-decoration: none; white-space: nowrap; flex: none; }
.tprm-sup .mono { font-size: 13px; color: var(--secondary); }
.tprm-sup:hover { border-color: var(--violet); }
.tprm-more { font: 600 14px/1 var(--font-sans); color: var(--violet-text); text-decoration: none; white-space: nowrap; flex: none; padding: 0 4px; }
.tprm-more:hover { text-decoration: underline; text-underline-offset: 2px; }
.list-foot.tprm-clear { justify-content: flex-start; }
.tprm-clear-word { display: inline-flex; align-items: center; gap: 8px; font-weight: 600; color: var(--ink); flex: none; }
.tprm-clear-word .icon, .mock-url .icon { width: 16px; height: 16px; color: var(--green-text); }
.tprm-clear-list { min-width: 0; }

/* Integrations (/integrations/, Rinat's design 2026-09-26): a sticky filter
   column of 250px (search, All, Connected, the categories with their
   counts, the request), the cards by category on the right, three to a row
   on a wide screen. A card: the 40px white logo tile, the name 16/600 and
   the state pill; the description, the account line, the provider's own
   controls; a foot band with How it works on the left and the actions on
   the right. */
.intg-layout { display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 24px; align-items: start; }
.intg-side { position: sticky; top: 64px; display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.intg-filter-card { padding: 12px; display: flex; flex-direction: column; gap: 8px; }
.intg-side .rr-search { flex: none; min-width: 0; width: 100%; }
.intg-filters { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.intg-filters-categories { border-top: 1px solid var(--hairline); padding-top: 8px; }
.intg-filter { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%;
  min-height: 36px; padding: 6px 10px; border: 0; border-radius: var(--r-control); background: transparent;
  color: var(--ink); font: 500 14px/1.3 var(--font-sans); text-align: left; cursor: pointer; }
.intg-filter:hover { background: var(--canvas); }
.intg-filter-name { min-width: 0; }
.intg-filter[aria-current="true"] { background: var(--violet-tint); color: var(--violet-text); font-weight: 600; }
.intg-filter[aria-current="true"] .tab-count { background: var(--violet); color: #fff; }
.intg-request { width: 100%; justify-content: center; }
.intg-main { display: flex; flex-direction: column; gap: 28px; min-width: 0; container-type: inline-size; }
.intg-section { display: flex; flex-direction: column; gap: 12px; }
.intg-section-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 32px; }
.intg-section-heading .eyebrow { flex: none; white-space: nowrap; }
.intg-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; align-items: start; }
@container (min-width: 560px) { .intg-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@container (min-width: 860px) { .intg-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.intg-card, .cp-rows, .sck-group { display: flex; flex-direction: column; background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-control); }
.intg-card, .sck-group { min-width: 0; }
.intg-body { display: flex; flex-direction: column; gap: 10px; padding: 16px; min-width: 0; }
.intg-head { display: flex; align-items: center; gap: 12px; min-height: 40px; }
.intg-logo { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 40px; height: 40px;
  box-sizing: border-box; border: 1px solid var(--hairline); border-radius: var(--r-control); background: #fff; }
.intg-logo img { width: 22px; height: 22px; display: block; }
/* The tile stays white in both themes so every brand mark keeps its own colours; a protocol card's
   house glyph and a monogram keep the light theme's dark ink on it (docs/FLOWS.md 7.468). */
.intg-logo .icon { width: 22px; height: 22px; color: #464B63; }
.intg-mono { font: 600 12px/1 var(--font-mono); color: #2A2E45; letter-spacing: .02em; }
.intg-name { flex: 1; min-width: 0; margin: 0; font: 600 16px/1.3 var(--font-sans); color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; }
.intg-desc { margin: 0; font-size: 14px; line-height: 1.55; color: var(--body); }
.intg-meta { display: flex; flex-direction: column; gap: 4px; }
.intg-meta .card-sub { font-size: 13px; line-height: 1.5; }
.intg-field .link-text-mode { gap: 6px; }
.intg-feeds { width: 100%; border-collapse: separate; border-spacing: 0; border: 1px solid var(--hairline);
  border-radius: var(--r-control); font-size: 13px; }
.intg-feeds th, .intg-feeds td { padding: 8px 12px; border-top: 1px solid var(--hairline); text-align: left;
  vertical-align: middle; font-weight: 400; }
.intg-feeds tbody tr:first-child th, .intg-feeds tbody tr:first-child td { border-top: 0; }
.intg-feeds th[scope="row"] { color: var(--ink); }
.intg-feeds td { color: var(--secondary); }
/* the card holds its table at its own width (Rinat, 2026-10-04): name and last run wrap inside it,
   only the action column keeps to one line */
.intg-feeds th[scope="row"], .intg-feeds td:not(:last-child) { overflow-wrap: anywhere; }
.intg-feeds td:last-child { text-align: right; width: 1%; white-space: nowrap; }
.intg-feeds td:last-child:empty { padding: 0; }
.intg-feeds .ntf-inline { justify-content: flex-end; }
.intg-feeds .button.small { min-height: 28px; padding: 0 10px; font-size: 13px; }
.intg-how-panel .link-explanation { margin: 0; }
.intg-how-panel .link-function { margin-top: 8px; }
.intg-foot { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px;
  margin-top: auto; padding: 12px 16px; border-top: 1px solid var(--hairline); }
.intg-how { padding: 0; line-height: 1.4; }
.intg-how:hover { text-decoration: underline; text-underline-offset: 2px; }
.intg-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 6px; margin-left: auto; }
.intg-actions .ntf-inline { gap: 6px; }
.intg-foot .button { min-height: 32px; padding: 0 12px; font-size: 13px; white-space: nowrap; flex: none; }
.intg-empty { display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 8px 16px;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-control); color: var(--body); }
.intg-empty span { flex: 1; min-width: 0; }
/* A connection per domain (docs/FLOWS.md 7.80): the line that names whose
   connection an office uses, and the owner's switch on its own one. */
.intg-inherited { display: inline-flex; align-items: center; gap: 6px; color: var(--ink); min-width: 0; }
.intg-inherited .icon, .rdmp-links a .icon { width: 14px; height: 14px; flex: none; color: var(--secondary); }
.intg-share { margin: 0; }
/* What the last action on a card said, at the top of that card (portal._to_card). */
.intg-said { display: flex; align-items: flex-start; gap: 8px; padding: 8px 12px; border-radius: 4px; font-size: 13px; line-height: 1.45; }
.intg-said .icon { width: 16px; height: 16px; flex: none; margin-top: 1px; }
.intg-said span { min-width: 0; overflow-wrap: anywhere; }
.intg-said.success { background: var(--green-tint); color: var(--green-text); }
.intg-said.error { background: var(--red-tint); color: var(--red-text); }
.intg-said.note { background: var(--amber-tint); color: var(--amber-text); }   /* nothing failed, something to know (FLOWS 7.150) */
.intg-overlap-body { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.intg-overlap-steps { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 8px; }
.intg-share-row { min-height: 32px; gap: 8px; font: 500 13px/1.4 var(--font-sans); color: var(--ink); }
.intg-share-row > span { min-width: 0; }
@media (max-width: 900px) {
  .intg-layout { grid-template-columns: minmax(0, 1fr); }
  .intg-side { position: static; }
}

/* Reports board (templates/reports_board.html, Rinat's design 2026-09-26):
   the violet figure of the new reports, the Became card's grey chips, the
   title of a row at 16px, the status switch (a hairline box of 40px, the
   buttons 30px inside it, the chosen one on the violet tint with its count)
   and More filters (a 40px hairline button with a caret, the other filters
   in a panel under it). */
.cards-row.rpbd-stats, .cards-row.procl-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 1100px) { .cards-row.rpbd-stats, .cards-row.procl-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .cards-row.rpbd-stats, .cards-row.procl-stats { grid-template-columns: minmax(0, 1fr); } }
.stat-value.violet { color: var(--violet-text); }
.card.stat > .rpbd-became { flex-direction: row; flex-wrap: wrap; gap: 6px; margin-top: 2px; }
.rpbd-table .rr-title { font-size: 16px; }
.rpbd-status { display: inline-flex; align-items: center; gap: 4px; height: 40px; padding: 4px; box-sizing: border-box; flex: none;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.rpbd-status-button { display: inline-flex; align-items: center; gap: 8px; height: 30px; padding: 0 12px; border: 0; flex: none;
  border-radius: var(--r-control); background: transparent; font: 600 14px/1 var(--font-sans); color: var(--ink); white-space: nowrap; cursor: pointer; }
.rpbd-status-button:hover { background: var(--canvas); }
.rpbd-status-button.active { background: var(--violet-tint); color: var(--violet-text); }
.rpbd-status-count { font-weight: 500; line-height: 1; }
.rpbd-status-button.active .rpbd-status-count { color: var(--violet-text); }
/* The More filters panel may reach past a short list: the card lets it out,
   the foot band keeps the card's rounded bottom. */
section.card.list-card.rpbd-list, section.card.list-card.ardy-gaps-card { overflow: visible; }
.rpbd-list > .list-foot, .ardy-gaps-card > .list-foot { border-radius: 0 0 var(--r-card) var(--r-card); }
.rpbd-more, .ardy-more { position: relative; flex: none; }
.rpbd-more-button { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 12px 0 14px; box-sizing: border-box;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); list-style: none; cursor: pointer;
  font: 600 14px/1 var(--font-sans); color: var(--ink); white-space: nowrap; }
.rpbd-more-button::-webkit-details-marker { display: none; }
.rpbd-more-button .icon { width: 16px; height: 16px; flex: none; }
.rpbd-more-button:hover { border-color: var(--rule); }
/* an active outlined step or toggle: violet line, violet text on its tint (one rule: the reports board's More button,
   an OT change's step; it stood in ot.css with the plain violet on the tint, the OT quality review of 2026-10-23) */
.rpbd-more-button.active, .ote-step.active { border-color: var(--violet); color: var(--violet-text); background: var(--violet-tint); }
.rpbd-status-button:focus-visible, .rpbd-more-button:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.rpbd-more-panel, .ardy-more-panel { left: auto; right: 0; gap: 8px; padding: 12px; min-width: 240px; }
@media (max-width: 720px) { .rpbd-more-panel, .ardy-more-panel { left: 0; right: auto; } }
.rpbd-more-panel select.rr-filter, .ardy-more-panel select.rr-filter { width: 100%; max-width: none; }
.rpbd-show-all { border: 0; background: none; padding: 0; cursor: pointer; font: 600 14px/20px var(--font-sans); }

/* The framework library on the Available tab (templates/frameworks.html and
   _framework_library_card.html, 2026-09-26, Rinat's design): per library
   group one list card, 16px apart -- the group 20px/600 with the mono
   eyebrow of its counts -- and its table edge to edge. Five columns: the
   badge (the framework's 64px logo), the name, the scope (the one growing
   column; it wraps whole words), the version in mono, and the status in a
   fixed width on the right, so an Add or Request access never wraps and
   never changes size with the scope's length. Rows about 96px: the badge and
   15px above and below it. */
.fwl-cards { display: flex; flex-direction: column; gap: 16px; }
.fwl-card .list-head-title h2, .fwown-card .list-head-title h2 { font: 600 20px/1.3 var(--font-sans); }
.fwl-card .list-head-title .fwl-eyebrow { flex: none; margin: 0; white-space: nowrap; color: var(--secondary); }
.data-table.fwl-table { table-layout: fixed; min-width: 760px; }
.fwl-table col.fwl-c-badge { width: 100px; }
.fwl-table col.fwl-c-name { width: 260px; }
.fwl-table col.fwl-c-version { width: 96px; }
.fwl-table col.fwl-c-status { width: 204px; }   /* 180px of status and the card's 24px inset */
.data-table.fwl-table > tbody > tr > td { vertical-align: middle; }
.fwl-table td.fwl-badge { line-height: 0; }
.fwl-table td.fwl-badge .fw-mark { width: 64px; height: 64px; object-fit: contain; }
.fwl-table td.fwl-name { min-width: 0; }
.fwl-name-text { overflow-wrap: normal; }
.fwl-line { display: flex; align-items: center; gap: 8px; margin-top: 6px; min-width: 0; }
.fwl-line .pill { flex: none; white-space: nowrap; }
.fwl-note { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 400 12px/1.4 var(--font-sans); color: var(--body); }
.fwl-table td.fwl-scope { min-width: 0; font: 400 15px/22px var(--font-sans); color: var(--secondary);
  white-space: normal; overflow-wrap: normal; word-break: normal; hyphens: none; }
.fwl-table td.fwl-version { white-space: nowrap; }
.fwl-table td.fwl-status { text-align: right; white-space: nowrap; }
.fwl-status .fwl-form { display: inline-flex; margin: 0; }
.fwl-status .button.small.fwl-action { display: inline-flex; align-items: center; justify-content: center; height: 32px; min-height: 32px;
  padding: 0 14px; font: 600 13px/1 var(--font-sans); white-space: nowrap; flex: none; border-radius: var(--r-control);
  background: var(--card); color: var(--ink); border: 1px solid var(--hairline); text-decoration: none; }
.fwl-status .button.small.fwl-action:hover { background: var(--canvas); border-color: var(--body); }
.fwl-added { display: inline-flex; align-items: center; gap: 6px; font: 600 14px/20px var(--font-sans); color: var(--green-text); white-space: nowrap; }
.fwl-added .icon { width: 18px; height: 18px; flex: none; }
.fwl-state { display: inline-flex; flex-direction: column; align-items: flex-end; gap: 4px; }
.fwl-state .pill, .fwl-status > .pill { white-space: nowrap; flex: none; }
.fwl-when { font: 400 12px/1.4 var(--font-mono); color: var(--secondary); white-space: nowrap; }
.list-card > .fwl-empty { display: flex; align-items: center; gap: 12px; min-height: 56px; padding: 10px 24px; margin: 0; }
.fwl-empty-text { min-width: 0; color: var(--body); }
.fwl-empty .button { flex: none; white-space: nowrap; }

/* The audit page flow (auditwp2, 2026-09-27; docs/FLOWS.md 7.82): the
   tabs Plan, Fieldwork, Findings, Report (templates/audit_detail.html and
   its _audit_* partials). A panel stacks its cards 16px apart; the
   Fieldwork list and an opened row's side panel stand in the create
   design's two columns (.rcr), the panel wider and scrolling inside
   itself on a wide screen, under the list on a narrow one. The rest is
   the shared list, form and create classes. */
.tab-panel.aflow-panel:not([hidden]) { display: flex; flex-direction: column; gap: 16px; }
.rcr.aflow-work { grid-template-columns: minmax(0, 1fr) 480px; }
.aflow-side { max-height: calc(100vh - 32px); overflow-y: auto; }
.aflow-side > .card { flex: none; }
.rcr.aflow-work .aflow-open-col { display: none; }
.aflow-checks { display: flex; flex-wrap: wrap; gap: 8px 16px; }
.aflow-read { display: block; min-height: 32px; line-height: 32px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.aflow-requirement { margin: 0; line-height: 1.5; color: var(--body); }
.aflow-steps { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
.aflow-steps > li { display: flex; align-items: center; gap: 8px; min-width: 0; }
.aflow-steps > li > .doc-entry { flex: 1 1 auto; min-width: 0; }
.aflow-side-actions { display: flex; align-items: center; gap: 8px; flex: none; }
.aflow-refs { display: flex; flex-direction: column; gap: 8px; }
form.aflow-inline { display: inline; }
.aflow-ref-add-row { display: flex; justify-content: flex-end; margin-top: 8px; }
.aflow-missing { margin-right: auto; min-width: 0; }
/* The audit programme's Programme tab (templates/_aprog_programme.html and
   _aprog_programme_side.html, Rinat's design of 2026-09-28, FLOWS 7.130):
   the create design's two columns, the form card with the audits and
   History on the left, Approval and Completeness on the right; with
   another tab of the page the right column goes. Criteria and Methods are
   one bordered box of checkboxes, three to a row with a hairline between
   the rows, a framework's version in mono on the right of its cell. */
.rcr.aprog-layout { grid-template-columns: minmax(0, 1fr) 300px; }
.aprog-main { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.aprog-layout:has(> .aprog-main > [data-panel="programme"][hidden]) { grid-template-columns: minmax(0, 1fr); }
.aprog-layout:has(> .aprog-main > [data-panel="programme"][hidden]) > .aprog-side { display: none; }
.aprog-side .button.aprog-wide { width: 100%; }
.aprog-side .rcr-check > .card-link { margin-left: auto; flex: none; white-space: nowrap; }
.aprog-check-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; white-space: nowrap; }
.aprog-checks { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); }
.aprog-check { display: flex; align-items: center; gap: 10px; min-height: 40px; padding: 0 12px; min-width: 0; cursor: pointer; font-size: 14px; color: var(--ink); }
.aprog-check:nth-child(n+4) { border-top: 1px solid var(--hairline); }
.aprog-check input { width: 16px; height: 16px; margin: 0; flex: none; }
.aprog-check-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.aprog-check-version { margin-left: auto; flex: none; white-space: nowrap; font: 400 12px/1 var(--font-mono); color: var(--secondary); }
.empty-row.aprog-empty { min-height: 52px; padding: 0 16px; border: 1px dashed var(--field-rule); border-radius: var(--r-control); }
.aprog-empty > .card-link { margin-left: auto; flex: none; white-space: nowrap; }
@media (max-width: 1100px) { .rcr.aprog-layout { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 720px) {
  .aprog-checks { grid-template-columns: minmax(0, 1fr); }
  .aprog-check:nth-child(n+2) { border-top: 1px solid var(--hairline); }
}
/* One audit's page in Rinat's designs of 2026-09-28 (templates/audit_detail.html
   and its tabs, FLOWS 7.137). Plan and Report stand in two columns: the form
   card on the left, 300px of side cards (Scope, Completeness, Independence;
   Approval, Still needed) on the right. The heading line of a form card holds
   the title, the status pill and the kind in one row. A word in its tone
   (.aflow-word): a round dot before it for a control's status, a square in the
   class's colour for a finding (the words then in ink), bare for a result.
   The team is a bordered list of people: the avatar, the name with the role
   under it, the statement, the check in words, x. The row panel of the
   Fieldwork is one card of 480px beside the list; its sections are hairline
   separated and its folds read like the History card. */
.tab-panel.aflow-panel.aplan-layout:not([hidden]) { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 16px; align-items: start; }
.tab-panel.aflow-panel.aplan-layout > * { min-width: 0; }
.aplan-title-row { display: flex; align-items: center; gap: 12px; min-width: 0; flex-wrap: wrap; }
.aplan-title-row > .pill { flex: none; }
.aflow-cap { display: inline-block; }
.aflow-cap::first-letter { text-transform: uppercase; }
.aflow-word { --tone: var(--secondary); display: inline-flex; align-items: center; gap: 8px; flex: none; white-space: nowrap; font: 600 14px/1.3 var(--font-sans); color: var(--tone-text, var(--secondary)); }
.aflow-word.tone-green { --tone: var(--green); --tone-text: var(--green-text); }
.aflow-word.tone-violet { --tone: var(--violet); --tone-text: var(--violet-text); }
.aflow-word.tone-amber { --tone: var(--amber); --tone-text: var(--amber-text); }
.aflow-word.tone-red { --tone: var(--red); --tone-text: var(--red-text); }
.aflow-word.tone-blue { --tone: var(--blue); --tone-text: var(--blue-text); }
.aflow-word.tone-grey { --tone: var(--secondary); --tone-text: var(--secondary); }
.aflow-word.tone-soft { font-weight: 400; color: var(--secondary); }
.aflow-word.dotted::before, .aflow-word.square::before { content: ""; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--tone); }
.aflow-word.square { color: var(--ink); font-weight: 400; font-size: 15px; }
.aflow-word.square::before { width: 10px; height: 10px; border-radius: 2px; }
.aprog-checks.cols-4 { grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); overflow: hidden; }
.aprog-checks.cols-4 > .aprog-check { border-top: 0; border-bottom: 1px solid var(--hairline); margin-bottom: -1px; }
.aplan-range { display: flex; align-items: center; gap: 12px; max-width: 620px; }
.aplan-range > .doc-entry { flex: 1 1 0; min-width: 0; }
.aplan-range-dash { flex: none; color: var(--secondary); }
.aplan-people { border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); }
.aplan-person { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1.2fr) 110px 28px; align-items: center; gap: 16px; min-height: 64px; padding: 8px 16px; }
.aplan-person[hidden], [data-aplan-empty][hidden], [data-aplan-confirm][hidden], .aplan-confirm[hidden] { display: none; }
.aplan-person + .aplan-person:not([hidden]) { border-top: 1px solid var(--hairline); }
.aplan-who { display: flex; align-items: center; gap: 12px; min-width: 0; }
.avatar.aplan-avatar { width: 32px; height: 32px; flex: none; font: 600 12px/1 var(--font-sans); }
.aplan-who-text { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; min-width: 0; }
.aplan-role, .aplan-role-select { font: 400 13px/1.3 var(--font-sans); color: var(--secondary); }
.aplan-role-select { max-width: 100%; padding: 0 16px 0 0; border: 0; background-color: transparent; cursor: pointer; }
.aplan-check-text { min-width: 0; font-size: 13px; color: var(--body); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.button.small.aplan-x { width: 28px; padding: 0; justify-content: center; }
.aplan-agenda { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; min-width: 0; }
.aplan-agenda > .table-wrap { align-self: stretch; }
.data-table.aflow-agenda { table-layout: fixed; width: 100%; }
.data-table.aflow-agenda > thead > tr > th { white-space: normal; line-height: 1.25; }
.aflow-agenda .doc-entry { width: 100%; min-width: 0; }
.aflow-agenda th:nth-child(1) { width: 20%; } .aflow-agenda th:nth-child(2) { width: 13%; } .aflow-agenda th:last-child { width: 56px; }
.aplan-controls { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.aplan-controls li { display: flex; align-items: baseline; gap: 12px; min-width: 0; font-size: 14px; color: var(--ink); }
.aplan-controls .aflow-code { flex: none; min-width: 48px; }
.aflow-code { font: 500 13px/20px var(--font-mono); color: var(--violet-text); text-decoration: none; white-space: nowrap; }
.aflow-code:hover { text-decoration: underline; }
.afw-table .aflow-code { display: block; }
.aplan-control-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.aplan-framework > div { display: flex; flex-direction: column; gap: 2px; }
.aplan-framework dt { font-size: 13px; color: var(--secondary); }
.aplan-fw-version { font-weight: 400; font-size: 13px; color: var(--secondary); }
.aplan-start { display: flex; flex-direction: column; gap: 10px; }
.aplan-confirm-host { display: inline-flex; align-items: center; gap: 8px; margin-right: auto; min-width: 0; }
.aplan-danger-link { padding: 0; border: 0; background: none; cursor: pointer; font: 600 14px/1.3 var(--font-sans); color: var(--red-text); white-space: nowrap; }
.aplan-danger-link:hover { text-decoration: underline; }
.aplan-confirm { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; font-size: 13px; color: var(--ink); }
.aplan-confirm > .doc-entry { width: 240px; }
.aplan-confirm.aplan-confirm-stack { display: flex; flex-direction: column; align-items: stretch; }
.aplan-confirm-row { display: flex; justify-content: flex-end; gap: 8px; }
.segment.rset-segment.cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.segment.rset-segment.cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.segment.rset-segment.aplan-segment { max-width: 840px; height: 56px; }
.afw-table .afw-evidence { color: var(--body); }
.afw-table tr.is-open > td:first-child { box-shadow: inset 3px 0 0 var(--violet); }
.afw-panel { padding: 0; }
.afw-panel .rcr-heading-text { flex: 1 1 0; }
.afw-panel .list-head h2 .aflow-code { margin-right: 6px; font-size: 15px; }
.afw-panel-lead { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 0; font-size: 14px; }
.afw-sep, .afw-soft { color: var(--secondary); }
.afw-sec { display: flex; flex-direction: column; gap: 10px; padding: 16px; border-bottom: 1px solid var(--hairline); }
.afw-label { font-size: 13px; color: var(--secondary); }
.afw-other { display: flex; align-items: center; justify-content: flex-end; gap: 8px; font-size: 13px; color: var(--secondary); }
.afw-other .doc-entry { width: auto; }
.afw-fold { border-bottom: 1px solid var(--hairline); }
.afw-fold > summary { display: flex; align-items: center; gap: 12px; min-height: 56px; padding: 0 16px; list-style: none; cursor: pointer; }
.afw-fold > summary::-webkit-details-marker { display: none; }
.afw-fold > summary:hover { background: var(--violet-tint); }
.afw-fold[open] > summary .form-more-chevron { transform: rotate(90deg); }
.afw-fold-name { flex: 1 1 auto; min-width: 0; margin: 0; font: 600 15px/1.3 var(--font-sans); color: var(--ink); }   /* a span, or the fold's h3 (FLOWS 7.373) */
.afw-fold-state { flex: none; max-width: 55%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; color: var(--secondary); }
.afw-fold > :not(summary) { margin: 0 16px 16px; }
.afw-fold > .form-fold-all { display: block; }
.card-actions.afw-panel-foot { justify-content: space-between; padding: 12px 16px; }
/* A pre-assessment's control drawer (templates/_pre_audit_panel.html, Rinat's
   design "control_drawer_4a" of 2026-10-17, FLOWS 7.373), on the row panel's
   card, sections and folds above and the shared heading line, figures, pills
   and step list: the codes in mono violet; the checks two to a row with a
   glyph each; a card per source or request with its chips, its quotes behind
   a left rule and a grey note; label/value rows (For/Period/From,
   Condition/Cause/Effect); the decision's foot sticky at the bottom. */
.prp-gap-text { margin: 0; font-size: 15px; line-height: 1.55; color: var(--ink); }
.prp-code-link { font: 500 0.95em/1 var(--font-mono); color: var(--violet-text); text-decoration: none; white-space: nowrap; }
a.prp-code-link:hover { text-decoration: underline; text-underline-offset: 2px; }
.prp-checks { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 16px; margin: 0; padding: 0; list-style: none; }
.prp-glyph { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; flex: none; font: 600 14px/1 var(--font-sans); }
.prp-glyph .icon { width: 16px; height: 16px; }
.prp-glyph.is-ok { color: var(--green-text); }
.prp-glyph.is-no { color: var(--red-text); }
.prp-glyph.is-part { color: var(--amber-text); }
.prp-glyph.is-unknown { color: var(--secondary); }
.prp-check-text { min-width: 0; }
.prp-sec-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 10px; }
.prp-source { display: flex; flex-direction: column; gap: 8px; padding: 14px 16px; border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.prp-source-head { display: flex; align-items: baseline; gap: 8px; min-width: 0; font-size: 15px; }
.prp-source-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; color: var(--ink); }
.prp-chips { gap: 6px; }
.prp-quote { margin: 0; padding: 2px 0 2px 14px; border-left: 3px solid var(--hairline); font-size: 14px; line-height: 1.55; color: var(--body); }
.prp-rows { display: flex; flex-direction: column; gap: 6px; margin: 0; }
.prp-rows > div { display: grid; grid-template-columns: 76px minmax(0, 1fr); gap: 12px; font-size: 14px; line-height: 1.4; }
.prp-rows dt { color: var(--secondary); }
.prp-rows dd { margin: 0; min-width: 0; color: var(--ink); }
.prp-finding-rows > div { grid-template-columns: 96px minmax(0, 1fr); }
.prp-card .card-actions.prp-foot { position: sticky; bottom: 0; z-index: 1; margin: 0; background: var(--card); }
/* scomp (FLOWS 7.376): Make this control compliant, right-aligned under the steps (the spot of 7.373) */
.prp-comply { align-self: flex-end; margin: 0; }
/* the panel's save said in the foot, beside Save, without a page reload
   (docs/FLOWS.md 7.148): "Saved · 12:04" fades after a while; a refusal stays, in red */
.afw-save-state { margin-left: auto; font: 400 12px/1.4 var(--font-sans); color: var(--secondary); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; min-width: 0; transition: opacity .6s; }
.afw-save-state.is-bad { color: var(--red-text); white-space: normal; }
.afw-save-state.is-gone { opacity: 0; }
@media (max-width: 1100px) {
  .tab-panel.aflow-panel.aplan-layout:not([hidden]) { grid-template-columns: minmax(0, 1fr); }
  .aplan-person { grid-template-columns: minmax(0, 1fr) 28px; }
  .aplan-person > .doc-entry, .aplan-person > .aplan-check-text { grid-column: 1 / -1; }
}
@media (max-width: 720px) {
  .aplan-range { max-width: none; }
}
@media (max-width: 1100px) {
  .rcr.aflow-work { grid-template-columns: minmax(0, 1fr); }
  .aflow-side { max-height: none; overflow: visible; }
}

/* Audit programme -> Readiness (templates/audit_readiness.html, Rinat's
   design of 2026-09-28, FLOWS 7.135): two stat cards, the numbers in mono;
   the tables' words in their tone (.cell-word), a name or a gap on one line
   with its mono code and, for a gap, its title truncating; blockers red
   above 0 and grey at 0; the Auditor pack's tick beside the violet button;
   the gap list's filters on the right of its heading line (the search,
   three selects and More filters as a violet text link over the list's
   other filters); Create action a violet text button per row. */
.ardy-stats .stat-value.mono { font-family: var(--font-mono); }
.ardy-stats .ardy-nc-rule { column-gap: 6px; }
a.ardy-stat-link { text-decoration: none; }
a.ardy-stat-link:hover { color: var(--violet-text); text-decoration: underline; text-underline-offset: 2px; }
.ardy-line { display: flex; align-items: baseline; gap: 10px; min-width: 0; }
.ardy-line > .cell-title { min-width: 0; flex: none; white-space: nowrap; }
.ardy-line > .cell-code-sub { flex: none; }
.ardy-table td.ardy-grow { width: 100%; }
.ardy-gap-title { min-width: 0; max-width: 520px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--body); }
.ardy-soft { color: var(--secondary); white-space: nowrap; }
.data-table td.ardy-red, .ardy-red { color: var(--red-text); }
.data-table td.ardy-zero { color: var(--secondary); }
.tick-mark.ardy-tick { gap: 8px; font-size: 14px; white-space: nowrap; flex: none; cursor: pointer; }
.ardy-tick input { width: 16px; height: 16px; margin: 0; }
.list-head > .filter-bar.list-filters.ardy-head-filters { flex: 1 1 auto; flex-wrap: nowrap; min-width: 0; padding: 0; border-bottom: 0;
  justify-content: flex-end; }
.ardy-head-filters .list-search { flex: 0 1 300px; }
@media (max-width: 1100px) { .list-head > .filter-bar.list-filters.ardy-head-filters { flex-wrap: wrap; justify-content: flex-start; } }
.ardy-more-link { display: inline-flex; align-items: center; height: 40px; padding: 0 4px; list-style: none; cursor: pointer;
  font-weight: 600; font-size: 14px; color: var(--violet-text); white-space: nowrap; }
.ardy-more-link::-webkit-details-marker { display: none; }
.ardy-more-link:hover, .ardy-more-link.active { text-decoration: underline; text-underline-offset: 2px; }
.ardy-action-form { display: inline; margin: 0; }
button.ardy-action { border: 0; background: none; padding: 0; cursor: pointer; white-space: nowrap;
  font-weight: 600; font-size: 14px; line-height: 20px; color: var(--violet-text); }
button.ardy-action:hover { text-decoration: underline; text-underline-offset: 2px; }

/* ================================================================
   The business capability map (templates/capability_map.html, docs/FLOWS.md 7.153):
   the Heatmap tab is one card (Rinat's design, 2026-09-29): the heading with
   its line under it and the four heat words on the right as 40px hairline
   chips (a square in the heat's colour, the word, the count) that filter the
   cards and the table; the domains as three columns of capability cards
   (code and heat pill, the name, why in words); the same as a table. The
   three ways to start as rows of one card.
   ================================================================ */
.cmap-heat-title { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cmap-chips { flex-wrap: wrap; gap: 8px; flex: 0 1 auto; }
.cmap-chips .mono { color: var(--secondary); }
.cmap-sq[data-heat="attention"] { background: var(--red); }
.cmap-sq[data-heat="watch"] { background: var(--amber); }
.cmap-sq[data-heat="in_order"] { background: var(--green); }
.cmap-sq[data-heat="unknown"] { background: var(--disabled); }
.cmap-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px 24px; align-items: start; }
.cmap-col { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.cmap-domain { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.cmap-domain, .cmap-start-text h3, .trace-section h3 { margin: 0; font: 600 14px/20px var(--font-sans); color: var(--ink); letter-spacing: 0; }
.cmap-heat .cmap-domain { font-size: 15px; }
.cmap-domain a { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); text-decoration: none; }
.cmap-cell { display: flex; flex-direction: column; gap: 6px; padding: 16px; border: 1px solid var(--hairline);
  border-radius: var(--r-control); background: var(--card); color: var(--ink); text-decoration: none; min-width: 0; }
.cmap-cell:hover { background: var(--violet-tint); }
.cmap-cell-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.cmap-cell-code { font-size: 12px; color: var(--secondary); white-space: nowrap; flex: none; }
.cmap-heat:has([data-filter-chip="attention"][aria-pressed="true"]) .cmap-cell:not([data-heat="attention"]),
.cmap-heat:has([data-filter-chip="watch"][aria-pressed="true"]) .cmap-cell:not([data-heat="watch"]),
.cmap-heat:has([data-filter-chip="in_order"][aria-pressed="true"]) .cmap-cell:not([data-heat="in_order"]),
.cmap-heat:has([data-filter-chip="unknown"][aria-pressed="true"]) .cmap-cell:not([data-heat="unknown"]) { display: none; }
.cmap-heat-table td.cmap-zero { color: var(--secondary); }
.cmap-none { color: var(--red-text); white-space: nowrap; }
@media (max-width: 900px) { .cmap-grid { grid-template-columns: minmax(0, 1fr); } }
.cmap-starts { display: flex; flex-direction: column; gap: 8px; }
.cmap-start { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 8px 0; border-top: 1px solid var(--hairline); }
.cmap-start:first-child { border-top: 0; }
.cmap-start-text { flex: 1; min-width: 240px; }
.cmap-start .doc-entry { width: auto; min-width: 200px; }
.cmap-start .cmap-start-drop { flex: 1 1 100%; }
.cmap-reason { flex: 1; min-width: 260px; }
/* The chain, both ways (attrtrace, docs/FLOWS.md 7.172): the control's why and
   what breaks without it, the capability's chain down to the evidence -- lines,
   a hairline between the sections, the gaps as amber pills with their words.
   The sections with a hairline between also part the evidence requests of a
   control's On record (FLOWS 7.387), each its line and its label rows. */
.trace-section { display: grid; gap: 10px; min-width: 0; }
.trace-section + .trace-section { border-top: 1px solid var(--hairline); padding-top: 14px; margin-top: 4px; }
.trace-lines, .trace-sub { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; min-width: 0; }
.trace-sub { padding-left: 24px; }
.trace-line { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; font-size: 14px; line-height: 20px; color: var(--ink); }
.trace-line > .pill, .trace-line > span:first-child { flex: none; white-space: nowrap; }
.trace-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); }
.cat-table .doc-entry { width: 100%; min-width: 120px; }

/* The trust centre's Publication tab (templates/trust_page.html, docs/FLOWS.md
   7.29, Rinat's design 2026-09-28): two list cards with zebra tables. A
   download count above zero in ink 600 (none in the mono grey); the purpose
   as plain text that opens its one-field form, the form a row of the field
   and its small Save 8px under it. */
.tpub-count { font-weight: 600; color: var(--ink); }
.tpub-note { display: block; font: 400 14px/20px var(--font-sans); color: var(--ink); text-align: left; }
.tpub-note-form { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.tpub-note-form[hidden] { display: none; }
.tpub-note-form .doc-entry { flex: 1 1 200px; min-width: 0; }
.tpub-purpose { min-width: 220px; }
.tpub-kind::first-letter { text-transform: uppercase; }   /* the kind word as a column value: Policy, not policy */

/* A supplier review (templates/questionnaire_response.html, docs/FLOWS.md
   7.131 point 10, reviewpage 2026-09-28, Rinat's two designs): the party
   and the state as dots with their words in the heading line; list cards
   16px apart in the tabs; the Questions card's sections (follow-ups, the
   documents asked for, the verdict) each under a hairline; the answer as a
   segmented Yes | No | N/A (the shared segment track), the explanation
   across its column; Approve, Edit, Reject as 32px hairline buttons on the
   right of a proposal's row. */
.tab-panel.rvp-panel:not([hidden]) { gap: 16px; }
.rvp-body { display: flex; flex-direction: column; gap: 10px; }
.rvp-card > .form-section { border-top: 1px solid var(--hairline); }
.rvp-explain { width: 100%; min-width: 160px; }
.rvp-text-answer { min-width: 220px; }
.rvp-text-read { white-space: normal; }
.rvp-decide { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }
.data-table .rvp-decide .button { min-height: 32px; }
.rvp-remove { flex-wrap: wrap; }
.rvp-remove .doc-entry { flex: 1; min-width: 260px; }

/* Evidence (evidview 2026-09-28, Rinat's design; templates/evidence.html,
   evidence_detail.html, _evidence_state.html). The list: the evidence's
   title with its glyph on one line (ellipsis), the reach under it in violet,
   the validity as the date and its pill on one line with Change date under
   it, and the row's 40px hairline button on the right (it shares the
   list-add rule above). The evidence page: the facts in four columns under
   the heading's hairline, and the bands Replace file and Link to a control
   open under the heading -- the grey band of the members card
   (.list-card > .dm-add) in the light violet. */
.evv-title { display: flex; align-items: center; gap: 8px; min-width: 0; max-width: 520px; }
.evv-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.evv-reach { white-space: nowrap; }
.evv-valid { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.evv-valid-line { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; }
.evv-valid .evv-date-form { display: inline-flex; align-items: center; gap: 8px; margin-top: 4px; }
.evv-valid .evv-date-form[hidden] { display: none; }
button.card-link.evv-change { font-size: 13px; }
.data-table td.evv-actions { width: 1%; text-align: right; white-space: nowrap; }
.evv-remove { display: inline-flex; margin: 0; }
.evv-h1 { min-width: 0; overflow-wrap: anywhere; }
.list-card > .dm-add.evv-band { background: var(--violet-tint); }
.list-card > .list-body > .evv-note { margin: 0 0 16px; color: var(--ink); font-size: 14px; line-height: 20px; }
.evv-facts { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; align-items: start; margin: 0; }
.evv-fact { min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.evv-fact dd { margin: 0; min-width: 0; }
@media (max-width: 1024px) { .evv-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .evv-facts { grid-template-columns: minmax(0, 1fr); } }

/* ---- auditprep (docs/FLOWS.md 7.165): the role in the organisation in the member panel, the preparation plan's request rows ---- */
/* The one list of responsibilities on Settings -> Resources (respons,
   docs/FLOWS.md 7.169) as a table in Rinat's design (respcard, 2026-09-29):
   a light grey head (the form card's inner table, not the violet data
   table), Responsibility | Assigned to | the trash; the name a field that
   reads as text until it is hovered or focused; the holders as chips with
   the tinted initials avatar, the round dashed + or the dashed "+ Assign";
   the people popover (the people picker's .pp-pop with a note under a
   hairline); under the table the New responsibility field and + Add. */
.resp-body { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.resp-body .resp-table-wrap { border-color: var(--hairline); }
.resp-table { width: 100%; border-collapse: collapse; table-layout: fixed; }
.resp-table thead th { height: 40px; padding: 0 16px; background: var(--table-head); color: var(--body); text-align: left;
  font: 600 13px/1.3 var(--font-sans); white-space: nowrap; border-bottom: 1px solid var(--hairline); }
.resp-table thead th:first-child { width: 36%; }
.resp-table .resp-th-gone { width: 56px; }
.resp-table td { padding: 8px 16px; vertical-align: middle; border-top: 1px solid var(--hairline); }
.resp-table tbody tr:first-child td { border-top: 0; }
.resp-table tbody tr:hover td { background: var(--violet-tint); }
.resp-name { display: block; width: 100%; min-width: 0; box-sizing: border-box; height: 40px; padding: 0 8px; margin-left: -9px;
  border: 1px solid transparent; border-radius: var(--r-control); background: transparent; color: var(--ink);
  font: 500 15px/38px var(--font-sans); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
span.resp-name { margin-left: 0; padding: 0; border: 0; }
input.resp-name { cursor: text; }
input.resp-name:hover { border-color: var(--hairline); background: var(--card); }
input.resp-name:focus { border-color: var(--field-rule); background: var(--card); }
.resp-holders { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-width: 0; min-height: 40px; }
.resp-holders .rr-none { margin-top: 0; }
.resp-chip { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; min-width: 0; height: 32px; padding: 0 4px 0 4px;
  background: var(--card); border: 1px solid var(--hairline); border-radius: var(--r-badge); flex: none; }
.resp-chip:not(:has(.chip-gone)) { padding-right: 10px; }
.resp-chip-name { min-width: 0; }
.resp-chip .chip-gone { width: 24px; height: 24px; padding: 0; color: var(--body); }
.resp-more, .resp-assign { display: inline-flex; align-items: center; justify-content: center; flex: none; height: 32px; cursor: pointer;
  border: 1px dashed var(--field-rule); background: transparent; color: var(--violet-text); font: 600 13px/1 var(--font-sans); }
.resp-more { width: 32px; padding: 0; border-radius: 50%; color: var(--body); }
.resp-assign { gap: 6px; padding: 0 12px; border-radius: var(--r-full); white-space: nowrap; }
.resp-more .icon, .resp-assign .icon { width: 16px; height: 16px; }
.resp-more:hover, .resp-assign:hover { border-color: var(--violet); color: var(--violet-text); background: var(--violet-tint); }
.resp-gone-cell { text-align: right; }
.resp-gone, .soly-close { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; flex: none;
  border: 0; border-radius: var(--r-control); background: transparent; color: var(--secondary); cursor: pointer; }
.resp-gone .icon { width: 18px; height: 18px; }
.resp-gone:hover { background: var(--red-tint); color: var(--red-text); }
.resp-add { display: flex; align-items: center; gap: 8px; }
.resp-add .doc-entry { flex: 1 1 auto; min-width: 0; height: 40px; min-height: 40px; }
.resp-add-button { flex: none; white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; min-height: 40px; font-size: 14px; }
.resp-add-button .icon { width: 16px; height: 16px; }
.resp-link { color: var(--violet-text); font-weight: 600; }
.resp-pop .avatar { width: 28px; height: 28px; line-height: 28px; font-size: 11px; }
.resp-pop-note { margin: 0; padding: 10px 14px; border-top: 1px solid var(--hairline); font-size: 13px; color: var(--secondary); }
@media (max-width: 640px) {
  .resp-table thead th:first-child { width: 40%; }
  .resp-table td, .resp-table thead th { padding-left: 10px; padding-right: 10px; }
  .member-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (prefers-reduced-motion: no-preference) { .resp-table tbody tr td { transition: background .12s; } }
.aprep-controls { display: flex; flex-wrap: wrap; gap: 8px 12px; min-width: 0; }
.aprep-controls .tick-mark { white-space: nowrap; flex: none; }
.card-actions .aprep-due { flex-direction: row; align-items: center; gap: 8px; margin-right: auto; }
/* An incident's Reporting obligations card (rob, Rinat's design 2026-11-01; docs/FLOWS.md 7.609, before it one card
   per law, 7.170; templates/_incident_deadlines.html): one fold near the top of the record. Its heading line: the
   chevron, the title, the duties counted, a pill per law (.pill.count, its code parted from its words by a hairline)
   and Hide or Show deadlines on the right; inside, the law lanes on the deadline chart (below) and the duty table (the
   house table: the article as its row header, a band per law, the duty unfolding to its instruction); the open
   question under the card as a tinted box. The next deadline on the lists is a cell-main with its pill
   (register.html, _breach_log_list.html). */
.dl-card > .card-heading { margin-bottom: 0; }
.dl-head { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; min-width: 0; }
details.dl-card > summary .dl-head { flex: 1 1 auto; }
.dl-law-pill { min-width: 0; }
.dl-law-pill > .mono { flex: none; padding-right: 8px; border-right: 1px solid var(--hairline); }
.dl-law-pill > :last-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }   /* the words, cut on a phone */
details[open] > summary .dl-when-closed, details:not([open]) > summary .dl-when-open { display: none; }
.dl-fold-body { display: flex; flex-direction: column; gap: 14px; }
.dl-fold-body > .report, .dl-fold-body > p { margin: 0; }
/* the table scrolls in its wrap on a phone rather than squeeze the duty; the wrap holds its hidden labels (.sr-only is
   absolutely placed: with no positioned ancestor, the header's "Action" stood at the table's far end and widened the page) */
.dl-fold-body > .table-wrap { position: relative; min-width: 0; }
.dl-duty { min-width: 260px; }
.dl-band { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; color: var(--body); }
.dl-duty > summary { display: flex; align-items: flex-start; gap: 8px; cursor: pointer; list-style: none;
  font: 600 15px/22px var(--font-sans); color: var(--ink); }
.dl-duty > summary::-webkit-details-marker { display: none; }
.dl-duty > summary .form-more-chevron { margin-top: 3px; }
.dl-duty-body { display: flex; flex-direction: column; gap: 8px; padding: 8px 0 0 24px; }
.dl-duty-body > p { margin: 0; }
.dl-ask { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 12px 14px;
  border: 1px solid color-mix(in srgb, var(--amber) 45%, transparent); border-radius: var(--r-control); background: var(--amber-tint); }
.dl-ask.is-running { border-color: color-mix(in srgb, var(--red) 40%, transparent); background: var(--red-tint); }
.dl-ask-icon { width: 20px; height: 20px; flex: none; color: var(--amber-text); }
.dl-ask.is-running .dl-ask-icon { color: var(--red-text); }
.dl-ask-text { display: flex; flex-direction: column; gap: 2px; flex: 1 1 320px; min-width: 0; font-size: 13px; color: var(--body); }
.dl-ask.is-running .dl-ask-text > strong { color: var(--red-text); }
.dl-ask-actions { display: flex; align-items: center; gap: 8px; flex: none; }
.dl-dot { display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; flex: none;
  border-radius: 50%; border: 2px solid var(--rule); background: var(--card); }
.dl-dot .icon { width: 10px; height: 10px; color: #fff; stroke-width: 3; }
.tone-amber .dl-dot { border-color: var(--amber); }
.tone-red .dl-dot { border-color: var(--red); }
.tone-red .dl-dot.is-filled { background: var(--red); }
.tone-green .dl-dot { border-color: var(--green-deep); background: var(--green-deep); }
.deadline-chart-part { font-weight: 600; color: var(--ink); }
.deadline-chart-part.tone-red { color: var(--red-text); }
.deadline-chart-part.tone-amber { color: var(--amber-text); }
.deadline-chart-part.tone-green { color: var(--green-text); }
.xf-progress-left, .xf-q-help, .xf-rules { margin: 0; font-size: 13px; color: var(--body); }
/* The reporting cards in Rinat's designs of 2026-11-01 (FLOWS 7.612): the heading band of Reporting obligations and
   of Who to notify tinted violet (the whole card while it is closed), a rule between the duties counted and the law
   pills, Hide and Show as words, a law with an overdue duty as a red pill; under a law's band in Who to notify the
   channel its duties share. */
details.dl-card > summary.card-heading { background: var(--violet-tint); }
details.dl-card:not([open]) > summary.card-heading { margin-bottom: 0; border-radius: inherit; }
.dl-toggle { flex: none; font-weight: 600; white-space: nowrap; }
.pill.count.dl-law-pill.danger > .mono { border-right-color: color-mix(in srgb, var(--red-text) 30%, transparent); }
/* an open stop on the chart is a filled dot in its tone (the design of 2026-11-01), as a sent or missed one is */
.tone-amber .dl-dot.is-filled { background: var(--amber); }
.whon-for { color: var(--secondary); }
.whon-channel { display: block; margin-top: 4px; color: var(--body); }
/* The duty tables (Reporting obligations, Who to notify): the header in words, the rows centred. A row header that
   is a code (.mono) keeps the mono face on the violet. */
.data-table.duty-rows > thead > tr > th { font-size: 14px; letter-spacing: 0; text-transform: none; }
.data-table.duty-rows > tbody > tr > :is(td, th) { vertical-align: middle; }
/* Send now, Mark sent and Required content in the last cell read as the violet links they are */
.data-table.duty-rows > tbody > tr > td.cell-num > .card-link, .data-table.duty-rows > tbody > tr > td.cell-num .rule-form > .card-link { color: var(--violet-text); }
.data-table > tbody > tr > th.mono { font-family: var(--font-mono); font-weight: 500; }
/* The Overdue notifications card above the incidents and the data breaches (FLOWS 7.612): its heading band tinted red
   with the title in red and the count as a solid red badge, the laws on the right; the table's header a light band of
   mono labels; how late in red; the rows past the first three open from the foot band (no script). */
.ovd-card { border-color: color-mix(in srgb, var(--red) 40%, transparent); }
.ovd-card > .ovd-head { background: var(--red-tint); border-bottom-color: color-mix(in srgb, var(--red) 40%, transparent); }
.ovd-head .list-head-title { align-items: center; }
.ovd-head .list-head-title > h2 { color: var(--red-text); }
.tab-count.alert { background: var(--red-deep); color: #fff; }
.ovd-sub { color: var(--body); font-size: 14px; }
.ovd-laws { display: flex; flex-wrap: wrap; gap: 8px; }
.ovd-laws > .pill.code { background: var(--card); }
/* the table's hidden caption and Action label stay inside its scrolling frame at a phone's width (as in .dl-fold-body) */
.ovd-card > .list-wrap { position: relative; }
.data-table.ovd-table > thead > tr, .data-table.ovd-table > thead > tr > th { background: var(--canvas); }
.data-table.ovd-table > thead > tr > th { color: var(--secondary); font: 500 12px/1 var(--font-mono); letter-spacing: .1em;
  border-bottom: 1px solid var(--hairline); }
.data-table.ovd-table > tbody > tr > td { vertical-align: middle; }
.data-table.ovd-table > tbody > tr > td.ovd-late { color: var(--red-text); font-size: 15px; font-weight: 600; }
.ovd-basis { margin-left: 6px; color: var(--secondary); font-size: 13px; }
.ovd-item { width: 34%; max-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ovd-card tr.is-more { display: none; }
.ovd-card:has(.ovd-more[open]) tr.is-more { display: table-row; }
.ovd-more > summary { display: inline-flex; align-items: center; gap: 6px; list-style: none; cursor: pointer; }
.ovd-more > summary::-webkit-details-marker { display: none; }
.ovd-more > summary .form-more-chevron { width: 16px; height: 16px; }
.ovd-more[open] > summary .form-more-chevron { transform: rotate(180deg); }
.dl-collapsed-line, .bil-switch { display: flex; align-items: center; gap: 8px; margin: 0; font-size: 13px; color: var(--body); }
.dl-collapsed-text { min-width: 0; }
.dl-collapsed-line .rule-form { margin: 0 0 0 auto; }
/* The deadline chart (ndl, Rinat's design 2026-11-01, docs/FLOWS.md 7.603): records with their reporting clocks on
   one day axis -- the Notification deadlines card above the incidents and the breaches, a .list-card that gives the
   chart its sides. A row is the record (code, title, the moment the clock started) beside its lane; the lane holds
   the track from that moment (violet up to now, grey after), the start dot and a marker per stop: its label (law and time left, each part in the deadline
   cards' tone of its stop, .deadline-chart-part) over the house's .dl-dot, under the track when it would crowd the label before it, aligned to the
   end of the axis it stands near. The axis row names the days; a dotted line marks now through every lane. Every
   position is a percentage of the axis (--at, --from, --until, --now through data-vars). The lanes are for the eye:
   a screen reader reads the table that follows the chart. */
.deadline-chart { display: flex; flex-direction: column; }
.deadline-chart-row { display: grid; grid-template-columns: minmax(0, 32%) minmax(0, 1fr); column-gap: 16px;
  border-top: 1px solid var(--hairline); }
.deadline-chart-row.is-axis { border-top: 0; }
.deadline-chart-who { display: flex; flex-direction: column; justify-content: center; gap: 2px; min-width: 0; padding: 10px 0; }
.deadline-chart-name { display: flex; align-items: baseline; gap: 8px; min-width: 0; font: 600 15px/22px var(--font-sans); color: var(--ink); }
.deadline-chart-name > .card-link { font-size: 15px; white-space: nowrap; flex: none; }
.deadline-chart-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.deadline-chart-lane { position: relative; height: 64px; }
.deadline-chart-row.has-below .deadline-chart-lane { height: 88px; }
.deadline-chart-row.is-axis .deadline-chart-lane { height: 32px; }
.deadline-chart-lane::after { content: ""; position: absolute; top: 0; bottom: 0; left: var(--now); border-left: 2px dotted var(--ink); }
.deadline-chart-tick { position: absolute; top: 8px; left: var(--at); transform: translateX(-50%); font-size: 12px; line-height: 16px;
  color: var(--secondary); white-space: nowrap; }
.deadline-chart-track { position: absolute; top: 37px; left: var(--from); width: calc(var(--until) - var(--from)); height: 4px;
  border-radius: 2px; background: var(--hairline); }
.deadline-chart-track.is-past, .deadline-chart-track.is-late { width: calc(var(--now) - var(--from)); }   /* up to now */
.deadline-chart-track.is-past { background: var(--violet); }
.deadline-chart-track.is-late { background: var(--red); }   /* from the first deadline missed */
.deadline-chart-start { position: absolute; top: 33px; left: var(--at); width: 12px; height: 12px; margin-left: -6px;
  border-radius: 50%; background: var(--violet); }
.deadline-chart-mark { position: absolute; z-index: 1; top: 10px; left: var(--at); display: flex; flex-direction: column; align-items: center;
  gap: 6px; transform: translateX(-50%); }   /* above the line at now, which its label's ground covers */
.deadline-chart-mark.is-below { top: 32px; flex-direction: column-reverse; }
.deadline-chart-mark.at-start { align-items: flex-start; transform: translateX(-7px); }
.deadline-chart-mark.at-end { align-items: flex-end; transform: translateX(calc(7px - 100%)); }
.deadline-chart-label { font-size: 13px; line-height: 16px; white-space: nowrap; color: var(--body); background: var(--card); }
.deadline-chart-label .icon { width: 14px; height: 14px; margin-left: 2px; vertical-align: -2px; }
.deadline-chart-key { display: none; }
/* the law lanes of an incident's Reporting obligations card (rob, FLOWS 7.609): the law's code in a narrow column, the
   word NOW over the dashed line in the row above, the days in the row below, where the line stops */
@media (min-width: 761px) { .deadline-chart.is-lanes .deadline-chart-row { grid-template-columns: 72px minmax(0, 1fr); } }
.deadline-chart-row.is-foot { border-top: 1px solid var(--hairline); }
.deadline-chart-row.is-now .deadline-chart-lane::after { top: 20px; }
.deadline-chart-row.is-foot .deadline-chart-lane::after { display: none; }
.deadline-chart-now { position: absolute; top: 2px; left: var(--now); transform: translateX(-50%); font: 600 12px/16px var(--font-mono);
  letter-spacing: .06em; text-transform: uppercase; color: var(--ink); white-space: nowrap; }
/* a row whose labels would collide on its track or run past it (static/js/deadline_chart.js measures it after layout):
   the lane keeps the dots, their labels stand in one wrapping line under it, in the same order and tones */
.deadline-chart-row.is-keyed .deadline-chart-lane { height: 32px; }
.deadline-chart-row.is-keyed .deadline-chart-track { top: 14px; }
.deadline-chart-row.is-keyed .deadline-chart-start { top: 10px; }
.deadline-chart-row.is-keyed .deadline-chart-mark { top: 9px; }
.deadline-chart-row.is-keyed .deadline-chart-mark > .deadline-chart-label { display: none; }
.deadline-chart-row.is-keyed .deadline-chart-key { display: flex; flex-wrap: wrap; gap: 4px 14px; margin: 0; padding: 4px 0 10px; }
.deadline-chart-key-item { display: inline-flex; align-items: center; gap: 6px; min-width: 0; }
.deadline-chart-row.is-keyed > .deadline-chart-key { grid-column: 2; }
/* at a phone's width the record stands above its lane */
@media (max-width: 760px) {
  .deadline-chart-row { grid-template-columns: minmax(0, 1fr); }
  .deadline-chart-row.is-axis .deadline-chart-who { display: none; }
  .deadline-chart-who { padding-bottom: 0; }
  .deadline-chart-row.is-keyed > .deadline-chart-key { grid-column: 1; }
}
/* Soly rules (console, rulesread 2026-09-29; FLOWS 7.121): a rule's row in
   plain words -- its title the fold's button (the chevron turns), the
   summary, the group's pill and the day under it, indented under the
   title; opened, what it checks and a Technical details fold of its own.
   Every word wraps (overflow-wrap:anywhere): a long docstring or path never
   runs off the screen on one line. */
.srules-table td.srules-rule { min-width: 320px; }
.srules-fold { display: flex; align-items: flex-start; gap: 6px; padding: 0; margin: 0; border: 0; background: none;
  cursor: pointer; text-align: left; color: var(--ink); font: inherit; }
.srules-fold .form-more-chevron { margin-top: 3px; }
.srules-fold[aria-expanded="true"] > .form-more-chevron { transform: rotate(90deg); }
.srules-tech-toggle { color: var(--violet-text); font: 600 13px/22px var(--font-sans); }
.srules-indent, .srules-summary { margin-left: 22px; }
.srules-summary { margin-top: 2px; margin-bottom: 6px; font: 400 14px/20px var(--font-sans); color: var(--body);
  max-width: 880px; overflow-wrap: anywhere; }
.srules-more { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; margin-top: 10px; min-width: 0;
  overflow-wrap: anywhere; }
.srules-more[hidden], .srules-tech[hidden] { display: none; }
.srules-checks { display: flex; flex-direction: column; gap: 4px; margin: 0; padding-left: 18px; max-width: 880px;
  font: 400 14px/20px var(--font-sans); color: var(--ink); }
.srules-tech { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 6px 12px; align-self: stretch;
  max-width: 880px; margin: 0; padding: 10px 12px; border: 1px solid var(--hairline); border-radius: var(--r-control);
  font: 400 13px/20px var(--font-sans); }
.srules-tech dt { color: var(--secondary); }
.srules-tech dd { margin: 0; min-width: 0; overflow-wrap: anywhere; color: var(--ink); }
@media (max-width: 720px) { .srules-tech { grid-template-columns: minmax(0, 1fr); } }
/* custlink (2026-09-29, Rinat's design of a customer's questionnaire, docs/FLOWS.md 7.166): the due date's line
   in red or amber; the questions' approvals as the thin bar (.rcr-bar) beside the segmented filter; a yes/no
   answer as Yes | No | N/A, the chosen one violet with white text, the explanation under it; the row's state
   with its action under it; Approve green (--green-deep, white). */
.cq-due.red { color: var(--red-text); }
.cq-due.amber { color: var(--amber-text); }
.cq-progress { justify-content: space-between; }
.cq-progress-bar { display: flex; flex-direction: column; gap: 6px; flex: 1 1 240px; max-width: 360px; min-width: 0; }
.cq-progress .segment-button, .cq-choice .segment-button { position: relative; white-space: nowrap; }
.cq-choice .segment-button:has(input:checked) { background: var(--violet); color: #fff; }
.cq-answer { min-width: 260px; }
.cq-answer .cq-choice { margin-bottom: 8px; }
.cq-answer textarea { display: block; width: 100%; box-sizing: border-box; }
.cq-progress > .segment { max-width: 100%; flex-wrap: wrap; }
@media (max-width: 600px) { .report.soly-fill-banner.cq-band { flex-wrap: wrap; } }
.cq-state { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
.cq-confidence { display: flex; align-items: center; gap: 6px; margin-top: 6px; }
/* ctlnote (2026-09-29, docs/FLOWS.md 7.180): the controls' summary as the filter bar's first line, its parts a
   filter (radios hidden, the chosen part violet and underlined), and Soly AI's internal note under a question's
   sources -- for the person, never in the answer: a violet rule on its left, the label in mono. */
.cq-ctl-line { display: flex; flex: 1 1 100%; flex-wrap: wrap; align-items: center; gap: 4px 8px;
  font: 500 12px/18px var(--font-mono); letter-spacing: .06em; text-transform: uppercase; color: var(--secondary); }
.cq-ctl-part { position: relative; white-space: nowrap; cursor: pointer; border-radius: 2px; }
.cq-ctl-part:hover { color: var(--ink); }
.cq-ctl-part:has(input:checked) { color: var(--violet-text); text-decoration: underline; text-underline-offset: 3px; }
.cq-ctl-part:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.cq-note { display: flex; flex-direction: column; gap: 4px; max-width: 380px; margin-top: 8px; padding: 2px 0 2px 10px;
  border-left: 2px solid var(--violet); font: 400 12px/18px var(--font-sans); color: var(--ink); white-space: normal; }
.cq-note-line { min-width: 0; overflow-wrap: anywhere; }
.cq-note-line a { color: var(--violet-text); }
/* cqfill (2026-10-12, docs/FLOWS.md 7.325): the status line of Soly AI's job under the Soly band (one line of 34px:
   the ring or the glyph, the words, left aligned; failed in red, paused in amber, the word always on it), and a
   document's section after its code on a source chip. */
.cq-job { display: flex; align-items: center; gap: 10px; min-height: 34px; padding: 0 16px; font-size: 13px;
  color: var(--ink); }
.cq-job > .icon { width: 16px; height: 16px; flex: none; }
.cq-job-text { min-width: 0; overflow-wrap: anywhere; }
.cq-job[data-cq-job="failed"] { color: var(--red-text); }
.cq-job[data-cq-job="paused"] { color: var(--amber-text); }
.cq-source-section { font-family: var(--font-sans); letter-spacing: 0; }
.data-table .button.small.approve:hover { background: #136638; border-color: #136638; }

/* Soly checks (task 15): a check's row in the Parameters fold of Setup ->
   Soly AI -> Checks, and the row actions of a learned rule (portal and
   console). */
.sckl-param { display: flex; flex-direction: column; gap: 10px; padding: 12px 0; min-width: 0; }
.sckl-param + .sckl-param { border-top: 1px solid var(--hairline); }
.sckl-param-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
.sckl-param-head > .sckl-param-name { min-width: 0; }
.sckl-param-head > .tick-mark { margin-left: auto; flex: none; white-space: nowrap; }
.sckl-row-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; margin: 0; }
.sckl-row-actions > .button { flex: none; white-space: nowrap; }
.sckl-cap { justify-content: flex-start; }
.sckl-cap > .doc-entry { max-width: 180px; }

/* Soly checks (task 15, SPEC_AUTONOMOUS_AI 8; templates/_soly_checks.html, _soly_proposals.html,
   static/js/soly_checks.js). sckcard (Rinat's design, 2026-10-31): a finding is one card wherever it shows -- in
   the box above a field, a section or the form (the whole width of the form, never a column wide; its words wrap,
   never cut -- Rinat 2026-10-05); the drawer's Proposals tab keeps its compact rows in cards (sckview, below;
   Rinat, 2026-10-31: its style stays the same). The card: the violet tint, a 1px field-rule
   border, 4px corners, 14px 16px inside, 10px between its parts. The head line, 32px at least and wrapping on a
   narrow card: the sparkle and "SOLY AI" as a violet eyebrow, the seriousness as a small pill with its word
   (.pill), the judgement in secondary words (.cell-sub), then on the right Dismiss (a text button) and Review (a
   small hairline button: a page's own Save stays its one violet button); on a phone the judgement takes the
   line under it, so Dismiss and Review stay beside "SOLY AI". The title 15px/600
   as a row's title (not .cell-title itself: links inside a .cell-* element take its colour), its codes violet
   links (.soly-code). The records as white outlined chips (.action-chip): the code in mono, the title in
   secondary, cut with an ellipsis. The suggested fix: a white inset, its eyebrow above one sentence. Why a closed
   fold. The foot (.cell-sub) under a hairline across the card, the moment in mono. Several on one place: the cards
   8px apart. The reason row asks inline, its own Dismiss and Cancel on the right. The toast: bottom right, beside
   the drawer when it stands open, closed only by the person; it slides in unless motion is reduced. */
.sck-box { grid-column: 1 / -1; margin: 0 0 8px; text-align: left; }
.sck-items { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.sck-items > .sck-item { display: flex; flex-direction: column; gap: 10px; min-width: 0; padding: 14px 16px;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--violet-tint);
  color: var(--ink); font: 400 13px/1.4 var(--font-sans); }
.sck-item:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.sck-line { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; min-height: 32px; margin: 0; min-width: 0; }
.sck-source { flex: none; color: var(--violet-text); white-space: nowrap; }
.sck-line > .pill { flex: none; white-space: nowrap; }
.sck-actions { flex: none; display: inline-flex; align-items: center; gap: 12px; margin-left: auto; }
.sck-title, .sck-group-title { margin: 0; font: 600 15px/22px var(--font-sans); color: var(--ink); overflow-wrap: anywhere; }
.sck-unlikely { margin: 0; }
.sck-records { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }
.sck-record { display: flex; min-width: 0; max-width: 100%; }
.sck-record > .action-chip { display: flex; align-items: center; gap: 8px; min-width: 0; text-decoration: none; }
a.action-chip:hover { border-color: var(--violet); }
.sck-record-what { min-width: 0; overflow: hidden; text-overflow: ellipsis; font-weight: 400; color: var(--secondary); }
.sck-fix { display: flex; flex-direction: column; gap: 4px; padding: 10px 12px; border-radius: var(--r-control);
  background: var(--card); }
.sck-fix > p { margin: 0; overflow-wrap: anywhere; }
/* the foot and the reason row: under a hairline across the card */
.sck-foot, .sck-reason { margin: 0 -16px; padding: 10px 16px 0; border-top: 1px solid var(--hairline); }
.sck-actions[hidden], .sck-line[hidden], .sck-affected[hidden], .sck-reason[hidden], .sck-lines[hidden],
.sck-records[hidden], .sck-fix[hidden], .sck-foot[hidden] { display: none; }
/* sckglow (Rinat, 2026-10-04): a Soly AI proposal on a page stands out with a violet glow behind its card that
   breathes every 2.4 s; still (the glow at rest) under prefers-reduced-motion. The words carry the meaning, not the glow. */
.sck-box .sck-item { box-shadow: 0 2px 12px color-mix(in srgb, var(--violet) 28%, transparent);
  animation: sck-glow 2.4s ease-in-out infinite; }
@keyframes sck-glow {
  0%, 100% { box-shadow: 0 2px 12px color-mix(in srgb, var(--violet) 28%, transparent); }
  50% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--violet) 16%, transparent),
    0 4px 22px color-mix(in srgb, var(--violet) 45%, transparent); } }
@media (prefers-reduced-motion: reduce) { .sck-box .sck-item, .sck-toast-body { animation: none; } }
.sck-why > summary { min-height: 28px; display: flex; align-items: center; cursor: pointer; font-weight: 600; color: var(--violet-text); }
.sck-why > .sck-lines { padding-bottom: 4px; }
.sck-lines { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.sck-affected > .cell-code-sub { margin: 4px 0 0; white-space: normal; }
.sck-affected, .sck-reason { display: flex; flex-direction: column; gap: 8px; }
.sck-reasons { gap: 4px; }
.sck-reasons > legend { padding: 0; margin-bottom: 4px; font-weight: 600; }
.sck-choice { display: flex; align-items: center; gap: 8px; min-height: 28px; min-width: 0; }
.sck-other { flex: 1 1 auto; min-width: 0; height: 32px; border-color: var(--field-rule); border-radius: var(--r-control); }
.sck-error { margin: 0; font-weight: 600; color: var(--red-text); }
.sck-error[hidden] { display: none; }
.sck-reason-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }
/* an affected record: code, title and Open on one line, its note under the title */
.sck-aff { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; column-gap: 8px; min-width: 0; }
.sck-aff-what { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sck-aff .cell-code-sub { grid-column: 2; grid-row: 2; margin: 0; overflow: hidden; text-overflow: ellipsis; }
.sck-aff > .button { grid-column: 3; grid-row: 1 / span 2; }
.sck-code { flex: none; font: 500 13px/20px var(--font-mono); color: var(--violet-text); white-space: nowrap; }
.sck-age { flex: none; margin: 0 0 0 auto; }
/* sckview (Rinat's design, 2026-10-12; FLOWS 7.213): the drawer's proposals. The top row: the Mine | All I may
   see radiogroup (the chosen one on the violet tint) and "2 findings · 3 items" in secondary on its right, a
   hairline under it across the drawer. Then one white hairline card per kind of finding, 14px apart: the check's
   name 15px/600 with its count in secondary on the right, "<register> · found by a Soly check" under it, a
   hairline; one row per record, hairlines between: the code as a violet mono link, the age in mono, and on the
   right Review as a violet text button and x (Dismiss). The reason row and a change impact's lines open under
   their row. Rinat, 2026-10-31: the drawer keeps this style; the card (sckcard, above) is the box's. */
.soly-drawer .soly-panel.sck-panel { gap: 14px; }
.sck-panel > * { flex: none; }
.sck-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-width: 0;
  margin: 0 -16px; padding: 0 16px 14px; border-bottom: 1px solid var(--hairline); }
.sck-scope { flex: none; }
.sck-scope .segment-button { position: relative; white-space: nowrap; }
.sck-groups { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 14px; }
.sck-group-heading { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: baseline; column-gap: 12px;
  row-gap: 2px; padding: 12px 16px; border-bottom: 1px solid var(--hairline); }
.sck-group-tally { white-space: nowrap; }
.sck-group-sub { grid-column: 1 / -1; margin: 0; }
.sck-rows { list-style: none; margin: 0; padding: 0; }
.sck-row + .sck-row { border-top: 1px solid var(--hairline); }
.sck-row-line { display: flex; align-items: center; gap: 10px; min-width: 0; min-height: 44px; padding: 4px 8px 4px 16px; }
.sck-row .sck-code { font-weight: 600; text-decoration: none; }
.sck-row a.sck-code:hover { text-decoration: underline; text-underline-offset: 2px; }
.sck-row .sck-age { margin: 0; }
.sck-row .sck-text:not(.sr-only) { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; font-size: 13px; color: var(--body); }
.sck-row .sck-actions { margin-left: auto; gap: 4px; }
.sck-row .sck-affected, .sck-row .sck-reason { margin: 0; padding: 8px 16px 10px; }
/* a change impact's further records, folded under its row, stand in as before the card */
.sck-row .sck-why { padding: 0 12px 8px 36px; }
/* (sckguide, FLOWS 7.433) what is wrong, in Soly AI's words: one line of 12px under the row's code, cut with an ellipsis */
.sck-row-hint { margin: 0; padding: 0 16px 8px; font: 400 12px/1.4 var(--font-sans); color: var(--secondary);
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sck-tally[hidden], .sck-groups[hidden], .sck-group-sub[hidden], .sck-panel > .list-foot[hidden], .sck-row-hint[hidden],
.sck-panel [data-sck-empty][hidden] { display: none; }
.sck-toast { position: fixed; right: 20px; bottom: 20px; z-index: 34; max-width: min(480px, calc(100vw - 32px)); }
.shell.soly-open ~ .sck-toast { right: 380px; }
.sck-toast-body { display: flex; align-items: center; gap: 8px; min-height: 40px; padding: 8px 8px 8px 12px; min-width: 0;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); color: var(--ink);
  font: 400 13px/1.4 var(--font-sans); box-shadow: 0 2px 12px color-mix(in srgb, var(--violet) 28%, transparent);
  animation: sck-glow 2.4s ease-in-out infinite; }
.sck-toast-body[hidden] { display: none; }
.sck-toast-body .sck-text { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.sck-toast-body .button, .sck-toast-body .soly-close { flex: none; }
@media (prefers-reduced-motion: no-preference) {
  .sck-toast.is-in .sck-toast-body { animation: sck-in .18s ease-out, sck-glow 2.4s ease-in-out .18s infinite; }
}
@keyframes sck-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@media (max-width: 767px) {
  .sck-toast, .shell.soly-open ~ .sck-toast { left: 16px; right: 16px; bottom: 16px; max-width: none; }
  .sck-line > .cell-sub { order: 1; flex-basis: 100%; }
}

/* ------------------------------------------------ the consulting call (K4, docs/FLOWS.md 7.282)
   The sidebar's button above "Collapse menu" (templates/_consulting_call_button.html): full width, 40px,
   the calendar glyph and one line. Hairline and ink by default; violet border and text on hover; violet
   border on the light violet tint while the call page is shown; green with the planned call; grey with
   the next free call. In the rail only the glyph, in a 36px square. */
.call-button { display: flex; align-items: center; gap: 10px; width: 100%; height: 40px; padding: 0 12px; flex: none;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); color: var(--ink);
  font: 600 14px/1.2 var(--font-sans); text-decoration: none; white-space: nowrap; }
.call-button .icon { width: 18px; height: 18px; flex: none; }
.call-button-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.call-button.default:hover { border-color: var(--violet); color: var(--violet-text); }
.call-button.default[aria-current="page"] { border-color: var(--violet); background: var(--violet-tint); color: var(--violet-text); }
.call-button.booked { background: var(--green-tint); }
.rail .call-button-text { display: none; }
@media (max-width: 980px) {
  .rail .call-button { width: 100%; height: 40px; padding: 0 12px; justify-content: flex-start; }
  .rail .call-button-text { display: inline; }
}
/* The call page (templates/consulting_call.html): the line under the heading, two columns (the picker or the
   planned call; the advisor and the earlier calls), the weekday tiles (five a row) and the time tiles (four
   a row, mono): hairline tiles, the chosen one violet with white, the ones that cannot be chosen grey (a
   taken time struck through), the focus ring on the tile of the focused radio. */
/* the rating's five tiles, and the tabs above both columns (K5, 2026-10-11) */
.call-slots.call-stars { grid-template-columns: repeat(5, minmax(0, 1fr)); max-width: 360px; }
.call-tabs { margin-bottom: 16px; }
.call-layout { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 16px; align-items: start; }
.call-main, .call-side, .call-panel { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.call-panel[hidden] { display: none; }
/* the one form's duration and its line: 13px secondary, no colour, no icon (Rinat, 2026-10-11) */
.call-duration { max-width: 280px; }
.call-plan-line { min-height: 18px; }
@media (max-width: 1080px) { .call-layout { grid-template-columns: minmax(0, 1fr); } }
.call-body, .call-day-panel { display: flex; flex-direction: column; gap: 14px; }
.call-day-panel[hidden] { display: none; }
.call-range { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.call-range-label, .call-day-heading { margin: 0; }
.call-days, .call-slots { border: 0; margin: 0; padding: 0; min-width: 0; display: grid; gap: 8px; }
.call-days { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.call-slots { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.call-day, .call-slot { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); color: var(--ink); cursor: pointer; }
.call-day { min-height: 64px; gap: 2px; }
.call-slot { min-height: 40px; }
.call-day-name { font: 500 12px/1.2 var(--font-sans); color: var(--secondary); }
.call-day:hover, .call-slot:hover { border-color: var(--violet); }
.call-day:has(input:checked), .call-slot:has(input:checked) { background: var(--violet); border-color: var(--violet); color: #fff; }
.call-day:has(input:checked) .call-day-name, .call-day:has(input:checked) .call-day-number, .call-slot:has(input:checked) .call-slot-time { color: #fff; }
.call-day:has(input:disabled), .call-slot:has(input:disabled) { background: var(--canvas); border-color: var(--hairline); color: var(--secondary); cursor: default; }
.call-day:has(input:disabled) .call-day-number, .call-slot:has(input:disabled) .call-slot-time { color: var(--secondary); }
.call-slot:has(input:disabled) .call-slot-time { text-decoration: line-through; }
.call-day:has(input:focus-visible), .call-slot:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.call-when { display: flex; flex-direction: column; gap: 4px; }
.call-facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 8px 16px; margin: 0; font-size: 14px; }
.call-facts dt { color: var(--secondary); }
.call-facts dd { margin: 0; color: var(--body); overflow-wrap: anywhere; }
.call-cancel-form { display: inline-flex; margin: 0; }
/* K5 point 26: a call or a held request in a day of the console's calendar -- time, code, client, status in one line */
.cal-item { display: flex; align-items: center; gap: 8px; min-height: 28px; }
.cal-item > .mono, .cal-item > .pill { white-space: nowrap; flex: none; }
.cal-item-client { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* a row's own actions (Planned calls, the calendar): beside each other, onto a second line when the column is narrow */
.call-row-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
.call-row-actions .button { white-space: nowrap; flex: none; }
/* My planning (FLOWS 7.303 point 28): the next call's time on its stat card, the To mark line, Today's timeline
   (calls as rows, the next one violet with its "Starts in ...", free blocks quiet and dashed) and the week's grid
   (hours down the side, 56px an hour; offered hours shaded, calls as violet blocks sized by their length, holds
   dashed, days off grey). Every state carries its word as well. */
.plan-stat-link { color: var(--ink); text-decoration: none; }
.plan-stat-link:hover { color: var(--violet-text); text-decoration: underline; }
.card.plan-mark { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.plan-mark > .icon { width: 24px; height: 24px; flex: none; color: var(--amber-text); }
.plan-mark-words { margin-right: 8px; font-size: 14px; color: var(--body); }
.plan-mark > .button { white-space: nowrap; flex: none; }
.plan-agenda { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.plan-row { display: grid; grid-template-columns: 136px minmax(0, 1fr) auto auto; align-items: center; gap: 16px;
  padding: 10px 14px; border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.plan-row.plan-call { min-height: 72px; }
.plan-row.plan-next { border-color: var(--violet); box-shadow: inset 4px 0 0 var(--violet); background: var(--violet-tint); }
.plan-row.plan-hold { border-style: dashed; border-color: var(--violet); }
.plan-row.plan-free { display: flex; align-items: center; gap: 16px; min-height: 34px; padding: 4px 14px; border-style: dashed;
  background: var(--canvas); }
.plan-free .plan-time { flex: none; width: 136px; font-weight: 400; color: var(--secondary); }
.plan-free-words { font-size: 13px; color: var(--secondary); }
.plan-when, .plan-what { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.plan-time { font-size: 15px; font-weight: 600; color: var(--ink); white-space: nowrap; }
.plan-line { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.plan-line > .cell-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-domain { flex: 0 1 auto; max-width: 45%; }
.plan-tags { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }
.plan-tags > * { white-space: nowrap; flex: none; }
.plan-fee { font-size: 13px; color: var(--body); }
.plan-cancelled .plan-time, .plan-cancelled .cell-title { text-decoration: line-through; }
@media (max-width: 900px) {
  .plan-row { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  .plan-tags, .plan-row .call-row-actions { justify-content: flex-start; }
}
/* the layout contract's 480px: the grid scrolls inside its card (about seven hours in view), the days stay on top */
.plan-week-wrap { max-height: 392px; overflow: auto; }
.plan-week { display: grid; grid-template-columns: 56px repeat(var(--plan-days, 5), minmax(96px, 1fr)); min-width: 600px; }
.plan-corner, .plan-date { position: sticky; top: 0; z-index: 2; background: var(--card); border-bottom: 1px solid var(--hairline); }
.plan-date { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-height: 40px; padding: 4px 8px;
  border-left: 1px solid var(--hairline); }
.plan-date-label { font-size: 13px; font-weight: 600; color: var(--ink); white-space: nowrap; }
.plan-date > .pill { white-space: nowrap; flex: none; }
/* the grid's height, an hour's place and a block's place and length come from the data (data-vars on .plan-week,
   .plan-hour, .plan-shade and .plan-block: plan-height, plan-top, plan-span) */
.plan-hours { position: relative; height: var(--plan-height); }
.plan-hour { position: absolute; top: var(--plan-top); right: 8px; margin-top: 2px; font-size: 12px; color: var(--secondary); }
.plan-day { position: relative; height: var(--plan-height); border-left: 1px solid var(--hairline);
  background-image: repeating-linear-gradient(to bottom, var(--hairline) 0, var(--hairline) 1px, transparent 1px, transparent 56px); }
.plan-day.plan-off { background-color: var(--canvas); }
.plan-shade { position: absolute; top: var(--plan-top); height: var(--plan-span); left: 0; right: 0; background: var(--violet-tint); }
.plan-block { position: absolute; top: var(--plan-top); height: var(--plan-span); left: 4px; right: 4px; display: flex; flex-direction: column; overflow: hidden;
  padding: 1px 6px; border: 1px solid var(--violet); border-radius: var(--r-control); background: var(--violet); color: #fff;
  font-size: 12px; line-height: 13px; text-decoration: none; }
.plan-block:hover { background: var(--violet-hover); border-color: var(--violet-hover); }
.plan-block.plan-hold { background: var(--card); border-style: dashed; color: var(--violet-text); }
.plan-block.plan-past { background: var(--neutral-tint); border-color: var(--hairline); color: var(--ink); }
.plan-block.plan-cancelled { background: var(--card); border-color: var(--hairline); color: var(--secondary); text-decoration: line-through; }
.plan-block-line, .plan-block-word { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-legend { display: flex; flex-wrap: wrap; gap: 16px; font-size: 12px; color: var(--secondary); }
.plan-key { display: inline-flex; align-items: center; gap: 6px; }
.plan-swatch { flex: none; width: 16px; height: 12px; border-radius: var(--r-badge); }
.plan-swatch-shade { background: var(--violet-tint); outline: 1px solid var(--hairline); }
.plan-swatch-call { background: var(--violet); }
.plan-swatch-hold { border: 1px dashed var(--violet); }
.plan-swatch-past { background: var(--neutral-tint); outline: 1px solid var(--hairline); }
.card.call-advisor { display: flex; align-items: center; gap: 12px; }
.call-advisor-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.call-earlier { list-style: none; padding: 0; display: flex; flex-direction: column; }
.call-earlier-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; padding: 10px 0; border-bottom: 1px solid var(--hairline); }
.call-earlier-row:last-child { border-bottom: 0; }
.call-earlier-date { flex: none; font-size: 12px; color: var(--secondary); white-space: nowrap; }
.call-earlier-topic { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; color: var(--body); }
.call-earlier-row .pill { flex: none; white-space: nowrap; }
.call-notes { flex-basis: 100%; }
.call-notes p { margin: 6px 0 0; font-size: 13px; line-height: 1.5; color: var(--body); }
/* The console's advisor form: a weekday's two ranges on one line. */
.call-hours-range { display: inline-flex; align-items: center; gap: 6px; margin-right: 16px; }
.call-hours-range .doc-entry { width: 128px; }
.call-hours-range[hidden], .cov-condition[hidden], .cov-values[hidden], .cov-day[hidden], .cov-day-ranges[hidden] { display: none; }
/* K5 (docs/FLOWS.md 7.303): the days as seven chips a row (the advisor's form, and the portal's days when an
   advisor has weekend hours); the coverage's condition rows; a day's own hours; the two weeks ahead. */
.call-days.week7, .call-week { grid-template-columns: repeat(7, minmax(0, 1fr)); }
.call-week { max-width: 560px; }
.cov-condition { display: grid; grid-template-columns: 180px 120px minmax(0, 1fr) auto; gap: 8px; align-items: start; }
.cov-condition + .cov-condition { margin-top: 8px; }
.cov-values { min-width: 0; }
.cov-days { display: flex; flex-direction: column; gap: 8px; }
.cov-day { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; min-height: 40px; }
.cov-day-name { flex: none; width: 110px; font-weight: 600; color: var(--ink); }
.cov-day-own { display: inline-flex; align-items: center; gap: 8px; flex: none; white-space: nowrap; }
.cov-day-same { color: var(--secondary); font-size: 13px; }
.cov-week-preview { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; font-size: 13px; }
.cov-week-preview li { display: flex; gap: 12px; min-width: 0; }
.cov-week-day { flex: none; width: 88px; color: var(--secondary); }
.cov-week-times { min-width: 0; color: var(--body); }
@media (max-width: 720px) { .cov-condition { grid-template-columns: minmax(0, 1fr); } }
.cov-bulk { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.cov-bulk[hidden] { display: none; }
/* the advisor form's "+ Add condition", "+ Add hours" and "+ Add days off": small, beside their rows, never full width */
[data-condition-add], [data-range-add], [data-off-add] { justify-self: start; align-self: flex-start; width: auto; }
/* Soly AI's weekly summary on the dashboard (S4, docs/FLOWS.md 7.299; templates/_dashboard_soly_week.html),
   Rinat's design 2026-10-11: the heading line (Soly's mark, title and week, the counts as .pill.count chips),
   Soly's words or a muted row that says why they are missing, the next steps between hairlines (code and title,
   the second line, the lateness or due chip, Prepare), and the foot with what is left and the full list. */
.card.soly-week { padding: 0; overflow: hidden; }
.soly-week-intro { padding: 16px; }
.soly-week-intro > .card-heading { flex-wrap: wrap; gap: 10px 16px; }
.soly-week-mark { display: grid; place-items: center; flex: none; width: 32px; height: 32px;
  border-radius: var(--r-control); background: var(--violet-tint); color: var(--violet-text); }
.soly-week-mark .icon { width: 18px; height: 18px; }
.soly-week-words { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.soly-week-words h2 { margin: 0; }
.soly-week-counts { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.soly-week-text, .bil-split-sub { margin: 0; font-size: 14px; line-height: 1.5; color: var(--body); }
.soly-week-note { display: flex; align-items: center; gap: 10px; margin: 0; padding: 10px 14px;
  border-radius: var(--r-control); background: var(--canvas); color: var(--secondary); font-size: 14px; line-height: 1.4; }
.soly-week-note .icon { width: 16px; height: 16px; flex: none; }
.soly-week-next { display: flex; flex-direction: column; gap: 10px; padding: 14px 16px; border-top: 1px solid var(--hairline); }
.soly-week-next-line { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.soly-week-next-line .eyebrow { margin: 0; }
.soly-week-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.soly-week-step { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; min-height: 44px; }
.soly-week-step-text { display: flex; flex-direction: column; gap: 2px; flex: 1 1 240px; min-width: 0; }
.soly-week-step-line { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.soly-week-step-code { flex: none; white-space: nowrap; font: 500 13px/22px var(--font-mono); color: var(--secondary); }
.soly-week-step-line .cell-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.soly-week-end { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px 16px;
  padding: 12px 16px; border-top: 1px solid var(--hairline); }
.soly-week-more { font-size: 14px; color: var(--body); }
.soly-week-end .card-link { margin-left: auto; }

/* ---- Two shared components from Rinat's billing design (2026-10-16, FLOWS 7.351; WORKING_RULES 5: a look the
   house had nothing for, built from the tokens, named for its role, for any page).
   An alert card (.card.list-card.alert-card): a list card that asks for action before something can go ahead
   -- an amber frame, its heading line on the amber tint in the amber text, a note on the right of that line
   (.alert-card-note), the rows below on white as in any list card.
   A stat strip (.bil-stats.stat-strip): the stat cells of a card (.bil-stats / .bil-stat) framed as one card of
   their own, a hairline between the cells -- a page's key figures in one band. */
.card.alert-card { border-color: var(--amber); }
.alert-card > .list-head { background: var(--amber-tint); color: var(--amber-text); }
.alert-card > .list-head .list-head-title h2, .alert-card > .list-head .eyebrow { color: inherit; }
.alert-card-note { font-size: 14px; }
.bil-stats.stat-strip, .figures.stat-strip { background: var(--card); border: 1px solid var(--rule); border-radius: var(--r-card); }

/* ---- Three shared components from Rinat's design of a Soly process on the console (2026-10-17, FLOWS 7.365;
   WORKING_RULES 5: looks the house had nothing for, built from the tokens, named for their role, for any page).
   Figures (.figures > .figure): side by side, each a small label above its value -- in a heading line the title
   as one (its eyebrow above the h2) and each count as another (.figure-label, 12px in the stat card's body colour,
   above the value at the heading's 18px/600); framed by the stat strip (.figures.stat-strip) a band of counts,
   spread over its width. .tone-green or .tone-red colours a value whose label says what it is. Their type is the
   shared rules' (an axis label's, a hint's, the section title's), where their selectors stand.
   Facts (dl.facts): label/value pairs in one row that wraps, each label 12px above its 14px value.
   A step list (ol.step-list > li > details.step-fold): one row per step of a process -- its number in a
   violet-tinted circle (.step-num), its name (.cell-title) with its pill above its id (.cell-code-sub), on the
   right how far the runs came (.step-meter: the thin bar, under it a 12px line) and the chevron; at least 72px
   like a table row, a hairline between rows, the row's light violet on hover. Opened, its body (.step-body)
   under the text; one step is open at a time where the details share a name. */
.figures { display: flex; align-items: flex-end; flex-wrap: wrap; gap: 12px 32px; min-width: 0; }
.figure { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.figures.stat-strip { justify-content: space-between; padding: 14px 24px; }
.figure.tone-green strong { color: var(--green-text); }
.figure.tone-red strong { color: var(--red-text); }
.facts { display: flex; flex-wrap: wrap; gap: 12px 40px; margin: 0; }
.facts > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.facts dd { margin: 0; }
.step-list { list-style: none; margin: 0; padding: 0; }
.step-list > li + li { border-top: 1px solid var(--hairline); }
.step-fold > summary { display: grid; grid-template-columns: 28px minmax(0, 1fr) minmax(200px, 280px) 16px;
  align-items: center; gap: 8px 16px; min-height: 72px; padding: 12px 24px; box-sizing: border-box;
  cursor: pointer; list-style: none; }
.step-fold > summary::-webkit-details-marker { display: none; }
.step-fold > summary:hover { background: var(--violet-tint); }
.step-num { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px;
  border-radius: 50%; background: var(--violet-tint); color: var(--violet-text); font: 600 13px/1 var(--font-mono); }
.step-fold > summary:hover .step-num { background: var(--card); }
.step-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.step-name { display: flex; align-items: center; gap: 8px; min-width: 0; }
.step-name > .cell-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.step-meter { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.step-meter > .progress-bar.thin { flex: none; }
.step-meter-line { display: flex; justify-content: space-between; gap: 8px; white-space: nowrap; }
.step-meter-line strong { font-weight: 600; color: var(--ink); }
.step-meter-gone { color: var(--red-text); }
.step-body { display: flex; flex-direction: column; gap: 16px; padding: 4px 24px 20px 68px; }
.step-body > form { border-top: 1px solid var(--hairline); }
.step-body > form > .form-section { padding: 16px 0 0; }
.step-body > form > .card-actions { margin-top: 16px; }
@media (max-width: 720px) {
  .step-fold > summary { grid-template-columns: 28px minmax(0, 1fr) 16px; padding: 12px 16px; }
  .step-fold > summary > .form-more-chevron { grid-column: 3; grid-row: 1; }
  .step-meter { grid-column: 2 / 4; grid-row: 2; }
  .step-body { padding: 4px 16px 20px; }
}

/* ---- A scheduled part (Rinat's billing overview, 2026-10-16, FLOWS 7.356; WORKING_RULES 5): what is planned or
   scheduled and not yet invoiced, hatched in its series' colour over the series' lighter fill, in every chart that
   draws it (the house chart, static/js/billing.js: Spending on the client's page and Setup -> Invoices, Invoiced
   revenue on Billing -> Overview), and .hatched for its swatch in a legend. The word stays beside it in the legend
   and the figures stand in the chart's table: never the hatching alone. */
.hatched { background: repeating-linear-gradient(135deg, var(--secondary) 0 1.5px, transparent 1.5px 4px); }
/* A series' swatch before an eyebrow's word (the stat cells of Spending, the receivables' ages): it had no size
   outside a legend, so it did not show. */
.eyebrow > .swatch { margin-right: 6px; vertical-align: -1px; }
.bil-svg .bil-hatch { pointer-events: none; }
.bil-svg .bil-hatch-line { stroke-width: 2.5; }
.bil-svg .bil-hatch-line.series-1 { stroke: var(--violet); }
.bil-svg .bil-hatch-line.series-2 { stroke: var(--blue); }
.bil-svg .bil-hatch-line.series-4 { stroke: var(--amber); }

/* ---- Billing (docs/FLOWS.md 7.311): the console's Billing pages and the portal's Setup -> Invoices.
   Rinat's design in the house layout: a content block as tall as its content, grids aligned to the
   start, the shared list cards, tables, pills and switches; its own are the two-column Organisation
   and Agreements cards (the title and a line on the left, a bordered list of rows on the right, 16px
   padding, a hairline between rows), the bundle's facts, the console's Contract card (the same rows, the
   plan history under them; FLOWS 7.348) and the Spending chart (stacked bars in the series colours,
   planned parts lighter and hatched). */
.bil-heading-actions { display: flex; align-items: center; gap: 8px; flex: none; flex-wrap: wrap; }
.bil-heading-actions form { margin: 0; }
.bil-heading-actions .button, .bil-heading-actions .button.hairline { min-height: 40px; font-size: 14px; }
.bil-price { display: inline-flex; align-items: baseline; gap: 6px; flex: none; white-space: nowrap; }
.bil-bundle-body, .bil-contract { display: flex; flex-direction: column; gap: 10px; }
.bil-history { display: flex; flex-direction: column; gap: 8px; }
.bil-source, .bil-fact-sub, .bil-stat-sub { color: var(--secondary); font-size: 12px; }
.bil-source { display: block; margin-top: 2px; }
.bil-fact-sub { overflow-wrap: anywhere; }
.bil-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); border-top: 1px solid var(--hairline); }
.bil-fact { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 12px 14px 12px 0; }
.bil-fact-label { color: var(--body); font-size: 13px; }
.bil-doc { display: flex; gap: 14px; padding: 12px 16px; border: 1px solid var(--hairline);
  border-radius: var(--r-card); }
.bil-chart-controls { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.bil-series { display: inline-flex; gap: 8px; }
.bil-series .button[aria-pressed="false"] { color: var(--secondary); }
.bil-series .button[aria-pressed="false"] .swatch { opacity: .35; }
.bil-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); border-bottom: 1px solid var(--hairline); }
.bil-stat { display: flex; flex-direction: column; gap: 4px; min-height: 72px; padding: 14px 24px; text-decoration: none; }
.bil-stat + .bil-stat { border-left: 1px solid var(--hairline); }
.bil-chart { padding: 14px 24px 0; min-height: 240px; }
.bil-svg { display: block; width: 100%; height: 240px; }
.bil-svg .bil-grid { stroke: var(--hairline); stroke-dasharray: 3 3; }
.bil-svg .bil-axis { fill: var(--secondary); font: 500 11px/1 var(--font-mono); }
.bil-svg .bil-seg.series-1 { fill: var(--violet); }
.bil-svg .bil-seg.series-2 { fill: var(--blue); }
.bil-svg .bil-seg.series-4 { fill: var(--amber); }
.bil-svg .bil-seg.is-planned { opacity: .2; }
.bil-svg .bil-hit { fill: transparent; cursor: pointer; }
.bil-svg .bil-hit:hover, .bil-svg .bil-hit:focus-visible { fill: var(--violet-tint); fill-opacity: .5; }
.bil-svg .is-now .bil-axis { fill: var(--ink); font-weight: 600; }
.bil-chart-line { margin: 8px 24px 0; padding: 8px 12px; min-height: 34px; background: var(--canvas);
  border-radius: var(--r-control); font-size: 13px; color: var(--ink); }
.bil-table-fold { margin: 10px 24px 0; }
.bil-foot { margin: 10px 24px 16px; color: var(--secondary); font-size: 12px; }
.bil-row-actions { display: flex; gap: 6px; justify-content: flex-end; }
.bil-row-actions form { margin: 0; }
.bil-missing { color: var(--red-text); font-weight: 600; }
.bil-none { color: var(--secondary); }
.bil-split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2.4fr); gap: 24px; align-items: start; padding: 16px; }
.bil-split-head { display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
.bil-split-head h2 { margin: 0; }
.bil-rows { border: 1px solid var(--hairline); border-radius: var(--r-card); }
.bil-row + .bil-row { border-top: 1px solid var(--hairline); }
.bil-row-line { display: flex; align-items: center; gap: 16px; min-height: 56px; padding: 8px 16px; }
.bil-row-label { flex: 0 0 180px; font-weight: 600; color: var(--ink); font-size: 14px; white-space: nowrap; }
.bil-row-value { flex: 1 1 auto; min-width: 0; }
.bil-row-text { color: var(--body); font-size: 14px; overflow-wrap: anywhere; }
.bil-row-line > .button { flex: none; }
.bil-row-form { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 0 16px 12px 212px; }
.bil-row-form[hidden], .bil-doc-form[hidden] { display: none; }
.bil-row-input { flex: 1 1 260px; min-width: 0; }
.bil-docs { display: flex; flex-direction: column; gap: 8px; }
.bil-doc { align-items: center; min-height: 56px; padding-top: 8px; padding-bottom: 8px; }
.bil-doc > .icon { flex: none; color: var(--body); }
.bil-doc-text { display: flex; flex-direction: column; gap: 2px; flex: 1 1 auto; min-width: 0; }
.bil-doc-title { font-weight: 600; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bil-pdf { display: inline-flex; align-items: center; gap: 6px; flex: none; min-height: 32px; }
@media (max-width: 900px) {
  .bil-split { grid-template-columns: minmax(0, 1fr); }
  .bil-row-line { flex-wrap: wrap; }
  .bil-row-label { flex-basis: 100%; }
  .bil-row-form { padding-left: 16px; }
  .bil-stat + .bil-stat { border-left: 0; }
}

/* ---- The external form (docs/FLOWS.md 7.315, Rinat's design of 2026-10-11): the one shell of every page
   an outside person fills in through a link (templates/external_form_base.html) -- the client's name and the
   form's kind in the top bar, the language picker on the right; the supplier's questionnaire with its
   Progress card on the left, one card per question, the answers as tiles, the files as rows, the sticky
   footer with the save status. Tokens only: the dark theme follows the system (the shell sets data-theme). */
.xf-top { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 64px; padding: 12px 20px;
  box-sizing: border-box; background: var(--card); border-bottom: 1px solid var(--hairline); }
.xf-brand { display: flex; align-items: center; gap: 12px; min-width: 0; }
.xf-logo { height: 28px; width: auto; max-width: 140px; flex: none; }
.xf-org { font: 600 18px/1.2 var(--font-sans); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.xf-kind { flex: none; padding-left: 12px; border-left: 1px solid var(--hairline); font-size: 15px; color: var(--body); white-space: nowrap; }
.xf-lang { position: relative; display: inline-flex; align-items: center; gap: 8px; flex: none; color: var(--ink); }
.xf-lang > .icon { position: absolute; left: 12px; width: 18px; height: 18px; pointer-events: none; }
.xf-lang > .xf-caret { left: auto; right: 10px; width: 16px; height: 16px; }
.xf-lang select { height: 40px; min-width: 140px; padding: 0 36px 0 38px; border: 1px solid var(--hairline); border-radius: var(--r-control);
  background: var(--card); color: var(--ink); font: 500 14px/1 var(--font-sans); -webkit-appearance: none; appearance: none; cursor: pointer; }
.xf-lang select:hover { border-color: var(--field-rule); }
.xf-page { display: grid; grid-template-columns: 280px minmax(0, 1fr); gap: 32px; align-items: start; max-width: 1240px; margin: 0 auto;
  padding: 24px 20px 112px; box-sizing: border-box; }
.xf-side { position: sticky; top: 20px; display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.xf-progress { display: flex; flex-direction: column; gap: 10px; padding: 16px; }
.xf-progress-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.xf-progress-count { flex: none; font-size: 14px; font-weight: 600; }
.xf-bar { background: var(--neutral-tint); }
.xf-bar-fill { display: block; height: 100%; background: var(--green-deep); }
.xf-qlist { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.xf-qlink { display: flex; align-items: center; gap: 10px; min-height: 32px; padding: 0 6px; border-radius: var(--r-control);
  color: var(--ink); text-decoration: none; font-size: 14px; min-width: 0; }
.xf-qlink:hover { background: var(--violet-tint); }
.xf-qmark { flex: none; display: grid; place-items: center; width: 20px; height: 20px; box-sizing: border-box; border-radius: 50%;
  border: 1.5px solid var(--field-rule); color: #fff; }
.xf-qmark .icon { width: 14px; height: 14px; visibility: hidden; }
.xf-qlink.is-answered .xf-qmark { background: var(--green-deep); border-color: var(--green-deep); }
.xf-qlink.is-answered .xf-qmark .icon { visibility: visible; }
.xf-qcode { width: 32px; }
.xf-qtitle { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.xf-contact { margin: 0; padding: 0 6px; font-size: 13px; color: var(--body); overflow-wrap: anywhere; }
.xf-contact a { color: var(--violet-text); }
.xf-main { display: flex; flex-direction: column; gap: 16px; min-width: 0; max-width: 920px; }
.xf-main-alone { width: 100%; max-width: 760px; margin: 0 auto; padding: 24px 20px 48px; box-sizing: border-box; }
.xf-head { display: flex; flex-direction: column; gap: 10px; margin-bottom: 8px; }
.xf-head h1 { margin: 0; font: var(--text-h2); color: var(--ink); }
.xf-eyebrow { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 0; font-size: 12px; letter-spacing: .06em;
  text-transform: uppercase; color: var(--body); }
.xf-chip { flex: none; white-space: nowrap; letter-spacing: 0; text-transform: none; }
.xf-intro { margin: 0; max-width: 72ch; font: var(--text-body); color: var(--body); }
.xf-form { display: flex; flex-direction: column; gap: 16px; }
.xf-q { display: flex; flex-direction: column; gap: 16px; min-width: 0; scroll-margin-top: 20px; }
.xf-q-head { display: grid; grid-template-columns: 40px minmax(0, 1fr) auto; gap: 12px; align-items: start; }
.xf-q-code { font-size: 13px; color: var(--body); padding-top: 2px; white-space: nowrap; }
.pill.xf-required { flex: none; background: var(--card); color: var(--red-text); border: 1px solid var(--red-text); white-space: nowrap; }
.xf-q-body { display: flex; flex-direction: column; gap: 16px; min-width: 0; padding-left: 52px; }
.xf-choices { display: flex; flex-wrap: wrap; gap: 8px; }
.xf-tile { display: inline-flex; align-items: center; gap: 10px; min-height: 40px; padding: 0 16px; box-sizing: border-box;
  border: 1px solid var(--field-rule); border-radius: var(--r-control); background: var(--card); color: var(--ink);
  font: 500 14px/1 var(--font-sans); white-space: nowrap; cursor: pointer; }
.xf-tile input { flex: none; width: 16px; height: 16px; margin: 0; accent-color: var(--ink); cursor: pointer; }
.xf-tile:hover { border-color: var(--ink); }
.xf-tile:has(input:checked) { border-color: var(--ink); background: var(--canvas); box-shadow: inset 0 0 0 1px var(--ink); }
.xf-q.is-invalid .xf-tile { border-color: var(--red-text); background: var(--red-tint); }
.xf-q-error { display: flex; align-items: center; gap: 6px; margin: 0; font-size: 13px; font-weight: 500; color: var(--red-text); }
.xf-q-error[hidden] { display: none; }
.xf-q-error .icon { width: 16px; height: 16px; flex: none; }
.xf-optional { font-weight: 400; color: var(--secondary); }
.xf-q textarea.doc-entry { width: 100%; resize: vertical; }
.xf-files { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.xf-files[hidden] { display: none; }
.xf-file { display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 0 8px 0 16px; box-sizing: border-box;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--canvas); min-width: 0; }
.xf-file-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; }
.xf-file-remove { flex: none; display: grid; place-items: center; width: 28px; height: 28px; padding: 0; border: 0; border-radius: var(--r-control);
  background: transparent; color: var(--body); cursor: pointer; }
.xf-file-remove:hover { background: var(--neutral-tint); color: var(--ink); }
.xf-file-remove .icon { width: 16px; height: 16px; }
.xf-file.is-busy { opacity: .6; }
.xf-fixed { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.xf-text { margin: 0; white-space: pre-wrap; font-size: 14px; }
.xf-request { display: flex; flex-direction: column; gap: 12px; padding-top: 16px; border-top: 1px solid var(--hairline); }
.xf-request-name { font-weight: 600; font-size: 14px; }
.xf-request-grid { display: grid; grid-template-columns: 200px minmax(0, 1fr); gap: 16px; align-items: start; }
.card-actions.xf-footer { position: fixed; left: 0; right: 0; bottom: 0; z-index: 20; margin: 0; min-height: 72px; padding: 12px 20px;
  box-sizing: border-box; background: var(--card); border-top: 1px solid var(--hairline); }
.card-actions.xf-footer .button { min-height: 40px; font-size: 14px; }
.xf-status { margin: 0; min-width: 0; font-size: 14px; color: var(--body); }
.xf-status.is-error { color: var(--red-text); }
.xf-done { display: flex; flex-direction: column; gap: 8px; }
.xf-done-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
.xf-done-head h1, .xf-done-head h2, .xf-card-title { margin: 0; }
.xf-done-head > .icon { width: 24px; height: 24px; flex: none; color: var(--green-text); }
.xf-closed .xf-done-head > .icon { color: var(--amber-text); }
.xf-closed[data-key-unavailable] .xf-done-head > .icon { color: var(--red-text); }
@media (max-width: 900px) {
  .xf-page { grid-template-columns: minmax(0, 1fr); gap: 16px; padding: 16px 16px 160px; }
  .xf-side { position: static; }
  .xf-q-body { padding-left: 0; }
  .xf-q-head { grid-template-columns: auto minmax(0, 1fr); }
  .xf-q-head .xf-required { grid-column: 2; justify-self: start; }
  .xf-request-grid { grid-template-columns: minmax(0, 1fr); }
  .xf-main-alone { padding: 16px; }
}
@media (max-width: 560px) {
  .xf-top { padding: 12px 16px; flex-wrap: wrap; }
  .xf-kind { display: none; }
  .card-actions.xf-footer { flex-wrap: wrap; padding: 12px 16px; }
  .card-actions.xf-footer .xf-status { flex-basis: 100%; }
}
@media (prefers-reduced-motion: no-preference) {
  .xf-bar-fill { transition: width var(--t-base) var(--ease); }
}

/* the codes under a missing-statements row (requirements page, 2026-10-12) */
.missing-codes { display: block; margin-top: 2px; font: 500 12px/1.4 var(--font-mono); color: var(--secondary); }

/* ---- Two shared parts from Rinat's design of the pre-assessment's control drawer (2026-10-17, FLOWS 7.373;
   WORKING_RULES 5: looks the house had nothing for, built from the tokens, named for their role, for any page).
   A figure in amber (.figure.tone-amber), beside .tone-green and .tone-red: a value whose label says what it is,
   in the amber of a partly met or not proven verdict or a minor nonconformity.
   A step row (ol.step-list > li.step-row): a step that does not open -- its number (.step-num), its words
   (.step-row-text, the one growing column), its action on the right (a small button) --, 8px above and below,
   the step list's hairline between the rows. */
.figure.tone-amber strong { color: var(--amber-text); }
.step-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; font-size: 14px; line-height: 1.4; color: var(--ink); }
.step-row-text { flex: 1 1 auto; min-width: 0; }
.step-row > .step-num, .step-row > .button { flex: none; }

/* ---- A row that opens, from Rinat's design of a capability's From need to evidence (2026-10-17, FLOWS 7.375;
   WORKING_RULES 5: the house had this look only page by page -- the roadmap's steps, the console's rules --, so it
   is built here once from the tokens, named for its role, for any table). One tbody.row-fold holds a row and its
   fold (tr.row-fold-body, hidden while closed), which spans the columns after the first. The caret is a real
   button in the row's first cell (.row-fold-toggle: 28px, an aria-label that names what opens, aria-expanded and
   aria-controls; base.html's data-show-toggle opens and closes the fold; the shape of the risk levels' trash
   button), its chevron (.form-more-chevron) turning down when open. The row's cells sit in its middle; the groups
   alternate like zebra rows (#fff, #F7F8FA) with the fold in its row's band, no line between a row and its open
   fold and no hover tint on the fold; a table in the fold is framed (1px --table-rule, 4px). With it two additions
   to the shared step meter: its bar may be the two-part tree meter across the column (green the share that is
   done, amber the rest), and its line may name a gap in amber -- the words always say what the colours show. */
.row-fold-toggle:hover { background: var(--card); color: var(--ink); }
.row-fold-toggle[aria-expanded="true"] .form-more-chevron { transform: rotate(90deg); }
.data-table > tbody.row-fold > tr:not(.row-fold-body) > td { vertical-align: middle; }
.data-table > tbody.row-fold:nth-of-type(even) > tr > td { background: var(--canvas); }
.data-table > tbody.row-fold > tr:not(.row-fold-body):hover > td { background: var(--violet-tint); }
.data-table > tbody.row-fold > tr.row-fold-body:hover > td { background: var(--card); }
.data-table > tbody.row-fold:nth-of-type(even) > tr.row-fold-body:hover > td { background: var(--canvas); }
.data-table > tbody.row-fold > tr:has(+ tr.row-fold-body:not([hidden])) > td { border-bottom: 0; }
.data-table > tbody.row-fold > tr.row-fold-body > td { padding-top: 0; padding-bottom: 16px; }
.list-card .list-wrap > .data-table > tbody.row-fold:last-of-type > tr:has(+ tr.row-fold-body[hidden]) > td { border-bottom: 0; }
.row-fold-body .table-wrap { border: 1px solid var(--table-rule); border-radius: var(--r-card); }
.row-fold-body .table-wrap > .data-table > tbody > tr:last-child > td { border-bottom: 0; }
.step-meter > .tree-meter { width: auto; }
.step-meter-line strong.tone-amber { color: var(--amber-text); }

/* ---- Rows lined up in columns, from Rinat's design of a control's Statements (2026-10-19, FLOWS 7.387;
   WORKING_RULES 5: the house's row lists set each row on its own, so a longer code or state word pushed the rest
   of that row aside). The list (.row-columns, on a .cp-rows) is the grid and every row a subgrid of it, so each
   cell stands in one column with the same cell of every other row, whatever the words are in en, nl or de: the
   code and the state as wide as their widest, the two lines the one growing column (min-width 0, the ellipsis),
   the row's actions on the right; a row without an action leaves the last column empty. The row keeps its own
   look (padding, height, the hairline between); a pill keeps its own width. Measured on the list itself: below
   560px (a phone, a narrow window, an open Soly panel) the rows wrap as the house's rows do, the two lines under
   the code and the state. */
.row-columns { display: grid; grid-template-columns: max-content max-content minmax(0, 1fr) max-content; column-gap: 12px;
  container-type: inline-size; }
.row-columns > * { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; justify-items: start; }
.row-columns > * > .cp-row-text { justify-self: stretch; }
.row-columns > * > .cp-row-actions { justify-self: end; }
@container (max-width: 560px) {
  .row-columns > * { display: flex; flex-wrap: wrap; }
}

/* ------------------------------------------------ the dashboard's sections
   Rinat's design v9 (2026-10-19, FLOWS 7.386), built from the house's parts:
   the page is a run of sections (core/dashboard.rows, templates/portal.html),
   each its heading line (.dash-row-heading) and its rows, 14px apart; a
   heading stands 20px under what is above it and 10px over its cards. The
   stat bands are the shared .stat-grid.four. What the house had nothing for
   became the shared parts after this block: the spotlight, the share ring,
   the milestone track, the tone edge, the date tile and the warn tone. */
.dash-section { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
/* One column on a phone: a card as tall as its content again, not as the
   tallest card of the band. */
@media (max-width: 640px) { .equal { grid-auto-rows: auto; } .equal > * { height: auto; } }
.dash-section > .dash-row-heading { margin: 6px 0 -4px; }
.dash-section > .stat-grid { margin: 0; }
/* A head tile waiting for its counts: a soft bar where the eyebrow comes. */
.card.dash-deferred-eyebrow { display: block; flex: none; align-self: center; width: 160px; height: 12px; min-height: 0; padding: 0;
  border: 0; border-radius: var(--r-badge); background: var(--skeleton); }
.card.dash-deferred-eyebrow.failed { background: none; }

/* The spotlight (.card.spotlight): the one card on the strong surface
   (tokens.css --strong-*), the single thing to do first -- the dashboard's
   next step. A mono eyebrow in the accent, the title 18px/600, one line of
   13px under it, and the page's one violet button on the right. The same in
   both themes; any page's lead action may stand in it. */
.card.spotlight { display: flex; align-items: center; gap: 16px; background: var(--strong-bg); border-color: var(--strong-bg); color: var(--strong-text); }
.spotlight-text { display: flex; flex-direction: column; gap: 6px; flex: 1 1 auto; min-width: 0; }
.spotlight-eyebrow { font: 500 12px/1.4 var(--font-mono); letter-spacing: .08em; text-transform: uppercase; color: var(--strong-accent); }
h2.spotlight-title { margin: 0; color: var(--strong-text); }
.spotlight-sub { margin: 0; color: var(--strong-sub); }
.card.spotlight > .button { flex: none; white-space: nowrap; }
@media (max-width: 640px) { .card.spotlight { flex-direction: column; align-items: flex-start; } }

/* The share ring (templates/_share_ring.html, core/dashboard.ring): the
   parts of one whole as segments of a 96px ring, each in its meaning's own
   colour -- a risk level in the client's scale (the risk tokens), a status
   (good, attention, error), a series, the grey of the rest -- the whole in
   the middle. Never alone: its card shows the parts with their counts, the
   legend and the table, beside it (.share-ring-row) or under it. */
.share-ring { position: relative; display: inline-grid; place-items: center; flex: none; width: 96px; height: 96px; }
.share-ring > svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.share-ring circle { fill: none; stroke-width: 9; stroke: var(--disabled); }
.share-ring circle.share-ring-track { stroke: var(--skeleton); }
.share-ring-part.lvl-green { stroke: var(--risk-1); }
.share-ring-part.lvl-lightgreen { stroke: var(--risk-2); }
.share-ring-part.lvl-yellow { stroke: var(--risk-3); }
.share-ring-part.lvl-orange { stroke: var(--risk-4); }
.share-ring-part.lvl-red { stroke: var(--risk-5); }
.share-ring-part.lvl-darkred { stroke: var(--risk-6); }
.share-ring-part.good { stroke: var(--green); }
.share-ring-part.attention { stroke: var(--amber); }
.share-ring-part.error { stroke: var(--red); }
.share-ring-part.series-1 { stroke: var(--violet); }
.share-ring-part.series-2 { stroke: var(--blue); }
.share-ring-part.series-3 { stroke: var(--teal); }
.share-ring-part.series-4 { stroke: var(--amber); }
.share-ring-text { position: relative; display: flex; flex-direction: column; align-items: center; }
.share-ring-text small { color: var(--secondary); }
.share-ring-row { display: flex; align-items: center; gap: 18px; }
.share-ring-row > .dash-mini { flex: 1 1 auto; min-width: 0; }
@media (max-width: 480px) { .share-ring-row { flex-direction: column; align-items: stretch; } .share-ring-row > .share-ring { align-self: center; } }

/* The milestone track (.milestones; the roadmap's track, Rinat's design
   v9): an 8px track filled violet up to where the programme stands, a dot
   per milestone at the end of its part (done filled, the current one
   ringed), "You are here" over the track at that point, and under the
   track each milestone's name and count in its own part, ending under its
   dot. On a phone the names stand in two columns under the track. */
.milestones { --here: 0%; --marks: 1; display: flex; flex-direction: column; gap: 8px; padding: 0 8px; }
.milestones-here-label { position: relative; left: clamp(64px, var(--here), calc(100% - 64px)); width: max-content; max-width: 100%;
  margin: 0; transform: translateX(-50%); font: 500 13px/1.4 var(--font-sans); color: var(--ink); }
.milestones-here-label a { color: inherit; text-decoration: none; }
.milestones-here-label a:hover strong { text-decoration: underline; text-underline-offset: 2px; }
.milestones-here-label .mono { margin-left: 6px; font-size: 12px; color: var(--secondary); }
.milestones-track { position: relative; height: 8px; margin: 4px 0; border-radius: 4px; background: var(--skeleton); }
.milestones-fill { position: absolute; inset: 0 auto 0 0; width: var(--here); border-radius: 4px; background: var(--violet); }
.milestones-dot { position: absolute; top: 50%; left: var(--mark-at); width: 14px; height: 14px; margin: -7px 0 0 -7px; border-radius: 50%;
  background: var(--card); border: 2px solid var(--disabled); box-sizing: border-box; }
.milestones-dot.done { background: var(--violet); border-color: var(--violet); }
.milestones-dot.current { border-color: var(--violet); }
.milestones-here { position: absolute; top: 50%; left: var(--here); width: 18px; height: 18px; margin: -9px 0 0 -9px; border-radius: 50%;
  background: var(--card); border: 4px solid var(--violet); box-sizing: border-box; }
.milestones-marks { display: grid; grid-template-columns: repeat(var(--marks), minmax(0, 1fr)); gap: 0; list-style: none; margin: 0; padding: 0; }
.milestones-mark { min-width: 0; padding-left: 12px; text-align: right; }
.milestones-mark a { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; color: var(--body); text-decoration: none; }
.milestones-mark a:hover .milestones-name { color: var(--violet-text); }
.milestones-sub { font-size: 12px; line-height: 1.3; color: var(--secondary); white-space: nowrap; }
@media (max-width: 640px) {
  .milestones-here-label { left: 0; transform: none; }
  .milestones-marks { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 14px; }
  .milestones-mark { text-align: left; }
  .milestones-mark a { align-items: flex-start; }
}

/* A card's tone on its top edge (.card.tone-edge with .error, .attention
   or nothing): how pressing what it holds is -- red while something in it
   is past a date or urgent, amber while it waits for a human act, the rule's
   grey otherwise (the dashboard's attention causes, Rinat's design v9). The
   card says it in its words as well; the edge only adds the glance. */
.card.tone-edge { border-top: 3px solid var(--rule); }
.card.tone-edge.error { border-top-color: var(--red); }
.card.tone-edge.attention { border-top-color: var(--amber); }

/* The date tile (.date-tile): a day as a small calendar leaf -- the month in
   the violet band, the day under it -- beside what happens that day (the
   management review on the dashboard, Rinat's design v9). The words beside
   it give the date in full; the tile itself is hidden from a reader. */
.date-tile { display: inline-flex; flex-direction: column; flex: none; width: 48px; overflow: hidden; text-align: center;
  border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--card); }
.date-tile-month { padding: 2px 0; background: var(--violet); color: #fff; font: 600 12px/1.4 var(--font-sans); text-transform: uppercase; letter-spacing: .04em; }
.date-tile-day { padding: 4px 0 6px; color: var(--ink); }
.date-tile-row { display: flex; align-items: flex-start; gap: 14px; }
.date-tile-row > .dash-kv { flex: 1 1 auto; min-width: 0; margin: 0; }

/* A stat card's line that warns without being urgent (.stat-delta.warn):
   amber, between good (green) and attention (red) -- a report that went
   out late this year. A state in its value (.stat-value.good, beside the
   house's .stat-value.red) and a ring's tone (_stat_ring.html ring_tone)
   say the same: green for a share or a state that holds, red for one that
   is urgent -- in the AA shades, 3:1 and more on the card in both themes. */
.stat-delta.warn { color: var(--amber-text); }
.stat-value.good { color: var(--green-text); }
.stat-meter-value.good { stroke: var(--green-text); }
.stat-meter-value.attention { stroke: var(--red); }

/* The risk follow-up's bar under each question: the shared stacked gauge,
   as long as the row's total of the longest row's. */
.dash-followup th .distribution-gauge { display: flex; margin-top: 6px; }

/* The frameworks not started under Compliance per framework: one eyebrow
   and a neutral chip per framework with the controls that apply. */
.dash-fw-idle > .eyebrow { margin: 0; }
ul.chip-row { list-style: none; margin: 0; padding: 0; }
.chip-row .pill .mono { color: var(--secondary); }

/* The work list and Recently changed in the house's two lines: the row
   title, the mono second line; both truncate. A ring beside a card's title
   (the checklist's done of all) is 40px. */
.work_list .card-link, .recent .card-link { display: flex; flex-direction: column; gap: 2px; }
:is(.work_list, .recent) :is(.cell-title, .cell-code-sub) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.card-heading .stat-meter { flex: none; width: 40px; height: 40px; }
.checklist + .list-toggle { align-self: flex-start; margin-top: 10px; }
/* The console dashboard's attention points (Rinat, 2026-10-21): one folded card, closed by default, its
   count in the heading's eyebrow; the lines inside 8px apart. */
.attention-list { display: flex; flex-direction: column; gap: 8px; }
/* The "?" help (templates/console/_help.html, static/js/help_tip.js; FLOWS 7.423; console only): a 28px
   inline button (the contract's inline size) with the question-mark glyph of the 24 grid beside what it explains, and a small popover under it with a
   title and two to four short lines. Row first (WORKING_RULES §5): what a thing is, where it is stored,
   where it is active and its state stand in the row or card; the rest goes in here. */
.help-tip { position: relative; display: inline-flex; flex: none; vertical-align: middle; white-space: nowrap; }
.help-tip-button:hover, .help-tip-button[aria-expanded="true"] { color: var(--violet-text); }
.help-tip-button .icon { width: 20px; height: 20px; }
.help-tip-pop { position: absolute; top: calc(100% + 4px); left: 0; z-index: 60; display: flex; flex-direction: column; gap: 8px;
  width: 340px; max-width: calc(100vw - 32px); padding: 14px; white-space: normal; text-align: left;
  background: var(--card); border: 1px solid var(--hairline); border-radius: 4px; box-shadow: var(--shadow-float); }
.help-tip-pop.is-left { left: auto; right: 0; }
.help-tip-pop[hidden] { display: none; }
.help-tip-label { font-weight: 600; color: var(--ink); }
/* a title with its "?" at the end, on one line (a row's title, a card's heading) */
.help-tip-line { display: flex; align-items: center; gap: 6px; min-width: 0; }
.help-tip-line > :first-child { min-width: 0; }

/* ------------------------------------------------------------------------------------------------------------------
   The training player (docs/FLOWS.md 7.483; templates/_player_step.html, _player_cover.html). One step card and the
   wizard's footer, built from the house's own parts: .card, .step-bullet, .eyebrow, .wizard-footer, .cp-card-choice
   for a choice or an option, .form-fold for a reveal or a clue, .checklist for the rules and the steps, .pill for
   right and not right, the .segment track for the rating, .report.notice for the preview's line. What the house had
   no part for, added here once and named for its role, to be reused:
     .step-body     the body of a card that reads top to bottom: its blocks a column 16px apart (the form and detail
                    spacing), the paragraphs without margins of their own
     .choice-stack  a column of choice cards 8px apart (row to row): a scenario's choices, a question's options
     .code-sample   a block of example code (risky and safer), mono 13px on the canvas, scrolling sideways on a phone
   ------------------------------------------------------------------------------------------------------------------ */
.step-body { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.step-body p { margin: 0; }
.choice-stack { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.code-sample { margin: 0; padding: 10px 12px; overflow-x: auto; white-space: pre; background: var(--canvas);
  border: 1px solid var(--hairline); border-radius: var(--r-control); font: 400 13px/1.5 var(--font-mono); color: var(--ink); }
.code-sample code { padding: 0; border: 0; background: none; font: inherit; color: inherit; }

/* An IEC 62443-4-2 component's SL-C per FR on the OT asset's page (FLOWS 7.515): seven small selects in one row. */
.otr-slc-row { display: flex; flex-wrap: wrap; gap: 8px; }
.otr-slc-cell { display: flex; flex-direction: column; gap: 4px; flex: none; }

/* ------------------------------------------------------------------------------------------------------------------
   The training player's interaction blocks and engagement (docs/FLOWS.md 7.506; templates/_player_play.html,
   _player_message.html, _player_scene.html, _player_sprite.html, _player_medal.html, static/js/player.js). Built on the
   house's parts -- .card, .cp-card-choice, .segment, .pill with its words, .step-bullet, .checklist, .eyebrow, the
   shared 4px bar (.player-progress, with the bars above) -- and what the house had no part for, added here once and
   named for its role, to be reused by every module:
     .play-block      an interaction block's body: a column 16px apart
     .mock-message    a message as a mail program or a phone shows it (sender, address, time, subject, body, link,
                      attachment, the link's real address in a status line); its medium (email, sms, chat, call,
                      prompt, web) is data-medium
     .hotspot         a part of a mock message that can be marked, then what it was (a red flag found or missed, a
                      clean part marked or left alone) -- always with its words beside it, never the colour alone
     .play-findings   the explanations under the message, one row each
     .story-speech    a cast member and their words; .story-outcome and .story-ending what a decision led to, the
                      edge in its tone (best, fair, risky; good, mixed, poor) beside the words that name it
     .inbox-list      the triage's stack of messages, the house's alternating rows
     .round-list      the real-or-fake rounds; .order-list the steps to put in order with their move buttons
     .medal-row       the badge with its stars and its words; .closing the closing summary; .cast-row who the
                      person meets; .player-scene a scene of the house illustration (.ill-* its fills)
   Motion only where the person has not asked for less (prefers-reduced-motion).
   ------------------------------------------------------------------------------------------------------------------ */
.play-block { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.play-score, .play-feedback, .clock-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0; }
.player-scene { margin: 0; max-width: 560px; border-radius: var(--r-card); overflow: hidden; }
.player-scene svg { display: block; width: 100%; height: auto; }

.mock-message { display: flex; flex-direction: column; gap: 10px; min-width: 0; padding: 14px 16px; border: 1px solid var(--rule);
  border-radius: var(--r-card); background: var(--card); box-shadow: var(--shadow-float); }
.mock-top { display: flex; align-items: center; gap: 10px; min-width: 0; }
.mock-avatar { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; flex: none;
  border-radius: 50%; background: var(--violet-tint); color: var(--violet-text); font: 600 14px/1 var(--font-sans); }
.mock-from { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.mock-address, .mock-time { font: 400 12px/1.4 var(--font-mono); color: var(--secondary); overflow-wrap: anywhere; }
.mock-time { flex: none; white-space: nowrap; }
.mock-subject { padding-bottom: 10px; border-bottom: 1px solid var(--hairline); font: 600 15px/1.4 var(--font-sans); color: var(--ink); }
.mock-body { display: flex; flex-direction: column; gap: 8px; min-width: 0; font: 400 14px/1.6 var(--font-sans); color: var(--body); }
.mock-body p { margin: 0; overflow-wrap: anywhere; }
.mock-message:is([data-medium="sms"], [data-medium="chat"], [data-medium="call"]) .mock-body p { align-self: flex-start; max-width: 92%;
  padding: 10px 12px; border-radius: var(--r-card); background: var(--canvas); }
.mock-link { color: var(--violet-text); font-weight: 600; text-decoration: underline; text-underline-offset: 2px; }
.mock-attachment { display: inline-flex; align-items: center; gap: 6px; align-self: flex-start; padding: 6px 10px; border: 1px solid var(--hairline);
  border-radius: var(--r-control); font: 400 13px/1.3 var(--font-mono); color: var(--ink); }
.mock-attachment .icon { width: 16px; height: 16px; }
.mock-status { padding: 6px 10px; border-radius: var(--r-badge); background: var(--canvas); color: var(--secondary);
  font: 400 12px/1.4 var(--font-mono); overflow-wrap: anywhere; }
.mock-message:not(.is-review) .mock-status { display: none; }
.mock-message:not(.is-review):has(.mock-link:hover, .mock-link :focus-visible, .mock-link input:checked) .mock-status { display: block; }
.mock-url { display: flex; align-items: center; gap: 6px; min-width: 0; padding: 6px 10px; border: 1px solid var(--hairline);
  border-radius: var(--r-control); font: 400 13px/1.3 var(--font-mono); color: var(--ink); overflow-wrap: anywhere; }

.hotspot { border-radius: var(--r-badge); cursor: pointer; text-decoration: underline dotted var(--field-rule); text-underline-offset: 3px;
  -webkit-box-decoration-break: clone; box-decoration-break: clone; }
mark.hotspot { color: inherit; text-decoration: none; background: transparent; }
.hotspot:hover, .hotspot:has(input:checked) { background: var(--violet-tint); }
.hotspot:has(input:focus-visible) { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.hotspot.is-found { background: var(--red-tint); text-decoration: none; box-shadow: inset 0 -2px 0 var(--red); }
.hotspot.is-missed { background: var(--amber-tint); box-shadow: inset 0 -2px 0 var(--amber); }
.hotspot.is-false_alarm { background: var(--neutral-tint); text-decoration: none; box-shadow: inset 0 -2px 0 var(--disabled); }
.hotspot.is-clear { box-shadow: inset 0 -2px 0 var(--green); }
.play-findings, .story-path, .round-list, .order-list, .cast-row { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.finding { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border: 1px solid var(--hairline); border-radius: var(--r-control); }
.finding.is-found { border-color: var(--red); }
.finding-words { flex: 1; min-width: 0; }

.story-speech { display: flex; align-items: flex-end; gap: 12px; min-width: 0; }
.story-avatar { width: 72px; height: 84px; flex: none; }
.story-bubble { display: flex; flex-direction: column; gap: 6px; flex: 1; min-width: 0; padding: 12px 14px; border-radius: var(--r-card); background: var(--violet-tint); }
.story-outcome, .story-ending { display: flex; flex-direction: column; gap: 6px; padding: 12px 14px; border-left: 4px solid var(--hairline);
  border-radius: var(--r-control); background: var(--canvas); }
.story-outcome.is-best, .story-ending.is-good { border-left-color: var(--green); }
.story-outcome.is-ok, .story-ending.is-mixed { border-left-color: var(--amber); }
.story-outcome.is-poor, .story-ending.is-poor { border-left-color: var(--red); }
.story-ending h3 { margin: 0; }
.story-chosen { font-weight: 600; color: var(--ink); }
.story-path li, .cast-row li { display: flex; align-items: center; gap: 10px; min-width: 0; }
.story-path-words { flex: 1; min-width: 0; }

.inbox-list { overflow: hidden; }
.inbox-row { display: flex; align-items: flex-start; gap: 12px; padding: 12px 14px; border-top: 1px solid var(--hairline); background: var(--card); }
.inbox-row:first-child { border-top: 0; }
.inbox-row:nth-child(2n) { background: var(--canvas); }
.inbox-row.is-right, .round.is-right .mock-message { box-shadow: inset 4px 0 0 var(--green); }
.inbox-row.is-half { box-shadow: inset 4px 0 0 var(--amber); }
.inbox-row.is-wrong, .round.is-wrong .mock-message { box-shadow: inset 4px 0 0 var(--red); }
.inbox-text { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 0; }
.inbox-line { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; min-width: 0; }
.inbox-line .mock-time { margin-left: auto; }
.inbox-subject { overflow-wrap: anywhere; }
.inbox-preview { font: 400 13px/1.5 var(--font-sans); color: var(--secondary); overflow-wrap: anywhere; }
.play-choices { margin-top: 4px; }
.round-list { gap: 16px; }
.round { display: flex; flex-direction: column; gap: 8px; min-width: 0; }

.order-item { display: flex; align-items: center; gap: 10px; min-width: 0; padding: 10px 12px; border: 1px solid var(--field-rule);
  border-radius: var(--r-control); background: var(--card); }
.order-words { flex: 1; min-width: 0; }
.order-moves { display: inline-flex; gap: 6px; flex: none; }
.order-select { flex: none; width: 64px; }

.closing { display: flex; flex-direction: column; gap: 16px; padding-bottom: 16px; border-bottom: 1px solid var(--hairline); }
.medal-row { display: flex; align-items: center; gap: 16px; min-width: 0; }
.medal { width: 72px; height: 84px; flex: none; }
.medal-words { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.stars { display: inline-flex; gap: 4px; }
.stars .icon { width: 20px; height: 20px; fill: var(--hairline); stroke: none; }
.stars .icon.is-on { fill: var(--amber); }
.cast-row { flex-direction: row; flex-wrap: wrap; gap: 12px 16px; }
.cast-row li { font: 400 13px/1.3 var(--font-sans); color: var(--body); }
.cast-face { width: 44px; height: 44px; flex: none; border-radius: 50%; background: var(--violet-tint); }

.ill-skin-light { fill: var(--ill-skin-light); } .ill-skin-medium { fill: var(--ill-skin-medium); }
.ill-skin-tan { fill: var(--ill-skin-tan); } .ill-skin-deep { fill: var(--ill-skin-deep); }
.ill-hair-dark { fill: var(--ill-hair-dark); } .ill-hair-brown { fill: var(--ill-hair-brown); } .ill-hair-grey { fill: var(--ill-hair-grey); }
.ill-line, .ill-ink { fill: var(--ill-line); } .ill-paper { fill: var(--ill-paper); } .ill-suit { fill: var(--ill-suit); } .ill-scarf { fill: var(--ill-scarf); }
.ill-violet { fill: var(--violet); } .ill-blue { fill: var(--blue); } .ill-teal { fill: var(--teal); } .ill-amber { fill: var(--amber); }
.ill-green { fill: var(--green); } .ill-red { fill: var(--red); } .ill-tint { fill: var(--violet-tint); }
.ill-wall { fill: var(--ill-wall); } .ill-floor { fill: var(--ill-floor); } .ill-desk { fill: var(--ill-desk); } .ill-desk-leg { fill: var(--ill-desk-leg); }
.ill-night { fill: var(--ill-night); } .ill-night-window { fill: var(--ill-night-window); } .ill-moon, .ill-star { fill: var(--ill-moon); }
.ill-sofa { fill: var(--ill-sofa); } .ill-sofa-arm { fill: var(--ill-sofa-arm); }
.ill-screen-glow { fill: var(--ill-screen-glow); } .ill-medal-face { fill: var(--ill-medal-face); }
.ill-stroke, .ill-stroke-ink, .ill-stroke-white, .ill-stroke-paper, .ill-stroke-violet, .ill-stroke-soft, .ill-stroke-frame { fill: none; stroke-linecap: round; stroke-linejoin: round; }
.ill-stroke { stroke: var(--ill-line); stroke-width: 2.4; }
.ill-stroke-ink { stroke: var(--ill-line); stroke-width: 4; }
.ill-stroke-paper { stroke: var(--ill-white); stroke-width: 3; }
.ill-stroke-violet { stroke: var(--violet); stroke-width: 3; }
.ill-stroke-soft { stroke: var(--ill-desk); stroke-width: 4; }
.ill-stroke-frame { stroke: var(--ill-night); stroke-width: 4; }
@media (prefers-reduced-motion: no-preference) {
  .hotspot { transition: background-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease); }
  .ill-buzz { animation: ill-buzz 1.6s var(--ease) infinite; }
  @keyframes ill-buzz { 0%, 100% { opacity: .25; } 50% { opacity: 1; } }
}
@media (max-width: 480px) {
  .story-avatar { width: 52px; height: 61px; }
  .medal { width: 56px; height: 66px; }
  /* a phone: the choices share the row's width, the inbox's avatar gives its room to the words */
  .play-choices .segment { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); width: 100%; }
  .play-choices .segment-button { justify-content: center; padding: 0 var(--s-2); }
  .inbox-row > .mock-avatar { display: none; }
}

/* ================================================================================================================
   Looks that were style attributes (2026-10-31; core/csp.py: style-src holds no 'unsafe-inline', so the browser
   ignores every style attribute and every <style> without the response's nonce). Each class is named for its role
   and reused; a value from the data goes into data-pct or data-vars (static/js/style_data.js), never a class per
   value. Grouped by kind: spacing, rows, fields, cards and blocks, tables, lists, folds and editors.
   ================================================================================================================ */
/* Spacing. The space above, below, before or after a block whose parent sets no gap: a step of the spacing scale
   (§23), the token's number in the name; 10px is "heading to content", 14px the dashboard's card gap. None where the
   block's own class or the browser gives one. A row's gap, a step of the scale. */
.space-above-1 { margin-top: var(--s-1); }
.space-above-2 { margin-top: var(--s-2); }
.space-above-heading { margin-top: 10px; }
.space-above-3 { margin-top: var(--s-3); }
.space-above-card { margin-top: 14px; }
.space-above-4 { margin-top: var(--s-4); }
.space-below-2 { margin-bottom: var(--s-2); }
.space-below-3 { margin-bottom: var(--s-3); }
.space-below-4 { margin-bottom: var(--s-4); }
.space-before-2 { margin-left: var(--s-2); }
.space-after-1 { margin-right: var(--s-1); }
.flush { margin: 0; }
.flush-top { margin-top: 0; }
.flush-below { margin-bottom: 0; }
.gap-1 { gap: var(--s-1); }
.gap-2 { gap: var(--s-2); }

/* Rows. The last thing of a flex row pushed to its end; the free room of a toolbar that pushes what follows it there;
   the one growing text of a row, which may shrink so the labels beside it keep their size (§23); a row's items on
   their middle or at their top; a form of row buttons inline in a table cell; a field over two columns of a .form
   grid (as .form-span-2 is in a .form-grid); a form of one column. */
.push-end { margin-left: auto; }
.spacer { flex: 1; }
.row-text { min-width: 0; }
.middle-aligned { align-items: center; }
.top-aligned { align-items: flex-start; }
.inline-row { display: inline-flex; }
.form > .form-span-2 { grid-column: span 2; }
.single-column { grid-template-columns: 1fr; }
/* A row of pills a small step apart, wrapping; a checkbox with its words; a confirm and its cancel side by side
   outside a card's action row; the way on from a page that cannot be used yet; a line of words with its action at
   the end; the one-line forms of a panel, one under the other. */
.pill-row { display: flex; gap: var(--s-1); flex-wrap: wrap; }
.check-line { display: flex; align-items: center; gap: var(--s-1); }
.button-pair { display: flex; gap: var(--s-2); }
.handoff-row { display: flex; gap: .6rem; margin-top: .9rem; }
.split-row { display: flex; align-items: center; justify-content: space-between; gap: var(--s-4); margin-bottom: var(--s-1); }
.form-stack { display: flex; flex-direction: column; gap: var(--s-3); }

/* Fields. As wide as the cell or form; a code typed in capitals; kept to the width of what it holds: a few
   characters (80), a code or a short choice (140), a short mark (160), a section choice (220), a title (260), a level
   choice (280), free text in a row (320), a list of codes in a table cell (420) -- holding inside a panel and a form
   field too, whose own rules would widen them; a colour picker's swatch; fields stacked a step apart; a label set
   above its control; a picker's cell and the picker growing beside its button. */
.field-full { width: 100%; }
.field-upper { text-transform: uppercase; }
.field-short { width: 80px; }
.field-code, .panel .field-code { max-width: 140px; }
.field-mark, .form-field .field-mark { width: 160px; }
.field-choice { max-width: 220px; }
.field-phrase, .panel .field-phrase { max-width: 260px; }
.field-level { width: 280px; }
.field-limited { max-width: 320px; }
.field-list { max-width: 420px; }
input.doc-entry.field-colour[type="color"] { width: 56px; padding: 2px; }
.field-stack { display: grid; gap: var(--s-2); }
.stacked-label { display: block; }
.picker-cell { min-width: 200px; }
.picker-field { flex: 1; min-width: 160px; }

/* Cards and blocks. A card for one short form or report (640) or for one notice and its way on (560); a block on the
   canvas inside a panel; a block divided from the one above by a hairline, a fold the same way with its summary bold;
   a framed block of numbered instructions; a long value that breaks where it must; an example shown as it will read,
   not to be clicked into; the line that introduces the table under it; the first line on a document's paper. */
.card-narrow { max-width: 640px; }
.card-slim { max-width: 560px; }
.panel > .panel-well { padding: var(--s-3); }
.divided-block { border-top: 1px solid var(--hairline); padding: var(--s-3) 0; }
.divided-fold { border-top: 1px solid var(--hairline); padding: var(--s-2) 0; }
.divided-fold > summary { font-weight: 600; }
.instruction-box { border: 1px solid var(--hairline); border-radius: var(--r-card); padding: var(--s-4) 1.2rem; }
.wrap-anywhere { overflow-wrap: anywhere; }
.inert-preview { pointer-events: none; }
.table-lead { margin: var(--s-2) 0 .2rem; }
.paper-lead { margin: 1.2rem 0 var(--s-1); }
/* The icon sprite: drawn nowhere, its symbols used by <use href="#i-...">. */
.icon-sprite { position: absolute; }

/* Tables. The key column of a table of facts (220; wider for long keys, narrower for a role's pill); the short code
   column (a version number); the column with a row's title (40%); the first cell of a tree row, indented by its depth
   (data-vars="indent:16px"); a form that flows inline with the words of an action cell, which draws its forms
   inline-flex. */
.label-column { width: 220px; }
.label-column-wide { width: 260px; }
.label-column-narrow { width: 180px; }
.code-column { width: 70px; }
.cell-wide { width: 40%; }
.data-table > tbody > tr > td.tree-indent { padding-left: calc(14px + var(--indent, 0px)); }
td.actions > .inline-form { display: inline; }

/* Lists. Bulleted, flush with the card's words; numbered in a fold, and the note under it at its indent; the points
   to read before a confirm that cannot be undone, a step under their heading or .2rem under it; numbered
   instructions; a long list of ticks that scrolls inside itself. */
.list-flush { margin: 0; padding-left: 1.2rem; }
.fold-list { margin: var(--s-2) 0 var(--s-1); padding-left: 1.4rem; }
.fold-note { margin-left: 1.1rem; }
.loose-list { margin: var(--s-2) 0 var(--s-4) 1.2rem; line-height: 1.9; }
.consequence-list { margin: .2rem 0 var(--s-4) 1.2rem; line-height: 1.9; }
.instruction-text { margin: var(--s-1) 0 0 1.2rem; line-height: 1.9; }
.tick-list-scroll { max-height: 220px; overflow: auto; }

/* Folds and switches. A summary that opens and closes a fold, read as a label (bold) or not; a group of switches in a
   fold, a hairline above, its summary with the group's own switch beside the words, the switches as framed tiles in a
   grid (the capabilities of a client and of a bundle). */
.opens-fold { cursor: pointer; }
.fold-label { cursor: pointer; font-weight: 600; }
.toggle-group { border-top: 1px solid var(--hairline); padding: var(--s-1) 0; }
.toggle-group > .fold-label { display: flex; align-items: center; gap: var(--s-2); }
.toggle-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: var(--s-2); margin-top: var(--s-2); }
.toggle-option { display: flex; align-items: center; gap: var(--s-2); border: 1px solid var(--hairline); border-radius: var(--r-card);
  padding: var(--s-2) var(--s-3); cursor: pointer; }

/* Editors. Sized for a short text and for a long one; an editor's text shown to read, without its frame. */
.editor-short { min-height: 160px; }
.editor-tall { min-height: 280px; }
.frameless { border: none; padding: 0; }

/* Stand-alone pages and the flow drawing. */
/* A whole page that only reports (403, 404, 429, 500): one card in the middle of the screen. Here and not in the
   page, since the 500 page renders without a request and so without the nonce. The empty state is one left-aligned
   row everywhere else (§23); a page that carries only this report reads better as one column: glyph, title, one
   sentence, then the buttons. So the row layout is undone here. */
.report-ground { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: var(--s-6); }
.report-card { max-width: 26rem; text-align: center; display: flex; flex-direction: column; gap: var(--s-4); }
.report-card .is-empty { flex-direction: column; align-items: center; text-align: center; gap: var(--s-3);
  padding: var(--s-6) var(--s-4) var(--s-4); min-height: 0; }
.report-card .is-empty .disc { width: 44px; height: 44px; border-radius: var(--r-card); }
.report-card .is-empty .disc svg { width: 24px; height: 24px; }
.report-card .is-empty h1 { font-size: 18px; }
.report-card .is-empty p { font-size: 14px; max-width: 34ch; }
.report-actions { display: flex; flex-direction: column; align-items: center; gap: var(--s-2); margin-top: var(--s-2); }
.report-wait { font-family: "IBM Plex Mono", monospace; font-size: 12px; }
/* The flow drawing on a page (core/flow_svg.py, PAINTS): as wide as its box, no taller than the page's cap and never
   below its smallest scale (the two values the root hands over); every piece painted by its class in the page's
   tokens, so it follows the dark theme. The PDF's plain drawing carries the same values as attributes. */
svg.flow-svg { display: block; width: auto; height: auto; max-width: 100%; min-width: var(--flow-min-width);
  max-height: max(var(--flow-max-height, 420px), var(--flow-min-height)); margin: 0 auto; }
.flow-svg .fl-lane-strip { fill: var(--canvas); stroke: none; }
.flow-svg .fl-lane-rule { stroke: var(--hairline); stroke-width: 1; }
.flow-svg .fl-lane-frame { fill: none; stroke: var(--hairline); stroke-width: 1; }
.flow-svg .fl-lane-name { font-family: var(--font-mono); font-weight: 500; letter-spacing: .08em; fill: var(--body); }
.flow-svg .fl-edge-line { fill: none; stroke: var(--body); stroke-width: 1.5; stroke-linejoin: round; }
.flow-svg .fl-edge-head { fill: var(--body); stroke: none; }
.flow-svg .fl-shape-decision { fill: var(--violet-tint); stroke: var(--violet-text); stroke-width: 1; }
.flow-svg .fl-shape-end { fill: var(--canvas); stroke: var(--hairline); stroke-width: 1; }
.flow-svg .fl-shape-box, .flow-svg .fl-label-chip { fill: var(--card); stroke: var(--hairline); stroke-width: 1; }
.flow-svg .fl-shape-side { stroke: var(--hairline); stroke-width: 1; }
.flow-svg .fl-title, .flow-svg .fl-label-text { font-weight: 500; fill: var(--ink); }
.flow-svg .fl-ring { fill: var(--card); stroke: var(--violet-text); stroke-width: 1; }
.flow-svg .fl-ring-number { font-family: var(--font-mono); font-weight: 600; fill: var(--violet-text); }
.flow-svg .fl-owner-ring { fill: var(--card); stroke: var(--rule); stroke-width: 1; }
.flow-svg .fl-owner-initials { font-family: var(--font-mono); font-weight: 600; fill: var(--body); }
.flow-svg .fl-label-halo { fill: var(--card); stroke: none; }
