/* Shared controls and surfaces. Pages own composition, never redefine these.
   body.andy-ui scopes them to the application and clears legacy theme specificity. */
body.andy-ui .andy-btn {
 display:inline-flex; align-items:center; justify-content:center; gap:var(--as-space-2);
 min-height:var(--as-control-height); max-width:100%; margin:0;
 padding:8px 14px; border:1px solid var(--as-line); border-radius:var(--as-radius);
 background:var(--as-surface); color:var(--as-ink); font-family:inherit;
 font-size:var(--as-text-sm); font-weight:600; line-height:1.4;
 text-decoration:none!important; text-shadow:none; box-shadow:none; cursor:pointer;
 white-space:normal; overflow-wrap:anywhere;
}
body.andy-ui .andy-btn:hover { background:var(--as-hover); }
body.andy-ui .andy-btn--primary,body.andy-ui .andy-btn-primary {
 background:var(--as-blue)!important; border-color:var(--as-blue)!important; color:#fff!important;
}
body.andy-ui .andy-btn--primary:hover,body.andy-ui .andy-btn-primary:hover {
 background:var(--as-blue-hover)!important; border-color:var(--as-blue-hover)!important;
}
body.andy-ui .andy-btn--ghost,body.andy-ui .andy-btn-secondary { background:var(--as-surface); border-color:var(--as-line); color:var(--as-ink)!important; }
body.andy-ui .andy-btn--danger { color:var(--as-danger)!important; border-color:#efb4ad; }
body.andy-ui .andy-btn--danger:hover { background:var(--as-danger-soft); }
body.andy-ui .andy-btn:disabled,body.andy-ui .andy-btn.is-disabled,body.andy-ui .andy-btn[aria-disabled=true] {
 opacity:.55; cursor:not-allowed;
}
body.andy-ui .andy-btn svg { width:16px; height:16px; flex-shrink:0; }
body.andy-ui :is(.andy-btn,.andy-tab,.andy-link,summary):focus-visible {
 outline:2px solid var(--as-blue); outline-offset:3px;
}
body.andy-ui .andy-card {
 min-width:0; margin:0 0 var(--as-space-4); border:1px solid var(--as-line);
 border-radius:var(--as-radius); background:var(--as-surface); box-shadow:none;
}
body.andy-ui .andy-card__head {
 display:flex; align-items:center; justify-content:space-between; gap:var(--as-space-3);
 padding:var(--as-space-3) var(--as-space-4); min-width:0;
}
body.andy-ui .andy-card__head>div { min-width:0; }
body.andy-ui .andy-card__head h3 {
 display:flex; align-items:center; gap:var(--as-space-2); margin:0;
 color:var(--as-ink); font-size:var(--as-text-lg); font-weight:700; line-height:1.4; overflow-wrap:anywhere;
}
body.andy-ui .andy-card__head .andy-panel-sub {
 display:block; padding:0; margin-top:var(--as-space-1); color:var(--as-muted);
 font-size:var(--as-text-sm); line-height:1.5;
}
body.andy-ui .andy-card__body { padding:0 var(--as-space-4) var(--as-space-4); }
body.andy-ui .andy-card__body--tight { padding-bottom:var(--as-space-3); }
body.andy-ui .andy-card__actions { display:flex; align-items:center; flex-wrap:wrap; gap:var(--as-space-2); flex:0 0 auto; }
body.andy-ui .andy-card__head h3 svg { width:16px; height:16px; flex-shrink:0; }
/* Record editors have a bounded reading width and guaranteed body padding. */
body.andy-ui .andy-form-card { width:100%; max-width:var(--as-editor-width); }
body.andy-ui .andy-form-card .andy-form__section+.andy-form__section {
 padding-top:var(--as-space-5); border-top:1px solid var(--as-line-soft);
}
body.andy-ui .andy-form-card .andy-form__section>h4 {
 font-size:var(--as-text-lg); font-weight:600; line-height:1.4;
}
body.andy-ui .andy-form-card .andy-form__actions { gap:var(--as-space-2); }
body.andy-ui .andy-form-card .andy-form__actions .andy-link { margin-left:0; }
body.andy-ui .andy-form__copy { margin:0; padding:0; color:var(--as-muted); font-size:var(--as-text-md); line-height:1.5; overflow-wrap:anywhere; }
body.andy-ui .andy-choice-group { min-width:0; margin:0; padding:0; border:0; display:flex; flex-direction:column; gap:var(--as-space-2); }
body.andy-ui .andy-choice-group>legend { width:auto; padding:0; margin:0 0 var(--as-space-2); border:0; color:var(--as-muted); font-size:var(--as-text-sm); line-height:1.4; font-weight:700; }
body.andy-ui .andy-choice-group>span { display:flex; flex-direction:column; gap:var(--as-space-2); }
body.andy-ui .andy-choice { display:flex; align-items:center; gap:var(--as-space-2); padding:8px 12px; min-height:44px; border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-surface); }
body.andy-ui .andy-choice input[type=radio] { flex:0 0 16px; width:16px; height:16px; min-height:0; margin:0; accent-color:var(--as-blue); }
body.andy-ui .andy-choice label { flex:1; min-width:0; display:flex; align-items:center; min-height:28px; margin:0; font-size:var(--as-text-md); font-weight:500; line-height:1.5; color:var(--as-ink); cursor:pointer; overflow-wrap:anywhere; }
body.andy-ui .andy-choice:has(input:checked) { background:var(--as-selected); border-color:var(--as-blue); }
/* A choice with a title and a supporting line (a suggested goal and its measure). */
body.andy-ui .andy-choice__text { display:flex; flex-direction:column; gap:2px; padding:4px 0; }
body.andy-ui .andy-choice__text small { color:var(--as-muted); font-size:var(--as-text-xs); font-weight:500; line-height:1.4; }
body.andy-ui .andy-choice:focus-within { outline:2px solid var(--as-blue); outline-offset:2px; }
body.andy-ui .andy-choice-group--invalid .andy-choice { border-color:var(--as-danger); }
body.andy-ui .andy-choice-group .errorMessage { color:var(--as-danger); font-size:var(--as-text-xs); }
/* Checkbox lists: compact rows in columns; long lists scroll inside their own region. */
body.andy-ui .andy-check-list>span:not(.andy-field__hint) { display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:2px var(--as-space-4); }
body.andy-ui .andy-check-list--scroll>span:not(.andy-field__hint) { max-height:216px; overflow-y:auto; padding:var(--as-space-2) var(--as-space-3); border:1px solid var(--as-line); border-radius:var(--as-radius); }
body.andy-ui .andy-check { display:flex; align-items:flex-start; gap:var(--as-space-2); min-height:32px; padding:6px 0; }
body.andy-ui .andy-check input[type=checkbox] { flex:0 0 16px; width:16px; height:16px; min-height:0; margin:2px 0 0; accent-color:var(--as-blue); }
body.andy-ui .andy-check label { flex:1; min-width:0; margin:0; color:var(--as-ink); font-size:var(--as-text-md); font-weight:500; line-height:1.45; cursor:pointer; overflow-wrap:anywhere; }
body.andy-ui .andy-check:focus-within { outline:2px solid var(--as-blue); outline-offset:2px; border-radius:2px; }
body.andy-ui .andy-check-list.andy-choice-group--invalid>span:not(.andy-field__hint) { padding:var(--as-space-2) var(--as-space-3); border:1px solid var(--as-danger); border-radius:var(--as-radius); }
@media(max-width:640px) { body.andy-ui .andy-check { min-height:44px; align-items:center; } body.andy-ui .andy-check input[type=checkbox] { margin-top:0; } }
body.andy-ui .andy-tabs {
 display:flex; align-items:center; flex-wrap:wrap; gap:0 var(--as-space-4);
 margin:0 0 var(--as-space-3); border-bottom:1px solid var(--as-line);
}
body.andy-ui .andy-tab {
 display:inline-flex; align-items:center; gap:var(--as-space-1); min-height:var(--as-control-height);
 padding:10px 4px; border-bottom:2px solid transparent;
 font-size:var(--as-text-sm); font-weight:500; line-height:1.4;
 color:var(--as-muted)!important; text-decoration:none!important; white-space:normal;
}
body.andy-ui .andy-tab:hover { color:var(--as-ink)!important; }
body.andy-ui .andy-tab.is-active { color:var(--as-blue)!important; font-weight:700; border-bottom-color:var(--as-blue); }
body.andy-ui .andy-tab.is-soon { color:var(--as-muted)!important; }
body.andy-ui .andy-tab.is-soon em {
 font-size:var(--as-text-xs); font-style:normal; border-radius:var(--as-radius-pill);
 padding:1px 6px; background:var(--as-subtle); color:var(--as-muted);
}
body.andy-ui .andy-page__head { display:flex; align-items:flex-start; justify-content:space-between; gap:var(--as-space-4); margin-bottom:var(--as-space-4); }
body.andy-ui .andy-page__head h1 { margin:0 0 var(--as-space-1); color:var(--as-navy); font-size:var(--as-title); line-height:1.25; font-weight:700; letter-spacing:-.4px; }
body.andy-ui .andy-page__head p { margin:0; color:var(--as-muted); font-size:var(--as-text-md); line-height:1.5; }
body.andy-ui .andy-alert { margin-bottom:var(--as-space-4); padding:var(--as-space-3); border:1px solid var(--as-line); border-left:3px solid var(--as-info); border-radius:var(--as-radius); background:var(--as-info-soft); color:var(--as-info); font-size:var(--as-text-md); line-height:1.5; }
body.andy-ui .andy-alert--success { background:var(--as-success-soft); color:var(--as-success); border-left-color:var(--as-success); }
body.andy-ui .andy-alert--warning { background:var(--as-warning-soft); color:var(--as-warning); border-left-color:var(--as-warning); }
body.andy-ui .andy-alert--danger { background:var(--as-danger-soft); color:var(--as-danger); border-left-color:var(--as-danger); }
/* Status scale: one set of colours for every badge, chip and legacy status class.
   Each tone sets --tone/--tone-soft; shapes read those, so a tone is defined once. */
