/* coreuiTheme.css - StradaBeta experimental re-skin
 *
 * A THEME LAYER, not a template adoption: applies CoreUI's visual language
 * (https://coreui.io, MIT) - palette, type, card/table/button treatment - onto
 * strada's existing markup conventions. No template JS/CSS is imported; every
 * rule below targets selectors strada already emits (#top2, .navbar, form
 * controls, .flex-header, ...; caption bars are Bootstrap-native via the formCaption
 * tag since 2026-08 and need no rules here). Loaded LAST from
 * template/header.inc so it
 * overrides stradaV6 without touching any page.
 *
 * To try a different template later: replace this file (and nothing else).
 * To kill the experiment: remove the <link> in template/header.inc.
 */

:root {
	/* CoreUI free-template tokens */
	--cui-primary: #321fdb;
	--cui-primary-hover: #2819ae;
	--cui-body-color: #2c384a;
	--cui-body-bg: #f5f6f8;
	--cui-card-border: #d8dbe0;
	--cui-head-bg: #f0f1f5;
	--cui-input-border: #b1b7c1;
	--cui-topbar: #2c384a;   /* CoreUI sidebar/header dark blue-gray */
	--cui-menubar: #2c384a;  /* one shade darker for the nav strip */ 
	--cui-btn-bg: #36454f;      /* charcoal grey buttons, white text */
	--cui-btn-hover: #26323a;
	--cui-link: #2f6fb2;        /* steel blue: stands out, sits in the slate family */
	--cui-link-hover: #245a94;

	/* shared mobile styles accent (overrides the strada blue set in header.inc);
	   same steel-blue family as links so headers + links share one accent */
	--panel-title-color: var(--cui-link);
	--panel-title-border: #c9daed;
}

/* ---------- base ---------- */
body {
	/* sv tokens: dark-ready pages repaint the page ground; light resolves to the
	   sv light page grey (matches the old cui grey) */
	background-color: var(--sv-page, var(--cui-body-bg)) !important;
	color: var(--sv-ink, var(--cui-body-color));
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
		"Helvetica Neue", Arial, sans-serif;
	/* explicit base: legacy font-sizes are commented out of stradaV6Core, so
	   without this everything would fall back to an unmanaged browser default.
	   14px (not the 16px web default): this is a dense enterprise app whose tables
	   and forms were laid out for the old ~12-14px sizing, so 16px read as oversized. */
	font-size: 14px;
}

a { color: var(--cui-link); text-decoration: none; font-weight: 600; }
a:hover { color: var(--cui-link-hover); text-decoration: underline; }
/* Icon links (fa folder/lock/pencil/trash etc.) wrap only a glyph; the hover
   underline above then renders as a stray line by the icon. Suppress it on any
   link containing a Font Awesome icon - SVG+JS mode emits <svg class="svg-inline--fa">,
   plain CSS mode emits <i class="fa">. */
a:has(i.fa):hover, a:has(svg.svg-inline--fa):hover { text-decoration: none; }
/* menus keep their normal weight - the semibold is for content links */
nav.navbar a, .navbar .dropdown-menu a { font-weight: normal; }
/* tabs are navigation too: drop the semibold and hold them at the body size
   (the a{} rule above would otherwise make ui-tabs-anchor 600) */
.ui-tabs .ui-tabs-nav li a { font-weight: normal; font-size: 14px; }

/* ---------- headings ---------- */
/* Standard browser heading scale (16px-root defaults). Absolute px on purpose:
   the 14px body base above would otherwise shrink the whole ramp via em. */
h1 { font-size: 36px; } 
h2 { font-size: 32px; }
h3 { font-size: 24px; }
h4 { font-size: 20px; }
h5 { font-size: 18px; }
h6 { font-size: 16px; }
 
/* jQuery UI's base theme bumps top-level widgets to 1.1em; normalize to the body
   size so widgets match surrounding text. 14px explicitly (not 1rem): 1rem is the
   16px root, so 1rem would leave widgets a step larger than the 14px body. */
.ui-widget { font-size: 14px; }

/* ---------- top band + menu strip ---------- */
/* Black band -> CoreUI dark blue-gray; the strada logo GIF is drawn for a dark
   background, so the band stays dark on purpose. */
