/* ═══════════════════════════════════════════════════════════════════════════
   ledger.css — Accounting → Ledger (Run 46, E3). The panel is dark-only; every
   colour comes from admin.css's tokens or the badge palette it already uses.

   ⚠ NO TRUNCATION: money, entry numbers and account codes never sit in a cell
   that can ellipsis them. `.data-table td` (admin.css) is max-width 180px +
   text-overflow: ellipsis — and ellipsis REPLACES inline content while every
   DOM/geometry assertion still passes (the project's four-times-paid lesson).
   The ledger's tables are therefore `.ledger-table`, never `.data-table`: wide
   text WRAPS, figures are `nowrap`, and a table wider than the phone scrolls
   inside its own `.ledger-table-wrap` rather than being cut.
   ═══════════════════════════════════════════════════════════════════════════ */

.ledger-root { display: flex; flex-direction: column; gap: var(--space-md); }
.ledger-sec-body { display: flex; flex-direction: column; gap: var(--space-md); }
.ledger-muted { color: var(--text-muted); font-size: 0.85rem; line-height: 1.5; margin: 0; }
.ledger-note { color: var(--text-secondary); font-size: 0.85rem; margin: 0; padding: 8px 12px;
    background: rgba(99, 102, 241, 0.10); border: 1px solid rgba(99, 102, 241, 0.25); border-radius: var(--radius-sm); }