body.andy-ui :is(.andy-badge,.andy-state,.andy-status) { --tone:var(--as-muted); --tone-soft:var(--as-subtle); }
body.andy-ui :is(.andy-badge--good,.andy-badge--success,.andy-state--good,.andy-status--good) { --tone:var(--as-success); --tone-soft:var(--as-success-soft); }
body.andy-ui :is(.andy-badge--info,.andy-state--info,.andy-status--info) { --tone:var(--as-info); --tone-soft:var(--as-info-soft); }
body.andy-ui :is(.andy-badge--watch,.andy-badge--warning,.andy-state--watch,.andy-status--watch) { --tone:var(--as-warning); --tone-soft:var(--as-warning-soft); }
body.andy-ui :is(.andy-badge--risk,.andy-badge--danger,.andy-state--risk,.andy-status--risk) { --tone:var(--as-danger); --tone-soft:var(--as-danger-soft); }
body.andy-ui .andy-badge--violet { --tone:var(--as-violet); --tone-soft:var(--as-violet-soft); }
body.andy-ui :is(.andy-badge,.andy-state,.andy-status) { background:var(--tone-soft); color:var(--tone); }
body.andy-ui .andy-badge { display:inline-block; max-width:100%; padding:3px 8px; border-radius:var(--as-radius); font-size:var(--as-text-xs); font-weight:600; line-height:1.4; overflow-wrap:anywhere; vertical-align:middle; }
body.andy-ui .andy-badge--dot { display:inline-flex; align-items:center; gap:6px; padding:0; background:none; color:var(--as-ink); font-size:var(--as-text-md); font-weight:500; }
body.andy-ui .andy-badge--dot::before { content:""; flex:0 0 8px; width:8px; height:8px; border-radius:50%; background:var(--tone); }
body.andy-ui .andy-deflist { font-size:var(--as-text-md); line-height:1.5; gap:var(--as-space-3) var(--as-space-4); }
body.andy-ui .andy-deflist dt { color:var(--as-muted); font-weight:500; }
body.andy-ui .andy-deflist dd { color:var(--as-ink); font-weight:500; overflow-wrap:anywhere; }
@media(max-width:640px) { body.andy-ui .andy-page__head { flex-direction:column; } }

