/* public/css/components/portal.css
 * ─────────────────────────────────────────────────────────────────────────────
 * The creator portal — the statement page an author opens from their email.
 *
 * Built entirely on tokens.css. No new colours, no new type: the whole point is
 * that a creator's page and the publisher's own view are visibly the same
 * document, in the same house.
 *
 * The one departure from the app shell is that there is no navbar. This page
 * belongs to someone who does not work here, so it opens as a piece of paper on
 * a desk rather than as a screen in a system.
 * ─────────────────────────────────────────────────────────────────────────────
 */

/* Set on <body> while a portal route is mounted, so the staff shell's own
   layout rules (which assume a masthead above #app) do not apply. */
.portal-body #nav-container { display: none; }
.portal-body .main-container { max-width: none; padding: 0; }

/* ── Gate ─────────────────────────────────────────────────────────────────── */

.portal-gate {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-8) var(--space-4);
}

.portal-gate-card {
    width: 100%;
    max-width: 460px;
    background: var(--white);
    border: 1px solid var(--rule-2);
    padding: var(--space-10) var(--space-8) var(--space-8);
}

.portal-gate-form { margin-top: var(--space-6); }

.portal-code-label {
    display: block;
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-widest);
    text-transform: uppercase;
    color: var(--ink-dim);
    margin-bottom: var(--space-2);
}

/* Monospaced-feeling and tracked out: this is a code being transcribed, and
   every character has to be individually legible. */
.portal-code-input {
    width: 100%;
    padding: var(--space-4);
    border: 1px solid var(--rule-2);
    border-radius: 0;
    background: var(--paper);
    color: var(--ink);
    font-family: var(--font-ui);
    font-size: var(--text-md);
    letter-spacing: 0.28em;
    text-align: center;
    text-transform: uppercase;
}
.portal-code-input:focus {
    outline: none;
    border-color: var(--gold-deep);
    background: var(--white);
}

.portal-code-help {
    margin-top: var(--space-2);
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}

.portal-gate-error {
    margin-top: var(--space-3);
    padding: var(--space-3);
    background: var(--coral-tint);
    border-left: 3px solid var(--coral);
    font-family: var(--font-body);
    font-size: var(--text-sm);
    color: var(--ink);
}

.portal-gate-foot {
    margin-top: var(--space-6);
    padding-top: var(--space-4);
    border-top: 1px solid var(--rule);
    text-align: center;
}

.portal-gate-note {
    margin-top: var(--space-3);
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}

/* ── Buttons ──────────────────────────────────────────────────────────────── */

.portal-button {
    display: inline-block;
    width: 100%;
    margin-top: var(--space-4);
    padding: var(--space-4) var(--space-6);
    border: none;
    border-radius: 0;
    background: var(--ink);
    color: var(--paper);
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wider);
    text-transform: uppercase;
    cursor: pointer;
    transition: background var(--transition-fast, 0.15s) ease;
}
.portal-button:hover { background: var(--coral-deep); }
.portal-button:disabled { opacity: 0.5; cursor: default; }

.portal-button-quiet {
    width: auto;
    margin: 0;
    background: transparent;
    color: var(--ink);
    border: 1px solid var(--ink);
}
.portal-button-quiet:hover { background: var(--ink); color: var(--paper); }

.portal-link-button {
    background: none;
    border: none;
    padding: 0;
    font-family: var(--font-body);
    font-size: var(--text-sm);
    color: var(--gold-deep);
    text-decoration: underline;
    text-underline-offset: 3px;
    cursor: pointer;
}
.portal-link-button.is-prominent { font-size: var(--text-base); }
.portal-link-button:disabled { color: var(--ink-dim); cursor: default; }

/* ── Letterhead ───────────────────────────────────────────────────────────── */

.portal-letterhead {
    text-align: center;
    padding-bottom: var(--space-6);
    border-bottom: 1px solid var(--rule);
}

.portal-letterhead-wide {
    padding-top: var(--space-10);
    margin-bottom: var(--space-6);
}

.portal-imprint {
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: 0.32em;
    text-transform: uppercase;
    color: var(--gold-deep);
    margin-bottom: var(--space-2);
}

.portal-logo { max-height: 48px; margin-bottom: var(--space-3); }

