html,
body,
div,
applet,
object,
iframe,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}

article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
    display: block;
}

input {
    border: 0;
    width: 260px;
    height: 40px;
    text-indent: 6px;
    font-size: 15px;
    border-radius: 4px 4px 4px 4px;
    position: relative;
    color: var(--secondary);
    padding: 0;
    display: inline-flex;
    flex: 0 1 260px;
}

input.half:last-child,
input.third:last-child {
    margin-right: 0px;
}

input.half:first-child,
input.third:first-child {
    margin-right: 15px;
}


input.half,
div.half {
    max-width: 120px;
    margin-right: 15px;
}

input.third {
    width: 78px;
    margin-right: 9px;
}

input[type="button"],
input[type="submit"] {
    float: right;
    height: 40px;
    background: var(--arena-orange);
    color: var(--neutral);
    cursor: pointer;
    text-align: center;
    display: inline-block;
    text-indent: 0;
}

input[type="select"] {
    float: left;
    width: 460px;
    height: 40px;
    margin-left: 174px;
    background: var(--arena-orange);
}

select {
    /*float: left;*/

    /* display:inline-flex; */
    /*display: inline-block;*/
    min-width: 50% !important;
    height: 40px;
    /* padding: 20px 0 20px 0; */
    background-color: var(--surface);
    border: 0;
    border-radius: 5px;
    width: 260px;
    text-indent: 5px;
}

textarea {


    border: 0;
    border-radius: 5px;
    width: 242px;
    max-height: 66px;
    padding: 7px;
    color: var(--secondary);
    /* margin-bottom: 30px; */
    display: inline-flex;
    flex: 0 1 260px;
}

/* #1124: site-wide disabled-state base rule. Adam ruled (thread fdd0c169 on
   !751) that disabled-state styling is a per-DOM-TYPE convention, not a
   per-form fix — every form's disableable input/select/textarea must render
   gray by default, not just the contract form that exposed the bug. This is
   the low-specificity fallback: a bare element + :disabled selector (no id
   or class), so any form-specific override — like the higher-specificity
   ISSUED/SIGNED readonly-gate rule further down this file — still wins
   deliberately where a form needs different disabled treatment. Checkbox and
   radio inputs are excluded: their real <input> is visually hidden (1px,
   clipped) and the visible control is a label:after sprite (see the
   .checkbox rules below) that this background/color rule wouldn't reach
   anyway, except for the two documented exceptions that show the raw
   checkbox (#riderPickerList, .inline-rider-picker-list) — excluding
   [type="checkbox"]/[type="radio"] here keeps this rule from interacting
   with that pattern at all. customSelect() hazard (found in review, fixed
   2026-07-19): the Contracts list's inline status-change handler
   (contracts.js, .icon-change.contractStatus) used to call an UNSCOPED
   $('select').customSelect(), which wraps a native <select> in a visible
   sibling <span class="customSelect"> and hides the original behind
   opacity:0 — a :disabled selector on the hidden native element then has
   no visible effect, since the plugin's own disabled hook
   (.customSelectDisabled) has zero CSS rules anywhere and only fires on
   an 'update' event nothing re-triggers. #templateId (the contract edit
   dropdown's "Select Template" field, rendered unconditionally by
   contracts.php from page load) was exactly this case: the first inline
   status-change anywhere on the page would silently wrap it, after which
   an ISSUED/SIGNED lock's disable would leave the visible span looking
   normal/editable regardless of this rule. Fixed by scoping the call to
   the newly-appended select only ($('#c2'+id+' select').customSelect()) —
   #templateId is never customSelect-wrapped now, so every real form
   select (this one included) is a native, unwrapped <select> and this
   rule's selector reaches it directly, with no wrapper-span indirection
   to work around. */
input:not([type="checkbox"]):not([type="radio"]):disabled,
select:disabled,
textarea:disabled {
    background: var(--neutral);
    color: var(--secondary);
    cursor: not-allowed;
}

.depricated{
    color:red;
}

.depricated:hover::after{
    content: "depricated, requires update";
    position: absolute;
    font-size: x-small;
    background: #0000001c;
    border-radius: 5px;
    padding: 5px;
    line-height: normal;
}

.hidden {
    display: none !important;
}

.customSelect {
    /* This is the default class that is used */
    /* Put whatever custom styles you want here */

    background-color: var(--surface);
    color: var(--text-muted);
    border-radius: 5px;
    height: 40px;
    font-size: 14px;
    /* width: 260px; */

}

.customSelect.customSelectHover {
    /* Styles for when the select box is hovered */
}

.customSelect.customSelectOpen {
    /* Styles for when the select box is open */
}

.customSelect.customSelectFocus {
    /* Styles for when the select box is in focus */
}

.customSelectInner {
    text-indent: 10px;
    line-height: 40px;
    position: relative;
    padding-right: 43px;
    /* width: 224px; */
}

.customSelectInner:after {
    /* You can style the inner box too */
    background: url('../images/icon-sprites.png');
    content: '';
    display: inline-block;
    width: 43px;
    height: 40px;
    vertical-align: middle;
    float: right;
    background-position: -520px 0px;
    border-left: solid 1px grey;
    position: relative;
    right: -43px;
    top: 0px;
}

.customSelect.customSelectHover .customSelectInner:after,
.customSelect.customSelectOpen .customSelectInner:after {
    background-position: -520px -43px;
}

.dz-filename {
    display: none;
}

.dz-size {
    display: none;
}

.dz-preview,
.dz-file-preview,
.dz-processing,
.dz-success {
    /*background: white; */
    position: absolute;
    top: 40px;
    width: 300px;
    height: 60px;
    border-radius: 5px;
}

.dz-success-mark {
    display: none;
}

.dz-error-message {
    display: none;
}

.dz-error-mark {
    display: none;
}

ol,
ul {
    list-style: none;
}

blockquote,
q {
    quotes: none;
}

blockquote:before,
blockquote:after,
q:before,
q:after {
    content: '';
    content: none;
}

table {
    border-collapse: collapse;
    border-spacing: 0;
}

.wf-loading {
    visibility: hidden;
}

.wf-active {
    visibility: visible;
}

a {
    text-decoration: none;
    line-height: inherit;
    color: inherit;
}

a:hover,
a:focus {
    color: var(--arena-orange);
    cursor: pointer;
}

.active {
    color: var(--arena-orange) !important;
}

/* #810 — scope legacy top-nav active underline away from the new rail.
   The rail renders #mainMenu items as a vertical list with pill background
   + inset box-shadow (lines 468-482); the border-bottom here was the old
   horizontal-nav active indicator and creates a doubled highlight in the rail. */
.rail #mainMenu .active {
    border-bottom: none;
}

.active a {
    color: var(--arena-orange) !important;
}

.grey {
    color: inherit !important;
}

html {
    font-family: "Open Sans";
    font-size: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
}

body {
    position: relative;
    background: var(--neutral-dark);
    color: var(--secondary);
    padding: 0;
    margin: 0;
    font-weight: normal;
    font-style: normal;
    font-size: 100%;
    line-height: 1;
    cursor: default;
    /* min-width: 1280px; */
    /* width: 100%; */
    height: 100%;
    overflow: auto;
}

h1 {
    font-size: 23px;
    line-height: 40px;
    text-align: left;
    margin: 0;
    padding: 0;
}

h2 {
    font-size: 14px;
    line-height: 30px;
    font-weight: 400;
    text-align: left;
    margin: 0;
    padding: 0;
    display: inline-block;
    vertical-align: middle;
}

h3 {
    /* float: left; */
    line-height: 100%;
    font-weight: 300;
    text-align: center;
    margin: 0;
    padding: 0;
    position: relative;
}

h4,
.h4 {
    font-size: 12px;
    line-height: 19px;
    font-weight: 400;
    text-align: left;
    margin: 0;
    padding: 0;
    display: inline;
}

h5 {
    width: 100%;
    font-weight: 600;
    line-height: 1em;
    margin: 0;
}

h6 {
    width: 100%;
}

p {
    width: 100%;
}

#mainLogo {
    background: url(../images/arena_logo.png) no-repeat center;

    height: 200px;
    width: 100%;
}

#loginForm {
    width: 290px;
    height: 150px;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -75px;
    margin-left: -130px;
}

#loginForm input[type="submit"] {
    left: initial;

}

/* =============================================================
   #740 — Navigation redesign (MR1, desktop): left rail + workspace header.
   Replaces the legacy absolute-positioned top <header> + .sub-header chrome.
   Token-based (colors_and_type.css). Mobile collapse is MR2.
   ============================================================= */
html, body { height: 100%; }
body { margin: 0; }
/* #740 MR2 — 100dvh so the chrome accounts for the mobile browser's collapsing
   URL/toolbar; 100vh kept first as the fallback for browsers without dvh. */
.appshell { display: flex; height: 100vh; height: 100dvh; overflow: hidden; background: var(--surface); }
.rail { width: var(--rail-w); flex: 0 0 auto; background: var(--neutral-dark); position: relative; display: flex; flex-direction: column; padding: 0 12px 14px; box-sizing: border-box; overflow-y: auto; }
/* #740 — rail/content divider BELOW the brand band only, so the top header band
   reads as one continuous strip (no vertical seam where rail meets workspace header). */
.rail::after { content: ""; position: absolute; top: var(--h-whead); bottom: 0; right: 0; width: 1px; background: var(--rail-border); }
.rail .brand { height: 25px; margin: 2px 8px 18px; flex: 0 0 auto; }
.rail .brand a { display: block; width: 100%; height: 100%; background: url(../images/ibookshows-logo.png) no-repeat left center; background-size: contain; text-indent: -9999px; overflow: hidden; white-space: nowrap; }
.rail nav ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.rail nav ul li { position: relative; }
.rail nav ul li a { display: flex; align-items: center; gap: 12px; padding: 9px 12px; border-radius: 9px; color: var(--tertiary); font-size: 14px; text-decoration: none; white-space: nowrap; }
.rail nav ul li a:hover { background: var(--rail-hover-bg); }
.rail nav ul li a:before { font-family: var(--font-icon); font-size: 15px; width: 18px; text-align: center; color: var(--secondary); display: inline-block; flex: 0 0 auto; }
.rail nav ul li.active a,
.rail[data-subactive="admin"] #mainMenu_admin > a { background: var(--rail-active-bg); color: var(--arena-orange); font-weight: 600; }
.rail nav ul li.active a:before,
.rail[data-subactive="admin"] #mainMenu_admin > a:before { color: var(--arena-orange); }
/* F1: orange active bar flush to rail left edge.
   The .rail has overflow-y:auto which also clips overflow-x, so an absolute
   pseudo at left:-12px would be invisible. Instead expand the active li to the
   left edge with a negative margin (compensated by padding so the <a> content
   stays aligned), then use an inset box-shadow on the li itself. */
.rail nav ul li.active,
.rail[data-subactive="admin"] #mainMenu_admin {
    margin-left: -12px;
    padding-left: 12px;
    box-shadow: inset 3px 0 0 var(--arena-orange);
}
#mainMenu_contracts a:before { content: "\f0f6"; }
#mainMenu_artists a:before { content: "\f001"; }
#mainMenu_venues a:before { content: "\f041"; }
#mainMenu_promoters a:before { content: "\f0a1"; }
#mainMenu_admin a:before { content: "\f0c0"; }
.rail .rail-sub ul { list-style: none; margin: 2px 0 2px 30px; padding-left: 10px; border-left: 1px solid var(--rail-sub-border); display: flex; flex-direction: column; gap: 1px; }
.rail .rail-sub ul li a { display: block; font-size: 13px; padding: 6px 10px; border-radius: 7px; color: var(--secondary-dark); text-decoration: none; white-space: nowrap; }
.rail .rail-sub ul li a:hover { background: var(--rail-hover-bg); color: var(--tertiary); }
.rail .rail-sub ul li.active a { color: var(--arena-orange); font-weight: 600; background: var(--rail-active-bg); }
.rail .acct { margin-top: auto; display: flex; align-items: center; gap: 10px; padding: 12px 10px 4px; border-top: 1px solid var(--rail-border); flex: 0 0 auto; }
.rail .acct .acct-av { width: 30px; height: 30px; border-radius: 50%; background: var(--arena-orange); color: var(--surface); display: inline-flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 700; flex: 0 0 auto; }
.rail .acct .acct-who { font-size: 13px; color: var(--tertiary); font-weight: 600; line-height: 1.25; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rail .acct .acct-who small { display: block; font-weight: 400; color: var(--text-faint); font-size: 11px; }
.rail .acct .icon-logout { margin-left: auto; flex: 0 0 auto; }
.rail .acct .icon-logout a { color: var(--text-faint); font-size: 15px; text-decoration: none; cursor: pointer; }
.rail .acct .icon-logout a:hover { color: var(--arena-orange); }
/* A: suppress the legacy icon-sprites.png pseudo-element inside the rail — fa fa-sign-out is the only glyph needed */
.rail .acct .icon-logout:after { content: none; display: none; }
/* #740 — rail brand row: logo + collapse toggle side-by-side */
.rail .brandrow { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; height: var(--h-whead); margin: 0 -12px 16px -12px; padding: 0 12px; box-sizing: border-box; background: var(--rail-bg); border-bottom: 1px solid var(--rail-border); }
.rail .brandrow .brand { flex: 1 1 auto; min-width: 0; margin: 0; }
.rail .railtoggle { flex: 0 0 auto; width: 26px; height: 26px; border: 0; background: transparent; border-radius: 7px; color: var(--secondary); display: inline-flex; align-items: center; justify-content: center; font-size: 13px; cursor: pointer; padding: 0; }
@media (hover: hover) { .rail .railtoggle:hover { background: var(--rail-hover-bg); color: var(--arena-orange); } }
/* #740 — collapsed rail: 64px icon-only strip. Width only changes; left/right padding stays
   identical to expanded so the active-bar offset (margin-left:-12px) still lines up flush. */
html.rail-collapsed .rail { width: 64px; }
html.rail-collapsed .rail .brand { display: none; }
html.rail-collapsed .rail .brandrow { justify-content: center; }
html.rail-collapsed .rail nav ul li a { justify-content: center; gap: 0; padding: 9px 12px; }
html.rail-collapsed .rail nav ul li a span { display: none; }
html.rail-collapsed .rail .rail-sub { display: none; }
html.rail-collapsed .rail .acct { justify-content: center; flex-direction: column; gap: 10px; }
html.rail-collapsed .rail .acct .acct-who { display: none; }
/* #740 — keep the sign-out link reachable when collapsed (it just stacks under the
   avatar in the centered column); hiding it stranded users with no way to log out. */
html.rail-collapsed .rail .acct .icon-logout { margin-left: 0; }
/* collapsed toggle shows expand icon (angle-double-right) via CSS content override */
html.rail-collapsed #rail-toggle .fa:before { content: "\f101"; }
.work { flex: 1 1 auto; display: flex; flex-direction: column; min-width: 0; height: 100vh; height: 100dvh; }
.whead { display: flex; align-items: center; gap: 16px; height: var(--h-whead); padding: 0 22px; background: var(--rail-bg); border-bottom: 1px solid var(--rail-border); flex: 0 0 auto; }
.whead .wtitle { font-size: 24px; font-weight: 600; color: var(--text-strong); letter-spacing: -.01em; white-space: nowrap; }
.whead .wcount { font-size: 13px; color: var(--text-faint); white-space: nowrap; }
.whead .wright { margin-left: auto; display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
.sfu { display: flex; align-items: center; height: var(--h-control); background: var(--surface); border: 1px solid var(--control-border); border-radius: 9px; position: relative; flex: 0 1 348px; min-width: 150px; }
.sfu.sfu-focus { border-color: var(--info); box-shadow: 0 0 0 3px var(--focus-ring); }
.sfu .filt { display: flex; align-items: center; gap: 7px; padding: 0 11px 0 13px; height: 100%; border: 0; background: transparent; cursor: pointer; color: var(--secondary-dark); font-family: var(--font-sans); font-size: 13px; border-radius: 9px 0 0 9px; white-space: nowrap; }
.sfu .filt .fa { font-size: 12px; color: var(--secondary); }
.sfu .filt:hover, .sfu.has-filters .filt { color: var(--arena-orange); }
.sfu .filt:hover .fa, .sfu.has-filters .filt .fa { color: var(--arena-orange); }
.sfu .filt .filter-panel-arrow { font-size: 11px; }
.sfu .sfu-sep { width: 1px; height: 20px; background: var(--control-border); flex: 0 0 auto; }
.sfu .sfu-chips { display: flex; align-items: center; gap: 6px; padding-left: 9px; }
.sfu .sfu-field { flex: 1 1 auto; display: flex; align-items: center; gap: 8px; padding: 0 12px; min-width: 0; }
.sfu .sfu-field .fa-search { font-size: 13px; color: var(--secondary); flex: 0 0 auto; }
.sfu .sfu-field input[type="search"] { border: 0; outline: 0; background: transparent; font: inherit; font-size: 13px; color: var(--text); width: 100%; min-width: 54px; height: 36px; max-width: none; -webkit-appearance: textfield; }
/* filter dropdown — reuse #417 markup, reposition as a popover */
.sfu .sfu-panel.filter-panel-collapsed { display: none; }
.sfu #filter-panel.sfu-panel { position: absolute; top: calc(100% + 8px); left: 0; width: 300px; max-height: none; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 12px 34px rgba(0,0,0,.16); padding: 16px; z-index: 50; overflow: visible; transition: none; }
.sfu #filter-panel.sfu-panel .filter-panel-inner { padding: 0; flex-direction: column; align-items: stretch; }
/* primary + overflow */
.btn-primary { display: inline-flex; align-items: center; gap: 7px; height: var(--h-control); padding: 0 15px; background: var(--arena-orange); color: var(--surface); border: 0; border-radius: 9px; font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap; text-decoration: none; }
/* #914 — the global `a:hover, a:focus { color: var(--arena-orange) }` rule (style.css:323)
   has higher specificity (0,1,1) than the bare `.btn-primary` color declaration above
   (0,1,0), so it silently overrode the button's white text on hover/focus, leaving
   near-invisible orange-on-orange text. Re-assert the white text explicitly here so
   .btn-primary wins regardless of the generic link rule. No `.btn-primary:active` rule
   existed at all, so the pressed state fell through to the same broken hover/rest cascade
   — added one with --arena-orange-dark (the existing "pressed" token, already used by the
   four modal-footer submit buttons) for a real, readable pressed state. */
.btn-primary:hover,
.btn-primary:focus { background: var(--arena-orange-hover); color: var(--surface); }
.btn-primary:active { background: var(--arena-orange-dark); color: var(--surface); }
/* #1022 — canonical `.button` base class. Several call sites (adminConfigPage
   row rules, .modalActions) had comments claiming a shared ".button class"
   already supplied background/color/radius/cursor "inherited from the global
   input[type="button"] + .button class" — but that base rule never existed.
   input[type="button"]/input[type="submit"] are element+attribute selectors
   and never match a <button> tag, so any `<button class="button ...">` outside
   a row-scoped override (e.g. #topVerifyBtn on Admin > Google Integration)
   rendered as an unstyled/inconsistently-sized native button. This is that
   missing base — same tokens as the four modal-footer input[type=submit]
   rules (--h-control/--fs-button/--r-md), so <button class="button"> and
   <input type=submit> render identically everywhere. More specific existing
   rules (.modalActions .button, .adminConfigPage .button.alert, per-row
   padding/margin tweaks) still win via specificity and are unaffected. */
/* width/flex: the legacy global `input {}` rule (line ~97) sets
   width:260px; flex:0 1 260px on every <input> regardless of type — no
   .config-actions/.config-inline-row row-scoped rule overrides width, so
   every plain <input type="submit"/"button" class="button"> Save/action
   button (e.g. #saveDriveConfig, #saveTicketCounts, #saveEmailDefaults,
   #saveSigEmailDefaults, #saveSvaBtn, #saveDocumensoSettings,
   #sendTicketCountTest) rendered far wider than its neighbors, with the
   label floating in a sea of empty padding (Adam review, finding 3 — this
   surfaced during the double-margin/padding audit as a real, if differently-
   shaped, "the button classes have inconsistent spacing" defect). Same fix
   #1023 already applied to `.button.tiny` for the same underlying rule. */
.button { display: inline-flex; align-items: center; justify-content: center; height: var(--h-control); width: auto; flex: 0 0 auto; padding: 0 var(--sp-xl); background: var(--arena-orange); color: var(--surface); border: none; border-radius: var(--r-md); font-size: var(--fs-button); font-family: inherit; font-weight: 600; cursor: pointer; white-space: nowrap; text-decoration: none; }
.button:hover:not(:disabled) { background: var(--arena-orange-hover); }
.button:disabled { cursor: default; opacity: 0.6; }
.button.secondary { background: var(--surface); color: var(--secondary-dark); border: 1px solid var(--border-dark); }
.button.secondary:hover:not(:disabled) { background: var(--neutral); }
.ov-btn { position: relative; display: inline-flex; }
.iconbtn { width: var(--h-control); height: var(--h-control); border-radius: 9px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; font-size: 16px; color: var(--secondary-dark); background: var(--surface); border: 1px solid var(--control-border); }
.iconbtn:hover { color: var(--arena-orange); }
.ov-menu { position: absolute; top: calc(100% + 6px); right: 0; background: var(--surface); border: 1px solid var(--border); border-radius: 10px; box-shadow: 0 10px 28px rgba(0,0,0,.16); min-width: 160px; width: max-content; padding: 6px; z-index: 55; display: none; } /* F4: tightened from 200px; width:max-content hugs single-item menus */
.ov-btn.open .ov-menu { display: block; }
.ov-menu a { display: flex; align-items: center; gap: 11px; padding: 10px 12px; font-size: 13px; color: var(--text); text-decoration: none; border-radius: 7px; white-space: nowrap; }
.ov-menu a:hover { background: var(--rail-active-bg); color: var(--arena-orange); }
/* keep the existing #filter-chips-bar chip styling; ensure it sits inline in the sfu */
.sfu .sfu-chips:empty { display: none; }

input[type="search"] {
    -webkit-appearance: textfield;
    width: 100%;
    max-width: 300px;
    height: 32px;
    border: 1px solid var(--border);
    border-radius: 8px 8px 8px 8px;
    outline: 0;
}

/* #740 — .page wrapper removed; layout is now flex (.appshell > .work > #content). */

#content {
    position: relative;
    top: auto;
    bottom: auto;
    flex: 1 1 auto;
    width: auto;
    /*max-height: 675px; */
    /*padding: 0 0 1px 0; border: none;*/
    border-top: 1px solid var(--border-dark);
    overflow: auto;
    background: var(--neutral);
    margin: 0;
    padding: 0 20px 0 0; /* E: 20px right gutter so wide rows don't butt the edge */
    max-height: 100%;
}

/* #537 Drop the fixed `height: 130px`; keep `min-height: 130px` so rows expand
   when a child cell wraps to multiple lines (e.g. long leader names on
   /artists). See the companion `vertical-align` change on `.cell` below. */
#content .row {
    position: relative;
    min-width: 100%;
    float: left;
    min-height: 130px;
    border-bottom: 1px solid var(--border-dark);
    white-space: nowrap;
    margin: 0;
    padding: 0;
    display: block;
    /* display: flex; */
    /* flex-wrap: nowrap; */
}


/* #537 Cells switch from `vertical-align: middle` to `top` so shorter cells
   pin to the row top instead of mid-anchoring against a now-taller line box
   when one cell's content wrapped and stretched the row. */
#content .row .cell {
    display: inline-flex;
    /* display: inline-block; */
    padding: 0 10px 0 10px;
    /* min-height: 130px; */
    position: relative;
    min-width: 280px;
    vertical-align: top;
    flex-direction: column;
    justify-content: space-around;
    min-height: 129px;

    border-top: solid 1px var(--surface);
    /* border-bottom: solid 1px; */
    /* border-left: solid 1px white; */
}

.floater {
    /* display: flex; */
    /* flex-direction: inherit; */
}

.floater.full {
    background: var(--surface);
    max-height: 400px;
    z-index: 2;
    position: absolute;
    top: -2px;
    left: -5px;
    width: 94.4%;
    padding: 8px 10px 27px 11px;
    border: solid;
    border-width: 0px 1px 1px 1px;
}

#content .row .cell.noMin {
    min-width: 0px;
}

#content .row .cell:nth-child(odd) {
    border-left: solid 1px;
    border-right: solid 1px;
}

#content .row .cell:first-child {
    border-right: none;
    min-width: 0;
}

#content .row .cell:nth-child(2) {
    border-left: none;
}

#content .row .cell:last-child {
    border-right: none;
    min-width: 0;
    /* margin-top: -2px; */
    /* margin-bottom: -1px; */
    margin-left: auto;
    /* margin-right: 0; */
    height:100%;
}

#content .row .cell:nth-child(3).userInfo

/*HACK!!*/
    {
    float: none;
    display: inline-flex;

}


#content .row .cell.settings {}

.settingsBox {
    background: var(--surface);
    border-radius: 5px;
    position: relative;
    top: 25px;
    overflow: hidden;
    -webkit-transform: scaleY(0);
    -webkit-transform-origin: top;
    transition: -webkit-transform 0.26s ease;
}

.settingsItem {
    padding: 10px;
    cursor: pointer;
}


.settingsItem:hover {
    color: var(--arena-orange);
}


.settingsBoxOpen {
    -webkit-transform: scaleY(1);
}

/* #537 max-width was 150px, which made multi-word values (leader names,
   long city names, multi-part contact strings) wrap to 4–5 lines while
   plenty of horizontal cell space sat unused. Raised to 320px so multi-word
   and slash-joined values lay out on 1–2 lines across all listings
   (#content .row .cell .cellContent .fieldVal — artists, venues, promoters,
   contracts). .fieldVal.artistNames keeps its own explicit 150px override
   below (intentional ellipsis cap). */
.fieldVal {
    font-size: 12px;
    line-height: 19px;
    font-weight: 400;
    text-align: left;
    margin: 0;
    padding: 0;
    color: var(--arena-orange);
    max-width: 320px;
    text-wrap: auto;
    text-align: center;
    /* flex: 1; */
}

.fieldVal h1 {
    text-align: center;
    font-weight: 200;
}

.fieldVal.status-not-started,
.fieldVal.status-tentative,
.fieldVal.status-OFFER {
    font-size: 2em;
}

.fieldVal.status-ongoing {
    color: var(--success);
    font-size: 2em;
}

.fieldVal.status-CONTRACT {
    color: var(--warning);
    font-size: 2em;
}