/* Page building blocks (rendered by AndyUi, except the filter bar, which wraps ordinary fields). */
body.andy-ui .andy-metrics { display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:var(--as-space-4); margin:0 0 var(--as-space-4); }
body.andy-ui .andy-metric { display:flex; align-items:center; gap:var(--as-space-3); min-width:0; padding:var(--as-space-4); border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-surface); }
body.andy-ui .andy-metric__icon { display:inline-flex; align-items:center; justify-content:center; flex:0 0 44px; width:44px; height:44px; border-radius:var(--as-radius-pill); background:var(--as-info-soft); color:var(--as-blue); }
body.andy-ui .andy-metric--success .andy-metric__icon { background:var(--as-success-soft); color:var(--as-success); }
body.andy-ui .andy-metric--warning .andy-metric__icon { background:var(--as-warning-soft); color:var(--as-warning); }
body.andy-ui .andy-metric--danger .andy-metric__icon { background:var(--as-danger-soft); color:var(--as-danger); }
body.andy-ui .andy-metric--violet .andy-metric__icon { background:var(--as-violet-soft); color:var(--as-violet); }
body.andy-ui .andy-metric--neutral .andy-metric__icon { background:var(--as-subtle); color:var(--as-muted); }
body.andy-ui .andy-metric__text { display:flex; flex-direction:column; gap:2px; min-width:0; }
body.andy-ui .andy-metric__value { color:var(--as-navy); font-size:var(--as-title); font-weight:700; line-height:1.15; letter-spacing:-.4px; overflow-wrap:anywhere; }
body.andy-ui .andy-metric__label { color:var(--as-ink); font-size:var(--as-text-md); font-weight:500; line-height:1.4; }
body.andy-ui .andy-metric__caption { color:var(--as-muted); font-size:var(--as-text-xs); line-height:1.4; }
body.andy-ui .andy-metric__link { display:inline-flex; align-items:center; gap:var(--as-space-1); margin-top:var(--as-space-1); color:var(--as-blue); font-size:var(--as-text-sm); font-weight:600; }