.portal-house {
    font-family: var(--font-title);
    font-size: var(--text-2xl);
    line-height: var(--leading-tight);
    color: var(--ink);
    margin: 0;
}

.portal-sub {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-base);
    color: var(--ink-dim);
    margin-top: var(--space-2);
}

/* ── Page and tabs ────────────────────────────────────────────────────────── */

.portal-page {
    max-width: 980px;
    margin: 0 auto;
    padding: 0 var(--space-4) var(--space-16);
}

.portal-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-6);
    justify-content: center;
    border-bottom: 1px solid var(--rule);
    margin-bottom: var(--space-8);
}

/* A 2px gold underline marks the active tab and nothing heavier — the same
   rule navbar.css follows for the staff nav. */
.portal-tab {
    background: none;
    border: none;
    border-bottom: 2px solid transparent;
    padding: 0 0 var(--space-3);
    font-family: var(--font-body);
    font-size: var(--text-base);
    color: var(--ink-dim);
    cursor: pointer;
}
.portal-tab:hover { color: var(--ink); }
.portal-tab.is-active { color: var(--ink); border-bottom-color: var(--gold); }

.portal-panel { min-height: 40vh; }
.portal-loading,
.portal-empty {
    padding: var(--space-10) 0;
    text-align: center;
    font-family: var(--font-body);
    font-style: italic;
    color: var(--ink-dim);
}

/* ── Statement frame ──────────────────────────────────────────────────────── */

.portal-frame {
    background: var(--white);
    border: 1px solid var(--rule-2);
    padding: var(--space-10) var(--space-10) var(--space-8);
}

.portal-frame-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--space-6);
    padding-bottom: var(--space-6);
    margin-bottom: var(--space-8);
    border-bottom: 1px solid var(--rule);
}

.portal-eyebrow {
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-widest);
    text-transform: uppercase;
    color: var(--gold-deep);
}

.portal-frame-title {
    font-family: var(--font-title);
    font-size: var(--text-xl);
    color: var(--ink);
    margin: var(--space-1) 0 0;
}

.portal-narrative { margin-bottom: var(--space-8); }
.portal-narrative p + p { margin-top: var(--space-3); }

/* ── Section headings shared with the staff view ──────────────────────────── */

.portal-section-title {
    font-family: var(--font-title);
    font-size: var(--text-lg);
    color: var(--ink);
    margin: 0;
}

.portal-section-tagline {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
    margin-top: var(--space-2);
}

.portal-intro { margin-bottom: var(--space-8); }

.portal-block { margin-top: var(--space-10); }
.portal-block-title {
    font-family: var(--font-title);
    font-size: var(--text-md);
    color: var(--ink);
    margin: 0 0 var(--space-4);
}
.portal-block-title-sub { margin-top: var(--space-8); }

.portal-footnote {
    margin-top: var(--space-8);
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}

/* ── Earn-out ─────────────────────────────────────────────────────────────── */

.earnout-row { margin-top: var(--space-5); }
.earnout-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--space-4);
}
.earnout-name { font-family: var(--font-body); font-size: var(--text-base); color: var(--ink); }
.earnout-status {
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--amber);
}
.earnout-status.is-out { color: var(--moss-deep); }

.earnout-bar {
    height: 4px;
    background: var(--ink-faint);
    margin: var(--space-2) 0;
}
.earnout-bar span { display: block; height: 100%; background: var(--gold); }

.earnout-foot {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}

/* ── History ──────────────────────────────────────────────────────────────── */

.portal-history-list { border-top: 1px solid var(--rule); }

.portal-history-row {
    display: grid;
    grid-template-columns: 1fr auto auto;
    gap: var(--space-6);
    align-items: center;
    width: 100%;
    padding: var(--space-4) 0;
    border-bottom: 1px solid var(--rule);
    background: none;
    border-left: none;
    border-right: none;
    border-top: none;
    text-align: left;
    cursor: pointer;
    font-family: var(--font-body);
    color: var(--ink);
}
.portal-history-row:hover { background: var(--ink-faint); }

.portal-history-number {
    display: block;
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--ink-dim);
}
.portal-history-date {
    display: block;
    font-size: var(--text-sm);
    font-style: italic;
    color: var(--ink-dim);
}
.portal-history-amount { font-size: var(--text-md); white-space: nowrap; }
.portal-history-amount em { font-style: normal; color: var(--ink-dim); font-size: 0.7em; }