.fieldVal.status-complete,
.fieldVal.status-cancelled,
.fieldVal.status-CANCELED {
    font-size: 2em;
}

.fieldVal.status-confirmed,
.fieldVal.status-ISSUED {
    color: var(--success);
    font-size: 2em;
}

.fieldVal.status-SIGNED {
    color: #00a5a5;
    font-size: 2em;
}

.fieldVal.artistNames {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
    max-width: 150px;
}

.row .nameField {
    /* min-height: 110px; */
    margin: 0;
    padding: 0;
    position: relative;
}

.nameField h1 {
    font-weight: 400;
}

.nameField input {}

#content .row .D {
    float: left;
    padding: 0 10px 0 10px;
    min-height: 150px;
    border-right: 1px solid var(--border-dark);
    background: var(--surface);
}

#content .row .full {
    width: 100%;
    margin: 0;
    padding: 0;
    height: 100%;
    left: 0;
    z-index: 1;
}

#content .row .top {
    width: 100%;
    margin: 0;
    padding: 0;
    min-height: 35px;
    /* position: absolute; */
    left: 0;
    z-index: 1;
}

#content .row .top .left,
#content .row .full .left {
    float: left;
    height: 30px;
}

#content .row .full .right,
#content .row .top .right {
    float: right;
    min-width: 40px;
    height: 30px;
    display: inline-block;
    position: relative;
    font-size: 0.7em;
}

#content .row .D .top .left {
    float: left;
    width: 100px;
    height: 30px;
}


#content .row .middle {
    min-height: 70px;
    margin: 0;
    padding: 0;
    /* display: inline-flex; */
    /* justify-content: space-around; */
    /* flex-wrap: nowrap; */
}

#content .row .middle.fixed {
    flex-wrap: nowrap;
}

#content .row .middle .topHalf {
    width: 100%;
    min-height: 25px;
    position: absolute;
    display: none;
}

#content .row .middle .bottomHalf {
    width: 100%;
    min-height: 25px;
}

.bottom {
    height: 40px;
    line-height: 40px;
    text-align: right;
    padding: 0px 20px;
}

#content .row .bottom {
    /*float: right; */
    /*min-height: 29px; */
    height: 30px;
    line-height: inherit;
    text-align: right;
    cursor: pointer;
    position: absolute;
    bottom: 0px;
    right: 20px;
    padding: initial;
}

#content .row .middle-bottom {
    float: left;
    width: 100%;
    min-height: 90px;
    margin: 0;
    padding: 0;
}

#content .row .number {
    line-height: 128px;

}


#content .row .middle .bottomHalf .user-legal-name {
    float: left;
    padding: 0 30px 0 42px;
}

.title {
    min-height: 25px;
    text-align: center;
}

.tax {
    color: var(--arena-orange);
    width: 100%;
    width: 200px;
    font-weight: 100;
}

#content .row .middle .bottomHalf .user-address,
#content .row .middle .bottomHalf .user-email,
#content .row .middle .bottomHalf .user-phone,
#content .row .middle .bottomHalf .user-password {
    float: left;
    padding: 0 30px 0 0;
}

.cellContent {
    float: left;
    /* display: inline-flex; */
    display: inline-block;
    padding: 0 15px 0 15px;
    min-height: 80px;
    vertical-align: bottom;
    text-align: left;
    /* flex-direction: column; */
}

.cellContent .eventAttached {
    font-size: 16px;
    font-weight: 600;
    cursor: pointer;
    color: var(--arena-orange);
    user-select: none;
}

.cellContent .eventAttached:hover {
    color: var(--arena-orange-hover);
}

.cell.clickable:hover {
    cursor: pointer;
    background: var(--surface);
}


.cellContent .clickable {
    cursor: pointer;
}

#content .row .middle-bottom .artist-commission,
#content .row .middle-bottom .artist-leader,
#content .row .middle-bottom .artist-location,
#content .row .middle-bottom .artist-phone,
#content .row .middle-bottom .artist-email,
#content .row .middle-bottom .artist-status {
    float: left;
    padding: 0 0px 0 0;
    min-height: 25px;
}

#content .row .middle-bottom .artist-commission,
#content .row .middle-bottom .artist-status {
    padding: 0 0px 0 42px;
}



#content .row .half-A {
    ;
}

#content .row .half-B {
    float: left;
    width: 200px;
}

#content .row .half-C {
    float: left;
    width: 200px;
}

#content .row .half-D {
    float: left;
    width: 140px;
}

#content .row .half-E {
    float: left;
    width: 100px;
}


#content .row .admin-logo {
    float: left;
    width: 100%;
    height: 80px;
    background: var(--surface);
}

.temp-venue {
    float: left;
    width: 380px;
    height: 80px;
    margin: 10px 0 10px 0;
    background: var(--surface);
}

.temp-venueB {
    float: left;
    width: 380px;
    height: 280px;
    margin: 10px 0 10px 0;
    background: var(--surface);
}


.messagePreviews {
    height: 4em;
    overflow: hidden;
}

.messagePreviews h5 {
    width: 250px;
    text-overflow: ellipsis;
    overflow: hidden;
}

.messagePreviews h5:hover {
    color: var(--arena-orange);
    cursor: pointer;
}

.messagePreview,
.message {
    width: 100%;
    white-space: initial;
    word-break: break-all;
    color: var(--secondary);
}

.messagePreview {
    /* height: 55px; */
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 400px;
}

.message {
    /* white-space: pre-wrap; */
}

.cellIcon,
.bottomIcon {
    /*    line-height:35px;*/
}

.bodyIcon {}

.cellIcon:before,
.bottomIcon:before,
.icon-logout:after,
.menuIcon:before {
    content: '';
    width: 35px;
    height: 28px;
    margin: 0px 0px 0 0px;
    background: url('../images/icon-sprites.png');
    display: inline-block;
    vertical-align: middle;
}

.cellIcon {
    float: left;
}

.menuIcon {
    float: left;
    margin: 20px 20px;
    font-size: 0.8em;
    text-align: center;
}

.menuIcon.right {
    float: right;
}

.bottomIcon {
    vertical-align: middle;
}

.cellIcon.hover:hover,
.bottomIcon.hover:hover,
.menuIcon:hover,
.hover:hover {
    color: var(--arena-orange);
    cursor: pointer;
}

/* #845 (Adam's note on !745, 2026-07-19 and 2026-07-29): the highlighted/
   orange icon glyph renders visibly shifted (and can clip) relative to its
   normal-state position. Two prior rounds each shipped a false
   generalization here -- round 9's "uniform 43px, apply everywhere", then
   this round's own first pass ("base -7px implies 36px, base -6px implies
   37px"), both caught by review. DO NOT infer a value from an icon's base
   offset or from "the sheet is roughly 2x43px" -- neither determines the
   correct hover-Y. icon-sprites.png's overall geometry is ~1118x86 (two
   ~43px-tall halves), but the actual vertical distance from an icon's gray
   glyph to its own orange glyph ("pitch") varies per icon and is NOT a
   sheet-wide constant: measured (PIL, alpha-channel, exact silhouette
   match scanned across all 85 candidate shifts, per icon) at 43px for
   most of the icons below, but 44px for `.menuIcon.icon-send` and
   `.bottomIcon.icon-more`/`.icon-less`. Several icons elsewhere in the
   sheet that don't use `.hover` at all -- icon-calendar, icon-logo,
   icon-tax, icon-user -- have NO exact match at any shift under this
   method, i.e. no orange counterpart the alpha channel can confirm; do
   not assume a "close enough" pitch for these from a looser metric (e.g.
   eyeballing where ink starts/ends in each half) -- it will not reproduce
   under an exact match, and this comment previously shipped invented
   42/45/47px values for exactly this reason before review caught it.
   Never assume a pitch for an icon that hasn't been individually
   measured with the exact method above.

   The correct hover-Y for any given icon is: 86 - (that icon's own base
   offset magnitude) - (that icon's own MEASURED pitch). Per icon actually
   under `.hover` today:
     .cellIcon.icon-edit, .cellIcon.icon-settings,
     .menuIcon.icon-preview/.icon-save/.icon-print/.icon-delete   base -7, pitch 43 -> 36
     .menuIcon.icon-send                                          base -6, pitch 44 -> 36 (same
                                                                    number as above by coincidence
                                                                    of arithmetic, NOT because base
                                                                    -6 implies 36 -- .icon-change
                                                                    below is also base -6 and needs 37)
     .bottomIcon.icon-change, .bottomIcon.icon-save                base -6, pitch 43 -> 37
     .bottomIcon.icon-cancel (JS-injected, contracts.js, live on
       /contracts -- easy to miss via a static-view-file grep)      base -7, pitch 43 -> 36
     .bottomIcon.icon-more, .bottomIcon.icon-less (defunct-module-
       only: taskMessage.php/eventCalendar.php)                     base -7, pitch 44 -> 35
     .icon-logout:after                                             base -6, pitch 43 -> 37, BUT
       DEAD: `.rail .acct .icon-logout:after { content: none; }`
       (line ~545, from #740's rail redesign) suppresses this
       pseudo-element at its only markup site -- kept mathematically
       correct rather than deleted (scope discipline), not reachable.

   The two rules below group by SELECTOR FAMILY for brevity, not by base
   offset -- each group mixes bases/pitches that happen to resolve to the
   same number. `.bottomIcon.icon-cancel` needs its own override because
   it's the one live case where family and the shared family value
   disagree (see override immediately below). `.bottomIcon.icon-close`
   would need the same override but has no `.hover` markup anywhere --
   dead, left alone. Adding a new icon to any of this: measure its own
   pitch via alpha-diff before assuming this group's value applies. */
.cellIcon.hover:hover:before,
.menuIcon.hover:hover:before {
    background-position-y: 36px;
}
.bottomIcon.hover:hover:before,
.icon-logout:hover:after {
    background-position-y: 37px;
}
/* .bottomIcon.icon-cancel is base -7px/pitch 43 (see table above), which
   resolves to 36px -- not the 37px the rest of .bottomIcon shares. Live on
   /contracts (contracts.js injects this markup on status-change). Higher
   specificity than the shared rule above (extra .icon-cancel class), so
   this wins regardless of source order. */
.bottomIcon.icon-cancel.hover:hover:before {
    background-position-y: 36px;
}

.icon-logout:after {
    width: 32px;
    height: 32px;
    margin: 18px 0px 4px 0;
    background-position: -305px -6px;
}

.icon-add {
    display: inline-block;
    /* float: left; */
    /* height: 30px; */
    /* font-size: 3em; */
    /* vertical-align: bottom; */
}

.cellIcon.icon-search:before {
    float: left;
    width: 32px;
    height: 32px;
    margin: 14px 0px 0 8px;
    background: var(--arena-orange);
}

.cellIcon.icon-user:before {
    background-position: -1075px -8px;
}

.cellIcon.icon-contract:before {
    background-position: -563px -52px;
}

.cellIcon.icon-artist:before {
    background-position: -129px -8px;
}

.cellIcon.icon-promoter:before {
    background-position: -221px -8px;
}

/* #528 — Align Email column glyph to the .fieldVal h1 line-box used by
 * adjacent value columns (Commission/Leader/Location/Phone, etc).
 *
 * Canonical reference: .fieldVal h1 renders at font-size 23px / line-height
 * 40px, vertical-centering its text in a 40px-tall box at the top of
 * .cellContent. The email icon was 54x50 with no vertical-centering, so it
 * rendered with its top edge at .fieldVal top but its 50px height descended
 * ~10px below the h1 line-box and skewed the row baseline. Constraining the
 * icon's effective box to 40px (matching h1 line-height) and centering it
 * via flex aligns the icon's visual center to the h1 text center. */
.bodyIcon.icon-email {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 40px;
}
.bodyIcon.icon-email:before {
    background: url('../images/email_big.png') no-repeat center;
    background-size: contain;
    content: '';
    width: 43px;
    height: 40px;
    display: block;
}

.bodyIcon.icon-blast:before {
    background: url('../images/email-b-icon-sprite.png') no-repeat 0px 0px;
    content: '';
    width: 54px;
    height: 50px;
    display: block;
}

.cellIcon.icon-write:before {
    float: left;
    width: 32px;
    height: 32px;
    margin: 4px 10px;
    background: var(--arena-orange);
}

.cellIcon.icon-logo:before {
    background-position: -559px -7px;
}

.cellIcon.icon-tax:before {
    background-position: -994px -7px;
}

.cellIcon.icon-edit:before {
    background-position: -350px -7px;
}

/* #794 — contract/artist edit affordance is now a <button>, not a bare <div>,
 * so it's keyboard-focusable and in the accessibility tree. Reset native
 * button chrome (border/background/padding/font) so it renders identically
 * to the old div; scoped to button.cellIcon.icon-edit specifically so it
 * doesn't affect any other <button> in the app (e.g. .adminConfigPage .button). */
button.cellIcon.icon-edit {
    border: 0;
    background: transparent;
    padding: 0;
    margin: 0;
    font: inherit;
    color: inherit;
    text-align: inherit;
    -webkit-appearance: none;
    appearance: none;
}

/* #794 fix round — Adam's ruling (MR !737 thread 0fee41bb, generalized on
 * !745): "These icon style buttons have no border by nature, the focus ring
 * is inappropriate... a focus ring is likely not the answer visually."
 * Suppress the browser's default :focus-visible outline on this icon-only
 * button specifically (NOT globally — real form buttons like
 * .adminConfigPage .button keep their rings), and instead reuse the exact
 * same orange sprite-swap the shared .hover convention already applies on
 * mouse hover (.cellIcon.hover:hover:before, above) so keyboard focus and
 * mouse hover produce the identical visual state. :focus-visible (not
 * :focus) so this only fires for keyboard/Tab navigation, not a mouse click
 * — matching the convention already used elsewhere in this file (the #846
 * checkbox fix). Interim accessibility tradeoff (pure color swap, no
 * shape/outline cue) tracked as a deliberate follow-up in #1126, per Adam's
 * "can be addressed in a follow-up" note. Value (36px) mirrors the shared
 * .cellIcon.hover:hover:before rule — see its comment for why this icon's
 * own -7px base offset needs 36px, not a universal 43px. */
button.cellIcon.icon-edit:focus-visible {
    outline: none;
}
button.cellIcon.icon-edit:focus-visible:before {
    background-position-y: 36px;
}

.cellIcon.icon-message:before {
    background-position: -993px -51px;
}

.cellIcon.icon-calendar:before {
    background-position: -606px -6px;
}

.cellIcon.icon-status:before {
    background-position: -603px -48px;
}

.cellIcon.icon-time:before {
    background-position: -648px -7px;
}

.cellIcon.icon-settings:before {
    background-position: -391px -7px;
}

/* #845 (Adam's note on !745, 2026-07-19 — "make the settings gear into a
   button, and then do a sweep for anything else that's similar"): the gear
   was an unlabeled, non-focusable <div> — converted to a real <button> in
   the view (contractSettings/taskSettings/userSettings/promoterSettings/
   venueSettings/artistSettings.php). Reset the UA default button chrome so
   it renders identically to the old <div> — every visual property
   (position/size/sprite/hover) above still applies unchanged since it's
   selected by class, not tag. The click handler (`.on("click", ".icon-
   settings", ...)` in each controller's JS) is a delegated, class-based
   binding — unaffected by the tag change, same as #845's close-x
   conversion. */
button.cellIcon.icon-settings {
    border: none;
    background: none;
    -webkit-appearance: none;
    appearance: none;
    padding: 0;
    margin: 0;
    font: inherit;
    cursor: pointer;
}

/* Same icon-button treatment as the close-x (thread 4a640513, generalized):
   no default focus ring on this bare icon button, keyboard focus gets the
   orange sprite-swap instead. This button has no .button-class sibling to
   worry about excluding, so no :not() scoping is needed here. Value (36px)
   mirrors the shared .cellIcon.hover:hover:before rule — see its comment
   for why this icon's own -7px base offset needs 36px, not 43px. */
button.cellIcon.icon-settings:focus,
button.cellIcon.icon-settings:focus-visible {
    outline: none;
}

button.cellIcon.icon-settings:focus-visible:before {
    background-position-y: 36px;
}

.cellIcon.icon-mail:before {
    background-position: -261px -7px;
}

.bottomIcon.icon-more:before,
.bottomIcon.icon-less:before {
    background-position: -1036px -7px;
    font-size: 0.6em;
}

.bottomIcon.icon-less:before {
    -webkit-transform: rotate(180deg);
}


.bottomIcon.icon-change:before,
.bottomIcon.icon-save:before {
    background-position: -434px -6px;
}

.bottomIcon.icon-close:before {
    background-position: -734px -7px;
}
.bottomIcon.icon-cancel:before {
    background-position: -734px -7px;
    /* The X glyph in the sprite is intrinsically bolder/thicker than the
       check-in-circle at -434px -6px (both use the same 35x28 viewport).
       Scale the pseudo-element so the cancel X reads at the same visual
       weight as the save check. */
    transform: scale(0.7);
    transform-origin: center center;
}

/* When the contract status .bottom contains both .icon-save and .icon-cancel
   side by side, lay them out horizontally instead of stacking vertically.
   .bottomIcon is a <div> (block by default) — without this, the cancel
   button drops to a new line below save. Scope to .contractStatus so other
   single-icon .bottom cells (provName, taskStatus, etc.) are unaffected. */
.bottom .bottomIcon.contractStatus {
    display: inline-block;
}
.bottom .bottomIcon.icon-cancel.contractStatus {
    margin-left: 8px;
}

.menuIcon:before {
    display: block;
    margin: 0 auto;
}

.menuIcon.icon-preview:before {
    background-position: -820px -7px;

}

.menuIcon.icon-save:before {
    background-position: -864px -7px;
}

.menuIcon.icon-send:before {
    background-position: -775px -6px;
}

.menuIcon.icon-print:before {
    background-position: -907px -7px;
}

.menuIcon.icon-delete:before {
    background-position: -951px -7px;
}

.menuIcon.icon-mail:before {
    background-position: -261px -7px;
}

.menuIcon.icon-arena-send:before {
    background: url('../images/arena-send-sprite.png') no-repeat 0px 0px;
    background-size: 35px 56px;
}
.menuIcon.hover:hover.icon-arena-send:before,
.menuIcon.icon-arena-send:hover:before {
    background-position: 0px -28px;
}

.reveal-modal-bg {
    position: fixed;
    height: 100%;
    width: 100%;
    z-index: 98;
    display: none;
    top: 0;
    left: 0;
    background: var(--backdrop);
}

.reveal-modal {
    visibility: hidden;
    display: none;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    z-index: 99;
    height: auto;
    width: 480px;
    border-radius: 4px 4px 4px 4px;
    -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
    top: 68px;
}

.reveal-modal.big {
    width: min(970px, calc(100vw - 40px));
}

.reveal-modal.extraBig {
    width: 100%;
    max-width: 1400px;
}

/* #366 Rider picker modal — use position:fixed so the modal always renders
   within the viewport regardless of page scroll position. Foundation reads
   the CSS top value at open time, so this also sets the animation target. */
#riderPicker {
    position: fixed;
    top: 120px;
}

#riderPicker .subheader {
    color: var(--text-muted);
    font-size: 0.9em;
    margin: 0 15px 4px 15px;
}

#riderPickerList {
    list-style: none;
    margin: 0 0 4px 0;
    padding: 0 15px;
    max-height: 280px;
    overflow-y: auto;
}

#riderPickerList li {
    padding: 6px 0;
    border-bottom: 1px solid var(--border);
    font-size: 0.9em;
    list-style: none;
}

#riderPickerList li:last-child {
    border-bottom: none;
}

/* Show native checkboxes in the rider picker list (global rule hides all checkboxes
   for the custom sprite pattern, but our list uses input-inside-label, not siblings).
   #846: the global rule now visually-hides via position:absolute+clip rather than
   display:none, so this override must also reset those or the native checkbox here
   would inherit the invisible-clip treatment despite its own width/height. */
#riderPickerList input[type="checkbox"] {
    display: inline-block;
    position: static;
    clip: auto;
    overflow: visible;
    width: 14px;
    height: 14px;
    margin: 0 6px 0 0;
    vertical-align: middle;
    cursor: pointer;
}

#riderPickerList li label {
    display: block;
    cursor: pointer;
    line-height: 1.4;
}

#riderPickerEmpty {
    color: var(--text-muted);
    font-size: 0.9em;
    padding: 8px 15px;
}

/* Button row: override form .row flex so Attach and Cancel sit side by side.
   The global input[type="button"] rule sets float:right — clear that for picker buttons. */
#riderPickerForm .riderPickerActions {
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: flex-end;
    gap: 12px;
    padding: 12px 15px 15px 15px;
    margin: 0;
}

#riderPickerForm .riderPickerActions input[type="button"] {
    float: none;
    height: auto;
    padding: 8px 16px;
    border-radius: 3px;
    left: auto;
    flex-basis: auto;
    position: static;
}

/* Cancel button: override .close-reveal-modal sprite styles so it renders as a normal button. */
#riderPickerForm .riderPickerCancel {
    position: static;
    width: auto;
    height: auto;
    background: var(--secondary) none;
    background-image: none;
    right: auto;
    top: auto;
    float: none;
    font-size: 0.875em;
    color: var(--surface);
    text-indent: 0;
    padding: 8px 16px;
    border-radius: 3px;
    cursor: pointer;
}

.popup {
    padding: 0 0 20px 0;
    border: solid 1px var(--border);
    background: var(--neutral-dark);
}

/* #555 Defensive: pin the Add Contract panel's opaque background on the id
   itself (specificity 1,0,0 beats .popup's 0,1,0) so it holds independent of
   the .popup-class cascade — guarantees the contracts list behind never bleeds
   through the rider/catalog-toggle row. */
#add-contract { background: var(--neutral-dark); }

#add-user {
    float: left;
}

.popup .full,
.popup .top {
    min-width: 0;
    max-width: 180%;
    padding: 10px 20px;
    border-bottom: 1px solid var(--border-dark);
    color: var(--arena-orange);
    font-size: 1.5em;
    line-height: 30px;
    text-align: left;
    font-weight: 300;
    text-shadow: 1px -1px 1px rgba(255, 255, 255, 1);
    vertical-align: text-bottom;
}

/* Adam's note (!745, thread 4a640513): the close-x sits too close to the
   upper edge on the issuing-contract modal specifically. Root-caused by
   measuring every modal's close button AND title element live: the close
   button's position is IDENTICAL (top offset 1px, height 43px) across every
   modal -- confirmIssueContractModal/confirmUnissueContractModal are the
   only two that use an <h2> title (from #102 Wave 3+4) instead of the <span>
   every other modal uses, and the global `h2 { font-size:14px; line-height:
   30px; display:inline-block; vertical-align:middle; }` reset (this file,
   ~line 382) overrides the 24px/orange styling this section intends,
   shrinking the title and shifting its vertical-align to middle instead of
   text-bottom/baseline. The undersized title makes the correctly-positioned,
   unchanged close button look disproportionately close to the top edge by
   comparison. Fix: make an h2 inside .popup .top inherit this section's
   intended typography instead of the generic global h2 reset, matching the
   span-based titles' rendering exactly (verified via live measurement:
   title top-offset went from 12.6px to 9px, matching the span-based
   modals). This is a title-rendering fix, not a close-button move -- the
   shared close-button rule below is correct and untouched. */
.popup .top h2 {
    display: inline;
    font-size: inherit;
    line-height: inherit;
    font-weight: inherit;
    color: inherit;
    text-shadow: inherit;
    vertical-align: baseline;
}

.close-reveal-modal, .close-dropdown {
    position: absolute;
    width: 43px;
    height: 43px;
    text-align: center;
    cursor: pointer;
    font-size: 1.5em;
    background: url('../images/icon-sprites.png');
    background-position: -731px 0px;
    right: 10px;
    top: 0px;
}

/* #845: the reveal-modal shell's close control is now a real <button> (was an
   unlabeled, non-focusable <div>) so keyboard/AT users can reach it. Reset the
   UA default button chrome (border/appearance) so it renders identically to
   the old <div> — every visual property (position/size/sprite) above still
   applies unchanged since it's selected by class, not tag. */
button.close-reveal-modal {
    border: none;
    -webkit-appearance: none;
    appearance: none;
    padding: 0;
    margin: 0;
    font: inherit;
}

/* #845 (Adam's thread on !745): the close-x has never had the orange hover
   treatment every other sprite icon gets — a pre-existing gap, not a
   regression from the div->button conversion above. Reuses the same
   sprite-offset convention as the shared `.hover:hover` rule (background
   sheet has a paired orange row exactly 43px below each icon's normal row —
   a full row-height offset, verified by cropping the sprite at this icon's
   x-offset before shipping; corrected from the shared rule's original 37px,
   see the note at that rule's definition above for the root-cause detail).
   Scoped to :not(.button) — the Cancel button in confirm modals also
   carries `.close-reveal-modal` (for Foundation's dismiss binding) but is a
   real bordered `.button.secondary`, not an icon, and must not pick up
   sprite-swap styling meant only for the bare icon-x. */
.close-reveal-modal:not(.button):hover {
    background-position-y: 43px;
}

/* Adam's ruling (thread 4a640513, 2026-07-19): "These icon style buttons
   have no border by nature, the focus ring is inappropriate. They're a
   different type of button visually and should be treated as such." Suppress
   the default focus ring on the icon-x specifically — NOT on .button-class
   close controls (Cancel), which are real bordered buttons and should keep
   theirs; see the :not(.button) scoping note above. Keyboard focus isn't left
   indicatorless: it gets the same orange sprite-swap as :hover, so there is
   still a visible, on-brand focus signal — just not a ring, per the ruling.
   Further accessibility treatment (if any) is a tracked follow-up, not this
   change.
   Also excludes :not(.riderPickerCancel) — code review (thread 2951c8ad)
   found riderPicker.php's Cancel is a THIRD category: a real, styled,
   labeled button (background/padding/border-radius all bespoke, explicit
   background-image: none) that nonetheless lacks the `.button` class marker
   the scoping above relies on. Without this exclusion it would lose its
   native focus ring to `outline: none` with no sprite to swap in as a
   replacement (background-image: none makes the swap a no-op) — a real
   WCAG 2.4.7 regression. Full enumeration of every `.close-reveal-modal`
   markup instance (27 across the codebase) confirms exactly three
   categories exist: bare sprite-icon buttons (this rule's actual target),
   `.button`-class Cancel controls (already excluded), and this one
   `.riderPickerCancel` control — everything else is a bare, non-focusable
   `<div>` belonging to defunct-module or dead-dropdown surfaces already
   out of scope for this MR (see the modal inventory above). */