#top2, #top2 td { background-color: var(--cui-topbar) !important; }
#TopMenu1 i { color: #fff !important; opacity: .82; }
#TopMenu1 a:hover i { opacity: 1; }
/* Toolbar icons use fa-2x in markup (2em); FA's only smaller step is fa-xl
   (1.5em), which reads too small. Sized here so it is one tweakable number
   instead of ~8 class edits.
   clamp() rather than a fixed size: #TopMenu1 is inline flow with &nbsp;&nbsp;
   between the anchors, so on a phone the row breaks and the last icons drop to a
   second line. Scaling with the viewport keeps all of them on one line - capped at
   the desktop 28px, floored at 16px so they stay tappable. white-space:nowrap
   stops a break sneaking in between an anchor and its separator. */
#TopMenu1 { white-space: nowrap; }
#TopMenu1 i, #TopMenu1 svg { font-size: clamp(16px, 4.2vw, 28px); }

nav.navbar.bg-dark { background-color: var(--cui-menubar) !important; }

/* collapse/expand chevrons: one accent site-wide - their colors are inline
   and inconsistent across pages, so !important unifies them. svg included:
   Font Awesome (SVG+JS mode) copies the inline color onto the <svg>. */
i.fa-chevron-circle-down, i.fa-chevron-circle-right,
i.fa-chevron-circle-up, i.fa-chevron-circle-left,
svg.fa-chevron-circle-down, svg.fa-chevron-circle-right,
svg.fa-chevron-circle-up, svg.fa-chevron-circle-left {
	color: var(--cui-link) !important;
}

/* dropdown menus (and nested submenus) match the nav strip instead of the
   legacy solid black; hover becomes a soft highlight in the same family */
.navbar .dropdown-menu { background-color: var(--cui-menubar); border-color: rgba(255, 255, 255, 0.15); }
/* Navbar sits one step above the 14px body: keep the top-level headings and the
   dropdown items both at 16px so the menu reads as its own band. nav-links would
   otherwise inherit the 14px body, so set them explicitly too. */
.navbar .nav-link { font-size: 16px; }
.navbar .dropdown-item { font-size: 16px; }
.navbar .dropdown-menu > li > a:hover {
	background-color: rgba(255, 255, 255, 0.12);
	background-image: none;
	color: #fff;
}

/* (the phone toolbar-icon size used to live here as a flat 1.5em; the clamp() above
   now covers every width, and repeating it inside a media query would just win the
   specificity tie and undo the scaling) */

/* ---------- page card (pageTop wrapper) ---------- */
/* inline-styled gray rounded box -> white CoreUI card (needs !important to
   beat the inline style) */
#wrap > div.notranslate {
	background-color: var(--sv-card, #fff) !important; /* sv token: dark-ready pages repaint */
	border: 1px solid var(--cui-card-border) !important;
	border-radius: 8px !important;
	box-shadow: 0 1px 2px rgba(0, 0, 21, 0.08);
}

/* ---------- payment status badges (case Fees tab and friends) ----------
   Green = the fee is covered by payments, red = amount due with no/partial payment.
   Tints sit with the CoreUI look; nothing on zero-amount fees keeps them quiet. */