body.andy-ui .andy-filters { display:flex; flex-wrap:wrap; align-items:flex-end; gap:var(--as-space-3) var(--as-space-4); margin:0 0 var(--as-space-4); }
body.andy-ui .andy-filters>.andy-field { flex:1 1 180px; }
body.andy-ui .andy-filters>.andy-filters__search { flex:2 1 260px; }
body.andy-ui .andy-filters__box { position:relative; display:block; }
body.andy-ui .andy-filters__box svg { position:absolute; left:11px; top:50%; transform:translateY(-50%); color:var(--as-muted); pointer-events:none; }
body.andy-ui .andy-filters__box input { padding-left:36px!important; }
body.andy-ui .andy-filters__actions { display:flex; align-items:center; gap:var(--as-space-3); min-height:var(--as-control-height); }
body.andy-ui .andy-filters__actions .andy-link { color:var(--as-blue); font-size:var(--as-text-sm); font-weight:600; }

body.andy-ui .andy-tip-banner { display:flex; align-items:center; flex-wrap:wrap; gap:var(--as-space-3) var(--as-space-4); margin:0 0 var(--as-space-4); padding:var(--as-space-3) var(--as-space-5); border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-info-soft); }
body.andy-ui .andy-tip-banner__icon { display:inline-flex; flex:0 0 auto; color:var(--as-blue); }
body.andy-ui .andy-tip-banner__text { flex:1 1 280px; min-width:0; }
body.andy-ui .andy-tip-banner__text strong { display:block; color:var(--as-ink); font-size:var(--as-text-lg); font-weight:700; line-height:1.4; }
body.andy-ui .andy-tip-banner__text p { margin:0; color:var(--as-ink); font-size:var(--as-text-sm); line-height:1.5; }
body.andy-ui .andy-tip-banner__link { display:inline-flex; align-items:center; gap:var(--as-space-1); color:var(--as-blue); font-size:var(--as-text-sm); font-weight:600; }

body.andy-ui .andy-action-tiles { display:grid; grid-template-columns:repeat(auto-fill,minmax(104px,1fr)); gap:var(--as-space-2); }
body.andy-ui .andy-action-tile { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px; min-height:76px; padding:var(--as-space-3) var(--as-space-2); border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-surface); color:var(--as-ink)!important; font-size:var(--as-text-xs); font-weight:600; line-height:1.3; text-align:center; text-decoration:none!important; overflow-wrap:anywhere; }
body.andy-ui .andy-action-tile svg { color:var(--as-blue); }
body.andy-ui .andy-action-tile:hover { background:var(--as-hover); border-color:var(--as-blue); }
/* List with a summary column. The list keeps at least --summary-list-min; when the workspace cannot
   fit both, the summary wraps below the list at full width. Summaries only: never record details. */