.portal-pill {
    display: inline-block;
    padding: 2px var(--space-2);
    background: var(--amber-tint);
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--ink);
}
.portal-pill.is-paid { background: var(--moss-tint); }
.portal-pill.is-pending { background: var(--gold-tint); }
.portal-pill.is-due { background: var(--teal-tint); }
.portal-pill.is-waiting { background: var(--ink-faint); color: var(--ink-dim); }

/* ── Rights ───────────────────────────────────────────────────────────────── */

.portal-rights-totals { margin-bottom: var(--space-8); }

.portal-licence {
    border: 1px solid var(--rule);
    padding: var(--space-6);
    margin-bottom: var(--space-5);
    background: var(--white);
}

.portal-licence-head {
    display: flex;
    justify-content: space-between;
    gap: var(--space-6);
    padding-bottom: var(--space-4);
    border-bottom: 1px solid var(--rule);
}

.portal-licence-title {
    font-family: var(--font-title);
    font-size: var(--text-md);
    color: var(--ink);
    margin: var(--space-1) 0 0;
}

.portal-licence-meta,
.portal-licence-dates {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}

.portal-licence-term { text-align: right; }
.portal-licence-share {
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--gold-deep);
    margin-bottom: var(--space-1);
}

.portal-licence-event {
    display: grid;
    grid-template-columns: 1fr auto auto;
    gap: var(--space-5);
    align-items: center;
    padding: var(--space-3) 0;
    border-bottom: 1px solid var(--rule);
}
.portal-licence-event:last-child { border-bottom: none; }

.portal-event-name { font-family: var(--font-body); color: var(--ink); }
.portal-event-meta,
.portal-event-statement {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}
.portal-event-state { text-align: right; }
.portal-event-statement { display: block; margin-top: 2px; }
.portal-event-amount { font-family: var(--font-body); font-size: var(--text-md); white-space: nowrap; }
.portal-event-amount em { font-style: normal; color: var(--ink-dim); font-size: 0.7em; }

/* ── Titles ───────────────────────────────────────────────────────────────── */

.portal-title-card {
    border: 1px solid var(--rule);
    padding: var(--space-6);
    margin-bottom: var(--space-5);
    background: var(--white);
}

.portal-title-head {
    display: flex;
    justify-content: space-between;
    gap: var(--space-6);
    flex-wrap: wrap;
}

.portal-title-name {
    font-family: var(--font-title);
    font-size: var(--text-md);
    color: var(--ink);
    margin: 0;
}

.portal-title-meta,
.portal-title-note {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}
.portal-title-note { margin-top: var(--space-3); }

.portal-title-figures { display: flex; gap: var(--space-8); text-align: right; }
.portal-figure-label {
    display: block;
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--ink-dim);
}
.portal-title-figures strong { font-family: var(--font-body); font-size: var(--text-md); font-weight: 400; }

.portal-editions { list-style: none; margin: var(--space-4) 0 0; padding: 0; }
.portal-editions li {
    display: flex;
    justify-content: space-between;
    gap: var(--space-4);
    padding: var(--space-2) 0;
    border-top: 1px solid var(--rule);
    font-family: var(--font-body);
    font-size: var(--text-sm);
}
.portal-edition-meta { color: var(--ink-dim); font-style: italic; }

.portal-bars {
    display: flex;
    align-items: flex-end;
    gap: var(--space-3);
    height: 160px;
    padding-top: var(--space-4);
}
.portal-bar { flex: 1; display: flex; flex-direction: column; align-items: center; height: 100%; }
.portal-bar-track { flex: 1; width: 100%; display: flex; align-items: flex-end; }
.portal-bar-fill { display: block; width: 100%; background: var(--gold); min-height: 2px; }
.portal-bar-value { font-family: var(--font-body); font-size: var(--text-sm); margin-top: var(--space-2); }
.portal-bar-label {
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    color: var(--ink-dim);
}

.portal-channel-list { border-top: 1px solid var(--rule); }
.portal-channel-row {
    display: grid;
    grid-template-columns: 1fr auto 60px auto;
    gap: var(--space-4);
    align-items: baseline;
    padding: var(--space-3) 0;
    border-bottom: 1px solid var(--rule);
    font-family: var(--font-body);
}
.portal-channel-units,
.portal-channel-share { color: var(--ink-dim); font-size: var(--text-sm); text-align: right; }
.portal-channel-amount { white-space: nowrap; }
.portal-channel-amount em { font-style: normal; color: var(--ink-dim); font-size: 0.7em; }