.pay-badge {
	display: inline-block;
	padding: 1px 8px;
	border-radius: 10px;
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.02em;
	vertical-align: middle;
	font-style: normal;
}
.pay-badge-paid { background-color: var(--sv-ok-fill, #DCF3E3); color: var(--sv-ok, #14683C); border: 1px solid var(--sv-ok, #A8DDBC); }
.pay-badge-due  { background-color: var(--sv-err-fill, #FBE3E4); color: var(--sv-err, #A02128); border: 1px solid var(--sv-danger-line, #F1B6BA); }
/* icon-only variants (e.g. next to a payments amount box):
   paid = green check, partial = orange half-circle, due = red alert */
.pay-icon-paid    { color: var(--sv-ok, #1E9E57); vertical-align: middle; }
.pay-icon-partial { color: var(--sv-warn, #D97A08); vertical-align: middle; }
.pay-icon-due     { color: var(--sv-err, #C8353C); vertical-align: middle; }

/* tr.G/G2/G3/G4 band rules retired 2026-09-05 - pages use sv-table-title / sv-table-head /
   th[scope] (svTheme); stored BPM form HTML is covered by svTheme's .db-html shim. */

/* Report-page header/footer bands (.flex-header / .flex-footer, used by
   report.jsp and the /report/includes layouts). stradaV6Core paints these
   #9accff - the legacy strada blue, the same value the old tr.G rows used before
   the theme recoloured them. .flex-header was missed at the time, so it is the
   last of that blue still on screen. Matched to tr.G/.G2 above so a report
   header reads the same as every other section header.
   Loaded after stradaV6Core, so the plain class selector already wins; the
   !important guards only against the legacy rule gaining specificity later. */
.flex-header, .flex-footer {
	/* sv tokens first: the cui values are light-only and left report headers
	   light in dark mode */
	background-color: var(--sv-fill, var(--cui-head-bg)) !important;
	color: var(--sv-ink, var(--cui-body-color)) !important;
	border-bottom: 1px solid var(--sv-line, var(--cui-card-border)) !important;
}

/* ---------- criteria search panels (.criteria-flex, from mobile.css) ---------- */
/* Equal-height panels: mobile.css uses align-items:flex-start, so a short panel
   (e.g. Filters) stays shorter than a tall one (Task). stretch makes side-by-side
   panels match the tallest. div.criteria-flex outranks the shared rule on
   specificity so load order doesn't matter. */
div.criteria-flex { align-items: stretch; }
/* Criteria label column is now owned by mobile.css (post-merge: 165px default +
   .wide-labels opt-in at 200px). An earlier 130px override lived here and, since
   this file loads last, it beat mobile.css's 165px and forced longer labels
   ("Contract Number :") to wrap. Removed so mobile.css's wider column wins. */
/* Action row (Search/Add): a direct child of .criteria-flex, not a panel, so it
   wraps to its own full-width line below both panels and centers across the whole
   form instead of hugging one panel. flex:1 1 100% forces the wrap line. */
.criteria-flex .criteria-actions { flex: 1 1 100%; text-align: center; margin-top: 2px; }
/* Keep every criteria row as label-beside-input at all widths. mobile.css leaves
   .form-group as flex-wrap:wrap with non-shrinkable inputs (flex:0 0 auto), so a
   wider input - a size=20 field, or an fg-compact fill - that can't fit beside the
   165px label wraps BELOW it, stranding the label alone on its line (reads as
   centred/misaligned) and letting loose icon <a>s drop to the far left. Force the
   row to stay on one line and let the input give up width instead; this is the
   alignment mobile.css's own comment intends (labels wrap inside their cell, every
   control starts at the same x). Icons stay fixed; the label keeps its column. */
.criteria-flex .search-panel .form-group { flex-wrap: nowrap; }
.criteria-flex .search-panel .form-group input,
.criteria-flex .search-panel .form-group select,
.criteria-flex .search-panel .form-group textarea { min-width: 0; flex-shrink: 1; }
.criteria-flex .search-panel .form-group > a { flex: 0 0 auto; }

/* Dialog-form captions (the "Name :" / "Title :" text before the value) are
   their own element; bold them so the label reads as the key. 600 matches the
   theme's other emphasis (tr.G section rows); bump to 700 for heavier. */
.sv-label { font-weight: 600; }
/* The .sv-label column is a fixed 120px (sized for the 14px base); at 16px the
   longer captions ("Report Level / User :", "Supervisor/Manager :") exceed it
   and wrap to a second line. On desktop, widen the column and stop wrapping so
   they stay on one line; short labels just get more right-aligned gap. Desktop
   only (min-width 769px) so the phone rule's 96px column + .sv-short caption is
   left untouched. */
@media (min-width: 769px) {
	.sv-label { flex-basis: 160px; white-space: nowrap; }
}

/* ---------- lists ---------- */
/* main-list structural base removed 2026-09-05: no page emits main-list any more (all lists are
   .sv-table, painted in svTheme); the stored BPM forms that still do are handled by svTheme's
   .db-html shim. */

/* ---------- buttons ---------- */
/* :not(.ui-button-icon-only) - jQuery UI icon-only buttons (notably the dialog
   titlebar close X) are a bare frame around a 16px sprite; our filled-pill border
   + padding disrupt that and swallow the X. Exclude them so they keep native
   styling and the close icon shows. Text .ui-buttons (dialog OK/Cancel) still theme. */
input[type='submit'], input[type='button'], input[type='reset'], button.ui-button:not(.ui-button-icon-only) {
	background-color: var(--cui-btn-bg);
	/* jQuery UI .ui-button carries a light gradient PNG as background-image; our
	   background-color alone leaves it on top, so the button reads light with our
	   white text on it (invisible). Clear it so the dark fill actually shows. */
	background-image: none;
	border: 1px solid var(--cui-btn-bg);
	color: #fff;
	border-radius: 4px;
	padding: 3px 12px;
	cursor: pointer;
	/* legacy pages center rows via big line-heights (e.g. ribs action-table's
	   60px) which display:inherit buttons would inherit - keep buttons normal */
	line-height: normal;
}
input[type='submit']:hover, input[type='button']:hover, input[type='reset']:hover, button.ui-button:not(.ui-button-icon-only):hover {
	background-color: var(--cui-btn-hover);
	background-image: none;
	border-color: var(--cui-btn-hover);
	color: #fff;
}

/* ---------- "Processing..." popup (jQuery BlockUI) ---------- */
/* BlockUI (strada.js showProgressBar) draws a plain bordered box via inline
   styles; !important is required to beat them. Scoped to .blockPage so only the
   full-page processing overlay is restyled, not element-level blocks. Turns it
   into a centered CoreUI card; also tames the <h1> which the heading scale now
   renders at 36px. */
.blockUI.blockOverlay {
	background-color: var(--cui-topbar) !important;
	opacity: .45 !important;
}
.blockUI.blockMsg.blockPage {
	width: auto !important;
	max-width: 320px !important;
	left: 50% !important;
	top: 50% !important;
	transform: translate(-50%, -50%) !important;
	border: none !important;
	border-radius: 12px !important;
	background-color: var(--sv-card, #fff) !important;
	box-shadow: 0 12px 40px rgba(0, 0, 21, .28) !important;
	padding: 22px 30px !important;
	cursor: default !important;
}
.blockUI.blockMsg.blockPage h1 {
	margin: 0 !important;
	font-size: 18px !important;
	font-weight: 600 !important;
	/* sv-ink first (same pattern as the search-panel values): the card behind is
	   token-dark in dark mode and --cui-body-color is a light-only literal */
	color: var(--sv-ink-strong, var(--cui-body-color)) !important;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	white-space: nowrap;
}
/* spinner in the accent (FA SVG mode fills with currentColor); a touch larger
   than the fa-sm markup so it balances the 18px text. sv-accent first, same
   pattern as the h1 above: cui-link is a light-only literal that disappears
   against the token-dark card, sv-accent goes bright in dark mode */
.blockUI.blockMsg.blockPage .fa-spin {
	color: var(--sv-accent, var(--cui-link)) !important;
	font-size: 20px;
}

/* ---------- reference lookup popups (.message-dialog-modal dialogs) ---------- */
/* EVERY jQuery UI dialog gets this chrome (2026-08-27; was :has(.message-dialog-modal)
   picker-only - the reference popup is now the template for all pop-ups). Scoped
   under .sv-theme (dialogs attach to body, which carries the class), which also
   outranks page-local dialog CSS like the BPM designer's. Turns the dated
   grey/blue dialog into a clean CoreUI card. */
.sv-theme .ui-dialog {
	border: 1px solid var(--cui-card-border);
	border-radius: 12px;
	box-shadow: 0 12px 40px rgba(0, 0, 21, .28);
	overflow: hidden;
	padding: 0;
}
/* titlebar: the app's own nav slate, so the popup reads as a distinct object
   against the page instead of white-on-white. background shorthand clears the
   jQuery UI gradient sprite. */
.sv-theme .ui-dialog .ui-dialog-titlebar {
	background: var(--cui-topbar);
	color: #fff;
	border: 0;
	border-radius: 0;
	padding: 10px 14px;
}
.sv-theme .ui-dialog .ui-dialog-title { font-weight: 600; }
/* Close control: jQuery UI paints the X from a grey sprite in a bordered frame,
   which disappears on the dark bar. Draw the glyph instead - no image dependency,
   scales with the 44px touch target the mobile stylesheet sets, and the frame
   goes away so it reads as a bare X. */
.sv-theme .ui-dialog .ui-dialog-titlebar-close {
	background: none;
	border: 0;
}
.sv-theme .ui-dialog .ui-dialog-titlebar-close .ui-icon { display: none; }
.sv-theme .ui-dialog .ui-dialog-titlebar-close::after {
	content: '\00d7';
	position: absolute;
	top: 0; right: 0; bottom: 0; left: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 26px;
	line-height: 1;
	/* ink, not #fff: svTheme repainted this titlebar card-white, so a hard white
	   glyph vanished in light mode. Ink tracks the titlebar text in both modes. */
	color: var(--sv-ink, #1e293b);
}
/* Second header dropped on phones: the titlebar already names the dialog, so the
   band below it is a duplicate costing ~40px on the screen that can least afford
   it. Hidden, never deleted - strada.js calls
   getElementById('reference_header').textContent unguarded, so removing the
   markup would throw.
   Phone-only, NOT everywhere, because which dialog owns the live caption differs
   per app. That getElementById only ever reaches the FIRST #reference_header in
   the document. In strada/ribs/StradaBeta that is the location dialog's, so the
   simple and drill bands are frozen on their static markup text and lose nothing.
   In vision the flex location dialog is commented out of ajaxReference.inc, so
   the simple dialog's band IS the one receiving the caption - hiding it at all
   widths would delete working text there. */
@media (max-width: 768px) {
	#reference_simple_dialog > .flex-header,
	#reference_drill_dialog > .flex-header { display: none; }
}
/* tighter than the 10px/20px stradaV6Core gives every .flex-main child - these
   are dialog rows, not report cells */
.message-dialog-modal.flex-main > :not(.flex-header, .flex-footer, .flex-extend) {
	padding: 6px 14px;
}
/* content card: retire the greenish rgb(248,255,251) fill. Every .flex-main,
   not just the lookup dialogs this rule started with - stradaV6Core paints the
   report criteria card (report.jsp) and the kit sheet (tmobile/kitSheet) the
   same mint. FMtable2 carries the identical #f8fffb. White like the other
   content cards on the grey body. */
/* sv tokens so the report criteria card follows dark mode - the literal #fff
   kept reports light while their fields flipped dark */
.flex-main { background-color: var(--sv-card, #fff); color: var(--sv-ink, var(--cui-body-color)); }
/* inputs read normally; labels stay bold (flex-main sets font-weight:bold) */
.message-dialog-modal select, .message-dialog-modal input { font-weight: normal; }
/* section bar (#reference_header etc.): no override here - the global
   .flex-header/.flex-footer rule above recolours it to the theme grey, matching
   report headers and the .G/.G2 section rows for one consistent header look. */
/* buttonpane: clean divider above Assign / Cancel */
.sv-theme .ui-dialog .ui-dialog-buttonpane {
	border-top: 1px solid var(--sv-line, var(--cui-card-border));
	background: var(--sv-card, #fff);
}

/* ---------- form controls ---------- */
/* Shared chrome for every text-like control + select + textarea. box-sizing so
   the height rule below is the outer box (matches how legacy sized things).
   input:not([type]) (2026-08-27): ~200 legacy inputs omit the type attribute -
   they ARE text inputs but escaped every [type='text'] selector and rendered
   with raw UA borders (smartswap personalization). [hidden] ones are display:none
   anyway. */
input[type='text'], input[type='password'], input[type='email'],
input[type='time'], input[type='date'], input:not([type]), select, textarea {
	border: 1px solid var(--cui-input-border);
	border-radius: 4px;
	padding: 4px 8px;
	background-color: var(--sv-card, #fff);
	color: var(--sv-ink-strong, var(--cui-body-color));
	box-sizing: border-box;
	/* legacy pages set big row line-heights (e.g. ribs action-table's 60px);
	   without this the input inherits that and the typed text sits low in the
	   field. Same fix already applied to buttons. */
	line-height: normal;
}
input[type='text']:focus, input[type='password']:focus, input[type='email']:focus,
input:not([type]):focus, select:focus, textarea:focus {
	outline: none;
	border-color: var(--sv-accent, rgb(44, 56, 74));
	box-shadow: 0 0 0 3px rgba(44, 56, 74, 0.15);
}
input[readonly] { background-color: var(--sv-fill, #ebedef); }

/* Uniform height: dropdowns, text inputs and date fields all render at one
   height so they line up in a row (also overrides legacy stradaV6Core's
   select height:25px, which clipped at the 16px base). Excludes textarea
   (multiline) and multi-selects (their height = row count). */
input[type='text'], input[type='password'], input[type='email'],
input[type='time'], input[type='date'], input:not([type]) { height: 28px; }
/* Selects size to content (never clip) with a floor matching the inputs. A hard
   28px is too short for 16px text once borders are subtracted, so the glyph
   clips; height:auto lets the box grow to the line while min-height keeps it
   aligned with the 28px inputs. Uses the shared 4px/8px padding, centered
   natively. */
select:not([multiple]), input[type="file"] { height: auto; min-height: 28px; }

/* ---------- Caption vs value: let the value carry the weight ----------------
   With the trailing colons gone (house style, 2026-08-17) a caption and a plain-text
   value beside it are the same ink at the same weight, separated only by a column gap -
   "Project    RIBS" reads as two equal words rather than a label and its content.

   The fix is on the CAPTION, not the value, because the value usually has no element to
   style: these rows are written `<label>Project</label>${formBean.to.name}` - a bare EL
   text node. Muting the caption a step and letting the value keep the full body ink
   gives the pair a clear hierarchy without touching a single JSP, and it works for every
   value shape at once: bare text, <b> wrapped, a JS-filled <div>, or an input.

   The tones are the theme's own: --cui-body-color (#2c384a) stays on values, captions
   drop to the muted grey CoreUI uses for secondary text. Weight 600 keeps the caption
   legible at the lower contrast and reinforces "this is the name of the thing". Inputs
   are unaffected - a readonly input already has its own grey field to sit in.

   To revert: delete this block. */
.criteria-flex .search-panel .form-group > label:not(.inline-label),
.sv-row > .sv-label {
	color: var(--sv-label, #6b7a8d);
	font-weight: 600;
}
/* A value the page DID wrap (<b>, <span>, a JS-filled div) should not be shouted twice -
   it keeps body ink, and any bold it carries now reads as emphasis against a muted
   caption rather than competing with one. */
.criteria-flex .search-panel .form-group > b,
.criteria-flex .search-panel .form-group > span:not(.badge),
.criteria-flex .search-panel .form-group > div {
	/* sv-ink first: --cui-body-color is a LIGHT-ONLY literal, and these display
	   values rendered dark-on-dark once the panels went token-dark */
	color: var(--sv-ink, var(--cui-body-color));
}

/* ---------- Disabled checkboxes / radios: readable, not invisible ----------
   A disabled checkbox is drawn by the browser in a pale grey that all but vanishes on a
   white card, and a disabled CHECKED one is the worst case: a light grey tick inside a
   light grey box. That matters here because several read-only panels use disabled boxes
   to REPORT state rather than to collect it - the RIBS case NY DMV registration flags
   (Reg Expired, Suspended, Revoked ...) are a status list the user has to be able to
   read at a glance.

   Rendering is taken over with appearance:none for the disabled state only, because
   nothing else is reliable: the UA paints disabled controls its own way, and opacity /
   filter / accent-color are honoured inconsistently across Chrome, Firefox and Safari.
   Interactive (enabled) boxes keep native rendering untouched, so focus rings, keyboard
   behaviour and platform look are unaffected - and a disabled control has no interaction
   to break.

   The checked mark is a background SVG rather than a ::before, since pseudo-elements on
   input elements are not dependable outside Chrome. 13px matches the native box closely
   enough to sit level with enabled boxes in the same column.

   To revert the experiment: delete this block. */
input[type='checkbox']:disabled,
input[type='radio']:disabled {
	-webkit-appearance: none;
	appearance: none;
	width: 13px;
	height: 13px;
	margin: 0 3px 0 0;
	vertical-align: middle;
	box-sizing: border-box;
	border: 1px solid var(--sv-line-strong, #8a99ab);
	background-color: var(--sv-fill, #f0f2f5);
	opacity: 1;                     /* beat any UA/theme fading */
	cursor: not-allowed;
}
input[type='radio']:disabled { border-radius: 50%; }
input[type='checkbox']:disabled { border-radius: 3px; }

/* Checked + disabled: the state a read-only panel is actually reporting. Tinted box,
   firm border and a dark tick, so "ticked" reads from across the room while still
   looking inert rather than clickable. */
input[type='checkbox']:disabled:checked {
	border-color: var(--sv-accent, #2c384a);
	background-color: var(--sv-accent-chip, #d7e2ee);
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%232c384a' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round' d='M3 8.5l3.2 3.2L13 5'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 11px 11px;
}
input[type='radio']:disabled:checked {
	border-color: var(--sv-accent, #2c384a);
	background-color: var(--sv-card, #fff);
	background-image: radial-gradient(#2c384a 0, #2c384a 3px, transparent 3.5px);
}

/* Dark mode: the tick above is a background SVG with its stroke baked in as #2c384a, a dark
   navy chosen against the LIGHT chip. In dark mode --sv-accent-chip is #204464, so that tick
   was dark navy on dark blue - about 1.2:1, invisible in practice. The NY DMV status flags
   were unreadable there (Dennis, 2026-08-31).

   Inverted rather than just relightened: the box fills with the accent and the tick goes
   near-black, which both fixes the contrast (~8:1) and makes a ticked flag read as a filled
   chip instead of an outline - the "stand out more" part. The soft ring adds prominence
   without changing the 13px footprint, so these still sit level with enabled boxes in the
   same column.

   Scoped to .sv-dark-ready, the same opt-in container the dark tokens themselves use. Gating
   on html[data-sv-dark] alone was wrong: dark mode only repaints marked containers, so on a
   page that stays light while the toggle is on, the tokens would still be the LIGHT palette
   and this rule would fill the box with the light accent (#00539a) and put a near-black tick
   on it - worse than what it replaced.

   Radios get the same treatment; their mark is a gradient, so only the colour stops change. */
html[data-sv-dark] .sv-dark-ready input[type='checkbox']:disabled:checked {
	border-color: var(--sv-accent-strong, #7cbcec);
	background-color: var(--sv-accent, #58a6e0);
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%230d1b26' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round' d='M3 8.5l3.2 3.2L13 5'/%3E%3C/svg%3E");
	box-shadow: 0 0 0 2px rgba(88, 166, 224, 0.30);
}
html[data-sv-dark] .sv-dark-ready input[type='radio']:disabled:checked {
	border-color: var(--sv-accent-strong, #7cbcec);
	background-color: var(--sv-accent, #58a6e0);
	background-image: radial-gradient(#0d1b26 0, #0d1b26 3px, transparent 3.5px);
	box-shadow: 0 0 0 2px rgba(88, 166, 224, 0.30);
}

/* ---------- Bootstrap button accent (login page + any BS buttons) ---------- */
.btn-primary {
	background-color: var(--cui-btn-bg);
	border-color: var(--cui-btn-bg);
	color: #fff;
}
.btn-primary:hover, .btn-primary:focus, .btn-primary:active {
	background-color: var(--cui-btn-hover);
	border-color: var(--cui-btn-hover);
	color: #fff;
}
.btn-link { color: var(--cui-link); }

/* ---------- login (welcome.jsp) ---------- */
/* CoreUI-style sign-in card: white, bordered, centered; sits over the splash
   image on desktop. On phones the splash/overlay classes are removed by the
   page's own JS, so the card floats on the plain light background. */
.form-signin {
	background-color: #fff;
	border: 1px solid var(--cui-card-border);
	border-radius: 8px;
	box-shadow: 0 4px 16px rgba(0, 0, 21, 0.18);
	padding: 2rem 1.75rem;
	width: 100%;
	max-width: 400px;
	margin: 8vh auto 0;
}
@media (max-width: 700px) {
	body#login-placement { background-color: var(--cui-body-bg) !important; }
	.form-signin {
		margin: 3vh auto 0;
		max-width: 94vw;
		box-shadow: 0 1px 4px rgba(0, 0, 21, 0.1);
	}
}
