/* =============================================================================
   mh-casenotes.css - THE CASE NOTES SECTION.
   Aug 19 2026. CEO: "It is a top-level section... this is a very important section."

   SCOPED TO .cn- ONLY. The prefix was grepped before it was claimed - nothing else
   in the app owns it. The section's SHELL (.cl-wrap / .cl-side / .cl-item /
   .cl-scroll / .cl-seclbl / .phead / .pl-sub) is deliberately NOT redefined here:
   Case Notes wears the same views panel Clients and Program wear, so it must read
   from the same rules. Only what is genuinely new to this section lives here.

   DARK MODE IS body.dark, and it redefines ink / muted / surface / line / cream-2 /
   ctrl-* / shadow - but NOT --mh-slate. Text painted with --mh-slate stays
   dark-on-dark. Every text colour here uses --mh-ink or --mh-muted for that reason.
   --mh-danger is deliberately the same in both modes, per the design brief.

   Tokens only - no literal colours. The app carries a real dark mode and a root
   zoom, so a hard-coded hex or a bare vh here would break one of them.
   ============================================================================= */

/* ---- the note journal: SUPERSEDED (CASENOTES-07, Aug 20 2026) --------------
   .cn-list / .cn-note / .cn-head / .cn-subject / .cn-when / .cn-title / .cn-body /
   .cn-foot / .cn-by are GONE. The note list is now .idgrid + .idcard - the
   household KPI card, worn unchanged (CEO: "same design same interface").
   The rules are deleted rather than left behind, because a dead selector is the
   next person's evidence that a component still exists.

   .cn-title and .cn-body are gone with them - the card has .cn-cardtitle and
   .cn-cardbody instead.

   BUT .cn-list / .cn-note / .cn-head / .cn-subject / .cn-when / .cn-foot / .cn-by
   ARE KEPT BELOW, because the TRANSFERS worklist still wears them. A transfer card
   is a decision to make, not a record to browse: it is deliberately a compact row
   with no photo and no note text (sp_GetMyCaseNoteTransfers returns neither), so
   turning it into an .idcard would promise a record it cannot show. Deleting these
   outright would have left that whole view unstyled - caught before it shipped.
   --------------------------------------------------------------------------- */

/* ---- the TRANSFER worklist row (these six are now used ONLY there) --------- */
.mh-app .cn-list { display: flex; flex-direction: column; gap: 10px; }
.mh-app .cn-note {
    background: var(--mh-surface);
    border: 1px solid var(--mh-line);
    border-radius: 14px;
    padding: 14px 16px;
    box-shadow: var(--mh-shadow-sm);
    transition: box-shadow .15s ease, border-color .15s ease;
}
.mh-app .cn-note:hover { border-color: var(--mh-ctrl-ico); }
.mh-app .cn-head { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 8px; }
.mh-app .cn-head .cn-subject { font-weight: 700; font-size: 14.5px; color: var(--mh-ink); }
.mh-app .cn-head .cn-when { margin-left: auto; font-size: 12.5px; color: var(--mh-muted); white-space: nowrap; }
.mh-app .cn-foot { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.mh-app .cn-by { font-size: 12.5px; color: var(--mh-muted); }
.mh-app .cn-by b { color: var(--mh-ink); font-weight: 600; }
@media (max-width: 900px) {
    .mh-app .cn-head { flex-wrap: wrap; }
    .mh-app .cn-head .cn-when { margin-left: 0; width: 100%; }
}
/* The subject KIND - Client / Household / Program. A note that belongs to no single
   record is exactly why this section exists, so the kind is stated on every card. */
.mh-app .cn-kind {
    font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
    padding: 3px 8px; border-radius: 999px;
    background: var(--mh-cream-2); color: var(--mh-muted);
    white-space: nowrap;
}
.mh-app .cn-kind.client    { background: rgba(78,124,114,.12);  color: var(--mh-ctrl-accent); }
.mh-app .cn-kind.household { background: rgba(78,124,114,.12);  color: var(--mh-ctrl-accent); }
.mh-app .cn-kind.program   { background: rgba(78,124,114,.12);  color: var(--mh-ctrl-accent); }
/* THE CHIP. Its `svg { width:13px; height:13px }` below is NOT optional: an inline
   SVG with only a viewBox and no width falls back to the CSS default of 300x150, so
   losing that one line made a two-chip row 949px TALL and stretched every card in
   its grid row to 1233px. Measured, not guessed. */
.mh-app .cn-chip {
    display: inline-flex; align-items: center; gap: 5px;
    font-size: 11.5px; font-weight: 600;
    padding: 3px 9px; border-radius: 999px;
    background: var(--mh-cream-2); color: var(--mh-muted);
    white-space: nowrap;
}
.mh-app .cn-chip svg { width: 13px; height: 13px; }
.mh-app .cn-chip.conf { background: rgba(176,70,60,.12); color: var(--mh-danger); }
.mh-app .cn-chip.due     { background: rgba(78,124,114,.12); color: var(--mh-ctrl-accent); }
.mh-app .cn-chip.overdue { background: rgba(176,70,60,.12); color: var(--mh-danger); }

/* ---- counts on the views panel: REMOVED (POLISH, Aug 20 2026) -------------
   The CEO, 19 Aug: "the way you add those KPI cards, that is not our standard -
   we will change it to our default KPI cards that are located everywhere in
   Household, Clients, Program."

   .cn-count was that non-standard thing: a pill invented for this one rail. Every
   figure now lives in `.kpi-strip` at the top of the body - the app's own read-only
   tile, defined in mh-theme.css and already worn by Program's sessions tab. The
   rules are deleted rather than left behind, because a dead selector is the next
   person's evidence that a component still exists.

/* ---- empty state --------------------------------------------------------- */
/* Same anatomy as .pg-empty so the section does not invent a second way of
   saying "there is nothing here". */
.mh-app .cn-empty { text-align: center; padding: 90px 20px; }
.mh-app .cn-empty .ic {
    width: 64px; height: 64px; border-radius: 50%;
    background: var(--mh-cream-2); display: inline-grid; place-items: center;
    margin-bottom: 14px; color: var(--mh-muted);
}
.mh-app .cn-empty h3 { font-family: var(--mh-font-head); font-size: 20px; color: var(--mh-ink); margin-bottom: 6px; }
.mh-app .cn-empty p  { color: var(--mh-muted); font-size: 13.5px; max-width: 420px; margin: 0 auto; }

/* ---- responsive ---------------------------------------------------------- */
@media (max-width: 900px) {
    .mh-app .cn-head { flex-wrap: wrap; }
    .mh-app .cn-head .cn-when { margin-left: 0; width: 100%; }
}

/* =============================================================================
   CASE NOTE DETAIL - the DetailShell host body.

   SCOPED UNDER #mhDetail, exactly like the shell's own .pd-card family in
   detail-view.css, because that is where the shell's local tokens (--f-focus-bg,
   --line, --r-lg, --ink-*, --brand-600) are defined. A card written outside that
   scope loses every one of them and renders unstyled.

   Modelled on .pd-card / .pd-ch rather than invented: same white panel, same
   hairline, same 18/19px padding, same 11.5px uppercase heading with a 16px
   brand-stroked glyph. A sixth host must not introduce a sixth card design.
   ============================================================================= */
#mhDetail .cnd-card{
  background:var(--f-focus-bg); border:1px solid var(--line); border-radius:var(--r-lg);
  padding:18px 19px; display:flex; flex-direction:column; min-width:0; margin-bottom:16px;
}
#mhDetail .cnd-card:last-child{margin-bottom:4px}
#mhDetail .cnd-ch{display:flex;align-items:center;gap:10px;margin-bottom:15px}
#mhDetail .cnd-ch h4{margin:0;font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-3)}
#mhDetail .cnd-ci{display:inline-flex;flex:none}
#mhDetail .cnd-ci svg{width:16px;height:16px;flex:none;stroke:var(--brand-600);stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}

/* THE NOTE BODY. A caseworker's paragraph, printed as written - pre-wrap keeps the
   line breaks they typed, because in a case note a new line is usually a new event. */
#mhDetail .cnd-body{
  font-size:14.5px; line-height:1.65; color:var(--ink-1);
  white-space:pre-wrap; word-break:break-word;
}

/* CONFIDENTIAL, at the TOP of the note. Whoever opens this needs to know before
   they read it, not after - so it is a banner, not a fact row. */
#mhDetail .cnd-conf{
  display:flex; align-items:center; gap:9px; margin:0 0 14px;
  padding:10px 13px; border-radius:10px;
  background:var(--danger-bg); border:1px solid rgba(192,71,63,.22);
  color:var(--danger-ink); font-size:13px; font-weight:650;
}
#mhDetail .cnd-conf svg{width:15px;height:15px;flex:none}

#mhDetail .cnd-outcome{
  margin-top:16px; padding-top:14px; border-top:1px solid var(--line);
  font-size:14px; line-height:1.6; color:var(--ink-2);
}
#mhDetail .cnd-outcome-l{
  font-size:11.5px; font-weight:800; letter-spacing:.09em; text-transform:uppercase;
  color:var(--ink-3); margin-bottom:6px;
}

/* FOLLOW-UP. The date is the headline; whether it has passed is the point. */
#mhDetail .cnd-follow{display:flex; flex-direction:column; gap:3px}
#mhDetail .cnd-follow-d{font-size:17px; font-weight:750; color:var(--ink-1); letter-spacing:-.01em}
#mhDetail .cnd-follow-s{font-size:13px; font-weight:600; color:var(--brand-600)}
#mhDetail .cnd-follow.over .cnd-follow-d{color:var(--danger-ink)}
#mhDetail .cnd-follow.over .cnd-follow-s{color:var(--danger)}

/* DEFINITION GRID - label over value, the brief's named component. Two columns at
   1280 and one below 900, obeying the 3-column cap's spirit: never auto-fill. */
#mhDetail .cnd-defs{display:grid; grid-template-columns:1fr 1fr; gap:15px 22px}
#mhDetail .cnd-def{min-width:0}
#mhDetail .cnd-def-k{
  font-size:11.5px; font-weight:800; letter-spacing:.07em; text-transform:uppercase;
  color:var(--ink-3); margin-bottom:4px;
}
#mhDetail .cnd-def-v{font-size:14px; font-weight:600; color:var(--ink-1); overflow-wrap:anywhere}

/* The "a case note is a signed journal entry ..." line under Details was removed on 18 Sep 2026
   (owner: "remove the hint text on the Details section"). Nothing draws .cnd-note-hint any more. */

@media (max-width:900px){
  #mhDetail .cnd-defs{grid-template-columns:1fr}
}

/* =============================================================================
   COMMENTS ON THE CASE-NOTE FILE (CEO, 26 Aug 2026).

   "Open a new TAB next to the NOTES and name it COMMENTS."

   DELIBERATELY QUIETER THAN A NOTE. A case note is a signed journal entry and its
   card carries the weight to say so; a comment is a message to a colleague. Same
   tokens, less of them - no card of its own, no lamp, no chips, no footer. If the
   two ever look alike on this screen, the tab has failed at the one job it was
   created for.

   PREFIX CHECKED BEFORE IT WAS CLAIMED: nothing in this app used .cnd-cmt*.
   ============================================================================= */
#mhDetail .cnd-cmtadd{margin-bottom:16px}
#mhDetail .cnd-cmtadd .icf.area textarea{min-height:76px}
#mhDetail .cnd-cmtacts{display:flex; justify-content:flex-end; margin-top:10px}

/* ---- @-MENTION PICKER (Aug 31 2026) ------------------------------------------
   PREFIX CHECKED BEFORE IT WAS CLAIMED: nothing in this app used .cnd-mention*.
   It is NOT a reuse of .cl-mention* even though both render inside #mhDetail - that
   set is owned by client-detail-view.css, and sharing it would mean a change to the
   Client Record's picker silently moved this one. Teams (.tm-), Student Detail (.sd-)
   and Client Record (.cl-) each own their prefix; this is the fourth.

   justify-content:flex-start IS LOAD-BEARING. MudBlazor.min.css ships a bare
   `button{justify-content:center}`, and a bare element selector loses to a class ONLY
   if the class actually declares the property - `text-align:left` does not, because
   text-align does not govern a flex main axis. That is exactly the defect the CEO
   reported on the Client Record picker on 31 Aug 2026, and it is why this rule names
   the property instead of relying on the default. */
#mhDetail .cnd-cmtadd{position:relative}
#mhDetail .cnd-mentionpop{
  position:absolute; left:0; top:calc(100% + 6px); z-index:90; width:min(320px,100%);
  background:var(--f-focus-bg); border:1px solid var(--line); border-radius:var(--r-md);
  box-shadow:var(--f-focus-sh); overflow:hidden}
/* The composer sits at the TOP of the comments card with the whole list below it, so
   the menu always opens downward; the markup pins mh-pop-below and this pair keeps the
   shared MHmentions.place() contract honoured if it is ever wired here. */
#mhDetail .cnd-mentionpop.mh-pop-below{top:calc(100% + 6px); bottom:auto}
#mhDetail .cnd-mentionpop.mh-pop-above{bottom:calc(100% + 6px); top:auto}
#mhDetail .cnd-mentionscroll{max-height:232px; overflow-y:auto; padding:5px}
#mhDetail .cnd-mentionopt{
  display:flex; align-items:center; justify-content:flex-start; gap:9px; width:100%;
  padding:8px 9px; border:none; border-radius:var(--r-sm); background:none; cursor:pointer;
  text-align:left; font:inherit; color:var(--ink-1)}
#mhDetail .cnd-mentionopt:hover,#mhDetail .cnd-mentionopt.on{background:var(--brand-tint)}
#mhDetail .cnd-mentionav{
  width:26px; height:26px; flex:none; border-radius:50%; display:grid; place-items:center;
  font-size:10.5px; font-weight:800; color:#fff}
#mhDetail .cnd-mentionnm{
  font-size:13px; font-weight:700; color:var(--ink-1);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis}

#mhDetail .cnd-cmtlist{display:flex; flex-direction:column}

/* SEPARATED BY A RULE, NOT BOXED. A stream of boxes reads as a stack of records;
   a stream of paragraphs reads as a conversation, which is what this is. */
#mhDetail .cnd-cmt{padding:13px 0; border-top:1px solid var(--line); min-width:0}
#mhDetail .cnd-cmt:first-child{border-top:0; padding-top:2px}

#mhDetail .cnd-cmt-h{display:flex; align-items:center; gap:9px; margin-bottom:5px; flex-wrap:wrap}
#mhDetail .cnd-cmt-who{font-size:13.5px; font-weight:750; color:var(--ink-1)}
#mhDetail .cnd-cmt-when{font-size:12px; font-weight:600; color:var(--ink-3)}

/* WHICH MEMBER - the household roll-up's label (CEO, 31 Aug 2026: "it must be
   recognize for which member the comment left on"). Aug31.

   NOT `.pill`. A pill in this app is a STATUS, and status-unify.css paints every one
   of them from the seven-hue contract; borrowing it here would put a status colour on
   a person's name and quietly add a 39th user of a class this file already warns about
   (see the .cn-pill note above). This is an attribution, so it is drawn as one: quiet
   ink, a hairline, no hue.

   min-width:0 + ellipsis because a long name must not push the timestamp or the
   remove control off the row - the header is flex-wrap:wrap above for the same
   reason, so a narrow pane drops the tag to its own line instead of squeezing it. */
#mhDetail .cnd-cmt-on{
  display:inline-flex; align-items:center; gap:5px; min-width:0; max-width:100%;
  padding:2px 8px 2px 6px; border-radius:999px;
  border:1px solid var(--line); background:var(--surface-2, rgba(40,60,80,.04));
  font-size:11.5px; font-weight:700; color:var(--ink-2);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
#mhDetail .cnd-cmt-on svg{width:12px; height:12px; flex:none; color:var(--ink-3)}

/* The card-header caption that says what the list is scoped to. Same quiet register
   as the tag - it is a label on the section, not a claim about the family. */
#mhDetail .cnd-cmt-scope{
  margin-left:auto; font-size:11.5px; font-weight:650; color:var(--ink-3);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0;
}

/* EDIT REPLACED DELETE (CEO, 31 Aug 2026). The old .cnd-cmt-del rule is gone with its
   button; the X is no longer drawn on any comment screen.

   margin-left:auto rather than a spacer so the control stays at the far end when the
   author's name wraps. justify-content is NOT needed here - this button is not a flex
   container, so MudBlazor's bare `button{justify-content:center}` has nothing to centre. */
#mhDetail .cnd-cmt-edit{
  margin-left:auto; flex:none; padding:2px 9px;
  border:1px solid var(--line); border-radius:999px; background:none; cursor:pointer;
  font-family:var(--font-sans); font-size:11.5px; font-weight:700; color:var(--ink-3);
  transition:background .14s ease, color .14s ease, border-color .14s ease;
}
#mhDetail .cnd-cmt-edit:hover{background:var(--brand-tint); color:var(--brand); border-color:var(--brand)}

/* "edited" - a MARKER, not a badge. It must be readable and ignorable at the same time:
   a colleague scanning the thread should not have their eye pulled to it, but anyone
   asking "did this say something else?" must find the answer without leaving the row.
   The full who/when is on the title attribute. */
#mhDetail .cnd-cmt-edited{
  flex:none; font-size:11px; font-weight:650; font-style:italic; color:var(--ink-4);
  cursor:help;
}

/* THE IN-PLACE EDITOR. The comment body is replaced by the field, so the message stays
   in the thread it belongs to instead of jumping into a modal. */
#mhDetail .cnd-cmt-edit-wrap{margin-top:4px}
#mhDetail .cnd-cmt-edit-wrap .icf.area textarea{min-height:64px}
#mhDetail .cnd-cmt-editacts{display:flex; justify-content:flex-end; gap:8px; margin-top:8px}
#mhDetail .cnd-cmt-editerr{margin-top:6px; font-size:12px; font-weight:600; color:var(--danger-ink)}
/* SMALL BUTTONS, as asked. Save carries the weight; Cancel is quiet but never hidden -
   somebody who opens the editor and thinks better of it needs a way out that is not
   "save something". */
#mhDetail .cnd-cmt-btn{
  padding:5px 13px; border-radius:9px; cursor:pointer;
  font-family:var(--font-sans); font-size:12px; font-weight:700;
  transition:background .14s ease, color .14s ease, border-color .14s ease, opacity .14s ease;
}
#mhDetail .cnd-cmt-btn.ghost{border:1px solid var(--line); background:none; color:var(--ink-2)}
#mhDetail .cnd-cmt-btn.ghost:hover{background:rgba(40,60,80,.06); color:var(--ink-1)}
#mhDetail .cnd-cmt-btn.go{border:1px solid var(--brand); background:var(--brand); color:#fff}
#mhDetail .cnd-cmt-btn.go:hover{filter:brightness(1.06)}
#mhDetail .cnd-cmt-btn:disabled{opacity:.5; cursor:not-allowed}

#mhDetail .cnd-cmt-b{
  font-size:14px; line-height:1.6; color:var(--ink-2);
  white-space:pre-wrap; word-break:break-word;
}

/* A COMMENT STREAM THAT FAILED TO LOAD SAYS SO IN ITS OWN COLOUR. The notes beside
   it are unaffected - they load in a separate try - and a silent empty list would
   read as "no comments", which is a different fact. */
#mhDetail .cnd-body.cnd-err{color:var(--danger-ink); font-weight:600}