.close-reveal-modal:not(.button):not(.riderPickerCancel):focus,
.close-reveal-modal:not(.button):not(.riderPickerCancel):focus-visible {
    outline: none;
}

.close-reveal-modal:not(.button):not(.riderPickerCancel):focus-visible {
    background-position-y: 43px;
}


.popup h3 {}

#.popup form {
    border-top: 1px solid var(--surface);
    display: inline-block;
}

.popup.big form {
    min-width: 480px;
}

/* #536 The form element itself has class `dropdownList scroll` (see the
   `<form class="dropdownList scroll">` markup in addArtist.php /
   addArtistContract.php), so the `.dropdownList { margin: 0 0 0 20px }` rule
   at line ~1962 applies to the form's own box. With `width: 100%` the
   form's content-box matched the modal's content width, and the 20px left
   margin then pushed the form's right edge 20px past the modal's right.
   The vertical scrollbar living at the form's inner right edge therefore
   rendered outside the white card. Subtracting the form's own left margin
   from its width pulls the right edge back inside the modal. flex-basis
   matches `width` to keep the two constraints in lock-step. */
.popup.extraBig form {
    width: calc(100% - 20px);
    flex-basis: calc(100% - 20px);
    flex-flow: row nowrap;
    justify-content: center;
}

/* #326 .field wraps each <label> + <input> pair inside .popup form .row.
   Default (≥720px): .field wrappers are `inline-block` so multiple fields
   sit side-by-side in a row. Inside each .field the label has `display:
   block` (via the ID-allowlist rule directly below) so it renders above
   its input. Phone tier override (further below) stacks .field vertically
   at full width so label-input pairs interleave correctly in DOM order.

   Label override uses the same ID-allowlist as the existing
   #addContract label rule (specificity 0,1,0,1) so it actually wins.

   #538: the Modify Artist Contract edit dropdown (.dropdownList.scroll
   #artistContractForm) lives outside .popup but uses the same .row > .field
   structure. Without inline-block, its .field children stack vertically and
   each input rides the legacy 198px width, leaving fields squashed into a
   ~230px left column. Selector below covers both contexts. */
.popup form .row .field,
.dropdownList.scroll .row .field {
    display: inline-block;
    vertical-align: top;
    margin: 0 15px;
}

#addArtist .field label,
#addContract .field label,
#addVenue .field label,
#addPromoter .field label,
.dropdownList.scroll .field label,
#artistContractForm .field label,
#vendorContractForm .field label {
    display: block;
    width: auto;
    flex: 0 1 auto;
    margin: 8px 0 4px 0;
    min-width: initial;
    max-width: initial;
}

/* NOTE: At desktop, inputs inside .field keep their existing inline-flex/
   inline-block behavior (defined by the global `input` rule + per-form
   width rules). This preserves side-by-side layout for multi-input .field
   wrappers like Contact Person (First Name + Last Name) and Address
   (Street + Apt). The full-width override fires only at phone tier — see
   the @media (max-width: 719px) block below. */

.popup form .row .field.half,
.dropdownList.scroll .row .field.half {
    width: 130px;
}

.popup form .row .field.large,
.dropdownList.scroll .row .field.large {
    width: 410px;
}

.popup form section {
    display: inline-block;
    width: min(480px, 100%);
    vertical-align: top;
    /* #948: sections themselves never scroll independently — the outer
       `.popup form` rule below owns the one scrollbar for the whole modal,
       for every popup regardless of section count. (Previously this was
       740px/auto and only got overridden for multi-section popups — see the
       history below.) */
    max-height: none;
    overflow-y: visible;
    box-sizing: border-box;
}

.popup.extraBig form section {
    width: 32%;
    min-width: min(480px, 100%);
    display: inline-flex;
    flex-direction: column;
    box-sizing: border-box;
}

/* #948 Outer-container scroll for EVERY popup, not just multi-section ones.
   Originally (#543) this rule was `.popup form:has(section + section)` —
   scoped to popups with 2+ <section> columns, because back then only those
   needed a fix for a per-column-scrollbar regression. That left every popup
   with ZERO <section> elements (Add/Edit Artist, Add Venue, Add Promoter —
   plain `.row`s directly in `<form>`, no wrapper) and every single-section
   popup completely unclamped: nothing capped their height to the viewport,
   so a modal taller than the screen just grew past the bottom edge with no
   scrollbar, leaving controls (Save/Cancel, trailing fields) unreachable —
   #948's "edit artist modal too long". Dropping the `:has(section +
   section)` condition makes every popup form get one bounded,
   viewport-relative scrollbar, matching "the previous modals had [overflow:
   scroll]" from the issue. The `.popup form section` rule above already
   disables per-section scrolling universally, so there is exactly one
   scrollbar per modal regardless of section count. (Add/Edit Contract's
   `#addContract` form carries its own `.dropdownList.scroll` sizing —
   `height: calc(100vh - 203px)` — which is tighter than this rule's
   `calc(100vh - 180px)`, so this rule is a no-op there; verified no
   regression.) */
.popup form {
    /* The modal is `position: absolute; top: 68px` with ~73px of header chrome
       above the <form>, so the form needs ~141px of headroom inside the viewport
       to avoid pushing the modal card past the viewport bottom (which would
       trigger a document-body scroll on top of the form's own scroll). 180px
       gives ~40px of safety for variance in modal chrome at different viewports. */
    max-height: calc(100vh - 180px);
    overflow-y: auto;
}

form .row {
    /* min-width: 430px; */
    padding: 20px 20px 0px 20px;
    display: flex;
    position: relative;
    /* flex: 0 1 430px; */
}

form .row:last-child input[type=button],
form .row:last-child input[type=submit] {
    left: calc(100% - 130px);
}

/* #597 — Right-align modal submit buttons via flexbox and neutralize the
   global `left: calc(100% - 130px)` push above for popup submit rows.
   `form .row` is `display: flex`, which makes the global `input[type=submit]
   { float: right }` rule inert on the button (floats don't apply to flex
   items), so the button's horizontal position is governed entirely by the
   `left:` offset. That offset was tuned for a ~120px button (Add Venue / Add
   Promoter, where `input.half` caps the width) — on Add Contract / Add Artist
   the submit inherits `flex: 0 1 260px` from the base `input` rule and renders
   ~260px wide, so `left: calc(100% - 130px)` pushed it ~124px past the modal's
   right edge (the overflow Adam reported on !414). Add Contract / Add Artist
   previously masked this with an inline `style="left:0"`, which #597 removed to
   make all four modals float right consistently — re-exposing the broken push.
   Fix: push the submit row's children to the flex end and zero the `left`
   offset, so the button sits cleanly at the row's right content edge (inside
   the 20px `.row` padding) regardless of its width, on all four modals and at
   every viewport (the `.row` stays `display: flex` at phone tier). */
.popup form .row:last-child {
    justify-content: flex-end;
}

.popup form .row:last-child input[type=button],
.popup form .row:last-child input[type=submit] {
    left: 0;
}

.popup form label {
    /* float: left; */
    max-width: 170px;
    min-width: 39.5%;
    min-height: 40px;
    font-size: 13px;
    line-height: 20px;
    display: inline-flex;
    flex: 0 0 170px;
}

.popup form label.popupCheck {
    display: block;
    font-size: initial;
    min-width: 95%;
    padding: 0 2.5%;
    border-radius: 5px;
}

.popup form label.popupCheck:hover {
    background: var(--surface);
}



#taskAttach.dropdown {
    min-width: 561px;
    position: absolute;
    left: 332px;
    top: 131px;
    z-index: 10;
}

#eventAttach.dropdown {
    width: 100%;
    /* position: absolute; */
    left: 0;
    top: 131px;
    z-index: 10;
}

#emailBlastPanel.dropdown {
    left: 332px;
    width: 900px;
}

.dropdownList input:not([type="checkbox"]),
 .dropdownList select {
    height: 28px;
    margin: 5px 15px 15px 15px;
}

.dropdownList input:not([type="checkbox"]):not([type="file"]),
 .dropdownList select {
    width: 198px;
    max-width: 100%;
 }

/* #534 — Promote border/radius/box-sizing off `.dropdownList` so popup-form inputs
   in addVenue / addPromoter (which don't carry the `.dropdownList` class on their
   <form> and have no JS to flip its `display: none` base state) get the same crisp
   1px border treatment as addContract / addArtist. Width/margin remain scoped to
   `.dropdownList` so Contract/Artist sizing is unchanged. */
.popup form input:not([type="checkbox"]):not([type="file"]):not([type="submit"]):not([type="button"]),
.popup form select,
.popup form textarea {
    border: 1px solid;
    border-radius: 3px;
    box-sizing: border-box;
}

/* #613 — Restore borders to edit forms rendered in `.dropdownList.scroll` (the
   "Modify Artist Contract" dropdown and defunct event-attach edit forms). These
   lost their borders when #534 moved the rule to `.popup form input` only.
   Note: the <form> IS the .dropdownList element (not a descendant), so
   `.dropdownList form input` never matches. The `.scroll` modifier is the correct
   discriminator: empty autocomplete placeholder forms (#taskArtistList) never
   carry `.scroll`; only real data-entry forms do. Exact property values match
   the `.popup form input` rule above so both surfaces look identical. */
.dropdownList.scroll input:not([type="checkbox"]):not([type="file"]):not([type="submit"]):not([type="button"]),
.dropdownList.scroll select,
.dropdownList.scroll textarea {
    border: 1px solid;
    border-radius: 3px;
    box-sizing: border-box;
}

/* #597 — Country selects inside popup modals carry class .half (to size
   them narrower than full-width). The global `select { min-width: 50% !important }`
   rule (line ~158) overrides the .half width constraint, making these selects
   render wider than intended. Previously worked around with an inline
   `style="min-width:unset!important;"` on the Add Artist country select.
   This scoped rule replaces that inline hack and covers all four modals
   consistently, including Add Venue and Add Promoter which were silently
   affected by the global rule but not visibly hacked. */
#addArtist select.half,
#addContract select.half,
#addVenue select.half,
#addPromoter select.half {
    min-width: 0 !important;
}


.dropdownList input.half {
    width: 98px;
    max-width: 100%;
    box-sizing: border-box;
}

.dropdownList textarea {
    border: 1px solid;
    border-radius: 3px;
    height: 98px;
    width: 418px;
    max-width: 100%;
    box-sizing: border-box;
    margin: 5px 15px 15px 15px;
    vertical-align: top;
}


.dropdownList input.blastTitle {
    border: solid;
    border-width: 0 0 1px 0;
    border-radius: 0;
    width: 100%;
    margin: 0;
    height: 39px;
    display: inline-block;
    line-height: 39px;
}

.dropdownList .blastContent {
    overflow: auto;
    border-width: 0 0 1px 0;
    border-radius: 0;
    padding: 10px;
    width: calc(100% - 22px);
    margin: 0;
    max-height: 440px;
    height: 380px;
}

.blastTitle:focus,
.blastContent:focus {
    outline-width: 0;
}

#blastMessageMenu {
    line-height: 30px;
    height: 20px;
    font-size: 0.8em;
    text-align: end;
}

span.blastHeader {
    margin: 0 110px 0 20px;
}

.dropdownList .listItem:nth-child(odd) {
    background: var(--neutral);
}

.dropdownList .listItem {
    height: 40px;
    line-height: 40px;
    padding: 0px 20px;
}

.dropdownList #blastList .listItem {
    line-height: 20px;
}


/* #534 — extend the per-modal label sizing rule to Add Venue + Add Promoter
   so their labels render at the same font-size / width / spacing as Add Contract
   + Add Artist (the dominant pattern across 5 modal IDs prior to this addition).
   Without these selector additions, Venue/Promoter labels fall through to
   `.popup form label` at line 1713 (font-size 13px, max-width 170px). */
#addArtist label,
#addContract label,
#addVenue label,
#addPromoter label,
.dropdownList.scroll label,
#artistContractForm label,
#vendorContractForm label {
    width: 200px;
    display: inline-flex;
    margin: 10px 15px 0 15px;
    flex: 0 1 260px;
    display: inline-block;
    min-width: initial;
    max-width: initial;
    font-size: initial;
    min-height: initial;
}

#addArtist label.half,
#addContract label.half,
#addVenue label.half,
#addPromoter label.half,
.dropdownList.scroll label.half,
#artistContractForm label.half {
    width: 102px;

}

#addArtist label.large,
#addContract label.large,
#addVenue label.large,
#addPromoter label.large,
.dropdownList.scroll label.large,
#artistContractForm label.large {
    width: 410px;
}

/* #534 Inline-checkbox modifier — for single-checkbox-with-label cases (Alcohol
   Licensed and Deposit Received in Add Contract, calendarNotifications in
   Add Artist) where the layout intent is "checkbox sits immediately to the
   right of its label". Overrides the ID-anchored `#addContract .field label
   { width: 200px }` rule above.

   margin-top: 10px matches the base `#addContract .field label` rule's top
   margin so the inline-checkbox label sits at the same vertical baseline as
   its sibling `.field`'s label (which is the alignment goal — when an
   inline-checkbox cell sits adjacent to a label-above-input cell on the same
   .row, their labels share a baseline).

   display: inline-block (not inline) is required for margin-top to take
   effect — inline elements ignore vertical margin. vertical-align: top
   keeps the label anchored to the cell's top edge rather than its baseline
   so the row reads predictably across mixed-content cells. */
#addContract .field.inline-checkbox label,
#addArtist .field.inline-checkbox label,
#addVenue .field.inline-checkbox label,
#artistContract .field.inline-checkbox label {
    width: auto;
    flex: 0 0 auto;
    display: inline-block;
    margin: 10px 0 0 6px;
    vertical-align: top;
}


/* #534 The real "checkbox" graphic is a pseudo-element on the label (see line
   ~2147 `input[type="checkbox"]+label:after`), and the base rule floats it
   right with 20px left margin — which is what pushes the visible checkbox
   far from the label text. Override for inline-checkbox: no float, sit inline
   right after the text with a small 6px gap. */
#addContract .field.inline-checkbox label:after,
#addArtist .field.inline-checkbox label:after,
#addVenue .field.inline-checkbox label:after,
#artistContract .field.inline-checkbox label:after {
    float: none;
    margin-top: 0;
    margin-left: 6px;
    vertical-align: middle;
}

    {
    margin-left: 10px;
    cursor: pointer;
}

.copyFileRiderUrl {
    margin-right: 10px;
}

.removeDate,
.removeTime,
.removeRider,
.removeContractRider,
.copyFileRiderUrl {
    margin: 5px;
    cursor: pointer;
}

.removeDate:hover,
.removeTime:hover,
.removeRider:hover,
.removeContractRider:hover,
.copyFileRiderUrl:hover {
    color: var(--arena-orange)
}

.datesField {
    margin: 5px 15px;
}

#date,
#dateNew {
    height: 0;
    border: 0;
    margin: 0;
}

#dateLabel,
#dateLabelNew {
    cursor: pointer;
}

#dateLabel:after,
#dateLabelNew:after {
    content: '';
    background: url("/assets/css/../images/icon-sprites.png") no-repeat -649px -10px;
    display: inline-block;
    width: 29px;
    height: 22px;
    margin-top: -4px;

    vertical-align: middle;
}

#dateLabel span,
#dateLabelNew span {
    position: absolute;
    left: 120px;
    color: var(--arena-orange);
}

#attachedList .listItem {
    height: 60px;
    line-height: 60px;
    padding: 0px 20px;
    border-bottom: solid 1px;
    cursor: pointer;
    overflow: hidden;
    text-overflow: ellipsis;
}

#attachedList .listItem:hover,
#attachedList .listItem.active {
    background: var(--secondary);
    color: var(--neutral) !important;
}

.dropdownTitleSmall {
    height: 39px;
    border-bottom: solid 1px;
    line-height: 40px;
    margin: 0px 20px 0px 20px;
    overflow: hidden;
}

.dropdownTitleBig {
    height: var(--h-dropdown-title);
    border-bottom: solid 1px;
    line-height: 40px;
    margin: 0px 20px 0px 20px;
    overflow: hidden;

    font-size: 2em;
    line-height: 90px;
}

.dropdownFilters {
    height: 40px;
    border-bottom: solid 1px;
    line-height: 40px;
    margin: 0px 20px 0px 20px;
}

.subFilters {
    margin: 0;
}

.filterItem {
    cursor: pointer;
    margin: 0px 20px;
    border-bottom: 0;
}

.filterItem:hover {
    color: var(--arena-orange);
}

#attachedList,
#blastList {
    float: left;
    height: calc(100% + var(--h-dropdown-title));
    border-right: solid 1px;
    margin-right: 20px;
}

#attachedList {
    width: 20%;
    min-height: 580px;
}

#blastList {
    width: 30%;
    min-height: 430px;
}

div.blastDate {
    font-size: 0.6em;
}

.dropdownList {
    display: none;
    position: relative;
    height: calc(100vh - (var(--h-whead) + var(--h-foot) + var(--h-dropdown-title) + 4px ) );
    overflow: hidden;
    vertical-align: top;
    margin: 0px 0px 0px 20px;
    /* overflow-y: auto; */
}

.dropdown {
    background: var(--surface);
    border: solid;
    border-width: 0px 1px 1px 1px;
    display: none;
    overflow: hidden;
    position: fixed;
    z-index: 1;
}

#addArtist .row:not(:last-child),
#addContract .row:not(:last-child),
.dropdownList.scroll .row:not(:last-child),
#artistContractForm .row,
#vendorContractForm .row {
    border: 0 !important;
    min-height: initial;
    height: auto;
    padding: 0;
    display: block;
    position: initial;
}

.contractMenu {
    margin-top: 20px;
    border-top: solid 1px;
    height: 80px;
    width: 100%;
    float: left;
    overflow: hidden;
}


.dropdownList.scroll {
    overflow-y: auto;
}

/* #1105 (structural fix round): #contractAuditInfo previously carried
   class="row contract-audit", which put it in the path of THREE
   unrelated .row-scoped rules it structurally isn't (#content .row,
   form .row, #artistContractForm .row) — the same collision class as
   #1111's #calendarWarningBanner, in this identical form. The first
   round tried to out-specificity just one of the three competitors
   (#artistContractForm .row.contract-audit); that only incidentally
   also beat #content .row and left the underlying mismatch in place.
   Fix: dropped `row` from the element's class list (artistContract.php)
   so none of the three rules match it at all — this plain selector now
   applies uncontested. Top-only clearance (padding-top) closes the
   #1105 divider collision with the minimum footprint; no bottom-side
   space is added since the collision was only ever above the text. */
.contract-audit {
    padding: var(--sp-sm) var(--sp-lg) 0;
    font-size: 11px;
    color: var(--text-muted);
}
.contract-audit span + span {
    margin-left: 15px;
}

/* Wave 4 (#102): banner shown atop the edit dropdown when status=ISSUED. */
.contract-issued-banner {
    background: #fef3c7;
    border-left: 4px solid var(--warning);
    padding: 12px 16px;
    margin: 5px 15px 10px 15px;
    border-radius: 3px;
    box-sizing: border-box;
    width: calc(100% - 30px);
    min-height: unset;
    height: auto;
}
.contract-issued-banner p {
    margin: 0;
    color: #78350f;
    font-size: 13px;
    line-height: 1.4;
}
.contract-issued-banner strong {
    color: #78350f;
}

/* Visual readonly state for ISSUED/SIGNED contracts in the edit dropdown.
   Disabled inputs already get browser default styling; this layer adds the
   muted-action affordance for non-form-control elements (links, dropzone,
   add-buttons) since `disabled` only applies to form controls. #1017: the
   SIGNED variant of this rule set was missing entirely, so #add-price-tier
   and #add-venue-btn-nested (plain <a> tags, unaffected by the JS `disabled`
   prop) stayed fully clickable and visually normal on a SIGNED contract even
   though applyIssuedReadOnlyGate's SIGNED counterpart already added the
   `contract-signed-readonly` class to the form (contracts.js).
   #1094: id renamed from "add-venue-btn" (a pre-existing duplicate DOM id
   shared with the header overflow-menu's Add Venue button) to
   "add-venue-btn-nested", scoped to this form so the rename doesn't change
   which element these rules target. */
#artistContractForm.contract-issued-readonly .contractField:disabled,
#artistContractForm.contract-issued-readonly .contractField[disabled],
#artistContractForm.contract-signed-readonly .contractField:disabled,
#artistContractForm.contract-signed-readonly .contractField[disabled] {
    background: var(--neutral);
    color: var(--secondary);
    cursor: not-allowed;
}
#artistContractForm.contract-issued-readonly .contractMenu .icon-delete,
#artistContractForm.contract-issued-readonly .contractMenu .emailLink,
#artistContractForm.contract-issued-readonly .add-from-artist-riders-btn,
#artistContractForm.contract-issued-readonly .removeTime,
#artistContractForm.contract-issued-readonly .removeDate,
#artistContractForm.contract-issued-readonly .rider-remove,
#artistContractForm.contract-issued-readonly #riderDropzone,
#artistContractForm.contract-issued-readonly #add-price-tier,
#artistContractForm.contract-issued-readonly #add-venue-btn-nested,
#artistContractForm.contract-issued-readonly .clause-remove,
#artistContractForm.contract-signed-readonly .contractMenu .icon-delete,
#artistContractForm.contract-signed-readonly .contractMenu .emailLink,
#artistContractForm.contract-signed-readonly .add-from-artist-riders-btn,
#artistContractForm.contract-signed-readonly .removeTime,
#artistContractForm.contract-signed-readonly .removeDate,
#artistContractForm.contract-signed-readonly .rider-remove,
#artistContractForm.contract-signed-readonly #riderDropzone,
#artistContractForm.contract-signed-readonly #add-price-tier,
#artistContractForm.contract-signed-readonly #add-venue-btn-nested,
#artistContractForm.contract-signed-readonly .clause-remove {
    /* #1150: .clause-remove (the per-clause × in the Edit dropdown's clause
       list) added alongside .rider-remove — same "plain <span>, not a form
       control" reason applyIssuedReadOnlyGate's blanket prop('disabled')
       doesn't reach it. #clausePickerSelect/.add-clause-btn ARE real
       select/button elements, so that blanket disable already covers them. */
    pointer-events: none;
    opacity: 0.4;
}
/* #1099: .sendViaArenaLink is muted on SIGNED only, deliberately NOT mirrored
   to .contract-issued-readonly above — resending via Arena on an ISSUED
   contract is a legitimate, server-permitted action (see contracts.js
   applySignedReadOnlyGate for the full explanation), so this control must
   stay visually active there. On SIGNED it is actively harmful: clicking it
   silently regresses the contract's status back to ISSUED (see contracts.js). */
#artistContractForm.contract-signed-readonly .contractMenu .sendViaArenaLink {
    pointer-events: none;
    opacity: 0.4;
}

.saveBtn,
.sendBtn {
    color: var(--arena-orange);
    cursor: pointer;
    margin: 0px 5px;
}

/* #846 — WCAG 2.1.1: `display: none` removes the checkbox from the
   accessibility tree entirely (not keyboard-focusable, not announced by a
   screen reader), even though the visible control is the `label:after`
   sprite below. Replace with the standard "visually hidden but focusable"
   technique: the real input stays in the layout and in the tab order, sized
   to 1px and clipped, so it is invisible on screen but reachable by Tab and
   operable with Space, while the sprite continues to be the only thing a
   sighted user sees (unchanged from before this rule). Two existing
   overrides intentionally show the RAW checkbox instead of the sprite
   (`#riderPickerList`, `.inline-rider-picker-list`) — they reset
   `position`/`clip`/`overflow` back to normal alongside their own
   `display: inline-block`, so they are unaffected. */
input[type="checkbox"] {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

input[type="checkbox"]+label {
    cursor: pointer;
}

input[type="checkbox"]+label:after {
    content: '';
    width: 20px;
    height: 20px;
    background: url(../images/check-radio-sprites.png);
    display: inline-block;
    vertical-align: middle;
    float: right;
    margin-top: 9px;
    margin-left: 20px;
}

#artistContractForm input[type="checkbox"]+label:after {
    margin-top: 0px;
}

input[type="checkbox"]:checked+label:after {
    background-position: -22px 0px;
}

/* #846 — the raw checkbox is visually hidden (see above), so its focus ring
   must render on the sprite instead; :focus-visible only shows the ring for
   keyboard focus (Tab), not a mouse click, matching the #657 modal-redesign
   focus recipe used elsewhere in this file. */
input[type="checkbox"]:focus-visible+label:after {
    outline: 2px solid var(--info);
    outline-offset: 1px;
    box-shadow: 0 0 0 2px var(--focus-ring);
}

@media (forced-colors: active) {
    input[type="checkbox"]:focus-visible+label:after {
        outline: 2px solid Highlight;
    }
}

/* #656 — "Extra" checkbox group: lay the checkbox+label pairs out in a clean
   responsive grid instead of the broken diagonal "staircase". The staircase came
   from `.field label { display:block }` stacking every pair-label while the sprite
   checkbox (`input[type="checkbox"]+label:after`) floats right with a 20px margin.
   Each option is now one grid cell; the label is inline and its sprite checkbox sits
   right after the text (mirrors the #534 .inline-checkbox pattern). The input
   id/name/data-filter/.contractField are unchanged, so the contracts.js bindings are
   unaffected. Scoped to the Add popup (#addContract) — the narrow modal where the staircase
   occurred. The Edit dropdown is wide enough that its original layout is fine, so it is left
   untouched. */
#addContract .checkbox-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    column-gap: 16px;
    row-gap: 2px;
    margin-top: 6px;
}
#addContract .checkbox-grid .extra-option {
    display: flex;
    align-items: center;
    min-width: 0;
}
/* The label fills its grid cell and right-aligns the sprite box to the cell's right edge
   (text left, box right), so the boxes form clean aligned columns in the narrow modal. */
#addContract .checkbox-grid .extra-option label {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex: 1 1 auto;
    width: auto;
    margin: 0;
    cursor: pointer;
}
/* Sprite checkbox sits inline immediately after its label text, not floated away. */
#addContract .checkbox-grid input[type="checkbox"]+label:after {
    float: none;
    margin: 0 0 0 6px;
    vertical-align: middle;
}


.floater textarea {
    width: 265px;
    font-size: 12px;
    padding: 5px 0px;
}

.floater.full textarea {
    background: var(--neutral);
    min-height: 170px;
}

.logo-upload {
    background: var(--surface);
    width: 300px;
    height: 60px;
    border-radius: 5px;
    line-height: 60px;
    text-align: center;
    font-size: 0.9em;
    cursor: pointer;
}


.logoPreview {
    height: 70px;
}

.logoWrapper {
    text-align: center;
}