.ledger-error { color: #F87171; font-size: 0.85rem; margin: 0; min-height: 0; }
.ledger-error:empty { display: none; }
.ledger-ok { color: #4ADE80; font-weight: 500; }
.ledger-bad { color: #F87171; font-weight: 600; }
.ledger-up, .ledger-down { color: var(--text-primary); font-weight: 500; }
.ledger-mono, .ledger-filters code, .ledger-list code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.8rem; }
.ledger-nowrap { white-space: nowrap; }
.ledger-num { text-align: right; font-variant-numeric: tabular-nums; }
.ledger-h3 { font-family: var(--font-display); font-size: 1.02rem; font-weight: 600; color: var(--text-primary); margin: 0; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ledger-h4 { font-family: var(--font-display); font-size: 0.92rem; font-weight: 600; color: var(--text-primary); margin: var(--space-sm) 0 0; }

/* ── status line ── */
.ledger-banner { display: flex; align-items: center; justify-content: space-between; gap: var(--space-md); flex-wrap: wrap;
    padding: 12px 16px; border-radius: var(--radius-md); border: 1px solid var(--border-default); background: var(--bg-card); }
.ledger-banner-text { display: flex; flex-direction: column; gap: 4px; color: var(--text-secondary); font-size: 0.88rem; line-height: 1.5; min-width: 0; flex: 1 1 260px; }
.ledger-banner-text strong { color: var(--text-primary); }
.ledger-banner-off { border-color: rgba(148, 163, 194, 0.28); }
.ledger-banner-on { border-color: rgba(34, 197, 94, 0.28); }
.ledger-banner-warn { border-color: rgba(245, 158, 11, 0.45); background: rgba(245, 158, 11, 0.06); }
.ledger-warn-line { color: #FBBF24; font-size: 0.86rem; margin: 0; }

/* ── section nav ── */
.ledger-nav { display: flex; flex-wrap: wrap; gap: 6px; }
.ledger-nav-btn { padding: 7px 14px; font-family: var(--font-display); font-size: 0.85rem; font-weight: 500;
    color: var(--text-secondary); background: transparent; border: 1px solid var(--border-default); border-radius: 999px; cursor: pointer; }
.ledger-nav-btn:hover { color: var(--text-primary); border-color: rgba(155, 163, 194, 0.3); }
.ledger-nav-btn.active { color: #fff; background: rgba(46, 49, 146, 0.55); border-color: var(--accent-light); }

/* ── filters ── */
.ledger-filters { display: flex; flex-wrap: wrap; gap: var(--space-sm) var(--space-md); align-items: flex-end; }
.ledger-field { display: flex; flex-direction: column; gap: 4px; font-size: 0.78rem; color: var(--text-muted);
    text-transform: uppercase; letter-spacing: 0.04em; font-family: var(--font-display); min-width: 0; }
.ledger-field > span { white-space: nowrap; }
.ledger-field .filter-input, .ledger-field .filter-select { text-transform: none; letter-spacing: normal; font-family: var(--font-body); }
.ledger-field-wide { flex: 1 1 220px; }
.ledger-field-block { width: 100%; }
.ledger-field-block > span { white-space: normal; }
.ledger-field .filter-input.no-icon, .ledger-field-block .filter-input { width: 100%; box-sizing: border-box; }
.ledger-textarea { resize: vertical; min-height: 44px; font-family: var(--font-body); line-height: 1.4; }
.ledger-active { display: flex; flex-wrap: wrap; gap: 6px; }
.ledger-active-chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 6px 4px 10px; border-radius: 999px;
    font-size: 0.82rem; color: var(--text-primary); background: rgba(99, 102, 241, 0.15); border: 1px solid rgba(99, 102, 241, 0.3); }
.ledger-chip-x { background: none; border: none; color: var(--text-secondary); cursor: pointer; padding: 2px 6px; font-size: 0.8rem; min-width: 24px; min-height: 24px; }
.ledger-chip-x:hover { color: var(--text-primary); }

/* ── tables ── */
.ledger-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; background: rgba(17, 24, 39, 0.5);
    border: 1px solid var(--border-default); border-radius: var(--radius-lg); }
.ledger-table { width: 100%; border-collapse: collapse; font-size: 0.875rem; }
.ledger-table thead { background: rgba(46, 49, 146, 0.06); }
.ledger-table th { padding: 11px 14px; text-align: left; font-family: var(--font-display); font-weight: 500; font-size: 0.76rem;
    color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border-default); white-space: nowrap; }
.ledger-table th.ledger-num { text-align: right; }
.ledger-table td { padding: 11px 14px; color: var(--text-secondary); border-bottom: 1px solid rgba(148, 163, 194, 0.06); vertical-align: top;
    white-space: normal; overflow-wrap: break-word; }
.ledger-table td.ledger-nowrap { white-space: nowrap; overflow-wrap: normal; }
.ledger-table tfoot td { border-top: 1px solid var(--border-default); border-bottom: none; color: var(--text-primary); font-weight: 600; }
.ledger-table tr.ledger-row { cursor: pointer; transition: background var(--duration-fast); }
.ledger-table tr.ledger-row:hover, .ledger-table tr.ledger-row:focus-visible { background: rgba(46, 49, 146, 0.07); outline: none; }
.ledger-table tr.ledger-row:hover td { color: var(--text-primary); }
.ledger-table .ledger-desc { color: var(--text-primary); min-width: 160px; }
.ledger-amount { color: var(--text-primary); font-weight: 600; font-variant-numeric: tabular-nums; }
.ledger-total { font-variant-numeric: tabular-nums; }
.ledger-no { color: var(--text-muted); }
.ledger-subtotal td { color: var(--text-primary); font-weight: 500; background: rgba(46, 49, 146, 0.04); }
.ledger-row-note { font-size: 0.76rem; color: var(--text-muted); margin-top: 2px; white-space: normal; }
.ledger-inactive td { opacity: 0.6; }
.ledger-acct-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.82rem; color: var(--accent-light); }
.ledger-acct-name { color: var(--text-primary); }
.ledger-ar { display: block; font-size: 0.82rem; color: var(--text-secondary); margin-top: 2px; text-align: left; }
.ledger-name-pair { display: flex; flex-direction: column; }
.ledger-acts { text-align: right; }
.ledger-acts .ledger-tag { margin-right: 4px; }
.ledger-small { padding: 5px 10px; font-size: 0.78rem; }
.ledger-tag { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 0.72rem; font-weight: 500; white-space: nowrap;
    color: #A5A8FF; background: rgba(99, 102, 241, 0.15); vertical-align: 1px; }
.ledger-tag-off { color: #9BA3C2; background: rgba(148, 163, 194, 0.15); }
.ledger-kind { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 0.74rem; font-weight: 500; color: #9BA3C2; background: rgba(148, 163, 194, 0.12); }
.ledger-kind-opening { color: #38BDF8; background: rgba(56, 189, 248, 0.15); }
.ledger-kind-adjustment { color: #FBBF24; background: rgba(245, 158, 11, 0.15); }
.ledger-kind-reversal { color: #F87171; background: rgba(239, 68, 68, 0.15); }
.ledger-more { display: flex; justify-content: center; }
.ledger-end { text-align: center; }
.ledger-empty { text-align: center; padding: var(--space-xl) var(--space-md); background: rgba(17, 24, 39, 0.4);
    border: 1px dashed var(--border-default); border-radius: var(--radius-lg); }
.ledger-empty .empty-title { color: var(--text-primary); }
.ledger-loading { padding: var(--space-xl) 0; }

/* ── dimensions, chips, links ── */
.ledger-dims { display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 4px; font-size: 0.78rem; color: var(--text-muted); }
.ledger-dim { display: inline-flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.ledger-dim-k { white-space: nowrap; }
.ledger-show-sm { display: none; }
.ledger-inline { display: inline; }
.ledger-chip { background: rgba(99, 102, 241, 0.12); border: 1px solid rgba(99, 102, 241, 0.25); color: #C7C9FF; border-radius: 999px;
    padding: 2px 9px; font-size: 0.78rem; cursor: pointer; font-family: var(--font-body); }
.ledger-chip:hover { background: rgba(99, 102, 241, 0.22); }
.ledger-appt { color: var(--accent-light); text-decoration: none; font-weight: 500; }
.ledger-appt:hover { text-decoration: underline; }
.ledger-linkbtn { background: none; border: none; padding: 0; color: var(--accent-light); cursor: pointer; font: inherit; text-align: left; }
.ledger-linkbtn:hover { text-decoration: underline; }

/* ── cards, tiles ── */
.ledger-card { display: flex; flex-direction: column; gap: var(--space-sm); padding: var(--space-md) var(--space-lg);
    background: var(--bg-card); border: 1px solid var(--border-default); border-radius: var(--radius-lg); }
.ledger-card p { margin: 0; color: var(--text-secondary); font-size: 0.88rem; line-height: 1.55; }
/* Run 48 (E6, found writing the manual): `.ledger-card p` (0,1,1) out-ranked the
   one-class state colours (0,1,0), so a refusal, a warning or a ✓ inside a card
   rendered in the secondary grey — the month's "changed after close" warning, the
   journal form's errors, the settlement preview. The state colour wins again. */
.ledger-card p.ledger-error, .ledger-card p.ledger-bad { color: #F87171; }
.ledger-card p.ledger-ok { color: #4ADE80; }
.ledger-card-bad { border-color: rgba(239, 68, 68, 0.45); background: rgba(239, 68, 68, 0.06); }
.ledger-card-warn { border-color: rgba(245, 158, 11, 0.45); background: rgba(245, 158, 11, 0.05); }
.ledger-card-danger { border-color: rgba(239, 68, 68, 0.25); }
.ledger-intro { background: rgba(46, 49, 146, 0.08); }
.ledger-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: var(--space-sm); }
.ledger-tiles-3 { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
.ledger-tile { display: flex; flex-direction: column; gap: 4px; padding: 12px 14px; background: var(--bg-card);
    border: 1px solid var(--border-default); border-radius: var(--radius-md); min-width: 0; }
.ledger-tile-label { font-family: var(--font-display); font-size: 0.74rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); }
.ledger-tile-value { font-family: var(--font-display); font-size: 1.15rem; font-weight: 600; color: var(--text-primary); font-variant-numeric: tabular-nums; overflow-wrap: break-word; }
.ledger-tile-sub { font-size: 0.78rem; color: var(--text-secondary); line-height: 1.4; }
.ledger-tile-ok { border-color: rgba(34, 197, 94, 0.35); }
.ledger-tile-ok .ledger-tile-icon { color: #4ADE80; }
.ledger-tile-warn { border-color: rgba(245, 158, 11, 0.45); }
.ledger-tile-warn .ledger-tile-icon { color: #FBBF24; }
.ledger-tile-bad { border-color: rgba(239, 68, 68, 0.55); background: rgba(239, 68, 68, 0.06); }
.ledger-tile-bad .ledger-tile-icon, .ledger-tile-bad .ledger-tile-value { color: #F87171; }
.ledger-list { margin: 0; padding-left: 1.2em; color: var(--text-secondary); font-size: 0.86rem; line-height: 1.6; }
.ledger-anom-label { color: var(--text-primary); }
.ledger-anom-on td { background: rgba(245, 158, 11, 0.06); }
.ledger-anom-on td:first-child { color: #FBBF24; }
.ledger-actions { display: flex; flex-wrap: wrap; gap: var(--space-sm); align-items: center; }
.ledger-sec-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-sm) var(--space-md); }
.ledger-sec-bar .ledger-muted { flex: 1 1 260px; }
.ledger-meta { display: flex; flex-direction: column; }
.ledger-meta-row { display: flex; gap: var(--space-md); padding: 7px 0; border-bottom: 1px solid rgba(148, 163, 184, 0.06); font-size: 0.88rem; }
.ledger-meta-k { flex: 0 0 120px; color: var(--text-muted); font-family: var(--font-display); font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.05em; padding-top: 2px; }
.ledger-meta-v { flex: 1; color: var(--text-primary); overflow-wrap: break-word; min-width: 0; }

/* ── entry modal ── */
.ledger-modal-content { max-width: 760px; }
.ledger-entry { display: flex; flex-direction: column; gap: var(--space-md); }
.ledger-entry-desc { margin: 0; font-size: 1rem; color: var(--text-primary); font-weight: 500; line-height: 1.45; }
.ledger-form { display: flex; flex-direction: column; gap: var(--space-md); }
.ledger-form p { margin: 0; color: var(--text-secondary); font-size: 0.9rem; line-height: 1.55; }
#ledgerModalFooter { gap: var(--space-sm); flex-wrap: wrap; }

/* ── held ── */
.ledger-held-head, .ledger-rv-head { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-md); flex-wrap: wrap; }
.ledger-held-title, .ledger-rv-title { color: var(--text-primary); font-weight: 500; min-width: 0; overflow-wrap: break-word; }
.ledger-held-done { opacity: 0.85; }
.ledger-decided { color: #4ADE80 !important; font-size: 0.86rem; }
.ledger-confirm-row { display: flex; flex-wrap: wrap; gap: var(--space-sm); align-items: center; padding: 8px 10px;
    border-radius: var(--radius-sm); background: rgba(245, 158, 11, 0.08); border: 1px solid rgba(245, 158, 11, 0.3); color: #FBBF24; font-size: 0.86rem; }

/* ── wizard ── */
.ledger-step { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%;
    background: var(--accent-primary); color: #fff; font-size: 0.8rem; flex: 0 0 24px; }
.ledger-rv-group { display: flex; flex-direction: column; gap: var(--space-sm); padding-top: var(--space-sm); border-top: 1px solid var(--border-default); }
.ledger-rv-group:first-of-type { border-top: none; }
.ledger-rv { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; border-radius: var(--radius-md);
    background: rgba(17, 24, 39, 0.45); border: 1px solid var(--border-default); }
.ledger-rv-done { border-color: rgba(34, 197, 94, 0.3); }
.ledger-rv-late { border-color: rgba(239, 68, 68, 0.55); }
.ledger-rv-meta { font-size: 0.84rem; color: var(--text-secondary); overflow-wrap: break-word; }
.ledger-rv-meta a, .ledger-list a { color: var(--accent-light); }
.ledger-rv-info summary { cursor: pointer; list-style-position: outside; color: var(--text-primary); }
.ledger-rv-info summary .ledger-h4 { display: inline; }
.ledger-amt-input { max-width: 150px; text-align: right; font-variant-numeric: tabular-nums; }
.ledger-equity { display: flex; flex-direction: column; gap: 4px; padding: 10px 12px; border-radius: var(--radius-md);
    background: rgba(46, 49, 146, 0.08); border: 1px solid var(--border-default); font-size: 0.88rem; color: var(--text-secondary); }
.ledger-equity:empty { display: none; }
.ledger-equity strong { color: var(--text-primary); font-variant-numeric: tabular-nums; }
.ledger-equity-k { color: var(--text-muted); font-family: var(--font-display); font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.05em; }
.ledger-gate { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; font-size: 0.88rem; }
.ledger-gate-ok { color: #4ADE80; }
.ledger-gate-no { color: #FBBF24; }

/* ── Settlements (Run 47) ── */
.ledger-segs { display: flex; flex-wrap: wrap; gap: 6px; }
.ledger-seg { display: inline-flex; align-items: center; gap: 8px; min-height: 40px; box-sizing: border-box; padding: 6px 16px;
    border: 1px solid var(--border-default); border-radius: 999px; cursor: pointer; color: var(--text-secondary); font-size: 0.9rem; font-family: var(--font-display); }
.ledger-seg:hover { color: var(--text-primary); border-color: rgba(155, 163, 194, 0.3); }
.ledger-seg.active { color: #fff; background: rgba(46, 49, 146, 0.55); border-color: var(--accent-light); }
.ledger-seg input { accent-color: var(--accent-light); margin: 0; }
.ledger-check { width: 20px; height: 20px; margin: 0; accent-color: var(--accent-light); cursor: pointer; }
.ledger-settle-pick { width: 1%; }
.ledger-sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.ledger-settle-detail > td { background: rgba(46, 49, 146, 0.05); }
.ledger-settle-detail .ledger-table-wrap { margin: var(--space-sm) 0; }
.ledger-void-row { display: flex; flex-direction: column; gap: var(--space-sm); padding: 10px 12px; border-radius: var(--radius-md);
    border: 1px solid rgba(239, 68, 68, 0.35); background: rgba(239, 68, 68, 0.05); }
.ledger-settle-tiles { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.ledger-sec-bar-start { justify-content: flex-start; }
/* ── Accounting → Settings (Run 47, acctsettings.js) ── */
.acs-root { margin-top: var(--space-md); }
.ledger-tag-live { color: #4ADE80; background: rgba(34, 197, 94, 0.15); }
.acs-void-row > td { background: rgba(239, 68, 68, 0.05); }

/* ── Run 48: Periods, the close checklist, manual journals, the audit log ──
   No new colours: the badge palette above (green = done, amber = check, red = fix). */
.ledger-tag-open { color: #4ADE80; background: rgba(34, 197, 94, 0.15); }
.ledger-tag-closed { color: #FBBF24; background: rgba(245, 158, 11, 0.15); }
.ledger-months { display: flex; flex-direction: column; gap: var(--space-sm); }
.ledger-month-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-sm); flex-wrap: wrap; }
.ledger-month-closed { border-color: rgba(245, 158, 11, 0.30); }
.ledger-month-more > summary { cursor: pointer; padding: 4px 0; min-height: 28px; }
.ledger-month-more[open] > summary { margin-bottom: var(--space-sm); }
.ledger-cac { font-size: 0.86rem; margin: 0; }
.ledger-summary { display: flex; flex-direction: column; gap: var(--space-sm); }
.ledger-summary-tiles { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.ledger-summary-table td, .ledger-summary-table th { padding: 7px 12px; }
.ledger-cl-entry { display: flex; flex-direction: column; gap: 4px; padding: 8px 0; border-top: 1px solid rgba(148, 163, 194, 0.10); }
.ledger-cl-entry:first-of-type { border-top: none; padding-top: 0; }
.ledger-cl-title { color: var(--text-primary) !important; }
.ledger-cl-items { font-size: 0.84rem; }
.ledger-cl-items li { overflow-wrap: anywhere; }
.ledger-cl-name { color: var(--text-primary); font-weight: 500; }
.ledger-cl-detail { color: var(--text-secondary); }
.ledger-cl-link { white-space: nowrap; color: var(--accent-light); font-size: 0.82rem; }
.ledger-cl-more { color: var(--text-muted); list-style: none; }
.ledger-cl-summary > summary { cursor: pointer; }
.ledger-ack { display: flex; align-items: center; gap: 10px; min-height: 44px; padding: 6px 12px; border-radius: var(--radius-sm);
    border: 1px solid rgba(245, 158, 11, 0.45); background: rgba(245, 158, 11, 0.06); color: var(--text-primary); font-size: 0.92rem; cursor: pointer; }
.ledger-footer-gap { flex: 1 1 auto; }
.ledger-mj-side { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; border-radius: var(--radius-md);
    background: rgba(17, 24, 39, 0.45); border: 1px solid var(--border-default); }
.ledger-mj-dc { font-family: var(--font-display); font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); }
.ledger-mj-acct { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.ledger-mj-acct-select { max-width: 100%; }
.ledger-mj-extra { margin-top: 6px; }
.ledger-mj-balance { margin: 0; padding: 8px 12px; border-radius: var(--radius-sm); background: rgba(46, 49, 146, 0.08);
    border: 1px solid var(--border-default); color: var(--text-secondary); font-size: 0.9rem; font-variant-numeric: tabular-nums; }
.ledger-mj-balance strong { color: var(--text-primary); }
#ledgerMjLines td { vertical-align: top; }
#ledgerMjLines .ledger-mj-acct-select { min-width: 200px; }
.ledger-picker-results:empty { display: none; }
.ledger-picker-list { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.ledger-pick { display: flex; gap: 8px; align-items: baseline; width: 100%; min-height: 40px; padding: 8px 10px; text-align: left; cursor: pointer;
    background: rgba(17, 24, 39, 0.5); border: 1px solid var(--border-default); border-radius: var(--radius-sm); color: var(--text-primary); font: inherit; font-size: 0.88rem; }
.ledger-pick:hover, .ledger-pick:focus-visible { border-color: var(--accent-light); background: rgba(46, 49, 146, 0.15); outline: none; }
.ledger-reverse { margin-top: var(--space-md); border-color: rgba(239, 68, 68, 0.35); }
.ledger-audit-what { color: var(--text-primary); display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; }
.ledger-audit-who { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; }
.ledger-audit-change { font-size: 0.86rem; color: var(--text-secondary); margin-top: 4px; overflow-wrap: anywhere; }
.ledger-audit-field { color: var(--text-muted); font-family: var(--font-display); font-size: 0.74rem; text-transform: uppercase; letter-spacing: 0.04em; margin-right: 4px; }
.ledger-audit-new { color: var(--text-primary); font-weight: 500; }
.ledger-audit-arrow { color: var(--text-muted); }
.ledger-audit-reason { font-size: 0.86rem; color: var(--text-primary); margin-top: 4px; font-style: italic; overflow-wrap: anywhere; }

/* ── Run 49: the students' monthly invoices (Ledger → Invoices, the invoice window,
   a closed month's invoice line). No new colours: "Revised" is the amber of a
   check, "Cancelled" the red of a reversal. The PDF links are real anchors (the
   overlay / a new tab) styled as small buttons — a 32 px target (36–40 on a phone), never a bare
   word on a phone. Nothing here truncates: an invoice number is nowrap and the
   row scrolls inside its own .ledger-table-wrap. */
.ledger-tag-revised { color: #FBBF24; background: rgba(245, 158, 11, 0.15); }
.ledger-tag-void { color: #F87171; background: rgba(239, 68, 68, 0.15); }
.ledger-inv-no { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.84rem; color: var(--text-primary); white-space: nowrap; }
.ledger-inv-dl { display: inline-flex; flex-wrap: wrap; gap: 6px; }
.ledger-pdf { display: inline-flex; align-items: center; min-height: 32px; box-sizing: border-box; padding: 4px 12px; border-radius: 999px;
    border: 1px solid rgba(99, 102, 241, 0.35); background: rgba(99, 102, 241, 0.10); color: var(--accent-light);
    font-size: 0.8rem; font-family: var(--font-display); text-decoration: none; white-space: nowrap; }
.ledger-pdf:hover, .ledger-pdf:focus-visible { background: rgba(99, 102, 241, 0.22); color: #fff; outline: none; }
/* the language the invoice was issued in (the student's) — the filled one */
.ledger-pdf-main { color: #fff; background: rgba(46, 49, 146, 0.55); border-color: var(--accent-light); }
.ledger-inv-id { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
#ledgerInvoicesTable td { vertical-align: middle; }
/* one invoice: a wider window (seven money columns), tighter cells */
#ledgerModal[data-ledger-modal="invoice"] .ledger-modal-content { max-width: 980px; }
.ledger-invoice .ledger-table th, .ledger-invoice .ledger-table td { padding: 9px 11px; }
.ledger-invoice .ledger-tiles { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.ledger-invoice .ledger-inv-balances { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
.ledger-inv-open { gap: 8px; }
.ledger-inv-line { margin: 0; font-size: 0.86rem; color: var(--text-secondary); }
/* the invoice's own notes (a class's teacher and subject, its start time, a discount, an
   entry number, the sign of a balance) carry meaning, so they read at --text-secondary:
   the ledger's older --text-muted notes measure 3.3–3.5:1 on these surfaces. */
.ledger-inv-note { font-size: 0.78rem; color: var(--text-secondary); line-height: 1.45; margin: 0; }
div.ledger-inv-note { margin-top: 2px; }
.ledger-inv-cls { display: block; }
.ledger-inv-who { display: block; margin-top: 2px; }
.ledger-inv-await td { background: rgba(46, 49, 146, 0.04); color: var(--text-primary); }
.ledger-actions-center { justify-content: center; margin-top: var(--space-sm); }
.ledger-inv-banner { margin: 0; }
.ledger-inv-current > td { background: rgba(46, 49, 146, 0.06); }
.ledger-invoice .ledger-h4 { margin-top: var(--space-xs); }

/* ── phones ── */
@media (max-width: 700px) {
    .ledger-hide-sm { display: none; }
    .ledger-show-sm { display: block; }
    .ledger-card { padding: var(--space-md); }
    .ledger-table th, .ledger-table td { padding: 9px 10px; }
    .ledger-table .ledger-desc { min-width: 0; }
    /* a FIXED layout on the phone journal: the description takes what is left and
       a long unbroken token (a pasted URL, an id) wraps inside it instead of
       widening the table past the screen — the amount stays in view. */
    #ledgerJournalTable { table-layout: fixed; }
    #ledgerJournalTable th.ledger-col-date { width: 96px; }
    #ledgerJournalTable th.ledger-col-amt { width: 100px; }
    .ledger-meta-k { flex-basis: 92px; }
    .ledger-banner { padding: 12px; }
    .ledger-filters .ledger-field:not(.ledger-field-wide) { flex: 1 1 140px; }
    .ledger-filters .filter-date { min-width: 0; width: 100%; box-sizing: border-box; }
    /* the wizard's wide tables become one card per row, each cell labelled */
    .ledger-stack thead { display: none; }
    .ledger-stack, .ledger-stack tbody, .ledger-stack tr, .ledger-stack td { display: block; width: 100%; box-sizing: border-box; }
    .ledger-stack tr { padding: 8px 10px; border-bottom: 1px solid var(--border-default); }
    .ledger-stack td { display: flex; justify-content: space-between; align-items: center; gap: var(--space-md); padding: 4px 0; border: none; text-align: right; }
    .ledger-stack td::before { content: attr(data-label); flex: 0 0 auto; max-width: 55%; text-align: left; color: var(--text-muted);
        font-family: var(--font-display); font-size: 0.74rem; text-transform: uppercase; letter-spacing: 0.04em; white-space: normal; }
    .ledger-stack td:not([data-label])::before { content: none; }
    .ledger-stack td:first-child { color: var(--text-primary); font-weight: 500; }
    .ledger-stack td.ledger-stack-full { display: block; text-align: left; }
    .ledger-stack td.ledger-stack-empty { display: none; }
    .ledger-stack td.ledger-acts { justify-content: flex-end; gap: 6px; flex-wrap: wrap; }
    .ledger-stack .ledger-ar { text-align: right; }
    .ledger-stack .ledger-name-pair { align-items: flex-end; text-align: right; }
    .ledger-stack tr.ledger-subtotal { display: flex; justify-content: space-between; gap: var(--space-md); }
    .ledger-stack tr.ledger-subtotal td { width: auto; }
    .ledger-stack tr.ledger-subtotal td::before { content: none; }
    .ledger-stack td .filter-input { max-width: 58%; }
    .ledger-stack .ledger-amt-input { max-width: 58%; }
    /* Run 47: the pick box leads its card, the void form and the item list fill it */
    .ledger-stack td.ledger-settle-pick { justify-content: flex-start; width: 100%; }
    .ledger-stack tr.ledger-settle-detail, .ledger-stack tr.acs-void-row { padding: 10px; }
    .ledger-stack td.ledger-acts .action-btn { min-height: 36px; }
    /* Run 48: a journal line's account picker takes the card's full width, the
       amounts sit under it; the audit row's change text reads left-aligned. */
    #ledgerMjLines .ledger-mj-acct-select { min-width: 0; width: 100%; }
    #ledgerMjLines td.ledger-stack-full .ledger-mj-extra { text-align: left; }
    #ledgerAuditTable td.ledger-stack-full { text-align: left; }
    .ledger-checklist .ledger-card { padding: var(--space-sm) var(--space-md); }
    .ledger-footer-gap { display: none; }
    #ledgerModalFooter #ledgerClCloseBtn { flex: 1 1 100%; }
    /* Run 49: an invoice card keeps its PDF buttons on the card's right edge, full height */
    .ledger-stack td.ledger-inv-pdfcell { flex-wrap: wrap; }
    .ledger-stack td.ledger-inv-pdfcell .ledger-pdf { min-height: 36px; }
    #ledgerInvActivity td.ledger-stack-full, #ledgerInvRevisions td.ledger-acts { text-align: left; }
    .ledger-inv-open .ledger-pdf { min-height: 40px; }
    /* the invoice window: two tiles a row (six stacked tiles were a screen of boxes);
       a class's label, chips and teacher wrap inside the value side of its card */
    .ledger-invoice .ledger-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .ledger-invoice .ledger-inv-balances { grid-template-columns: 1fr; }
    .ledger-stack td .ledger-inv-cls { min-width: 0; flex: 0 1 auto; text-align: right; overflow-wrap: anywhere; }
    .ledger-stack td .ledger-inv-cls .ledger-tag { margin-top: 2px; }
}