.portal-lag-flag {
    margin-left: var(--space-2);
    padding: 1px var(--space-2);
    background: var(--teal-tint);
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--teal-deep);
}

.portal-caveats {
    margin-top: var(--space-10);
    padding: var(--space-6);
    background: var(--paper);
    border-left: 3px solid var(--gold);
}
.portal-caveats h3 {
    font-family: var(--font-title);
    font-size: var(--text-md);
    color: var(--ink);
    margin: 0 0 var(--space-3);
}
.portal-caveats p {
    font-family: var(--font-body);
    font-size: var(--text-sm);
    line-height: var(--leading-relaxed, 1.65);
    color: var(--ink-dim);
    margin-bottom: var(--space-2);
}

/* ── Margin panel ─────────────────────────────────────────────────────────── */

.portal-margin-launcher {
    position: fixed;
    right: var(--space-6);
    bottom: var(--space-6);
    z-index: var(--z-modal, 300);
    display: flex;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-3) var(--space-5);
    border: none;
    background: var(--ink);
    color: var(--paper);
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wider);
    text-transform: uppercase;
    cursor: pointer;
}
.portal-margin-launcher:hover { background: var(--coral-deep); }

.portal-margin-glyph {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: var(--gold);
    color: var(--ink);
    font-family: var(--font-title);
    font-style: italic;
    font-size: var(--text-base);
    text-transform: none;
}

.portal-margin-panel {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    width: 420px;
    max-width: 100vw;
    z-index: var(--z-modal, 300);
    display: flex;
    flex-direction: column;
    background: var(--white);
    border-left: 1px solid var(--rule-2);
    transform: translateX(100%);
    transition: transform 0.25s ease;
}
.portal-margin-panel.is-open { transform: translateX(0); }

.portal-margin-head {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: var(--space-4);
    padding: var(--space-5);
    border-bottom: 1px solid var(--rule);
}
.portal-margin-title { font-family: var(--font-title); font-size: var(--text-md); color: var(--ink); }
.portal-margin-title em { font-family: var(--font-body); font-size: var(--text-base); color: var(--ink-dim); }
.portal-margin-sub { font-family: var(--font-body); font-style: italic; font-size: var(--text-sm); color: var(--ink-dim); }
.portal-margin-close {
    background: none; border: none; font-size: var(--text-md);
    color: var(--ink-dim); cursor: pointer; line-height: 1;
}

.portal-margin-messages { flex: 1; overflow-y: auto; padding: var(--space-5); }

.portal-margin-message {
    margin-bottom: var(--space-4);
    padding: var(--space-3) var(--space-4);
    font-family: var(--font-body);
    font-size: var(--text-base);
    line-height: var(--leading-relaxed, 1.65);
    white-space: pre-wrap;
}
.portal-margin-message.is-user { background: var(--ink); color: var(--paper); margin-left: var(--space-8); }
.portal-margin-message.is-assistant { background: var(--paper); color: var(--ink); border-left: 3px solid var(--gold); }
.portal-margin-message.is-thinking { color: var(--ink-dim); font-style: italic; }

.portal-margin-notice {
    margin-bottom: var(--space-4);
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}

.portal-margin-hint {
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
    margin-bottom: var(--space-4);
}

.portal-margin-suggestion {
    display: block;
    width: 100%;
    margin-bottom: var(--space-2);
    padding: var(--space-3);
    background: var(--paper);
    border: 1px solid var(--rule);
    font-family: var(--font-body);
    font-size: var(--text-sm);
    color: var(--ink);
    text-align: left;
    cursor: pointer;
}
.portal-margin-suggestion:hover { border-color: var(--gold-deep); }

.portal-margin-form { display: flex; gap: var(--space-2); padding: var(--space-4); border-top: 1px solid var(--rule); }
.portal-margin-input {
    flex: 1;
    padding: var(--space-3);
    border: 1px solid var(--rule-2);
    border-radius: 0;
    background: var(--paper);
    font-family: var(--font-body);
    font-size: var(--text-base);
    color: var(--ink);
}
.portal-margin-input:focus { outline: none; border-color: var(--gold-deep); background: var(--white); }
.portal-margin-send {
    padding: var(--space-3) var(--space-5);
    border: none;
    background: var(--ink);
    color: var(--paper);
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wider);
    text-transform: uppercase;
    cursor: pointer;
}