/*
#add-user p   		{ float: left; line-height: 25px; }
#add-user a  		{ float: left; width: 280px; font-size: 17px; line-height: 31px;text-align: center; color: #333; font-style: italic; font-weight: 600; text-shadow: 1px -1px 1px rgba(255,255,255,1); }
*/

footer {
    /* #740 — footer is now a flex item at the bottom of .work, not absolute. */
    position: static;
    flex: 0 0 auto;
    width: 100%;
    height: auto;
    left: 0px;
}

footer .paging {
    position: relative;
    width: 100%;
    height: 50px;
    border-bottom: 1px solid var(--border-dark);
    background: var(--neutral-dark);
}

footer .paging ul {
    position: relative;
    width: 160px;
    margin: 0 auto;
}

footer .paging ul li {
    float: left;
    width: 20px;
}

footer .paging ul li a {
    float: left;
    width: 20px;
    font-size: 15px;
    /* line-height: 60px; */
    color: var(--tertiary);
    text-align: center;
    margin: 27px 0px;
}


footer .footer {
    position: relative;
    width: 100%;
    height: var(--h-foot);
    background: var(--neutral);
    border-top: 1px solid var(--surface);
}

footer .footer .arena {
    position: absolute;
    width: 322px;
    height: var(--h-foot);
    bottom: 0;
    left: 20px;
    background: url(../images/logo-arena.png) no-repeat center;
}

footer .footer .throw {
    position: absolute;
    width: 400px;
    height: var(--h-foot);
    bottom: 0;
    right: 20px;
}

footer .footer .throw a {
    float: left;
    width: 400px;
    font-size: 13px;
    color: var(--secondary-dark);
    height: var(--h-foot);
    text-align: right;
}




/* background: #ff0;
*/





/* The input. */
input.mp_input {}

/* Ordered list for display results. */
ol.mp_list {
    background-color: var(--surface);
    border-left: 1px solid;
    border-right: 1px solid;
    overflow: hidden;
    position: absolute;
    width: 200px;
    margin: -15px 15px 0 14px;
    z-index: 99999;
}

/* Each list item, regardless of success, error, etc. */
ol.mp_list li {
    border-bottom: 1px solid;
    padding: 4px 4px 5px;
}

/* Each list item from a successful request. */
ol.mp_list li.mp_item {}

/* Each list item that's selectable. */
ol.mp_list li.mp_selectable {
    cursor: pointer;
}

/* Currently highlighted list item. */
ol.mp_list li.mp_highlighted {
    background-color: var(--neutral-dark);
}

/* When a request is made that returns zero results. */
ol.mp_list li.mp_no_results {}

/* When a request is made that doesn't meet the 'minChars' length option. */
ol.mp_list li.mp_min_chars {}

/* When a request is made that fails during the ajax request. */
ol.mp_list li.mp_error {}

/* Google Calendar section in artist popup */
#create-calendar-btn,
#retry-rename-btn {
    background: var(--arena-orange);
    color: var(--neutral);
    height: 40px;
    cursor: pointer;
    border: none;
    border-radius: 4px;
    display: inline-block;
    margin: 5px 15px 15px 15px;
    padding: 0 12px;
    font-size: 13px;
}

#calendar-warning {
    color: var(--arena-orange);
    font-size: 13px;
    line-height: 20px;
    margin: 0 15px 0 15px;
    display: block;
}

/* #719 — status-as-text: flat white alert region, hairline amber border, amber
   text (no pastel fill), per arena-ams-design (flat, hairline borders for
   hierarchy; status colors as text). */
.calendar-warning-banner {
    background: var(--surface);
    border: 1px solid var(--warning-border);
    border-radius: 3px;
    padding: 10px 15px;
    margin: 5px 15px 10px 15px;
    display: flex;
    align-items: center;
    justify-content: space-between;
}

.calendar-warning-banner .calendar-warning-text {
    color: var(--warning-text);
    font-size: 13px;
    line-height: 18px;
    flex: 1;
}

.calendar-warning-banner .calendar-warning-dismiss {
    color: var(--warning-text);
    font-size: 18px;
    font-weight: bold;
    cursor: pointer;
    margin-left: 10px;
    line-height: 1;
}

.calendar-warning-banner .calendar-warning-dismiss:hover {
    color: var(--warning-text-dark);
}

/* #719 — status-as-text: amber warning text on white, no fill (per
   arena-ams-design: "Warnings are inline, compact, amber"; badges are colored
   text on white, not pills). --warning-text (#856404) on white = 5.0:1 (WCAG AA). */
.pdf-missing-badge {
    display: inline-block;
    background: transparent;
    color: var(--warning-text);
    padding: 2px 0;
    font-size: 11px;
    font-weight: 600;
    margin-top: 4px;
}

/* Token-only outlined pills (design review D4 / B-series): surface
   background, semantic-color text + border per state. */
.signing-status {
    display: inline-block;
    background: var(--surface);
    border-radius: var(--r-sm);
    padding: 2px var(--sp-sm);
    font-size: 11px;
    font-weight: 600;
    margin-top: var(--sp-xs);
}

.signing-status-pending {
    color: var(--secondary);
    border: 1px solid var(--border-dark);
}

.signing-status-sent,
.signing-status-viewed {
    color: var(--warning);
    border: 1px solid var(--warning);
}

.signing-status-signed {
    color: var(--success);
    border: 1px solid var(--success);
}

.signing-status-declined {
    color: var(--error);
    border: 1px solid var(--error);
}

/* G7: expired — brand-dark accent distinguishes it from active states (D5: no opacity, WCAG) */
.signing-status-expired {
    color: var(--arena-orange-dark);
    border: 1px solid var(--arena-orange-dark);
}

.signed-pdf-link {
    display: inline-block;
    background: var(--surface);
    color: var(--success);
    border: 1px solid var(--success);
    border-radius: var(--r-sm);
    padding: 2px var(--sp-sm);
    font-size: 11px;
    font-weight: 600;
    margin-top: var(--sp-xs);
    text-decoration: none;
}

.signed-pdf-link:hover {
    background: var(--neutral);
}

.signature-status-panel {
    background: var(--neutral);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    padding: var(--sp-md) var(--sp-lg);
    /* spacing gap: push panel away from any locked-status banner above it */
    margin-top: var(--sp-sm);
    margin-bottom: var(--sp-sm);
}

/* D6+B3: caption-tier title */
.signature-status-title {
    font-weight: 600;
    font-size: var(--fs-caption);
    color: var(--tertiary);
    margin-bottom: var(--sp-xs);
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

/* D3+B9: calm panel hierarchy — muted body text, tertiary emphasis.
   Explicit color so timestamps/metadata never inherit an accent color. */
.signature-status-details {
    font-size: var(--fs-body);
    color: var(--text-muted);
    line-height: 1.5;
    overflow-wrap: anywhere;
}

.signature-status-details strong {
    color: var(--tertiary);
}

/* D2: self-contained resend button — Foundation CSS is not loaded,
   so no .button/.secondary inheritance exists. */
.signature-resend-btn {
    display: inline-block;
    margin-top: var(--sp-sm);
    padding: var(--sp-xs) var(--sp-md);
    font-family: inherit;
    font-size: var(--fs-body);
    font-weight: 600;
    line-height: 1.4;
    color: var(--tertiary);
    background: var(--surface);
    border: 1px solid var(--border-dark);
    border-radius: var(--r-md);
    cursor: pointer;
}

.signature-resend-btn:hover {
    background: var(--neutral-dark);
}

.signature-resend-btn:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

/* Mirrors .contract-issued-banner's left-stripe pattern (keep the pair parallel) */
.contract-signed-banner {
    background: var(--neutral);
    border-left: 3px solid var(--success);
    border-radius: var(--r-sm);
    padding: var(--sp-md) var(--sp-lg);
    margin-top: var(--sp-sm);
    margin-bottom: var(--sp-sm);
    color: var(--tertiary);
}

.contract-signed-banner p {
    margin: 0;
}

#calendar-success {
    color: var(--secondary);
    font-size: 13px;
    line-height: 20px;
    margin: 0 15px 0 15px;
    display: block;
}

/* ── Admin Config Page (shared: driveConfig, ticketCounts) ────────────────────────────────── */

#content .adminConfigPage {
    padding: 20px 25px;
    min-height: auto;
    height: auto;
    border-bottom: none;
    float: none;
}

.adminConfigPage h2 {
    color: var(--secondary);
    font-size: 18px;
    font-weight: 600;
    margin: 0 0 6px 0;
}

.adminConfigPage h4 {
    color: var(--secondary);
    font-size: 13px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    margin: 0 0 10px 0;
}

.adminConfigPage .config-header {
    margin-bottom: 25px;
}

.adminConfigPage .config-header p {
    color: var(--secondary);
    font-size: 13px;
    margin: 0;
}

.adminConfigPage .config-status {
    background: var(--surface-inset);  /* #679 — inset panel; --surface blended with white page */
    border-radius: 5px;
    padding: 15px 20px;
    margin-bottom: 25px;
}

.adminConfigPage .status-badge {
    display: inline-block;
    margin-left: 0;            /* #719 - standalone block label; don't inherit the inline base's caption offset */
    padding: 3px 10px;
    border-radius: var(--r-sm);
    font-size: var(--fs-caption);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    margin-bottom: 8px;
}

/* #719 — status-as-text: colored text on white, no fill (per arena-ams-design).
   --success-text (#155724)/--warning-text (#856404) on white = 8.3:1/5.0:1 (AA). */
.adminConfigPage .status-active {
    background: transparent;
    color: var(--success-text);
}

.adminConfigPage .status-inactive {
    background: transparent;
    color: var(--warning-text);
}

.adminConfigPage .status-detail {
    display: block;
    font-size: 12px;
    color: var(--secondary);
}

.adminConfigPage .status-detail strong {
    color: var(--secondary-dark);
    font-family: monospace;
    font-size: 11px;
}

.adminConfigPage .config-form-section {
    margin-bottom: 20px;
}

.adminConfigPage .config-form-section label {
    color: var(--secondary);
    font-size: 13px;
    margin-bottom: 4px;
    display: block;
}

/* #326/!369 .field convention: each label+control pair gets a uniform
   on-scale (16px) gap so the admin form has consistent vertical rhythm,
   matching the public ticket-count card and the modal forms. */
.adminConfigPage .config-form-section .field {
    margin-bottom: 16px;
}

.adminConfigPage .config-form-section .field:last-child {
    margin-bottom: 0;
}

.adminConfigPage .config-form-section input[type="text"],
.adminConfigPage .config-form-section input[type="email"],
.adminConfigPage .config-form-section input[type="number"],
.adminConfigPage .config-form-section select,
.adminConfigPage .config-form-section textarea {
    width: 100%;
    max-width: 500px;
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    /* 13px (body) per the type scale — overrides the global input{font-size:15px}
       which is off-scale and larger than the 13px labels. */
    font-size: 13px;
    /* The global input{}/select{} rules set no font-family, so these controls
       fall through to the UA default (Arial). inherit pulls Open Sans from body. */
    font-family: inherit;
    /* slate per DESIGN.md (input/select textColor). Text inputs get this
       from the global input{} rule, but global select{} sets no color, so the
       preview-template <select> was falling through to UA black. */
    color: var(--secondary);
    box-sizing: border-box;
}

/* Selects use the 5px (rounded.lg) token per DESIGN.md; the global select
   rule already uses 5px — restore it here over the 4px input default. */
.adminConfigPage .config-form-section select {
    border-radius: 5px;
}

.adminConfigPage .config-form-section input:focus,
.adminConfigPage .config-form-section select:focus,
.adminConfigPage .config-form-section textarea:focus {
    outline: none;
    border-color: var(--focus-ring);
    box-shadow: 0 0 0 2px rgba(74, 144, 217, 0.2);
}

.adminConfigPage .config-form-section textarea {
    resize: vertical;
    min-height: 120px;
    max-height: none;
    font-family: inherit;
    font-size: 13px;
    line-height: 1.5;
    padding: 8px;
}

.adminConfigPage .config-help {
    color: var(--text-muted);
    font-size: 12px;
    margin: 4px 0 16px 0;
}

/* #109 ticket-count template editor: section sub-headings + placeholder
   legend + live preview pane. Reuses the .config-form-section rhythm above. */
.adminConfigPage .config-form-section h5 {
    color: var(--secondary);
    font-size: 12px;
    font-weight: 400;
    margin: 20px 0 8px 0;
}

.adminConfigPage .config-placeholder-legend {
    list-style: none;
    margin: 0 0 16px 0;
    padding: 12px;
    max-width: 500px;
    background: var(--neutral);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
}

.adminConfigPage .config-placeholder-legend li {
    font-size: 12px;
    color: var(--text-muted);
    margin: 0 0 4px 0;
    line-height: 1.5;
}

.adminConfigPage .config-placeholder-legend li:last-child {
    margin-bottom: 0;
}

/* Monospace is a deliberate code-sample exception so literal {{placeholder}}
   tokens read as code rather than prose (DESIGN.md Open-Sans-only otherwise). */
.adminConfigPage .config-placeholder-legend code {
    font-family: "Courier New", Courier, monospace;
    font-size: 12px;
    color: var(--text);
    background: var(--neutral-dark);
    padding: 1px 4px;
    border-radius: 3px;
}

.adminConfigPage .ticket-count-preview {
    max-width: 500px;
    margin: 8px 0 16px 0;
    padding: 12px;
    background: var(--neutral-dark);
    border-left: 3px solid var(--border-dark);
    border-radius: 0;
    cursor: default;
    user-select: text;
}

.adminConfigPage .ticket-count-preview .tcp-readonly-label {
    display: block;
    font-size: 11px;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-bottom: 8px;
}

.adminConfigPage .ticket-count-preview .tcp-subject {
    font-size: 12px;
    color: var(--text);
    margin-bottom: 8px;
    word-wrap: break-word;
}

.adminConfigPage .ticket-count-preview .tcp-body {
    font-family: inherit;
    font-size: 12px;
    color: var(--text);
    margin: 0;
    white-space: pre-wrap;
    word-wrap: break-word;
}

.adminConfigPage .config-actions {
    display: flex;
    align-items: center;
    gap: 16px;
}

.adminConfigPage .config-actions .button {
    margin: 0;
    float: none;
    /* global .button / input[type=submit] set no font-family → Arial; inherit = Open Sans */
    font-family: inherit;
}

/* Status messages (Save / Test-send) use the defined status tokens, set via
   JS toggling these classes rather than inline color literals. */
.adminConfigPage .config-status-message.is-success {
    color: var(--success);
}

.adminConfigPage .config-status-message.is-error {
    color: var(--error);
}

/* Red border on any ticket-count form field that fails server validation.
   Scoped to #ticketCountsForm so it can't bleed into the status-message
   .is-error rules above or the public ticketCountStatus.is-error rule. */
#ticketCountsForm input.is-error,
#ticketCountsForm textarea.is-error {
    border-color: var(--error);
}

/* Separate the "Preview & test send" section from the Save action above it.
   #ticketCountTestSection follows the </form> directly, so without this the
   section header sits flush (0px) against the Save button. 24px = top of the
   spacing scale, marking a distinct section break. */
.adminConfigPage #ticketCountTestSection {
    margin-top: 24px;
}

/* Test-send row: keep the "Send test email" button adjacent to its email
   input with an on-scale gap instead of letting the global
   input[type="button"]{float:right} push it to the page edge. */
.adminConfigPage .config-inline-row {
    display: flex;
    align-items: center;
    gap: 12px;
}

.adminConfigPage .config-inline-row input[type="email"] {
    flex: 1;
    max-width: 360px;
}

/* "Send test email" is the primary action of the Preview & Test Send section
   (it fires a real email), so it takes the Arena-Orange primary treatment
   matching the Save button: orange bg, white text, 40px, 4px radius,
   Open Sans, no border (all inherited from the global input[type="button"] +
   .button class). Here we only neutralize the global float:right so it stays
   inline beside the email input, and align the in-row sizing. */
.adminConfigPage .config-inline-row .button {
    margin: 0;
    float: none;
    flex: none;
    height: 40px;
    font-family: inherit; /* else global input[type="button"] falls to UA Arial */
    padding: 0 16px;
}

.adminConfigPage #driveConfigStatus {
    font-size: 13px;
    font-weight: 500;
}

.adminConfigPage .verify-result {
    padding: 12px 15px;
    border-radius: 4px;
    font-size: 13px;
    line-height: 1.5;
    max-width: 700px;
}

/* #719 — status-as-text: colored text on white, no fill/box (per
   arena-ams-design). --error-text (#721c24) on white = 9.0:1 (AA). */
.adminConfigPage .verify-success {
    background: transparent;
    color: var(--success-text);
    border: none;
}

.adminConfigPage .verify-error {
    background: transparent;
    color: var(--error-text);
    border: none;
}

.adminConfigPage .drive-action-row {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 4px;
}

.adminConfigPage .drive-action-row input[type="text"] {
    flex: 1;
    max-width: 400px;
    margin: 0;
}

.adminConfigPage .drive-action-row .button {
    margin: 0;
    white-space: nowrap;
}

.adminConfigPage .config-divider {
    text-align: center;
    margin: 18px 0;
    position: relative;
    max-width: 500px;
}

.adminConfigPage .dwd-preflight-row {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 8px;
    flex-wrap: wrap;
}

.adminConfigPage .dwd-instructions {
    margin-top: 14px;
    padding: 16px 18px;
    background: #fff8e1;
    border: 1px solid #f0d090;
    border-left: 4px solid #e0a020;
    border-radius: 4px;
    max-width: 700px;
    font-size: 13px;
    line-height: 1.55;
}

.adminConfigPage .dwd-instructions h5 {
    margin: 0 0 8px 0;
    font-size: 14px;
    color: #6d4c00;
}

.adminConfigPage .dwd-instructions ol {
    margin: 8px 0 8px 22px;
    padding: 0;
    list-style: decimal outside;
}

.adminConfigPage .dwd-instructions li {
    margin-bottom: 6px;
}

.adminConfigPage .dwd-instructions code {
    display: inline-block;
    padding: 2px 6px;
    background: var(--surface);
    border: 1px solid #d6c89a;
    border-radius: 3px;
    font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
    font-size: 12px;
    word-break: break-all;
    max-width: 100%;
}

.adminConfigPage .copy-btn,
.adminConfigPage .button.tiny {
    padding: 2px 10px;
    font-size: 11px;
    line-height: 1.4;
    margin: 0 0 0 4px;
    vertical-align: middle;
    /* #1023: the legacy global `input{width:260px;flex:0 1 260px}` rule (line ~97)
       forces every <input> — including <input type="button">/[type=submit] — to a
       fixed 260px, and .tiny's own rule only ever touched padding/font-size. That
       left "tiny" buttons (Enable All / Disable All) rendering full legacy width
       with cramped small text — visually disconnected from the filter/table rows
       around them. Size to content instead. */
    width: auto;
    flex: 0 0 auto;
}

/* #1022 follow-up (sfh review): reset height for actual <button> tags using
   .tiny — the new global .button base (see line ~549) sets height:var(--h-control)
   (40px), which the padding-only rule above doesn't reset, forcing driveConfig's
   copy-btn <button> elements from their previous auto-height (~24px) up to 40px.
   Scoped to the `button` tag specifically: `.button.tiny` also appears on <input>
   elements (#svaSelectAll/#svaDeselectAll in emailSettings.php) that were ALREADY
   40px tall via the pre-existing input[type="button"] rule and must stay that way. */
.adminConfigPage button.copy-btn,
.adminConfigPage button.button.tiny {
    height: auto;
}

.adminConfigPage .config-divider::before {
    content: '';
    position: absolute;
    top: 50%;
    left: 0;
    right: 0;
    height: 1px;
    background: var(--border);
}

.adminConfigPage .config-divider span {
    background: var(--surface);
    padding: 0 12px;
    position: relative;
    color: var(--secondary);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

.adminConfigPage .drive-info {
    background: var(--neutral);
    border: 1px solid var(--border);
    border-radius: 5px;
    padding: 12px 16px;
    margin-bottom: 10px;
    max-width: 500px;
}

.adminConfigPage .drive-name {
    display: block;
    font-size: 14px;
    font-weight: 600;
    color: var(--text);
    margin-bottom: 2px;
}

.adminConfigPage .drive-name-error {
    color: var(--error-text-alt);
}

.adminConfigPage .drive-id {
    display: block;
    font-size: 11px;
    font-family: monospace;
    color: var(--secondary);
}

.adminConfigPage .drive-name-detail {
    font-size: 12px;
    color: var(--secondary-dark);
}

.adminConfigPage .config-warning {
    color: var(--error-text-alt);
    font-size: 11px;
    margin: 6px 0 0 0;
}

.adminConfigPage .button.alert {
    background: var(--error);
    color: var(--surface);
    border: none;
}

.adminConfigPage .button.alert:hover {
    background: #a93226;
}

/* Send-via-Arena bulk toggle table (#552) */
/* Global `input[type="button"]` rule (line 133) sets float:right —
   clear that here so bulk-action buttons sit left above the table. */
.adminConfigPage .send-via-arena-controls {
    margin-bottom: 12px;
    overflow: hidden; /* clearfix for floated child buttons */
}

.adminConfigPage .send-via-arena-controls .button {
    float: left;
    margin-right: 8px;
}

/* Section separator — Email Defaults → Send via Arena (#552 v5) */
.adminConfigPage .email-settings-user-section {
    margin-top: 32px;
    border-top: 1px solid var(--border);
    padding-top: 24px;
}

.adminConfigPage .send-via-arena-table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 8px;
    /* #601 — separate the save row below from the table, matching the 20px
       gap .config-form-section gives Section 1's save button */
    margin-bottom: 20px;
}

.adminConfigPage .send-via-arena-table th,
.adminConfigPage .send-via-arena-table td {
    text-align: left;
    padding: 8px 12px;
    border-bottom: 1px solid var(--border);
    vertical-align: middle;
    /* #726: td had no font-size rule at all, so Name/Email rows fell through
       to the browser default (16px) — visibly larger than the th (0.85em of
       that base, ~13.6px) and the rest of the page's --fs-body (13px) scale. */
    font-size: var(--fs-body);
}

.adminConfigPage .send-via-arena-table th {
    background: var(--neutral);
    font-weight: 600;
    font-size: 0.85em;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--secondary-dark);
}

.adminConfigPage .send-via-arena-table tbody tr:hover {
    background: var(--neutral);
}

.adminConfigPage .send-via-arena-table .sva-toggle-col {
    width: 140px;
    text-align: center;
}

/* Sort + filter — Send-via-Arena table (#601) */

/* Sortable column headers */
.adminConfigPage .send-via-arena-table th.sva-sortable {
    cursor: pointer;
    user-select: none;
    white-space: nowrap;
}

.adminConfigPage .send-via-arena-table th.sva-sortable:hover {
    background: var(--neutral-dark);
}

.adminConfigPage .send-via-arena-table th.sva-sortable:focus {
    outline: 2px solid var(--info);
    outline-offset: -2px;
}

/* Sort direction triangles — rendered purely in CSS */
.sva-sort-indicator {
    display: inline-block;
    width: 0;
    height: 0;
    margin-left: 5px;
    vertical-align: middle;
    opacity: 0.3;
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
    border-bottom: 5px solid var(--secondary-dark);
}

.sva-sort-indicator.sva-sort-asc {
    opacity: 1;
    border-bottom: 5px solid var(--secondary-dark);
    border-top: none;
}

.sva-sort-indicator.sva-sort-desc {
    opacity: 1;
    border-top: 5px solid var(--secondary-dark);
    border-bottom: none;
}

/* Filter row — sits between bulk buttons header and the table */
.sva-filter-row {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 10px;
    flex-wrap: wrap;
}

/* #1022 (Adam review, finding 2 — corrected): the filter row's own
   micro-system (input/select/clear) used a bespoke 30px height, 3px radius,
   and em-based font-size instead of the shared control tokens — .sva-filter-
   clear in particular had no font-weight/font-family and read as unstyled
   next to the rest of the app's 40px controls. Brought the whole row onto
   --h-control/--r-md so it doesn't read as internally-consistent-but-out-
   of-step-with-everything-else; .sva-filter-clear specifically now matches
   .button.secondary's tokens (border-dark, --fs-button, weight 600). */
.sva-filter-input {
    flex: 1 1 180px;
    min-width: 120px;
    max-width: 280px;
    height: var(--h-control);
    padding: 0 8px;
    font-size: var(--fs-button);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    box-sizing: border-box;
}

.sva-filter-input:focus {
    outline: none;
    border-color: var(--info);
    box-shadow: 0 0 0 2px rgba(74, 144, 217, 0.2);
}

.sva-filter-select {
    height: var(--h-control);
    padding: 0 6px;
    font-size: var(--fs-button);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    background: var(--surface);
    cursor: pointer;
}

/* #726 (code-review FLAG, id-scoped over the class-scoped triple-!important
   form): the legacy global `select { min-width: 50% !important; width: 260px; }`
   rule (line ~158) inflated this "type" filter to ~560px for content that's
   only ever 1-2 short words ("admin") — the DB-level `users.type` enum only
   ever has 2 values, so a longer option can never occur in production.
   Escape the SAME way #597 already does for .half selects, but scoped to the
   element's own id rather than the .sva-filter-select class — not a
   narrowing of the global rule, which the Add/Edit User modal's .userVal
   country/type selects (fuel/application/views/_blocks/popups/addPeople.php,
   tracked separately at #1118) still rely on unmodified with no override of
   their own.
   Only min-width needs !important. #svaFilterType is also nested inside a
   .config-form-section, whose own `select { width:100%; max-width:500px }`
   rule (line ~2770) has higher specificity than the bare .sva-filter-select
   CLASS (2 classes+tag beats 1 class) and would otherwise still win on
   width/max-width — but an id selector's specificity outranks any number of
   classes/elements for a non-!important declaration, so #svaFilterType wins
   there without needing !important. min-width is different: the global
   rule's OWN min-width is already !important, and no non-!important
   declaration at any specificity can override an !important one — so that
   property alone needs the matching escape. */
#svaFilterType {
    min-width: 0 !important;
    width: auto;
    max-width: 180px;
    /* Adam review (thread 4158ba52): no room between the option text and the
       native chevron. Bumping padding-right only (left stays the class's 6px)
       reuses the same --sp-lg (16px) token .sva-filter-clear already carries
       right next to this element, rather than inventing a new value — the id
       already outranks .config-form-section select's specificity so no
       !important is needed here either. */
    padding-right: var(--sp-lg);
}

.sva-filter-select:focus {
    outline: none;
    border-color: var(--info);
}