/* =============================================================================
   CASENOTES-04 - TRANSFERS (Aug 20 2026).

   Still .cn- only, and still tokens only. Every colour below is --mh-ink /
   --mh-muted / --mh-ctrl-accent / --mh-danger, never --mh-slate: body.dark
   redefines ink, muted, surface, line, cream-2 and ctrl-* but NOT --mh-slate,
   so text painted with it stays dark-on-dark.
   ============================================================================= */

/* ---- the select / transfer bar ------------------------------------------
   NOT in the topbar. TopActionState owns ONE slot and "New Note" already holds
   it for this route; selecting rows is not a create action and belongs beside
   the rows it acts on - the same place Approvals puts its decision controls. */
.mh-app .cn-bar {
    display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    margin-bottom: 12px; min-height: 38px;
}
.mh-app .cn-bspacer { flex: 1 1 auto; }
.mh-app .cn-bcount { font-size: 13px; font-weight: 700; color: var(--mh-ink); }

.mh-app .cn-bbtn {
    display: inline-flex; align-items: center; gap: 7px;
    height: 36px; padding: 0 14px; border-radius: 10px;
    font-size: 13px; font-weight: 650; cursor: pointer;
    background: var(--mh-surface); color: var(--mh-ink);
    border: 1px solid var(--mh-line);
    transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.mh-app .cn-bbtn svg { width: 15px; height: 15px; flex: none; }
.mh-app .cn-bbtn:hover:not(:disabled) { border-color: var(--mh-ctrl-ico); }
.mh-app .cn-bbtn:disabled { opacity: .5; cursor: not-allowed; }
.mh-app .cn-bbtn.ghost { background: transparent; }
.mh-app .cn-bbtn.prim {
    background: var(--mh-ctrl-accent); color: #fff; border-color: transparent;
}
.mh-app .cn-bbtn.prim:hover:not(:disabled) { filter: brightness(1.07); }
/* A RETURN is a refusal, so it wears the app's one destructive signal. */
.mh-app .cn-bbtn.danger { color: var(--mh-danger); border-color: rgba(176,70,60,.35); }
.mh-app .cn-bbtn.danger:hover:not(:disabled) { background: rgba(176,70,60,.10); }

/* ---- a note row while selecting -----------------------------------------
   The whole row is the control in this mode, so the tick is INERT - a real
   checkbox here would swallow the click and toggle the row twice. */
/* Selection moved to .cn-card with CASENOTES-07 - see the block at the end of this
   file. The transfer worklist is never selectable, so no .cn-note variant is needed. */
/* A note that cannot go is dimmed, never hidden: a list that silently drops rows
   in selection mode makes people think notes have disappeared. Its title says why. */

/* .cn-tick is defined with the card at the end of this file (CASENOTES-07). */

/* ---- transfer state on a note row ---------------------------------------- */
.mh-app .cn-chip.xfer { background: rgba(78,124,114,.12); color: var(--mh-ctrl-accent); }

/* ---- the transfer worklist ----------------------------------------------- */
.mh-app .cn-xgrp {
    font-size: 11px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase;
    color: var(--mh-muted); margin: 4px 0 10px;
}
.mh-app .cn-xgrp + .cn-list { margin-bottom: 22px; }

/* Pending is the only state anyone has to act on, so it is the only one that
   carries a left edge. Settled rows read as history. */
.mh-app .cn-xfer.pending { border-left: 3px solid var(--mh-ctrl-accent); }

/* Where a CASENOTETRANSFER notification landed. */
.mh-app .cn-xfer.lit { box-shadow: 0 0 0 2px var(--mh-ctrl-accent), var(--mh-shadow-sm); }

.mh-app .cn-xline { font-size: 13.5px; color: var(--mh-muted); margin-bottom: 6px; }
.mh-app .cn-xline b { color: var(--mh-ink); font-weight: 650; }
.mh-app .cn-xbatch {
    margin-left: 7px; font-size: 11.5px; font-weight: 600;
    padding: 2px 8px; border-radius: 999px;
    background: var(--mh-cream-2); color: var(--mh-muted);
}

.mh-app .cn-xreason {
    font-size: 13.5px; line-height: 1.55; color: var(--mh-ink);
    font-style: italic; margin-bottom: 4px; word-break: break-word;
}
.mh-app .cn-xreason.ret { color: var(--mh-danger); font-style: normal; margin-top: 10px; }

.mh-app .cn-xacts { display: flex; align-items: center; gap: 8px; justify-content: flex-end; margin-top: 12px; }

.mh-app .cn-xret { margin-top: 12px; }
.mh-app .cn-xret textarea {
    width: 100%; min-height: 74px; resize: vertical;
    padding: 11px 13px; border-radius: 10px;
    border: 1px solid var(--mh-line); background: var(--mh-cream-2); color: var(--mh-ink);
    font-family: inherit; font-size: 13.5px; line-height: 1.55;
}
.mh-app .cn-xret textarea:focus { outline: none; border-color: var(--mh-ctrl-accent); background: var(--mh-surface); }

@media (max-width: 900px) {
    .mh-app .cn-xacts { justify-content: stretch; }
    .mh-app .cn-xacts .cn-bbtn { flex: 1; justify-content: center; }
}

/* =============================================================================
   THE TRANSFER SHEET (#cnXfer) - the parts that are its own.

   Scoped under #cnXfer, where enroll-wizard.css defines --ink-*, --danger*,
   --brand-*, --line and the field tokens. It was WIDENED to
   :is(#enrollWiz,#cnWiz,#cnXfer) rather than copied, so the sheet inherits the
   whole field kit, the buttons and the modal chrome for free. A card written
   outside that scope loses every one of those tokens and renders unstyled.
   ============================================================================= */
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-badge {
    font-size: 11.5px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
    padding: 5px 11px; border-radius: 999px;
    background: var(--brand-tint); color: var(--brand-600);
}
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-dept { margin-left: auto; font-size: 11.5px; font-weight: 600; color: var(--ink-3); }

:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-err {
    margin-bottom: 16px; padding: 11px 14px; border-radius: var(--r-md);
    background: var(--danger-bg); border: 1px solid rgba(192,71,63,.22);
    color: var(--danger-ink); font-size: 13.5px; font-weight: 600;
}

/* WHAT IS GOING ACROSS, named. Nobody should have to scroll back to a list they
   have already left to check which family they are about to hand on. */
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-list {
    margin-top: 20px; padding: 15px 16px;
    background: var(--f-focus-bg); border: 1px solid var(--line); border-radius: var(--r-lg);
    max-height: 220px; overflow: auto;
}
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-list-h {
    font-size: 11px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase;
    color: var(--ink-3); margin-bottom: 10px;
}
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-row { display: flex; align-items: center; gap: 10px; padding: 6px 0; min-width: 0; }
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-row + .xf-row { border-top: 1px solid var(--line); }
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-kind {
    font-size: 10.5px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase;
    padding: 3px 8px; border-radius: 999px; flex: none;
    background: var(--brand-tint); color: var(--brand-600);
}
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-name {
    font-size: 14px; font-weight: 600; color: var(--ink-1);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0;
}
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-conf { margin-left: auto; flex: none; color: var(--danger); display: inline-flex; }
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-conf svg { width: 15px; height: 15px; }

/* The CEO's ruling, stated where the decision is made. */
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-warn {
    display: flex; align-items: flex-start; gap: 10px;
    margin-top: 16px; padding: 12px 14px; border-radius: var(--r-md);
    background: var(--danger-bg); border: 1px solid rgba(192,71,63,.22);
    color: var(--danger-ink); font-size: 13px; line-height: 1.5; font-weight: 600;
}
:is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete) .xf-warn svg { width: 16px; height: 16px; flex: none; margin-top: 1px; }

/* =============================================================================
   CASENOTES-05 - STATUS AND LOCK (Aug 20 2026).
   ============================================================================= */

/* The lock, on a note row. Not danger red: locking is deliberate and correct, not
   a warning - unlike Confidential, which tells the reader the note is not theirs to
   repeat. Muted, so it reads as a state rather than a problem. */
.mh-app .cn-chip.locked { background: var(--mh-cream-2); color: var(--mh-ink); font-weight: 700; }

/* Completed. The one status worth a chip on the row, because it is the one that
   changes what the app DOES - the follow-up scan stops reminding on it. */
.mh-app .cn-chip.done { background: rgba(78,124,114,.12); color: var(--mh-ctrl-accent); }

/* A locked row cannot be picked for a transfer; .unpickable already dims it. */

/* =============================================================================
   THE LOCKED BANNER on the detail. Sits beside .cnd-conf and shares its anatomy
   deliberately - two banners at the top of one note must not be two designs.
   Scoped under #mhDetail, where the shell's local tokens live.
   ============================================================================= */
#mhDetail .cnd-locked{
  display:flex; align-items:center; gap:9px; margin:0 0 14px;
  padding:10px 13px; border-radius:10px;
  background:var(--f-rest-bg); border:1px solid var(--line);
  color:var(--ink-2); font-size:13px; font-weight:650;
}
#mhDetail .cnd-locked svg{width:15px;height:15px;flex:none;stroke:var(--ink-3)}

/* =============================================================================
   THE UNLOCK SHEET (#cnUnlock) reuses every .xf-* rule the transfer sheet defines,
   because enroll-wizard.css was widened to cover it and the two sheets are the same
   object: one question, one column. 16 Sep 2026: that sentence was TRUE ONLY IN THIS
   COMMENT - the .xf-* rules above were still scoped to #cnXfer alone, so the unlock
   sheet (and the access-request sheet, #cnAccess) drew the confidential lock SVG at
   full size and every chip unstyled (owner's screenshot). The rules are now written
   :is(#cnXfer,#cnUnlock,#cnAccess,#cnDelete). Only its warning is quieter - unlocking is not
   a danger, it is a correction - so it overrides the inherited danger palette.
   ============================================================================= */
#cnUnlock .xf-badge { background: var(--f-rest-bg); color: var(--ink-2); }
#cnUnlock .xf-warn {
  background: var(--f-rest-bg); border-color: var(--line); color: var(--ink-2);
}
#cnUnlock .xf-warn svg { stroke: var(--ink-3); }


/* =============================================================================
   CASENOTES-07 (Aug 20 2026) - THE NOTE CARD IS THE HOUSEHOLD KPI CARD.

   CEO: "change those cards like Household KPI cards, same design same interface,
   make sure the profile photo also working."

   So the card itself is `.idcard` and its whole family - .idc-top, .idc-ph,
   .idc-mid, .idc-nrow, .idc-name, .idc-sub, .idc-line, .idc-stats, .idc-hhrow,
   .btn-household - all defined in mh-theme.css and worn UNCHANGED. The grid is
   .idgrid, already inside the CARD-GRID LAW's shared rule (3-column cap, never
   auto-fill, 3->2->1). NOT ONE of those rules is redefined here.

   What IS here is only what a household card has no equivalent for: a case note
   is a paragraph of somebody's writing, and an identity card has nowhere to put
   one. Everything below is that paragraph and the chips beside it.
   ============================================================================= */

/* THE NOTE'S OWN TITLE, when it has one. Sits under the divider, above the body,
   at the weight the card's own .idc-name is not - the subject is the headline,
   the note's title is the subheading. */
.mh-app .cn-card .cn-cardtitle {
    font-size: 13.5px; font-weight: 700; color: var(--mh-ink);
    margin-bottom: 5px; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* THE NOTE. Clamped to three lines, because a card grid is scanned and the whole
   note is one click away - the same reason the old row clamped it. pre-wrap keeps
   the line breaks the caseworker typed, since in a case note a new line is
   usually a new event. */
.mh-app .cn-card .cn-cardbody {
    font-size: 13px; line-height: 1.55; color: var(--mh-ink);
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
    overflow: hidden; white-space: pre-wrap; word-break: break-word;
    min-height: calc(3 * 1.55 * 13px);   /* three lines' worth, so short and long
                                            notes leave the stat row on the same
                                            line across a whole row of cards */
}

/* The flags that change how a note must be TREATED, kept as chips rather than
   folded into the stat row: a stat is a value, these are warnings. */
.mh-app .cn-card .cn-cardchips {
    display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 10px;
}
.mh-app .cn-card .cn-cardchips:empty { display: none; }

/* The subject KIND pill on the name row, in the slot the household card gives its
   status pill. Sized down to sit beside .idc-name without pushing it. */
.mh-app .cn-card .idc-nrow .cn-kind { flex: none; font-size: 10px; padding: 2px 7px; }

/* A follow-up that has passed is the ONE value in the stat row that changes
   colour, because it is the only one that means somebody is late. */
.mh-app .cn-card .idc-stats .v.cn-late { color: var(--mh-danger); }

/* ---- selection mode, on the card ---------------------------------------
   The whole card is the control while selecting, so the tick is INERT - a real
   checkbox would swallow the click and toggle the card twice. */
.mh-app .cn-card { position: relative; }
.mh-app .cn-card.picked {
    box-shadow: 0 0 0 2px var(--mh-ctrl-accent) inset, var(--mh-shadow-sm);
}
/* A note that cannot go is dimmed, never hidden: a grid that silently drops cards
   in selection mode makes people think notes have disappeared. Its title says why. */
.mh-app .cn-card.unpickable { opacity: .45; cursor: not-allowed; }
.mh-app .cn-card.unpickable:hover { transform: none; box-shadow: var(--mh-shadow-sm); }

/* 16 Sep 2026: the timeline card (.cn-tl .c) is the card the list draws now; the tick had no box there. */
.mh-app :is(.cn-card, .cn-tl .c) .cn-tick {
    position: absolute; right: 14px; top: 14px; z-index: 2;
    width: 22px; height: 22px; border-radius: 7px;
    border: 1.5px solid var(--mh-line); background: var(--mh-surface);
    display: grid; place-items: center; color: #fff;
}
.mh-app :is(.cn-card, .cn-tl .c) .cn-tick.on { background: var(--mh-ctrl-accent); border-color: var(--mh-ctrl-accent); }
.mh-app :is(.cn-card, .cn-tl .c) .cn-tick svg { width: 13px; height: 13px; }

/* =============================================================================
   CASENOTES-08 (Aug 20 2026) - THE CASE NOTE FILE'S NOTE LIST.

   The detail is now the SUBJECT's file: every note about one client, household or
   program, newest first, each one expandable. These rules are only the note ROW
   inside that list - the card around it is .cnd-card, which already exists above.

   Scoped under #mhDetail with the rest of the shell's body, where its local tokens
   (--f-focus-bg, --line, --ink-*, --brand-600, --danger*) are defined.
   ============================================================================= */

/* THE HEADER IS THE CONTROL. The whole row toggles the note open, so it carries the
   cursor and the hover - a chevron that is the only clickable part of a wide row is
   a target people miss. */
#mhDetail .cnd-note .cnd-nh{
  cursor:pointer; margin-bottom:12px; border-radius:9px;
  padding:2px 4px; margin-left:-4px; margin-right:-4px;
  transition:background .15s ease;
}
#mhDetail .cnd-note .cnd-nh:hover{background:var(--f-rest-bg)}
#mhDetail .cnd-note .cnd-nh h4{
  flex:1; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  text-transform:none; font-size:14px; letter-spacing:0; color:var(--ink-1);
}
#mhDetail .cnd-note.open .cnd-nh h4{color:var(--brand-600)}

#mhDetail .cnd-nwhen{
  flex:none; font-size:12px; font-weight:600; color:var(--ink-3);
  font-variant-numeric:tabular-nums; margin-left:auto;
}
#mhDetail .cnd-chev{flex:none; display:inline-flex; color:var(--ink-3); transition:transform .18s ease}
#mhDetail .cnd-chev svg{width:16px; height:16px}
#mhDetail .cnd-chev.on{transform:rotate(180deg); color:var(--brand-600)}

/* CLOSED, the note shows two lines - enough to recognise it, not enough to read it
   over somebody's shoulder. Open, it shows everything, line breaks and all. */
#mhDetail .cnd-note .cnd-body.clamp{
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden; font-size:13.5px; color:var(--ink-2);
}

/* =========================================================================
   THE CLAMP MUST NOT LIE - 24 Aug 2026. Paired with clampScan() in
   detailview.js, which measures each collapsed body and marks the card.

   .cn-flat  the note is SHORTER than the clamp, so nothing is hidden. It is
             not a preview of a note, it IS the note - so it loses the muted
             preview type, the chevron, the pointer and the hover. Clicking
             it did nothing before and now it does not invite the click.
   .cn-more  there is genuinely more text. Everything stays, and the chevron
             is darkened so the one row that CAN open is the one that looks
             like it can.

   Both are absent until the scan runs, so an unmeasured card keeps the old
   behaviour - it can never hide text by defaulting the wrong way.
   ========================================================================= */
#mhDetail .cnd-note.cn-flat .cnd-body.clamp{
  -webkit-line-clamp:none; display:block; overflow:visible;
  font-size:14.5px; color:var(--ink-1);
}
#mhDetail .cnd-note.cn-flat .cnd-chev{display:none}
#mhDetail .cnd-note.cn-flat .cnd-nh{cursor:default}
#mhDetail .cnd-note.cn-flat .cnd-nh:hover{background:transparent}

#mhDetail .cnd-note.cn-more .cnd-chev{color:var(--ink-2)}
/* The affordance says WHAT is behind the clamp, not just that something is.
   A bare chevron on a two-line block is read as decoration. */
#mhDetail .cnd-note.cn-more .cnd-body.clamp{position:relative}
#mhDetail .cnd-note.cn-more .cnd-nh::after{
  content:"Read"; flex:none; order:9; font-size:11px; font-weight:700;
  letter-spacing:.04em; text-transform:uppercase; color:var(--ink-3);
  margin-left:2px;
}
#mhDetail .cnd-note.cn-more .cnd-nh:hover::after{color:var(--brand-600)}

/* The per-note footer. Distinct from .cnd-nh so a long chip run cannot push the
   date out of the header. */
#mhDetail .cnd-nfoot{
  display:flex; align-items:center; gap:7px; flex-wrap:wrap;
  margin-top:12px; padding-top:11px; border-top:1px solid var(--line);
}
#mhDetail .cnd-nby{font-size:12.5px; color:var(--ink-3)}
#mhDetail .cnd-nby b{color:var(--ink-1); font-weight:650}

/* The chips are the SAME .cn-chip the section's cards use, so a note reads the same
   in the list and in its file. They are restated here only because .cn-chip is
   defined against .mh-app tokens and this pane carries the shell's own. */
#mhDetail .cn-chip{
  display:inline-flex; align-items:center; gap:5px;
  font-size:11.5px; font-weight:600; padding:3px 9px; border-radius:999px;
  background:var(--f-rest-bg); color:var(--ink-3); white-space:nowrap;
}
#mhDetail .cn-chip svg{width:13px; height:13px}
#mhDetail .cn-chip.due{background:rgba(78,124,114,.14); color:var(--brand-600)}
#mhDetail .cn-chip.overdue{background:var(--danger-bg); color:var(--danger-ink)}
#mhDetail .cn-chip.done{background:rgba(78,124,114,.14); color:var(--brand-600)}
#mhDetail .cn-chip.xfer{background:rgba(78,124,114,.14); color:var(--brand-600)}

