/* 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 (main-list, tr.G/G2,
 * #top2, .navbar, ...; 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-group-bg: #dde7f2;     /* list group divider row - was tr.G3 mint green */
	--cui-group-bg-alt: #eef3f9; /* nested group divider row - was tr.G4 mint green */
	--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; }

/* section header rows in form/list tables */
tr.G > td, tr.G2 > td {
	background-color: var(--cui-head-bg) !important;
	color: var(--cui-body-color) !important;
	font-weight: 600;
	border-bottom: 2px solid var(--cui-card-border) !important;
}

/* Group divider rows *inside* a list - "ORDER : CUSTOM FIELDS" and friends.
   stradaV6Core paints these mint green (#afd3c2 / #D0FCE6), the last legacy
   color left in the list tables. Recoloured into the steel-blue accent family
   and given the accent text so they still read as a break in the rows, but a
   step quieter than the .G/.G2 column header above them. td.G3/td.G4 included
   because some pages put the class on the cell instead of the row. */
tr.G3 > td, td.G3 {
	background-color: var(--cui-group-bg) !important;
	color: var(--cui-link-hover) !important;
	font-weight: 700;
	letter-spacing: .4px;
	border-top: 1px solid var(--cui-card-border) !important;
	border-bottom: 1px solid var(--cui-card-border) !important;
}
tr.G4 > td, td.G4 {
	background-color: var(--cui-group-bg-alt) !important;
	color: var(--cui-link-hover) !important;
	font-weight: 700;
	letter-spacing: .4px;
	border-top: 1px solid var(--cui-card-border) !important;
	border-bottom: 1px solid var(--cui-card-border) !important;
}

/* 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 ---------- */
/* Structural base for main-list lives HERE, not only in stradaV6Core: the legacy file
   defines width/padding/colors for main-list in selectors shared with FMtable, so a page
   on the new template alone (stradaV6Core removed) lost all table structure (seen on
   library/folder/private, 2026-08-19). Same values the legacy file used - pages render
   identically whether or not stradaV6Core is loaded. */
table.main-list { width: 98%; margin-left: 1%; margin-right: 1%; border-collapse: collapse; }
table.main-list td, table.main-list th {
	padding: 6px;
	vertical-align: top;
	color: var(--cui-body-color);
	text-decoration: none;
}
table.main-list { background-color: var(--sv-card, #fff); }
table.main-list td { border-color: var(--sv-line, #ebedef); }
/* Action-icon cell: a list cell whose only element is an icon link (the edit
   pencil / trash in a list's first column) gets its glyph centred instead of
   sitting against the left padding. No page markup needed.
   :only-child is what keeps this narrow - a cell mixing an input with picker
   icons (e.g. kitSheet projectMapping) has several element children, so it does
   not match and keeps its normal left alignment. svg included because Font
   Awesome in SVG+JS mode replaces the <i>. :has is already relied on in
   mobile/dialogForm.css. */
table.main-list td:has(> a:only-child > i.fa:only-child),
table.main-list td:has(> a:only-child > svg.fa:only-child),
table.main-list td:has(> i.fa:only-child),
table.main-list td:has(> svg.fa:only-child) {
	text-align: center;
	white-space: nowrap;
}
/* G3/G4 excluded alongside G/G2: a group divider is a header, so it must not
   light up on hover like a data row. */
table.main-list tr:not(.G):not(.G2):not(.G3):not(.G4):hover td { background-color: rgba(0, 0, 21, 0.04); }

/* ---------- 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 */
.blockUI.blockMsg.blockPage .fa-spin {
	color: 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, TABLE.FMtable2 { 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 NYCDMV 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);
}

/* ---------- 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);
	}
}