.sva-filter-clear {
    height: var(--h-control);
    padding: 0 var(--sp-lg, 16px);
    font-size: var(--fs-button);
    font-weight: 600;
    font-family: inherit;
    color: var(--secondary-dark);
    background: var(--surface);
    border: 1px solid var(--border-dark);
    border-radius: var(--r-md);
    cursor: pointer;
    white-space: nowrap;
}

.sva-filter-clear:hover {
    background: var(--neutral);
    color: var(--text);
}

/* Live count label — "Showing N of M" */
.sva-filter-count {
    font-size: 0.8em;
    color: var(--text-muted);
    white-space: nowrap;
}

/* Bulk-scope hint — "(applies to N shown)" next to Enable/Disable All buttons */
.sva-bulk-scope {
    font-size: 0.8em;
    color: var(--text-muted);
    margin-left: 4px;
    white-space: nowrap;
}

/* Hidden (filtered-out) rows — keep in DOM for snapshot stability (#600) */
.adminConfigPage .send-via-arena-table tbody tr.sva-filtered-out {
    display: none;
}

/* Hidden (paginated-out) rows — keep in DOM so snapshot + bulk remain stable (#617).
   Bulk Enable/Disable excludes .sva-filtered-out but NOT .sva-paginated-out, so
   it acts across the entire filtered set across all pages. */
.adminConfigPage .send-via-arena-table tbody tr.sva-paginated-out {
    display: none;
}

/* Pagination controls (#617) */
.sva-pager {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 8px;
    font-size: 0.875em;
}

.sva-pager-btn {
    height: 28px;
    padding: 0 10px;
    font-size: 0.875em;
    color: #666;
    background: none;
    border: 1px solid #c8d0d5;
    border-radius: 3px;
    cursor: pointer;
    white-space: nowrap;
}

.sva-pager-btn:hover:not(:disabled) {
    background: #f2f4f5;
    border-color: #c8d0d5;
    color: #333;
}

.sva-pager-btn:disabled {
    color: #aaa;
    cursor: default;
    border-color: #e0e5e8;
}

.sva-page-info {
    color: #666;
    white-space: nowrap;
}

/* Empty-match state row */
.adminConfigPage .send-via-arena-table td.sva-no-results {
    text-align: center;
    padding: 16px;
    color: var(--text-muted);
    font-style: italic;
    border-bottom: none;
}

/* ===========================================================================
   #727 — Email Settings consolidated page: multi-column field layout.
   Adam's review (!506): "Fields should be at least two in a row ... fields are
   too long ... look at the add and edit modals." The modal .field/.half rules
   are ID-scoped to the popups (#addContract etc.), so they do NOT cascade to
   the admin #emailSettingsPage. These admin-scoped equivalents reproduce the
   modal's side-by-side .field behaviour and constrained input widths.

   .config-field-row = a flex row that lays its .field children side-by-side
   (≥720px) and wraps as needed; stacks to one column at phone tier.
   =========================================================================== */
.adminConfigPage .config-field-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0 24px;
    align-items: flex-start;
}

/* Each .field inside a row no longer needs its own bottom margin to separate
   from a sibling on the same row — the row gap handles horizontal spacing and
   the row itself carries the block rhythm. Keep a small bottom margin so
   wrapped rows (e.g. the 4 timing fields wrapping to 2×2) stay legible. */
.adminConfigPage .config-form-section .config-field-row .field {
    margin-bottom: 16px;
}

/* Width modifiers — these must beat the base
   `.adminConfigPage .config-form-section input{width:100%;max-width:500px}`
   rule (specificity 0,0,3,1), so each input rule below is scoped under
   #emailSettingsPage (0,1,3,x) to win the cascade. The .field wrapper sets the
   column width; the input fills its wrapper. */

/* .short — small numeric fields (Timing Defaults). The input only needs room
   for a 1–3 digit number; the label wraps above it. ~150px column keeps the
   four fields multiple-per-row with narrow inputs (Adam: "make the inputs
   NARROW … match the short-input sizing used in the modals"). */
#emailSettingsPage .config-form-section .field.short {
    flex: 0 0 auto;
    width: 200px;
}
#emailSettingsPage .config-form-section .field.short input[type="number"] {
    width: 110px;
    max-width: 110px;
}

/* .medium — Contact Name | Contact Email side-by-side, each constrained so
   the pair sits 2-up rather than one full-width input per row. */
#emailSettingsPage .config-form-section .field.medium {
    flex: 1 1 260px;
    min-width: 0;
    max-width: 320px;
}
#emailSettingsPage .config-form-section .field.medium input {
    width: 100%;
    max-width: 320px;
}

/* .large — subject + body for the Send-via-Arena Email Defaults: wide enough
   to be usable but not edge-to-edge across the page. */
#emailSettingsPage .config-form-section .field.large {
    max-width: 560px;
}
#emailSettingsPage .config-form-section .field.large input,
#emailSettingsPage .config-form-section .field.large textarea {
    width: 100%;
    max-width: 560px;
}

/* Ticket-count Email Templates: two template blocks (Initial / Follow-up)
   sit side-by-side as columns, each holding its Subject + Body stacked. The
   body textareas are sized like the modal textareas (column width), not the
   full page. */
.adminConfigPage .config-template-row {
    gap: 0 32px;
}
.adminConfigPage .config-template-block {
    flex: 1 1 360px;
    min-width: 0;
    max-width: 480px;
}
.adminConfigPage .config-template-block h5 {
    margin-top: 0;
}
#emailSettingsPage .config-template-block .field {
    margin-bottom: 16px;
}
#emailSettingsPage .config-template-block input[type="text"],
#emailSettingsPage .config-template-block textarea {
    width: 100%;
    max-width: 100%;
}

/* Phone tier — collapse every row to a single full-width column so label/input
   pairs interleave in DOM order, mirroring the modal `@media (max-width:719px)`
   behaviour. Input width caps are lifted so controls fill the narrow screen. */
@media (max-width: 719px) {
    .adminConfigPage .config-field-row {
        display: block;
    }
    #emailSettingsPage .config-form-section .field.short,
    #emailSettingsPage .config-form-section .field.medium,
    #emailSettingsPage .config-form-section .field.large,
    .adminConfigPage .config-template-block {
        width: 100%;
        max-width: 100%;
    }
    #emailSettingsPage .config-form-section .field.short input[type="number"],
    #emailSettingsPage .config-form-section .field.medium input,
    #emailSettingsPage .config-form-section .field.large input,
    #emailSettingsPage .config-form-section .field.large textarea {
        width: 100%;
        max-width: 100%;
    }
}

/* ===========================================================================
   #1150 — Contract Templates page (/admin/logos). .adminConfigPage rhythm:
   Template name inline-edit, logo Dropzone, and the Additional Clauses
   library list + add form. No existing add/delete row-list widget existed
   in this system to reuse, so these are new — token-driven, following the
   same spacing/border language as .drive-info / .config-placeholder-legend.
   =========================================================================== */
.adminConfigPage .template-name-display {
    display: flex;
    align-items: center;
    gap: 10px;
}
.adminConfigPage .template-name-text {
    font-size: 14px;
    font-weight: 600;
    color: var(--text);
}
.adminConfigPage .template-name-edit-btn,
.adminConfigPage .template-name-save-btn,
.adminConfigPage .template-name-cancel-btn {
    font-size: 12px;
    color: var(--arena-orange);
    cursor: pointer;
    text-decoration: none;
}
.adminConfigPage .template-name-edit-btn:hover,
.adminConfigPage .template-name-save-btn:hover,
.adminConfigPage .template-name-cancel-btn:hover {
    text-decoration: underline;
}
.adminConfigPage .template-name-cancel-btn {
    color: var(--secondary);
}
.adminConfigPage .template-name-input {
    max-width: 280px;
}

.adminConfigPage .template-logo-wrapper {
    display: flex;
    align-items: center;
    gap: 16px;
    flex-wrap: wrap;
}
.adminConfigPage .template-logo-preview {
    max-width: 170px;
    max-height: 72px;
    height: auto;
    width: auto;
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    background: var(--surface);
    padding: 6px 10px;
}
.adminConfigPage .template-logo-dropzone {
    flex: 1 1 260px;
    max-width: 400px;
    min-height: 60px;
    border: 2px dashed var(--border);
    border-radius: 4px;
    padding: 12px;
    text-align: center;
    background: var(--surface-inset);
    font-size: 12px;
    line-height: 1.4;
    cursor: pointer;
}
.adminConfigPage .template-logo-dropzone.dz-drag-hover {
    border-color: #3b82f6;
    background: #eff6ff;
}

.adminConfigPage .clause-library-list {
    list-style: none;
    margin: 0 0 20px 0;
    padding: 0;
    max-width: 700px;
}
/* #1150 UI tweak (Adam): the × must sit at the TOP-RIGHT of the card at
   EVERY width. The original flex row (space-between + flex-start) only
   achieved that on a single row; the phone-tier flex-direction:column
   override needed to stack the two children vertically instead put the ×
   BELOW the text, flush left — visibly "drifting to bottom-left" at 480px.
   position:absolute pins it to the same corner regardless of the text
   block's own layout mode, so no width-specific override is needed at all. */
.adminConfigPage .clause-library-item {
    position: relative;
    padding: 12px 40px 12px 16px;
    margin-bottom: 8px;
    background: var(--neutral);
    border: 1px solid var(--border);
    border-radius: 5px;
}
.adminConfigPage .clause-library-item-text {
    min-width: 0;
}
.adminConfigPage .clause-library-item-name {
    display: block;
    font-size: 13px;
    color: var(--text);
    margin-bottom: 4px;
}
.adminConfigPage .clause-library-item-body {
    margin: 0;
    font-size: 12px;
    color: var(--secondary);
    white-space: pre-wrap;
    word-wrap: break-word;
}
.adminConfigPage .clause-library-remove {
    position: absolute;
    top: 10px;
    right: 12px;
    color: #ef4444;
    cursor: pointer;
    font-size: 16px;
    line-height: 1;
    padding: 2px 4px;
    transition: color 0.2s ease;
}
.adminConfigPage .clause-library-remove:hover {
    color: #b91c1c;
}
.adminConfigPage .clause-library-empty {
    padding: 12px 16px;
    color: var(--text-muted);
    font-size: 13px;
    font-style: italic;
}
.adminConfigPage .clause-library-load-error {
    padding: 12px 16px;
    color: var(--error-text-alt, #a93226);
    font-size: 13px;
    background: var(--neutral);
    border: 1px solid var(--border);
    border-radius: 5px;
}

@media (max-width: 719px) {
    .adminConfigPage .template-logo-dropzone {
        max-width: 100%;
        flex: 1 1 100%;
    }
}

.autofill-toast {
    position: fixed;
    bottom: 20px;
    left: 50%;
    transform: translateX(-50%) translateY(20px);
    background: #2c3e50;
    color: var(--surface);
    padding: 10px 20px;
    border-radius: 4px;
    font-size: 13px;
    max-width: 480px;
    text-align: center;
    z-index: 9999;
    opacity: 0;
    transition: opacity 0.3s ease, transform 0.3s ease;
    pointer-events: none;
}
.autofill-toast.autofill-toast-show {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}

/* #504 Send-via-Arena status toast.
 * Same feedback voice as the autofill toast — the app's established dark-slate
 * pill — positioned top-centre (below the fixed header) so it's immediately
 * visible after the Issue-contract modal closes.  Base is var(--tertiary)
 * deep slate (the autofill toast's legacy #2c3e50 is off-palette; new CSS
 * uses the token).  The -success modifier keeps the slate surface and adds a
 * lime checkmark accent: --success is the signed/complete *status* colour and
 * stays an accent here, never a surface fill (Adam review A1, MR !465).
 * No box-shadow — the design system reserves the single shadow for modals.
 * Transition slides DOWN from above (-10px → 0), inverted from the autofill
 * family's slide-up, matching the top-of-screen entry point. */
.send-status-toast {
    position: fixed;
    top: calc(var(--h-header) + var(--sp-md));
    left: 50%;
    transform: translateX(-50%) translateY(-10px);
    background: var(--tertiary);
    color: var(--surface);
    padding: var(--sp-md) var(--sp-xl);
    border-radius: var(--r-md);
    font-size: var(--fs-body);
    max-width: 480px; /* match the .autofill-toast family cap */
    text-align: center;
    z-index: 10000;
    opacity: 0;
    transition: opacity 0.3s ease, transform 0.3s ease;
    pointer-events: none;
}
.send-status-toast.send-status-toast-show {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}
.send-status-toast.send-status-toast-success::before {
    content: "\2713";
    /* --success on --tertiary is 4.0:1 — a decorative status glyph, so the
     * WCAG AA graphical-object threshold (>=3.0:1) applies, not the 4.5:1
     * body-text bar; the message text itself is white at 7.4:1. */
    color: var(--success);
    font-weight: 600;
    margin-right: var(--sp-sm);
}

/* #366 + #96 Rider section layout — any form row that hosts a rider Dropzone
 * stacks its children vertically (label, button, dropzone, list) instead of
 * the default horizontal flex. Covers both the contract edit dropdown and the
 * artist edit modal — they share the same `.rider-dropzone` class now. */
form .row:has(.rider-dropzone) {
    flex-direction: column;
    align-items: flex-start;
    gap: 0;
}

/* "+ Add from artist's riders" button — styled as Arena primary action:
   solid orange fill, white text, matching the modal primary buttons
   (Attach selected, Create!, etc.). */
.add-from-artist-riders-btn {
    display: inline-block;
    margin: 5px 0 6px 0;
    padding: 8px 16px;
    background: var(--arena-orange);
    border: 0;
    border-radius: 3px;
    cursor: pointer;
    font-size: 13px;
    color: var(--surface);
    font-weight: 400;
    transition: background 0.2s ease, color 0.2s ease;
    float: none;
    height: auto;
}
.add-from-artist-riders-btn:hover:not(:disabled) {
    background: #e55a16;
    color: var(--surface);
}
.add-from-artist-riders-btn:disabled {
    opacity: 0.45;
    cursor: default;
    border-color: var(--border);
    color: var(--text-muted);
}

/* Dropzone: match the .dropdownList textarea rendered outer width (434px).
   The textarea is content-box: width 418px + padding 7px L/R + border 1px L/R = 434px outer.
   We use border-box so max-width: 434px caps the outer dimension directly.
   max-width instead of fixed width makes it responsive on narrow viewports. */
.rider-dropzone {
    max-width: 434px;
    width: 100%;
    margin: 5px 15px 10px 15px;
    box-sizing: border-box;
}

.rider-list-wrapper {
    max-width: 434px;
    width: 100%;
    min-width: 0;
    margin: 0 15px;
    box-sizing: border-box;
    padding: 0;
}
form .row:has(.add-from-artist-riders-btn) > p.subheader {
    margin: 0 15px 4px 15px;
    font-size: 12px;
    color: var(--text-muted);
}

/* #366 Combined rider list: two colored-border sections. */
.rider-list-wrapper {
    display: flex;
    flex-direction: column;
    gap: 12px;
    margin-top: 8px;
}
.rider-list-section {
    padding-left: 8px;
    border-left: 3px solid transparent;
}
.rider-list-section.rider-source-artist {
    border-left-color: #93c5fd;
}
.rider-list-section.rider-source-contract {
    border-left-color: #fbbf24;
}
.rider-list-section h6 {
    font-size: 13px;
    color: var(--secondary);
    margin: 0 0 6px 0;
    font-weight: 400;
}
.rider-list {
    list-style: none;
    padding-left: 0;
    margin-bottom: 0;
}
.rider-list li {
    padding: 4px 0;
    border-bottom: 1px solid #f3f4f6;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.rider-list li:last-child {
    border-bottom: none;
}
.rider-list .rider-remove {
    color: #ef4444;
    cursor: pointer;
    margin-left: 8px;
}
.rider-list .rider-remove:hover {
    color: #b91c1c;
}

/* #1150 Additional Clauses picker (Add popup + Edit dropdown) — mirrors the
   rider-section layout above (stacked label/controls/list, same list-row
   rhythm) rather than introducing a parallel visual language.
   Adam UI tweak: the clause controls sat ~15px deeper than the standard
   .field alignment every neighboring field uses (#artistContract/#add-contract
   .contract-grid .field has margin:0, flush with its own label and the
   grid's own padding). TWO sources, both fixed:
     1. .clause-picker-row/.clause-list's own margin, copied from the rider
        pattern's .rider-dropzone/.rider-list-wrapper (15px left/right) —
        reset to 0 below.
     2. The <select> element itself: this form's legacy `.dropdownList
        select { margin: 5px 15px 15px 15px; }` rule (line ~1825) applies to
        EVERY select inside the .dropdownList form, including this picker —
        .field selects already have an ID-scoped override resetting this
        (line ~6206), but .clause-picker-select lives outside .field, so it
        never got that override and kept the legacy 15px. Added the matching
        override below.
   Riders keeps its own pre-existing 15px indent — out of scope here — but
   clauses now aligns flush with the rest of the form instead of inheriting
   either source. */
.clause-picker-row {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 5px 0 10px 0;
    max-width: 434px;
}
.clause-picker-select {
    flex: 1;
    min-width: 0;
}
/* ID-scoped to beat .dropdownList select's specificity (0,0,1,1) — a bare
   .clause-picker-select class alone (0,0,1,0) cannot win against it. */
#add-contract .clause-picker-select,
#artistContract .clause-picker-select {
    margin: 0;
}
.add-clause-btn {
    display: inline-block;
    flex: 0 0 auto;
    padding: 8px 16px;
    background: var(--arena-orange);
    border: 0;
    border-radius: 3px;
    cursor: pointer;
    font-size: 13px;
    color: var(--surface);
    font-weight: 400;
    transition: background 0.2s ease, color 0.2s ease;
    float: none;
    height: auto;
    white-space: nowrap;
}
.add-clause-btn:hover:not(:disabled) {
    background: #e55a16;
    color: var(--surface);
}
.add-clause-btn:disabled {
    opacity: 0.45;
    cursor: default;
    border-color: var(--border);
    color: var(--text-muted);
}
.clause-list {
    list-style: none;
    padding-left: 0;
    margin: 8px 0 0 0;
    max-width: 434px;
}
.clause-list li {
    padding: 4px 0;
    border-bottom: 1px solid #f3f4f6;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.clause-list li:last-child {
    border-bottom: none;
}
.clause-list .clause-remove {
    color: #ef4444;
    cursor: pointer;
    margin-left: 8px;
}
.clause-list .clause-remove:hover {
    color: #b91c1c;
}

/* #555 Flow c — wrapper block that contains the catalog toggle + Dropzone.
   The parent .row is a nowrap flex container; this block takes full width
   so the toggle and Dropzone stack vertically without needing flex-wrap.
   The catalog toggle itself reuses the .field.inline-checkbox convention
   (#534) — see the #addContract/#addArtist/#artistContract .inline-checkbox
   rules above — rather than a bespoke class, so the label inherits the
   established form-label grey (#8a9398) and the sprite-checkbox float is
   killed consistently across both the Add popup and the Edit dropdown. */
.rider-upload-block {
    width: 100%;
    flex-shrink: 0;
}

/* #390 Inline rider picker (used in the Add Contract popup, where a stacked
   Foundation reveal-modal collapses the parent). Visually echoes #riderPicker. */
.inline-rider-picker {
    max-width: 434px;
    width: 100%;
    margin: 5px 0 10px 0;
    padding: 8px 10px;
    background: var(--neutral);
    border: 1px solid var(--border);
    border-radius: 4px;
    box-sizing: border-box;
}
.inline-rider-picker-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-size: 12px;
    color: var(--tertiary);
    margin-bottom: 6px;
}
.inline-rider-picker-refresh {
    font-size: 11px;
    color: var(--text-muted);
    text-decoration: underline;
}
.inline-rider-picker-refresh:hover {
    color: var(--arena-orange);
}
.inline-rider-picker-list {
    list-style: none;
    padding: 0;
    margin: 0;
    max-height: 160px;
    overflow-y: auto;
}
.inline-rider-picker-list li {
    padding: 4px 0;
    border-bottom: 1px solid #f3f4f6;
    font-size: 13px;
}
.inline-rider-picker-list li:last-child {
    border-bottom: none;
}
.inline-rider-picker-list label {
    display: flex;
    align-items: center;
    cursor: pointer;
    margin: 0;
}
/* Override the global input[type="checkbox"] rule above (#846: visually-hidden
   via position:absolute+clip, was display:none). The inline picker uses
   input-inside-label, not the input+label sibling pattern, so the global sprite
   styles don't apply — this reverts the hiding so the native checkbox is a
   normal, visible, in-flow control (position/clip/overflow must all be reset,
   not just display, or the checkbox stays clipped to 1px despite the
   width/height below). */
.inline-rider-picker-list input[type="checkbox"] {
    display: inline-block;
    position: static;
    clip: auto;
    overflow: visible;
    width: 14px;
    height: 14px;
    margin: 0 8px 0 0;
    vertical-align: middle;
    cursor: pointer;
}
.rider-dropzone {
    min-height: 60px;
    border: 2px dashed var(--border);
    border-radius: 4px;
    padding: 12px;
    text-align: center;
    background: var(--surface-inset);  /* #679 — inset drop-zone; --surface blended with white page */
    font-size: 12px;
    line-height: 1.4;
    overflow: hidden;
}
.rider-dropzone .dz-message {
    margin: 0;
    word-wrap: break-word;
    overflow-wrap: break-word;
}
.rider-dropzone.dz-drag-hover {
    border-color: #3b82f6;
    background: #eff6ff;
}

/* Add mode: hide Dropzone (no artistId yet), show note instead.
   Edit mode (form id="editArtist"): show Dropzone, hide the save-first note. */
#addArtist .rider-dropzone {
    display: none;
}
#editArtist .rider-dropzone {
    display: block;
}
#addArtist .riderUploadNote {
    display: block;
}
#editArtist .riderUploadNote {
    display: none;
}
/* In add-contract popup, the note is always visible (no Dropzone in add mode). */
p.riderUploadNote {
    margin: 8px 15px;
    font-size: 12px;
    color: var(--text-muted);
    font-style: italic;
}

/* #366 — explanatory text that replaces the rider interface on the add-contract
   popup. Agents cannot assign riders until the contract has been saved (gap
   tracked as #390). */
p.riderCreateNote {
    margin: 8px 15px;
    font-size: 13px;
    color: var(--text-muted);
    line-height: 1.4;
    max-width: 434px;
}

/* #366 — picker modal header/content spacing: the form content needs top
   breathing room below the .top divider line, matching the addArtist /
   addPromoter convention where .popup form section has internal margins. */
#riderPicker > form {
    padding: 16px 20px;
}
#riderPicker p.subheader {
    margin: 0 0 12px 0;
    font-size: 13px;
    color: var(--text-muted);
}
#riderPicker #riderPickerList {
    margin-bottom: 12px;
}
#riderPicker .riderPickerActions {
    margin-top: 12px;
    display: flex;
    gap: 10px;
}

/* #96 — The artist edit modal's rider list reuses the same `.rider-list-wrapper`
 * + `.rider-list` styling as the contract edit dropdown (shipped in !232/#366).
 * Only addition: the artist row's `<li>` has a clipboard-copy icon next to the
 * remove × — clustered in `.rider-actions` so the flex layout puts file name
 * on the left and the icon cluster on the right (matching `justify-content:
 * space-between` from the base .rider-list li rule). */
.rider-list .rider-actions {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    flex-shrink: 0;
}
.rider-list .copyFileRiderUrl {
    cursor: pointer;
    color: var(--secondary);
}
.rider-list .copyFileRiderUrl:hover {
    color: var(--secondary-dark);
}
/* #96 — Inside a `.popup` (Foundation 5 reveal-modal), the rider list must
 * scroll internally so a long list (e.g. 13 riders) does not push the form
 * submit button below the modal viewport. Contract-edit dropdown (.dropdownList,
 * not .popup) is flexible-height and does not need this — the page scrolls. */
.popup .rider-list-wrapper {
    max-height: 200px;
    overflow-y: auto;
}
/* #96 — Rider name preview inside the Artist Information cell. Shows up to
 * 3 filenames with a "+N more" overflow indicator when the artist has more.
 * The full rider list opens in the edit modal — the pencil icon at the top
 * of the cell is the click target. */
.artistInfoRiders {
    max-width: 200px;
}
.artistInfoRiders .rider-name-preview {
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: 14px;
    line-height: 18px;
    color: var(--text);
}
/* #528 — Align the rider list with the .fieldVal h1 line-box used by the
 * adjacent value columns. The h1 renders at 40px line-height with its text
 * vertical-centered, so the first rider line needs to share that 40px
 * line-box to land on the same horizontal axis as "15% / ON / 416-555-2001".
 * Subsequent rider lines fall back to the 18px line-height so multi-rider
 * lists don't grow the cell vertically more than necessary. */
.artistInfoRiders .rider-name-preview li {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 200px;
}
.artistInfoRiders .rider-name-preview li:first-child {
    line-height: 40px;
}
.artistInfoRiders .rider-name-preview li a {
    color: inherit;
    text-decoration: none;
}
.artistInfoRiders .rider-name-preview li a:hover {
    color: var(--arena-orange);
    text-decoration: underline;
}
.artistInfoRiders .rider-name-preview li.none {
    color: var(--secondary);
    font-style: italic;
}
.artistInfoRiders .rider-name-preview li.more {
    color: var(--arena-orange);
    font-weight: 600;
}

/* #102 Wave 3 + Wave 4 — Issue + un-Issue confirmation modals (shared layout). */
#confirmIssueContractModal,
#confirmUnissueContractModal {
    margin-left: -240px;
    width: 480px;
}
#confirmIssueContractModal section,
#confirmUnissueContractModal section {
    padding: 16px 24px;
    color: var(--text);
    font-size: 14px;
    line-height: 1.5;
}
#confirmIssueContractModal section p,
#confirmUnissueContractModal section p {
    margin: 0 0 12px 0;
}
#confirmIssueContractModal section .confirmIssueList,
#confirmUnissueContractModal section .confirmIssueList {
    margin: 0 0 16px 0;
    padding-left: 20px;
    list-style: disc;
}
#confirmIssueContractModal section .confirmIssueList li,
#confirmUnissueContractModal section .confirmIssueList li {
    margin-bottom: 6px;
}

.modalActions {
    display: flex;
    justify-content: flex-end;
    gap: 12px;
    margin-top: 16px;
    padding-top: 12px;
    border-top: 1px solid var(--border);
}
/* The Cancel anchor needs Foundation's `.close-reveal-modal` to trigger close,
   but the global rule absolutely-positions any `.close-reveal-modal` to the
   modal's top-right corner. Reset within action rows so it flows in flex. */