body.andy-ui .andy-with-summary { --summary-list-min:760px; --summary-width:300px; container:andy-summary / inline-size; display:flex; flex-wrap:wrap; align-items:flex-start; gap:var(--as-space-4); }
body.andy-ui .andy-with-summary__main { flex:999 1 var(--summary-list-min); min-width:0; }
body.andy-ui .andy-with-summary__aside { flex:1 1 var(--summary-width); min-width:0; }
/* Too narrow for both side by side (760 + 16 + 300 = 1076px): the summary goes ABOVE the list, its cards in a
   row rather than a tall stack, so the figures are read first and the list is not pushed far down. Browsers
   without container queries keep the plain wrap below. */
@container andy-summary (max-width: 1075px) {
 body.andy-ui .andy-with-summary__aside { order:-1; flex-basis:100%; display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:var(--as-space-4); align-items:start; }
 body.andy-ui .andy-with-summary__aside > .andy-card { margin:0; }
}
body.andy-ui .andy-summary-list { margin:0; padding:0; list-style:none; }
body.andy-ui .andy-summary-list li { display:flex; align-items:center; justify-content:space-between; gap:var(--as-space-3); padding:var(--as-space-2) 0; border-bottom:1px solid var(--as-line-soft); font-size:var(--as-text-md); }
body.andy-ui .andy-summary-list li:last-child { border-bottom:0; }
body.andy-ui .andy-summary-list strong { color:var(--as-ink); font-weight:600; }
body.andy-ui :is(.andy-metric__link,.andy-tip-banner__link,.andy-action-tile):focus-visible { outline:2px solid var(--as-blue); outline-offset:3px; }
@media(max-width:640px) {
 body.andy-ui .andy-filters>.andy-field,body.andy-ui .andy-filters>.andy-filters__search { flex-basis:100%; }
 body.andy-ui .andy-tip-banner { padding:var(--as-space-3) var(--as-space-4); }
 body.andy-ui .andy-metrics { grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--as-space-2); }
 body.andy-ui .andy-metric { flex-direction:column; align-items:flex-start; gap:var(--as-space-2); padding:var(--as-space-3); }
 body.andy-ui .andy-metric__icon { flex-basis:36px; width:36px; height:36px; }
 body.andy-ui .andy-metric__value { font-size:20px; }
}

/* Inline action forms: one to three fields and their button on one row (load a pack, upload a file). */
body.andy-ui .andy-form.andy-form--inline { flex-direction:row; flex-wrap:wrap; align-items:flex-end; gap:var(--as-space-3) var(--as-space-4); }
body.andy-ui .andy-form--inline>.andy-field { flex:1 1 220px; }
body.andy-ui .andy-form--inline>.andy-btn,body.andy-ui .andy-form--inline>.andy-form__inline-actions { flex:0 0 auto; display:flex; align-items:center; gap:var(--as-space-2); }

/* Table editors: rows of inputs edited in place (rating scale, competencies, KPI weights). Every input
   carries an aria-label naming its row and column, because a table cell is not a label. */
body.andy-ui .andy-table-editor { width:100%; border-collapse:collapse; }
body.andy-ui .andy-table-editor th { padding:var(--as-space-2) var(--as-space-3); background:var(--as-subtle); color:var(--as-muted); font-size:var(--as-text-sm); font-weight:700; text-align:left; border-bottom:1px solid var(--as-line); }
body.andy-ui .andy-table-editor td { padding:var(--as-space-2) var(--as-space-3); border-bottom:1px solid var(--as-line-soft); vertical-align:middle; font-size:var(--as-text-md); color:var(--as-ink); }
body.andy-ui .andy-table-editor :is(input[type=text],input[type=number],input[type=date],input[type=time],select) { width:100%; max-width:none; min-height:var(--as-control-height); margin:0; padding:0 10px; border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-surface); color:var(--as-ink); font-size:var(--as-text-md); font-family:inherit; box-shadow:none; }
body.andy-ui .andy-table-editor :is(input,select):focus { border-color:var(--as-blue); outline:0; box-shadow:var(--as-focus); }
body.andy-ui .andy-table-editor .andy-grid__num { width:110px; text-align:right; }
body.andy-ui .andy-table-editor .andy-grid__num input { text-align:right; }
body.andy-ui .andy-table-editor .andy-grid__pick { width:80px; text-align:center; }
body.andy-ui .andy-table-editor input[type=checkbox] { width:18px; height:18px; accent-color:var(--as-danger); }
body.andy-ui .andy-table-editor__scroll { overflow-x:auto; margin:0 0 var(--as-space-2); border:1px solid var(--as-line); border-radius:var(--as-radius); }
body.andy-ui .andy-table-editor__scroll>.andy-table-editor { min-width:560px; }
body.andy-ui .andy-table-editor__scroll>.andy-table-editor tr:last-child td { border-bottom:0; }
@media(max-width:640px) { body.andy-ui .andy-form--inline>.andy-btn { width:100%; } }