/* CASENOTES-09: .conf and .safe were the two variants this #mhDetail restatement
   never covered, because until now nothing inside the shell rendered them. The
   Notes tabs do. Without these, a Confidential or Safeguarding chip fell back to
   the base rule above - which wins on specificity over .mh-app .cn-chip.conf - and
   painted GREY, identical to a note-type chip. The one marking on a note that says
   "this is restricted" would have been the one marking you could not see. */
#mhDetail .cn-chip.conf{background:var(--danger-bg); color:var(--danger-ink)}
#mhDetail .cn-chip.safe{background:rgba(160,130,200,.18); color:#6B4E9B; font-weight:700}
body.dark #mhDetail .cn-chip.safe{background:rgba(160,130,200,.22); color:#C9B3E4}

/* The note that was clicked opens marked, so arriving from a card, a follow-up bell
   or a transfer never loses the thing you came for among its siblings. */
#mhDetail .cnd-note.open{
  box-shadow:0 0 0 1.5px var(--brand-600) inset, 0 10px 26px -18px rgba(28,39,51,.45);
  background:var(--f-focus-bg, rgb(var(--tg-rgb,255,255,255)));
}
/* The body grows from the two-line preview to the whole note. Height alone is
   the honest signal that the click did something - measured at 3.2x on a real
   caseworker paragraph (45px clamped -> 144px open), so it does not need help.
   The fade-in only stops that jump from reading as a layout glitch. */
#mhDetail .cnd-note.open .cnd-body{animation:cndOpen .2s ease both}
@keyframes cndOpen{from{opacity:.35}to{opacity:1}}

/* The composer's confidential tick, in the shell's edit form. */
#mhDetail .field > label.opt{
  flex-direction:row; align-items:flex-start; gap:10px; cursor:pointer;
  text-transform:none; letter-spacing:0; font-size:13.5px; font-weight:600;
  color:var(--ink-2);
}
#mhDetail .field > label.opt input{width:17px; height:17px; flex:none; margin-top:1px; cursor:pointer}
#mhDetail .field > label.opt .opt-txt{min-width:0}

/* =============================================================================
   CASENOTES-07 - THE SAFEGUARDING LEVEL (Aug 20 2026).

   Two levels now: CONFIDENTIAL (author + admins + whoever accepted a transfer) and
   SAFEGUARDING (author + admins only, never transferable). Safeguarding is the
   stricter, so wherever both could show, it shows INSTEAD - a reader should never
   have to work out which of two restriction badges actually governs the note.

   It is deliberately NOT the same red as Confidential. Confidential says "do not
   repeat this"; safeguarding says "this is a protection matter". Giving them one
   colour would make the stricter level invisible among the looser one.
   ============================================================================= */
.mh-app .cn-chip.safe {
    background: rgba(120,86,160,.14); color: #6B4B90; font-weight: 700;
}
body.dark .mh-app .cn-chip.safe { background: rgba(160,130,200,.20); color: #c9b3e4; }

#mhDetail .cnd-conf.cnd-safe {
    background: rgba(120,86,160,.10);
    border-color: rgba(120,86,160,.28);
    color: #5E4080;
}
#mhDetail .cnd-conf.cnd-safe svg { stroke: #6B4B90; }
body.dark #mhDetail .cnd-conf.cnd-safe { background: rgba(160,130,200,.16); color: #d3c0ea; }
body.dark #mhDetail .cnd-conf.cnd-safe svg { stroke: #c9b3e4; }

/* The composer's safeguarding tick, so the stricter choice reads as the heavier one. */
#mhDetail .field > label.opt.opt-safe .opt-txt b { color: #6B4B90; }
body.dark #mhDetail .field > label.opt.opt-safe .opt-txt b { color: #c9b3e4; }

/* =============================================================================
   CASENOTES-08 - THE LOCKED STUB (Aug 20 2026).

   A restricted note is no longer removed from the list; it comes back with its
   content masked, so a colleague can see it EXISTS and ask its author for access.
   Nobody can request what they cannot see.

   THE STUB MUST NOT LOOK LIKE A NOTE THAT FAILED TO LOAD. It is a deliberate
   state, so it gets its own quiet panel with a lock, a level and a plain sentence -
   not an empty body where text should be, which reads as a bug.
   ============================================================================= */
.mh-app .cn-stub {
    display: flex; flex-direction: column; align-items: center; text-align: center;
    gap: 4px; padding: 16px 12px; border-radius: 12px;
    background: var(--mh-cream-2); border: 1px dashed var(--mh-line);
    min-height: calc(3 * 1.55 * 13px);
}
.mh-app .cn-stub-ic {
    width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center;
    background: var(--mh-surface); color: var(--mh-muted); margin-bottom: 2px;
}
.mh-app .cn-stub-ic svg { width: 15px; height: 15px; }
.mh-app .cn-stub-t { font-size: 13px; font-weight: 700; color: var(--mh-ink); }
.mh-app .cn-stub-s { font-size: 12px; color: var(--mh-muted); line-height: 1.5; max-width: 34ch; }

/* A stub is not clickable - its Request access button is the only thing it offers,
   so the card must not invite a click that does nothing. */
.mh-app .idcard.cn-card:has(.cn-stub) { cursor: default; }
.mh-app .idcard.cn-card:has(.cn-stub):hover { transform: none; border-color: var(--mh-line); }


/* =============================================================================
   CASE NOTE CARD - TIMELINE RAIL
   CEO, 24 Aug 2026. Landed from `CaseNote KPI cards / Case Note Card - Timeline
   Rail / styles.css`, values unchanged.

   SCOPED UNDER .cn-tl, AND THAT IS NOT A DESIGN CHANGE.
   The file ships selectors named .c, .row, .mt, .tg, .bd, .nm, .fg, .av, .tm, .ln
   and .empty. Dropped in unscoped they would repaint half the application - `.row`
   alone is Bootstrap's grid row, used across the Program and Planner screens, and
   `.c`/`.mt`/`.tg` are short enough to hit almost anything. Every declaration below
   is the designer's; only the prefix in front of it is ours. This is the
   CSS-prefix rule the app already follows: the newcomer yields.

   TWO SUBSTITUTIONS, both forced and both flagged to the CEO:
     * The demo loads Hanken Grotesk + JetBrains Mono from Google Fonts. This app
       SELF-HOSTS its fonts and must run without a CDN, so the body face is the
       app's own Hanken Grotesk and the mono face is var(--mono) - IBM Plex Mono,
       already self-hosted. Same role, same places (.sb record ids, .tm times).
     * body{background:var(--tg-cream2,rgb(242,244,245));padding:40px} and .shell/.stage are the demo PAGE,
       not the card. The app has its own shell and ONE background (#E8EBF0), so
       those four rules are not applied. The card itself is untouched.
   ============================================================================= */