.modalActions .close-reveal-modal {
    position: static;
    top: auto;
    right: auto;
    font-size: inherit;
    width: auto;
    height: auto;
}
.modalActions .button {
    /* #1022 (Adam review, finding 1): was `display: inline-block`. Native
       <button> elements (#confirmIssueButton/#confirmUnissueButton) center
       their content internally regardless of author display — verified this
       is NOT an `-webkit-appearance` artifact (resetting it made no measured
       difference). A plain <a class="close-reveal-modal button secondary">
       (Cancel) has no such native centering, so its text sat ~2.6px above
       true vertical center relative to the <button> beside it in the same
       flex row, despite both boxes measuring the identical 40px height.
       inline-flex + centering makes both tag types use the same explicit
       centering algorithm — measured to eliminate the offset entirely
       (both text nodes land at the identical center Y once applied). */
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 8px 18px;
    border-radius: 4px;
    font-size: 14px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
    border: 1px solid transparent;
    line-height: 1.2;
}
.modalActions .button.primary {
    background: var(--arena-orange);
    color: var(--surface);
    border-color: var(--arena-orange);
}
.modalActions .button.primary:hover:not(:disabled) {
    background: #d35413;
    border-color: #d35413;
}
.modalActions .button.primary:disabled {
    background: #c8a88f;
    border-color: #c8a88f;
    cursor: default;
}
.modalActions .button.secondary {
    background: var(--surface);
    color: var(--secondary-dark);
    border-color: var(--border-dark);
}
.modalActions .button.secondary:hover {
    background: var(--neutral);
    color: var(--secondary-dark);
}

/* #97 — Soft deletion / data hygiene
 * Visual treatment for deactivated rows on the promoters, venues and
 * artists listings, plus the "Show inactive" header toggle. Reused across
 * all three modules — single shared selector set rather than per-module
 * duplicates (cf. project memory feedback_consolidate_dual_classes.md).
 */
#content .row.row-inactive {
    background: var(--neutral);
    opacity: 0.65;
}
#content .row.row-inactive:hover {
    opacity: 1;
}
#content .row.row-inactive .nameField h1 {
    color: var(--secondary);
    text-decoration: line-through;
    text-decoration-color: rgba(138, 147, 152, 0.6);
}

/* "Inactive" badge rendered next to the entity name in promoters/venues/artists rows. */
/* #719 - status reads as inline TEXT, not a pill. Geometry-neutral base; each
   state override below carries colour only. Per arena-ams-design review (UI
   Designer / UX Architect / Brand Guardian): drop the residual pill box so the
   marker sits on the record-name baseline as a caption, not a floating empty
   pill (the de-pilled-but-pill-shaped "broken" look). */
.status-badge {
    display: inline-block;   /* atomic inline: blocks the inactive-row name's line-through from striking the marker */
    margin-left: var(--sp-xs);
    padding: 0;
    font-size: var(--fs-caption);
    font-weight: 600;
    line-height: inherit;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    text-decoration: none;
    vertical-align: baseline;
    border-radius: 0;
}
/* #719 — status-as-text: amber text on white, no fill (per arena-ams-design). */
.status-badge-inactive {
    background: transparent;
    color: var(--warning-text);
    border: none;
}

/* =============================================================
   #417 — Filter panel + chips bar
   Replaces the old .show-inactive-toggle checkbox (removed in #417).
   ============================================================= */

/* "Filters ▾" trigger link in .add-user — peers visually with "+ Add X" */
.add-user .filter-panel-trigger {
    display: inline-block;
    margin-right: 18px;
    color: var(--arena-orange);
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    vertical-align: middle;
    user-select: none;
    transition: opacity 0.15s ease;
}
.add-user .filter-panel-trigger:hover {
    opacity: 0.8;
    text-decoration: none;
    color: var(--arena-orange);
}
.filter-panel-arrow {
    font-size: 10px;
    margin-left: 2px;
}

/* Slide-down drawer — lives between .sub-header and #content */
#filter-panel {
    background: var(--neutral);
    border-bottom: 1px solid var(--border);
    overflow: hidden;
    transition: max-height 0.25s ease, padding 0.25s ease;
}
#filter-panel.filter-panel-collapsed {
    max-height: 0;
    padding-top: 0;
    padding-bottom: 0;
}
#filter-panel.filter-panel-open {
    max-height: 200px;
}
.filter-panel-inner {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
    padding: 10px 20px;
}

/* Individual facet block */
.filter-facet {
    display: flex;
    align-items: center;
    gap: 10px;
}
.filter-facet-label {
    font-size: 13px;
    font-family: 'Open Sans', sans-serif;
    color: var(--secondary-dark);
    font-weight: 600;
    white-space: nowrap;
    margin: 0;
}

/* Segmented button group */
.filter-btn-group {
    display: flex;
    align-items: center;
}
.filter-btn {
    padding: 5px 14px;
    font-size: 13px;
    font-family: 'Open Sans', sans-serif;
    border: 1px solid var(--border);
    background: var(--surface);
    color: var(--secondary-dark);
    cursor: pointer;
    border-radius: 0;
    margin: 0;
    line-height: 1.4;
    transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}
.filter-btn:first-child {
    border-radius: 3px 0 0 3px;
}
.filter-btn:last-child {
    border-radius: 0 3px 3px 0;
}
.filter-btn:not(:first-child) {
    border-left: none;
}
.filter-btn:hover:not(.active) {
    color: var(--arena-orange);
    border-color: var(--arena-orange);
    z-index: 1;
    position: relative;
}
.filter-btn.active {
    background: var(--arena-orange);
    color: var(--surface) !important;
    border-color: var(--arena-orange);
    z-index: 1;
    position: relative;
}

/* "✕ Clear filters" link — right side of panel */
.filter-panel-clear {
    margin-left: auto;
    font-size: 12px;
    color: var(--secondary);
    text-decoration: none;
    white-space: nowrap;
    transition: color 0.12s ease;
}
.filter-panel-clear:hover {
    color: var(--arena-orange);
    text-decoration: none;
}

/* Active-filter chips bar — between panel and #content */
#filter-chips-bar {
    /* #856 - chips sit INLINE in the workspace-header search/filter cluster (post-#740),
       not in a band below the header. Drop the vestigial band styling (gray fill +
       bottom border + band padding) that rendered as a stray gray box around the chip. */
    background: transparent;
    border: none;
    padding: 0;
    margin-left: 12px;     /* #856 - separate the inline chip from the Filters trigger (the band's left padding used to provide this; chip was sitting ~1px from Filters) */
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
}
.filter-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--surface);
    border: 1px solid var(--arena-orange);
    color: var(--arena-orange);
    border-radius: 12px;
    padding: 3px 10px;
    font-size: 12px;
    font-family: 'Open Sans', sans-serif;
    white-space: nowrap;   /* #856 - keep label + remove-x on one line; don't wrap mid-chip */
    flex-shrink: 0;        /* #856 - don't compress below content width in the chips bar */
}
.filter-chip-remove {
    color: var(--arena-orange);
    text-decoration: none;
    font-size: 12px;
    line-height: 1;
    display: inline-flex;          /* #856 - centered, real hit target */
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    margin-right: -3px;            /* #856 - keep the pill compact; chip gap:6px spaces it from the label (drops the old extra margin-left:2px that floated the x) */
    border-radius: 50%;
}
.filter-chip-remove:hover {
    color: var(--arena-orange-dark);
    text-decoration: none;
}

/* =============================================================
   #326 reflow — responsive breakpoints for modal / dropdown forms
   Wide desktop (≥1280px): no rules — implicit fallthrough.
   ============================================================= */

/* --- Narrow desktop: 1024–1279px --- */
@media (max-width: 1279px) and (min-width: 1024px) {
    /* extraBig modal: cap width and keep centred */
    .reveal-modal.extraBig {
        max-width: 1200px;
    }

    /* extraBig sections: 2-up instead of 3-up */
    .popup.extraBig form section {
        width: 48%;
        min-width: 0;
    }
}

/* --- Tablet / split-screen: 720–1023px --- */
@media (max-width: 1023px) and (min-width: 720px) {
    /* All modal sizes: full-width minus gutters */
    .reveal-modal,
    .reveal-modal.big,
    .reveal-modal.extraBig {
        width: calc(100vw - 40px);
        max-width: calc(100vw - 40px);
        left: 20px;
        transform: none;
    }

    /* #853: the Issue/Send confirmation modals carry their own desktop
       centering hack (`left: 50%` from `.reveal-modal` + a fixed
       `margin-left: -240px` scoped to their IDs — see the #102 Wave 3/4
       rule below) instead of the `left: 50%; transform: translateX(-50%)`
       pattern every other modal uses. That -240px margin is a constant
       pixel offset, not relative to the box's own width, so it was never
       touched by the generic `.reveal-modal` reset above — the modal kept
       shifting 240px left of whatever `left` this tier sets, clipping its
       left ~30% off-screen. Zero it out wherever the generic reset applies. */
    #confirmIssueContractModal,
    #confirmUnissueContractModal {
        margin-left: 0;
    }

    /* Sections stack vertically and grow to fit their content (desktop's
       max-height: 740px would clip section 1 and visually overlap section 2
       since overflow is visible). */
    .popup form section,
    .popup.extraBig form section {
        width: 100%;
        min-width: 0;
        display: block;
        max-height: none;
        height: auto;
    }

    .popup.big form {
        min-width: 0;
    }

    /* Lift the header floor — section width is now the constraint */
    .popup .full,
    .popup .top {
        min-width: 0;
    }
}

/* --- Phone / very narrow: <720px --- */
@media (max-width: 719px) {
    /* Modals go near-full-viewport */
    .reveal-modal,
    .reveal-modal.big,
    .reveal-modal.extraBig {
        width: 100vw;
        max-width: 100vw;
        left: 0;
        top: 0;
        transform: none;
        border-radius: 0;
    }

    /* #853: same fixed -240px margin-left as the tablet tier above — see
       that block's comment. At this tier the generic reset sets `left: 0`,
       so the un-neutralized margin shifted the whole modal 240px past the
       left edge of an already-narrow (≤480px) viewport, clipping roughly
       the left third of every line and leaving Cancel partly off-screen. */
    #confirmIssueContractModal,
    #confirmUnissueContractModal {
        margin-left: 0;
    }

    /* Header: distribute icon + title + close gracefully when the row is narrow */
    .popup .full,
    .popup .top {
        max-width: 100%;
        display: flex;
        align-items: center;
        gap: 8px;
    }

    /* Sections stack vertically and grow to fit their content (desktop's
       max-height: 740px would clip section 1 and visually overlap section 2
       since overflow is visible). */
    .popup form section,
    .popup.extraBig form section {
        width: 100%;
        min-width: 0;
        display: block;
        max-height: none;
        height: auto;
    }

    .popup.big form {
        min-width: 0;
    }

    /* Labels stack above inputs (block flow) */
    #addArtist label,
    #addContract label,
    #addVenue label,
    #addPromoter label,
    .dropdownList.scroll label,
    #artistContractForm label,
    #vendorContractForm label {
        width: 100%;
        flex: 1 1 100%;
        display: block;
        margin: 8px 15px 4px 15px;
    }

    #addArtist label.half,
    #addContract label.half,
    #addVenue label.half,
    #addPromoter label.half,
    .dropdownList.scroll label.half,
    #artistContractForm label.half {
        width: 100%;
    }

    /* #534 Inline-checkbox modifier at phone tier — keep checkbox + label
       inline even when other labels stack above their inputs. The default
       phone-tier rule sets labels to `width: 100%; display: block`, which
       would force the checkbox to a new line. Inline-checkbox cases stay
       single-line at every viewport. */
    #addContract .field.inline-checkbox label,
    #addArtist .field.inline-checkbox label,
    #addVenue .field.inline-checkbox label {
        width: auto;
        display: inline;
        flex: 0 0 auto;
        margin: 0 0 0 6px;
    }

    /* Inputs fill the row */
    .dropdownList input:not([type="checkbox"]):not([type="file"]),
    .dropdownList select,
    .dropdownList input.half,
    .dropdownList textarea {
        width: calc(100% - 30px);
        max-width: calc(100% - 30px);
        box-sizing: border-box;
    }

    /* #326 Phone-tier stacking: .field wrappers go full-width-block so each
       label and its input render adjacent (label above input) instead of
       all-labels-then-all-inputs. .half and .large variants repeated
       explicitly to match the desktop specificity.

       #538 extends to .dropdownList.scroll .row .field too so the
       contract-edit dropdown (Modify Artist Contract) stacks identically to
       the Add Contract modal at phone tier. */
    .popup form .row .field,
    .popup form .row .field.half,
    .popup form .row .field.large,
    .dropdownList.scroll .row .field,
    .dropdownList.scroll .row .field.half,
    .dropdownList.scroll .row .field.large {
        display: block;
        /* width: auto + symmetric 15px margins keeps the .field box inside the
           viewport. Earlier (width:100%) the box was parent-width AND carried
           30px of horizontal margin, overflowing the viewport by 30px and
           clipping inputs at the right edge on mobile. */
        width: auto;
        max-width: none;
        margin: 0 15px;
        box-sizing: border-box;
    }

    /* #326 Inside a .field at phone tier, each input/select/textarea takes
       full wrapper width and stacks vertically. This is what makes multi-input
       .field wrappers (Contact Person: First Name + Last Name; Address:
       Street + Apt) flow as one labeled column. At desktop these inputs keep
       their existing inline-flex behavior so multi-input rows lay out
       side-by-side. */
    #addArtist .field input:not([type="checkbox"]):not([type="file"]),
    #addArtist .field select,
    #addArtist .field textarea,
    #addContract .field input:not([type="checkbox"]):not([type="file"]),
    #addContract .field select,
    #addContract .field textarea,
    #addVenue .field input:not([type="checkbox"]):not([type="file"]),
    #addVenue .field select,
    #addVenue .field textarea,
    #addPromoter .field input:not([type="checkbox"]):not([type="file"]),
    #addPromoter .field select,
    #addPromoter .field textarea,
    .dropdownList.scroll .field input:not([type="checkbox"]):not([type="file"]),
    .dropdownList.scroll .field select,
    .dropdownList.scroll .field textarea,
    #artistContractForm .field input:not([type="checkbox"]):not([type="file"]),
    #artistContractForm .field select,
    #artistContractForm .field textarea,
    #vendorContractForm .field input:not([type="checkbox"]):not([type="file"]),
    #vendorContractForm .field select,
    #vendorContractForm .field textarea {
        display: block;
        margin: 6px 0;
        width: 100%;
        max-width: none;
        box-sizing: border-box;
    }
}

/* ──────────────────────────────────────────────────────────────────────────
   #107 PUBLIC ticket-count form (chrome-free, unauthenticated promoter page).
   Reuses the app's brand palette via design tokens (colors_and_type.css).
   #mainLogo (defined above) renders the Arena logo at the top of the card.
   ────────────────────────────────────────────────────────────────────────── */
.publicTicketCount {
    max-width: 480px;
    margin: 40px auto;
    padding: 0 24px 32px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 4px;
    box-sizing: border-box;
    text-align: center;
    color: var(--secondary);
    font-family: 'Open Sans', sans-serif;
}

.publicTicketCount #mainLogo {
    height: 80px;
    margin: 16px 0 8px;
    /* contain (not the global cover/center) so the wide logo is never cropped. */
    background-size: contain;
}

.publicTicketCount h1 {
    font-size: 23px;
    color: var(--text);
    margin: 0 0 20px;
}

.publicTicketCount .tcDetail {
    margin: 4px 0;
    font-size: 13px;
    line-height: 1.4;
    text-align: center;
}

.publicTicketCount .tcDetail strong {
    color: var(--text);
}

.publicTicketCount form {
    margin-top: 24px;
    text-align: left;
}

.publicTicketCount .field {
    margin-bottom: 16px;
}

.publicTicketCount .field label {
    display: block;
    margin-bottom: 4px;
    font-size: 13px;
    color: var(--text);
}

.publicTicketCount .field input[type="number"] {
    display: block;
    width: 100%;
    height: 40px;
    padding: 0 12px;
    border: 1px solid var(--border);
    border-radius: 4px;
    box-sizing: border-box;
    /* 13px (body) per the type scale. Note: <16px reintroduces iOS Safari
       focus-zoom on this mobile promoter page — accepted to stay on-scale. */
    font-size: 13px;
    color: var(--secondary);
    font-family: inherit;
}

.publicTicketCount .field input[type="number"]:focus {
    outline: none;
    border-color: var(--info);
    box-shadow: 0 0 0 2px var(--focus-ring);
}

.publicTicketCount button[type="submit"] {
    width: 100%;
    height: 40px;
    background: var(--arena-orange);
    color: var(--neutral);
    border: none;
    border-radius: 4px;
    font-size: 14px;
    /* Buttons don't inherit font-family by default — without this it renders
       Arial. inherit pulls Open Sans from .publicTicketCount/body. */
    font-family: inherit;
    cursor: pointer;
}

.publicTicketCount button[type="submit"]:disabled {
    opacity: 0.6;
    cursor: default;
}

.publicTicketCount .ticketCountStatus {
    display: block;
    margin-top: 12px;
    font-size: 13px;
    min-height: 1em;
}

.publicTicketCount .ticketCountStatus.is-error {
    color: var(--error);
}

/* Confirmation / invalid-link state (replaces the form on success; also the
   "link unavailable" copy on an invalid token render). */
.publicTicketCount .publicMessage {
    margin: 24px 0 8px;
    padding: 16px;
    font-size: 13px;
    line-height: 1.5;
    color: var(--text);
    background: var(--neutral);
    border-radius: 4px;
    text-align: center;
}

@media (max-width: 540px) {
    .publicTicketCount {
        margin: 16px auto;
        max-width: none;
        border: none;
        border-radius: 0;
    }
}

/* ── #108 Notification bell + dropdown ──────────────────────────────────────
   Lives in the authenticated header chrome, left of .logout (which is
   position:absolute; right:20px). The bell is anchored absolutely so it clears
   the variable-width username; the dropdown hangs below it. Matches the header
   rhythm: 69px tall row.

   #681 state-driven color: the bell is ALWAYS visible (only the badge hides
   at zero), so its color carries the unread state — gray (var(--tertiary))
   at zero unread, orange (var(--arena-orange)) when unread > 0. The
   .has-notifications class is toggled by notifications.js setBadge(), the
   same single source of truth that shows/hides the badge. Hover deepens the
   CURRENT state's color (gray→near-black, orange→deep orange) and never
   crosses gray→orange, because orange now means "you have notifications". */
.notifBell {
    position: relative;
    /* C: reset legacy header-context dims — the bell lives in .wright flex now;
       height/line-height from the old 69px .header are gone; margin-right was
       asymmetric with gap:8px, drop it to let gap handle all spacing.
       B/C: height matches the full .whead so top:100% on the dropdown clears
       the header bottom cleanly; align-items:center keeps the icon vertically
       centered within the control row. */
    display: inline-flex;
    align-items: center;
    height: var(--h-whead);
    margin-right: 0;
    cursor: pointer;
    z-index: 50;
}

.notifBell .notifBellIcon {
    font-size: 21px;
    color: var(--tertiary);
    vertical-align: middle;
    transition: color 0.15s ease;
}

.notifBell.has-notifications .notifBellIcon {
    color: var(--arena-orange);
}

.notifBell:hover .notifBellIcon {
    color: var(--text);
}

.notifBell.has-notifications:hover .notifBellIcon {
    color: var(--arena-orange-dark);
}

/* Badge only ever shows in the unread state — i.e. always over an ORANGE
   bell (#681). A 2px var(--surface) ring separates the orange badge from
   the orange glyph so the count stays legible; dims grow 18→20px to keep
   the 11px count centered inside the ring (border-box: 20 − 2×2 = 16px
   content box, matched by line-height). */
.notifBell .notifBadge {
    position: absolute;
    top: 14px;
    right: -6px;
    min-width: 20px;
    height: 20px;
    border-radius: 10px;
    border: 2px solid var(--surface);
    background: var(--arena-orange);
    color: var(--surface);
    font-size: 11px;
    font-weight: 400;
    line-height: 16px;
    text-align: center;
    padding: 0 4px;
    box-sizing: border-box;
}

.notifBell .notifDropdown {
    position: absolute;
    top: calc(100% + 6px); /* B: was 64px (old 69px header); now relative to the bell box */
    right: 0;
    width: 320px;
    max-height: 400px;
    overflow-y: auto;
    background: var(--surface);
    border: 1px solid var(--border-dark);
    border-radius: 4px;
    /* Flat system: no drop shadow on a non-modal overlay. The 1px var(--border-dark)
       border provides separation (matches the .dropdownList overlays). */
    line-height: normal;
    text-align: left;
    cursor: default;
}

.notifBell .notifDropdownHeader {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 12px;
    border-bottom: 1px solid var(--border);
    font-size: 14px;
    font-weight: 400;
    color: var(--text);
}

.notifBell .notifDropdownHeader a {
    font-size: 12px;
    font-weight: normal;
    color: var(--arena-orange);
}

.notifBell .notifList {
    list-style: none;
    margin: 0;
    padding-left: 0;
}

.notifBell .notifList li {
    padding: 12px;
    border-bottom: 1px solid var(--border);
    font-size: 13px;
    color: var(--text);
    cursor: pointer;
}

.notifBell .notifList li:hover {
    background: var(--neutral);
}

/* Unread cue: white background + a 3px left border in primary orange (var(--arena-orange))
   — on-palette and clearer than the prior off-palette #fff5ef tint. No off-scale
   bold weight (the type scale defines only 300/400). The 3px border is offset by
   reducing padding-left 12px -> 9px so unread text stays aligned with read rows. */
.notifBell .notifList li.unread {
    background: var(--surface);
    border-left: 3px solid var(--arena-orange);
    padding-left: 9px;
    font-weight: 400;
}

.notifBell .notifList li.read {
    font-weight: normal;
}

.notifBell .notifList li.notifError {
    color: var(--error);
    cursor: default;
}

.notifBell .notifList .notifMsg {
    display: block;
}

.notifBell .notifList .notifTime {
    display: block;
    margin-top: 4px;
    font-size: 12px;
    font-weight: 400;
    color: var(--text-muted);
}

.notifBell .notifEmpty {
    padding: 16px 12px;
    font-size: 13px;
    color: var(--text-muted);
    text-align: center;
}

/* Phone tier: narrow the dropdown so it doesn't overflow the viewport. The bell
   sits in the .logout flex row, so no horizontal repositioning is needed. */
@media (max-width: 719px) {
    .notifBell {
        margin-right: 12px;
    }
    .notifBell .notifDropdown {
        width: 280px;
    }
}

/* #738 — Documenso "Digital Signing" admin settings page.
   Single-toggle settings page (will grow with #733). Reuses the app-wide
   sprite-checkbox (input[type="checkbox"]+label:after) and the #534
   .inline-checkbox convention. The base .inline-checkbox label/label:after
   overrides are ID-scoped to the Add/Edit popups only, so #documensoSettingsPage
   needs its own copy to keep the sprite inline beside the label text instead of
   floated to the right edge. */
#documensoSettingsPage .field.inline-checkbox label {
    width: auto;
    flex: 0 0 auto;
    display: inline-block;
    margin: 0 0 0 6px;
    vertical-align: middle;
}

#documensoSettingsPage .field.inline-checkbox label:after {
    float: none;
    margin-top: 0;
    margin-left: 6px;
    vertical-align: middle;
}

/* Vertical rhythm for the lone toggle so the page reads as a deliberate
   settings page rather than a sparse one. */
#documensoSettingsPage .documenso-toggle-field {
    margin: 4px 0 12px 0;
}

#documensoSettingsPage .documenso-source-line {
    margin-top: 0;
}

/* ============================================================================
   #740 MR2 — Mobile chrome (<720px)
   Reflows the desktop chrome into a phone layout WITHOUT duplicating any
   markup or JS-bound element (the #notifBell, #mainSearchBar and the action
   controls stay single-instance):
     • left rail            → fixed bottom tab bar (5 icon+label tabs)
     • account/logout       → fixed top-right utility affordance
     • workspace header     → two rows (title+bell / full-width search)
     • primary + overflow   → labeled FAB (#mfab) that proxies to the real
                              controls (direct add on single-action pages,
                              labeled pill menu + scrim on multi-action pages)
   Source design: Claude Design preview/mobile-chrome.html. Desktop ≥720px is
   untouched. The FAB scaffold is mobile-only — hidden by default below.
   ============================================================================ */
#mfab, #mfab-scrim, #mfab-menu { display: none; }