/* Searchable selects (andy-combobox.js): a native select with many choices gains a typing box.
   The select stays in the form, hidden, and holds the value; the list is fixed to the window so a
   scrolling table or card cannot clip it. */
body.andy-ui .andy-sr-only { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }
body.andy-ui .andy-combobox { position:relative; display:block; width:100%; min-width:0; }
body.andy-ui .andy-combobox__native { position:absolute!important; width:1px!important; height:1px!important; min-height:0!important; padding:0!important; margin:0!important; overflow:hidden; clip:rect(0,0,0,0); border:0!important; opacity:0; pointer-events:none; }
body.andy-ui .andy-combobox__input { width:100%; min-height:var(--as-control-height); height:auto; margin:0; padding:0 38px 0 11px!important; border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-surface); color:var(--as-ink); font-size:var(--as-text-md); font-family:inherit; line-height:1.35; box-shadow:none; box-sizing:border-box; text-overflow:ellipsis; }
body.andy-ui .andy-combobox__input::placeholder { color:var(--as-muted); }
body.andy-ui .andy-combobox__input:focus { border-color:var(--as-blue); outline:0; box-shadow:var(--as-focus); }
body.andy-ui .andy-combobox__input:disabled { background:#f8fafc; color:var(--as-muted); }
body.andy-ui .andy-combobox__input[aria-invalid=true],body.andy-ui .andy-field--invalid .andy-combobox__input { border-color:var(--as-danger); }
body.andy-ui .andy-combobox__toggle { position:absolute; top:0; right:0; bottom:0; width:36px; display:inline-flex; align-items:center; justify-content:center; margin:0; padding:0; border:0; background:transparent; color:var(--as-muted); cursor:pointer; box-shadow:none; }
body.andy-ui .andy-combobox.is-open .andy-combobox__toggle svg { transform:rotate(180deg); }
body.andy-ui .andy-combobox__list { position:fixed; z-index:var(--as-z-menu); max-height:280px; overflow-y:auto; margin:0; padding:4px 0; list-style:none; border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-surface); box-shadow:var(--as-shadow); }
body.andy-ui .andy-combobox__option { padding:8px 12px; color:var(--as-ink); font-size:var(--as-text-md); line-height:1.4; cursor:pointer; overflow-wrap:anywhere; }
body.andy-ui .andy-combobox__option.is-active { background:var(--as-selected); }
body.andy-ui .andy-combobox__option[aria-selected=true] { font-weight:700; }
body.andy-ui .andy-combobox__option[aria-disabled=true] { color:var(--as-muted); cursor:not-allowed; }
body.andy-ui .andy-combobox__group { padding:8px 12px 4px; color:var(--as-muted); font-size:var(--as-text-xs); font-weight:700; text-transform:uppercase; letter-spacing:.04em; }
body.andy-ui .andy-combobox__note { padding:8px 12px; color:var(--as-muted); font-size:var(--as-text-sm); }
body.andy-ui .andy-table-editor .andy-combobox__input { min-height:var(--as-control-height); }
@media(max-width:640px) { body.andy-ui .andy-combobox__option { padding:12px; } }
/* Long checkbox lists: a filter box above the choices; ticked boxes stay ticked while hidden. */
body.andy-ui .andy-check-filter { display:flex; align-items:center; flex-wrap:wrap; gap:var(--as-space-2) var(--as-space-3); margin:0 0 var(--as-space-2); }
body.andy-ui .andy-check-filter__input { flex:1 1 220px; min-height:var(--as-control-height); margin:0; padding:0 11px; border:1px solid var(--as-line); border-radius:var(--as-radius); background:var(--as-surface); color:var(--as-ink); font-size:var(--as-text-md); font-family:inherit; box-shadow:none; }
body.andy-ui .andy-check-filter__input:focus { border-color:var(--as-blue); outline:0; box-shadow:var(--as-focus); }
body.andy-ui .andy-check-filter__count { color:var(--as-muted); font-size:var(--as-text-xs); }
body.andy-ui .andy-check[hidden] { display:none; }