/* toolbar */
.mh-app .cn-tl .tb{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:0 4px 18px}
.mh-app .cn-tl .tb h2{margin:0;font-size:12.5px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;color:#3E5560}
.mh-app .cn-tl .tb .ct{font-size:12.5px;font-weight:700;color:#8A9791}
.mh-app .cn-tl .fl{display:flex;gap:6px;margin-left:auto;padding:5px;border-radius:999px;background:rgba(var(--tg-rgb,255,255,255),calc(.75*var(--tg-k,1)));border:1px solid rgba(30,55,48,.09);backdrop-filter:blur(18px) saturate(150%);-webkit-backdrop-filter:blur(18px) saturate(150%);box-shadow:0 6px 16px -12px rgba(30,55,48,.3)}
.mh-app .cn-tl .fl button{font:inherit;font-size:12px;font-weight:800;letter-spacing:.02em;color:#6C7A75;background:none;border:0;padding:7px 14px;border-radius:999px;cursor:pointer;display:flex;align-items:center;gap:7px;transition:background .15s ease,color .15s ease}
.mh-app .cn-tl .fl button:hover{background:rgba(30,55,48,.05)}
.mh-app .cn-tl .fl button.on{background:#1E4438;color:#F1F8F5}
.mh-app .cn-tl .fl button i{font-style:normal;font-size:10.5px;font-weight:800;padding:1px 6px;border-radius:99px;background:rgba(27,44,39,.09);color:#5E6C67}
.mh-app .cn-tl .fl button.on i{background:rgba(var(--tg-rgb,255,255,255),calc(.2*var(--tg-k,1)));color:#DCEFE6}

/* grid */


/* =============================================================================
   `.row` IS BOOTSTRAP'S GRID CLASS. CEO, 26 August 2026 - "the left and right
   border is not completely showing" when notes are selected.

   MEASURED with all five notes picked:
       .cn-tl .cn-row   x 376 -> 2020
       .cn-tl           x 388 -> 2008
   The card grid was TWELVE PIXELS WIDER THAN ITS OWN COLUMN ON EACH SIDE, so the
   left border of the first card and the right border of the last sat outside the
   content area and were cut off by the page edge. Nothing had overflow:hidden - the
   cards were simply drawn past the edge.

   WHERE THE 12px CAME FROM: bootstrap's `.row{margin-right:calc(-.5 * var(--bs-gutter-x));
   margin-left:calc(-.5 * var(--bs-gutter-x))}` with --bs-gutter-x:1.5rem. That is
   -0.75rem = -12px, exactly. The timeline's own rule sets `display:grid` and wins on
   specificity, but it never declares a MARGIN - so Bootstrap's went unopposed. Same
   shape as `.ic`, `.pill`, `.btn`, `.grid` and `.av` before it: the leak is always a
   property the design never thought to declare.

   Renamed rather than zeroed, because zeroing only settles the margin and leaves the
   rest of Bootstrap's `.row` - the gutter variables, flex-wrap, margin-top - sitting
   one specificity bump away. This app has been bitten by Bootstrap's `.row` before;
   see the Program Detail edit engine.
   ============================================================================= */


/* =============================================================================
   THE MAIN LIST'S CARDS MUST KEEP THEIR SIZE. CEO, 26 August 2026 - "it's
   extending itself all the way to right and it's not remaining to it's place".

   SAME BUG, SAME CAUSE, SECOND GRID. `repeat(AUTO-FIT, ...)` collapses the tracks
   it cannot fill and hands their width to whatever is left, so filtering down to
   "Confidential 1" gave ONE card the entire row and "Follow-up due 2" gave two cards
   half the row each. Only the unfiltered "All 5" looked right, which is why it
   survived until a filter was used.

   `auto-FILL` keeps the empty tracks, so a card is the same width whether the list
   holds one note or five. Above three notes the two keywords resolve identically, so
   nothing about the full list moves.

   THE INDEX-CARD GRID (.cn-ic) HAD THIS FIXED EARLIER THE SAME DAY. If a third grid
   is ever added here, it starts as auto-fill.
   ============================================================================= */
/* grid-auto-rows:1fr - EVERY ROW THE SAME HEIGHT, not just every card in a row.
   CEO, 31 Aug 2026: "the first row is same size the second row is not the same size".
   MEASURED: grid-template-rows resolved to "365.062px 295.812px" - align-items:stretch
   was already equalising the cards WITHIN a row, but each row still sized to its own
   tallest card, so a short second row read as a different card design.
   1fr makes the auto-placed rows share one size, which in an auto-height grid is the
   tallest row's - so a long note still sets the height and every other card matches it.
   align-items:stretch stays: 1fr sizes the ROW, stretch is what makes the card fill it. */
.mh-app .cn-tl .cn-row{display:grid;grid-template-columns:repeat(auto-fill,minmax(430px,1fr));grid-auto-rows:1fr;gap:16px;align-items:stretch}
.mh-app .cn-tl .c{display:grid;grid-template-columns:74px 1fr;gap:18px;height:100%;padding:20px 22px 18px 16px;border-radius:20px;background:linear-gradient(160deg,rgba(var(--tg-rgb,255,255,255),.9),rgba(var(--tg-rgb,255,255,255),calc(.7*var(--tg-k,1))));border:1px solid rgba(30,55,48,.08);box-shadow:0 12px 30px -20px rgba(30,55,48,.35),inset 0 1px 0 rgba(255,255,255,.95);backdrop-filter:blur(20px) saturate(150%);-webkit-backdrop-filter:blur(20px) saturate(150%);transition:transform .2s cubic-bezier(.2,.7,.3,1),box-shadow .2s ease,border-color .2s ease;position:relative;cursor:pointer}
.mh-app .cn-tl .c:hover{transform:translateY(-4px);box-shadow:0 26px 44px -22px rgba(30,55,48,.42),inset 0 1px 0 rgba(255,255,255,.95);border-color:rgba(47,107,87,.24)}

/* rail */
.mh-app .cn-tl .rail{display:flex;flex-direction:column;align-items:center;gap:10px}
.mh-app .cn-tl .stamp{text-align:center;line-height:1}
.mh-app .cn-tl .stamp b{display:block;font-size:23px;font-weight:800;letter-spacing:-.03em;color:#26332E}
.mh-app .cn-tl .stamp span{display:block;margin-top:2px;font-size:9.5px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:#96A29D}
.mh-app .cn-tl .av{position:relative;display:grid;place-items:center;width:46px;height:46px;flex:none;border-radius:50%;background:linear-gradient(165deg,#27543F,#16342C);color:#CFE8DD;box-shadow:0 8px 16px -10px rgba(16,40,34,.9),inset 0 1px 0 rgba(255,255,255,.18);overflow:hidden}
.mh-app .cn-tl .av svg{width:23px;height:23px;transition:transform .18s ease}
.mh-app .cn-tl .av img{width:100%;height:100%;object-fit:cover;border-radius:50%;display:block}
.mh-app .cn-tl a.av{text-decoration:none;cursor:pointer;outline:none}
.mh-app .cn-tl a.av:hover{background:linear-gradient(165deg,#2F6B57,#1B4034)}
.mh-app .cn-tl a.av:hover svg{transform:scale(1.08)}
.mh-app .cn-tl a.av:focus-visible{box-shadow:0 0 0 3px rgba(47,107,87,.35),0 8px 16px -10px rgba(16,40,34,.9)}
.mh-app .cn-tl a.av::before{content:"";position:absolute;inset:-6px;border-radius:50%}
.mh-app .cn-tl .av::after{content:"";position:absolute;inset:-4px;border-radius:50%;border:2px solid transparent}
.mh-app .cn-tl .c.over .av::after{border-color:rgba(180,69,58,.55)}
.mh-app .cn-tl .c.due .av::after{border-color:rgba(176,122,46,.55)}
.mh-app .cn-tl .tm{font-family:var(--mono,ui-monospace,monospace);font-size:10px;font-weight:500;color:#9AA5A0;letter-spacing:-.02em}
.mh-app .cn-tl .ln{flex:1;min-height:14px;width:2px;border-radius:2px;background:linear-gradient(180deg,rgba(47,107,87,.28),rgba(47,107,87,0))}
.mh-app .cn-tl .c.over .ln{background:linear-gradient(180deg,rgba(180,69,58,.4),rgba(180,69,58,0))}
.mh-app .cn-tl .c.due .ln{background:linear-gradient(180deg,rgba(176,122,46,.4),rgba(176,122,46,0))}

/* body */
.mh-app .cn-tl .bd{display:flex;flex-direction:column;gap:12px;min-width:0}
.mh-app .cn-tl .nm{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:17px;font-weight:800;letter-spacing:-.015em;color:#1B2C27}
.mh-app .cn-tl .kd{font-size:9.5px;font-weight:800;letter-spacing:.09em;padding:3px 7px;border-radius:5px;background:rgba(47,107,87,.12);color:#2F6B57}
.mh-app .cn-tl .sb{font-family:var(--mono,ui-monospace,monospace);font-size:11.5px;font-weight:500;color:#8A9791;margin-top:4px}
.mh-app .cn-tl .fg{font-size:9.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;padding:3px 8px;border-radius:5px;margin-left:auto}
.mh-app .cn-tl .fg.over{background:rgba(180,69,58,.11);color:#B4453A}
.mh-app .cn-tl .fg.due{background:rgba(176,122,46,.14);color:#8F6220}
.mh-app .cn-tl h4{margin:0;font-size:15px;font-weight:800;letter-spacing:-.005em;color:#1B2C27}
.mh-app .cn-tl .bd p{margin:-4px 0 0;font-size:14px;font-weight:500;line-height:1.55;color:#5B6A64;text-wrap:pretty}
.mh-app .cn-tl .tgs{display:flex;flex-wrap:wrap;gap:7px}
.mh-app .cn-tl .tg{display:flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;padding:5px 10px;border-radius:99px}
.mh-app .cn-tl .tg svg{width:13px;height:13px}
.mh-app .cn-tl .tg.red{background:rgba(180,69,58,.09);color:#B4453A}
.mh-app .cn-tl .tg.amber{background:rgba(176,122,46,.13);color:#8F6220}
.mh-app .cn-tl .tg.green{background:rgba(47,107,87,.1);color:#2F6B57}
.mh-app .cn-tl .mt{display:grid;grid-template-columns:1.4fr .8fr 1.15fr;gap:12px;align-items:start;margin-top:auto;padding-top:15px;border-top:1px solid rgba(30,55,48,.09)}
.mh-app .cn-tl .mt div{display:flex;flex-direction:column;gap:4px;min-width:0}
.mh-app .cn-tl .mt span{font-size:9.5px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:#9AA5A0}
.mh-app .cn-tl .mt b{font-size:13.5px;font-weight:700;color:#26332E;line-height:1.25;overflow-wrap:anywhere}
.mh-app .cn-tl .mt em{display:block;font-style:normal;font-size:11px;font-weight:700;margin-top:3px;color:#98A39E}
.mh-app .cn-tl .mt .over{color:#B4453A}
.mh-app .cn-tl .mt .due{color:#8F6220}
.mh-app .cn-tl .mt .none{color:#A2ADA8;font-weight:600}
.mh-app .cn-tl .fo{display:flex;align-items:center;justify-content:flex-end;padding-top:14px}
.mh-app .cn-tl .op{display:inline-flex;align-items:center;gap:9px;font-size:13.5px;font-weight:800;color:#1E4438;cursor:pointer;font-family:inherit;background:none;border:0;padding:0}
.mh-app .cn-tl .op i{display:grid;place-items:center;width:30px;height:30px;border-radius:50%;border:1.5px solid rgba(30,68,56,.24);background:rgba(var(--tg-rgb,255,255,255),calc(.75*var(--tg-k,1)));transition:background .16s ease,color .16s ease,border-color .16s ease,transform .16s ease}
.mh-app .cn-tl .op i svg{width:15px;height:15px}
.mh-app .cn-tl .c:hover .op i{background:#1E4438;border-color:#1E4438;color:#EAF5F0;transform:translateX(2px)}
.mh-app .cn-tl .op:disabled{opacity:.55;cursor:default}
.mh-app .cn-tl .c:hover .op:disabled i{background:rgba(var(--tg-rgb,255,255,255),calc(.75*var(--tg-k,1)));border-color:rgba(30,68,56,.24);color:inherit;transform:none}
.mh-app .cn-tl .empty{grid-column:1/-1;padding:40px 0;text-align:center;font-size:13.5px;font-weight:600;color:#8A9791}

/* SELECTION MODE - not in the mock, because the mock has no transfer flow. The tick
   and the three states are the section's own, re-expressed on the new card. */
.mh-app .cn-tl .c .cn-tick{position:absolute;top:12px;right:12px;z-index:2}
.mh-app .cn-tl .c.picked{border-color:rgba(47,107,87,.5);box-shadow:0 0 0 1.5px #2F6B57 inset,0 12px 30px -20px rgba(30,55,48,.35)}
.mh-app .cn-tl .c.unpickable{opacity:.5;cursor:default}
.mh-app .cn-tl .c.unpickable:hover{transform:none;box-shadow:0 12px 30px -20px rgba(30,55,48,.35),inset 0 1px 0 rgba(255,255,255,.95)}

@media (max-width:900px){
  .mh-app .cn-tl .cn-row{grid-template-columns:1fr}
  .mh-app .cn-tl .mt{grid-template-columns:1fr 1fr}
}

body.dark .mh-app .cn-tl .c{background:linear-gradient(160deg,rgba(38,48,44,.92),rgba(32,41,38,.82));border-color:rgba(255,255,255,.07)}
body.dark .mh-app .cn-tl .nm,body.dark .mh-app .cn-tl h4{color:#EEF2EF}
body.dark .mh-app .cn-tl .stamp b{color:#DCE5E0}
body.dark .mh-app .cn-tl .bd p{color:#A9B6B0}
body.dark .mh-app .cn-tl .mt b{color:#E4EAE6}
body.dark .mh-app .cn-tl .op{color:#CFE8DD}
body.dark .mh-app .cn-tl .fl{background:rgba(var(--tg-rgb,255,255,255),calc(.06*var(--tg-k,1)));border-color:rgba(255,255,255,.1)}


/* =============================================================================
   CASE NOTES - INDEX CARDS + NOTE POPUP
   CEO, 25 Aug 2026. Landed from `Case notes inside the Case Notes tab /
   Case Notes - Note Styles` (index.html + styles.css + notes.js + README.md).
   Values are the designer's, unchanged.

   SCOPED UNDER .cnx, AND THAT IS NOT A DESIGN CHANGE.
   The file ships selectors called .ix, .ic, .tab, .f, .pill, .ov, .dg, .top,
   .main, .side, .cn-grid, .state, .cn-btn, .menu, .mi, .sheet, .band and .x. Dropped in
   unscoped, `.cn-grid`, `.main`, `.top`, `.cn-btn` and `.menu` alone would repaint most
   of the application. Every declaration below is the designer's; only the prefix
   in front of it is ours. Same rule the timeline card followed: the newcomer yields.

   THE GRID IS THE DESIGNER'S OWN and it is what makes the section "travel freely":
     .ic { grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)) }
   The cards re-flow to whatever the pane gives them - three across on a wide screen,
   one on a narrow one - with no breakpoints of ours involved.
   **THE ONE WORD THAT IS NOT THE DESIGNER'S IS `auto-fILL` IN PLACE OF `auto-fIT`,
   and the reason is at the bottom of this file: auto-fit collapses the tracks it
   does not fill, so a file holding ONE note got a card 1098px wide.** Above two
   notes the two keywords resolve identically, so nothing else moves.

   TWO RENAMES, BOTH FORCED, AND NEITHER IS A DESIGN CHANGE.

   `.ic` IS `.cn-ic` HERE, AND THIS IS THE ONE THAT COST US THE MOST. `.ic` is the
   DETAIL PANE'S OWN ICON CLASS - detail-view.css declares
       #mhDetail .ic { width:19px; height:19px; flex:0 0 auto; display:grid;
                       place-items:center; color:var(--ink-3) }
       #mhDetail .ic svg { width..height..stroke..stroke-width..fill }
   and specificity 110 beat nothing we could scope it under except an id of our own.
   MEASURED on the live page, 26 Aug, with the grid still called .ic:
     * height computed to 19px - the whole card grid was a 19px-tall box with its
       cards spilling out of it.
     * align-items AND justify-items computed to `center`, so the cards were CENTRED
       INSTEAD OF STRETCHED and came out at 231.09px and 215.94px in the same row.
       That is the CEO's "the size of the cards must be same, no small or big".
     * color computed to rgb(103,117,121), so every card title wore the pane's ink
       instead of the design's.
     * every svg inside a card was resized and re-stroked by `#mhDetail .ic svg` -
       the dated tab measured 130.2px wide against the design's 104.2px.
   The 25 Aug note below blamed a flex ancestor for the width and patched width:100%.
   That diagnosis was WRONG. The number gives it away: the grid did not collapse to
   "its own padding", it collapsed to 19px because a rule literally says width:19px.
   Renaming settles all five at once instead of contesting them property by property.

   AND the design's `.pill` is
   `.cn-pill` here. `.pill` is ALREADY an app-wide class - status-unify.css claims
   `.mh-app .pill:not(.icf)` and paints background, border, colour and box-shadow
   with !important. MEASURED on the live page before the rename: `.cn-pill`,
   `.cn-pill.green`, `.cn-pill.red` and `.cn-pill.slate` ALL computed to the same
   grey - colour rgb(103,117,121) on rgba(103,117,121,.13) - because that one rule
   won every contest. mh-casenotes.css also loads BEFORE status-unify.css, so an
   !important of our own would not have won either. The newcomer yields and takes a
   namespaced class, exactly as the CSS-prefix-collision law says.

   TWO SUBSTITUTIONS, both forced:
     * The demo loads Hanken Grotesk + JetBrains Mono from Google Fonts. This app
       SELF-HOSTS and must run with no CDN, so --mono resolves to the app's own
       IBM Plex Mono and the body face is already Hanken Grotesk.
     * body{} and .shell{} are the demo PAGE, not the component. The app has its
       own shell and one background, so those are not applied.
   ============================================================================= */
/* THE DESIGNER'S OWN TOKEN BLOCK - styles.css line 2, verbatim.
   It was dropped on the first landing and that is what made the popup look wrong:
   `--pine`, `--pine2`, `--ink`, `--mut`, `--dim`, `--faint`, `--red` and `--amber`
   resolved to NOTHING, so every declaration built on them fell back to nothing.
   MEASURED before the fix, on the live page:
     .cn-btn.pr background = rgba(0,0,0,0) with colour #EDF7F2 - the CEO's "nearly
       invisible pale disc" was white dots on a transparent button.
     .ft / .top / .state border-*-width = 0px - `1px solid var(--line)` is invalid
       at computed-value time when --line is undefined, so the popup had no rules.
     .hr background = transparent, .lnk and h3 both the app ink, not pine.
   `--line` is WORSE than undefined inside the record: #mhDetail declares its own
   `--line:#D9DFE7`, so the cards inherited the detail pane's grey instead of the
   designer's rgba(30,55,48,.09). Declaring it on .cnx settles both cases.
   ONE SUBSTITUTION, the one already documented above: --mono is the app's
   self-hosted IBM Plex Mono, because this app must run with no CDN. */
/* THE DESIGN'S OWN PAGE RESET, scoped to the component instead of to <body>.
   styles.css lines 3 and 5 are `body{...color:var(--ink)...}` and
   `h1,h2,h3,h4,p{margin:0}`. The first landing dropped both as "the demo PAGE",
   and they are not decoration:
     * MEASURED: .ix p had margin-bottom:16px - Bootstrap's `p{margin-bottom:1rem}`
       - so every card carried 16px of dead space under its snippet.
     * MEASURED: the card title computed to rgb(103,117,121). Only h4 inherits its
       colour in this design; every other value is explicit. Without the ink the
       titles wore whatever the surrounding pane happened to be painting.
   The colour is the designer's --ink, and the margin reset is the designer's line.
   Nothing here is ours except the selector it hangs on.

   `line-height:normal` IS ALSO THE DESIGN'S BASELINE, not a tweak. The demo's `body`
   rule declares no line-height, so everything that does not set its own inherits the
   UA default - `normal`. This app's body hands down 1.5, and it reached everything the
   designer left undeclared: `.cn-btn`, `.mi b`, `.kd`, `.nm`, `.sb`, `.tab`,
   `.state .tx b`. MEASURED: the footer buttons came out **38.75px** tall because the
   line box was 12.5px x 1.5 = 18.75px. With the design's own baseline they are 37px -
   the mock's own arithmetic (16px icon + 18px padding + 2px border, with a 17px line
   box from Hanken Grotesk at 12.5px). The eleven places where the designer DID declare
   a line-height (.ix p, #dbd p, .dg h3, .mi em, .sf b, .tr2 li, .sf .vs, .state .tx
   span, .sh2 em, .big) all out-specify this and keep their own.
   The h1-h4/p rule below still needs its own `line-height:normal`: Bootstrap declares
   `h1..h6{line-height:1.2}` and a declaration always beats inheritance. */
#mhDetail .cnx, .mh-app .cnx{color:var(--ink);line-height:normal}
#mhDetail .cnx h1, .mh-app .cnx h1, #mhDetail .cnx h2, .mh-app .cnx h2, #mhDetail .cnx h3, .mh-app .cnx h3, #mhDetail .cnx h4, .mh-app .cnx h4, #mhDetail .cnx p, .mh-app .cnx p{margin:0;line-height:normal}

/* AND THE APP'S GLOBAL <button> RESET HAS TO BE UNDONE FOR THE DESIGN'S OWN BUTTONS.
   MudBlazor ships `button{...justify-content:center...}` as a TYPE selector. The design
   never declares justify-content, because in a plain page it is `normal` - so nothing
   contested it and MudBlazor won on every design button.

   MEASURED, 26 Aug, on the case-actions menu: `.mi` rows whose sentence is SHORT were
   centred inside the row and the ones whose sentence WRAPS were not, so the icons sat
   at two different x positions - `Add follow-up` and `Transfer Case` at 1209.2 and
   1208.7, `Complete` and `Close Case` at 1192.5. That is the CEO's "align the values
   of the (...) to the left". It is not a padding problem; every row already had the
   same 9px.

   IT HAS NOW BITTEN TWICE. The second time was the edit form's Confidential and
   Safeguarding toggles, 26 Aug: MEASURED, the two switches sat at x=688.1 and x=642.9
   inside rows that both start at x=579 with the same 13px padding. The rows are the
   same width; their SENTENCES are not, so centring pushed each one in by half of its
   own leftover space. Adding `.cn-tgl` put both switches at x=593.

   >>> ANY NEW FLEX BUTTON INSIDE `.cnx` MUST BE ADDED TO THE SELECTOR BELOW. <<<
   The symptom is always the same and never looks like a CSS problem: rows that should
   line up don't, and the ones that are furthest out are the ones with the LEAST text.

   ENUMERATED, NOT `.cnx button`, AND THAT WAS TESTED RATHER THAN ASSUMED. A probe
   applying `.cnx button{justify-content:normal}` to all 65 buttons in the scope moved
   exactly two - these toggles - and changed no width anywhere else. It would still be
   the wrong rule: it reaches MhDatePicker's 42 `.dp-day` cells, which are grids
   centring their own content, and `.cn-bbtn`, which sets its own font at specificity
   20 and would lose to a `.cnx button` rule at 21. The newcomer yields here too. */
#mhDetail .cnx .ix, .mh-app .cnx .ix, #mhDetail .cnx .mi, .mh-app .cnx .mi, #mhDetail .cnx .cn-btn, .mh-app .cnx .cn-btn, #mhDetail .cnx .cn-tgl, .mh-app .cnx .cn-tgl{justify-content:normal}

#mhDetail .cnx, .mh-app .cnx{--pine:#1E4438;--pine2:#2F6B57;--ink:#1B2C27;--mut:#5B6A64;--dim:#8A9791;--faint:#9AA5A0;--line:rgba(30,55,48,.09);--red:#B4453A;--amber:#8F6220;--mono:'IBM Plex Mono',ui-monospace,Menlo,monospace}

#mhDetail .cnx .cn-ic, .mh-app .cnx .cn-ic{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:26px 22px;padding:12px 4px 4px}#mhDetail .cnx .ix, .mh-app .cnx .ix{position:relative;display:flex;flex-direction:column;gap:10px;padding:22px 22px 16px;border:1px solid rgba(30,55,48,.1);border-radius:4px 12px 12px 4px;text-align:left;cursor:pointer;background:linear-gradient(180deg,rgba(var(--tg-rgb,255,255,255),.96),rgba(var(--tg-rgb,255,255,255),.82));box-shadow:0 12px 26px -20px rgba(30,55,48,.45),inset 0 1px 0 #fff;backdrop-filter:blur(16px) saturate(150%);-webkit-backdrop-filter:blur(16px) saturate(150%);transition:transform .2s cubic-bezier(.2,.7,.3,1),box-shadow .2s ease,border-color .2s ease}#mhDetail .cnx .ix:hover, .mh-app .cnx .ix:hover, #mhDetail .cnx .ix:focus-visible, .mh-app .cnx .ix:focus-visible{transform:translateY(-4px);box-shadow:0 26px 40px -24px rgba(30,55,48,.45),inset 0 1px 0 #fff;border-color:rgba(47,107,87,.26);outline:none}#mhDetail .cnx .ix .tab, .mh-app .cnx .ix .tab{position:absolute;top:-13px;left:20px;display:flex;align-items:center;gap:8px;height:26px;padding:0 13px;white-space:nowrap;border-radius:7px 7px 0 0;font-family:var(--mono);font-size:11px;font-weight:500;letter-spacing:-.02em;color:#EAF5F0;background:linear-gradient(180deg,#27543F,#1B4034);box-shadow:0 6px 14px -10px rgba(16,40,34,.9)}#mhDetail .cnx .ix.over .tab, .mh-app .cnx .ix.over .tab{background:linear-gradient(180deg,#B4453A,#93372E)}#mhDetail .cnx .ix.due .tab, .mh-app .cnx .ix.due .tab{background:linear-gradient(180deg,#B98A31,#8F6220)}#mhDetail .cnx .ix.conf .tab, .mh-app .cnx .ix.conf .tab{background:linear-gradient(180deg,#54646E,#3D4C55)}#mhDetail .cnx .ix.safe .tab, .mh-app .cnx .ix.safe .tab{background:linear-gradient(180deg,#8E4A70,#6E3856)}#mhDetail .cnx .ix .lamps, .mh-app .cnx .ix .lamps{position:absolute;top:16px;right:18px;display:flex;align-items:center}#mhDetail .cnx .lp, .mh-app .cnx .lp{position:relative;width:11px;height:11px;flex:none;border-radius:50%;background:var(--lc);box-shadow:0 0 0 1px rgba(255,255,255,.9),0 0 0 4px var(--lg),inset 0 -1.5px 1.5px rgba(0,0,0,.22),inset 0 1px 1px rgba(255,255,255,.45)}#mhDetail .cnx .lp::after, .mh-app .cnx .lp::after{content:"";position:absolute;top:2px;left:2.5px;width:3.5px;height:2.8px;border-radius:50%;background:rgba(var(--tg-rgb,255,255,255),.8)}#mhDetail .cnx .lp.grn, .mh-app .cnx .lp.grn{--lc:#2F6B57;--lg:rgba(47,107,87,.18)}#mhDetail .cnx .lp.gld, .mh-app .cnx .lp.gld{--lc:#B98A31;--lg:rgba(185,138,49,.2)}#mhDetail .cnx .lp.red, .mh-app .cnx .lp.red{--lc:#B4453A;--lg:rgba(180,69,58,.18)}#mhDetail .cnx .lp.plm, .mh-app .cnx .lp.plm{--lc:#8E4A70;--lg:rgba(142,74,112,.18)}#mhDetail .cnx .lp.slt, .mh-app .cnx .lp.slt{--lc:#4B5B66;--lg:rgba(75,91,102,.18)}#mhDetail .cnx .lgd, .mh-app .cnx .lgd{display:flex;flex-wrap:wrap;gap:6px 18px;justify-content:flex-end;margin:-6px 2px 18px}#mhDetail .cnx .lgd span, .mh-app .cnx .lgd span{display:flex;align-items:center;gap:9px;font-size:11px;font-weight:700;letter-spacing:.01em;color:var(--dim)}#mhDetail .cnx .ix h4, .mh-app .cnx .ix h4{font-size:15.5px;font-weight:800;letter-spacing:-.015em;padding-right:34px}#mhDetail .cnx .ix .rule, .mh-app .cnx .ix .rule{height:1px;background:linear-gradient(90deg,rgba(47,107,87,.4),rgba(47,107,87,.06))}#mhDetail .cnx .ix p, .mh-app .cnx .ix p{font-size:13.5px;font-weight:500;line-height:28px;color:var(--mut);background-image:repeating-linear-gradient(180deg,transparent 0 24px,rgba(30,55,48,.06) 24px 25px);background-position:0 5px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}#mhDetail .cnx .ix .f, .mh-app .cnx .ix .f{margin-top:auto;padding-top:12px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12px;font-weight:700;color:var(--dim)}#mhDetail .cnx .ix .f b, .mh-app .cnx .ix .f b{color:#26332E}#mhDetail .cnx .cn-pill, .mh-app .cnx .cn-pill{display:inline-flex;align-items:center;gap:6px;font-size:10.5px;font-weight:800;letter-spacing:.03em;padding:4px 9px;border-radius:99px;white-space:nowrap;background:rgba(30,55,48,.06);color:var(--mut)}#mhDetail .cnx .cn-pill svg, .mh-app .cnx .cn-pill svg{width:11px;height:11px}#mhDetail .cnx .cn-pill.red, .mh-app .cnx .cn-pill.red{background:rgba(180,69,58,.1);color:var(--red)}#mhDetail .cnx .cn-pill.amber, .mh-app .cnx .cn-pill.amber{background:rgba(176,122,46,.13);color:var(--amber)}#mhDetail .cnx .cn-pill.green, .mh-app .cnx .cn-pill.green{background:rgba(47,107,87,.1);color:var(--pine2)}#mhDetail .cnx .cn-pill.plum, .mh-app .cnx .cn-pill.plum{background:rgba(142,74,112,.12);color:#8E4A70}#mhDetail .cnx .cn-pill.slate, .mh-app .cnx .cn-pill.slate{background:rgba(75,91,102,.13);color:#43535D}#mhDetail .cnx .ov, .mh-app .cnx .ov{position:fixed;inset:0;z-index:90;display:grid;place-items:center;padding:30px 20px;background:rgba(18,34,29,.4);backdrop-filter:blur(11px) saturate(130%);-webkit-backdrop-filter:blur(11px) saturate(130%);opacity:0;pointer-events:none;transition:opacity .22s ease}#mhDetail .cnx .ov.on, .mh-app .cnx .ov.on{opacity:1;pointer-events:auto}#mhDetail .cnx .dg, .mh-app .cnx .dg{position:relative;width:min(940px,100%);max-height:calc(100vh - 60px);display:flex;flex-direction:column;overflow:hidden;border-radius:26px;border:1px solid rgba(255,255,255,.6);background:linear-gradient(168deg,rgba(var(--tg-rgb,255,255,255),.97),color-mix(in srgb, var(--tg-cream2,rgb(247,251,249)) 92%, transparent));box-shadow:0 60px 110px -44px rgba(12,30,24,.68),0 0 0 1px rgba(30,55,48,.05),inset 0 1px 0 #fff;backdrop-filter:blur(30px) saturate(165%);-webkit-backdrop-filter:blur(30px) saturate(165%);transform:translateY(16px) scale(.97);opacity:0;transition:transform .26s cubic-bezier(.2,.75,.3,1),opacity .2s ease}#mhDetail .cnx .ov.on .dg, .mh-app .cnx .ov.on .dg{transform:none;opacity:1}#mhDetail .cnx .dg .band, .mh-app .cnx .dg .band{height:4px;flex:none;background:linear-gradient(90deg,#2F6B57,rgba(47,107,87,.12))}#mhDetail .cnx .dg.over .band, .mh-app .cnx .dg.over .band{background:linear-gradient(90deg,#B4453A,rgba(180,69,58,.12))}#mhDetail .cnx .dg.due .band, .mh-app .cnx .dg.due .band{background:linear-gradient(90deg,#B98A31,rgba(176,122,46,.12))}#mhDetail .cnx .dg.conf .band, .mh-app .cnx .dg.conf .band{background:linear-gradient(90deg,#4B5B66,rgba(75,91,102,.12))}#mhDetail .cnx .dg .top, .mh-app .cnx .dg .top{display:flex;align-items:center;gap:14px;flex:none;padding:16px 18px 16px 20px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,rgba(var(--tg-rgb,255,255,255),.8),rgba(var(--tg-rgb,255,255,255),calc(.35*var(--tg-k,1))))}#mhDetail .cnx .dg .who2, .mh-app .cnx .dg .who2{display:flex;align-items:center;gap:12px;min-width:0}#mhDetail .cnx .dg .cn-av, .mh-app .cnx .dg .cn-av{position:relative;display:grid;place-items:center;width:42px;height:42px;flex:none;border-radius:50%;background:linear-gradient(165deg,#27543F,#16342C);color:#CFE8DD;box-shadow:0 8px 16px -10px rgba(16,40,34,.9),inset 0 1px 0 rgba(255,255,255,.18)}#mhDetail .cnx .dg .cn-av svg, .mh-app .cnx .dg .cn-av svg{width:21px;height:21px}#mhDetail .cnx .dg .cn-av, .mh-app .cnx .dg .cn-av{overflow:hidden;cursor:pointer;transition:transform .15s ease,box-shadow .15s ease}#mhDetail .cnx .dg .cn-av img, .mh-app .cnx .dg .cn-av img{width:42px;height:42px;aspect-ratio:1;object-fit:cover;border-radius:50%;display:block}#mhDetail .cnx .dg .cn-av:hover, .mh-app .cnx .dg .cn-av:hover{transform:translateY(-1px);box-shadow:0 10px 20px -10px rgba(16,40,34,.75)}#mhDetail .cnx .dg .cn-av::after, .mh-app .cnx .dg .cn-av::after{content:"";position:absolute;inset:-4px;border-radius:50%;border:2px solid transparent}#mhDetail .cnx .dg.over .cn-av::after, .mh-app .cnx .dg.over .cn-av::after{border-color:rgba(180,69,58,.5)}#mhDetail .cnx .dg.due .cn-av::after, .mh-app .cnx .dg.due .cn-av::after{border-color:rgba(176,122,46,.5)}#mhDetail .cnx .dg.done .cn-av::after, .mh-app .cnx .dg.done .cn-av::after{border-color:rgba(47,107,87,.45)}#mhDetail .cnx .dg .nm, .mh-app .cnx .dg .nm{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:16.5px;font-weight:800;letter-spacing:-.02em}#mhDetail .cnx .dg .kd, .mh-app .cnx .dg .kd{font-size:9.5px;font-weight:800;letter-spacing:.09em;padding:3px 7px;border-radius:5px;background:rgba(47,107,87,.12);color:var(--pine2)}#mhDetail .cnx .dg .sb, .mh-app .cnx .dg .sb{display:flex;align-items:center;gap:7px;font-family:var(--mono);font-size:11px;font-weight:500;color:var(--dim);margin-top:3px}#mhDetail .cnx .dg .x, .mh-app .cnx .dg .x{display:grid;place-items:center;width:32px;height:32px;flex:none;border-radius:50%;border:1px solid var(--line);background:rgba(var(--tg-rgb,255,255,255),calc(.75*var(--tg-k,1)));color:var(--mut);cursor:pointer;margin-left:auto;transition:background .15s ease,color .15s ease}#mhDetail .cnx .dg .x svg, .mh-app .cnx .dg .x svg{width:14px;height:14px}#mhDetail .cnx .dg .x:hover, .mh-app .cnx .dg .x:hover{background:var(--pine);border-color:var(--pine);color:#EAF5F0}#mhDetail .cnx .dg .state, .mh-app .cnx .dg .state{display:flex;align-items:center;gap:13px;flex:none;padding:13px 22px;border-bottom:1px solid var(--line);background:rgba(30,55,48,.03)}#mhDetail .cnx .dg .state .ico, .mh-app .cnx .dg .state .ico{display:grid;place-items:center;width:34px;height:34px;flex:none;border-radius:11px;background:rgba(var(--tg-rgb,255,255,255),.8);border:1px solid rgba(30,55,48,.08);color:var(--pine2);box-shadow:inset 0 1px 0 #fff}#mhDetail .cnx .dg .state .ico svg, .mh-app .cnx .dg .state .ico svg{width:17px;height:17px}#mhDetail .cnx .dg .state .tx, .mh-app .cnx .dg .state .tx{display:flex;flex-direction:column;gap:2px;min-width:0}#mhDetail .cnx .dg .state .tx b, .mh-app .cnx .dg .state .tx b{font-size:12px;font-weight:800;letter-spacing:.09em;text-transform:uppercase}#mhDetail .cnx .dg .state .tx span, .mh-app .cnx .dg .state .tx span{font-size:12.5px;font-weight:600;color:var(--mut);line-height:1.4}#mhDetail .cnx .dg.done .state, .mh-app .cnx .dg.done .state{background:rgba(47,107,87,.07)}#mhDetail .cnx .dg.done .state .ico, .mh-app .cnx .dg.done .state .ico{color:var(--pine2)}#mhDetail .cnx .dg.done .state .tx b, .mh-app .cnx .dg.done .state .tx b{color:var(--pine2)}#mhDetail .cnx .dg.over .state, .mh-app .cnx .dg.over .state{background:rgba(180,69,58,.08)}#mhDetail .cnx .dg.over .state .ico, .mh-app .cnx .dg.over .state .ico{color:var(--red)}#mhDetail .cnx .dg.over .state .tx b, .mh-app .cnx .dg.over .state .tx b{color:var(--red)}#mhDetail .cnx .dg.due .state, .mh-app .cnx .dg.due .state{background:rgba(176,122,46,.1)}#mhDetail .cnx .dg.due .state .ico, .mh-app .cnx .dg.due .state .ico{color:var(--amber)}#mhDetail .cnx .dg.due .state .tx b, .mh-app .cnx .dg.due .state .tx b{color:var(--amber)}#mhDetail .cnx .dg.conf .state, .mh-app .cnx .dg.conf .state{background:rgba(75,91,102,.09)}#mhDetail .cnx .dg.conf .state .ico, .mh-app .cnx .dg.conf .state .ico{color:#43535D}#mhDetail .cnx .dg.conf .state .tx b, .mh-app .cnx .dg.conf .state .tx b{color:#43535D}#mhDetail .cnx .dg.over .state .ico::after, .mh-app .cnx .dg.over .state .ico::after{content:"";position:absolute;width:8px;height:8px;margin:-19px 0 0 24px;border-radius:50%;background:var(--red);box-shadow:0 0 0 3px rgba(180,69,58,.2);animation:pl 1.8s ease-in-out infinite}
@keyframes pl{50%{opacity:.35;transform:scale(.8)}}#mhDetail .cnx .dg .cn-grid, .mh-app .cnx .dg .cn-grid{display:flex;align-items:stretch;flex:1;min-height:0;overflow:hidden}#mhDetail .cnx .dg .cn-grid.fx, .mh-app .cnx .dg .cn-grid.fx{animation:fx .24s cubic-bezier(.2,.75,.3,1)}
@keyframes fx{from{opacity:0}}#mhDetail .cnx .dg .main, .mh-app .cnx .dg .main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:15px;padding:24px 24px 26px;overflow:auto}#mhDetail .cnx .dg h3, .mh-app .cnx .dg h3{font-size:24px;font-weight:800;letter-spacing:-.035em;line-height:1.18}#mhDetail .cnx .dg #dbd, .mh-app .cnx .dg #dbd{display:flex;flex-direction:column;gap:12px}#mhDetail .cnx .dg #dbd p, .mh-app .cnx .dg #dbd p{font-size:15px;font-weight:500;line-height:1.68;color:#495753;text-wrap:pretty}#mhDetail .cnx .dg #dbd p mark, .mh-app .cnx .dg #dbd p mark{background:rgba(47,107,87,.13);color:var(--pine);font-weight:700;padding:1px 6px;border-radius:6px}#mhDetail .cnx .dg .tgs, .mh-app .cnx .dg .tgs{display:flex;flex-wrap:wrap;gap:7px;margin-top:auto;padding-top:6px}#mhDetail .cnx .dg .side, .mh-app .cnx .dg .side{flex:0 0 278px;display:flex;flex-direction:column;gap:17px;padding:22px 22px 26px;overflow:auto;border-left:1px solid rgba(255,255,255,.7);background:linear-gradient(180deg,rgba(var(--tg-rgb,255,255,255),calc(.62*var(--tg-k,1))),rgba(233,242,238,.5));box-shadow:inset 1px 0 0 rgba(30,55,48,.07);backdrop-filter:blur(22px) saturate(170%);-webkit-backdrop-filter:blur(22px) saturate(170%)}#mhDetail .cnx .sf, .mh-app .cnx .sf{display:flex;flex-direction:column;gap:5px;min-width:0}#mhDetail .cnx .sf>span:first-child, .mh-app .cnx .sf>span:first-child{font-size:9.5px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;color:var(--faint)}#mhDetail .cnx .sf b, .mh-app .cnx .sf b{font-size:13.5px;font-weight:700;color:#26332E;line-height:1.3;overflow-wrap:anywhere}#mhDetail .cnx .sf em, .mh-app .cnx .sf em{font-style:normal;font-size:11.5px;font-weight:600;color:var(--dim)}#mhDetail .cnx .sf .big, .mh-app .cnx .sf .big{display:flex;align-items:baseline;gap:5px;font-size:27px;font-weight:800;letter-spacing:-.04em;color:#20302B;line-height:1}#mhDetail .cnx .sf .big i, .mh-app .cnx .sf .big i{font-style:normal;font-size:12px;font-weight:800;letter-spacing:.02em;color:var(--dim)}#mhDetail .cnx .sf .none, .mh-app .cnx .sf .none{color:#A2ADA8;font-weight:600;font-size:13px}#mhDetail .cnx .sf .wr, .mh-app .cnx .sf .wr{display:flex;align-items:center;gap:9px}#mhDetail .cnx .sf .wr>span, .mh-app .cnx .sf .wr>span{display:flex;flex-direction:column;gap:2px;min-width:0}#mhDetail .cnx .sf .cn-pill, .mh-app .cnx .sf .cn-pill{align-self:flex-start;margin-top:1px}#mhDetail .cnx .sf .ini, .mh-app .cnx .sf .ini{position:relative;display:block;width:36px;height:36px;flex:none;border-radius:50%;overflow:hidden;background:linear-gradient(165deg,#2B5A45,#173630);box-shadow:0 8px 16px -11px rgba(16,40,34,.95),inset 0 1px 0 rgba(255,255,255,.2);outline:none;transition:transform .16s ease,box-shadow .16s ease}#mhDetail .cnx .sf a.ini, .mh-app .cnx .sf a.ini{cursor:pointer}#mhDetail .cnx .sf a.ini:hover, .mh-app .cnx .sf a.ini:hover{transform:scale(1.05);box-shadow:0 10px 18px -10px rgba(16,40,34,.95),0 0 0 2px rgba(47,107,87,.35)}#mhDetail .cnx .sf a.ini:focus-visible, .mh-app .cnx .sf a.ini:focus-visible{box-shadow:0 0 0 3px rgba(47,107,87,.4)}#mhDetail .cnx .sf .ini img, .mh-app .cnx .sf .ini img{display:block;width:100%;height:100%;object-fit:cover;object-position:center}#mhDetail .cnx .sf .vs, .mh-app .cnx .sf .vs{display:flex;align-items:flex-start;gap:7px;font-size:12px;font-weight:600;color:var(--mut);line-height:1.45}#mhDetail .cnx .sf .vs svg, .mh-app .cnx .sf .vs svg{width:13px;height:13px;flex:none;margin-top:2px;color:var(--dim)}#mhDetail .cnx .hr, .mh-app .cnx .hr{height:1px;background:var(--line)}#mhDetail .cnx .tr2, .mh-app .cnx .tr2{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}#mhDetail .cnx .tr2 li, .mh-app .cnx .tr2 li{position:relative;padding:0 0 13px 20px;font-size:12px;font-weight:700;color:#3A4A45;line-height:1.35}#mhDetail .cnx .tr2 li:last-child, .mh-app .cnx .tr2 li:last-child{padding-bottom:0}#mhDetail .cnx .tr2 li::before, .mh-app .cnx .tr2 li::before{content:"";position:absolute;left:0;top:3px;width:7px;height:7px;border-radius:50%;background:rgb(var(--tg-rgb,255,255,255));border:2px solid rgba(47,107,87,.45);box-sizing:content-box}#mhDetail .cnx .tr2 li:last-child::before, .mh-app .cnx .tr2 li:last-child::before{background:var(--pine2);border-color:var(--pine2)}#mhDetail .cnx .tr2 li::after, .mh-app .cnx .tr2 li::after{content:"";position:absolute;left:5px;top:17px;bottom:2px;width:1px;background:rgba(30,55,48,.16)}#mhDetail .cnx .tr2 li:last-child::after, .mh-app .cnx .tr2 li:last-child::after{display:none}#mhDetail .cnx .tr2 li em, .mh-app .cnx .tr2 li em{display:block;font-style:normal;font-family:var(--mono);font-size:10px;font-weight:500;color:var(--faint);margin-top:2px;letter-spacing:-.02em}#mhDetail .cnx .dg .ft, .mh-app .cnx .dg .ft{display:flex;align-items:center;gap:12px;flex-wrap:wrap;flex:none;padding:14px 22px;border-top:1px solid var(--line);background:linear-gradient(180deg,rgba(30,55,48,.02),rgba(30,55,48,.05))}#mhDetail .cnx .dg .ft .lnk, .mh-app .cnx .dg .ft .lnk{display:inline-flex;align-items:center;gap:8px;font-size:12.5px;font-weight:800;color:var(--pine);text-decoration:none}#mhDetail .cnx .dg .ft .lnk svg, .mh-app .cnx .dg .ft .lnk svg{width:14px;height:14px}#mhDetail .cnx .dg .ft .lnk:hover, .mh-app .cnx .dg .ft .lnk:hover{color:#123028}#mhDetail .cnx .dg .sp, .mh-app .cnx .dg .sp{margin-left:auto;display:flex;gap:9px}#mhDetail .cnx .cn-btn, .mh-app .cnx .cn-btn{display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border-radius:99px;font-size:12.5px;font-weight:800;letter-spacing:.01em;cursor:pointer;border:1px solid transparent;transition:background .16s ease,color .16s ease,border-color .16s ease}#mhDetail .cnx .cn-btn svg, .mh-app .cnx .cn-btn svg{width:14px;height:14px}#mhDetail .cnx .cn-btn.gh, .mh-app .cnx .cn-btn.gh{background:rgba(var(--tg-rgb,255,255,255),.8);border-color:rgba(30,55,48,.14);color:var(--mut)}#mhDetail .cnx .cn-btn.gh:hover, .mh-app .cnx .cn-btn.gh:hover{border-color:rgba(47,107,87,.35);color:var(--pine)}#mhDetail .cnx .cn-btn.pr, .mh-app .cnx .cn-btn.pr{background:var(--pine);color:#EDF7F2;box-shadow:0 10px 20px -14px rgba(16,40,34,.9)}#mhDetail .cnx .cn-btn.pr:hover, .mh-app .cnx .cn-btn.pr:hover{background:#153327}#mhDetail .cnx .cn-btn.br, .mh-app .cnx .cn-btn.br{background:rgba(47,107,87,.11);border-color:rgba(47,107,87,.26);color:var(--pine)}#mhDetail .cnx .cn-btn.br:hover, .mh-app .cnx .cn-btn.br:hover{background:rgba(47,107,87,.17);border-color:rgba(47,107,87,.42)}#mhDetail .cnx .cn-btn.br svg, .mh-app .cnx .cn-btn.br svg{width:15px;height:15px}#mhDetail .cnx .dg .ft .mw, .mh-app .cnx .dg .ft .mw{position:relative;display:flex}#mhDetail .cnx .cn-btn.io, .mh-app .cnx .cn-btn.io{padding:9px 11px}#mhDetail .cnx .cn-btn.io svg, .mh-app .cnx .cn-btn.io svg{width:16px;height:16px}#mhDetail .cnx #dmore[aria-expanded="true"], .mh-app .cnx #dmore[aria-expanded="true"]{border-color:rgba(47,107,87,.4);color:var(--pine);background:rgb(var(--tg-rgb,255,255,255))}#mhDetail .cnx .menu, .mh-app .cnx .menu{position:absolute;bottom:calc(100% + 10px);right:0;z-index:5;width:272px;display:flex;flex-direction:column;padding:8px;border-radius:17px;border:1px solid rgba(255,255,255,.75);background:linear-gradient(180deg,rgba(var(--tg-rgb,255,255,255),.97),color-mix(in srgb, var(--tg-cream2,rgb(245,250,247)) 95%, transparent));backdrop-filter:blur(20px) saturate(160%);-webkit-backdrop-filter:blur(20px) saturate(160%);box-shadow:0 28px 48px -22px rgba(16,40,34,.5),0 2px 6px rgba(16,40,34,.07);opacity:0;transform:translateY(6px) scale(.97);transform-origin:100% 100%;pointer-events:none;transition:opacity .16s ease,transform .18s cubic-bezier(.2,.75,.3,1)}#mhDetail .cnx .menu.on, .mh-app .cnx .menu.on{opacity:1;transform:none;pointer-events:auto}#mhDetail .cnx .menu .mh, .mh-app .cnx .menu .mh{padding:4px 9px 7px;font-size:9.5px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;color:var(--faint)}#mhDetail .cnx .menu .msep, .mh-app .cnx .menu .msep{height:1px;margin:5px 7px;background:var(--line)}#mhDetail .cnx .mi, .mh-app .cnx .mi{display:flex;align-items:flex-start;gap:11px;width:100%;padding:9px;border:0;border-radius:11px;background:none;text-align:left;cursor:pointer;color:inherit;font:inherit;transition:background .14s ease}#mhDetail .cnx .mi:hover, .mh-app .cnx .mi:hover, #mhDetail .cnx .mi:focus-visible, .mh-app .cnx .mi:focus-visible{background:rgba(47,107,87,.09);outline:none}#mhDetail .cnx .mi .mic, .mh-app .cnx .mi .mic{display:grid;place-items:center;width:28px;height:28px;flex:none;border-radius:9px;background:rgba(47,107,87,.11);color:var(--pine2)}#mhDetail .cnx .mi .mic svg, .mh-app .cnx .mi .mic svg{width:15px;height:15px}#mhDetail .cnx .mi b, .mh-app .cnx .mi b{display:block;font-size:13px;font-weight:800;letter-spacing:-.012em}#mhDetail .cnx .mi em, .mh-app .cnx .mi em{display:block;font-style:normal;font-size:11.5px;font-weight:600;line-height:1.35;color:var(--dim);margin-top:2px}#mhDetail .cnx .mi.dst .mic, .mh-app .cnx .mi.dst .mic{background:rgba(180,69,58,.12);color:var(--red)}#mhDetail .cnx .mi.dst:hover, .mh-app .cnx .mi.dst:hover, #mhDetail .cnx .mi.dst:focus-visible, .mh-app .cnx .mi.dst:focus-visible{background:rgba(180,69,58,.09)}#mhDetail .cnx .mi.dst:hover b, .mh-app .cnx .mi.dst:hover b, #mhDetail .cnx .mi.dst:focus-visible b, .mh-app .cnx .mi.dst:focus-visible b{color:var(--red)}#mhDetail .cnx .mi:disabled, .mh-app .cnx .mi:disabled{cursor:default;opacity:.45}#mhDetail .cnx .mi:disabled:hover, .mh-app .cnx .mi:disabled:hover{background:none}#mhDetail .cnx .tst, .mh-app .cnx .tst{position:absolute;left:50%;bottom:76px;z-index:6;display:flex;align-items:center;gap:9px;padding:10px 17px;border-radius:99px;font-size:12.5px;font-weight:700;letter-spacing:-.01em;color:#EAF5F0;background:rgba(21,45,37,.95);box-shadow:0 20px 36px -20px rgba(16,40,34,.85);opacity:0;transform:translate(-50%,8px);pointer-events:none;transition:opacity .18s ease,transform .18s ease}#mhDetail .cnx .tst.on, .mh-app .cnx .tst.on{opacity:1;transform:translate(-50%,0)}#mhDetail .cnx .sheet, .mh-app .cnx .sheet{position:absolute;inset:0;z-index:8;display:grid;place-items:center;padding:26px;background:rgba(18,34,29,.34);backdrop-filter:blur(6px) saturate(130%);-webkit-backdrop-filter:blur(6px) saturate(130%);opacity:0;pointer-events:none;transition:opacity .18s ease}#mhDetail .cnx .sheet.on, .mh-app .cnx .sheet.on{opacity:1;pointer-events:auto}#mhDetail .cnx .sc, .mh-app .cnx .sc{width:min(430px,100%);max-height:100%;overflow:auto;display:flex;flex-direction:column;gap:16px;padding:22px;border-radius:20px;border:1px solid rgba(255,255,255,.7);background:linear-gradient(180deg,rgba(var(--tg-rgb,255,255,255),.98),color-mix(in srgb, var(--tg-cream2,rgb(245,250,247)) 96%, transparent));box-shadow:0 34px 60px -26px rgba(16,40,34,.6);transform:translateY(10px) scale(.98);transition:transform .2s cubic-bezier(.2,.75,.3,1)}#mhDetail .cnx .sheet.on .sc, .mh-app .cnx .sheet.on .sc{transform:none}#mhDetail .cnx .sh2 b, .mh-app .cnx .sh2 b{display:block;font-size:17px;font-weight:800;letter-spacing:-.025em}#mhDetail .cnx .sh2 em, .mh-app .cnx .sh2 em{display:block;font-style:normal;font-size:13px;font-weight:600;line-height:1.5;color:var(--mut);margin-top:6px;text-wrap:pretty}#mhDetail .cnx .fld, .mh-app .cnx .fld{display:flex;flex-direction:column;gap:7px}#mhDetail .cnx .fld label, .mh-app .cnx .fld label{font-size:9.5px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;color:var(--faint)}#mhDetail .cnx .fld input, .mh-app .cnx .fld input{width:100%;padding:11px 13px;border-radius:12px;border:1px solid rgba(30,55,48,.16);background:rgb(var(--tg-rgb,255,255,255));font:inherit;font-size:14px;font-weight:700;color:var(--ink);box-shadow:inset 0 1px 2px rgba(30,55,48,.05)}#mhDetail .cnx .fld input:focus, .mh-app .cnx .fld input:focus{outline:none;border-color:var(--pine2);box-shadow:0 0 0 3px rgba(47,107,87,.14)}#mhDetail .cnx .chips, .mh-app .cnx .chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:-6px}#mhDetail .cnx .chp, .mh-app .cnx .chp{padding:7px 13px;border-radius:99px;border:1px solid rgba(30,55,48,.14);background:rgba(var(--tg-rgb,255,255,255),.85);font-size:12px;font-weight:700;color:var(--mut);cursor:pointer;transition:background .14s ease,border-color .14s ease,color .14s ease}#mhDetail .cnx .chp:hover, .mh-app .cnx .chp:hover{border-color:rgba(47,107,87,.4);color:var(--pine)}#mhDetail .cnx .chp.on, .mh-app .cnx .chp.on{background:rgba(47,107,87,.12);border-color:rgba(47,107,87,.4);color:var(--pine)}#mhDetail .cnx .mates, .mh-app .cnx .mates{display:flex;flex-direction:column;gap:7px}#mhDetail .cnx .mate, .mh-app .cnx .mate{position:relative;display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:13px;border:1px solid rgba(30,55,48,.12);background:rgba(var(--tg-rgb,255,255,255),.8);cursor:pointer;transition:border-color .14s ease,background .14s ease}#mhDetail .cnx .mate:hover, .mh-app .cnx .mate:hover{border-color:rgba(47,107,87,.32);background:rgb(var(--tg-rgb,255,255,255))}#mhDetail .cnx .mate input, .mh-app .cnx .mate input{position:absolute;opacity:0;pointer-events:none}#mhDetail .cnx .mate img, .mh-app .cnx .mate img{width:34px;height:34px;flex:none;border-radius:50%;object-fit:cover}#mhDetail .cnx .mate b, .mh-app .cnx .mate b{display:block;font-size:13.5px;font-weight:800;letter-spacing:-.012em}#mhDetail .cnx .mate em, .mh-app .cnx .mate em{display:block;font-style:normal;font-size:11.5px;font-weight:600;color:var(--dim);margin-top:1px}#mhDetail .cnx .mate .tick, .mh-app .cnx .mate .tick{display:grid;place-items:center;width:22px;height:22px;flex:none;margin-left:auto;border-radius:50%;border:1px solid rgba(30,55,48,.16);color:transparent;transition:background .14s ease,border-color .14s ease,color .14s ease}#mhDetail .cnx .mate .tick svg, .mh-app .cnx .mate .tick svg{width:12px;height:12px}#mhDetail .cnx .mate:has(input:checked), .mh-app .cnx .mate:has(input:checked){border-color:var(--pine2);background:rgba(47,107,87,.07)}#mhDetail .cnx .mate:has(input:checked) .tick, .mh-app .cnx .mate:has(input:checked) .tick{background:var(--pine);border-color:var(--pine);color:#EAF5F0}#mhDetail .cnx .sfoot, .mh-app .cnx .sfoot{display:flex;justify-content:flex-end;gap:9px;padding-top:2px}#mhDetail .cnx .sfoot .cn-btn:disabled, .mh-app .cnx .sfoot .cn-btn:disabled{opacity:.45;cursor:default}

@media(max-width:1100px){#mhDetail .cnx .lgh, .mh-app .cnx .lgh, #mhDetail .cnx .lr, .mh-app .cnx .lr{grid-template-columns:14px 96px minmax(0,1fr) 138px 34px;gap:14px}#mhDetail .cnx .lgh span:nth-child(4), .mh-app .cnx .lgh span:nth-child(4){display:none}#mhDetail .cnx .lr .wb, .mh-app .cnx .lr .wb{display:none}}
@media(max-width:900px){#mhDetail .cnx .dg .cn-grid, .mh-app .cnx .dg .cn-grid{grid-template-columns:minmax(0,1fr);overflow:auto}#mhDetail .cnx .dg .main, .mh-app .cnx .dg .main, #mhDetail .cnx .dg .side, .mh-app .cnx .dg .side{overflow:visible}#mhDetail .cnx .dg .side, .mh-app .cnx .dg .side{border-left:0;border-top:1px solid rgba(30,55,48,.08);box-shadow:none;display:grid;grid-template-columns:1fr 1fr;gap:16px 20px}#mhDetail .cnx .dg .side .hr, .mh-app .cnx .dg .side .hr, #mhDetail .cnx .dg .side .tr2, .mh-app .cnx .dg .side .tr2{grid-column:1/-1}}
@media(max-width:860px){#mhDetail .cnx .lgh, .mh-app .cnx .lgh, #mhDetail .cnx .lr, .mh-app .cnx .lr{grid-template-columns:14px 90px minmax(0,1fr) 34px}#mhDetail .cnx .lgh span:nth-child(5), .mh-app .cnx .lgh span:nth-child(5){display:none}#mhDetail .cnx .lr .fu, .mh-app .cnx .lr .fu{display:none}}
@media(max-width:720px){#mhDetail .cnx, .mh-app .cnx{padding:22px 16px 60px}#mhDetail .cnx .panel, .mh-app .cnx .panel{padding:16px}#mhDetail .cnx .lgh, .mh-app .cnx .lgh, #mhDetail .cnx .lr, .mh-app .cnx .lr{grid-template-columns:12px 78px minmax(0,1fr) 34px}#mhDetail .cnx .lr .tt span, .mh-app .cnx .lr .tt span{display:none}#mhDetail .cnx .dg h3, .mh-app .cnx .dg h3{font-size:20px}}#mhDetail .cnx .rc, .mh-app .cnx .rc{display:grid;grid-template-columns:repeat(auto-fill,minmax(236px,1fr));gap:24px;padding:6px 4px}#mhDetail .cnx .rs, .mh-app .cnx .rs{position:relative;display:flex;flex-direction:column;gap:10px;padding:22px 18px 20px;border:0;text-align:left;cursor:pointer;font:inherit;color:inherit;background:linear-gradient(180deg,rgba(var(--tg-rgb,255,255,255),.97),color-mix(in srgb, rgb(var(--tg-rgb,rgb(250,251,250))) 90%, transparent));box-shadow:0 14px 28px -20px rgba(30,55,48,.5),inset 0 0 0 1px rgba(30,55,48,.07);-webkit-mask-image:radial-gradient(circle 5px at 5px 0,#0000 5px,#000 5.5px),radial-gradient(circle 5px at 5px 100%,#0000 5px,#000 5.5px);mask-image:radial-gradient(circle 5px at 5px 0,#0000 5px,#000 5.5px),radial-gradient(circle 5px at 5px 100%,#0000 5px,#000 5.5px);-webkit-mask-size:14px 100%;mask-size:14px 100%;-webkit-mask-repeat:repeat-x;mask-repeat:repeat-x;-webkit-mask-composite:source-in;mask-composite:intersect;transition:transform .2s cubic-bezier(.2,.7,.3,1),box-shadow .2s ease}#mhDetail .cnx .rs:hover, .mh-app .cnx .rs:hover, #mhDetail .cnx .rs:focus-visible, .mh-app .cnx .rs:focus-visible{transform:translateY(-5px);box-shadow:0 28px 40px -24px rgba(30,55,48,.5),inset 0 0 0 1px rgba(47,107,87,.22);outline:none}#mhDetail .cnx .rs .rh, .mh-app .cnx .rs .rh{display:flex;align-items:center;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:9.5px;font-weight:500;letter-spacing:.06em;color:var(--faint)}#mhDetail .cnx .rs .dsh, .mh-app .cnx .rs .dsh{height:0;border-top:1px dashed rgba(30,55,48,.22)}#mhDetail .cnx .rs h4, .mh-app .cnx .rs h4{font-size:15px;font-weight:800;letter-spacing:-.015em;line-height:1.28}#mhDetail .cnx .rs p, .mh-app .cnx .rs p{font-family:var(--mono);font-size:11px;font-weight:500;line-height:1.62;color:var(--mut);display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}#mhDetail .cnx .rs .rw, .mh-app .cnx .rs .rw{display:flex;align-items:baseline;gap:8px;font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.02em;color:var(--dim)}#mhDetail .cnx .rs .rw i, .mh-app .cnx .rs .rw i{flex:1;font-style:normal;border-bottom:1px dotted rgba(30,55,48,.2);transform:translateY(-3px)}#mhDetail .cnx .rs .rw b, .mh-app .cnx .rs .rw b{font-family:'Hanken Grotesk',sans-serif;font-size:11.5px;font-weight:800;letter-spacing:0;color:#26332E}#mhDetail .cnx .rs .stmp, .mh-app .cnx .rs .stmp{align-self:flex-start;margin-top:2px;padding:5px 10px;border:1.5px solid rgba(47,107,87,.45);border-radius:5px;transform:rotate(-3.5deg);font-size:10px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--pine2);opacity:.85}#mhDetail .cnx .rs.over .stmp, .mh-app .cnx .rs.over .stmp{border-color:rgba(180,69,58,.5);color:var(--red)}#mhDetail .cnx .rs.due .stmp, .mh-app .cnx .rs.due .stmp{border-color:rgba(176,122,46,.5);color:var(--amber)}#mhDetail .cnx .rs.conf .stmp, .mh-app .cnx .rs.conf .stmp{border-color:rgba(142,74,112,.45);color:#8E4A70}#mhDetail .cnx .bp, .mh-app .cnx .bp{display:flex;flex-direction:column;gap:14px;padding:4px}#mhDetail .cnx .bpc, .mh-app .cnx .bpc{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 176px;width:100%;border:1px solid var(--line);border-radius:16px;background:linear-gradient(120deg,rgba(var(--tg-rgb,255,255,255),.95),color-mix(in srgb, var(--tg-cream2,rgb(246,250,248)) 86%, transparent));box-shadow:0 14px 30px -24px rgba(30,55,48,.5),inset 0 1px 0 #fff;backdrop-filter:blur(18px) saturate(155%);-webkit-backdrop-filter:blur(18px) saturate(155%);cursor:pointer;text-align:left;font:inherit;color:inherit;overflow:hidden;transition:transform .2s cubic-bezier(.2,.7,.3,1),box-shadow .2s ease,border-color .2s ease}#mhDetail .cnx .bpc:hover, .mh-app .cnx .bpc:hover, #mhDetail .cnx .bpc:focus-visible, .mh-app .cnx .bpc:focus-visible{transform:translateY(-4px);box-shadow:0 26px 40px -26px rgba(30,55,48,.5);border-color:rgba(47,107,87,.26);outline:none}#mhDetail .cnx .bpc .lft, .mh-app .cnx .bpc .lft{display:flex;flex-direction:column;gap:7px;padding:18px 22px}#mhDetail .cnx .bpc .kk, .mh-app .cnx .bpc .kk{display:flex;align-items:center;gap:9px;font-family:var(--mono);font-size:9.5px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--faint)}#mhDetail .cnx .bpc h4, .mh-app .cnx .bpc h4{font-size:16px;font-weight:800;letter-spacing:-.02em}#mhDetail .cnx .bpc p, .mh-app .cnx .bpc p{font-size:13px;font-weight:500;line-height:1.5;color:var(--mut);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#mhDetail .cnx .bpc .who3, .mh-app .cnx .bpc .who3{display:flex;align-items:center;gap:9px;margin-top:2px;font-size:11.5px;font-weight:700;color:var(--dim)}#mhDetail .cnx .bpc .who3 img, .mh-app .cnx .bpc .who3 img{width:22px;height:22px;border-radius:50%;object-fit:cover}#mhDetail .cnx .bpc .stub, .mh-app .cnx .bpc .stub{position:relative;display:flex;flex-direction:column;justify-content:center;gap:5px;padding:18px 20px;border-left:2px dashed rgba(30,55,48,.16);background:linear-gradient(180deg,rgba(30,55,48,.035),rgba(30,55,48,.075))}#mhDetail .cnx .bpc .stub::before, .mh-app .cnx .bpc .stub::before, #mhDetail .cnx .bpc .stub::after, .mh-app .cnx .bpc .stub::after{content:"";position:absolute;left:-9px;width:16px;height:16px;border-radius:50%;background:rgb(var(--tg-rgb,255,255,255));border:1px solid var(--line)}#mhDetail .cnx .bpc .stub::before, .mh-app .cnx .bpc .stub::before{top:-9px}#mhDetail .cnx .bpc .stub::after, .mh-app .cnx .bpc .stub::after{bottom:-9px}#mhDetail .cnx .bpc .stub span, .mh-app .cnx .bpc .stub span{font-size:9px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--faint)}#mhDetail .cnx .bpc .stub b, .mh-app .cnx .bpc .stub b{font-size:16px;font-weight:800;letter-spacing:-.03em;color:#26332E}#mhDetail .cnx .bpc.over .stub b, .mh-app .cnx .bpc.over .stub b{color:var(--red)}#mhDetail .cnx .bpc.due .stub b, .mh-app .cnx .bpc.due .stub b{color:var(--amber)}#mhDetail .cnx .bpc .stub em, .mh-app .cnx .bpc .stub em{font-style:normal;font-size:11px;font-weight:700;color:var(--dim)}#mhDetail .cnx .bpc .bc, .mh-app .cnx .bpc .bc{margin-top:8px;height:20px;background-image:repeating-linear-gradient(90deg,rgba(30,55,48,.55) 0 1px,transparent 1px 3px,rgba(30,55,48,.55) 3px 5px,transparent 5px 6px,rgba(30,55,48,.55) 6px 7px,transparent 7px 10px);opacity:.5}#mhDetail .cnx .ch, .mh-app .cnx .ch{display:flex;flex-direction:column;gap:12px;padding:4px 4px 6px}#mhDetail .cnx .cday, .mh-app .cnx .cday{display:flex;align-items:center;gap:12px;margin-top:6px}#mhDetail .cnx .cday:first-child, .mh-app .cnx .cday:first-child{margin-top:0}#mhDetail .cnx .cday span, .mh-app .cnx .cday span{font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--faint)}#mhDetail .cnx .cday i, .mh-app .cnx .cday i{flex:1;height:1px;background:var(--line)}#mhDetail .cnx .cm, .mh-app .cnx .cm{display:grid;grid-template-columns:36px minmax(0,1fr);gap:12px;align-items:start;width:100%;border:0;background:none;padding:0;text-align:left;cursor:pointer;font:inherit;color:inherit}#mhDetail .cnx .cm img, .mh-app .cnx .cm img{width:36px;height:36px;border-radius:50%;object-fit:cover;box-shadow:0 6px 14px -10px rgba(16,40,34,.9)}#mhDetail .cnx .cb, .mh-app .cnx .cb{display:flex;flex-direction:column;gap:6px;padding:14px 17px;border:1px solid var(--line);border-radius:5px 17px 17px 17px;background:linear-gradient(160deg,rgba(var(--tg-rgb,255,255,255),.96),rgba(var(--tg-rgb,255,255,255),calc(.78*var(--tg-k,1))));box-shadow:0 12px 26px -24px rgba(30,55,48,.55),inset 0 1px 0 #fff;backdrop-filter:blur(16px) saturate(150%);-webkit-backdrop-filter:blur(16px) saturate(150%);transition:transform .18s cubic-bezier(.2,.7,.3,1),border-color .18s ease,box-shadow .18s ease}#mhDetail .cnx .cm:hover .cb, .mh-app .cnx .cm:hover .cb, #mhDetail .cnx .cm:focus-visible .cb, .mh-app .cnx .cm:focus-visible .cb{transform:translateX(4px);border-color:rgba(47,107,87,.26);box-shadow:0 18px 30px -26px rgba(30,55,48,.5),inset 0 1px 0 #fff}#mhDetail .cnx .cm:focus-visible, .mh-app .cnx .cm:focus-visible{outline:none}#mhDetail .cnx .cb .cn, .mh-app .cnx .cb .cn{display:flex;align-items:center;gap:9px;flex-wrap:wrap}#mhDetail .cnx .cb .cn b, .mh-app .cnx .cb .cn b{font-size:13px;font-weight:800;letter-spacing:-.01em}#mhDetail .cnx .cb .cn em, .mh-app .cnx .cb .cn em{font-style:normal;font-family:var(--mono);font-size:10px;font-weight:500;color:var(--faint)}#mhDetail .cnx .cb h4, .mh-app .cnx .cb h4{font-size:14.5px;font-weight:800;letter-spacing:-.015em}#mhDetail .cnx .cb p, .mh-app .cnx .cb p{font-size:13px;font-weight:500;line-height:1.55;color:var(--mut);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}#mhDetail .cnx .cb .rd, .mh-app .cnx .cb .rd{display:flex;align-items:center;gap:6px;font-size:10.5px;font-weight:700;color:var(--faint)}#mhDetail .cnx .cb .rd svg, .mh-app .cnx .cb .rd svg{width:13px;height:13px;color:var(--pine2)}#mhDetail .cnx .cm.over .cb, .mh-app .cnx .cm.over .cb{border-color:rgba(180,69,58,.28)}#mhDetail .cnx .cm.due .cb, .mh-app .cnx .cm.due .cb{border-color:rgba(176,122,46,.3)}#mhDetail .cnx .ed, .mh-app .cnx .ed{display:flex;flex-direction:column;padding:0 4px}#mhDetail .cnx .er, .mh-app .cnx .er{display:grid;grid-template-columns:112px minmax(0,1fr) auto;gap:26px;align-items:start;width:100%;padding:24px 8px;border:0;border-top:1px solid var(--line);background:none;text-align:left;cursor:pointer;font:inherit;color:inherit;transition:background .18s ease}#mhDetail .cnx .er:first-child, .mh-app .cnx .er:first-child{border-top:0}#mhDetail .cnx .er:hover, .mh-app .cnx .er:hover, #mhDetail .cnx .er:focus-visible, .mh-app .cnx .er:focus-visible{background:linear-gradient(90deg,rgba(47,107,87,.05),rgba(47,107,87,0));outline:none}#mhDetail .cnx .er .dcol, .mh-app .cnx .er .dcol{display:flex;flex-direction:column;gap:2px}#mhDetail .cnx .er .dcol b, .mh-app .cnx .er .dcol b{font-size:38px;font-weight:800;letter-spacing:-.05em;line-height:.9;color:#20302B}#mhDetail .cnx .er .dcol span, .mh-app .cnx .er .dcol span{font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--faint)}#mhDetail .cnx .er .ix2, .mh-app .cnx .er .ix2{margin-top:8px;font-family:var(--mono);font-size:10px;font-weight:500;color:rgba(30,55,48,.3)}#mhDetail .cnx .er .txt, .mh-app .cnx .er .txt{display:flex;flex-direction:column;gap:8px;min-width:0}#mhDetail .cnx .er .kk, .mh-app .cnx .er .kk{font-family:var(--mono);font-size:9.5px;font-weight:500;letter-spacing:.13em;text-transform:uppercase;color:var(--pine2)}#mhDetail .cnx .er h4, .mh-app .cnx .er h4{font-size:21px;font-weight:800;letter-spacing:-.035em;line-height:1.2;max-width:36ch}#mhDetail .cnx .er:hover h4, .mh-app .cnx .er:hover h4{text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:4px}#mhDetail .cnx .er p, .mh-app .cnx .er p{font-size:14.5px;font-weight:500;line-height:1.55;color:var(--mut);max-width:62ch;text-wrap:pretty}#mhDetail .cnx .er .ml, .mh-app .cnx .er .ml{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:2px;font-size:11.5px;font-weight:700;color:var(--faint)}#mhDetail .cnx .er .rt2, .mh-app .cnx .er .rt2{display:flex;align-items:center;gap:12px;padding-top:6px}#mhDetail .cnx .er .arw, .mh-app .cnx .er .arw{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;border:1px solid var(--line);color:var(--pine);transition:background .16s ease,color .16s ease,transform .16s ease,border-color .16s ease}#mhDetail .cnx .er .arw svg, .mh-app .cnx .er .arw svg{width:15px;height:15px}#mhDetail .cnx .er:hover .arw, .mh-app .cnx .er:hover .arw{background:var(--pine);border-color:var(--pine);color:#EAF5F0;transform:translateX(3px)}#mhDetail .cnx .bn, .mh-app .cnx .bn{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:166px;gap:14px;padding:4px}#mhDetail .cnx .bt, .mh-app .cnx .bt{position:relative;display:flex;flex-direction:column;gap:8px;overflow:hidden;padding:18px;border:1px solid var(--line);border-radius:18px;background:linear-gradient(150deg,rgba(var(--tg-rgb,255,255,255),.95),color-mix(in srgb, var(--tg-cream2,rgb(246,250,248)) 82%, transparent));box-shadow:0 14px 30px -26px rgba(30,55,48,.5),inset 0 1px 0 #fff;backdrop-filter:blur(20px) saturate(160%);-webkit-backdrop-filter:blur(20px) saturate(160%);text-align:left;cursor:pointer;font:inherit;color:inherit;transition:transform .2s cubic-bezier(.2,.7,.3,1),box-shadow .2s ease,border-color .2s ease}#mhDetail .cnx .bt::after, .mh-app .cnx .bt::after{content:"";position:absolute;top:-70px;right:-70px;width:190px;height:190px;border-radius:50%;background:radial-gradient(circle,rgba(47,107,87,.16),transparent 68%);pointer-events:none}#mhDetail .cnx .bt.over::after, .mh-app .cnx .bt.over::after{background:radial-gradient(circle,rgba(180,69,58,.18),transparent 68%)}#mhDetail .cnx .bt.due::after, .mh-app .cnx .bt.due::after{background:radial-gradient(circle,rgba(176,122,46,.2),transparent 68%)}#mhDetail .cnx .bt.conf::after, .mh-app .cnx .bt.conf::after{background:radial-gradient(circle,rgba(142,74,112,.16),transparent 68%)}#mhDetail .cnx .bt:hover, .mh-app .cnx .bt:hover, #mhDetail .cnx .bt:focus-visible, .mh-app .cnx .bt:focus-visible{transform:translateY(-5px);box-shadow:0 30px 44px -28px rgba(30,55,48,.5);border-color:rgba(47,107,87,.26);outline:none}#mhDetail .cnx .bt .bd2, .mh-app .cnx .bt .bd2{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:.02em;color:var(--faint)}#mhDetail .cnx .bt .bd2 i, .mh-app .cnx .bt .bd2 i{width:6px;height:6px;border-radius:50%;background:var(--pine2)}#mhDetail .cnx .bt.over .bd2 i, .mh-app .cnx .bt.over .bd2 i{background:var(--red)}#mhDetail .cnx .bt.due .bd2 i, .mh-app .cnx .bt.due .bd2 i{background:#C08A2E}#mhDetail .cnx .bt.conf .bd2 i, .mh-app .cnx .bt.conf .bd2 i{background:#8E4A70}#mhDetail .cnx .bt h4, .mh-app .cnx .bt h4{font-size:15px;font-weight:800;letter-spacing:-.02em;line-height:1.25;position:relative}#mhDetail .cnx .bt p, .mh-app .cnx .bt p{font-size:12.5px;font-weight:500;line-height:1.5;color:var(--mut);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;position:relative}#mhDetail .cnx .bt .bf, .mh-app .cnx .bt .bf{margin-top:auto;display:flex;align-items:center;gap:9px;font-size:11px;font-weight:700;color:var(--dim);position:relative}#mhDetail .cnx .bt .bf img, .mh-app .cnx .bt .bf img{width:22px;height:22px;border-radius:50%;object-fit:cover}#mhDetail .cnx .bt:nth-child(1), .mh-app .cnx .bt:nth-child(1){grid-column:span 2;grid-row:span 2;padding:24px}#mhDetail .cnx .bt:nth-child(1) h4, .mh-app .cnx .bt:nth-child(1) h4{font-size:23px;letter-spacing:-.035em}#mhDetail .cnx .bt:nth-child(1) p, .mh-app .cnx .bt:nth-child(1) p{font-size:14px;-webkit-line-clamp:4;line-height:1.6}#mhDetail .cnx .bt:nth-child(2), .mh-app .cnx .bt:nth-child(2){grid-column:span 2}#mhDetail .cnx .bt:nth-child(5), .mh-app .cnx .bt:nth-child(5), #mhDetail .cnx .bt:nth-child(6), .mh-app .cnx .bt:nth-child(6){grid-column:span 2}
@media(max-width:980px){#mhDetail .cnx .bn, .mh-app .cnx .bn{grid-template-columns:repeat(2,minmax(0,1fr))}#mhDetail .cnx .bt:nth-child(1), .mh-app .cnx .bt:nth-child(1){grid-column:span 2;grid-row:span 1}#mhDetail .cnx .bt:nth-child(2), .mh-app .cnx .bt:nth-child(2), #mhDetail .cnx .bt:nth-child(5), .mh-app .cnx .bt:nth-child(5), #mhDetail .cnx .bt:nth-child(6), .mh-app .cnx .bt:nth-child(6){grid-column:span 2}#mhDetail .cnx .er, .mh-app .cnx .er{grid-template-columns:78px minmax(0,1fr);gap:18px}#mhDetail .cnx .er .rt2, .mh-app .cnx .er .rt2{display:none}#mhDetail .cnx .bpc, .mh-app .cnx .bpc{grid-template-columns:minmax(0,1fr) 140px}}
@media(max-width:640px){#mhDetail .cnx .bn, .mh-app .cnx .bn{grid-template-columns:minmax(0,1fr)}#mhDetail .cnx .bt, .mh-app .cnx .bt, #mhDetail .cnx .bt:nth-child(1), .mh-app .cnx .bt:nth-child(1), #mhDetail .cnx .bt:nth-child(2), .mh-app .cnx .bt:nth-child(2), #mhDetail .cnx .bt:nth-child(5), .mh-app .cnx .bt:nth-child(5), #mhDetail .cnx .bt:nth-child(6), .mh-app .cnx .bt:nth-child(6){grid-column:span 1}#mhDetail .cnx .bpc, .mh-app .cnx .bpc{grid-template-columns:minmax(0,1fr)}#mhDetail .cnx .bpc .stub, .mh-app .cnx .bpc .stub{border-left:0;border-top:2px dashed rgba(30,55,48,.16)}#mhDetail .cnx .bpc .stub::before, .mh-app .cnx .bpc .stub::before{left:-9px;top:auto;bottom:auto;margin-top:-9px}}


/* =============================================================================
   THE NOTE POPUP MUST CLEAR THE RECORD IT WAS OPENED FROM - 25 Aug 2026.

   The design ships .ov at z-index 90, which is right for a standalone page and
   wrong here. This popup opens from INSIDE a case-note file, and that file is
   `#mhDetail.dv-stage.ovr` at z-index 1200 - a SIBLING of the popup under the same
   parent. 1200 beats 90, so the popup rendered fully, correctly worded, and
   completely unreachable behind the record.

   MEASURED, not reasoned: elementsFromPoint at the popup's own close button
   returned [m-body, pane, modal wz2, dv-behind, dv-stage ovr] - the button nowhere,
   five layers down. Exactly the fault the 24 Aug sweep found on #cnAccess.

   1400 clears the stage (1200) AND the case-note sheets (1300), and stays below the
   app's own top layer (tour 100000, snackbar 100095, idle warning 100096) so nothing
   that must cover everything is covered by a note.
   ============================================================================= */
#mhDetail .cnx .ov, .mh-app .cnx .ov{z-index:1400}

/* =============================================================================
   THE GRID MUST FILL ITS PANE - 25 Aug 2026, CORRECTED 26 Aug 2026.

   WHAT THE 25 AUG NOTE SAID: the grid computed to 19px inside a 1520px modal, so a
   grid in DetailShell's flex pane must not take the width on its own, and width:100%
   is the whole fix.

   THAT WAS WRONG, and it was wrong in a way worth keeping written down. 19px is not
   a coincidence and it is not "the box's own padding": detail-view.css says
   `#mhDetail .ic{width:19px;height:19px}` because .ic is the pane's ICON class. The
   grid was called .ic, so it WAS an icon as far as that stylesheet was concerned.
   width:100% won the width contest and left height, flex, place-items, colour and
   the svg rule still applying - which is why the cards were uneven a day later.

   The grid is now .cn-ic and none of that rule reaches it. This line is kept only
   because a grid should state that it fills its pane; it is no longer load-bearing.
   IF YOU EVER SEE A CASE-NOTES BOX COME OUT AT EXACTLY 19px, IT IS NAMED .ic.
   ============================================================================= */
#mhDetail .cnx .cn-ic, .mh-app .cnx .cn-ic{width:100%}


/* =============================================================================
   ADD FOLLOW-UP - the sheet is the designer's, landed as it ships (CEO, 26 Aug:
   "land the exact mock, we will polish later"), so its field, its chips and its
   footer are all styles.css rules that were already emitted above. Nothing here
   restyles them.

   ONE ADDITION, AND IT IS NOT IN THE MOCK. sp_SetCaseNoteFollowUp refuses a past
   date, a locked note, a completed note, and anyone who does not hold the note -
   and each message names the control that governs it. The mock has no slot for
   that because its actions are toasts. A sheet that swallowed a refusal and just
   closed would be lying, so the refusal is shown in the sheet, in the design's
   own red.
   ============================================================================= */
#mhDetail .cnx .cn-fuerr, .mh-app .cnx .cn-fuerr{display:block;font-size:12.5px;font-weight:700;line-height:1.45;color:var(--red);background:rgba(180,69,58,.09);border:1px solid rgba(180,69,58,.22);border-radius:12px;padding:9px 12px}


/* =============================================================================
   TWO FIXES ON THE CARD GRID AND ITS LEGEND. CEO, 26 August 2026.

   1. A FILE WITH ONE NOTE HAD A CARD THE FULL WIDTH OF THE PANE.
      The design ships `repeat(AUTO-FIT, minmax(340px,1fr))`. **auto-fit COLLAPSES
      the tracks it does not fill and hands their space to the items that are left**,
      so one note got the lot. MEASURED on the Htet Family file (1 note):
          grid-template-columns: 1098px 0px 0px      card width: 1098px
      **auto-FILL keeps the empty tracks**, so the card stays in track 1 at its
      normal width and the rest of the row stays empty.
      IT IS ONE WORD AND IT CHANGES NOTHING ABOVE TWO NOTES: at 1106px both keywords
      resolve to the same three 351.328px tracks. The demo never showed this because
      it always has six notes. Cards still travel freely - no breakpoint of ours.

   2. THE LAMP LEGEND WAS HALF HIDDEN BEHIND THE PANE HEADER, and now it is a card.
      The design's `.lgd` carries `margin:-6px 2px 18px`. That negative top margin is
      right on the demo page, where nothing sits above it; here `.pane-head` does, and
      MEASURED, `elementFromPoint` on the legend's top edge returned `DIV.pane-head`,
      not the legend - the top ~6px of every lamp was covered. The margin is now
      positive and the row clears the header completely.

      The CEO also asked for it on white, "like the KPI card ... the white color and
      same shape". These are the app's OWN KPI surface values, not new ones:
      --mh-surface, 1px --mh-line, --mh-card-r and --mh-shadow-sm, the same four
      `.mh-app .kpi` uses. It hugs its content and stays right-aligned, which is the
      designer's own `justify-content:flex-end`.
   ============================================================================= */
#mhDetail .cnx .lgd, .mh-app .cnx .lgd{width:fit-content;max-width:100%;margin:2px 2px 18px auto;padding:10px 16px;background:var(--mh-surface);border:1px solid var(--mh-line);border-radius:var(--mh-card-r,14px);box-shadow:var(--mh-shadow-sm)}


/* =============================================================================
   THE FOLLOW-UP SHEET'S FIELD IS THE APP'S OWN PICKER. CEO, 26 August 2026.

   The mock ships a native `input type="date"`. The CEO asked for our standard field
   and our own calendar, which is MhDatePicker - and that control cannot simply be
   dropped into this sheet, because of what `.dg` is.

   `.dg` CARRIES `overflow:hidden`, AND THE CALENDAR IS TALLER THAN THE CARD. Inside
   an untouched `.dg` the popover's lower rows were cut off - MEASURED, elementFromPoint
   on its bottom-right corner returned a plain DIV instead of the popover, so those
   days were not clickable at all.

   THE SHEET STAYS INSIDE `.dg`, WHICH IS THE POINT. Moving it out fixed the calendar
   but scrimmed the WHOLE SCREEN instead of the card - the wash the CEO called "that
   glassy background". So instead `.dg` gives up `overflow:hidden` FOR EXACTLY AS LONG
   AS THE SHEET IS OPEN and takes it back when the sheet closes. The scrim gets `.dg`'s
   own 26px radius for the same window, because with overflow visible its square
   corners would otherwise sit proud of the rounded card.

   ONE PROPERTY, NOT TWO. A `backdrop-filter:none` was here as well, on the reasoning
   that `.dg`'s blur makes it the containing block for position:fixed and would push
   the popover down by `.dg`'s own offset. **TESTED BY PUTTING THE BLUR BACK: the gap
   between field and calendar stayed at 11.8px and both corners stayed hittable.**
   mhdatepicker.js -> MHpop.place already carries the transformed-ancestor correction
   for exactly this, so that declaration was doing nothing and is gone. An override
   that changes no measurement is one a later session has to disprove again.
   ============================================================================= */
#mhDetail .cnx .dg.cn-dg-open, .mh-app .cnx .dg.cn-dg-open{overflow:visible}
#mhDetail .cnx .dg.cn-dg-open .sheet, .mh-app .cnx .dg.cn-dg-open .sheet{border-radius:26px}

/* The field shell. Values are the designer's own `.fld` / `.fld label`; only the
   class name is ours, so that `.fld input` cannot reach the branded control. */
#mhDetail .cnx .cn-fufld, .mh-app .cnx .cn-fufld{display:flex;flex-direction:column;gap:7px}
#mhDetail .cnx .cn-fufld>label, .mh-app .cnx .cn-fufld>label{font-size:9.5px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;color:var(--faint)}
#mhDetail .cnx .cn-fufld .mh-dp-c, .mh-app .cnx .cn-fufld .mh-dp-c{width:100%}

/* THE CALENDAR'S ESCAPE PAIR - the app's existing pattern, not a new one.
   detail-view.css, enroll-wizard.css, mh-clientwizard.css and mh-household.css each
   carry the same two lines for their own clipping container. MhDatePicker always
   promotes `.dp-pop` to position:fixed on open; this hides it for the one frame
   BEFORE that inline style lands, so it never flashes at its unplaced position.
   1450, not the 1200 the others use: inside `.ov` it must clear `.sheet` (8) and the
   case-actions menu (5), and it still sits under the tour (100000), the snackbar
   (100095) and the idle warning (100096). */
#mhDetail .cnx .sc .dp.open .dp-pop, .mh-app .cnx .sc .dp.open .dp-pop{transform:none !important;visibility:hidden;z-index:1450}
#mhDetail .cnx .sc .dp.open .dp-pop[style*="position: fixed"], .mh-app .cnx .sc .dp.open .dp-pop[style*="position: fixed"]{visibility:visible}


/* =============================================================================
   EDIT NOTE IN PLACE - the note column as a form. CEO, 26 August 2026.

   Not in the mock: the mock's popup only ever READS a note. These are the app's own
   field values, not a new set - the inset field shell, the same label treatment the
   follow-up sheet uses, and the two protection toggles worded exactly as the note
   composer words them.

   THE TOGGLES ARE BUTTONS, NOT CHECKBOXES, on purpose: they carry a sentence each
   saying who will be able to read the note, and that sentence is the thing a person
   is actually deciding about.
   ============================================================================= */
#mhDetail .cnx .cn-ed, .mh-app .cnx .cn-ed{display:flex;flex-direction:column;gap:14px}
#mhDetail .cnx .cn-edf, .mh-app .cnx .cn-edf{display:flex;flex-direction:column;gap:7px}
#mhDetail .cnx .cn-edf>label, .mh-app .cnx .cn-edf>label{display:flex;align-items:center;gap:5px;font-size:9.5px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;color:var(--faint)}
#mhDetail .cnx .cn-req, .mh-app .cnx .cn-req{color:var(--red);font-size:11px}
#mhDetail .cnx .cn-edf input, .mh-app .cnx .cn-edf input, #mhDetail .cnx .cn-edf textarea, .mh-app .cnx .cn-edf textarea{width:100%;padding:11px 13px;border-radius:12px;border:1px solid rgba(30,55,48,.16);background:rgb(var(--tg-rgb,255,255,255));font:inherit;font-size:14px;font-weight:600;line-height:1.55;color:var(--ink);box-shadow:inset 0 1px 2px rgba(30,55,48,.05);resize:vertical}
#mhDetail .cnx .cn-edf input:focus, .mh-app .cnx .cn-edf input:focus, #mhDetail .cnx .cn-edf textarea:focus, .mh-app .cnx .cn-edf textarea:focus{outline:none;border-color:var(--pine2);box-shadow:0 0 0 3px rgba(47,107,87,.14)}

/* the two protection toggles */
#mhDetail .cnx .cn-edt, .mh-app .cnx .cn-edt{display:flex;flex-direction:column;gap:9px}
#mhDetail .cnx .cn-tgl, .mh-app .cnx .cn-tgl{display:flex;align-items:flex-start;gap:11px;width:100%;padding:11px 13px;border-radius:13px;border:1px solid rgba(30,55,48,.12);background:rgba(var(--tg-rgb,255,255,255),.8);text-align:left;cursor:pointer;color:inherit;font:inherit;transition:border-color .14s ease,background .14s ease}
#mhDetail .cnx .cn-tgl:hover, .mh-app .cnx .cn-tgl:hover{border-color:rgba(47,107,87,.32);background:rgb(var(--tg-rgb,255,255,255))}
#mhDetail .cnx .cn-tgs, .mh-app .cnx .cn-tgs{position:relative;width:34px;height:20px;flex:none;margin-top:1px;border-radius:99px;background:rgba(30,55,48,.16);transition:background .16s ease}
#mhDetail .cnx .cn-tgs::after, .mh-app .cnx .cn-tgs::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:rgb(var(--tg-rgb,255,255,255));box-shadow:0 1px 3px rgba(16,40,34,.35);transition:transform .16s cubic-bezier(.2,.75,.3,1)}
#mhDetail .cnx .cn-tgl.on .cn-tgs, .mh-app .cnx .cn-tgl.on .cn-tgs{background:var(--pine2)}
#mhDetail .cnx .cn-tgl.on.safe .cn-tgs, .mh-app .cnx .cn-tgl.on.safe .cn-tgs{background:#8E4A70}
#mhDetail .cnx .cn-tgl.on .cn-tgs::after, .mh-app .cnx .cn-tgl.on .cn-tgs::after{transform:translateX(14px)}
#mhDetail .cnx .cn-tgl.on, .mh-app .cnx .cn-tgl.on{border-color:rgba(47,107,87,.4);background:rgba(47,107,87,.07)}
#mhDetail .cnx .cn-tgl.on.safe, .mh-app .cnx .cn-tgl.on.safe{border-color:rgba(142,74,112,.4);background:rgba(142,74,112,.07)}
#mhDetail .cnx .cn-tgx, .mh-app .cnx .cn-tgx{display:flex;flex-direction:column;gap:2px;min-width:0}
#mhDetail .cnx .cn-tgx b, .mh-app .cnx .cn-tgx b{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:800;letter-spacing:-.012em}
#mhDetail .cnx .cn-tgx b svg, .mh-app .cnx .cn-tgx b svg{width:13px;height:13px}
#mhDetail .cnx .cn-tgx em, .mh-app .cnx .cn-tgx em{font-style:normal;font-size:11.5px;font-weight:600;line-height:1.4;color:var(--dim)}

/* what a REMOVAL is about to do, said before the click */
#mhDetail .cnx .cn-edwarn, .mh-app .cnx .cn-edwarn{display:flex;align-items:flex-start;gap:8px;font-size:12px;font-weight:700;line-height:1.45;color:#7A3A28;background:rgba(185,138,49,.12);border:1px solid rgba(185,138,49,.3);border-radius:12px;padding:9px 12px}
#mhDetail .cnx .cn-edwarn svg, .mh-app .cnx .cn-edwarn svg{width:14px;height:14px;flex:none;margin-top:1px}

/* Open Client Record, dead while editing. A SPAN, not a disabled anchor - there is
   no href to middle-click, drag or reach with the keyboard. */
#mhDetail .cnx .dg .ft .lnk.is-off, .mh-app .cnx .dg .ft .lnk.is-off{opacity:.4;cursor:default;pointer-events:none}
#mhDetail .cnx .cn-btn:disabled, .mh-app .cnx .cn-btn:disabled{opacity:.45;cursor:default}
#mhDetail .cnx .cn-btn.pr:disabled:hover, .mh-app .cnx .cn-btn.pr:disabled:hover{background:var(--pine)}


/* =============================================================================
   A PROFILE PHOTO IS A BUTTON NOW, NOT A LINK. CEO, 26 August 2026.

   Three avatars in Case Notes changed from "opens the record" (or from a plain
   disc) to "zooms the photo": the timeline card's, the note popup's header, and the
   popup's "Written by". `.av` and `.ini` already carry every visual - size, radius,
   overflow, the ring - so these rules only strip what a <button> brings with it and
   add the zoom affordance. Nothing about the look changes.

   The route to the record has NOT been taken away. The card's name and the popup's
   "Open Client Record" both still go there, and unlike a photo they say so.
   ============================================================================= */
/* NO `color` HERE. It was `color:inherit`, and MEASURED that made the timeline
   card's default person-icon come out rgb(42,47,49) - BLACK on the green disc -
   because `.mh-app .cn-tl .av.cn-zoom` (4 classes) out-specifies the component's
   own `.mh-app .cn-tl .av{color:#CFE8DD}` (3). A <button> already inherits its
   colour; saying so again only takes the colour away from whoever set it. */
#mhDetail .cnx .cn-zoom, .mh-app .cnx .cn-zoom, .mh-app .cn-tl .av.cn-zoom{padding:0;border:0;font:inherit;cursor:zoom-in;-webkit-appearance:none;appearance:none}
#mhDetail .cnx .cn-zoom:focus-visible, .mh-app .cnx .cn-zoom:focus-visible, .mh-app .cn-tl .av.cn-zoom:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(47,107,87,.45)}

/* The popup's header avatar keeps the design's own disc; the gradient behind it is
   only visible where there is no photo, and it is the app's shared per-name one. */
#mhDetail .cnx .dg .cn-av.cn-zoom, .mh-app .cnx .dg .cn-av.cn-zoom{display:grid;place-items:center}
#mhDetail .cnx .dg .cn-av.cn-zoom svg, .mh-app .cnx .dg .cn-av.cn-zoom svg{width:22px;height:22px;color:#CFE8DD}
#mhDetail .cnx .sf .ini.cn-zoom, .mh-app .cnx .sf .ini.cn-zoom{display:grid;place-items:center}
#mhDetail .cnx .sf .ini.cn-zoom svg, .mh-app .cnx .sf .ini.cn-zoom svg{width:19px;height:19px;color:#CFE8DD}


/* =============================================================================
   THE LIST TOOLBAR'S (...) AND THE SELECTION BAR. CEO, 26 August 2026.

   "Transfer notes" was a bar of its own under the KPI strip. It now lives behind a
   (...) at the right of the filter pills, and while notes are being selected the
   pills are not rendered at all - the selection controls occupy that slot instead,
   and the pills return when the transfer is sent or cancelled.

   The buttons in the selection bar are the app's existing `.cn-bbtn`; only the two
   wrappers below are new.
   ============================================================================= */
.mh-app .cn-tl .tb .cn-tbmw{position:relative;display:flex;flex:none}
.mh-app .cn-tl .tb .cn-tbmore{display:grid;place-items:center;width:34px;height:34px;flex:none;padding:0;border-radius:10px;border:1px solid var(--mh-line);background:var(--mh-surface);color:var(--mh-ink);cursor:pointer;transition:border-color .15s,background .15s,color .15s}
.mh-app .cn-tl .tb .cn-tbmore svg{width:16px;height:16px}
.mh-app .cn-tl .tb .cn-tbmore:hover{border-color:var(--mh-ctrl-ico)}
.mh-app .cn-tl .tb .cn-tbmore.on{background:var(--mh-ctrl-accent);border-color:transparent;color:#fff}

.mh-app .cn-tl .tb .cn-tbmenu{position:absolute;top:calc(100% + 8px);right:0;z-index:30;width:250px;display:flex;flex-direction:column;padding:7px;border-radius:14px;border:1px solid var(--mh-line);background:var(--mh-surface);box-shadow:0 20px 40px -18px rgba(40,60,80,.35),0 2px 6px rgba(40,60,80,.07);opacity:0;transform:translateY(-5px);pointer-events:none;transition:opacity .14s ease,transform .16s ease}
.mh-app .cn-tl .tb .cn-tbmenu.on{opacity:1;transform:none;pointer-events:auto}
.mh-app .cn-tl .tb .cn-tbmenu button{display:flex;align-items:flex-start;gap:10px;width:100%;padding:9px;border:0;border-radius:10px;background:none;text-align:left;cursor:pointer;color:inherit;font:inherit;justify-content:normal;transition:background .14s ease}
.mh-app .cn-tl .tb .cn-tbmenu button:hover{background:var(--mh-cream-2)}
.mh-app .cn-tl .tb .cn-tbmenu button svg{width:16px;height:16px;flex:none;margin-top:2px;color:var(--mh-ctrl-ico)}
.mh-app .cn-tl .tb .cn-tbmenu b{display:block;font-size:13px;font-weight:800;letter-spacing:-.012em}
.mh-app .cn-tl .tb .cn-tbmenu em{display:block;font-style:normal;font-size:11.5px;font-weight:600;line-height:1.35;color:var(--mh-muted);margin-top:2px}

/* The selection controls, in the slot the filter pills leave. `margin-left:auto`
   keeps them where the pills were - hard right - so nothing jumps sideways when the
   mode turns on. */
.mh-app .cn-tl .tb .cn-selbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto}
.mh-app .cn-tl .tb .cn-selbar .cn-bcount{font-size:12.5px;font-weight:800;color:var(--mh-ink);white-space:nowrap}


/* =============================================================================
   THE INDEX-CARD FOOTER MUST SIT ON ONE ROW. CEO, 26 August 2026 - "the users
   showing on the up and bottom of the card ... all cards detail must be correct on
   one row ... smaller the size of below card detail".

   THIS IS THE ONE PLACE THE DESIGN'S OWN NUMBERS ARE DELIBERATELY NOT KEPT, and the
   arithmetic says why. MEASURED with the designer's own card and CSS:
       the three footer items      321.6px
       the demo panel's card       378.7px  ->  321.6px of content. Fits by 0.0px.
       this record pane's card     351.3px  ->  297.3px of content. Wraps.
   The mock fits by nothing at all; give the card 27px less and it breaks. The pane is
   1106px because DetailShell's rail takes 342px of the 1520px modal and `.m-body` takes
   72px more, so the card cannot be widened without moving a shared component.

   So the type comes down instead - 12px -> 11px on the row, 10.5px -> 10px on the
   pills, with the pill padding and gaps tightened to match. That buys ~31px against a
   ~24px shortfall, which puts every card on one line with room to spare rather than
   balanced on the same knife edge the mock is.
   ============================================================================= */
#mhDetail .cnx .ix .f, .mh-app .cnx .ix .f{gap:8px;font-size:11px}
#mhDetail .cnx .ix .f .cn-pill, .mh-app .cnx .ix .f .cn-pill{font-size:10px;padding:3px 7px;gap:5px}
#mhDetail .cnx .ix .f .cn-pill svg, .mh-app .cnx .ix .f .cn-pill svg{width:10px;height:10px}


/* A safeguarding note's card while it is still LOCKED. The date tab, the lamp, the
   title and the Safeguarding pill all stay - you can see the note exists and what it
   is about - but the opening sentence does not, because a PIN that guards a screen
   the text is already printed on guards nothing. */
#mhDetail .cnx .ix p.cn-sglock, .mh-app .cnx .ix p.cn-sglock{display:flex;align-items:center;gap:7px;background-image:none;font-style:italic;color:#7A5C86;-webkit-line-clamp:none}
#mhDetail .cnx .ix p.cn-sglock svg, .mh-app .cnx .ix p.cn-sglock svg{width:13px;height:13px;flex:none;color:#8E4A70}


/* =============================================================================
   ADD A FOLLOW-UP - the sheet now FITS.  3 September 2026 (CEO/user report).
   "the fields completely broken ... remove the vertical ruler from it and make it a
    little bigger everything must fit on that and also fit the in 1 week in 2 weeks
    in 1 month with the Follow up date field"

   WHAT WAS WRONG. `.sc` was `width:min(430px,100%); max-height:100%; overflow:auto`.
   The sheet lives INSIDE the note card (.dg), not the viewport, so `max-height:100%`
   is the CARD's height - a short card leaves the header, the date field, the three
   chips and the footer fighting over very little room, and `overflow:auto` turned
   that into the scrollbar the user called a "vertical ruler".

   THREE CHANGES, ALL SMALL:
     1. 430 -> 480px wide, and the padding/gap tightened a little. The three chips
        (In 1 week / In 2 weeks / In 1 month) now sit on ONE row beside each other
        rather than wrapping under the date field.
     2. The scrollbar is hidden but scrolling is KEPT. Hiding it outright would clip
        the Set follow-up button on a very short card, and a control you cannot reach
        is worse than a scrollbar. In practice the content now fits, so it never
        appears - this is the safety net, not the design.
     3. The date field is given room to breathe so the masked input and the calendar
        icon are not squeezed.

   THE CALENDAR ITSELF IS NOT AFFECTED. MhDatePicker's popover is portalled to
   position:fixed (see the .dp-pop rules above), so it is drawn over the sheet and
   never adds to its height - which is why the sheet can be sized for the field alone.
   ============================================================================= */
#mhDetail .cnx .sc, .mh-app .cnx .sc {
  width: min(480px, 100%);
  gap: 14px;
  padding: 20px 22px 18px;
}

/* THE RULER'S REAL CAUSE - and it was never the content.
   MEASURED: the sheet's four children total 231px inside a 311px card, so everything
   fitted the whole time. But `.dp-pop`, MhDatePicker's calendar, is a 323px
   position:absolute panel that is only faded out when closed (opacity:0,
   pointer-events:none) - it is still LAID OUT, hanging below the field. A scroll
   container counts an absolutely positioned child that hangs past its bottom edge as
   SCROLLABLE CONTENT: 209px of phantom overflow, and a scrollbar nobody needed.

   FIRST ATTEMPT, AND WHY IT WAS WRONG: `display:none` on the closed popover. It killed
   the scrollbar and BROKE THE CALENDAR - the placer measures the panel to decide where
   to put it, a display:none panel measures 0x0, and the calendar was positioned off
   screen at left:2591px. A fix that hides the symptom and breaks the control is worse
   than the symptom.

   THE ACTUAL FIX: stop `.sc` being a scroll container at all. Phantom overflow only
   becomes a scrollbar if something is scrolling; with `overflow:visible` there is no
   scroll box, the popover stays measurable, and the content - 269px including padding -
   sits comfortably inside the card. The calendar is portalled to position:fixed the
   moment it opens, so it is never clipped by this or by .dg. */
#mhDetail .cnx .sheet .sc, .mh-app .cnx .sheet .sc {
  max-height: none;
  overflow: visible;
}

/* The three shortcuts belong on ONE line with the field above them. */
#mhDetail .cnx .chips, .mh-app .cnx .chips {
  flex-wrap: nowrap;
  gap: 7px;
  margin-top: -2px;
}
#mhDetail .cnx .chp, .mh-app .cnx .chp {
  flex: 1 1 0;
  padding: 8px 10px;
  text-align: center;
  white-space: nowrap;
}

/* A little more room for the masked input + calendar icon. */
#mhDetail .cnx .cn-fufld, .mh-app .cnx .cn-fufld { gap: 8px; }


/* =============================================================================
   THE SHEET BLURS THE CARD - IT DOES NOT TINT IT.  3 September 2026 (CEO).
   "check the background it has a glassy background remove that background when that
    mock open only blur it that is it"

   `.sheet` carried BOTH a blur and a dark wash - `background: rgba(18,34,29,.34)` on
   top of `backdrop-filter: blur(6px)`. The blur alone already separates the sheet from
   the record behind it; the wash on top is what read as "glassy". The tint goes, the
   blur stays, and the record underneath keeps its own colour.
   ============================================================================= */
#mhDetail .cnx .sheet, .mh-app .cnx .sheet {
  background: transparent;
}
/* THE DELETE SHEET (#cnDelete, 18 Sep 2026) wears the transfer/unlock chrome above; only its badge, warning and button
   carry the danger colour, so it reads as the one irreversible action on the screen. */
#cnDelete .xf-badge { background: rgba(192,57,47,.10); color: #A33A2E; }
#cnDelete .xf-warn { background: rgba(192,57,47,.06); border-color: rgba(192,57,47,.22); color: var(--ink-2); }
#cnDelete .xf-warn svg { stroke: #A33A2E; }
#cnDelete .ui-btn.cn-danger { background: #B5412F; border-color: #B5412F; color: #fff; }
#cnDelete .ui-btn.cn-danger:hover:not(:disabled) { background: #9C3526; border-color: #9C3526; }
#cnDelete .ui-btn.cn-danger:disabled { opacity: .55; }

/* NO DELETE ICON ON A NOTE CARD (owner, 18 Sep 2026: "remove the icon from the KPI card it will be clean").
   The card is a plain card again; deleting is the (...) menu inside the note, which he tested and kept. */

/* TITLES LINE UP ON THE LEFT (owner, 18 Sep 2026: "why the Assessment went to the center, all KPI cards title
   text on the left align"). MEASURED: the card is a <button>, and a button's BROWSER DEFAULT is
   align-items:center. The card sets text-align:left, which is why a long title looked right - it filled the
   width - while a short one ("Assessment", 116px in a 351px card) was shrink-wrapped and centred. The divider
   under the title measured 0px wide for the same reason. Stretch puts every line back on the left edge. */
#mhDetail .cnx .ix, .mh-app .cnx .ix { align-items: stretch; }