@media (max-width: 719px) {
    /* dvh so the bottom bar + footer clear the mobile browser toolbar. */
    .appshell { height: 100vh; height: 100dvh; }



    .dropdown,
    html.rail-collapsed .dropdown {
         left: 0; 
         width: 100%; 
         top: 145px;
         bottom: 56px;
        }

    html.rail-collapsed .dropdownList { 
        /* background: red; */
        height:calc(100% - 90px );
    }

    /* ---- Left rail → fixed bottom tab bar ----------------------------------
       Override the desktop AND the rail-collapsed state (a user who collapsed
       the rail on desktop carries html.rail-collapsed via localStorage). */
    .rail,
    html.rail-collapsed .rail {
        position: fixed; left: 0; right: 0; bottom: 0; top: auto;
        width: 100%; height: 56px;
        flex-direction: row; align-items: stretch;
        padding: 0; overflow: visible;
        background: var(--surface);
        border-top: 1px solid var(--rail-border);
        box-shadow: 0 -2px 10px rgba(0,0,0,.05);
        z-index: 40;
    }
    .rail::after { content: none; }                 /* drop the right-edge divider */
    .rail .brandrow,
    html.rail-collapsed .rail .brandrow,
    .rail .rail-sub { display: none; }

    .rail nav { flex: 1 1 auto; display: flex; }
    .rail nav ul,
    html.rail-collapsed .rail nav ul { flex-direction: row; width: 100%; height: 100%; gap: 0; }
    .rail nav ul li { flex: 1 1 0; min-width: 0; }
    /* neutralise the desktop active-bar trick (negative margin + inset shadow) */
    .rail nav ul li.active,
    .rail[data-subactive="admin"] #mainMenu_admin { margin-left: 0; padding-left: 0; box-shadow: none; }

    .rail nav ul li a,
    html.rail-collapsed .rail nav ul li a {
        flex-direction: column; justify-content: center; gap: 3px;
        height: 100%; padding: 7px 2px 6px; border-radius: 0;
        font-size: 10px; line-height: 1.1; text-align: center;
    }
    .rail nav ul li a:before { font-size: 18px; width: auto; }
    .rail nav ul li a span,
    html.rail-collapsed .rail nav ul li a span {
        display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis;
    }
    .rail nav ul li.active a { background: transparent; }   /* tab uses orange text, not a pill */

    /* ---- Account / logout → fixed top-right utility affordance -------------
       Lives in the rail in the DOM; position:fixed lifts just this element to
       the top-right of the viewport so logout stays reachable. Height is held
       to the first header row so it never overlaps the search row below it. */
    .rail .acct,
    html.rail-collapsed .rail .acct {
        position: fixed; top: 6px; right: 10px; bottom: auto;
        height: 40px; margin: 0; padding: 0;
        flex-direction: row; align-items: center; gap: 8px;
        border-top: 0; background: transparent; z-index: 41;
    }
    .rail .acct .acct-who,
    html.rail-collapsed .rail .acct .acct-who { display: none; }
    .rail .acct .icon-logout { margin-left: 0; }

    /* ---- Work column: reserve space so content/footer clear the bottom bar */
    .work { box-sizing: border-box; padding-bottom: 56px; }

    /* The "Developed by Throw Away Games Inc." credit is a 400px abs-positioned
       right-aligned block that overlaps the arena logo in the cramped mobile
       footer band — hide it on mobile. Restoring it with a mobile-fit layout is
       tracked in #787. */
    footer .footer .throw { display: none; }

    /* ---- Workspace header → two rows --------------------------------------- */
    .whead {
        flex-wrap: wrap; height: auto; row-gap: 8px; column-gap: 10px;
        padding: 11px 14px 12px;
        padding-right: 52px;                /* clear the fixed account avatar */
    }
    .whead .wtitle { font-size: 22px; }
    .whead .wright { gap: 6px; }
    /* primary + overflow leave the header (they become the FAB); the bell stays */
    .whead .wright .btn-primary,
    .whead .wright .ov-btn { display: none; }
    /* search takes its own full-width row, ordered after the title/bell row */
    .sfu { flex: 1 1 100%; order: 5; min-width: 0; }

    /* ---- Labeled FAB ------------------------------------------------------- */
    #mfab {
        display: inline-flex; align-items: center; justify-content: center;
        position: fixed; right: 16px; bottom: 70px;
        width: 52px; height: 52px; border-radius: 50%;
        background: var(--arena-orange); color: var(--surface);
        border: 0; font-size: 18px; cursor: pointer; z-index: 46;
        box-shadow: 0 6px 18px rgba(0,0,0,.22);
    }
    #mfab .fa:before { content: "\f067"; }          /* plus */
    #mfab.open .fa:before { content: "\f00d"; }      /* × while the menu is open */

    #mfab-scrim { position: fixed; inset: 0; background: rgba(0,0,0,.18); z-index: 44; }
    #mfab-scrim.open { display: block; }

    #mfab-menu {
        position: fixed; right: 18px; bottom: 134px; z-index: 46;
        flex-direction: column; align-items: flex-end; gap: 10px;
    }
    #mfab-menu.open { display: flex; }
    .mfab-item {
        display: inline-flex; align-items: center; gap: 10px;
        background: var(--surface); border: 1px solid var(--border-dark);
        border-radius: 22px; padding: 9px 16px;
        font-size: 13px; font-weight: 600; color: var(--tertiary);
        cursor: pointer; box-shadow: 0 4px 12px rgba(0,0,0,.12);
    }
    .mfab-item .fa { color: var(--arena-orange); font-size: 13px; }
}

/* ──────────────────────────────────────────────────────────────────────────
   #661 / #657 — Add Promoter modal redesign: single fluid 12-column field grid.
   Replaces the rigid two-column form-sections split so there is no right-column
   dead-zone and every field width is consistent. Every field is individually
   labeled (label-over-input, 11px uppercase caption). No section headers, no
   divider lines.

   ALL rules are scoped under #add-promoter (or its children) so they cannot
   touch any other modal or global .field / .row usage. Tokens come from
   assets/css/colors_and_type.css — no raw hex values.

   Layout: CSS Grid, 12 equal columns, 16px gap. Each .field spans N columns via
   .col-N. Desktop rows: 12 | 4·4·4 | 4·4·4 | 6·6 | 8·4 | 3·3·3·3.
   Tablet (≤1023px): collapse to 6 columns (multi-field rows become 2-up).
   Phone  (≤719px):  collapse to 1 column (everything stacks).

   Overflow-safety contract (the #661 v2 defect fix): the grid + every grid
   child carries `min-width: 0` + `box-sizing: border-box` so a long value can
   never force horizontal page scroll; the modal width itself is capped by the
   .reveal-modal.big rule and nothing inside re-introduces a wider min-width.
   ────────────────────────────────────────────────────────────────────────── */

/* Belt-and-braces: never let the modal or its form exceed the viewport, and
   neutralise any inherited min-width that would force horizontal scroll. */
#add-promoter,
#add-promoter * {
    box-sizing: border-box;
}

#add-promoter #addPromoter {
    min-width: 0;
    max-width: 100%;
}

/* The single fluid field grid. */
#add-promoter .promoter-grid {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    column-gap: var(--sp-lg, 16px);
    row-gap: var(--sp-lg, 16px);
    padding: var(--sp-xl, 20px) var(--sp-xl, 20px) var(--sp-lg, 16px);
    min-width: 0;
    max-width: 100%;
}

/* Individual field — flex column (label above input). min-width:0 so a field
   can shrink below its content width instead of widening its grid track. */
#add-promoter .promoter-grid .field {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    min-width: 0;
    margin: 0;
}

/* 12-column span classes. */
#add-promoter .promoter-grid .col-3  { grid-column: span 3; }
#add-promoter .promoter-grid .col-4  { grid-column: span 4; }
#add-promoter .promoter-grid .col-6  { grid-column: span 6; }
#add-promoter .promoter-grid .col-8  { grid-column: span 8; }
#add-promoter .promoter-grid .col-9  { grid-column: span 9; }
#add-promoter .promoter-grid .col-12 { grid-column: span 12; }

/* Labels: 11px uppercase caption, muted slate. Overrides the global
   #addPromoter label rule (inline-block + fixed widths + margins). */
#add-promoter .promoter-grid .field label {
    display: block;
    font-size: var(--fs-caption, 11px);
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--text-muted);
    width: auto;
    min-width: 0;
    max-width: none;
    min-height: 15px;
    flex: none;
    margin: 0;
}

/* Inputs and selects — 40px control height, hairline border, on-token.
   #1124: background/color split into their own :not(:disabled)-scoped rule
   below — this box-model rule's `input, select` selector otherwise has
   higher specificity (1 id + 2 classes + 1 element) than the site-wide
   disabled-state base rule (bare `input:disabled`/`select:disabled`), so a
   disabled field here would render on-token white instead of the gate-gray
   fallback. Same collision pattern and fix as the original contract-form
   bug this issue was filed for. */
#add-promoter .promoter-grid .field input,
#add-promoter .promoter-grid .field select {
    flex: 0 0 auto;
    height: var(--h-control, 40px);
    border: 1px solid var(--border);
    border-radius: var(--r-md, 4px);
    font-family: inherit;
    font-size: var(--fs-body, 13px);
    padding: 0 var(--sp-sm, 8px);
    width: 100%;
    max-width: 100%;
    min-width: 0;
    display: block;
    margin: var(--sp-xs, 4px) 0 0 0;
}
#add-promoter .promoter-grid .field input:not(:disabled),
#add-promoter .promoter-grid .field select:not(:disabled) {
    background: var(--surface);
    color: var(--text);
}

/* The Country <select> needs explicit appearance reset so the 40px height and
   token padding actually apply (UA selects ignore height otherwise). */
#add-promoter .promoter-grid .field select {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    line-height: normal;
}

/* Placeholder text in slate, per the design system. */
#add-promoter .promoter-grid .field input::placeholder {
    color: var(--secondary);
    opacity: 1;
}

/* Design-system focus state: info-blue border + soft blue halo. */
#add-promoter .promoter-grid .field input:focus,
#add-promoter .promoter-grid .field select:focus {
    outline: 2px solid var(--info, #4a90d9);
    outline-offset: 1px;
    border-color: var(--info, #4a90d9);
    box-shadow: 0 0 0 2px var(--focus-ring, rgba(74, 144, 217, 0.2));
}

/* Windows High Contrast Mode: system colors override authored ones, so spell
   the focus indicator with the Highlight system color so it stays visible. */
@media (forced-colors: active) {
    #add-promoter .field input:focus,
    #add-promoter .field select:focus {
        outline: 2px solid Highlight;
    }
}

/* Footer: right-aligned Create button. */
#add-promoter .form-sections-footer {
    display: flex;
    justify-content: flex-end;
    padding: var(--sp-md, 12px) var(--sp-xl, 20px) var(--sp-sm, 8px);
    border-top: 1px solid var(--border);
}

#add-promoter .form-sections-footer input[type="submit"] {
    height: var(--h-control, 40px);
    padding: 0 var(--sp-xl, 20px);
    background: var(--arena-orange);
    color: var(--surface);
    border: none;
    border-radius: var(--r-md, 4px);
    font-size: var(--fs-button, 14px);
    font-family: inherit;
    cursor: pointer;
    width: auto;
    max-width: 100%;
    display: inline-block;
}

#add-promoter .form-sections-footer input[type="submit"]:hover {
    background: var(--arena-orange-hover);
}

#add-promoter .form-sections-footer input[type="submit"]:active {
    background: var(--arena-orange-dark);
}

/* Tablet: collapse to a 6-column grid so multi-field rows become 2-up and the
   8/4 (Address/Apt) and span-12 rows still read correctly. */
@media (max-width: 1023px) {
    #add-promoter .promoter-grid {
        grid-template-columns: repeat(6, 1fr);
    }
    /* Re-map spans onto the 6-col track. col-3/col-4/col-6 become 2-up (span 3);
       Address (col-9) and the legacy col-8 both span the full tablet width so
       Apt (col-3) drops cleanly onto its own row with no empty wedge beside it. */
    #add-promoter .promoter-grid .col-3  { grid-column: span 3; }
    #add-promoter .promoter-grid .col-4  { grid-column: span 3; }
    #add-promoter .promoter-grid .col-6  { grid-column: span 3; }
    #add-promoter .promoter-grid .col-8  { grid-column: span 6; }
    #add-promoter .promoter-grid .col-9  { grid-column: span 6; }
    #add-promoter .promoter-grid .col-12 { grid-column: span 6; }
}

/* Phone: single column — everything stacks so nothing shrinks below a readable
   width and the modal never forces horizontal scroll. */
@media (max-width: 719px) {
    #add-promoter .promoter-grid {
        grid-template-columns: 1fr;
    }
    #add-promoter .promoter-grid .col-3,
    #add-promoter .promoter-grid .col-4,
    #add-promoter .promoter-grid .col-6,
    #add-promoter .promoter-grid .col-8,
    #add-promoter .promoter-grid .col-9,
    #add-promoter .promoter-grid .col-12 {
        grid-column: span 1;
    }
}

/* ──────────────────────────────────────────────────────────────────────────
   #660 / #657 — Add Venue modal redesign: single fluid 12-column field grid.
   Replicates the approved #661 Add Promoter pattern. Replaces the rigid
   two-section split (which left a right-column dead-zone and inconsistent field
   widths) with one consistent grid. Every field is individually labeled
   (label-over-input, 11px uppercase caption). No section headers, no divider
   lines. The Mailing Address fields are distinguished by their "Mailing …"
   labels, so the block needs no header of its own (client kept this block).

   ALL rules are scoped under #add-venue (or its children) so they cannot touch
   any other modal or global .field / .row usage. Tokens come from
   assets/css/colors_and_type.css — no raw hex values.

   Layout: CSS Grid, 12 equal columns, 16px gap. Each .field spans N columns via
   .col-N. Desktop rows: 12 | 4·8 | 4·4·4 | 6·6 | 3·3·3·3 | 9·3 | 4·4·4 |
   3·9(check) | 9·3 | 4·4·4 | 3.
   Tablet (≤1023px): collapse to 6 columns (multi-field rows become 2-up).
   Phone  (≤719px):  collapse to 1 column (everything stacks).

   Overflow-safety contract: the grid + every grid child carries `min-width: 0`
   + `box-sizing: border-box` so a long value can never force horizontal page
   scroll; the modal width itself is capped by the .reveal-modal.big rule and
   nothing inside re-introduces a wider min-width.
   ────────────────────────────────────────────────────────────────────────── */

/* Belt-and-braces: never let the modal or its form exceed the viewport, and
   neutralise any inherited min-width that would force horizontal scroll. */
#add-venue,
#add-venue * {
    box-sizing: border-box;
}

#add-venue #addVenue {
    min-width: 0;
    max-width: 100%;
}

/* The single fluid field grid. */
#add-venue .venue-grid {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    column-gap: var(--sp-lg, 16px);
    row-gap: var(--sp-lg, 16px);
    padding: var(--sp-xl, 20px) var(--sp-xl, 20px) var(--sp-lg, 16px);
    min-width: 0;
    max-width: 100%;
}

/* Individual field — flex column (label above input). min-width:0 so a field
   can shrink below its content width instead of widening its grid track. */
#add-venue .venue-grid .field {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    min-width: 0;
    margin: 0;
}

/* 12-column span classes. */
#add-venue .venue-grid .col-3  { grid-column: span 3; }
#add-venue .venue-grid .col-4  { grid-column: span 4; }
#add-venue .venue-grid .col-6  { grid-column: span 6; }
#add-venue .venue-grid .col-8  { grid-column: span 8; }
#add-venue .venue-grid .col-9  { grid-column: span 9; }
#add-venue .venue-grid .col-12 { grid-column: span 12; }

/* Labels: 11px uppercase caption, muted slate. Overrides the global
   #addVenue label rule (inline-block + fixed widths + margins). */
#add-venue .venue-grid .field label {
    display: block;
    font-size: var(--fs-caption, 11px);
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--text-muted);
    width: auto;
    min-width: 0;
    max-width: none;
    min-height: 15px;
    flex: none;
    margin: 0;
}

/* Inputs and selects — 40px control height, hairline border, on-token.
   #1124: background/color split into their own :not(:disabled)-scoped rule
   below — see the matching comment on the Add Promoter block above for why
   (same specificity-collision pattern the original contract-form bug had). */
#add-venue .venue-grid .field input:not([type="checkbox"]),
#add-venue .venue-grid .field select {
    flex: 0 0 auto;
    height: var(--h-control, 40px);
    border: 1px solid var(--border);
    border-radius: var(--r-md, 4px);
    font-family: inherit;
    font-size: var(--fs-body, 13px);
    padding: 0 var(--sp-sm, 8px);
    width: 100%;
    max-width: 100%;
    min-width: 0;
    display: block;
    margin: var(--sp-xs, 4px) 0 0 0;
}
#add-venue .venue-grid .field input:not([type="checkbox"]):not(:disabled),
#add-venue .venue-grid .field select:not(:disabled) {
    background: var(--surface);
    color: var(--text);
}

/* The Category / Country <select>s need explicit appearance reset so the 40px
   height and token padding actually apply (UA selects ignore height otherwise). */
#add-venue .venue-grid .field select {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    line-height: normal;
}

/* Placeholder text in slate, per the design system. */
#add-venue .venue-grid .field input:not([type="checkbox"])::placeholder {
    color: var(--secondary);
    opacity: 1;
}

/* Design-system focus state: info-blue border + soft blue halo. */
#add-venue .venue-grid .field input:not([type="checkbox"]):focus,
#add-venue .venue-grid .field select:focus {
    outline: 2px solid var(--info, #4a90d9);
    outline-offset: 1px;
    border-color: var(--info, #4a90d9);
    box-shadow: 0 0 0 2px var(--focus-ring, rgba(74, 144, 217, 0.2));
}

/* Windows High Contrast Mode: system colors override authored ones, so spell
   the focus indicator with the Highlight system color so it stays visible. */
@media (forced-colors: active) {
    #add-venue .field input:not([type="checkbox"]):focus,
    #add-venue .field select:focus {
        outline: 2px solid Highlight;
    }
}

/* "Is Promoter" inline checkbox cell. The grid .field default is a label-above
   column; for the checkbox we want the real control + its label sitting inline
   on the 40px baseline so it reads like a normal checkbox row, not a caption.
   The checkbox graphic is the global sprite pseudo-element on the label
   (input[type="checkbox"]+label:after), which the markup already triggers; we
   just align the cell and stop the label being rendered as an uppercase caption. */
#add-venue .venue-grid .field.inline-check {
    flex-direction: row;
    align-items: center;
    min-height: var(--h-control, 40px);
    margin-top: var(--sp-md, 12px);
}
#add-venue .venue-grid .field.inline-check label {
    display: inline-flex;
    align-items: center;
    font-size: var(--fs-body, 13px);
    font-weight: 600;
    letter-spacing: normal;
    text-transform: none;
    color: var(--text);
    min-height: 0;
    cursor: pointer;
    margin: 0;
}
/* Sit the sprite checkbox right after the label text (not floated 20px away). */
#add-venue .venue-grid .field.inline-check label:after {
    float: none;
    margin-top: 0;
    margin-left: var(--sp-sm, 8px);
    vertical-align: middle;
}

/* Footer: right-aligned Create button. */
#add-venue .form-sections-footer {
    display: flex;
    justify-content: flex-end;
    padding: var(--sp-md, 12px) var(--sp-xl, 20px) var(--sp-sm, 8px);
    border-top: 1px solid var(--border);
}

#add-venue .form-sections-footer input[type="submit"] {
    height: var(--h-control, 40px);
    padding: 0 var(--sp-xl, 20px);
    background: var(--arena-orange);
    color: var(--surface);
    border: none;
    border-radius: var(--r-md, 4px);
    font-size: var(--fs-button, 14px);
    font-family: inherit;
    cursor: pointer;
    width: auto;
    max-width: 100%;
    display: inline-block;
}

#add-venue .form-sections-footer input[type="submit"]:hover {
    background: var(--arena-orange-hover);
}

#add-venue .form-sections-footer input[type="submit"]:active {
    background: var(--arena-orange-dark);
}

/* Tablet: collapse to a 6-column grid so multi-field rows become 2-up. col-3/
   col-4/col-6 become span 3; col-9/col-8/col-12 span the full tablet width so
   Apt (col-3) drops cleanly onto its own row with no empty wedge beside it. */
@media (max-width: 1023px) {
    #add-venue .venue-grid {
        grid-template-columns: repeat(6, 1fr);
    }
    #add-venue .venue-grid .col-3  { grid-column: span 3; }
    #add-venue .venue-grid .col-4  { grid-column: span 3; }
    #add-venue .venue-grid .col-6  { grid-column: span 6; }
    #add-venue .venue-grid .col-8  { grid-column: span 6; }
    #add-venue .venue-grid .col-9  { grid-column: span 6; }
    #add-venue .venue-grid .col-12 { grid-column: span 6; }
}

/* Phone: single column — everything stacks so nothing shrinks below a readable
   width and the modal never forces horizontal scroll. */
@media (max-width: 719px) {
    #add-venue .venue-grid {
        grid-template-columns: 1fr;
    }
    #add-venue .venue-grid .col-3,
    #add-venue .venue-grid .col-4,
    #add-venue .venue-grid .col-6,
    #add-venue .venue-grid .col-8,
    #add-venue .venue-grid .col-9,
    #add-venue .venue-grid .col-12 {
        grid-column: span 1;
    }
}

/* ──────────────────────────────────────────────────────────────────────────
   #659 / #657 — Add Artist modal redesign: single fluid 12-column field grid.
   Replicates the APPROVED Add Promoter pattern (#661) scoped to #add-artist.
   Replaces the rigid .row/.field/<hr> two-column form so there is no right-column
   dead-zone and every field width is consistent. Every field is individually
   labeled (label-over-input, 11px uppercase caption). No section headers, no
   divider lines. The two special non-field blocks (Riders dropzone, Google
   Calendar status) sit at the END as full-width col-12 rows with their original
   ids/classes intact (artists.js binds to them).

   ALL rules are scoped under #add-artist (or its children) so they cannot
   touch any other modal or global .field / .row usage. Tokens come from
   assets/css/colors_and_type.css — no raw hex values.

   Layout: CSS Grid, 12 equal columns, 16px gap. Each .field spans N columns via
   .col-N. Desktop rows: 12 | 6·6 | 4·4·4 | 6·6 | 3·3·3·3 | … | 9·3 | 4·4·4 | 3.
   Tablet (≤1023px): collapse to 6 columns (multi-field rows become 2-up).
   Phone  (≤719px):  collapse to 1 column (everything stacks).

   Overflow-safety contract: the grid + every grid child carries `min-width: 0`
   + `box-sizing: border-box` so a long value can never force horizontal page
   scroll; the modal width is capped by .reveal-modal.big and nothing inside
   re-introduces a wider min-width.
   ────────────────────────────────────────────────────────────────────────── */

/* Belt-and-braces: never let the modal or its form exceed the viewport, and
   neutralise any inherited min-width that would force horizontal scroll. */
#add-artist,
#add-artist * {
    box-sizing: border-box;
}

#add-artist #addArtist {
    min-width: 0;
    max-width: 100%;
}

/* The single fluid field grid. */
#add-artist .artist-grid {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    column-gap: var(--sp-lg, 16px);
    row-gap: var(--sp-lg, 16px);
    padding: var(--sp-xl, 20px) var(--sp-xl, 20px) var(--sp-lg, 16px);
    min-width: 0;
    max-width: 100%;
}

/* Individual field — flex column (label above input). min-width:0 so a field
   can shrink below its content width instead of widening its grid track. */
#add-artist .artist-grid .field {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    min-width: 0;
    margin: 0;
}

/* 12-column span classes. */
#add-artist .artist-grid .col-3  { grid-column: span 3; }
#add-artist .artist-grid .col-4  { grid-column: span 4; }
#add-artist .artist-grid .col-6  { grid-column: span 6; }
#add-artist .artist-grid .col-8  { grid-column: span 8; }
#add-artist .artist-grid .col-9  { grid-column: span 9; }
#add-artist .artist-grid .col-12 { grid-column: span 12; }

/* Labels: 11px uppercase caption, muted slate. Overrides the global
   #addArtist / .popup label rules (inline-block + fixed widths + margins). */
#add-artist .artist-grid .field label {
    display: block;
    font-size: var(--fs-caption, 11px);
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--text-muted);
    width: auto;
    min-width: 0;
    max-width: none;
    min-height: 15px;
    flex: none;
    margin: 0;
}

/* Inputs, selects and textareas — 40px control height, hairline border, on-token. */
/* #1124: background/color split into their own :not(:disabled)-scoped rule
   below — see the matching comment on the Add Promoter block for why (same
   specificity-collision pattern the original contract-form bug had). */
#add-artist .artist-grid .field input,
#add-artist .artist-grid .field select,
#add-artist .artist-grid .field textarea {
    flex: 0 0 auto;
    height: var(--h-control, 40px);
    border: 1px solid var(--border);
    border-radius: var(--r-md, 4px);
    font-family: inherit;
    font-size: var(--fs-body, 13px);
    padding: 0 var(--sp-sm, 8px);
    width: 100%;
    max-width: 100%;
    min-width: 0;
    display: block;
    margin: var(--sp-xs, 4px) 0 0 0;
}
#add-artist .artist-grid .field input:not(:disabled),
#add-artist .artist-grid .field select:not(:disabled),
#add-artist .artist-grid .field textarea:not(:disabled) {
    background: var(--surface);
    color: var(--text);
}

/* Textareas: taller, with vertical padding and resize affordance. */
#add-artist .artist-grid .field textarea {
    height: auto;
    min-height: 72px;
    padding: var(--sp-sm, 8px);
    resize: vertical;
    line-height: 1.4;
}

/* The Country <select> needs explicit appearance reset so the 40px height and
   token padding actually apply (UA selects ignore height otherwise). */
#add-artist .artist-grid .field select {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    line-height: normal;
}

/* Placeholder text in slate, per the design system. */
#add-artist .artist-grid .field input::placeholder,
#add-artist .artist-grid .field textarea::placeholder {
    color: var(--secondary);
    opacity: 1;
}

/* Design-system focus state: info-blue border + soft blue halo. */
#add-artist .artist-grid .field input:focus,
#add-artist .artist-grid .field select:focus,
#add-artist .artist-grid .field textarea:focus {
    outline: 2px solid var(--info, #4a90d9);
    outline-offset: 1px;
    border-color: var(--info, #4a90d9);
    box-shadow: 0 0 0 2px var(--focus-ring, rgba(74, 144, 217, 0.2));
}

/* Windows High Contrast Mode: system colors override authored ones, so spell
   the focus indicator with the Highlight system color so it stays visible. */
@media (forced-colors: active) {
    #add-artist .field input:focus,
    #add-artist .field select:focus,
    #add-artist .field textarea:focus {
        outline: 2px solid Highlight;
    }
}

/* Inline checkbox row (calendar notifications). Arena renders the visible
   checkbox as a sprite pseudo-element on the label (global rule
   `input[type="checkbox"]+label:after`). The existing global
   `#addArtist .field.inline-checkbox` rules (the form id is still #addArtist)
   already place that sprite inline-right of the label text (#534), so we must
   NOT re-show the raw input as a second visible box here. Keep the field a
   simple block row and let the sprite convention do the work. #846: the old
   `display: none` re-assertion here has been removed — it silently overrode
   the global rule's accessibility fix (position:absolute+clip) back to
   display:none, re-hiding this one checkbox from the accessibility tree. The
   global rule's visually-hidden-but-focusable approach already avoids the
   double-checkbox this comment used to warn about (a naive `display:` re-show
   would draw the raw box next to the sprite; clip-based hiding draws nothing). */
#add-artist .artist-grid .field.inline-checkbox {
    flex-direction: row;
    align-items: center;
    gap: var(--sp-sm, 8px);
}

#add-artist .artist-grid .field.inline-checkbox label {
    text-transform: none;
    letter-spacing: 0;
    font-size: var(--fs-body, 13px);
    font-weight: 400;
    color: var(--text);
    margin: 0;
    min-height: 0;
    flex: 0 0 auto;
}

/* Special full-width blocks (Riders, Google Calendar status). They are not
   part of the balanced field tiling — they keep their own internal markup
   (rider dropzone / calendar buttons styled by the global rules) but get a
   caption-style block label to match the grid rhythm. */
#add-artist .artist-grid .special-block {
    border-top: 1px solid var(--border);
    padding-top: var(--sp-lg, 16px);
    gap: var(--sp-sm, 8px);
}