/* Bound forms: FormHelper + CActiveForm; field2 remains a compatibility alias. */
/* --- a field: label above, control, then an optional hint or error ------------------------- */
.andy-field,.andy-field2{display:flex;flex-direction:column;gap:6px;margin:0;min-width:0;
  font-size:13px;font-weight:600;color:var(--life-ink)}
.andy-field>span,.andy-field2>span,.andy-field>label>span{font-size:12px;font-weight:700;
  letter-spacing:0;text-transform:none;color:var(--life-muted);line-height:1.3}
.andy-field>span .andy-req,.andy-field2>span .andy-req{color:var(--andy-red);margin-left:2px}

/* --- the controls: one height, one padding, one focus ring --------------------------------- */
.andy-field input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=submit]):not([type=button]),
.andy-field2 input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=submit]):not([type=button]),
.andy-field select,.andy-field2 select,.andy-field textarea,.andy-field2 textarea{
  width:100%;min-width:0;height:auto;min-height:var(--as-control-height);margin:0;padding:9px 11px;box-sizing:border-box;
  border:1px solid var(--andy-border);border-radius:var(--as-radius);background:#fff;color:inherit;
  font-size:var(--as-text-md);font-family:inherit;line-height:1.35;box-shadow:none}
.andy-field select,.andy-field2 select{height:var(--as-control-height);padding:0 10px}
.andy-field textarea,.andy-field2 textarea{min-height:84px;resize:vertical;padding:10px 11px}
.andy-field input:focus,.andy-field2 input:focus,.andy-field select:focus,.andy-field2 select:focus,
.andy-field textarea:focus,.andy-field2 textarea:focus{border-color:var(--life-blue);outline:0;
  box-shadow:var(--as-focus)}