/* ── Responsive ───────────────────────────────────────────────────────────── */

@media (max-width: 720px) {
    .portal-frame { padding: var(--space-6) var(--space-4); }
    .portal-frame-head,
    .portal-licence-head,
    .portal-title-head { flex-direction: column; }
    .portal-licence-term { text-align: left; }
    .portal-history-row { grid-template-columns: 1fr auto; }
    .portal-history-status { grid-column: 1 / -1; }
    .portal-licence-event { grid-template-columns: 1fr auto; }
    .portal-event-state { grid-column: 1 / -1; text-align: left; }
    .portal-channel-row { grid-template-columns: 1fr auto; }
    .portal-channel-share { display: none; }
    .portal-margin-panel { width: 100vw; }
    .portal-title-figures { gap: var(--space-5); text-align: left; }
}

/* A credit that carries no royalty rate. Marked rather than hidden: the units
   above it are real and the zero beside them needs its explanation attached. */
.portal-title-note-flag {
    margin-top: var(--space-3);
    padding: var(--space-3) var(--space-4);
    background: var(--teal-tint);
    border-left: 3px solid var(--teal);
    font-style: normal;
    color: var(--ink);
}

/* ── Your details ─────────────────────────────────────────────────────────── */
/*
 * Two cards, and the difference between them is the point: the first is a
 * form, the second is a record. The locked card is deliberately not styled as
 * a disabled form — greyed-out inputs invite people to try to type in them.
 * It reads as a statement of what the publisher holds, with one way to ask
 * for a change.
 */

.portal-details-card {
    background: var(--white);
    border: 1px solid var(--rule);
    padding: var(--space-6);
    margin-bottom: var(--space-5);
}

.portal-details-form { margin-top: var(--space-4); }

.portal-field {
    display: block;
    margin-bottom: var(--space-4);
}

.portal-field-label {
    display: block;
    margin-bottom: var(--space-1);
    font-family: var(--font-ui);
    font-size: var(--text-xs);
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--ink-dim);
}

.portal-input {
    width: 100%;
    padding: var(--space-3);
    border: 1px solid var(--rule-2);
    border-radius: 0;
    background: var(--paper);
    color: var(--ink);
    font-family: var(--font-body);
    font-size: var(--text-base);
}
.portal-input:focus {
    outline: none;
    border-color: var(--gold-deep);
    background: var(--white);
}
textarea.portal-input { resize: vertical; }

.portal-fieldset {
    border: none;
    border-top: 1px solid var(--rule);
    padding: var(--space-4) 0 0;
    margin: var(--space-5) 0 0;
}
.portal-fieldset legend { padding: 0; }

/* The details form is the one button on the portal that is not the whole
   width of its card — it sits under a form rather than ending a page. */
.portal-button-inline {
    width: auto;
    margin-top: var(--space-2);
}

.portal-details-status {
    margin: var(--space-3) 0;
    padding: var(--space-3);
    font-family: var(--font-body);
    font-size: var(--text-sm);
    border-left: 3px solid var(--rule-2);
    background: var(--paper);
    color: var(--ink);
}
.portal-details-status.is-ok { border-left-color: var(--moss); background: var(--moss-tint); }
.portal-details-status.is-error { border-left-color: var(--coral); background: var(--coral-tint); }

.portal-details-locked { background: var(--paper); }

.portal-locked-row {
    padding: var(--space-3) 0;
    border-bottom: 1px solid var(--rule);
}
.portal-locked-row:last-of-type { border-bottom: none; }

.portal-locked-value {
    font-family: var(--font-body);
    font-size: var(--text-base);
    color: var(--ink);
}
.portal-locked-value em { color: var(--ink-dim); }

.portal-locked-hint {
    margin-top: 2px;
    font-family: var(--font-body);
    font-style: italic;
    font-size: var(--text-sm);
    color: var(--ink-dim);
}

.portal-request {
    margin-top: var(--space-6);
    padding-top: var(--space-5);
    border-top: 1px solid var(--rule-2);
}