#add-artist .artist-grid .special-block .block-label {
    display: block;
    font-size: var(--fs-caption, 11px);
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--text-muted);
    margin: 0 0 var(--sp-xs, 4px) 0;
}

/* Calendar-status helper controls inside the special block. */
#add-artist #calendar-status #calendar-rename-name {
    height: var(--h-control, 40px);
    border: 1px solid var(--border);
    border-radius: var(--r-md, 4px);
    background: var(--surface);
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-body, 13px);
    padding: 0 var(--sp-sm, 8px);
    width: 100%;
    max-width: 100%;
    margin: var(--sp-xs, 4px) 0;
}

#add-artist #calendar-status button {
    height: var(--h-control, 40px);
    padding: 0 var(--sp-lg, 16px);
    background: var(--arena-orange);
    color: var(--surface);
    border: none;
    border-radius: var(--r-md, 4px);
    font-size: var(--fs-button, 14px);
    font-family: inherit;
    cursor: pointer;
    margin-top: var(--sp-xs, 4px);
}

#add-artist #calendar-status button:hover {
    background: var(--arena-orange-hover);
}

/* Footer: right-aligned Create button. */
#add-artist .form-sections-footer {
    display: flex;
    justify-content: flex-end;
    padding: var(--sp-md, 12px) var(--sp-xl, 20px) var(--sp-sm, 8px);
    border-top: 1px solid var(--border);
}

#add-artist .form-sections-footer input[type="submit"] {
    height: var(--h-control, 40px);
    padding: 0 var(--sp-xl, 20px);
    background: var(--arena-orange);
    color: var(--surface);
    border: none;
    border-radius: var(--r-md, 4px);
    font-size: var(--fs-button, 14px);
    font-family: inherit;
    cursor: pointer;
    width: auto;
    max-width: 100%;
    display: inline-block;
}

#add-artist .form-sections-footer input[type="submit"]:hover {
    background: var(--arena-orange-hover);
}

#add-artist .form-sections-footer input[type="submit"]:active {
    background: var(--arena-orange-dark);
}

/* Tablet: collapse to a 6-column grid so multi-field rows become 2-up and the
   9/3 (Address/Apt) and span-12 rows still read correctly. */
@media (max-width: 1023px) {
    #add-artist .artist-grid {
        grid-template-columns: repeat(6, 1fr);
    }
    /* Re-map spans onto the 6-col track. col-3/col-4/col-6 become 2-up (span 3);
       Address (col-9) and the legacy col-8 both span the full tablet width so
       Apt (col-3) drops cleanly onto its own row with no empty wedge beside it. */
    #add-artist .artist-grid .col-3  { grid-column: span 3; }
    #add-artist .artist-grid .col-4  { grid-column: span 3; }
    #add-artist .artist-grid .col-6  { grid-column: span 3; }
    #add-artist .artist-grid .col-8  { grid-column: span 6; }
    #add-artist .artist-grid .col-9  { grid-column: span 6; }
    #add-artist .artist-grid .col-12 { grid-column: span 6; }
}

/* Phone: single column — everything stacks so nothing shrinks below a readable
   width and the modal never forces horizontal scroll. */
@media (max-width: 719px) {
    #add-artist .artist-grid {
        grid-template-columns: 1fr;
    }
    #add-artist .artist-grid .col-3,
    #add-artist .artist-grid .col-4,
    #add-artist .artist-grid .col-6,
    #add-artist .artist-grid .col-8,
    #add-artist .artist-grid .col-9,
    #add-artist .artist-grid .col-12 {
        grid-column: span 1;
    }
}

/* ──────────────────────────────────────────────────────────────────────────
   #658 / #657 — Add + Edit Contract forms redesign: single fluid 12-column
   field grid. Replicates the approved #661 Add Promoter / #660 Add Venue /
   #659 Add Artist pattern across BOTH contract surfaces:
     • #add-contract  (Add Contract modal, ~970–1400px reveal)
     • #artistContract (Edit Contract inline dropdown, full page width)
   Per Adam's decision the two are STRUCTURALLY IDENTICAL (same field grid);
   only the render area differs, and the grid adapts to whatever width it is
   given. Replaces the rigid `.row`/`.field.half` flow that produced uneven
   field widths and dead-zones.

   ALL rules are scoped under #add-contract .contract-grid or
   #artistContract .contract-grid (or their children) so they cannot touch any
   other modal or global .field / .row usage. These ID-anchored selectors carry
   higher specificity than the legacy `#addContract .field label` /
   `#artistContractForm label` rules, so they win without !important. Tokens
   come from assets/css/colors_and_type.css — no raw hex values.

   Layout: CSS Grid, 12 equal columns, 16px gap. Each .field spans N columns via
   .col-N. Tablet (≤1023px): collapse to 6 columns. Phone (≤719px): 1 column.

   Overflow-safety contract (the #661 v2 defect fix): the grid + every grid
   child carries `min-width: 0` + `box-sizing: border-box` so a long value can
   never force horizontal scroll.
   ────────────────────────────────────────────────────────────────────────── */

/* Belt-and-braces: never let the form exceed its container, and neutralise any
   inherited min-width that would force horizontal scroll. */
#add-contract .contract-grid,
#add-contract .contract-grid *,
#artistContract .contract-grid,
#artistContract .contract-grid * {
    box-sizing: border-box;
}

/* #658 — the Edit Contract dropdown must FILL the available content width (rail
   edge → viewport right), like the legacy form did. The dropdown is position:fixed;
   the old block `.row` layout filled the width, but `display:grid` shrink-to-fits,
   collapsing the panel to its content width and exposing the contract list behind
   it on the right. Anchor left to the rail and right to the edge so the dropdown
   (and the grid inside it) fill #content at any viewport. Collapsed rail = 64px
   strip (see html.rail-collapsed .rail, ~line 512). Scoped to #artistContract so
   the other .dropdown panels (#taskAttach/#eventAttach/#emailBlastPanel) are untouched. */
@media (min-width: 720px) {
    /* Desktop/tablet only — the rail exists here. At phone (≤719px) the rail is
       replaced by a bottom tab bar (no left rail), so the dropdown keeps its base
       full-screen behaviour; applying left:rail-width there would shove it off-screen. */
    #artistContract.dropdown {
        left: var(--rail-w);
        right: 0;
        width: auto;
    }
    html.rail-collapsed #artistContract.dropdown {
        left: 64px;
    }
}

#add-contract #addContract,
#artistContract #artistContractForm {
    min-width: 0;
    max-width: 100%;
}

/* The single fluid field grid. */
#add-contract .contract-grid,
#artistContract .contract-grid {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    column-gap: var(--sp-lg, 16px);
    row-gap: var(--sp-lg, 16px);
    align-items: start;
    padding: var(--sp-xl, 20px) var(--sp-xl, 20px) var(--sp-lg, 16px);
    min-width: 0;
    max-width: 100%;
}

/* Individual field — flex column (label above input). min-width:0 so a field
   can shrink below its content width instead of widening its grid track. */
#add-contract .contract-grid .field,
#artistContract .contract-grid .field {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    position: relative;
    min-width: 0;
    margin: 0;
    max-width: none;
}

/* 12-column span classes. */
#add-contract .contract-grid .col-2,
#artistContract .contract-grid .col-2  { grid-column: span 2; }
#add-contract .contract-grid .col-3,
#artistContract .contract-grid .col-3  { grid-column: span 3; }
#add-contract .contract-grid .col-4,
#artistContract .contract-grid .col-4  { grid-column: span 4; }
#add-contract .contract-grid .col-5,
#artistContract .contract-grid .col-5  { grid-column: span 5; }
#add-contract .contract-grid .col-6,
#artistContract .contract-grid .col-6  { grid-column: span 6; }
#add-contract .contract-grid .col-8,
#artistContract .contract-grid .col-8  { grid-column: span 8; }
#add-contract .contract-grid .col-9,
#artistContract .contract-grid .col-9  { grid-column: span 9; }
#add-contract .contract-grid .col-12,
#artistContract .contract-grid .col-12 { grid-column: span 12; }

/* Full-width section divider — a hairline that always starts a new grid row.
   grid-column:1/-1 forces it across all tracks so the next field starts fresh. */
#add-contract .contract-grid .grid-divider,
#artistContract .contract-grid .grid-divider {
    grid-column: 1 / -1;
    height: 0;
    margin: var(--sp-xs, 4px) 0;
    border-top: 1px solid var(--border);
}

/* Labels: 11px uppercase caption, muted slate. Overrides the legacy
   #addContract/#artistContractForm label rules (inline-block + fixed widths). */
#add-contract .contract-grid .field label,
#artistContract .contract-grid .field label {
    display: block;
    font-size: var(--fs-caption, 11px);
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--text-muted);
    width: auto;
    min-width: 0;
    max-width: none;
    min-height: 15px;
    flex: none;
    margin: 0;
    line-height: 1.3;
}

/* Inputs, selects, textareas — 40px control height, hairline border, on-token. */
#add-contract .contract-grid .field input:not([type="checkbox"]),
#add-contract .contract-grid .field select,
#artistContract .contract-grid .field input:not([type="checkbox"]),
#artistContract .contract-grid .field select {
    flex: 0 0 auto;
    height: var(--h-control, 40px);
    border: 1px solid var(--border);
    border-radius: var(--r-md, 4px);
    font-family: inherit;
    font-size: var(--fs-body, 13px);
    padding: 0 var(--sp-sm, 8px);
    width: 100%;
    max-width: 100%;
    min-width: 0;
    display: block;
    margin: var(--sp-xs, 4px) 0 0 0;
}

/* select's own background/color — unchanged from before #1124: its selector
   (no [type="checkbox"] attribute part) already has one less specificity
   point than the input selector below, so it already correctly loses to the
   ISSUED/SIGNED readonly-gate's gray rule when disabled — verified live,
   not touched by this fix. */
#add-contract .contract-grid .field select,
#artistContract .contract-grid .field select {
    background: var(--surface);
    color: var(--text);
}

/* #1124: background + text color split out of the rule above into their own,
   :not(:disabled)-scoped rule. The combined rule's `input:not([type="checkbox"])`
   selector has one more specificity point than the ISSUED/SIGNED readonly-gate's
   gray rule (#artistContractForm.contract-issued-readonly .contractField:disabled),
   because of that [type="checkbox"] attribute selector — so a disabled <input>
   incorrectly rendered the white/on-token background AND text color instead of
   the gate's gray/muted ones (<select> has no such extra attribute part, so it
   was never affected). Splitting these two properties into a :not(:disabled)
   rule removes disabled inputs from this rule's match set entirely, rather than
   trying to out-specificity the gate rule — the box-model properties above
   (height, border, padding, layout) are UNCHANGED for disabled inputs, since
   the gate rule never sets them and this rule must keep applying them
   regardless of disabled state. */
#add-contract .contract-grid .field input:not([type="checkbox"]):not(:disabled),
#artistContract .contract-grid .field input:not([type="checkbox"]):not(:disabled) {
    background: var(--surface);
    color: var(--text);
}

#add-contract .contract-grid .field textarea,
#artistContract .contract-grid .field textarea {
    flex: 1 1 auto;
    min-height: 76px;
    border: 1px solid var(--border);
    border-radius: var(--r-md, 4px);
    background: var(--surface);
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-body, 13px);
    padding: var(--sp-sm, 8px);
    width: 100%;
    max-width: 100%;
    min-width: 0;
    display: block;
    margin: var(--sp-xs, 4px) 0 0 0;
    resize: vertical;
}

/* Selects need explicit appearance reset so the 40px height + token padding
   actually apply (UA selects ignore height otherwise). */
#add-contract .contract-grid .field select,
#artistContract .contract-grid .field select {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    line-height: normal;
}

/* Placeholder text in slate, per the design system. */
#add-contract .contract-grid .field input::placeholder,
#add-contract .contract-grid .field textarea::placeholder,
#artistContract .contract-grid .field input::placeholder,
#artistContract .contract-grid .field textarea::placeholder {
    color: var(--secondary);
    opacity: 1;
}

/* Design-system focus state: info-blue border + soft blue halo. */
#add-contract .contract-grid .field input:focus,
#add-contract .contract-grid .field select:focus,
#add-contract .contract-grid .field textarea:focus,
#artistContract .contract-grid .field input:focus,
#artistContract .contract-grid .field select:focus,
#artistContract .contract-grid .field textarea:focus {
    outline: 2px solid var(--info, #4a90d9);
    outline-offset: 1px;
    border-color: var(--info, #4a90d9);
    box-shadow: 0 0 0 2px var(--focus-ring, rgba(74, 144, 217, 0.2));
}

/* Windows High Contrast Mode: system colors override authored ones, so spell
   the focus indicator with the Highlight system color so it stays visible. */
@media (forced-colors: active) {
    #add-contract .contract-grid .field input:focus,
    #add-contract .contract-grid .field select:focus,
    #add-contract .contract-grid .field textarea:focus,
    #artistContract .contract-grid .field input:focus,
    #artistContract .contract-grid .field select:focus,
    #artistContract .contract-grid .field textarea:focus {
        outline: 2px solid Highlight;
    }
}

/* inline-checkbox fields: checkbox + label sit on one baseline (not stacked). */
#add-contract .contract-grid .field.inline-checkbox,
#artistContract .contract-grid .field.inline-checkbox {
    flex-direction: row;
    align-items: center;
    gap: var(--sp-sm, 8px);
    min-height: var(--h-control, 40px);
}
#add-contract .contract-grid .field.inline-checkbox label,
#artistContract .contract-grid .field.inline-checkbox label {
    text-transform: none;
    letter-spacing: 0;
    font-size: var(--fs-body, 13px);
    font-weight: 400;
    color: var(--text);
    margin: 0;
}

/* The removeTime/removeDate "×" affix on timepicker/date fields. Absolutely
   positioned so it sits at the right edge of the 40px input without consuming
   grid width. */
#add-contract .contract-grid .field .removeTime,
#artistContract .contract-grid .field .removeTime {
    position: absolute;
    right: 6px;
    bottom: 0;
    height: var(--h-control, 40px);
    line-height: var(--h-control, 40px);
    color: var(--secondary);
    cursor: pointer;
    font-size: 14px;
}

/* Pricing-tier block: a horizontal sub-grid of the 5 ticket inputs. `.tier`
   stays a DIRECT ancestor of .ticketPrice/.ticketSellable/.ticketComps/
   .ticketQuantity/.ticketTotal (contracts.js depends on this) — each input is
   in a .field wrapper that spans columns inside the tier. */
#add-contract .contract-grid .tier-block,
#artistContract .contract-grid .tier-block {
    display: flex;
    flex-direction: column;
    gap: var(--sp-md, 12px);
    min-width: 0;
}
#add-contract .contract-grid .tier,
#artistContract .contract-grid .tier {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    column-gap: var(--sp-lg, 16px);
    row-gap: var(--sp-sm, 8px);
    min-width: 0;
}
#add-contract .contract-grid .tier .field,
#artistContract .contract-grid .tier .field {
    display: flex;
    flex-direction: column;
    min-width: 0;
    margin: 0;
}
#add-contract .contract-grid .tier .col-2,
#artistContract .contract-grid .tier .col-2 { grid-column: span 2; }
#add-contract .contract-grid .tier .col-3,
#artistContract .contract-grid .tier .col-3 { grid-column: span 3; }

/* The deprecated ticket-price field (Edit only) — only ever shown via JS for
   legacy contracts. Keep it inline above the tiers when visible. */
#artistContract .contract-grid .tier-block .ticketPriceDep {
    margin-bottom: var(--sp-sm, 8px);
}

/* "+ Add Pricing Tier" / "+ Add Venue" action links — orange, inline. */
#add-contract .contract-grid .add-tier-link,
#artistContract .contract-grid .add-tier-link {
    display: inline-block;
    color: var(--arena-orange);
    font-size: var(--fs-body, 13px);
    text-decoration: none;
    margin-top: var(--sp-xs, 4px);
}
#add-contract .contract-grid .add-tier-link:hover,
#artistContract .contract-grid .add-tier-link:hover {
    color: var(--arena-orange-hover);
}

/* The "+ Add Venue" link sits in its own grid cell (Edit only) — right-align
   it within the row. #1150: was col-6 beside the now-removed "Select
   Template" select; now col-12 (its own full row), still right-aligned. */
#artistContract .contract-grid .add-venue-cell {
    justify-content: flex-end;
}

/* Extra-checkbox grid — a tidy auto-fit row of the 8 toggles (not a staircase). */
#add-contract .contract-grid .checkbox-grid,
#artistContract .contract-grid .checkbox-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: var(--sp-sm, 8px) var(--sp-lg, 16px);
    margin-top: var(--sp-xs, 4px);
}
#add-contract .contract-grid .checkbox-grid .extra-option,
#artistContract .contract-grid .checkbox-grid .extra-option {
    display: flex;
    align-items: center;
    gap: var(--sp-sm, 8px);
    min-width: 0;
}
#add-contract .contract-grid .checkbox-grid .extra-option label,
#artistContract .contract-grid .checkbox-grid .extra-option label {
    text-transform: none;
    letter-spacing: 0;
    font-size: var(--fs-body, 13px);
    font-weight: 400;
    color: var(--text);
    margin: 0;
}

/* #658 B: the legacy #656 sprite-alignment override is scoped to #addContract
   only, so on the EDIT form (#artistContract) the FontAwesome checkbox sprite
   (input + label:after) still inherits the global `float:right; margin-left:20px`
   and floats away from its label. Mirror the legacy rule for the Edit form so the
   tick sits inline immediately after the label text. (Add form already covered by
   the #addContract rule near line ~2219.) */
#artistContract .contract-grid .checkbox-grid input[type="checkbox"] + label:after {
    float: none;
    margin: 0 0 0 6px;
    vertical-align: middle;
}
#artistContract .contract-grid .checkbox-grid .extra-option label {
    display: flex;
    align-items: center;
    justify-content: space-between;
}

/* Rider section spans full width and keeps its existing internal layout.
   #1150: .clause-section follows the same full-width/label treatment. */
#add-contract .contract-grid .rider-section,
#artistContract .contract-grid .rider-section,
#add-contract .contract-grid .clause-section,
#artistContract .contract-grid .clause-section {
    min-width: 0;
}
/* Adam UI tweak (root cause): the legacy `#addContract label, ...,
   #artistContractForm label { margin: 10px 15px 0 15px; ... }` rule
   (line ~1957) blanket-applies to every <label> in these forms. .field
   labels already have a higher-specificity override resetting the full
   shorthand (line ~1657, `#addContract .field label { margin: 8px 0 4px
   0; }`) — but .rider-section/.clause-section labels aren't inside
   .field, and this rule previously only overrode margin-bottom (a
   longhand), leaving margin-left/right/top to fall through to the legacy
   rule's 15px/15px/10px. That put BOTH section labels ~15px right of the
   MERCHANDISING label above them. Now sets the full margin shorthand
   (all four sides), matching how .field label's override works, so
   nothing falls through to the legacy rule. */
#add-contract .contract-grid .rider-section > label,
#artistContract .contract-grid .rider-section > label,
#add-contract .contract-grid .clause-section > label,
#artistContract .contract-grid .clause-section > label {
    display: block;
    font-size: var(--fs-caption, 11px);
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--text-muted);
    margin: 0 0 var(--sp-sm, 8px) 0;
}
/* .rider-dropzone/.rider-list-wrapper are SHARED with the artist add/edit
   modal (#addArtist/#editArtist) — see their own #addArtist/#editArtist
   .rider-dropzone display-toggle rules and addArtist.php's markup. Scoped
   (not direct) overrides so only the contract forms' left/right margin is
   reset; the artist modal's copy is untouched, per scope. Longhand-only
   (margin-left/margin-right) so the existing vertical rhythm — top/bottom
   margins set by the base rules — is preserved exactly. */
#add-contract .rider-dropzone,
#artistContract .rider-dropzone,
#add-contract .rider-list-wrapper,
#artistContract .rider-list-wrapper {
    margin-left: 0;
    margin-right: 0;
}

/* Footer: right-aligned Create button (shared with the promoter/venue pattern). */
#add-contract .form-sections-footer,
#artistContract .form-sections-footer {
    display: flex;
    justify-content: flex-end;
    padding: var(--sp-md, 12px) var(--sp-xl, 20px) var(--sp-sm, 8px);
    border-top: 1px solid var(--border);
}
#add-contract .form-sections-footer input[type="submit"],
#artistContract .form-sections-footer input[type="submit"] {
    height: var(--h-control, 40px);
    padding: 0 var(--sp-xl, 20px);
    background: var(--arena-orange);
    color: var(--surface);
    border: none;
    border-radius: var(--r-md, 4px);
    font-size: var(--fs-button, 14px);
    font-family: inherit;
    cursor: pointer;
    width: auto;
    max-width: 100%;
    display: inline-block;
}
#add-contract .form-sections-footer input[type="submit"]:hover,
#artistContract .form-sections-footer input[type="submit"]:hover {
    background: var(--arena-orange-hover);
}
#add-contract .form-sections-footer input[type="submit"]:active,
#artistContract .form-sections-footer input[type="submit"]:active {
    background: var(--arena-orange-dark);
}

/* Tablet: collapse to a 6-column grid so multi-field rows become 2-up. */
@media (max-width: 1023px) {
    #add-contract .contract-grid,
    #artistContract .contract-grid {
        grid-template-columns: repeat(6, 1fr);
    }
    #add-contract .contract-grid .col-2,
    #artistContract .contract-grid .col-2 { grid-column: span 3; }
    #add-contract .contract-grid .col-3,
    #artistContract .contract-grid .col-3 { grid-column: span 3; }
    #add-contract .contract-grid .col-4,
    #artistContract .contract-grid .col-4 { grid-column: span 3; }
    #add-contract .contract-grid .col-5,
    #artistContract .contract-grid .col-5 { grid-column: span 3; }
    #add-contract .contract-grid .col-6,
    #artistContract .contract-grid .col-6 { grid-column: span 3; }
    #add-contract .contract-grid .col-8,
    #artistContract .contract-grid .col-8 { grid-column: span 6; }
    #add-contract .contract-grid .col-9,
    #artistContract .contract-grid .col-9 { grid-column: span 6; }
    #add-contract .contract-grid .col-12,
    #artistContract .contract-grid .col-12 { grid-column: span 6; }
    /* tab-full: force a field to fill the whole 6-track tablet row (used by the
       3rd field of [3,3,6] rows and the leader of [6,3,3] rows so each row tiles
       cleanly with no orphan wedge). Placed AFTER the col-N rules so equal
       specificity resolves in tab-full's favour. Desktop is unaffected — this
       rule only exists inside the ≤1023px query. */
    #add-contract .contract-grid .tab-full,
    #artistContract .contract-grid .tab-full { grid-column: span 6; }
    /* Tier inner grid at tablet: reflow the 5 ticket inputs to clean pairs —
       Price/Sellable (3/3), Comps/Quantity (3/3), Total full-width (6). Total is
       the last .field in the tier, so :last-child fills the trailing row instead
       of leaving an orphaned wedge. */
    #add-contract .contract-grid .tier,
    #artistContract .contract-grid .tier {
        grid-template-columns: repeat(6, 1fr);
    }
    #add-contract .contract-grid .tier .col-2,
    #add-contract .contract-grid .tier .col-3,
    #artistContract .contract-grid .tier .col-2,
    #artistContract .contract-grid .tier .col-3 { grid-column: span 3; }
    #add-contract .contract-grid .tier .field:last-child,
    #artistContract .contract-grid .tier .field:last-child { grid-column: span 6; }
}

/* Phone: single column — everything stacks so nothing shrinks below a readable
   width and the modal never forces horizontal scroll. */
@media (max-width: 719px) {
    #add-contract .contract-grid,
    #artistContract .contract-grid {
        grid-template-columns: 1fr;
    }
    #add-contract .contract-grid .col-2,
    #add-contract .contract-grid .col-3,
    #add-contract .contract-grid .col-4,
    #add-contract .contract-grid .col-5,
    #add-contract .contract-grid .col-6,
    #add-contract .contract-grid .col-8,
    #add-contract .contract-grid .col-9,
    #add-contract .contract-grid .col-12,
    #artistContract .contract-grid .col-2,
    #artistContract .contract-grid .col-3,
    #artistContract .contract-grid .col-4,
    #artistContract .contract-grid .col-5,
    #artistContract .contract-grid .col-6,
    #artistContract .contract-grid .col-8,
    #artistContract .contract-grid .col-9,
    #artistContract .contract-grid .col-12 {
        grid-column: span 1;
    }
    /* Tier inputs stack at phone too. */
    #add-contract .contract-grid .tier,
    #artistContract .contract-grid .tier {
        grid-template-columns: 1fr;
    }
    #add-contract .contract-grid .tier .col-2,
    #add-contract .contract-grid .tier .col-3,
    #artistContract .contract-grid .tier .col-2,
    #artistContract .contract-grid .tier .col-3 {
        grid-column: span 1;
    }
    /* Total (.field:last-child) carries span 6 from the tablet rule; without
       this override its span forces implicit columns that break the 1fr
       single-column stack at phone (#658 mr-verifier catch). */
    #add-contract .contract-grid .tier .field:last-child,
    #artistContract .contract-grid .tier .field:last-child {
        grid-column: span 1;
    }
}

/* ---- #673 — Login env-banner / form overlap fix (short viewports) -----------
   The env banner (DEVELOPMENT/STAGING) renders below the 200px #mainLogo.
   #loginForm uses position:absolute; top:50%; margin-top:-75px, so its top edge
   is (50%vh - 75px). When the viewport height < ~582px that value rises above
   the banner's bottom edge (~216px) and the form floats over the banner.

   Fix: at max-height:580px drop the form's absolute centering and let the logo,
   banner, and form stack in normal document flow (flex column). Scoped to
   body.login-page so the flex rule never reaches the authenticated app chrome
   (.appshell), which relies on block-level body stretch.

   The logo is deliberately left at its natural size and rendering — resizing it
   is out of scope for #673 (the issue is the banner/form overlap only).
   flex-shrink:0 only stops the flex column from crushing the 200px logo box
   (which would crop its centered background); it does not change how the logo
   displays. ----------------------------------------------------------------- */
@media (max-height: 580px) {
    body.login-page {
        display: flex;
        flex-direction: column;
        align-items: center;
        padding: 0;
        margin: 0;
    }
    body.login-page #mainLogo {
        flex-shrink: 0;
    }
    body.login-page #loginForm {
        position: static;
        top: auto;
        left: auto;
        margin-top: 16px;
        margin-left: 0;
    }
}