.andy-field input::placeholder,.andy-field2 input::placeholder,.andy-field textarea::placeholder{color:var(--as-muted)}
.andy-field input[readonly],.andy-field2 input[readonly],.andy-field input:disabled,.andy-field2 input:disabled,
.andy-field select:disabled,.andy-field2 select:disabled{background:#f8fafc;color:var(--life-muted)}

/* A file input is not a text box: stretching it with 9px padding is what makes an upload
   row look broken. It gets its own dashed treatment so it reads as "choose a file". */
.andy-field input[type=file],.andy-field2 input[type=file]{width:100%;min-width:0;padding:8px 10px;
  border:1px dashed var(--andy-border);border-radius:var(--as-radius);background:#fbfcfe;font-size:12.5px}
.andy-field input[type=file]:hover,.andy-field2 input[type=file]:hover{border-color:var(--life-blue);background:#f7faff}
/* Bootstrap fixes file inputs at 30px; with the field padding that clips the button and file name. */
.andy-field input[type=file],.andy-field2 input[type=file]{height:auto;min-height:var(--as-control-height);line-height:1.4}

/* A checkbox inside a field stays a checkbox: same line as its label, no imposed height. */
.andy-field--inline,.andy-field2--inline{flex-direction:row;align-items:center;gap:9px;flex-wrap:wrap}
.andy-field--inline>span,.andy-field2--inline>span{order:2;font-size:13px;font-weight:600;color:var(--life-ink)}
.andy-field--inline input[type=checkbox],.andy-field--inline input[type=radio],
.andy-field2--inline input[type=checkbox],.andy-field2--inline input[type=radio]{order:1;width:16px;height:16px;
  min-width:16px;min-height:0;margin:0;accent-color:var(--andy-blue)}

/* --- hint under a control, and the message when one is wrong ------------------------------- */
.andy-field__hint{font-size:11.5px;font-weight:500;color:var(--life-muted);line-height:1.45}
.andy-field__error{font-size:11.5px;font-weight:600;color:var(--andy-red);line-height:1.45}
.andy-field--invalid input,.andy-field--invalid select,.andy-field--invalid textarea{border-color:var(--andy-red)}
.andy-field--invalid input:focus,.andy-field--invalid select:focus{border-color:var(--andy-red);box-shadow:0 0 0 3px #fdecee}

/* The framework's own label and error markup — CActiveForm's labelEx() and error(). A screen rendered
   through the form builder must look exactly like one that is not, so the library's output is skinned
   here rather than each screen writing its own label. `required` is the class the builder adds. */
.andy-field>label,.andy-field2>label{font-size:12px;font-weight:700;color:var(--life-muted);line-height:1.3;margin:0}
.andy-field>label .required,.andy-field2>label .required{color:var(--as-danger)}
.andy-field>.andy-field__hint,.andy-field2>.andy-field__hint{font-size:var(--as-text-xs);font-weight:500;color:var(--as-muted);line-height:1.45}
.andy-field--inline>label,.andy-field2--inline>label{order:2;font-size:var(--as-text-md);color:var(--as-ink);font-weight:500}
.andy-field--inline>.andy-field__hint{order:3}
.andy-field--inline>.errorMessage{order:4}

.andy-field .errorMessage,.andy-field2 .errorMessage{font-size:11.5px;font-weight:600;color:var(--andy-red);
  line-height:1.45;margin:0}
.andy-field .errorMessage:empty,.andy-field2 .errorMessage:empty{display:none}

/* --- rows and sections: the grid, and the bar the buttons live in -------------------------- */
.andy-form{display:flex;flex-direction:column;gap:18px}
.andy-form__section{display:flex;flex-direction:column;gap:14px}
.andy-form__section>h4{margin:0;font-size:13px;font-weight:800;color:var(--life-ink)}
.andy-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;align-items:start}
.andy-form-grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}
.andy-form-grid--auto{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
.andy-field--wide{grid-column:1/-1}
.andy-field--half{grid-column:span 1}
.andy-field--grow{flex:1;min-width:0}
.andy-field--grow input{width:100%}
/* The buttons belong to the form, not to a field: their own row, so they inherit neither a field's
   width nor its label gap. This is the bit the old staff form faked with a `--wide` field. */
.andy-form__actions{grid-column:1/-1;display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-top:2px;padding-top:14px;border-top:1px solid var(--life-line-soft)}
.andy-form__actions--end{justify-content:flex-end}
.andy-form__actions .andy-link{margin-left:auto}
.andy-form__actions .andy-link+.andy-link{margin-left:0}


.andy-field select[multiple],.andy-field2 select[multiple]{height:auto;min-height:100px;padding:4px}
@media(max-width:960px){.andy-form-grid--3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:640px){.andy-form-grid,.andy-form-grid--3,.andy-form-grid--auto{grid-template-columns:minmax(0,1fr)}}

/* Comment thread on a result (views/comment/_thread.php; docs/committee-access.md): append-only, oldest first */
body.andy-ui .andy-thread{list-style:none;margin:0 0 var(--as-space-3);padding:0;display:flex;flex-direction:column;gap:var(--as-space-2)}
body.andy-ui .andy-thread__item{border:1px solid var(--as-line);border-radius:var(--as-radius);background:var(--as-surface);padding:var(--as-space-3)}
body.andy-ui .andy-thread__item p{margin:var(--as-space-1) 0 0;color:var(--as-ink);font-size:var(--as-text-md);overflow-wrap:anywhere}
body.andy-ui .andy-thread__meta{display:flex;flex-wrap:wrap;gap:var(--as-space-2);align-items:baseline;font-size:var(--as-text-sm)}
body.andy-ui .andy-thread__item .andy-form--inline{margin-top:var(--as-space-2)}
body.andy-ui .andy-thread__result{border-top:1px solid var(--as-line-soft);padding:var(--as-space-3) 0}
body.andy-ui .andy-thread__result:first-of-type{border-top:0;padding-top:0}
body.andy-ui .andy-thread__result > summary{cursor:pointer;font-weight:600;color:var(--as-ink);font-size:var(--as-text-md);padding:var(--as-space-1) 0}
body.andy-ui .andy-thread__result[open] > summary{margin-bottom:var(--as-space-2)}
