/* Minification failed. Returning unminified contents.
(6,10): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,28): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,86): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,103): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,123): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,143): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,162): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,180): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,198): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,214): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,230): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,248): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,271): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,293): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,315): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,337): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,359): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,381): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,403): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,425): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,447): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,469): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,490): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,513): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,534): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,552): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,573): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,593): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,612): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,630): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,658): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,689): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,716): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,741): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,768): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,794): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,821): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,844): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,871): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,892): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,921): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,950): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1151): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1250): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1339): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1387): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1412): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1438): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1464): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1488): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1506): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1528): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1552): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1578): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1629): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1657): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1687): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1716): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1743): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1771): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1801): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1825): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1855): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,1879): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,2053): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-font-family'
(6,2090): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-font-size'
(6,2127): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-font-weight'
(6,2166): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-line-height'
(6,2199): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-color'
(6,2231): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-text-align'
(6,2274): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-bg'
(6,3502): run-time error CSS1039: Token not allowed after unary operator: '-bs-highlight-bg'
(6,3645): run-time error CSS1039: Token not allowed after unary operator: '-bs-link-color'
(6,3706): run-time error CSS1039: Token not allowed after unary operator: '-bs-link-hover-color'
(6,3858): run-time error CSS1039: Token not allowed after unary operator: '-bs-font-monospace'
(6,4065): run-time error CSS1039: Token not allowed after unary operator: '-bs-code-color'
(6,4180): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-bg'
(6,4215): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-color'
(6,7682): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-color'
(6,7970): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,7991): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,8042): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-x'
(6,8085): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-x'
(6,8625): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,8646): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,8716): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-y'
(6,8760): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-x'
(6,8803): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-x'
(6,8889): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-x'
(6,8932): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-x'
(6,8968): run-time error CSS1039: Token not allowed after unary operator: '-bs-gutter-y'
(6,10144): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10171): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10198): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10231): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10264): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10296): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10328): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10358): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10388): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10420): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10452): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,10482): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,11817): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,11850): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,11883): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,11922): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,11961): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,11999): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,12037): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,12073): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,12109): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,12147): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,12185): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,12221): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13557): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13590): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13623): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13662): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13701): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13739): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13777): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13813): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13849): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13887): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13925): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,13961): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15297): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15330): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15363): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15402): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15441): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15479): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15517): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15553): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15589): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15627): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15665): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,15701): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17038): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17071): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17104): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17143): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17182): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17220): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17258): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17294): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17330): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17368): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17406): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,17442): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,18814): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,18849): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,18884): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,18925): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,18966): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19006): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19046): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19084): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19122): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19162): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19202): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19240): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19267): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19305): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19331): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19378): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19411): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19457): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19499): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19544): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19584): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19628): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,19710): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,19764): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,19855): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-bg'
(6,19928): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-accent-bg'
(6,20416): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20475): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-striped-color'
(6,20555): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20614): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-striped-color'
(6,20653): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20711): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-active-color'
(6,20765): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20822): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-hover-color'
(6,20860): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20882): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20904): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20936): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20966): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,20996): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21025): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21054): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21082): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21121): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,21156): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,21197): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21219): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21241): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21273): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21303): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21333): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21362): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21391): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21419): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21458): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,21493): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,21532): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21554): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21576): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21608): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21638): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21668): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21697): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21726): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21754): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21793): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,21828): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,21864): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21886): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21908): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21940): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,21970): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22000): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22029): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22058): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22086): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22125): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,22160): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,22199): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22221): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22243): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22275): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22305): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22335): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22364): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22393): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22421): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22460): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,22495): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,22533): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22555): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22577): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22609): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22639): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22669): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22698): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22727): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22755): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22794): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,22829): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,22866): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22888): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22910): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22942): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,22972): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23002): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23031): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23060): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23088): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23127): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,23162): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,23198): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23220): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23242): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23274): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23304): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23334): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23363): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23392): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23420): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,23459): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-color'
(6,23494): run-time error CSS1039: Token not allowed after unary operator: '-bs-table-border-color'
(6,46069): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46096): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46124): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46147): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46171): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46196): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46221): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46244): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46268): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46294): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46328): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46360): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46400): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46491): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46522): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,46637): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-padding-y'
(6,46661): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-padding-x'
(6,46697): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-font-family'
(6,46733): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-font-size'
(6,46769): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-font-weight'
(6,46807): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-line-height'
(6,46839): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-color'
(6,47006): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-border-width'
(6,47039): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-border-color'
(6,47080): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-border-radius'
(6,47125): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-bg'
(6,47346): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-color'
(6,47389): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-bg'
(6,47425): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-border-color'
(6,47486): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-color'
(6,47523): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-bg'
(6,47553): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-border-color'
(6,47605): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-color'
(6,47648): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-bg'
(6,47684): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-border-color'
(6,47738): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-focus-box-shadow'
(6,47812): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-border-color'
(6,47866): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-focus-box-shadow'
(6,48002): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-active-color'
(6,48046): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-active-bg'
(6,48083): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-active-border-color'
(6,48297): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-focus-box-shadow'
(6,48385): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-disabled-color'
(6,48451): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-disabled-bg'
(6,48490): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-disabled-border-color'
(6,48534): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-disabled-opacity'
(6,48573): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48593): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48613): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48643): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48669): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48695): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48731): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48768): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48795): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48822): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48859): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48919): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48948): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,48977): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49031): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49051): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49071): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49101): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49127): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49153): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49189): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49227): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49254): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49281): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49318): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49378): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49407): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49436): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49488): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49508): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49528): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49558): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49584): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49610): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49646): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49683): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49710): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49737): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49774): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49834): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49863): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49892): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49941): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49961): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,49981): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50011): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50037): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50063): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50099): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50136): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50163): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50190): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50227): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50287): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50316): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50345): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50397): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50417): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50437): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50467): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50493): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50519): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50555): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50591): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50618): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50645): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50682): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50742): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50771): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50800): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50851): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50871): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50891): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50921): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50947): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,50973): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51009): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51045): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51072): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51099): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51136): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51196): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51225): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51254): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51304): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51324): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51344): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51374): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51400): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51426): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51462): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51500): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51527): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51554): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51591): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51651): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51680): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51709): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51758): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51778): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51798): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51828): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51854): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51880): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51916): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51951): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,51978): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52005): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52042): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52102): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52131): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52160): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52220): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52243): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52273): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52299): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52325): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52361): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52398): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52425): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52452): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52489): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52549): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52581): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52614): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52653): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52695): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52718): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52748): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52774): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52800): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52836): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52874): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52901): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52928): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,52965): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53025): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53057): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53090): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53129): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53169): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53192): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53222): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53248): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53274): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53310): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53346): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53373): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53400): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53437): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53497): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53529): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53562): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53601): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53638): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53661): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53691): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53717): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53743): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53779): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53816): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53843): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53870): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53907): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53967): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,53999): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54032): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54071): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54111): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54134): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54164): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54190): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54216): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54252): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54288): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54315): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54342): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54379): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54439): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54471): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54504): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54543): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54582): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54605): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54635): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54661): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54687): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54723): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54759): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54786): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54813): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54850): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54910): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54942): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,54975): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55014): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55052): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55075): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55105): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55131): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55157): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55193): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55231): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55258): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55285): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55322): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55382): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55414): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55447): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55486): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55523): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55546): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55576): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55602): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55628): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55664): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55699): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55726): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55753): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55790): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55850): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55882): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55915): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55954): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,55983): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56008): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56044): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56068): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56102): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56150): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56190): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56239): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56280): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56312): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56355): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56380): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56478): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-color'
(6,56520): run-time error CSS1039: Token not allowed after unary operator: '-bs-btn-hover-color'
(6,56568): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56594): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56618): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56645): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56702): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56729): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56755): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,56783): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57663): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57689): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57719): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57745): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57776): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57806): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57835): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57863): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57885): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57947): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,57984): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58015): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58070): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58130): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58168): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58227): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58260): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58299): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58335): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58372): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58409): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58451): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58485): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58522): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58557): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58593): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,58662): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-zindex'
(6,58711): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-min-width'
(6,58748): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-padding-y'
(6,58777): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-padding-x'
(6,58825): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-font-size'
(6,58860): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-color'
(6,58934): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-bg'
(6,58991): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-border-width'
(6,59029): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-border-color'
(6,59075): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-border-radius'
(6,59166): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-spacer'
(6,59208): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,59302): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,59422): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,59522): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,59646): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,59746): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,59870): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,59970): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,60095): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,60195): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,60321): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,60423): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,60591): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-spacer'
(6,60975): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-spacer'
(6,61414): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-spacer'
(6,61943): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-divider-margin-y'
(6,62018): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-divider-bg'
(6,62106): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-item-padding-y'
(6,62140): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-item-padding-x'
(6,62207): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-link-color'
(6,62382): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-link-hover-color'
(6,62435): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-link-hover-bg'
(6,62518): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-link-active-color'
(6,62593): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-link-active-bg'
(6,62681): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-link-disabled-color'
(6,62842): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-header-padding-y'
(6,62878): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-header-padding-x'
(6,62954): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-header-color'
(6,63047): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-item-padding-y'
(6,63081): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-item-padding-x'
(6,63121): run-time error CSS1039: Token not allowed after unary operator: '-bs-dropdown-link-color'
(6,63166): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63194): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63219): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63281): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63308): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63341): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63377): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63437): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63491): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63528): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63565): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,63607): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,65845): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,65874): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,65905): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,65933): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,65974): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66027): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66176): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-padding-y'
(6,66205): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-padding-x'
(6,66244): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-font-size'
(6,66285): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-font-weight'
(6,66322): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-color'
(6,66570): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-hover-color'
(6,66626): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-disabled-color'
(6,66700): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66731): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66766): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66803): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66865): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66905): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,66939): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,67018): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-border-width'
(6,67056): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-border-color'
(6,67132): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-border-width'
(6,67187): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-border-width'
(6,67260): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-border-radius'
(6,67317): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-border-radius'
(6,67433): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-link-hover-border-color'
(6,67540): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-disabled-color'
(6,67696): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-link-active-color'
(6,67750): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-link-active-bg'
(6,67797): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-link-active-border-color'
(6,67887): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-tabs-border-width'
(6,67977): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68015): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68053): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68155): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-pills-border-radius'
(6,68225): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-link-disabled-color'
(6,68374): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-pills-link-active-color'
(6,68429): run-time error CSS1039: Token not allowed after unary operator: '-bs-nav-pills-link-active-bg'
(6,68779): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68803): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68832): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68870): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68913): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,68959): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69003): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69041): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69075): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69111): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69154): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69203): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69241): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69279): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69317): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69355): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69619): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69671): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69714): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69754): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,69922): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-padding-y'
(6,69949): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-padding-x'
(6,70237): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-brand-padding-y'
(6,70285): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-brand-padding-y'
(6,70331): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-brand-margin-end'
(6,70375): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-brand-font-size'
(6,70414): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-brand-color'
(6,70529): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-brand-hover-color'
(6,70571): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,70597): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,70628): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,70656): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,70699): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,70754): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,70965): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-active-color'
(6,71096): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-color'
(6,71182): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-active-color'
(6,71300): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-padding-y'
(6,71335): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-padding-x'
(6,71380): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-font-size'
(6,71435): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-color'
(6,71494): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-width'
(6,71523): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-border-color'
(6,71575): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-border-radius'
(6,71625): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-transition'
(6,71846): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-focus-width'
(6,71989): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-toggler-icon-bg'
(6,72128): run-time error CSS1039: Token not allowed after unary operator: '-bs-scroll-height'
(6,72426): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,72475): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,73340): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,73389): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,74254): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,74303): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,75169): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,75218): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,76088): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,76137): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,76971): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,77020): run-time error CSS1039: Token not allowed after unary operator: '-bs-navbar-nav-link-padding-x'
(6,77621): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,77665): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,77715): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,77768): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,77798): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,77827): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,77862): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,77920): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78196): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78220): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78244): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78276): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78303): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78361): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78394): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78417): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78468): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78499): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78528): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78565): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78587): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78606): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78624): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78642): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78677): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,78785): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-height'
(6,78845): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-bg'
(6,78897): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-border-width'
(6,78931): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-border-color'
(6,78973): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-border-radius'
(6,79171): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,79230): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,79343): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,79404): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,79547): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-spacer-y'
(6,79571): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-spacer-x'
(6,79601): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-color'
(6,79648): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-title-spacer-y'
(6,79715): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-title-spacer-y'
(6,79834): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-spacer-x'
(6,79879): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-y'
(6,79908): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-x'
(6,79959): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-color'
(6,80001): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-bg'
(6,80037): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-border-width'
(6,80071): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-border-color'
(6,80138): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,80173): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,80233): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-y'
(6,80262): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-x'
(6,80297): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-color'
(6,80339): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-bg'
(6,80372): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-border-width'
(6,80406): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-border-color'
(6,80476): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,80511): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,80588): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-x'
(6,80642): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-y'
(6,80695): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-x'
(6,80793): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-bg'
(6,80831): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-bg'
(6,80892): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-x'
(6,80945): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-cap-padding-x'
(6,81049): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-img-overlay-padding'
(6,81098): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,81232): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,81291): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,81380): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,81441): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-inner-border-radius'
(6,81508): run-time error CSS1039: Token not allowed after unary operator: '-bs-card-group-margin'
(6,82395): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82424): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82447): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82617): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82668): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82700): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82738): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82794): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82831): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82865): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82898): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,82943): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83239): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83277): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83327): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83389): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83692): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83738): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83813): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83851): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83886): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,83922): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,84047): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-padding-y'
(6,84081): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-padding-x'
(6,84136): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-color'
(6,84199): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-bg'
(6,84283): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-transition'
(6,84428): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-active-color'
(6,84478): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-active-bg'
(6,84537): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-width'
(6,84573): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-color'
(6,84664): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-active-icon'
(6,84710): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-icon-transform'
(6,84794): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-icon-width'
(6,84836): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-icon-width'
(6,84916): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-icon'
(6,84989): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-icon-width'
(6,85035): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-icon-transition'
(6,85237): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-focus-border-color'
(6,85301): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-btn-focus-box-shadow'
(6,85398): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-color'
(6,85441): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-bg'
(6,85471): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-width'
(6,85510): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-color'
(6,85596): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-radius'
(6,85654): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-radius'
(6,85759): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-inner-border-radius'
(6,85823): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-inner-border-radius'
(6,85968): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-radius'
(6,86028): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-radius'
(6,86146): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-inner-border-radius'
(6,86212): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-inner-border-radius'
(6,86328): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-radius'
(6,86388): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-border-radius'
(6,86446): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-body-padding-y'
(6,86481): run-time error CSS1039: Token not allowed after unary operator: '-bs-accordion-body-padding-x'
(6,86899): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,86927): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,86955): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,86990): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87011): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87043): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87081): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87119): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87202): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-padding-y'
(6,87233): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-padding-x'
(6,87278): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-margin-bottom'
(6,87323): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-font-size'
(6,87387): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-bg'
(6,87425): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-border-radius'
(6,87507): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-item-padding-x'
(6,87610): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-item-padding-x'
(6,87652): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-divider-color'
(6,87695): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-divider'
(6,87759): run-time error CSS1039: Token not allowed after unary operator: '-bs-breadcrumb-item-active-color'
(6,87805): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87839): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87874): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87905): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87948): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,87972): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88005): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88042): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88081): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88136): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88169): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88212): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88267): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88300): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88372): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88406): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88440): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88484): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88523): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88556): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,88702): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-padding-y'
(6,88733): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-padding-x'
(6,88774): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-font-size'
(6,88811): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-color'
(6,88876): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-bg'
(6,88907): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-border-width'
(6,88947): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-border-color'
(6,89207): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-hover-color'
(6,89257): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-hover-bg'
(6,89300): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-hover-border-color'
(6,89373): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-focus-color'
(6,89423): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-focus-bg'
(6,89474): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-focus-box-shadow'
(6,89565): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-active-color'
(6,89616): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-active-bg'
(6,89660): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-active-border-color'
(6,89748): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-disabled-color'
(6,89821): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-disabled-bg'
(6,89867): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-disabled-border-color'
(6,90024): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-border-radius'
(6,90085): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-border-radius'
(6,90177): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-border-radius'
(6,90239): run-time error CSS1039: Token not allowed after unary operator: '-bs-pagination-border-radius'
(6,90284): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90317): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90351): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90385): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90437): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90470): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90504): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90539): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90584): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90612): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90640): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90668): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90695): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90717): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,90785): run-time error CSS1039: Token not allowed after unary operator: '-bs-badge-padding-y'
(6,90811): run-time error CSS1039: Token not allowed after unary operator: '-bs-badge-padding-x'
(6,90847): run-time error CSS1039: Token not allowed after unary operator: '-bs-badge-font-size'
(6,90885): run-time error CSS1039: Token not allowed after unary operator: '-bs-badge-font-weight'
(6,90933): run-time error CSS1039: Token not allowed after unary operator: '-bs-badge-color'
(6,91030): run-time error CSS1039: Token not allowed after unary operator: '-bs-badge-border-radius'
(6,91127): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91153): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91179): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91205): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91235): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91260): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91296): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91353): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91418): run-time error CSS1039: Token not allowed after unary operator: '-bs-alert-padding-y'
(6,91444): run-time error CSS1039: Token not allowed after unary operator: '-bs-alert-padding-x'
(6,91484): run-time error CSS1039: Token not allowed after unary operator: '-bs-alert-margin-bottom'
(6,91520): run-time error CSS1039: Token not allowed after unary operator: '-bs-alert-color'
(6,91559): run-time error CSS1039: Token not allowed after unary operator: '-bs-alert-bg'
(6,91585): run-time error CSS1039: Token not allowed after unary operator: '-bs-alert-border'
(6,91622): run-time error CSS1039: Token not allowed after unary operator: '-bs-alert-border-radius'
(6,91850): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91875): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91897): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,91987): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92012): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92034): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92124): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92149): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92171): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92256): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92281): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92303): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92388): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92413): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92435): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92522): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92547): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92569): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92654): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92679): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92701): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92784): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92809): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92831): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,92974): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93000): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93032): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93057): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93094): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93156): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93185): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93214): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,93284): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-height'
(6,93336): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-font-size'
(6,93382): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-bg'
(6,93418): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-border-radius'
(6,93545): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-bar-color'
(6,93628): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-bar-bg'
(6,93665): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-bar-transition'
(6,93985): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-height'
(6,94011): run-time error CSS1039: Token not allowed after unary operator: '-bs-progress-height'
(6,94195): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94225): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94249): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94299): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94332): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94371): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94407): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94445): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94482): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94525): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94565): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94609): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94650): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94689): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94722): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94756): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94790): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,94919): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,95167): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-action-color'
(6,95296): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-action-hover-color'
(6,95374): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-action-hover-bg'
(6,95448): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-action-active-color'
(6,95506): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-action-active-bg'
(6,95601): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-item-padding-y'
(6,95637): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-item-padding-x'
(6,95679): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-color'
(6,95744): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-bg'
(6,95775): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,95815): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-color'
(6,96096): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-disabled-color'
(6,96169): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-disabled-bg'
(6,96242): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-active-color'
(6,96293): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-active-bg'
(6,96337): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-active-border-color'
(6,96493): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,96545): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,96716): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,96870): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,97067): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,97207): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,97260): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,97462): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,97619): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,97822): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,97965): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,98018): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,98221): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,98378): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,98581): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,98724): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,98777): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,98980): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,99137): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,99340): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,99483): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,99536): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,99740): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,99897): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,100100): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,100243): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,100296): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,100502): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,100660): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-radius'
(6,100865): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,101009): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,101062): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,101183): run-time error CSS1039: Token not allowed after unary operator: '-bs-list-group-border-width'
(6,104688): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104711): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104740): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104768): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104794): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104821): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104851): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104870): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104910): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104938): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,104997): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,105031): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,105087): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,105119): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,105166): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,105228): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-max-width'
(6,105279): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-font-size'
(6,105311): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-color'
(6,105370): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-bg'
(6,105424): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-width'
(6,105459): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-color'
(6,105499): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-box-shadow'
(6,105540): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-radius'
(6,105638): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,105692): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-zindex'
(6,105866): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-spacing'
(6,105944): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-padding-y'
(6,105970): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-padding-x'
(6,106002): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-header-color'
(6,106048): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-header-bg'
(6,106116): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-width'
(6,106151): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-header-border-color'
(6,106215): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-radius'
(6,106247): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-width'
(6,106306): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-radius'
(6,106338): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-border-width'
(6,106417): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-padding-x'
(6,106456): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-padding-x'
(6,106502): run-time error CSS1039: Token not allowed after unary operator: '-bs-toast-padding-x'
(6,106551): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106574): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106597): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106621): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106646): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106665): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106684): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106743): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106771): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106803): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106865): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106915): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106948): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,106981): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107017): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107071): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107106): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107139): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107168): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107191): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107245): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,107321): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-zindex'
(6,107474): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-margin'
(6,107829): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-margin'
(6,108060): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-margin'
(6,108173): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-color'
(6,108232): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-bg'
(6,108286): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-border-width'
(6,108321): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-border-color'
(6,108364): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-border-radius'
(6,108415): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,108441): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,108463): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,108530): run-time error CSS1039: Token not allowed after unary operator: '-bs-backdrop-zindex'
(6,108598): run-time error CSS1039: Token not allowed after unary operator: '-bs-backdrop-bg'
(6,108680): run-time error CSS1039: Token not allowed after unary operator: '-bs-backdrop-opacity'
(6,108805): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-padding'
(6,108850): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-border-width'
(6,108892): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-border-color'
(6,108951): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-inner-border-radius'
(6,109011): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-inner-border-radius'
(6,109085): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-padding-y'
(6,109129): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-padding-x'
(6,109186): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-padding-y'
(6,109231): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-padding-x'
(6,109276): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-header-padding-y'
(6,109356): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-title-line-height'
(6,109442): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-padding'
(6,109579): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-padding'
(6,109605): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-footer-gap'
(6,109655): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-footer-bg'
(6,109692): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-footer-border-width'
(6,109734): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-footer-border-color'
(6,109797): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-inner-border-radius'
(6,109859): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-inner-border-radius'
(6,109923): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-footer-gap'
(6,109983): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,110009): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,110094): run-time error CSS1039: Token not allowed after unary operator: '-bs-modal-width'
(6,110156): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,110225): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,110285): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112243): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112268): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112297): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112327): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112358): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112380): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112412): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112436): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112457): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112493): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112518): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112550): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,112596): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-zindex'
(6,112643): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,112681): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-margin'
(6,112718): run-time error CSS1039: Token not allowed after unary operator: '-bs-font-sans-serif'
(6,112990): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-font-size'
(6,113071): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-opacity'
(6,113141): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,113178): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,113543): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,113579): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,113634): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-bg'
(6,113761): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,113799): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,113967): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,114003): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,114039): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,114096): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-bg'
(6,114365): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,114401): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,114452): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-bg'
(6,114581): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,114619): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,114787): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,114830): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-width'
(6,114866): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-arrow-height'
(6,114915): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-bg'
(6,114961): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-max-width'
(6,114997): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-padding-y'
(6,115025): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-padding-x'
(6,115059): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-color'
(6,115118): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-bg'
(6,115153): run-time error CSS1039: Token not allowed after unary operator: '-bs-tooltip-border-radius'
(6,115189): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115214): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115243): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115275): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115296): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115326): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115387): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115421): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115473): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115531): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115566): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115603): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115638): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115666): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115697): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115730): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115763): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115795): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115825): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115858): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,115928): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-zindex'
(6,115977): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-max-width'
(6,116017): run-time error CSS1039: Token not allowed after unary operator: '-bs-font-sans-serif'
(6,116289): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-font-size'
(6,116355): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-bg'
(6,116411): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,116448): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-color'
(6,116493): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-radius'
(6,116569): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,116606): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,116911): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,116945): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,117202): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,117238): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,117409): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-border'
(6,117552): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,117600): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-bg'
(6,117730): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,117764): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,117802): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,117840): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,118104): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,118140): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,118176): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,118349): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-border'
(6,118492): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,118542): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-bg'
(6,118675): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,118709): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,118985): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,119021): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,119191): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-border'
(6,119337): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,119388): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-bg'
(6,119577): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,119630): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,119686): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,119723): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-header-bg'
(6,119862): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,119896): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,119934): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,119972): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,120238): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,120281): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-width'
(6,120317): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-height'
(6,120484): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-arrow-border'
(6,120629): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,120678): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-bg'
(6,120723): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-header-padding-y'
(6,120758): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-header-padding-x'
(6,120819): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-header-font-size'
(6,120860): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-header-color'
(6,120908): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-header-bg'
(6,120950): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-width'
(6,120987): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-border-color'
(6,121041): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-inner-border-radius'
(6,121103): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-inner-border-radius'
(6,121198): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-body-padding-y'
(6,121231): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-body-padding-x'
(6,121270): run-time error CSS1039: Token not allowed after unary operator: '-bs-popover-body-color'
(6,124993): run-time error CSS1039: Token not allowed after unary operator: '-bs-spinner-width'
(6,125024): run-time error CSS1039: Token not allowed after unary operator: '-bs-spinner-height'
(6,125064): run-time error CSS1039: Token not allowed after unary operator: '-bs-spinner-vertical-align'
(6,125125): run-time error CSS1039: Token not allowed after unary operator: '-bs-spinner-animation-speed'
(6,125175): run-time error CSS1039: Token not allowed after unary operator: '-bs-spinner-animation-name'
(6,125274): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125298): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125323): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125360): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125393): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125428): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125483): run-time error CSS1039: Token not allowed after unary operator: '-bs-spinner-border-width'
(6,125578): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125602): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125627): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125749): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125773): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125798): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125835): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125870): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125968): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,125992): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126086): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126203): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126230): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126257): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126284): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126314): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126344): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126367): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126390): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126422): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126485): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,126630): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-zindex'
(6,126713): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-color'
(6,126774): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-bg'
(6,127045): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,127084): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,127123): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,127261): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,127299): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,127338): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,127483): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,127540): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,127579): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,127722): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,127776): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,127815): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,128118): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,128145): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,128462): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-zindex'
(6,128545): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-color'
(6,128606): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-bg'
(6,128877): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,128916): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,128955): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,129093): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,129131): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,129170): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,129315): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,129372): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,129411): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,129554): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,129608): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,129647): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,129950): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,129977): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,130294): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-zindex'
(6,130377): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-color'
(6,130438): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-bg'
(6,130709): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,130748): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,130787): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,130925): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,130963): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,131002): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,131147): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,131204): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,131243): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,131386): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,131440): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,131479): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,131782): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,131809): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,132127): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-zindex'
(6,132210): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-color'
(6,132271): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-bg'
(6,132544): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,132583): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,132622): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,132761): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,132799): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,132838): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,132984): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,133041): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,133080): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,133224): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,133278): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,133317): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,133623): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,133650): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,133969): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-zindex'
(6,134052): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-color'
(6,134113): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-bg'
(6,134388): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,134427): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,134466): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,134606): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,134644): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,134683): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,134830): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,134887): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,134926): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,135071): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,135125): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,135164): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,135476): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,135503): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,135791): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-zindex'
(6,135874): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-color'
(6,135935): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-bg'
(6,136146): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,136185): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,136224): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,136330): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-width'
(6,136368): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,136407): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,136520): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,136577): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,136616): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,136727): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-height'
(6,136781): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-width'
(6,136820): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-border-color'
(6,137282): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-y'
(6,137312): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-x'
(6,137384): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-y'
(6,137425): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-x'
(6,137483): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-y'
(6,137538): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-x'
(6,137594): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-y'
(6,137710): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-y'
(6,137740): run-time error CSS1039: Token not allowed after unary operator: '-bs-offcanvas-padding-x'
(6,138668): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,138776): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,138880): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,138982): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,139086): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,139189): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,139293): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,139393): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,140299): run-time error CSS1039: Token not allowed after unary operator: '-bs-aspect-ratio'
(6,140402): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,140436): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,140470): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,140507): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,144543): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-width'
(6,144566): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-style'
(6,144589): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-color'
(6,144674): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-width'
(6,144697): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-style'
(6,144720): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-color'
(6,144815): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-width'
(6,144838): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-style'
(6,144861): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-color'
(6,144962): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-width'
(6,144985): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-style'
(6,145008): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-color'
(6,145110): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-width'
(6,145133): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-style'
(6,145156): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-color'
(6,145240): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,145285): run-time error CSS1039: Token not allowed after unary operator: '-bs-primary-rgb'
(6,145307): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,145356): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,145401): run-time error CSS1039: Token not allowed after unary operator: '-bs-secondary-rgb'
(6,145425): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,145472): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,145517): run-time error CSS1039: Token not allowed after unary operator: '-bs-success-rgb'
(6,145539): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,145583): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,145628): run-time error CSS1039: Token not allowed after unary operator: '-bs-info-rgb'
(6,145647): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,145694): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,145739): run-time error CSS1039: Token not allowed after unary operator: '-bs-warning-rgb'
(6,145761): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,145807): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,145852): run-time error CSS1039: Token not allowed after unary operator: '-bs-danger-rgb'
(6,145873): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,145918): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,145963): run-time error CSS1039: Token not allowed after unary operator: '-bs-light-rgb'
(6,145983): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,146027): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146072): run-time error CSS1039: Token not allowed after unary operator: '-bs-dark-rgb'
(6,146091): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,146136): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146181): run-time error CSS1039: Token not allowed after unary operator: '-bs-white-rgb'
(6,146201): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-opacity'
(6,146242): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146274): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146306): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146338): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146370): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146411): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146454): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146498): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146541): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,146586): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,153043): run-time error CSS1039: Token not allowed after unary operator: '-bs-font-monospace'
(6,154395): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,154431): run-time error CSS1039: Token not allowed after unary operator: '-bs-primary-rgb'
(6,154453): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,154498): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,154534): run-time error CSS1039: Token not allowed after unary operator: '-bs-secondary-rgb'
(6,154558): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,154601): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,154637): run-time error CSS1039: Token not allowed after unary operator: '-bs-success-rgb'
(6,154659): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,154699): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,154735): run-time error CSS1039: Token not allowed after unary operator: '-bs-info-rgb'
(6,154754): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,154797): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,154833): run-time error CSS1039: Token not allowed after unary operator: '-bs-warning-rgb'
(6,154855): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,154897): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,154933): run-time error CSS1039: Token not allowed after unary operator: '-bs-danger-rgb'
(6,154954): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,154995): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155031): run-time error CSS1039: Token not allowed after unary operator: '-bs-light-rgb'
(6,155051): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,155091): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155127): run-time error CSS1039: Token not allowed after unary operator: '-bs-dark-rgb'
(6,155146): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,155187): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155223): run-time error CSS1039: Token not allowed after unary operator: '-bs-black-rgb'
(6,155243): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,155284): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155320): run-time error CSS1039: Token not allowed after unary operator: '-bs-white-rgb'
(6,155340): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,155380): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155416): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-color-rgb'
(6,155441): run-time error CSS1039: Token not allowed after unary operator: '-bs-text-opacity'
(6,155482): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155541): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155607): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155676): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155737): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155777): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155816): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155857): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155889): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,155934): run-time error CSS1039: Token not allowed after unary operator: '-bs-primary-rgb'
(6,155956): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,155997): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156042): run-time error CSS1039: Token not allowed after unary operator: '-bs-secondary-rgb'
(6,156066): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156105): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156150): run-time error CSS1039: Token not allowed after unary operator: '-bs-success-rgb'
(6,156172): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156208): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156253): run-time error CSS1039: Token not allowed after unary operator: '-bs-info-rgb'
(6,156272): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156311): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156356): run-time error CSS1039: Token not allowed after unary operator: '-bs-warning-rgb'
(6,156378): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156416): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156461): run-time error CSS1039: Token not allowed after unary operator: '-bs-danger-rgb'
(6,156482): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156519): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156564): run-time error CSS1039: Token not allowed after unary operator: '-bs-light-rgb'
(6,156584): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156620): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156665): run-time error CSS1039: Token not allowed after unary operator: '-bs-dark-rgb'
(6,156684): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156721): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156766): run-time error CSS1039: Token not allowed after unary operator: '-bs-black-rgb'
(6,156786): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156823): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156868): run-time error CSS1039: Token not allowed after unary operator: '-bs-white-rgb'
(6,156888): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,156924): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,156969): run-time error CSS1039: Token not allowed after unary operator: '-bs-body-bg-rgb'
(6,156991): run-time error CSS1039: Token not allowed after unary operator: '-bs-bg-opacity'
(6,157034): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,157106): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,157141): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,157177): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,157212): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,157249): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(6,157302): run-time error CSS1039: Token not allowed after unary operator: '-bs-gradient'
(6,157764): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,157860): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius-sm'
(6,157922): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,157981): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius-lg'
(6,158043): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius-xl'
(6,158105): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius-2xl'
(6,158215): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius-pill'
(6,158290): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,158348): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,158419): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,158480): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,158557): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,158617): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,158692): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(6,158749): run-time error CSS1039: Token not allowed after unary operator: '-bs-border-radius'
(16,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(20,47): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(50,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(51,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(52,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(54,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(58,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(59,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(120,14): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(173,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(174,24): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(175,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(177,44): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(190,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(263,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(264,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(274,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(325,34): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(338,14): run-time error CSS1030: Expected identifier, found '.'
(338,25): run-time error CSS1031: Expected selector, found ')'
(338,25): run-time error CSS1025: Expected comma or open brace, found ')'
(414,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(416,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(417,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(418,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(425,22): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-wash'
(426,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(472,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(473,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(474,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(475,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(477,48): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(498,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(505,61): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(509,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(534,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(535,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(536,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(537,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(556,15): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(563,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(569,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(569,70): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(615,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(621,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(655,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(656,17): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(659,40): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(661,36): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(713,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(714,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(721,22): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(722,24): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(723,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-text'
(731,22): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(732,24): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(733,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-text'
(741,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(742,24): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(743,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(816,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(817,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(823,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(824,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(834,55): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(834,89): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(839,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(842,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(852,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(853,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(858,50): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(858,78): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(860,51): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(860,79): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(872,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(873,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(876,30): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(876,65): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(877,30): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(877,65): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(894,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(895,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(896,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(900,49): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(900,79): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(966,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(971,38): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(972,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(981,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(982,24): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(983,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success-text'
(989,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(990,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(995,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(996,24): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(997,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(1000,56): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1004,37): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(1004,71): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1005,92): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1005,120): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1028,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1029,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-sm'
(1033,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(1034,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-alt'
(1130,25): run-time error CSS1039: Token not allowed after unary operator: '-section-gap'
(1132,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1133,33): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(1134,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(1135,41): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(1135,67): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(1145,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1146,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(1149,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1152,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(1153,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(1154,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(1164,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1165,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1172,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1173,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1187,29): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1188,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(1194,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(1195,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1196,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1295,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1296,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1297,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(1300,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(1305,64): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(1306,64): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(1318,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(1319,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1320,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1321,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1322,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1325,22): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(1326,24): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(1327,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-text'
(1330,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(1331,24): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(1332,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success-text'
(1348,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1349,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1350,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success-text'
(1452,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1465,33): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(1467,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(1471,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1472,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(1473,35): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(1480,39): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1484,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1485,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(1489,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(1498,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1499,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(1500,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(1509,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1521,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(1526,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1537,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1538,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(1556,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1557,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(1599,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1600,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1601,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1623,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1624,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(1625,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-subtle'
(1627,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(1627,76): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(1628,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1628,62): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1646,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1647,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(1648,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1658,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1680,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1698,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1707,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1709,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(1717,39): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(1717,87): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(1718,71): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1722,58): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(1727,53): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(1728,59): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn-hover'
(1736,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(1737,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1738,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(1740,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(1743,39): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(1752,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1754,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(1762,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(1781,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1782,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1790,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(1807,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(1811,66): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(1815,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(1816,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(1817,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1828,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1829,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1830,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1918,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(1922,45): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(1923,45): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(1936,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-sm'
(1937,54): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(1938,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(1939,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(1946,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(1948,41): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1949,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(1953,52): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(2027,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(2028,24): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(2029,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success-text'
(2078,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(2081,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-bg'
(2081,45): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(2082,29): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(2093,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(2120,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2145,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(2146,22): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(2147,28): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(2174,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2181,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2193,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(2194,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2195,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2197,45): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(2202,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2203,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2236,34): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(2237,37): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(2241,35): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(2242,38): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(2249,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(2251,24): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(2260,34): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2281,53): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2288,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2362,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2364,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2365,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(2367,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(2367,35): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(2373,24): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(2374,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(2374,41): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(2403,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2404,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(2405,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(2409,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2410,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2415,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(2416,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2419,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2420,38): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2420,66): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(2427,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2458,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2462,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(2463,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(2471,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2472,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2484,45): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2490,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2507,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2509,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(2510,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(2511,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(2515,41): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(2517,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(2518,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(2530,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2532,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(2535,42): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(2545,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(2556,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(2557,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2562,37): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(2562,68): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(2564,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(2564,55): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(2567,35): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(2569,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(2570,22): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(2659,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2660,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(2661,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-subtle'
(2661,45): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(2664,31): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2666,31): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(2668,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2670,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(2672,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(2692,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2695,30): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(2696,31): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2698,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2721,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2723,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-subtle'
(2723,45): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(2724,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2739,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2741,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(2742,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2746,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(2746,94): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2773,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2774,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2777,42): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2784,41): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2794,42): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(2795,51): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2797,48): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2798,32): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2799,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2799,62): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(2807,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2812,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(2822,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2830,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(2845,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2858,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2860,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(2867,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(2882,33): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(2883,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(2888,36): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2889,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2889,72): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2891,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2905,46): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2914,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(2915,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(2916,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(2917,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2919,37): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2920,31): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(2936,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(2940,32): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2942,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(2960,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(2967,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(2973,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(3000,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(3031,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3033,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(3036,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(3036,62): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(3037,41): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(3044,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3046,27): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(3059,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(3084,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(3086,67): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(3102,67): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3116,62): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3142,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3143,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(3145,65): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3154,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(3164,92): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3173,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3174,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(3185,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(3186,24): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(3188,54): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(3328,27): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3345,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(3397,54): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(3405,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3406,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(3425,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(3426,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3427,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(3439,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(3441,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3442,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(3445,44): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3446,50): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3452,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3475,63): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(3511,24): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(3553,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3618,83): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(3625,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(3628,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3631,45): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3646,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(3663,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3704,35): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(3705,31): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(3705,69): run-time error CSS1039: Token not allowed after unary operator: '-color-info'
(3710,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3710,75): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(3711,32): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(3715,57): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(3719,35): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3727,67): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(3730,49): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(3733,66): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3734,128): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3736,87): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3736,132): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(3737,35): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(3752,51): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(3762,35): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3769,59): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(3791,22): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(3796,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3797,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(3798,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(3799,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(3804,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(3804,50): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(3805,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(3837,31): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(3858,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3859,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(3862,28): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(3884,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3885,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(3886,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(3887,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(3891,43): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(3894,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(3894,50): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(3895,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(3897,42): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(3900,38): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3901,56): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(3903,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(3904,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(3934,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(3959,52): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(3959,86): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(3966,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(3967,25): run-time error CSS1039: Token not allowed after unary operator: '-btn-radius'
(3968,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(3973,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(3975,63): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn-active'
(4007,38): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(4008,38): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(4024,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(4032,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(4037,30): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(4042,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-dark'
(4043,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-xl'
(4049,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(4049,40): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-ring'
(4062,38): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(4067,114): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(4077,34): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(4079,139): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(4080,51): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(4104,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(4110,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(4145,86): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(4145,121): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(4156,66): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(4171,62): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(4180,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-bg'
(4180,45): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(4181,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(4184,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(4190,52): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(4196,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(4197,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(4229,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(4231,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-alt'
(4232,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(4235,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(4268,38): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(4278,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(4280,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(4290,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(4291,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(4300,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(4301,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(4302,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(4326,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(4341,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(4494,40): run-time error CSS1030: Expected identifier, found '.'
(4494,79): run-time error CSS1031: Expected selector, found ')'
(4494,79): run-time error CSS1025: Expected comma or open brace, found ')'
(4500,68): run-time error CSS1030: Expected identifier, found '>'
(4500,70): run-time error CSS1030: Expected identifier, found ':'
(4500,71): run-time error CSS1031: Expected selector, found 'not('
(4500,71): run-time error CSS1025: Expected comma or open brace, found 'not('
(4540,14): run-time error CSS1030: Expected identifier, found '.'
(4540,37): run-time error CSS1031: Expected selector, found ')'
(4540,37): run-time error CSS1025: Expected comma or open brace, found ')'
(4697,23): run-time error CSS1030: Expected identifier, found '.'
(4697,35): run-time error CSS1031: Expected selector, found ')'
(4697,35): run-time error CSS1025: Expected comma or open brace, found ')'
(4719,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(4736,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-semibold'
(4781,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(4782,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(4826,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(4838,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(4843,38): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(4869,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(4900,50): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(4904,55): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(4905,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(4905,108): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(4914,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(4914,57): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(4915,43): run-time error CSS1039: Token not allowed after unary operator: '-shadow-xl'
(4920,69): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(4924,58): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(4931,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(4943,38): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(4960,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(4961,33): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(4971,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5003,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5048,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(5058,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5117,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5166,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5167,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5173,61): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5201,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5202,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5209,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5210,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(5211,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(5220,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5221,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5234,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(5235,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(5236,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5239,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5241,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(5275,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5352,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5368,55): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5392,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5393,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5399,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5401,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5418,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(5467,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5491,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5505,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5523,62): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5526,78): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5529,37): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5538,51): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(5539,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5539,61): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5540,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5541,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5542,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5543,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5544,96): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5548,35): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5552,79): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5552,120): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5553,88): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(5559,90): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(5563,132): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5566,54): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5598,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(5599,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(5602,40): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(5623,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(5636,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5637,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(5638,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(5641,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5644,43): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(5652,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5652,64): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5666,58): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(5667,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5683,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5684,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5711,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5712,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5736,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5737,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5741,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(5745,53): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(5754,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5755,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(5761,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5768,75): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5770,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5781,74): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5784,37): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5784,65): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5785,50): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5786,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5788,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5789,32): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5808,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5814,42): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(5814,72): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(5821,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(5852,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5854,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5867,53): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5875,76): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5878,52): run-time error CSS1039: Token not allowed after unary operator: '-font-mono'
(5878,92): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5889,32): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5895,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(5923,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5924,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(5926,64): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(5941,65): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-wash'
(5948,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5949,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(5955,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5956,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5963,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5964,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5980,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(5982,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5985,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(5986,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(5997,61): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(6002,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6009,38): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-wash'
(6009,79): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6026,43): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6045,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6046,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(6047,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6052,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(6052,69): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(6052,106): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(6054,42): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(6054,77): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(6054,118): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6055,46): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6055,82): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6086,41): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6104,49): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6131,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6131,58): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6136,42): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(6138,49): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6139,35): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6139,73): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6154,50): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6155,32): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6157,40): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(6157,75): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6165,75): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6166,36): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6182,71): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6201,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6201,71): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6208,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(6209,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(6217,38): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6219,50): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6220,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6220,74): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6221,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6222,52): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6231,103): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6286,124): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6308,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6308,72): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6309,92): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6310,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6310,71): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6319,40): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6330,58): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6334,51): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6338,87): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6339,86): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6348,40): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6349,55): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6349,109): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6350,44): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6350,80): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6356,26): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6357,50): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(6357,88): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6361,137): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6366,114): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6374,139): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6378,56): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(6378,84): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(6384,41): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6387,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6388,96): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6392,37): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6392,75): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6393,56): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6393,112): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6399,95): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6399,133): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6408,37): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6463,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6464,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-sm'
(6465,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(6510,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6510,58): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6543,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6544,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6545,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-alt'
(6546,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6555,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6556,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6558,36): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(6566,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6575,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6584,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-alt'
(6585,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6624,133): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6627,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6627,74): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6635,38): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6635,94): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6645,51): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(6690,31): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6690,67): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6698,53): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6699,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6729,15): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6735,55): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(6735,85): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6739,79): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6749,100): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6754,48): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6754,86): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6761,53): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6761,109): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6762,159): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(6763,162): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(6774,20): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(6774,49): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(6775,26): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6775,62): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(6776,20): run-time error CSS1039: Token not allowed after unary operator: '-shadow-xl'
(6778,40): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6799,20): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(6799,60): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6800,23): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(6803,20): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(6803,57): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6806,35): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6806,63): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6811,112): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6816,49): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6817,44): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6817,80): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6823,45): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(6859,56): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6864,20): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(6865,36): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6882,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6887,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(6887,89): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6894,57): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6897,31): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6897,67): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6949,35): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(6949,72): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6979,20): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(6979,60): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(6980,23): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(6982,40): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6983,53): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6984,41): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(6984,74): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(6997,32): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6997,60): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(6998,51): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(6998,89): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7006,36): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7006,72): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7020,84): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7020,120): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(7023,20): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(7023,49): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(7024,47): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7027,79): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(7028,41): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(7056,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(7057,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7058,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(7059,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(7061,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(7066,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(7070,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(7072,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(7073,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(7075,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(7078,37): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(7080,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7081,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7099,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7100,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7115,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(7117,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7118,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(7121,39): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7121,67): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7130,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7131,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7132,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7134,22): run-time error CSS1039: Token not allowed after unary operator: '-mod-bg'
(7135,17): run-time error CSS1039: Token not allowed after unary operator: '-mod-fg'
(7136,28): run-time error CSS1039: Token not allowed after unary operator: '-mod-edge'
(7137,33): run-time error CSS1039: Token not allowed after unary operator: '-mod-edge'
(7138,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(7139,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(7147,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(7150,17): run-time error CSS1039: Token not allowed after unary operator: '-mod-fg'
(7152,34): run-time error CSS1039: Token not allowed after unary operator: '-mod-fg'
(7153,23): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7153,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7153,61): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7154,23): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7154,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7154,61): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7155,23): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7155,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7155,61): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7157,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(7157,80): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(7158,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7158,80): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(7159,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7200,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7203,31): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(7209,22): run-time error CSS1039: Token not allowed after unary operator: '-ap-c'
(7209,34): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7214,15): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7215,15): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7216,15): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7217,15): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7234,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(7237,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7245,33): run-time error CSS1039: Token not allowed after unary operator: '-ap-c'
(7245,45): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7252,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7254,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7269,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(7271,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(7275,66): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(7278,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7282,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7283,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7288,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7289,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7294,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7302,35): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7303,35): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7304,35): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7305,35): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(7369,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(7377,29): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(7378,22): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-wash'
(7382,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(7384,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(7388,66): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(7401,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7402,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7466,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7467,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(7480,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7481,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(7483,51): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7493,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(7495,37): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-hover'
(7496,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-hover'
(7500,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7501,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7505,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7514,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7515,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(7516,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(7522,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7523,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(7543,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7545,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7564,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(7565,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(7566,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7567,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(7569,40): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(7573,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(7574,38): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(7586,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7587,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7591,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7592,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7609,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7614,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7703,34): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7704,43): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(7704,84): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(7712,43): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(7712,87): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7713,46): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(7713,87): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-text'
(7714,63): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7714,100): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7716,52): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7716,90): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7718,39): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7719,50): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7720,56): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7725,52): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7725,89): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7743,18): run-time error CSS1030: Expected identifier, found '.'
(7743,36): run-time error CSS1031: Expected selector, found ')'
(7743,36): run-time error CSS1025: Expected comma or open brace, found ')'
(7755,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(7755,92): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7756,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7756,91): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7777,33): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(7790,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7791,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(7804,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7805,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(7806,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-alt'
(7806,42): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(7813,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(7834,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7910,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7911,32): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(7915,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(7918,25): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7918,63): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(7926,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(7941,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(7947,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7948,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7970,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(7971,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7975,29): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7978,29): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(7996,22): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8003,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(8017,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8019,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(8024,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(8041,52): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-text'
(8046,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8047,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(8048,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(8061,58): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8070,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8073,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(8085,64): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(8104,28): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(8105,24): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(8106,32): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(8135,74): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8149,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(8153,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(8156,29): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(8161,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(8165,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(8166,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(8253,14): run-time error CSS1030: Expected identifier, found '#tbSearch'
(8253,133): run-time error CSS1031: Expected selector, found ')'
(8253,133): run-time error CSS1025: Expected comma or open brace, found ')'
(8308,32): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(8308,87): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(8319,97): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8320,46): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(8320,85): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(8320,121): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(8324,82): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(8324,118): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(8388,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(8399,57): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(8424,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(8426,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(8459,61): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(8489,72): run-time error CSS1030: Expected identifier, found '.'
(8489,106): run-time error CSS1031: Expected selector, found ')'
(8489,106): run-time error CSS1025: Expected comma or open brace, found ')'
(8541,17): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(8542,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(8544,33): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(8545,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(8558,25): run-time error CSS1030: Expected identifier, found '>'
(8558,27): run-time error CSS1030: Expected identifier, found '*'
(8558,28): run-time error CSS1031: Expected selector, found ')'
(8558,28): run-time error CSS1025: Expected comma or open brace, found ')'
(8570,45): run-time error CSS1030: Expected identifier, found '>'
(8570,60): run-time error CSS1031: Expected selector, found ')'
(8570,60): run-time error CSS1025: Expected comma or open brace, found ')'
(8587,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(8588,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8594,24): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(8703,55): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(8703,99): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(8703,136): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(8711,56): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(8712,37): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(8803,55): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(8813,72): run-time error CSS1030: Expected identifier, found '.'
(8813,106): run-time error CSS1031: Expected selector, found ')'
(8813,106): run-time error CSS1025: Expected comma or open brace, found ')'
(8831,96): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(8854,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(8854,62): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8875,30): run-time error CSS1030: Expected identifier, found '>'
(8875,63): run-time error CSS1031: Expected selector, found ')'
(8875,63): run-time error CSS1025: Expected comma or open brace, found ')'
(8908,44): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-text'
(8908,69): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(8932,54): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(8933,52): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(8934,10): run-time error CSS1030: Expected identifier, found '.'
(8934,20): run-time error CSS1031: Expected selector, found ')'
(8934,20): run-time error CSS1025: Expected comma or open brace, found ')'
(8966,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(8967,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(8968,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(8969,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(8974,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(8974,45): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(8975,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(8980,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(8981,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(8988,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(9015,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(9043,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(9045,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(9046,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(9047,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(9048,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(9053,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(9054,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(9055,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(9059,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(9063,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(9064,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(9066,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(9097,18): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9099,30): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9102,52): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9104,75): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9113,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(9113,94): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(9128,24): run-time error CSS1039: Token not allowed after unary operator: '-plp-box-color'
(9130,51): run-time error CSS1039: Token not allowed after unary operator: '-plp-box-color'
(9142,24): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(9144,51): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(9148,22): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(9149,24): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(9164,29): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(9170,54): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(9181,22): run-time error CSS1039: Token not allowed after unary operator: '-section-gap'
(9184,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(9185,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(9186,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(9254,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(9284,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(9285,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(9287,33): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(9295,24): run-time error CSS1030: Expected identifier, found '>'
(9295,26): run-time error CSS1030: Expected identifier, found '.'
(9295,36): run-time error CSS1031: Expected selector, found ')'
(9295,36): run-time error CSS1025: Expected comma or open brace, found ')'
(9298,50): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(9324,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(9325,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(9326,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(9344,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(9360,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(9373,23): run-time error CSS1030: Expected identifier, found '['
(9373,24): run-time error CSS1030: Expected identifier, found 'data-et-reveal'
(9373,38): run-time error CSS1031: Expected selector, found ']'
(9373,38): run-time error CSS1025: Expected comma or open brace, found ']'
(9386,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(9387,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(9406,8): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9411,39): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(9420,41): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(9426,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(9428,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(9429,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(9430,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(9511,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9512,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9513,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9514,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9515,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9516,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9517,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9523,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9526,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9527,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9528,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9529,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9530,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9531,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9532,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9533,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9534,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9535,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9536,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9537,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9538,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9547,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9548,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9549,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9557,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9558,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9559,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9560,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9563,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9585,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9586,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9613,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9614,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9617,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9618,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9619,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9620,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9629,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9632,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9633,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9636,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9637,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9638,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9641,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9642,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9643,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9644,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9645,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9646,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9647,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9648,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9649,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9650,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9651,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9652,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9655,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9656,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9657,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9660,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9661,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9662,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9663,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9664,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9665,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9666,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9667,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9668,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9669,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9670,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9673,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9674,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9677,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9678,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9679,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9680,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9681,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9682,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9685,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9686,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9687,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9690,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9691,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9692,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9693,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9694,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9695,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9698,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9699,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9705,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9706,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9707,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9722,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9723,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9725,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9726,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9727,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9728,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9732,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9734,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9735,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9736,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9738,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9739,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9740,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9741,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9742,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9743,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9744,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9745,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9746,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9749,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9750,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9751,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9753,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9754,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9755,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9756,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9757,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9758,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9759,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9760,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9761,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9762,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9764,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9766,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9780,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9781,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9782,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9783,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9784,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9785,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9786,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9787,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9788,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9789,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9790,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9791,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9792,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9798,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9799,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9800,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9801,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9802,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9803,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9804,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9805,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9806,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9807,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9808,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9809,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9810,43): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9822,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9823,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9824,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9825,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9826,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9828,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9829,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9830,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9831,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9832,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9834,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9835,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9836,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9837,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9838,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9840,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9841,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9842,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9843,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9844,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9846,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9847,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9848,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9849,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9850,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9852,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9853,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9854,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9855,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9856,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9858,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9859,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9860,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9861,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9862,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9864,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9865,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9866,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9867,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9868,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9870,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9871,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9872,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9873,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9874,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9876,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9877,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9878,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9879,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9880,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9882,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9883,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9884,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9885,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9886,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9888,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9889,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9890,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9891,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9892,31): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9900,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9901,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9902,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9903,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9905,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9906,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9907,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9908,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9910,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9911,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9912,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9913,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9915,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9916,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9917,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9918,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9920,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9921,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9922,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9923,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9925,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9926,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9927,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9928,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9930,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9931,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9932,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9933,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9935,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9936,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9937,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9938,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9940,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9941,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9942,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9943,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9945,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9946,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9947,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9948,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9950,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9951,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9952,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9953,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9955,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9956,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9957,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9958,50): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9975,44): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9984,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9985,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9986,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9987,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9988,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9989,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9991,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9992,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9993,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9994,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9995,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(9996,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(10008,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(10048,37): run-time error CSS1039: Token not allowed after unary operator: '-selection-bg'
(10048,65): run-time error CSS1039: Token not allowed after unary operator: '-selection-color'
(10049,37): run-time error CSS1039: Token not allowed after unary operator: '-selection-bg'
(10049,65): run-time error CSS1039: Token not allowed after unary operator: '-selection-color'
(10064,35): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(10069,23): run-time error CSS1039: Token not allowed after unary operator: '-font-family'
(10070,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(10071,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10072,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(10073,23): run-time error CSS1039: Token not allowed after unary operator: '-line-height'
(10081,46): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10086,41): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10092,41): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10103,41): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(10104,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10106,47): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10110,41): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(10110,67): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(10135,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(10136,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10137,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(10147,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xxl'
(10148,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10149,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10158,39): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10161,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10162,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10178,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10179,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10184,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10185,17): run-time error CSS1039: Token not allowed after unary operator: '-color-info'
(10186,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(10187,33): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(10189,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(10227,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(10233,30): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10238,29): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(10267,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10268,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10275,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(10276,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10295,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(10298,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(10298,41): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-deeper'
(10302,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(10302,35): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(10304,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10306,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10310,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(10310,41): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(10324,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10333,29): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(10334,29): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(10334,73): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10353,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10359,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(10360,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10361,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(10362,19): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(10364,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(10378,15): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(10379,17): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(10402,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(10403,25): run-time error CSS1039: Token not allowed after unary operator: '-btn-radius'
(10404,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(10409,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(10412,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn-active'
(10416,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(10417,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(10418,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(10419,19): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(10441,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(10442,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(10443,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(10444,19): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(10483,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(10484,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10485,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10493,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10505,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10508,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10512,29): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10521,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(10522,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10523,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(10524,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-card'
(10525,19): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(10526,25): run-time error CSS1039: Token not allowed after unary operator: '-section-gap'
(10527,33): run-time error CSS1039: Token not allowed after unary operator: '-transition-mid'
(10527,69): run-time error CSS1039: Token not allowed after unary operator: '-transition-mid'
(10529,26): run-time error CSS1039: Token not allowed after unary operator: '-card-padding-lg'
(10531,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(10532,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10534,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10536,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10553,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10556,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10612,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10650,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10651,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(10652,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(10654,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(10655,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10655,76): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10655,106): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10661,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10674,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10678,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(10679,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(10685,44): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-wash'
(10685,69): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-wash'
(10689,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(10702,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10703,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10711,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10719,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10724,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-card-hover'
(10725,43): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10725,68): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10728,32): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10729,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(10770,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10774,45): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10777,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(10778,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10779,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10785,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10786,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10807,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10808,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10809,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(10816,29): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(10833,18): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(10834,19): run-time error CSS1039: Token not allowed after unary operator: '-input-padding'
(10836,31): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(10837,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(10838,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(10839,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10840,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(10843,35): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10844,33): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10845,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(10850,27): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(10874,43): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(10874,81): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(10885,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(10885,50): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(10886,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(10898,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(10929,22): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(10941,24): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(10951,24): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(10952,51): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(10967,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(10978,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11041,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11070,19): run-time error CSS1039: Token not allowed after unary operator: '-btn-padding'
(11072,21): run-time error CSS1039: Token not allowed after unary operator: '-btn-font-size'
(11073,23): run-time error CSS1039: Token not allowed after unary operator: '-btn-font-weight'
(11087,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11089,25): run-time error CSS1039: Token not allowed after unary operator: '-btn-radius'
(11091,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11092,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11093,33): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11094,30): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11096,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn'
(11103,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(11111,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn'
(11112,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-ring'
(11116,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn-active'
(11138,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(11139,24): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(11143,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn-hover'
(11144,24): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn-hover'
(11149,28): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn'
(11150,24): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn'
(11154,28): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn-hover'
(11155,24): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn-hover'
(11177,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(11178,28): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(11182,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(11183,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-deeper'
(11184,24): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-deeper'
(11195,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(11196,24): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(11206,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn'
(11209,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn'
(11214,19): run-time error CSS1039: Token not allowed after unary operator: '-btn-padding-sm'
(11220,40): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(11222,28): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn'
(11227,35): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn'
(11228,35): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11242,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(11246,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(11247,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11248,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11252,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11253,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(11257,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(11257,55): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11284,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(11285,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(11286,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11287,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(11288,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(11293,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11294,35): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11295,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11307,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-ring'
(11309,34): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11312,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11314,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11318,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(11338,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(11339,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(11349,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(11480,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(11482,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11488,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(11489,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(11490,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11499,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(11500,18): run-time error CSS1039: Token not allowed after unary operator: '-section-gap'
(11505,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(11523,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11545,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(11546,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(11581,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(11582,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11590,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(11607,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(11608,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(11614,40): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(11614,75): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(11615,40): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(11615,75): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(11629,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(11630,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(11635,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(11636,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11637,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(11640,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11642,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(11646,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(11647,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11706,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(11733,29): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(11734,29): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(11735,29): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(11795,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(11814,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(11815,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(11818,22): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(11819,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(11820,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(11826,22): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(11827,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(11828,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(11833,37): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(11850,10): run-time error CSS1030: Expected identifier, found '.'
(11850,29): run-time error CSS1031: Expected selector, found ')'
(11850,29): run-time error CSS1025: Expected comma or open brace, found ')'
(11853,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(11854,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(11855,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(11856,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-xl'
(11861,36): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-back'
(11893,8): run-time error CSS1030: Expected identifier, found '.'
(11893,18): run-time error CSS1031: Expected selector, found ')'
(11893,18): run-time error CSS1025: Expected comma or open brace, found ')'
(11907,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(11908,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(11926,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(11927,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(11935,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(11939,34): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(11941,39): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(11941,71): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12029,21): run-time error CSS1030: Expected identifier, found '.'
(12029,52): run-time error CSS1031: Expected selector, found ')'
(12029,52): run-time error CSS1025: Expected comma or open brace, found ')'
(12035,21): run-time error CSS1030: Expected identifier, found '.'
(12035,52): run-time error CSS1031: Expected selector, found ')'
(12035,52): run-time error CSS1025: Expected comma or open brace, found ')'
(12101,66): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(12107,26): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(12150,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(12162,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-bg'
(12162,45): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(12163,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(12166,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12169,52): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12175,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(12176,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12215,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(12216,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(12217,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(12221,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(12226,48): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(12227,61): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(12231,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(12232,24): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(12246,40): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(12272,24): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(12302,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(12303,35): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(12304,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(12306,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12308,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12311,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(12349,22): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(12356,10): run-time error CSS1030: Expected identifier, found '.'
(12356,21): run-time error CSS1031: Expected selector, found ')'
(12356,21): run-time error CSS1025: Expected comma or open brace, found ')'
(12373,26): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(12375,14): run-time error CSS1030: Expected identifier, found '.'
(12375,25): run-time error CSS1031: Expected selector, found ')'
(12375,25): run-time error CSS1025: Expected comma or open brace, found ')'
(12395,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(12421,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12439,30): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(12448,10): run-time error CSS1030: Expected identifier, found '.'
(12448,21): run-time error CSS1031: Expected selector, found ')'
(12448,21): run-time error CSS1025: Expected comma or open brace, found ')'
(12474,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12517,32): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(12544,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(12545,32): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(12546,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(12548,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12549,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12554,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(12576,40): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(12599,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(12601,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(12602,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(12603,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(12604,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12617,28): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(12618,35): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(12619,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(12621,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12623,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12625,41): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(12643,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-semibold'
(12664,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(12665,35): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(12666,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(12668,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12671,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12672,41): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(12685,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-semibold'
(12711,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(12732,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(12733,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12748,22): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(12777,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(12778,53): run-time error CSS1039: Token not allowed after unary operator: '-list-search-font-size'
(12790,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(12794,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(12795,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(12796,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(12815,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(12816,28): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-wash'
(12819,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(12819,55): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(12835,28): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(12838,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(12840,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(12841,24): run-time error CSS1039: Token not allowed after unary operator: '-nav-z'
(12856,37): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(12874,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12879,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(12880,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(12881,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(12889,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(12891,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(12894,85): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(12895,50): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(12898,15): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(12900,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(12909,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav'
(12911,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(12976,67): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(13014,54): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13033,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13042,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(13043,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(13046,47): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(13049,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13050,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(13051,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13056,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13083,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(13084,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(13087,47): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(13095,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(13096,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13097,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13100,31): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13103,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13124,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13130,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13131,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13131,69): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13133,39): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13133,70): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(13134,66): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(13134,94): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13140,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13141,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(13142,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(13197,27): run-time error CSS1039: Token not allowed after unary operator: '-font-family'
(13204,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn'
(13204,70): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(13215,32): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(13216,39): run-time error CSS1039: Token not allowed after unary operator: '-ease-in-out'
(13266,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13268,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13268,76): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13271,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13279,24): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13280,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(13288,41): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(13289,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(13290,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13291,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(13292,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13305,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13330,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13331,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13335,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13336,31): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(13342,37): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13344,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(13344,60): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(13349,37): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13351,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(13351,60): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(13359,19): run-time error CSS1039: Token not allowed after unary operator: '-nav-z'
(13360,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav'
(13364,48): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav'
(13365,29): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav'
(13366,18): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(13369,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(13388,30): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13391,33): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13412,15): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(13416,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav'
(13418,24): run-time error CSS1039: Token not allowed after unary operator: '-nav-z'
(13452,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13453,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(13454,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13454,69): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13494,28): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13495,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13500,28): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13501,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13503,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13527,26): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13528,32): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13528,61): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(13542,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(13575,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13580,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(13581,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13600,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13603,38): run-time error CSS1039: Token not allowed after unary operator: '-ease-in-out'
(13622,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13626,28): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(13629,38): run-time error CSS1039: Token not allowed after unary operator: '-ease-in-out'
(13636,64): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav-dropdown'
(13643,32): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13645,27): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13656,32): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav-dropdown'
(13660,29): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(13661,26): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(13666,43): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(13679,39): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(13730,32): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13734,32): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13736,27): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13752,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13809,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13812,84): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13816,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(13824,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13855,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13858,39): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13860,29): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13862,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13869,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(13870,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13871,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(13884,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(13885,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(13886,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13890,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13891,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13905,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(13906,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13907,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(13911,39): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13913,29): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(13915,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13920,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(13921,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(13922,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(13923,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13924,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(13935,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(13936,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(13948,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(13982,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(13998,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(13999,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14000,28): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(14003,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(14004,38): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-back'
(14027,23): run-time error CSS1039: Token not allowed after unary operator: '-font-family'
(14035,34): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14037,40): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(14041,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14043,41): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14044,41): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(14047,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14050,45): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14051,45): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(14054,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14055,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14059,42): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14061,64): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14061,100): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14066,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(14067,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14068,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14070,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14075,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14082,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14088,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14092,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(14094,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(14096,44): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14097,44): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(14103,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14109,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14110,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14118,41): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14131,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(14145,33): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(14160,14): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(14161,33): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(14164,49): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(14175,15): run-time error CSS1039: Token not allowed after unary operator: '-section-gap'
(14185,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14187,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(14187,76): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(14188,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14192,49): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14193,50): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(14195,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14196,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(14198,57): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(14201,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14202,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14205,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(14206,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14216,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(14217,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14225,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(14226,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14227,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14230,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14231,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(14326,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(14327,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14328,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(14329,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(14330,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(14331,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14348,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(14350,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(14372,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14374,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14377,47): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14378,47): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(14379,47): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(14401,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14436,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14444,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14446,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(14446,76): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(14447,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14452,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14453,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14458,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(14462,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14488,22): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14497,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14540,43): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(14540,77): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14542,58): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(14542,86): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(14544,45): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14545,58): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14547,92): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14550,109): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(14589,45): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14592,43): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14592,71): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14602,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(14603,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14604,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14614,44): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14648,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14649,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14650,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14657,28): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14658,24): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14662,42): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14675,57): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14676,64): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14676,105): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14677,69): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14684,41): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(14684,69): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(14686,41): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(14686,72): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14687,41): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(14687,72): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(14689,41): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(14689,71): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(14699,29): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14700,37): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14701,37): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(14702,37): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(14702,71): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14703,37): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(14703,71): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(14722,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(14723,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14724,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14732,57): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14733,38): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14735,38): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14758,44): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(14759,63): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(14759,91): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(14760,44): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(14761,44): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(14762,44): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(14789,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14793,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14794,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14800,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14805,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(14807,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(14809,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14831,40): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(14831,72): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(14832,40): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(14832,72): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(14833,40): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(14833,72): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(14836,40): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(14836,72): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(14847,42): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(14856,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14868,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(14869,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(14878,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(14879,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(14880,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14881,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(14901,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14912,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(14920,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(14951,25): run-time error CSS1039: Token not allowed after unary operator: '-btn-radius'
(14952,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn'
(14972,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14973,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(14988,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(14989,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(14989,76): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(14996,54): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14997,54): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(14998,55): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(15019,28): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(15020,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(15021,35): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15021,70): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15023,61): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15025,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15027,38): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15036,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15038,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15073,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(15074,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15088,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(15089,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(15090,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15091,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15097,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15098,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15101,40): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15102,46): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(15102,80): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(15108,35): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15109,35): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(15120,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15121,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15125,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(15126,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(15127,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(15130,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15131,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15145,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(15146,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15147,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15151,47): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15153,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15154,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(15159,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15173,23): run-time error CSS1039: Token not allowed after unary operator: '-font-family'
(15174,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15175,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(15176,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(15179,39): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15180,51): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(15191,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(15192,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15200,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15201,32): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15231,30): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15232,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(15233,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15234,23): run-time error CSS1039: Token not allowed after unary operator: '-font-family'
(15235,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15236,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(15240,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15241,38): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15242,38): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15243,38): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15244,38): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15248,24): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(15249,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(15251,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(15255,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(15256,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(15258,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(15259,56): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(15262,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn-hover'
(15263,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn-hover'
(15267,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-ring'
(15273,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15288,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15290,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(15291,43): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15291,69): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15295,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(15300,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(15301,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(15309,31): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(15313,41): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15313,67): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(15319,22): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(15330,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15337,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15340,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15340,65): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15343,38): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15343,74): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(15344,50): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(15396,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15397,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15411,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15416,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15417,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(15424,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15425,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(15433,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15442,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15443,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(15449,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(15453,35): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(15453,77): run-time error CSS1039: Token not allowed after unary operator: '-color-success-text'
(15454,35): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(15454,77): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-text'
(15455,35): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(15455,77): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-text'
(15462,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15466,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(15468,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15470,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(15474,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15478,49): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(15498,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15531,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(15532,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15537,28): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(15538,29): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(15539,30): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(15540,37): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(15541,38): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(15564,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15569,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(15603,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15621,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(15634,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15635,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(15639,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(15645,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(15647,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(15648,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15698,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(15699,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15702,62): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(15703,70): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus'
(15711,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(15713,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15722,43): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(15738,34): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15739,35): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15741,32): run-time error CSS1039: Token not allowed after unary operator: '-transition-mid'
(15741,68): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(15747,69): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(15749,71): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(15757,36): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(15760,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(15766,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15780,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15786,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15790,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(15800,33): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(15804,27): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(15804,51): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(15818,38): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(15825,31): run-time error CSS1039: Token not allowed after unary operator: '-card-padding-lg'
(15825,71): run-time error CSS1039: Token not allowed after unary operator: '-card-padding-lg'
(15834,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(15835,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(15836,28): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(15839,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(15840,39): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-back'
(15873,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(15875,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(15876,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15894,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(15915,20): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(15931,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(15932,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(15933,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(15935,35): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(15972,107): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(15978,32): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(15994,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(15997,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-sm'
(16017,30): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(16017,71): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(16064,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(16071,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(16076,28): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(16077,30): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(16089,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-dark'
(16090,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-xl'
(16096,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(16096,40): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-ring'
(16125,45): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(16125,66): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-dark'
(16138,80): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(16138,114): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(16138,150): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16139,76): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16140,36): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn'
(16146,74): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16147,34): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(16151,32): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16151,88): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16152,59): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16153,41): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(16154,33): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16163,107): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16166,59): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16166,102): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16167,78): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(16167,128): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(16167,174): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(16183,31): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(16184,31): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(16185,35): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16187,68): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16188,40): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16189,31): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(16202,37): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(16204,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16204,60): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16209,37): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(16211,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16211,60): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(16224,41): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(16225,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16226,47): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16229,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16230,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16233,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16238,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(16265,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16266,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16274,33): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16283,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16284,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16285,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16298,51): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16306,41): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16311,29): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(16316,39): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(16337,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16347,50): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(16347,82): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16348,50): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16348,86): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16349,50): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16349,86): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16353,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16355,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(16356,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16359,46): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(16360,47): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(16362,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(16363,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16373,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16374,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16380,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16381,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(16385,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(16386,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(16407,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16408,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16414,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(16415,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16435,22): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(16436,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(16437,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(16440,22): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(16441,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(16442,28): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(16445,22): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(16446,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(16447,28): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(16458,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(16459,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16460,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16466,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(16467,17): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(16468,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(16480,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16483,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16488,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16491,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16492,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16501,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16502,41): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(16503,47): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16508,53): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16516,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16517,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16524,50): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(16525,50): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(16528,60): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(16538,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16539,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16562,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16563,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(16564,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(16565,17): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(16566,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16573,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(16574,17): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(16575,29): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(16579,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16585,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info'
(16601,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16605,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16606,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16609,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16610,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16633,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16636,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16644,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16652,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(16655,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(16669,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16672,39): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(16676,82): run-time error CSS1039: Token not allowed after unary operator: '-color-info'
(16689,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16693,27): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(16694,27): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(16707,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16708,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16713,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16714,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16737,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16746,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16747,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(16753,29): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16766,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(16767,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16768,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16771,42): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(16783,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(16784,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(16787,56): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(16798,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(16799,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16801,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(16802,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(16811,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16813,39): run-time error CSS1039: Token not allowed after unary operator: '-ease-in-out'
(16827,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(16841,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16844,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16845,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16855,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16857,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16859,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(16860,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16861,27): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16861,51): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16864,38): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(16894,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16895,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16896,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(16896,35): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16902,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(16905,40): run-time error CSS1039: Token not allowed after unary operator: '-color-link-hover'
(16905,64): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(16913,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16915,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16917,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(16918,33): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16919,27): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16919,51): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(16920,38): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(16941,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(16942,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(16944,41): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(16966,22): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(16968,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-mid'
(16970,45): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16971,45): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(16971,108): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(17007,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(17008,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(17009,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(17020,44): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17052,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17054,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17055,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(17062,67): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-dark'
(17081,18): run-time error CSS1039: Token not allowed after unary operator: '-pwa-install-bottom'
(17106,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17116,63): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-dark'
(17117,71): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-ring'
(17124,22): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(17125,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(17126,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(17134,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17135,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17136,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(17137,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(17142,36): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(17142,70): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17150,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17161,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17162,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(17163,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17193,22): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(17194,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(17195,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(17202,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17203,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17204,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17205,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(17206,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(17214,47): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(17216,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(17217,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17256,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17257,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(17258,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17259,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(17260,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17261,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(17263,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17263,69): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17265,37): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(17266,44): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(17267,37): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(17267,69): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(17267,105): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(17285,32): run-time error CSS1039: Token not allowed after unary operator: '-ease-in-out'
(17303,15): run-time error CSS1039: Token not allowed after unary operator: '-section-gap'
(17304,25): run-time error CSS1039: Token not allowed after unary operator: '-section-gap'
(17329,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17349,22): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17351,55): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(17352,55): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(17375,28): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn'
(17376,24): run-time error CSS1039: Token not allowed after unary operator: '-color-delete-btn'
(17380,28): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(17381,24): run-time error CSS1039: Token not allowed after unary operator: '-color-save-btn'
(17393,37): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17395,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17395,60): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17400,37): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17402,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17402,60): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17415,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17421,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17431,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17432,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(17433,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17435,62): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17440,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17441,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17459,37): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17461,38): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17461,60): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17471,30): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17474,66): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17486,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17488,17): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17492,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17493,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(17494,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17498,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17499,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(17500,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17502,48): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17505,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17506,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17509,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17515,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17528,48): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(17529,49): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(17530,44): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17536,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(17537,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17540,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17541,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17544,24): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(17545,28): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(17546,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17549,24): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(17550,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(17551,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17553,52): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17557,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17562,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17568,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17594,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17599,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(17602,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17615,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17616,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(17617,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17621,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17627,39): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(17627,86): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(17628,38): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(17628,82): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(17629,39): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(17629,86): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(17644,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17647,49): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(17664,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17665,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17666,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17668,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17669,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(17672,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17672,76): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17672,106): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17672,140): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17675,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(17676,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(17677,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(17683,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(17708,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17709,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17710,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(17711,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(17715,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(17716,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17718,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17723,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(17724,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17729,59): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(17729,84): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17735,50): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(17751,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17753,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17754,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17755,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17756,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(17759,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17759,69): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17759,106): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17760,23): run-time error CSS1039: Token not allowed after unary operator: '-font-family'
(17763,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(17764,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(17765,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(17768,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(17772,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(17773,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(17778,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(17796,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17797,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17801,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(17802,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17807,28): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(17808,30): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(17820,35): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(17820,77): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(17824,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(17835,22): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(17836,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(17837,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(17845,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(17846,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17847,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(17848,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(17857,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(17858,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(17869,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(17870,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(17872,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17872,69): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(17876,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(17877,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(17892,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17893,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17896,60): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-dark'
(17897,17): run-time error CSS1030: Expected identifier, found '.'
(17897,25): run-time error CSS1031: Expected selector, found ')'
(17897,25): run-time error CSS1025: Expected comma or open brace, found ')'
(17900,17): run-time error CSS1030: Expected identifier, found '.'
(17900,25): run-time error CSS1031: Expected selector, found ')'
(17900,25): run-time error CSS1025: Expected comma or open brace, found ')'
(17919,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(17920,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(17925,43): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(17925,75): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(17925,120): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(17926,43): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(17926,75): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(17926,115): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(17927,43): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(17927,75): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(17927,115): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(17928,43): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(17928,75): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17928,118): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17942,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(17943,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(17947,40): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(17947,79): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(17947,118): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(17948,40): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(17948,74): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(17948,113): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(17948,171): run-time error CSS1039: Token not allowed after unary operator: '-ease-in-out'
(17949,40): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(17949,74): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(17949,113): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(17950,40): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(17950,77): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(17950,108): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(17953,60): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(17996,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(18226,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(18246,25): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18274,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18305,54): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18319,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(18319,54): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(18323,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18324,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18325,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(18329,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(18330,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(18341,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(18342,47): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(18348,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-ring'
(18352,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(18353,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(18354,43): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18355,35): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(18356,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(18364,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(18451,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18457,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(18458,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18466,38): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(18473,1): run-time error CSS1019: Unexpected token, found '}'
(18482,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18485,49): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(18490,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(18491,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18500,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(18501,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(18502,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18540,58): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18545,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18547,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(18550,43): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(18551,52): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(18553,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(18554,33): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(18564,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18565,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18570,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(18596,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18599,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18603,43): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(18604,40): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(18604,72): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(18610,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18628,35): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18628,63): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18639,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18640,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18645,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18646,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18663,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18675,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18678,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18682,44): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(18688,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18697,52): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18711,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18712,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18722,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18730,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18735,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18742,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(18743,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(18748,63): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18757,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18767,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18789,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(18790,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18791,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(18792,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18793,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18798,57): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(18801,43): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(18801,75): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(18803,43): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(18803,75): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(18806,40): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18806,76): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(18810,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(18811,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(18812,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18869,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18873,51): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(18889,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(18920,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-md'
(18921,22): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(18922,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(18923,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(18928,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(18930,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(18946,22): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(18947,24): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(18948,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(18950,46): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(18965,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(18968,41): run-time error CSS1039: Token not allowed after unary operator: '-color-hover-bg'
(18984,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(18998,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(18999,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(19007,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(19008,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(19011,38): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(19013,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19014,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(19032,33): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19177,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(19178,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(19197,32): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(19204,29): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(19208,32): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(19208,64): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(19232,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19233,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19234,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19235,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19236,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19237,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19238,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19239,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19243,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19246,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19250,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19251,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19252,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19253,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19254,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19255,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19256,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19257,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19262,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19263,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19264,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19265,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19268,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19269,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19270,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19271,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19279,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-btn'
(19280,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-focus-warning'
(19283,32): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(19284,32): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(19374,32): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(19375,32): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(19376,32): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(19378,28): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(19379,28): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(19380,28): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(19381,28): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(19382,28): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(19383,28): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xxl'
(19392,29): run-time error CSS1039: Token not allowed after unary operator: '-color-info-text'
(19393,29): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(19406,36): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(19407,36): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(19408,36): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(19411,40): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(19412,44): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(19413,47): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(19415,34): run-time error CSS1039: Token not allowed after unary operator: '-shadow-sm'
(19416,34): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(19417,34): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(19452,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19453,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(19459,32): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav'
(19560,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(19561,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19565,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(19566,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19574,22): run-time error CSS1039: Token not allowed after unary operator: '-color-text-light'
(19580,50): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(19591,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(19603,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(19606,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(19633,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19634,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(19639,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(19661,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(19675,42): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(19761,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(19763,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(19764,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(19779,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(19780,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(19781,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19900,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(19913,45): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-hover'
(19921,62): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19937,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(19963,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-hover'
(19990,37): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(19991,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(19991,82): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(19995,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(19995,33): run-time error CSS1035: Expected colon, found '{'
(20000,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(20000,57): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20001,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20001,64): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(20005,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(20005,32): run-time error CSS1035: Expected colon, found '{'
(20008,56): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20011,42): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(20011,72): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20012,31): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(20012,73): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(20013,33): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(20013,75): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(20014,58): run-time error CSS1039: Token not allowed after unary operator: '-line-height'
(20016,57): run-time error CSS1039: Token not allowed after unary operator: '-line-height'
(20029,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(20030,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20031,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(20032,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(20038,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(20039,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20040,23): run-time error CSS1039: Token not allowed after unary operator: '-line-height'
(20044,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent-light'
(20045,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20049,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(20051,35): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(20053,53): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(20054,40): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20057,36): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20104,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20108,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(20109,28): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(20110,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(20113,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20114,28): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(20117,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(20117,55): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(20138,22): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-bg'
(20139,35): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(20140,27): run-time error CSS1039: Token not allowed after unary operator: '-popup-backdrop-filter'
(20141,40): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(20144,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(20144,33): run-time error CSS1035: Expected colon, found '{'
(20179,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(20180,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20181,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20182,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(20186,38): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(20188,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(20189,10): run-time error CSS1035: Expected colon, found '{'
(20201,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20207,42): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-input'
(20207,72): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20220,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20221,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(20222,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20226,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20243,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20244,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20252,22): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20256,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(20256,42): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(20269,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(20270,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(20273,57): run-time error CSS1039: Token not allowed after unary operator: '-line-height'
(20275,57): run-time error CSS1039: Token not allowed after unary operator: '-line-height'
(20282,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20297,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20311,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20331,32): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20337,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20358,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20359,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20361,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20366,35): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(20389,17): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(20399,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(20406,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(20439,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(20451,39): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(20480,22): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(20490,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(20495,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(20499,55): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(20516,36): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(20517,59): run-time error CSS1039: Token not allowed after unary operator: '-pill-cluster-right'
(20574,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(20604,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20617,22): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(20618,24): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(20619,29): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20622,41): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20623,43): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20624,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20626,73): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20630,41): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20631,43): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20632,48): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20635,41): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20636,43): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20637,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20700,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(20702,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(20703,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(20704,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20705,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20713,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-semibold'
(20714,17): run-time error CSS1039: Token not allowed after unary operator: '-color-info'
(20721,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20757,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(20759,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(20760,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(20761,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20762,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20808,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(20809,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(20811,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(20812,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20813,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20827,42): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(20842,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xs'
(20843,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(20845,54): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20864,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(20866,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(20867,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(20868,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20869,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20884,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(20886,28): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(20887,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20888,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(20889,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(20895,53): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20905,29): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20912,67): run-time error CSS1039: Token not allowed after unary operator: '-ease-out-quint'
(20914,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(20915,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '0%'
(20941,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(20942,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20944,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(20945,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(20949,59): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20950,64): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(20957,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20962,24): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(20986,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(20987,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(20988,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(20989,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-xl'
(20992,69): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(20996,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21003,47): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(21004,47): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21005,46): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21009,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(21038,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(21046,42): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(21060,22): run-time error CSS1039: Token not allowed after unary operator: '-input-height'
(21120,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(21121,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(21123,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(21124,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-md'
(21128,42): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(21129,44): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21130,25): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(21135,25): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(21138,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(21138,24): run-time error CSS1062: Expected semicolon or closing curly-brace, found '0%'
(21144,27): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21145,29): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21146,30): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(21268,10): run-time error CSS1030: Expected identifier, found '>'
(21268,28): run-time error CSS1031: Expected selector, found ')'
(21268,28): run-time error CSS1025: Expected comma or open brace, found ')'
(21318,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(21336,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(21336,38): run-time error CSS1035: Expected colon, found '{'
(21395,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(21408,47): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(21409,49): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21460,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(21556,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21563,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(21564,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-md'
(21572,22): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(21581,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21599,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-sm'
(21604,17): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(21605,24): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(21631,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(21632,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(21633,25): run-time error CSS1039: Token not allowed after unary operator: '-radius-sm'
(21636,42): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(21641,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(21642,32): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(21647,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(21676,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21823,46): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(21823,72): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(21832,27): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(21837,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(21839,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(21841,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(21842,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(21846,33): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(21855,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(21856,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(21857,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21876,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(21878,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(21880,32): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(21886,60): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(21888,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(21888,55): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(21904,30): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(21905,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(21918,19): run-time error CSS1039: Token not allowed after unary operator: '-card-padding'
(21919,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(21965,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(21966,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(21967,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(21968,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(21971,41): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(21974,19): run-time error CSS1030: Expected identifier, found '>'
(21974,62): run-time error CSS1031: Expected selector, found ')'
(21974,62): run-time error CSS1025: Expected comma or open brace, found ')'
(21985,10): run-time error CSS1030: Expected identifier, found '.'
(21987,67): run-time error CSS1031: Expected selector, found ')'
(21987,67): run-time error CSS1025: Expected comma or open brace, found ')'
(21999,30): run-time error CSS1030: Expected identifier, found '.'
(22001,87): run-time error CSS1031: Expected selector, found ')'
(22001,87): run-time error CSS1025: Expected comma or open brace, found ')'
(22009,22): run-time error CSS1039: Token not allowed after unary operator: '-oe-fill'
(22011,30): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(22011,69): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(22016,41): run-time error CSS1039: Token not allowed after unary operator: '-oe-fill'
(22037,38): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(22044,19): run-time error CSS1030: Expected identifier, found '>'
(22044,62): run-time error CSS1031: Expected selector, found ')'
(22044,62): run-time error CSS1025: Expected comma or open brace, found ')'
(22055,21): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22055,42): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22061,56): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22125,52): run-time error CSS1030: Expected identifier, found '>'
(22125,63): run-time error CSS1031: Expected selector, found ')'
(22125,63): run-time error CSS1025: Expected comma or open brace, found ')'
(22126,37): run-time error CSS1030: Expected identifier, found '>'
(22126,48): run-time error CSS1031: Expected selector, found ')'
(22126,48): run-time error CSS1025: Expected comma or open brace, found ')'
(22129,40): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(22137,26): run-time error CSS1030: Expected identifier, found '>'
(22137,62): run-time error CSS1031: Expected selector, found ')'
(22137,62): run-time error CSS1025: Expected comma or open brace, found ')'
(22150,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(22151,28): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(22164,10): run-time error CSS1030: Expected identifier, found '>'
(22164,47): run-time error CSS1031: Expected selector, found ')'
(22164,47): run-time error CSS1025: Expected comma or open brace, found ')'
(22165,28): run-time error CSS1030: Expected identifier, found '>'
(22165,47): run-time error CSS1031: Expected selector, found ')'
(22165,47): run-time error CSS1025: Expected comma or open brace, found ')'
(22166,28): run-time error CSS1030: Expected identifier, found '>'
(22166,47): run-time error CSS1031: Expected selector, found ')'
(22166,47): run-time error CSS1025: Expected comma or open brace, found ')'
(22176,44): run-time error CSS1030: Expected identifier, found '.'
(22176,45): run-time error CSS1030: Expected identifier, found 'home-head-summary'
(22176,80): run-time error CSS1031: Expected selector, found ')'
(22176,80): run-time error CSS1025: Expected comma or open brace, found ')'
(22177,44): run-time error CSS1030: Expected identifier, found '.'
(22177,45): run-time error CSS1030: Expected identifier, found 'home-head-summary'
(22177,80): run-time error CSS1031: Expected selector, found ')'
(22177,80): run-time error CSS1025: Expected comma or open brace, found ')'
(22199,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(22200,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(22222,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(22232,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(22246,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(22295,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(22296,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(22297,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(22301,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(22301,45): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(22304,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(22305,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(22327,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-lg'
(22328,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(22363,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(22366,17): run-time error CSS1039: Token not allowed after unary operator: '-color-success-text'
(22366,43): run-time error CSS1039: Token not allowed after unary operator: '-color-success'
(22369,17): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(22387,24): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(22425,10): run-time error CSS1030: Expected identifier, found '.'
(22425,29): run-time error CSS1031: Expected selector, found ')'
(22425,29): run-time error CSS1025: Expected comma or open brace, found ')'
(22444,17): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(22446,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(22463,16): run-time error CSS1030: Expected identifier, found '>'
(22463,37): run-time error CSS1031: Expected selector, found ')'
(22463,37): run-time error CSS1025: Expected comma or open brace, found ')'
(22497,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22498,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22499,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22500,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22501,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22502,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22503,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22504,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22505,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22506,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22507,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22508,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22509,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22510,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22511,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22512,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22513,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22514,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22515,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22516,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22517,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22519,14): run-time error CSS1030: Expected identifier, found '.'
(22519,23): run-time error CSS1031: Expected selector, found ')'
(22519,23): run-time error CSS1025: Expected comma or open brace, found ')'
(22533,14): run-time error CSS1030: Expected identifier, found '.'
(22533,23): run-time error CSS1031: Expected selector, found ')'
(22533,23): run-time error CSS1025: Expected comma or open brace, found ')'
(22540,14): run-time error CSS1030: Expected identifier, found '.'
(22540,23): run-time error CSS1031: Expected selector, found ')'
(22540,23): run-time error CSS1025: Expected comma or open brace, found ')'
(22541,14): run-time error CSS1030: Expected identifier, found '.'
(22541,23): run-time error CSS1031: Expected selector, found ')'
(22541,23): run-time error CSS1025: Expected comma or open brace, found ')'
(22542,14): run-time error CSS1030: Expected identifier, found '.'
(22542,23): run-time error CSS1031: Expected selector, found ')'
(22542,23): run-time error CSS1025: Expected comma or open brace, found ')'
(22605,36): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(22614,36): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(22636,66): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(22639,86): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-text'
(22668,56): run-time error CSS1030: Expected identifier, found '>'
(22668,58): run-time error CSS1030: Expected identifier, found '.'
(22668,71): run-time error CSS1031: Expected selector, found ')'
(22668,71): run-time error CSS1025: Expected comma or open brace, found ')'
(22696,27): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(22723,10): run-time error CSS1030: Expected identifier, found '.'
(22723,34): run-time error CSS1031: Expected selector, found ')'
(22723,34): run-time error CSS1025: Expected comma or open brace, found ')'
(22746,19): run-time error CSS1030: Expected identifier, found '.'
(22746,65): run-time error CSS1031: Expected selector, found ')'
(22746,65): run-time error CSS1025: Expected comma or open brace, found ')'
(22752,19): run-time error CSS1030: Expected identifier, found '.'
(22752,65): run-time error CSS1031: Expected selector, found ')'
(22752,65): run-time error CSS1025: Expected comma or open brace, found ')'
(22756,19): run-time error CSS1030: Expected identifier, found '.'
(22756,65): run-time error CSS1031: Expected selector, found ')'
(22756,65): run-time error CSS1025: Expected comma or open brace, found ')'
(22762,19): run-time error CSS1030: Expected identifier, found '>'
(22762,71): run-time error CSS1031: Expected selector, found ')'
(22762,71): run-time error CSS1025: Expected comma or open brace, found ')'
(22834,13): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(22837,14): run-time error CSS1030: Expected identifier, found '.'
(22837,38): run-time error CSS1031: Expected selector, found ')'
(22837,38): run-time error CSS1025: Expected comma or open brace, found ')'
(22860,85): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(22863,112): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(22865,90): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(22866,98): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(22866,132): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-medium'
(22867,102): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(22872,132): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(22900,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-lg'
(22901,22): run-time error CSS1039: Token not allowed after unary operator: '-shadow-lg'
(22904,92): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(22939,34): run-time error CSS1030: Expected identifier, found '>'
(22939,36): run-time error CSS1030: Expected identifier, found '.'
(22939,84): run-time error CSS1031: Expected selector, found ')'
(22939,84): run-time error CSS1025: Expected comma or open brace, found ')'
(22951,73): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(22956,133): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(22964,54): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23015,14): run-time error CSS1030: Expected identifier, found '#tbTipSearch'
(23015,107): run-time error CSS1031: Expected selector, found ')'
(23015,107): run-time error CSS1025: Expected comma or open brace, found ')'
(23096,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23105,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(23125,83): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23128,58): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(23293,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23296,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(23304,33): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23307,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23309,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23310,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(23316,39): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(23316,81): run-time error CSS1039: Token not allowed after unary operator: '-transition-fast'
(23320,46): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(23323,22): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(23327,29): run-time error CSS1039: Token not allowed after unary operator: '-color-border-focus'
(23327,55): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(23368,28): run-time error CSS1039: Token not allowed after unary operator: '-color-info-border'
(23370,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius'
(23371,22): run-time error CSS1039: Token not allowed after unary operator: '-color-info-bg'
(23372,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23373,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23382,38): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-border'
(23382,88): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-bg'
(23383,38): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-border'
(23383,88): run-time error CSS1039: Token not allowed after unary operator: '-color-danger-bg'
(23384,38): run-time error CSS1039: Token not allowed after unary operator: '-color-success-border'
(23384,88): run-time error CSS1039: Token not allowed after unary operator: '-color-success-bg'
(23385,72): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(23392,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(23393,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(23395,23): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-normal'
(23412,47): run-time error CSS1039: Token not allowed after unary operator: '-color-primary'
(23414,22): run-time error CSS1039: Token not allowed after unary operator: '-color-primary-light'
(23433,58): run-time error CSS1039: Token not allowed after unary operator: '-font-size-base'
(23452,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(23452,33): run-time error CSS1035: Expected colon, found '{'
(23478,50): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23523,36): run-time error CSS1039: Token not allowed after unary operator: '-color-link'
(23536,28): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23538,25): run-time error CSS1039: Token not allowed after unary operator: '-border-radius-sm'
(23539,28): run-time error CSS1039: Token not allowed after unary operator: '-color-bg'
(23540,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23541,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23560,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23599,17): run-time error CSS1039: Token not allowed after unary operator: '-color-warning-text'
(23600,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23614,22): run-time error CSS1039: Token not allowed after unary operator: '-color-warning'
(23622,112): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(23648,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(23649,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '0%'
(23652,1): run-time error CSS1019: Unexpected token, found '@keyframes'
(23653,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '0%'
(23685,24): run-time error CSS1039: Token not allowed after unary operator: '-emo-mask'
(23686,16): run-time error CSS1039: Token not allowed after unary operator: '-emo-mask'
(23688,15): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23689,12): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23713,49): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23714,55): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23715,58): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23716,52): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23719,52): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23720,61): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23721,58): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23723,22): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-card'
(23724,35): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23725,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23726,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23747,81): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(23757,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(23759,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-xl'
(23763,33): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23773,22): run-time error CSS1039: Token not allowed after unary operator: '-ab-own'
(23785,58): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23785,107): run-time error CSS1039: Token not allowed after unary operator: '-ab-own'
(23793,22): run-time error CSS1039: Token not allowed after unary operator: '-ab-own'
(23829,54): run-time error CSS1039: Token not allowed after unary operator: '-ab-own'
(23857,27): run-time error CSS1030: Expected identifier, found '.'
(23857,39): run-time error CSS1031: Expected selector, found ')'
(23857,39): run-time error CSS1025: Expected comma or open brace, found ')'
(23871,31): run-time error CSS1030: Expected identifier, found '.'
(23871,44): run-time error CSS1031: Expected selector, found ')'
(23871,44): run-time error CSS1025: Expected comma or open brace, found ')'
(23885,22): run-time error CSS1039: Token not allowed after unary operator: '-color-danger'
(23890,38): run-time error CSS1039: Token not allowed after unary operator: '-ease-in-out'
(23901,32): run-time error CSS1039: Token not allowed after unary operator: '-color-border'
(23913,22): run-time error CSS1039: Token not allowed after unary operator: '-ab-own'
(23915,21): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23936,17): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23941,43): run-time error CSS1039: Token not allowed after unary operator: '-color-surface-muted'
(23941,78): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23943,50): run-time error CSS1039: Token not allowed after unary operator: '-color-text-muted'
(23946,65): run-time error CSS1039: Token not allowed after unary operator: '-font-size-sm'
(23950,63): run-time error CSS1039: Token not allowed after unary operator: '-color-text'
(23988,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23989,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23992,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23993,5): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(23999,10): run-time error CSS1030: Expected identifier, found '#navFind'
(24007,30): run-time error CSS1031: Expected selector, found ')'
(24007,30): run-time error CSS1025: Expected comma or open brace, found ')'
(24015,10): run-time error CSS1030: Expected identifier, found '#navFind'
(24023,30): run-time error CSS1031: Expected selector, found ')'
(24023,30): run-time error CSS1025: Expected comma or open brace, found ')'
(24068,19): run-time error CSS1039: Token not allowed after unary operator: '-nav-height'
(24072,32): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav'
(24074,28): run-time error CSS1039: Token not allowed after unary operator: '-nav-z'
(24106,32): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav-dropdown'
(24130,64): run-time error CSS1039: Token not allowed after unary operator: '-color-bg-nav-dropdown'
(24143,32): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(24147,32): run-time error CSS1039: Token not allowed after unary operator: '-color-accent'
(24149,27): run-time error CSS1039: Token not allowed after unary operator: '-font-weight-bold'
(24208,14): run-time error CSS1030: Expected identifier, found '.'
(24208,25): run-time error CSS1031: Expected selector, found ')'
(24208,25): run-time error CSS1025: Expected comma or open brace, found ')'
(24242,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
(24243,9): run-time error CSS1062: Expected semicolon or closing curly-brace, found '-'
 */
@charset "UTF-8";/*!
 * Bootstrap  v5.2.3 (https://getbootstrap.com/)
 * Copyright 2011-2022 The Bootstrap Authors
 * Copyright 2011-2022 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initializm{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"- "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + .75rem + 2px);padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.375rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.375rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));background:0 0;border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{background:0 0;border:0;border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:#212529;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:#212529;--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#0c63e4;--bs-accordion-active-bg:#e7f1ff}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:#6c757d;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#084298;--bs-alert-bg:#cfe2ff;--bs-alert-border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{--bs-alert-color:#41464b;--bs-alert-bg:#e2e3e5;--bs-alert-border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{--bs-alert-color:#0f5132;--bs-alert-bg:#d1e7dd;--bs-alert-border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{--bs-alert-color:#055160;--bs-alert-bg:#cff4fc;--bs-alert-border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{--bs-alert-color:#664d03;--bs-alert-bg:#fff3cd;--bs-alert-border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{--bs-alert-color:#842029;--bs-alert-bg:#f8d7da;--bs-alert-border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{--bs-alert-color:#636464;--bs-alert-bg:#fefefe;--bs-alert-border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{--bs-alert-color:#141619;--bs-alert-bg:#d3d3d4;--bs-alert-border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: ;--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important}.link-primary{color:#0d6efd!important}.link-primary:focus,.link-primary:hover{color:#0a58ca!important}.link-secondary{color:#6c757d!important}.link-secondary:focus,.link-secondary:hover{color:#565e64!important}.link-success{color:#198754!important}.link-success:focus,.link-success:hover{color:#146c43!important}.link-info{color:#0dcaf0!important}.link-info:focus,.link-info:hover{color:#3dd5f3!important}.link-warning{color:#ffc107!important}.link-warning:focus,.link-warning:hover{color:#ffcd39!important}.link-danger{color:#dc3545!important}.link-danger:focus,.link-danger:hover{color:#b02a37!important}.link-light{color:#f8f9fa!important}.link-light:focus,.link-light:hover{color:#f9fafb!important}.link-dark{color:#212529!important}.link-dark:focus,.link-dark:hover{color:#1a1e21!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}
/*# sourceMappingURL=bootstrap.min.css.map */
/* ============================================================
   PacklistPRO - styles.css
   Site-specific overrides only. All shared design-system rules
   live in Shared/styles_shared.css.
   ============================================================ */

/* PLP nav-brand "PRO" emphasis */
.nav-brand-pro {
    color: var(--color-primary);
    font-weight: 800;
    margin-left: 0.05em;
}
.nav-brand:hover .nav-brand-pro { color: var(--color-primary); }

/* AskAI cache key: a 64-char SHA-256 that is occasionally needed for a plp_AICache
   lookup but is never read as text. Clipped to one line so it stops dominating the
   metadata grid; the full value is on the element's title and, more importantly, on
   the Copy button's data-clipboard-text — so what you paste is the whole hash, not
   the ellipsis. Truncating with CSS rather than in the markup is what keeps the
   title and a text selection honest. */
.ai-cache-key {
    display: inline-block;
    max-width: 22ch;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: bottom;
}
.ai-cache-key-copy { margin-left: 0.35rem; }

/* One-tap trip-name suggestions under the name field on a NEW trip (PLR-293).
   Chips reuse the shared .pill so they match every other chip on the site; these
   are <button>s, so the cursor and hover need saying explicitly — .pill is
   normally worn by non-interactive spans. */
.plp-name-suggest {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin-top: 0.4rem;
}
.plp-name-suggest-chip {
    cursor: pointer;
    border: 1px solid var(--color-border);
    background: var(--color-bg-card);
    color: var(--color-text);
    font: inherit;
    font-size: var(--font-size-sm, 0.875rem);
}
.plp-name-suggest-chip:hover,
.plp-name-suggest-chip:focus-visible {
    border-color: var(--color-primary);
    color: var(--color-primary);
}

/* The nav toggle's icons are inline SVG rather than ☰ / ✕ text glyphs (PLR-296).
   display:block on the SVG removes the inline baseline gap: as an inline element it
   reserved descender space and the icon box measured 24x28 for a 24px icon, sitting
   slightly low in the 44px button. This is set on the SVG (the child), so it does
   NOT disturb the shared .nav-toggle-icon{display:inline-block} rule on the span,
   which is what the [aria-expanded] open/close swap keys off. */
.nav-toggle-icon > svg { display: block; }

/* ══ Notched / safe-area devices (iPhone X and later, and friends) ═════════════
   PLR-297, 2026-08-11. Ported from qMEET's QMR-234 block so the two sites handle
   cutouts identically; values below are re-derived from THIS site's shipped
   numbers rather than copied across.

   ⚠ THE VIEWPORT META AND THIS BLOCK ARE A PAIR. env() only returns a real number
   when the viewport meta carries viewport-fit=cover; without it the browser lays
   the page out inside the safe area and every inset resolves to its 0px fallback.
   Site.Master now sets it, so this goes live with it. Proof that this is a real
   trap and not a theoretical one: .plp-mp-movebar further down this file has
   carried an env(safe-area-inset-bottom) offset all along and it has never once
   resolved to anything but zero.

   EVERY VALUE IS A calc() OVER THE SHIPPED NUMBER, never a replacement. Writing
   `padding-bottom: env(...)` would DROP the footer's existing 1.5rem on any device
   with no bottom inset — a desktop PWA, an older phone — which is most of them.

   SPECIFICITY IS DELIBERATE. Content/styles.css loads BEFORE Shared/styles_shared.css
   (Bundle.config), and .site-nav / .page-wrapper / .site-footer are all defined
   there, so a bare `.page-wrapper { }` here would lose the cascade silently. The
   leading `body ` / `main` qualifier is what wins it.

   BASE VALUES WERE READ OUT OF THE SHARED SHEET, not assumed: .page-wrapper is
   0.65rem at <=575, 1rem, then 1.5rem at >=768 (and 2rem 1.5rem at >=1200, whose
   left/right matches the 768 value); .site-footer is 1.5rem 1rem, tightening to
   1rem 0.75rem on phones; .nav-inner is 0 1rem. If those move, move these.

   NOT COVERED ON PURPOSE: .toc-btn gets side/bottom insets on qMEET but does not
   render on PacklistPRO, so there is nothing to offset.
   ⚠ CORRECTED 2026-08-12: this used to say the same of .back-to-top ("neither
   renders on PacklistPRO — checked the served DOM, zero hits"). That is WRONG and
   was wrong at whatever width it was checked: PacklistPRO/Scripts/site.js:3174
   BUILDS the button (`btn.className = 'back-to-top'`) on every page, exactly as
   qFIT's and qMEET's do. Re-measured on /PlacesNearMe at a 380px viewport on
   2026-08-12 — a live 46×46 disc at opacity 0.92, overlapping the footer's own
   "Back to top" button. Its bottom inset is handled in Shared/styles_shared.css
   (the footer clearance in the ≤575px block) since all three sites need it. .banner-offline and .pwa-install-btn are left alone
   because I could not confirm their shipped base padding, and a calc() over a
   guessed base is precisely the "replaced instead of added" bug described above.
   .plp-mp-movebar already carries its own bottom inset and is deliberately not
   repeated here.

   ON A DEVICE WITH NO INSETS every rule collapses to the value it already had, so
   this is a no-op on desktop, on Android without a cutout, and on older phones. ── */

/* The nav's painted area grows upward under the status bar. --nav-height is
   redefined rather than only padding the bar, because other rules position things
   "below the nav" off that token (the sticky Packlist category headers added in
   PLR-277, dropdown panels, scroll-padding-top) and would otherwise drift by the
   inset. Doubled :root beats the shared sheet's own :root at equal specificity. */
:root:root { --nav-height: calc(56px + env(safe-area-inset-top, 0px)); }
body .site-nav { padding-top: env(safe-area-inset-top, 0px); }
/* Nav CONTENT is inset from the cutout; the bar's BACKGROUND still bleeds to the
   physical edge, which is the entire point of viewport-fit=cover. */
body .site-nav .nav-inner {
    padding-left:  calc(1rem + env(safe-area-inset-left, 0px));
    padding-right: calc(1rem + env(safe-area-inset-right, 0px));
}

/* Page gutters. Left/right only — the wrapper never touches the top or bottom
   edge. Scoped to `screen` so the print rule's `padding: 0` is left alone. */
@media screen and (max-width: 575px) {
    body main.page-wrapper {
        padding-left:  calc(0.65rem + env(safe-area-inset-left, 0px));
        padding-right: calc(0.65rem + env(safe-area-inset-right, 0px));
    }
}
@media screen and (min-width: 576px) and (max-width: 767px) {
    body main.page-wrapper {
        padding-left:  calc(1rem + env(safe-area-inset-left, 0px));
        padding-right: calc(1rem + env(safe-area-inset-right, 0px));
    }
}
@media screen and (min-width: 768px) {
    body main.page-wrapper {
        padding-left:  calc(1.5rem + env(safe-area-inset-left, 0px));
        padding-right: calc(1.5rem + env(safe-area-inset-right, 0px));
    }
}

/* Footer sits on the bottom edge, so it takes the home-indicator inset too. */
@media screen {
    body .site-footer {
        padding-left:   calc(1rem + env(safe-area-inset-left, 0px));
        padding-right:  calc(1rem + env(safe-area-inset-right, 0px));
        padding-bottom: calc(1.5rem + env(safe-area-inset-bottom, 0px));
    }
}
@media screen and (max-width: 575px) {
    body .site-footer {
        padding-left:   calc(0.75rem + env(safe-area-inset-left, 0px));
        padding-right:  calc(0.75rem + env(safe-area-inset-right, 0px));
        padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
    }
}

/* Good-news variant of the Home reminders list (departure day / welcome home).
   Mirrors the shape of .home-todo-alerts-danger in styles_shared.css:7455 but in
   the success palette — the base .home-todo-alerts is warning-toned, and a
   "Today's the day!" rendered in amber or red reads as a problem rather than as
   the nice thing that just happened. Both success tokens have dark-mode values,
   so this needs no [data-theme] rule of its own. */
.home-todo-alerts-good li {
    background: var(--color-success-bg);
    border-color: var(--color-success-border);
    color: var(--color-success);
}
.home-todo-alerts-good .link { color: var(--color-success); }

/* Quiet accent while the selected trip is actually under way — the class comes
   from Site.Master's BrandStateClass, which is Session-cached per trip per day.
   THE ONE LOGO GLOW LEFT ON ANY SITE (owner, 2026-10-05): the glow was removed
   from every logo on 2026-10-03, and the owner then asked for this one back —
   "leave it for packlist Pro, if a trip is in progress". With no trip under way
   the class is absent and "PRO" has no glow, like the other sites.
   DELIBERATELY UNDERSTATED AND COMPLETELY STILL: this sits on every page, all
   day, for the whole length of a trip. Anything that moved or blinked would be
   unbearable by day two, so it is a soft glow and nothing else — no animation,
   no size change, no layout shift. */
.nav-brand-pro.nav-brand-underway {
    text-shadow: 0 0 0.5em var(--color-primary);
}

/* ============================================================
   NAV DESCRIPTORS  (.nav-link-desc / -main / -sub)
   ============================================================
   A one-line descriptor under an ambiguous nav entry, so a new user is told
   what a destination is at the point of choice rather than after clicking.
   SAME class names and SAME markup shape as qMEET/Content/styles.css §15 and
   qFIT/Content/styles.css §53 — deliberately one mechanism across the three
   sites, not three.

   ⚠ IT IS NOT IN THE SHARED SHEET, and that is not an oversight. Checked
   2026-08-01: `.nav-link-sub` appears in qMEET/Content/styles.css and
   qFIT/Content/styles.css and in NEITHER Shared/styles_shared.css nor any
   other site. qFIT set the precedent of a per-site copy when it added §53,
   and its comment explains why the copies are not byte-identical: each site
   needs a selector that beats ITS OWN mobile overrides, and qFIT's is one
   class heavier than qMEET's for exactly that reason. Hoisting all three into
   Shared is still the right end state, but it is a 5-site edit (Shared is
   consumed by NHT and PM too) plus a CACHE_VERSION bump on qMEET and qFIT to
   evict their now-dead local copies — deliberately NOT bundled into this
   change. Do the hoist as its own piece of work, or the three stay in step.

   ⚠ THE SELECTOR MUST OUT-SPECIFY THE SHARED SHEET, WHICH PLP LOADS LAST.
   Bundle.config order is bootstrap -> Content/styles.css -> Shared/
   styles_shared.css, so at equal specificity the shared rule wins and source
   order cannot save us. The rules being overridden are:
       .nav-link                              (0,1,0)  display:flex;
                                                       align-items:center;
                                                       white-space:nowrap
       .nav-dropdown .nav-link                (0,2,0)  font-size
       @media(max-width:991px)
         .nav-dropdown .nav-link              (0,2,0)  padding, color
       .nav-menu > .nav-item > .nav-link      (0,3,0)  font-size
   `.site-nav .nav-menu .nav-link.nav-link-desc` is (0,4,0) and beats all four
   outright, and one selector covers dropdown children AND root-level links.
   Do NOT "tidy" it down to a bare `.nav-link-desc` — that is (0,1,0) and would
   lose to three of the four above, in a sheet that loads after this one.
   PLP carries no nav rules of its own beyond .nav-brand-pro above, so the
   shared sheet is the only thing to out-specify here.

   White-on-dark is correct in BOTH themes: --color-bg-nav is #1a1a2e in light
   and #0d0d0f in dark, i.e. the nav bar is dark either way, and the shared
   sheet colors .nav-link rgba(255,255,255,0.85) unconditionally. There is no
   [data-theme="dark"] variant to write. */
.site-nav .nav-menu .nav-link.nav-link-desc {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.125rem;
    white-space: normal;
    line-height: 1.3;
}
/* The label row. Keeps emoji + text (and the What's New count badge, if a
   descriptor is ever added to that entry) on one line — in a column flex
   container a sibling element would otherwise become its own row and drop
   underneath the label. */
.site-nav .nav-menu .nav-link.nav-link-desc .nav-link-main {
    display: flex;
    align-items: center;
    gap: 0.375rem;
}
/* 🎨 OWNER RULE 2026-09-12, ALL FIVE SITES: the descriptor is the SAME COLOR as the
   nav item's own label, in EVERY state — resting, hovered and current. So it takes
   `color: inherit` and NEVER a literal of its own. The anchor is the single source:
   styles_shared.css colors .nav-link rgba(255,255,255,0.85) resting and #111 on the
   cyan hover/.active fill, gives .nav-link-logout its red, and dims .nav-dropdown
   .nav-link to 0.7 white under (max-width: 991px) — inherit follows all four for free.
   🛑 Do NOT "restore" the old dimmer values: the descriptor was rgba(255,255,255,0.55)
   resting and rgba(255,255,255,0.85) on hover/.active, i.e. near-WHITE text sitting on
   the cyan fill (2.48:1) where the label beside it had already gone near-black. Only
   the font SIZE and WEIGHT still separate the two lines, which is the intent. */
.site-nav .nav-menu .nav-link.nav-link-desc .nav-link-sub {
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-normal, 400);
    color: inherit;
    white-space: normal;
}
/* Hover / current page: color still inherits (the rule above already says so — this
   restates it so a lower-specificity :hover rule in another sheet can never repaint
   the descriptor away from its label). .active bolds the anchor; the span stays normal. */
.site-nav .nav-menu .nav-link.nav-link-desc:hover .nav-link-sub,
.site-nav .nav-menu .nav-link.nav-link-desc.active .nav-link-sub {
    color: inherit;
    font-weight: var(--font-weight-normal, 400);
}

/* Hamburger ⇄ close-X icon swap moved to shared styles_shared.css (2026-06-24, cross-site). */

/* ── PR-03: keep the floating "❓" help pill off the last nav item ────────────────────────
   THE BUG (measured on prod 2026-08-06 at a 1019px viewport, re-measured on dev 2026-08-07
   at 1556px layout width). Shared/styles_shared.css puts .tutorial-help-pill at
   `position:fixed; top:0.5rem; right:var(--pill-cluster-right,1rem); z-index:1502`, while
   .site-nav is z-index 1000 (--nav-z). So the pill wins the hit test wherever it lands on the
   nav, and document.elementFromPoint() at the center of the last nav item returned
   #tutorialHelpPill — swallowing the click. Signed in that item is the "Paul" My Account
   dropdown (Profile / Preferences / Update Credentials / Notifications / Invite a Friend /
   Logout); anonymous it is Login.

   THE GEOMETRY, so the numbers below are derivable and not magic. `.site-nav .nav-inner` is
   `max-width:1200px; margin:0 auto; padding:0 1rem`, so its right edge sits `gutter` px from
   the viewport edge where gutter = max(0, (layoutWidth - 1200) / 2). The pill is 30px wide at
   right:16px, i.e. it occupies the last 46px. They collide whenever gutter < 46px, which is
   layoutWidth < 1292px. Measured at 1556px (gutter 178px) there is no collision and the
   hit test correctly returns the nav item — that reading is the must-succeed control for the
   probe, not evidence the bug is absent.

   WHY NOT qMEET'S FIX. qMEET solves this by moving the pill horizontally
   (--pill-cluster-right: calc(gutter + 5rem)), which works there because qMEET shows the
   hamburger at EVERY width — the top strip left of the ☰ is empty, so there is somewhere to
   move to. PacklistPRO renders the full horizontal nav from 992px up, so that same shift just
   drops the pill onto a DIFFERENT nav item. Below 1292px there is no horizontal slot in the
   nav strip that is clear of the nav. Do not "align this with qMEET" — re-read this note first.

   THE FIX. Reserve the corner instead of moving the pill, which is this codebase's own
   established answer to this exact collision: Shared/styles_shared.css .banner-simplemode-inner
   does the same thing with the same `calc(var(--pill-cluster-right,1rem) + 2.4rem)` after the
   identical elementFromPoint finding on PacklistPRO on 2026-08-04. Scoped to the band where the
   gutter cannot pay for it; above 1292px the gutter already does and nothing changes. 2.4rem is
   the pill's own min-width (1.9rem) plus breathing room, so 1rem + 2.4rem = 54.4px clears the
   pill's 46px with room to spare.

   ⚠ SPECIFICITY IS LOAD-BEARING. styles_shared.css loads AFTER Content/styles.css (verified in
   the served /Content/css bundle 2026-08-07: bootstrap @366k, this file @553k, shared @864k),
   and it declares `.site-nav .nav-inner` (0,2,0). A bare `.site-nav .nav-inner` here would tie
   and LOSE on source order, silently. The leading `body ` makes it (0,2,1) and wins.

   ⚠ KNOWN INTERACTION with QL-20/F21 (nav overflow), which is a SEPARATE item: measured on dev
   2026-08-07 signed in as the owner, the nav row's intrinsic content width is 1011px + 32px
   padding = 1043px, but the desktop bar switches on at 992px — so 992-1042px already clips nav
   items off the right edge with no hamburger. This rule adds 38.4px to that requirement. That
   band is broken either way until QL-20 raises the hamburger breakpoint; fixing it there is the
   right place, not here. */
@media (min-width: 992px) and (max-width: 1291.98px) {
    body .site-nav .nav-inner {
        padding-right: calc(var(--pill-cluster-right, 1rem) + 2.4rem);
    }
    /* 2026-08-19: the corner is TWO pills wide wherever the light/dark .theme-pill renders
       (Site.Master #themePill — admins + trusted users), and it sits immediately LEFT of the
       ❓, i.e. on the nav side. The reserve above pays for one pill; without this it would
       leave the second one sitting on the last nav item, which is the exact collision the
       whole block exists to stop. 4.8rem = two pill slots.
       Scoped with :has() rather than applied unconditionally, because for everyone else the
       corner really is one pill wide and the extra 38.4px would eat nav width in the band
       that has the least of it. A browser without :has() falls back to the one-pill reserve,
       i.e. to the pre-2026-08-19 behavior — not to something broken.
       Specificity: (0,3,1) with the leading `body `, so it beats the rule above it and the
       shared `.site-nav .nav-inner` (0,2,0) alike. Same reasoning as the ⚠ note above. */
    body:has(.theme-pill) .site-nav .nav-inner {
        padding-right: calc(var(--pill-cluster-right, 1rem) + 4.8rem);
    }
}

/* ── Layout / width utilities ───────────────────────────────────
   Replace ad-hoc inline style="max-width:6rem" / "max-width:10rem"
   so narrow numeric inputs (sort order, currency code, amount) stay
   visually consistent across pages.

   ⚠ The bare selectors below NEVER WORKED — measured on live prod
   2026-07-19, all three usages (Itinerary.aspx tbSortOrder,
   tbExpenseAmount, ddlExpenseCurrency) rendered at 100% below 768px
   and 480px above it, i.e. identical to a plain .textbox. Two rules
   in styles_shared.css beat them, and per Bundle.config shared loads
   AFTER this file:
     • `.textbox { max-width: 100% }`             — equal specificity, later source
     • `.form-group .textbox { max-width: 480px }` — (0,2,0) vs (0,1,0), wins outright
                                                     (scoped to @media min-width:768px)
   Every real usage sits inside a .form-group, so the second decides it.
   The compound selectors are (0,3,0) and win — the same "raise specificity
   to override a shared rule" pattern CLAUDE.md prescribes for this file.
   Bare selectors kept for any future use outside a .form-group.

   Do NOT put these on a <select> whose options are sentences — a clipped
   closed select hides the user's own choice. Short values only. */
.input-w-narrow    { max-width: 6rem;  }
.input-w-narrow-md { max-width: 10rem; }
.form-group .textbox.input-w-narrow,
.form-group .dropdown.input-w-narrow    { max-width: 6rem;  }
.form-group .textbox.input-w-narrow-md,
.form-group .dropdown.input-w-narrow-md { max-width: 10rem; }

/* Generic trailing-button utility — push a button to the end of a
   form-actions row (typically the destructive Delete in Edit pages).
   Pairs with the existing .form-actions flex container. */
.btn-trailing { margin-left: auto; }

/* The .home-newuser-tip* rules and the .tips-close-static variant lived here. Deleted
   2026-07-27 with the Home "New here?" tip card they styled — the "Welcome to
   PacklistPRO" just-joined card replaced it. Zero remaining uses of either class. */

/* Expenses — currency code sits to the RIGHT of the amount input (2026-09-19;
   it used to stack beneath it). The amount takes the remaining width, the
   currency box stays short — just wide enough for "USD" / "EUR". min-width:0
   is what lets the amount input actually shrink inside the flex row. */
.exp-amount-row {
    display: flex;
    gap: 0.4rem;
    align-items: flex-start;
}

.exp-amount-row .exp-amount-input {
    flex: 1 1 auto;
    min-width: 0;
}

.input-currency-suffix {
    flex: 0 0 4.5rem;
    width: 4.5rem;
}

/* AskAI — example-prompt chips. Lowers the blank-canvas barrier by giving
   first-time users one-click prompts they can edit before sending. Styled as
   small, outlined pills that wrap to the next row on narrow screens. */
.ai-examples {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin-bottom: 0.25rem;
}
.ai-example-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.35rem 0.7rem;
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: 999px;
    background: var(--color-bg-card, #fff);
    color: var(--color-text, #222);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.2;
    cursor: pointer;
    transition: background 0.12s ease, border-color 0.12s ease;
}
.ai-example-chip:hover,
.ai-example-chip:focus-visible {
    background: var(--color-hover-wash, #f1f3f6);
    border-color: var(--color-primary, #3b6fb0);
    outline: none;
}

/* ── Packlist / Tasklist ──────────────────────────────────────── */

/* Group header — full-width gray bar */
.plp-checklist { margin-top: 0.25rem; }

/* Read-only mode (anonymous demo viewers on Packlist/Tasklist).
   The main row checkboxes stay interactive so demo visitors can check
   items/tasks off as a visual-only preview — packlist-page.js /
   tasklist-page.js short-circuit the save in read-only mode, so nothing
   a demo visitor toggles is ever written to the database. That keeps the
   shared demo trip pristine and means concurrent visitors never affect
   each other. The genuine account-only controls below stay disabled and
   dimmed: the ⋮ More menu (Buy/Request/Doing/Edit), the quantity
   steppers, and the quick-add row. */
.plp-checklist.plp-readonly .plp-qty-btn,
.plp-checklist.plp-readonly .plp-more-btn,
.plp-checklist.plp-readonly .plp-quick-add {
    pointer-events: none;
    opacity: 0.6;
    cursor: not-allowed;
}

/* TEMPLATE / BACKUP lock (owner, 2026-10-11: "add a lock so templates can't easily be
   changed by accident ... on both trip templates and trip backups"). Packlist and Tasklist
   render such a list with .plp-locked and the .plp-lock-bar strip at its top; Unlock to
   Edit (packlist-page.js / tasklist-page.js) takes the class off for this tab. The mouse
   is stopped here; a keyboard tick is undone by the page script, so both halves matter. */
.plp-checklist.plp-locked .plp-cb-label,
.plp-checklist.plp-locked .plp-qty-stepper,
.plp-checklist.plp-locked .plp-more-btn,
.plp-checklist.plp-locked .plp-quick-add {
    pointer-events: none;
    opacity: 0.55;
    cursor: not-allowed;
}
.plp-lock-bar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem 0.75rem;
    margin: 0 0 0.6rem;
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: var(--color-bg);
    font-size: var(--font-size-sm);
}
.plp-lock-bar .plp-lock-icon { font-size: var(--font-size-lg, 1.125rem); line-height: 1; }
.plp-lock-bar .plp-lock-text { flex: 1 1 14rem; }
.plp-lock-bar .button { margin: 0; }

/* Edit Trip on a TEMPLATE (owner, 2026-10-11): the Destinations and Trip Summary cards are put
   away with the `hidden` attribute (edittrip-page.js TEMPLATE_HIDE_CARDS), not .d-none, which
   on these cards already means "not saved yet". Spelled out per id the way the shared sheet
   does for its own [hidden] cards, so an author display rule can never win over it. */
#pnlDestCard[hidden],
#pnlNotesCard[hidden] { display: none; }

/* Compact mode — Options → "Compact rows" on Packlist/Tasklist. Tightens row
   padding, font size, and inter-group margins so users with long lists see
   more items per screen. Touch-target heights on the actual checkboxes and
   ⋮ buttons are preserved (they stay tappable). Description / Uses sub-lines
   stay readable but lose the extra block-leading. */
/* Options → "Add-Item Boxes" off (owner, 2026-09-19): hide each group's quick-add row. */
.plp-checklist.plp-no-quickadd .plp-quick-add { display: none; }
.plp-checklist.plp-compact .plp-group { margin-bottom: 0.125rem; }
.plp-checklist.plp-compact .plp-group-header {
    padding: 0.3rem 0.625rem;
    font-size: var(--font-size-base);
}
.plp-checklist.plp-compact .plp-item-row {
    padding: 0.2rem 0.15rem 0.2rem 0;
    gap: 0.25rem;
}
.plp-checklist.plp-compact .plp-item-main { gap: 0.25rem; }
.plp-checklist.plp-compact .plp-item-name { font-size: var(--font-size-sm); }
.plp-checklist.plp-compact .plp-item-desc,
.plp-checklist.plp-compact .plp-item-notes,
.plp-checklist.plp-compact .plp-item-uses {
    font-size: var(--font-size-xs);
    line-height: 1.25;
}
.plp-checklist.plp-compact .plp-item-actions { gap: 0.35rem; }
/* No font-size here on purpose: the base .plp-cb-label is now 0.625rem (10px), so this rule's
   old 0.65rem would have made COMPACT captions LARGER than normal ones — and, being (0,3,0) vs
   the base's (0,1,0), it would have won and masked the base size entirely. Compact only needs
   the narrower column; 10px is already as small as these captions should go. */
.plp-checklist.plp-compact .plp-cb-label { min-width: 32px; }
.plp-checklist.plp-compact .plp-more-btn {
    padding: 0.15rem 0.4rem;
    min-height: 30px;
    font-size: 1rem;
}
.plp-checklist.plp-compact .plp-quick-add { padding: 0.3rem 0.5rem; }

.plp-group { margin-bottom: 0.375rem; }
.plp-group-header {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    width: 100%;
    padding: 0.625rem 1rem;
    background: #e8e8e8;
    border: 1px solid #d0d0d0;
    border-radius: var(--border-radius-sm);
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    color: var(--color-text);
    cursor: pointer;
    user-select: none;
    text-align: left;
}
.plp-group-header:hover { filter: brightness(0.97); }
/* Keep the category name on screen while you scroll its own group. The sticky
   containing block is .plp-group, so a header releases as soon as its group
   scrolls past instead of the headers stacking up - which is the behavior you
   want on a long Packlist and comes for free from the existing markup.
   top clears the sticky .site-nav (--nav-height, 56px); z-index sits above the
   rows and far below --nav-z (1000) so the nav still wins.
   DIRECT CHILD is deliberate, not shorthand: Packlist, Tasklist, ConfigureTasks
   and ShowHideTags all render .plp-group > .plp-group-header, while
   ConfigureItems wraps its header in .plp-group-header-wrap to seat the bulk
   Select-All links beside it. That wrapped header is a flex child and is the one
   place stickiness would fight the layout, so this selector skips it. */
.plp-group > .plp-group-header {
    position: sticky;
    top: var(--nav-height, 56px);
    z-index: 2;
}
.plp-expand-icon {
    display: inline-block;
    transition: transform 0.15s;
    font-style: normal;
    font-size: var(--font-size-xs, 0.75rem);
    flex-shrink: 0;
}
/* Clickable variant: per-item expand chevron rendered outside a <button>. */
.plp-expand-icon[data-item-expand] { cursor: pointer; }
.plp-group-header[aria-expanded="true"] > .plp-expand-icon { transform: rotate(90deg); }
.plp-group-count { font-size: var(--font-size-sm); font-weight: var(--font-weight-normal); opacity: 0.75; margin-left: auto; }

/* Spacer rendered in place of .plp-expand-icon when an item has no products to expand.
   🛑 IT RESERVES NO WIDTH ANY MORE (owner, 2026-09-09): "I would rather the left edge of
   the items line up with the left edge of the card with the category name." This spacer
   WAS that gap — a 1rem column plus the row gap held every item name ~2.25rem in from the
   card edge, for a chevron that most rows never show. display:none is what makes the name
   start at the card edge.
   ⚠ The trade it buys, and it is the intended trade: a row that DOES have a chevron is now
   indented by the chevron's own width relative to its neighbours, instead of every row
   being indented by it. Only items flagged **Buy** that have products get one, so this is
   a small minority of rows — and each of them also carries the visible "Show Products"
   link inside the name block, so the chevron was never the only way in.
   🔑 The element is still EMITTED so the [hidden] toggle in packlist-page.js
   (plpOnBuyChanged swaps chevron ↔ spacer live) keeps working untouched. */
.plp-expand-placeholder { display: none; }
.plp-item-row > .plp-expand-icon {
    width: 0.7rem;
    text-align: center;
    flex: 0 0 auto;
}

/* Skeleton placeholders shown while a group's rows are fetched (PLP.skeletonRows).
   Shape mirrors .plp-item-row — same padding, gap and bottom border, a long name
   bar plus the two small SEL/PKD squares — so the real rows land where the
   placeholders were instead of the group snapping open.

   THE BAR COLOR AND THE SHIMMER ARE SEPARATE ON PURPOSE. The bar carries a solid
   translucent gray; the sweep is a moving gradient on ::after. styles_shared.css
   6107 clamps every animation to 0.01ms under prefers-reduced-motion, so with that
   setting on, the sweep simply never travels and what remains is plain gray bars —
   the correct static appearance. Had the gradient been the bar's own background it
   would have frozen mid-sweep as a lopsided smear. */
/* The packing quip above the bars. Fixed height so swapping it for real rows
   does not nudge the layout, and muted enough that it reads as a background
   murmur rather than as content. */
.plp-skeleton-quip {
    margin: 0.4rem 0 0.5rem 0.75rem;
    font-style: italic;
    opacity: 0.7;
}
.plp-skeleton-row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0.5rem 0.5rem 0.75rem;
    border-bottom: 1px solid var(--color-border);
}
.plp-skeleton-bar {
    position: relative;
    overflow: hidden;
    height: 0.85rem;
    border-radius: var(--border-radius-sm, 4px);
    background: rgba(128, 128, 128, 0.22);
}
.plp-skeleton-name { flex: 1 1 auto; max-width: 22rem; }
.plp-skeleton-box  { flex: 0 0 auto; width: 1.6rem; height: 1.6rem; }
/* Uneven name widths — four identical bars read as a rendering fault. */
.plp-skeleton-row:nth-child(2) .plp-skeleton-name { max-width: 15rem; }
.plp-skeleton-row:nth-child(3) .plp-skeleton-name { max-width: 19rem; }
.plp-skeleton-row:nth-child(4) .plp-skeleton-name { max-width: 12rem; }
.plp-skeleton-bar::after {
    content: "";
    position: absolute;
    inset: 0;
    transform: translateX(-100%);
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.25), transparent);
    animation: plpSkeletonSweep 1.4s ease-in-out infinite;
}
@keyframes plpSkeletonSweep { to { transform: translateX(100%); } }

/* Item rows — blue */
.plp-group-items { padding: 0; }
/* 🔑 ZERO left padding is the owner's explicit instruction (2026-09-09): the item name
   must line up with the LEFT EDGE OF THE CARD that carries the category name, not merely
   sit closer to it. .plp-group-items has no padding of its own, so this row's padding-left
   IS the last gap between the name and that edge — with the expand spacer switched off
   above, 0 here puts them flush. It went 0.75rem → 0.15rem → 0 across two passes; don't
   put it back for tidiness.
   Right padding is small for the same reason from the other side: it is space taken from
   the item NAME, which is what wraps on a phone. */
.plp-item-row {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.5rem 0.15rem 0.5rem 0;
    border-bottom: 1px solid var(--color-border);
    color: var(--color-info-text);
    flex-wrap: wrap;
}
.plp-item-row:hover { background: var(--color-info-bg); }
.plp-item-main { display: flex; align-items: baseline; gap: 0.375rem; flex: 1; min-width: 0; flex-wrap: wrap; }
.plp-item-name { font-weight: var(--font-weight-medium); word-break: break-word; }
/* Packlist / Tasklist: the name doubles as the hold / double-click target that opens the
   item or task editor (site.js initLongPress). Mirrors .sl-row-name on ShoppingList.
   Selection is off so a double-click edits instead of selecting the word, and so a hold
   isn't hijacked by the mobile text-selection callout. touch-action stays default — a
   scroll that starts on a name must still scroll the list.
   🔑 Keyed off the ATTRIBUTE, not the class: .plp-item-name is also rendered by
   ConfigureItems, ConfigureTasks and ShowHideTags, where there is no gesture and a hand
   cursor would promise one. Read-only (demo) rows drop the attribute for the same reason.
   The attribute selector also outranks the bare .plp-item-name rules, so it survives
   styles_shared.css loading after this file. */
.plp-item-name[data-longpress-url] {
    cursor: pointer;
    user-select: none;
    -webkit-user-select: none;
    -webkit-touch-callout: none;
}

/* ── Name + ⓘ + status flags = ONE inline run (owner, 2026-09-09) ──────────────────────
   🔴 THE BUG THIS FIXES: .plp-item-main is a WRAPPING flex row, and the name, the ⓘ and
   the "(buy)" flags were three separate FLEX ITEMS. A flex item never shares a line with
   a sibling that no longer fits, so any name long enough to fill the row pushed the ⓘ
   onto a line of its OWN, sitting under the name it annotates instead of after it.
   Wrapping them in one flex item makes the three ordinary INLINE content, so the ⓘ
   follows the last WORD of the name and wraps together with it.
   ⚠ Description / Uses / Notes / "Show Products" stay OUTSIDE this wrapper — they are
   meant to break to their own line, which needs them to remain flex items of
   .plp-item-main. Built by Packlist.aspx.vb AppendItemHtml and the Tasklist twin; the
   live status-flag update in packlist-page.js / tasklist-page.js appends into it so both
   render paths keep the same name → ⓘ → flags order.
   ⚠ min-width:0 so a long unbreakable name shrinks instead of widening the whole row. */
.plp-item-title { min-width: 0; }
/* The flags were separated from the ⓘ by .plp-item-main's flex gap, which no longer
   applies inside the wrapper — the code-behind emits no whitespace between the tags. */
.plp-item-title > .plp-item-flags { margin-left: 0.25rem; }

/* ── Status PILLS after the item name (owner, 2026-09-17) ─────────────────────────────
   Replaces two things at once: the dim "(buy)" / "(not bringing)" parenthetical text, and
   the RED ⋮ BUTTON that used to tint on the same two states. The tint said "something on
   this row is not at its default" without saying WHAT, from the far edge of the row; the
   pill says which one, beside the name it applies to. .plp-more-btn-alert itself stays —
   Tasklist still uses it for its own states (Tasklist.aspx.vb + tasklist-page.js).
   Inline-block inside .plp-item-title, so a pill wraps with the name like the ⓘ does.
   The bg/border/text token TRIPLES are the ones redeclared for dark mode in
   styles_shared.css; --color-warning / --color-danger alone are NOT (see the note above
   .banner-offline there), which is why none of them is used bare here. */
.plp-flag-pill {
    display: inline-block;
    margin-left: 0.3rem;
    padding: 0.05rem 0.45rem;
    border-radius: 999px;
    border: 1px solid transparent;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-bold, 700);
    line-height: 1.5;
    white-space: nowrap;
    vertical-align: baseline;
}
/* Buy = something still to be bought. Amber: an outstanding action, not a problem. */
.plp-flag-buy {
    background: var(--color-warning-bg);
    border-color: var(--color-warning-border);
    color: var(--color-warning-text);
}
/* The EXCLUSION pill — "Not bringing" on Packlist, "Not doing" on Tasklist. One class for
   both because it is one idea: on the list, deliberately not happening. Named for the idea
   rather than either page's wording, so neither site's label owns the other's class.
   Red, because this is the state the red ⋮ was really warning about and the one worth
   catching at a glance. */
.plp-flag-exclude {
    background: var(--color-danger-bg);
    border-color: var(--color-danger-border);
    color: var(--color-danger-text);
}
/* Requested (group trips only — retired on personal ones, see AppendItemHtml). Blue:
   informational, and deliberately not competing with the two above.
   🔴 TEXT IS --color-text, NOT --color-info: there is no --color-info-text twin, and
   --color-info itself is NOT redeclared for dark (it stays #01639b), which on the dark
   --color-info-bg #082a3d is barely legible. The -bg/-border pair carries the color. */
.plp-flag-requested {
    background: var(--color-info-bg);
    border-color: var(--color-info-border);
    color: var(--color-text);
}
/* ★ Important (owner, 2026-10-15: "on PLP tasklist, we should indicate any tasks that are
   marked "important". same with packlist. make sure to use the user's override setting").
   Drawn first among the pills when the row's effective Importance is High: the member's own
   setting when they set one, else the catalog default (both code-behinds; the live twins in
   packlist-page.js / tasklist-page.js read .importance-high off the row).
   PURPLE, because the other colors are taken on these rows: amber = Buy, red = Not
   Bringing / Not Doing, blue = Requested, green = a companion's Packed. Its own light/dark
   pair below, as no shared token triple is purple.
   🔑 A STAR AND NO WORD (owner, same day: "the "important" pills are kind of large. maybe
   remove "important" and just have the star inside the pills"). The pill is empty; the star
   is drawn here, and "Important" is its aria-label + title (Tasklist.IMPORTANT_PILL_HTML and
   the two page scripts), so it still has a name and a tooltip. Narrower side padding than a
   worded pill so the star sits in a near-round chip. */
.plp-flag-important {
    background: #f1e6fb;
    border-color: #b48ad9;
    color: #4a1a72;
    padding-left: 0.32rem;
    padding-right: 0.32rem;
}
.plp-flag-important::before {
    content: "\2605";
    content: "\2605" / "";
}
[data-theme="dark"] .plp-flag-important {
    background: #2a1840;
    border-color: #8e63c4;
    color: #dcc6f5;
}

/* ── "ⓘ" info icon, right after the name (owner, 2026-09-07) ──────────────────────────
   Opens the item / task info panel — what the thing IS, and which of the trip's tags put
   it on the list with the reason for each. Built by BuildOpenIcon in each page's
   code-behind; see the note there for why it is a button and not a link.
   🔴 IT WAS A ✎ LINK TO EditItem/EditTask FOR ONE REVISION. Do not restore that: the ⋮
   menu owns the edit route, and this answers a different question.

   🔑 VISIBLE AT REST, unlike qFIT's To-Do equivalent, which fades in on row hover.
   That is a deliberate difference rather than drift: every other control on a PacklistPRO
   row — SEL, PKD/DONE, the ⋮ — is visible at rest, and one control that appears only on
   hover would be the odd one out here AND unreachable on a phone without a matching
   (hover: none) rule. Muted instead of hidden: it earns its place without competing with
   the item name.
   ⚠ BOTH centering declarations are load-bearing, because this icon renders in TWO
   formatting contexts. On Packlist/Tasklist it is inline content inside .plp-item-title
   (a block) and only vertical-align applies; anywhere it is still a direct child of
   .plp-item-main — a flex row with align-items:baseline — only align-self applies, and
   without it the inline-flex box's own baseline sits at the bottom of the glyph, hanging
   it a couple of pixels below the name's baseline on every row. Delete neither.
   ⚠ min-width is the icon's own slack, and it is the gap on BOTH sides: the glyph is
   ~1rem wide, so the box's spare width is what separates ⓘ from the name on its left and
   from the SEL checkbox on its right. min-height, NOT min-width, is what keeps the tap
   target usable, so the width can stay tight.
   ⚠ The button reset (background/border/padding/font) is not optional — a bare <button>
   inherits the UA's grey chrome and would sit on the row as a raised box. */
.plp-item-info {
    flex: 0 0 auto;
    align-self: center;
    vertical-align: middle;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.4rem;
    min-height: 1.75rem;
    padding: 0;
    border: 0;
    background: none;
    line-height: 1;
    font-size: 1rem;
    font-family: inherit;
    cursor: pointer;
    border-radius: var(--border-radius-sm, 6px);
    color: var(--color-text-muted);
    opacity: 0.75;
}
.plp-item-info:hover,
.plp-item-info:focus-visible {
    opacity: 1;
    color: var(--color-link, #006C96);
    background: var(--color-info-bg);
}

/* ── The panel itself ──────────────────────────────────────────────────────────────────
   Shell is the shared .modal-overlay / .modal-box (styles_shared.css), so the viewport
   cap, the scroll-inside-the-box rule and the back-to-top hide all come for free; only
   the body's own vocabulary lives here. */
.plp-info-box { max-width: 32rem; }
.plp-info-close { position: absolute; top: 0.5rem; right: 0.5rem; }
.plp-info-body { margin-top: 0.5rem; }
.plp-info-name { margin: 0 0 0.15rem; font-size: var(--font-size-lg); font-weight: var(--font-weight-bold); }
.plp-info-group { margin: 0 0 0.75rem; }
.plp-info-desc { margin: 0 0 1rem; }
.plp-info-subhead {
    margin: 1rem 0 0.4rem;
    font-size: var(--font-size-sm);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--color-text-muted);
}
.plp-info-tags { list-style: none; margin: 0; padding: 0; }
/* Tag pill on its own line above the reason rather than beside it: reasons are full
   sentences, and an inline pill leaves a ragged one-word first line on a phone. */
.plp-info-tags li { margin-bottom: 0.7rem; }
.plp-info-tags li:last-child { margin-bottom: 0; }
.plp-info-tag { margin-bottom: 0.2rem; }
.plp-info-reason {
    display: block;
    font-size: var(--font-size-sm);
    color: var(--color-text);
    margin-top: 0.15rem;
}

/* Description + Uses + Notes each break to their own line when enabled in Options. */
.plp-item-desc { display: block; font-size: var(--font-size-sm); color: var(--color-text-muted); font-style: italic; }
.plp-item-uses,
.plp-item-notes { display: block; font-size: var(--font-size-sm); color: var(--color-text-muted); }

/* ── Tasklist computed due date ────────────────────────────────────────────
   Built server-side by Tasklist.aspx.vb BuildDueChip from the task's Timing code
   plus the trip's dates (the same ReminderHelper.ScheduledDateFor the reminder job
   uses). Sits inline in .plp-item-main, which is a wrapping flex row, so on a
   narrow screen it drops under the task name rather than squeezing it.
   Neutral by default; only overdue and today are colored, because on a list where
   most rows have a date, coloring all of them says nothing. Both states carry a
   weight change as well as a hue so the distinction survives a color-blind viewer
   and a black-and-white print. */
.plp-due {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    white-space: nowrap;
}
.plp-due-today { color: var(--color-warning); font-weight: var(--font-weight-medium); }
.plp-due-past  { color: var(--color-danger);  font-weight: var(--font-weight-medium); }

/* ── Per-row save feedback (Packlist + Tasklist checkboxes / steppers) ─────
   Driven by PLP.setRowSaveState() in site.js. A checkbox ticks instantly whether
   or not the save round-trip succeeded, so without this a failed save looked
   exactly like a good one.

   Colors are deliberately the SAME pure lime / pure red the alert panels use
   (styles_shared.css, cross-site message convention) — one visual language for
   "it worked" / "it didn't", not a second private green. The row tint is a low-
   alpha wash of those so the item text stays readable, plus an inset left bar
   (inset box-shadow, NOT border-left — a real border would shift every row 4px
   sideways on each click). */
.row-save-badge {
    display: inline-block;
    margin-left: 0.375rem;
    padding: 0.05rem 0.4rem;
    border-radius: var(--border-radius-sm, 6px);
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-bold, 700);
    white-space: nowrap;
    vertical-align: baseline;
}
.row-saving  .row-save-badge { background: var(--color-bg-input); color: var(--color-text-muted); }
/* Amber, deliberately neither the green nor the red: the change is safe on this device but
   has not reached the server, which is a third state and must not be mistaken for either. */
.row-queued  .row-save-badge { background: #b45309; color: #fff; }
.row-saved   .row-save-badge { background: #00ff00; color: #111; }
.row-save-error .row-save-badge { background: #ff0000; color: #fff; }

/* Row tint. 3 classes (.plp-item.row-saved > .plp-item-row) outranks the
   .plp-item-row:hover rule above, so the state stays visible under the cursor. */
.plp-item.row-saved > .plp-item-row {
    background: rgba(0, 255, 0, 0.16);
    box-shadow: inset 4px 0 0 #00ff00;
}
/* Badge-free confirmation (Packlist checkboxes/steppers, owner 2026-09-17): a lime FLASH
   across the row and nothing else — no ✓ pill, no lingering tint. Modeled on qFIT
   Checklist's saved-row flash (chkFlashOk, Content/checklist-page.css there).
   🔑 AN ANIMATION, NOT A TRANSITION. A transition only runs when a property CHANGES, so
   re-ticking a row that was still tinted from the last save produced no movement at all —
   the one case where you most want the confirmation. An animation replays every time the
   class is re-applied (site.js forces the reflow that makes that work).
   🔑 IT ANIMATES background-color ONLY, never opacity or filter: opacity on the row would
   fade the item text with it, and filter creates a containing block that breaks the
   absolutely-positioned ⋮ dropdown if one is open on that row.
   Same 3-class specificity as the tints around it, so it outranks .plp-item-row:hover. */
.plp-item.row-saved-quiet > .plp-item-row {
    animation: plpRowSavedFlash 650ms ease-out;
}
@keyframes plpRowSavedFlash {
    0%   { background-color: rgba(0, 255, 0, 0.55); box-shadow: inset 4px 0 0 #00ff00; }
    60%  { background-color: rgba(0, 255, 0, 0.30); box-shadow: inset 4px 0 0 #00ff00; }
    100% { background-color: transparent;           box-shadow: inset 4px 0 0 rgba(0, 255, 0, 0); }
}
/* Reduced motion: no flash, but NOT no feedback — hold the tint for the same moment
   instead, so the confirmation still exists for someone who has animation turned off. */
@media (prefers-reduced-motion: reduce) {
    .plp-item.row-saved-quiet > .plp-item-row {
        animation: none;
        background-color: rgba(0, 255, 0, 0.30);
        box-shadow: inset 4px 0 0 #00ff00;
    }
}
.plp-item.row-save-error > .plp-item-row {
    background: rgba(255, 0, 0, 0.14);
    box-shadow: inset 4px 0 0 #ff0000;
}
/* The green flash fades out on its own; the red one must not — an unsaved change
   is precisely what the user needs to still see a second later. Only animate the
   tint, never opacity on the row (that would fade the item text too). */
.plp-item.row-saved > .plp-item-row { transition: background-color 0.4s ease-out; }
@media (prefers-reduced-motion: reduce) {
    .plp-item.row-saved > .plp-item-row { transition: none; }
}

/* Stepper rows inside the per-item ⋮ menu — replaces inline margin-bottom in code-behind. */
.plp-stepper-row { margin-bottom: 0.25rem; }
.plp-stepper-row:last-child { margin-bottom: 0; }

/* ── Trip Link: Group (shared) items section ──────────────────────────────
   The board's shared records, surfaced above the personal checklist. Each row =
   name + attribution on the left, claim / remove actions on the right. */
.plp-group-shared .plp-group-list { margin-top: 0.5rem; }
.plp-shared-item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.5rem 0.25rem;
    border-bottom: 1px solid var(--color-border);
    flex-wrap: wrap;
}
.plp-shared-item:last-child { border-bottom: none; }
.plp-shared-main { display: flex; flex-direction: column; gap: 0.125rem; flex: 1; min-width: 0; }
.plp-shared-name { font-weight: var(--font-weight-medium); word-break: break-word; }
.plp-shared-attr { font-size: var(--font-size-sm); }
/* "Kacie T. is Not Bringing" pills under a group item (2026-09-18) — the checklist's own
   .plp-flag-exclude pill, one per companion. Wraps as a row; the pill's inline left margin
   (meant for sitting after an item name) is dropped so the first pill lines up with the name. */
.plp-shared-notbringing, .plp-shared-pills { display: flex; flex-wrap: wrap; gap: 0.3rem; }
.plp-shared-notbringing > .plp-flag-pill, .plp-shared-pills > .plp-flag-pill { margin-left: 0; }
/* "✓ Packed by Kacie T." on a Group Items row (2026-09-18) — green, the done twin of the red
   exclusion pill. Uses the -bg/-border/-text TRIPLE, which dark mode redeclares. */
.plp-flag-done {
    background: var(--color-success-bg);
    border-color: var(--color-success-border);
    color: var(--color-success-text);
}
/* "Requested by Kacie T." — a neutral OUTLINE pill: nobody has committed yet, so it
   carries no color of its own and does not compete with the three that do. */
.plp-flag-neutral {
    background: transparent;
    border-color: var(--color-border);
    color: var(--color-text-muted);
}
/* "Kacie T. is Bringing This" — blue, the claimed-but-not-packed stage. Same tokens as
   .plp-flag-requested, and for the same reason its TEXT is --color-text (see that rule). */
.plp-flag-bringing {
    background: var(--color-info-bg);
    border-color: var(--color-info-border);
    color: var(--color-text);
}
.plp-shared-actions { display: flex; align-items: center; gap: 0.75rem; flex-shrink: 0; flex-wrap: wrap; }
.plp-shared-link, .plp-shared-remove { font-size: var(--font-size-sm); }
.plp-group-empty { margin: 0.25rem 0; }
/* "×N" badge on a claimed/packed group item, and the "Need [N]" stepper on an
   unclaimed one. The quantity input is deliberately narrow — it holds 1–2 digits. */
.plp-shared-qty { font-weight: var(--font-weight-normal); color: var(--color-text-muted); }
.plp-shared-need { display: inline-flex; align-items: center; gap: 0.3rem; font-size: var(--font-size-sm); color: var(--color-text-muted); }
.plp-qty-input { width: 3.25rem; padding: 0.2rem 0.35rem; text-align: center; }

/* ── ConfigureItems / ConfigureTasks layout helpers ───────────────────────
   Replaces inline styles in BuildHtml / BuildSelect. The sub-row indent matches
   the visual width of the checkbox column on row 1 so dropdowns line up under
   the item name. */
/* ConfigureItems inline rename (PLR-280). The pencil renders only on the user's
   OWN custom items, so this appears on a small minority of rows and is kept
   visually quiet rather than competing with the item name beside it.

   Deliberately NOT .tip-icon-button, which is the shared icon-button class: that
   one is a 2.75rem square touch target, and .plp-item-main is a baseline-aligned
   flex row in a dense list — dropping a 44px box into it pushes every row taller.
   The padding here still gives a usable tap area without changing row height.

   All colors come from tokens, so dark mode follows without a second rule. */
.cfg-rename-btn {
    background: none;
    border: 0;
    padding: 0.15rem 0.3rem;
    cursor: pointer;
    line-height: 1;
    color: var(--color-text-muted);
    border-radius: var(--radius-sm, 4px);
}
.cfg-rename-btn:hover,
.cfg-rename-btn:focus-visible {
    color: var(--color-text);
    background: var(--color-surface-alt, rgba(127, 127, 127, 0.12));
}

/* The editor replaces the name in-flow, so it inherits .plp-item-main's flex row.
   min-width:0 lets the input shrink instead of forcing the row to overflow on a
   phone — without it a long name makes the whole row scroll sideways. */
.cfg-rename-editor {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    flex: 1 1 auto;
    min-width: 0;
    flex-wrap: wrap;
}
/* Compounded with .textbox on purpose. styles_shared.css loads AFTER this file, so a
   bare .cfg-rename-input (0,1,0) ties with the shared .textbox (0,1,0) and LOSES every
   property they share — shared sets width:100%;max-width:100%. The compound (0,2,0)
   wins outright. Same rule as the .modal-footer.sl-edit-footer precedent. */
.textbox.cfg-rename-input {
    flex: 1 1 12rem;
    min-width: 0;
    width: auto;
}

/* ConfigureItems / ConfigureTasks: the three inline dropdowns (Importance,
   Timing, Always) are wrapped in .cfg-controls so they stay together on one
   line. The whole group wraps below the item name on narrow screens via
   flex-wrap on .plp-item-row. */
.cfg-controls {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-shrink: 0;
}

/* Column-header cells + dropdowns — widths must match so headers line up.
   Importance is 6rem on both pages; Timing is 10rem (Tasks needs the extra
   width for its longer option labels and Items just gets a slightly wider
   column, which keeps both pages visually consistent). */
.cfg-col-imp,
.cfg-select-imp    { width: 6rem; }
.cfg-col-tim,
.cfg-select-tim    { width: 10rem; }
.cfg-col-always,
.cfg-always-cell   { width: 6rem; }
.cfg-col-imp,
.cfg-col-tim,
.cfg-col-always    { text-align: center; }

/* Always-Bring / Always-Do checkbox cell (row 2). Now a <label> wrapping
   checkbox + "Always" text so the whole area is clickable. */
.cfg-always-cell {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    cursor: pointer;
}

/* Group header row on ConfigureItems — wraps the expand button so future
   Show/Hide bulk links can sit next to it. */
.plp-group-header-wrap {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.plp-group-header-wrap > .plp-group-header { flex: 1 1 auto; text-align: left; }

/* Per-category Select All / Deselect All links, sitting to the right of the
   category's expand button. flex-shrink:0 keeps them intact; they wrap below
   the header as a unit on narrow screens. */
.cfg-group-bulk {
    display: flex;
    gap: 0.375rem;
    flex: 0 0 auto;
}
/* Only show the bulk links while the category is expanded — cfgToggleGroup
   flips the header's aria-expanded, so this reacts with no extra JS. */
.plp-group-header[aria-expanded="false"] + .cfg-group-bulk { display: none; }

/* ── Selected-trip header (TripHeader.ascx) ────────────────────────────────────
   The bar that names the trip on the six pages that operate on Session("TripID")
   — Packlist, Tasklist, Itinerary, Notes, Expenses, TripDashboard — and lets the
   user switch it without leaving the page. Replaces the four different trip-name
   treatments those pages each grew on their own (.plp-trip-name on a Label here,
   .tripdashboard-trip-heading there, bare .heading on the rest).

   Deliberately NOT a .main-card: this is page chrome that sits between the page
   title and the page's first real card, and a second card outline directly under
   the header read as an empty card. A tinted strip with one border does the job. */
.trip-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 0.5rem 1rem;
    margin-bottom: var(--section-gap, 1.5rem);
    padding: 0.6rem 0.9rem;
    border: 1px solid var(--color-border);
    border-left: 4px solid var(--color-accent);
    border-radius: var(--border-radius-sm, 6px);
    background: color-mix(in srgb, var(--color-bg-card) 88%, var(--color-accent) 12%);
}
.trip-header-info {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.35rem 0.6rem;
    min-width: 0;   /* lets a long trip name wrap instead of overflowing the bar */
}
.trip-header-eyebrow {
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: var(--font-weight-bold, 600);
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--color-text-muted);
}
.trip-header-name {
    font-size: var(--font-size-lg, 1.125rem);
    font-weight: var(--font-weight-bold, 600);
    color: var(--color-text);
    /* site.js initLongPress makes this element a double-click / press-and-hold
       target for Edit Trip, so suppress the mobile selection callout the hold
       would otherwise raise — same treatment .trip-list-item gets on Trips.aspx. */
    cursor: pointer;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    user-select: none;
}
.trip-header-dates {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted);
}
/* "Linked with N companions" (ToDo PLR-179). Rendered only when the count is > 0, so
   there is no zero-state to style. Deliberately quieter than the countdown pill beside
   it: this is standing context about the trip, not a time-sensitive alert, and two
   competing pills in one header is how a status bar stops being readable. */
.trip-header-companions {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted);
    white-space: nowrap;
}
.trip-header-actions {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex: 0 0 auto;
}
/* No trip selected — muted and dashed so it reads as an empty slot to fill
   rather than as a trip named "No trip selected". */
.trip-header-empty {
    border-style: dashed;
    border-left-style: solid;
    border-left-color: var(--color-text-muted);
    background: var(--color-bg-card);
}
.trip-header-none {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: var(--font-size-lg, 1.125rem);
    font-weight: var(--font-weight-medium, 500);
    color: var(--color-text-muted);
}
.trip-header-none-icon { font-size: 1.1em; line-height: 1; }

@media (max-width: 575.98px) {
    .trip-header { align-items: stretch; }
    .trip-header-actions { width: 100%; }
    .trip-header-actions .button { width: 100%; }
}

/* Packlist Options & Filters card */
.plp-options-title { margin: 0 0 0.75rem 0; }
.plp-options-show-row { margin-bottom: 0.75rem; }
.plp-options-show-row .label { display: block; margin-bottom: 0.375rem; }
.plp-options-checks {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1.25rem;
}

/* .page-header-actions > .plp-actions-break was here — a zero-height, 100%-basis flex
   spacer that forced whatever followed it onto a new line. Removed 2026-09-12 with its
   only use on any of the five sites: the owner asked for 🛒 Recommended Gear and ↻ Refresh
   to share one line on Packlist, which is exactly the wrap this existed to prevent.
   🔑 Nothing emits the class any more (grepped across all five sites + Shared), so this is
   a tombstone, not a disabled rule. If a header row ever needs a forced break again, note
   why the obvious alternative was rejected the first time: nesting the buttons in an inner
   row breaks the "> .button.small" / "> a.button" phone rules near the bottom of this file,
   because those select DIRECT children of .page-header-actions. */

/* Packlist + Tasklist search row (textbox + 🔍 button). + Add Item / + Add Task are in the
   page header, left of ↻ Refresh (owner, 2026-09-13). */
.plp-search-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: flex-end;
}
/* Slight extra top spacing when search sits below another form row */
.plp-search-row-spaced { margin-top: 0.5rem; }

/* .plp-voice-btn / .plp-voice-btn.is-listening / @keyframes plp-voice-pulse were here.
   Removed 2026-08-20 with the feature — nothing emits the class any more (site.js
   initVoiceInput is gone, and so are the four data-voice-input attributes). */
.plp-search-input {
    flex: 2;
    min-width: 180px;
}
/* "Copy Items/Tasks From" trip picker — a .form-group inside the Options & Filters
   panel: label on top, then the select + Copy button side by side, wrapping on narrow
   screens. flex-basis stays `auto` with a min-width instead of a px basis: a px basis
   turns into the element's HEIGHT if the row ever becomes a column (the same trap that
   made a .search-row textbox render ~220px tall on mobile). */
.plp-copy-trip-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}
/* Compound `.dropdown.plp-copy-trip-select` (0,2,0) — NOT a bare `.plp-copy-trip-select`.
   Bundle order is bootstrap → styles.css → shared, so shared wins every tie: its
   `.dropdown { width:100%; max-width:100% }` (0,1,0) beat the bare class and the select
   rendered 950px wide, shoving the Copy button onto its own line. Two classes outrank it. */
.dropdown.plp-copy-trip-select {
    flex: 1 1 auto;
    min-width: 200px;
    /* Match the 480px cap shared puts on .form-group .textbox (it exempts .dropdown), so a
       long "Name — date (N items)" option can't stretch this across the whole card. */
    max-width: 480px;
}
.plp-copy-trip-group .plp-copy-trip-row .button { flex: 0 0 auto; }

/* ── Find Duplicates (2026-09-17) ──────────────────────────────────────────────
   The controls reuse .plp-copy-trip-row's shape exactly — same flex row, same wrap,
   same compound `.dropdown.<class>` selector and for the same reason documented above:
   shared's `.dropdown { width:100% }` (0,1,0) beats a bare class, and a bare one here
   would render these three selects full width and stack the button under them.
   🔑 EVERY COLOR BELOW IS AN EXISTING TOKEN from Shared/styles_shared.css. An undefined
   var() does not fall back — it inherits — so a token invented here would silently paint
   the badge in the body text color and look "nearly right" in light mode only. */
.plp-dupe-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}
.dropdown.plp-dupe-select {
    flex: 1 1 auto;
    min-width: 170px;
    max-width: 320px;
}
.plp-dupe-group .plp-dupe-row .button { flex: 0 0 auto; }

/* The report card itself. position:relative anchors the corner × (.tutorial-close is
   position:absolute), which is safe here — unlike inside the options panel — because this
   card's top-right corner is empty. */
.plp-dupe-card { position: relative; }

.plp-dupe-cluster {
    border: 1px solid var(--color-border);
    border-left: 4px solid var(--color-border);
    border-radius: var(--border-radius-sm, 6px);
    padding: 0.6rem 0.75rem;
    margin: 0.6rem 0;
    background: var(--color-surface-muted);
}
/* The left edge is the whole visual verdict, so the two states that carry one are the
   only two that recolor it. An untriaged cluster keeps the neutral border deliberately:
   a free scan has not judged anything and must not look as though it has. */
.plp-dupe-cluster.plp-dupe-redundant { border-left-color: var(--color-warning); }
.plp-dupe-cluster.plp-dupe-distinct  { border-left-color: var(--color-success); }

.plp-dupe-head {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
    margin-bottom: 0.25rem;
}
.plp-dupe-badge {
    display: inline-block;
    padding: 0.1rem 0.5rem;
    border-radius: var(--border-radius-sm, 6px);
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-medium);
    border: 1px solid var(--color-border);
    color: var(--color-text-muted);
}
.plp-dupe-badge-yes {
    background: var(--color-warning-bg);
    border-color: var(--color-warning-border);
    color: var(--color-warning-text);
}
.plp-dupe-badge-no {
    background: var(--color-success-bg);
    border-color: var(--color-success-border);
    color: var(--color-success-text);
}
.plp-dupe-why { margin: 0.25rem 0 0.4rem; }
.plp-dupe-items { margin: 0.25rem 0 0; padding-left: 1.2rem; }
.plp-dupe-items li { margin: 0.3rem 0; }
/* Deselect / Undo beside each item. Once pressed the row stays in the report, struck
   through, so the Undo has somewhere to live. */
.plp-dupe-items .plp-dupe-deselect { margin-left: 0.4rem; }
.plp-dupe-items .plp-dupe-deselect[hidden] { display: none; }
.plp-dupe-items li.plp-dupe-gone > .link,
.plp-dupe-items li.plp-dupe-gone > .small-dim-text,
.plp-dupe-items li.plp-dupe-gone > .plp-dupe-keep {
    text-decoration: line-through;
    opacity: 0.6;
}
.plp-dupe-keep {
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-medium);
    color: var(--color-success-text);
}
.plp-search-results {
    display: block;
    margin: 0.5rem 0 0.25rem;
}
/* Dark mode: the default muted color (#b1b5bb) is a touch dim for this summary line —
   lighten it so the item counts read clearly on the dark canvas. */
[data-theme="dark"] .plp-search-results { color: #d4d8dd; }

/* Tagless-trip fallback banner on Packlist / Tasklist — "Showing all 580 items. Set Trip
   Tags on this trip to see just what you need. [Set Trip Tags]". Server half:
   App_Code/Helpers/TripTagsNotice.vb, which emits `alert-panel info plp-tags-notice`.
   Every color comes from shared's `.alert-panel.info`.

   ⚠ DELIBERATELY NO `display` OVERRIDE. Making an .alert-panel a flex row is a mistake this
   codebase has already made and fixed (see the shared `.alert-panel { display: block }`
   comment, 2026-07-21: under flex every inline fragment of a sentence becomes its own
   anonymous flex item and the sentence renders as a jumbled grid — the panel it broke was
   this banner's predecessor). None is needed: `.button` is `display: inline-flex` +
   `vertical-align: middle`, so in normal block flow the action already sits on the same line
   as the sentence and wraps to its own line when the viewport is too narrow. */
.alert-panel.plp-tags-notice > .button {
    margin-left: 0.5rem;
    /* Never let the label break as "Set Trip / Tags" mid-button. */
    white-space: nowrap;
    /* `.alert-panel a { text-decoration: underline }` (0,1,1) beats `.button`'s own
       `text-decoration: none` (0,1,0) — right for a link in prose, wrong for a button.
       Three classes (0,3,0) outrank it. */
    text-decoration: none;
}
/* `[hidden]` is a UA-stylesheet rule, so ANY author `display` declaration beats it — here
   that is `.alert-panel { display: block }` itself, which means an attribute-hidden panel
   renders VISIBLE (the recurring trap behind the other `[hidden]` guards in shared).
   Server-side Visible=False is what hides this banner today; this keeps a future
   `el.hidden = true` from silently doing nothing. */
.alert-panel.plp-tags-notice[hidden] { display: none; }

/* First-run banner on Packlist — "Nothing is ticked on this trip yet, so here are just the 19
   categories — 580 items in total. Open one to start ticking. [Show everything]". Server half:
   Packlist.aspx.vb RenderFirstRunNotice, which emits `alert-panel info plp-firstrun-notice`.

   Same shape and the same two rules as .plp-tags-notice above — and the same ⚠: NO `display`
   override, for the reason spelled out there. Kept as its own selector rather than bolted onto
   that one because the two banners are separate features with separate copy; grouping them
   would mean a change for one silently re-styling the other. */
.alert-panel.plp-firstrun-notice > .button {
    margin-left: 0.5rem;
    /* Never let the label break as "Show / everything" mid-button. */
    white-space: nowrap;
}
/* REQUIRED, not defensive. Unlike the tags banner, this one is hidden CLIENT-side too —
   packlist-page.js firstRunSync() sets `hidden` as soon as any heading is open, because the
   sentence stops being true then. `[hidden]` is a UA-stylesheet rule, so
   `.alert-panel { display: block }` in styles_shared.css beats it and the banner would stay
   visible; without this line that whole behavior silently does nothing. */
.alert-panel.plp-firstrun-notice[hidden] { display: none; }

/* Card section sub-header (e.g. "Items" heading inside Configure pages) */
.plp-card-section-title { margin: 0 0 0.5rem 0; }
.plp-summary-line {
    display: block;
    margin-bottom: 0.5rem;
}

/* Tips card list inside .tips-panel */
.plp-tips-list {
    margin: 0.5rem 0 0 1.25rem;
    padding: 0;
}

/* ── Importance is NOT styled on the checklist (owner, 2026-09-09) ────────────────────
   🛑 DO NOT RE-ADD A PER-IMPORTANCE CHECKBOX STYLE. Every SEL / PKD / DONE box on
   Packlist and Tasklist renders identically, at every importance level, by explicit
   owner instruction: "make all the check boxes look the same. Don't show them
   differently if they are marked important or not important."

   What used to be here: .importance-high painted the box #ffff00 and .importance-low
   #b0b0b0, both with appearance:none + a black border and a hand-drawn black tick (the
   native tick is invisible on a yellow fill). Item/task NAMES were never tinted — before
   that, .importance-low grayed the name, which read as "disabled" rather than "optional".
   So there is now NO importance styling anywhere on these rows, which is the point.

   ⚠ .importance-high / .importance-low ARE STILL EMITTED on .plp-item by both
   code-behinds. That is deliberate, not a leftover: they cost nothing, they keep the
   level readable from the DOM, and they are the single hook to restore a signal here if
   one is ever wanted. An audit that finds them unstyled has found this comment, not a bug.
   🔑 Importance still reaches the user in three places that are not color: the row's
   checkbox tooltip / accessible name (CheckboxHint in both code-behinds), Group By →
   Importance, and Sort by Importance. Removing the color did not remove the information.
   🆕 2026-10-15 (owner: "indicate any tasks that are marked "important". same with
   packlist"): the hook is used again, for a ★ PILL (named "Important") beside the name
   (.plp-flag-important, with the other pills below), NOT for the check box. The boxes
   still look the same at every importance level.
   ⚠ qFIT has its OWN .importance-high rule for .qfit-cb in its own styles.css. This
   decision was made about PacklistPRO's checklist and was not applied there. */

/* Strikethrough for selected rows that are packed/done or not bringing/not doing.
   A smooth transition makes the check-off feel responsive rather than abrupt — text
   fades from full-color to muted as the line draws across. */
.item-excluded {
    text-decoration: line-through;
    color: var(--color-text-muted);
    transition: color 0.25s ease, text-decoration-color 0.25s ease;
}
.plp-item-name {
    transition: color 0.25s ease;
}
@media (prefers-reduced-motion: reduce) {
    .item-excluded, .plp-item-name { transition: none; }
}

/* Product rows — green */
.plp-products {
    padding-left: 2.5rem;
    border-left: 3px solid var(--color-success-border);
    margin: 0;
    background: var(--color-success-bg);
}
.plp-product-row {
    padding: 0.3rem 0.75rem;
    font-size: var(--font-size-sm);
    color: var(--color-success);
    border-bottom: 1px solid var(--color-success-border);
}
.plp-product-row:last-child { border-bottom: none; }
/* Row LAYOUT (thumbnail | info | "+" button) comes from the shared .sl-cat-prod
   classes (see the Shopping List section below) — Packlist, Quicklist and
   ShoppingList all render product rows through one ShoppingListHelper renderer
   (2026-06-07; the old Packlist-only .plp-product-media layout was removed). */
.plp-product-link { font-weight: var(--font-weight-medium); }
/* "Our Pick" pill — distinguishes our curated/reviewed picks from generic listings. */
.plp-our-pick-badge {
    display: inline-block;
    font-size: var(--font-size-xs, 0.7rem);
    font-weight: var(--font-weight-bold);
    line-height: 1;
    padding: 0.15rem 0.4rem;
    border-radius: 999px;
    background: var(--color-success);
    color: #fff;
    vertical-align: middle;
    white-space: nowrap;
}
/* Loud "where to buy" affordance shown on items the user marked Buy. */
.plp-buy-cta {
    display: inline-block;
    margin-left: 0.5rem;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-bold);
    color: var(--color-success);
    cursor: pointer;
    white-space: nowrap;
}
.plp-buy-cta:hover { text-decoration: underline; }
/* "Show More..." / "Show Less..." row under an item's top-3 product rows. */
.plp-product-more {
    display: block;
    padding: 0.3rem 0.75rem;
    font-size: var(--font-size-sm);
}
/* These carry display:inline-block, which beats the UA [hidden] rule — the live
   Buy toggle (packlist-page.js plpOnBuyChanged) hides/shows them via [hidden]. */
.plp-expand-icon[hidden],
.plp-expand-placeholder[hidden],
.plp-buy-cta[hidden] { display: none; }
/* FTC affiliate disclosure shown once below a list that displays products. */
.plp-rec-disclosure { margin-top: 0.75rem; font-style: italic; }

/* ── Recommended Gear page ───────────────────────────────────────── */
.rec-item-card { margin-bottom: 1rem; }
.rec-item-name { margin: 0 0 0.5rem; font-size: var(--font-size-lg); }
/* Media-object row: larger image on the left, .rec-product-body (title, reasons,
   review, action buttons) entirely to its right — nothing wraps under the image. */
.rec-product {
    padding: 0.6rem 0;
    border-top: 1px solid var(--color-border);
    display: flex;
    align-items: flex-start;
    gap: 1rem;
}
.rec-product:first-of-type { border-top: none; }
.rec-product-img {
    flex: 0 0 auto;
    width: 140px;
    height: 140px;
    object-fit: contain;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: #fff;
}
.rec-product-body { flex: 1 1 0; min-width: 0; }
.rec-product-title { margin-bottom: 0.25rem; }
.rec-product-reasons { margin: 0.15rem 0; }
.rec-product-review { margin: 0.15rem 0 0.5rem; }
.rec-product-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
@media (max-width: 575px) {
    .rec-product { gap: 0.75rem; }
    .rec-product-img { width: 96px; height: 96px; }
}
/* Manage Products list thumbnail */
.mp-thumb {
    width: 40px;
    height: 40px;
    object-fit: contain;
    vertical-align: middle;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: #fff;
}
/* Manage Products filter bar — search + level + sort + actions wrap nicely
   on narrow viewports and keep the search input growing to fill space. */
.mp-filter-bar { justify-content: space-between; flex-wrap: wrap; gap: 0.5rem; }
.mp-filter-search { flex: 1 1 18rem; max-width: 28rem; min-width: 0; }
.mp-filter-group { flex: 0 0 auto; margin: 0; }
.mp-filter-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
}
.mp-active-filters { margin: 0.25rem 0 0.5rem; }
/* Manage Products — admin import row (input + Run button, left-aligned).
   Replaces inline justify-content/flex-wrap so the row matches the rest
   of the design-system flex utilities. */
.mp-import-row {
    justify-content: flex-start;
    align-items: flex-end;
    gap: 1rem;
    flex-wrap: wrap;
}
.mp-import-field { margin: 0; flex: 0 0 auto; max-width: 10rem; }
@media (max-width: 575px) {
    .mp-filter-search,
    .mp-filter-group,
    .mp-filter-actions { flex: 1 1 100%; }
    .mp-filter-actions .button { flex: 1 1 auto; }
}

/* Trip Dashboard — Expenses card per-day category averages */
.td-exp-averages { margin: 0.25rem 0 0.35rem; }
.td-exp-averages > div { line-height: 1.5; }

/* Names the currency an averages block belongs to. Only rendered when the trip holds
   more than one — nothing here converts, so the lines under each caption are the only
   figures that mean anything on their own. Matches .exp-typebar-caption on the Expenses
   page so the two cards read as the same idea. */
.td-exp-avg-cur {
    margin-top: 0.35rem;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-medium);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.td-exp-averages > .td-exp-avg-cur:first-child { margin-top: 0; }

/* The "not converted" sentence under the card's per-currency spend line. */
.td-exp-cur-note { margin: 0.15rem 0 0; }

/* "Owed to you / You owe" totals, between the spend line and the averages. Rendered
   only when one of the two is non-zero (BuildExpenseBalances), so this never claims
   space on an ordinary solo trip. Deliberately NOT colored green/red like the Expenses
   page's Settling Up card: this is one line inside a dense dashboard tile, and two more
   colors here compete with the status pills around it. */
.td-exp-balances { margin: 0.2rem 0 0; }

/* Product Clicks report — summary stat tiles */
.pc-stat-row { display: flex; flex-wrap: wrap; gap: 1rem; }
.pc-stat {
    flex: 1 1 8rem;
    text-align: center;
    padding: 0.75rem 1rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: var(--color-bg-subtle, transparent);
}
.pc-stat-value { font-size: var(--font-size-xl, 1.5rem); font-weight: var(--font-weight-bold); }
.pc-stat-label { font-size: var(--font-size-sm); color: var(--color-text-muted); }

/* Product Clicks — by-product table filter row (search + match count). */
.pc-filter-bar { justify-content: flex-start; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem; }
.pc-filter-search { flex: 1 1 16rem; max-width: 24rem; min-width: 0; }
@media (max-width: 575px) {
    .pc-filter-search { flex: 1 1 100%; }
}

/* Trip Dashboard "Recommended Gear" teaser list */
.td-rec-list { margin: 0.25rem 0 0.5rem; }
.td-rec-list .plp-product-row { padding: 0.2rem 0; border-bottom: none; }

/* Quicklist products disclosure */
.ql-products { margin: 0.25rem 0 0.5rem; }
.ql-products > summary {
    cursor: pointer;
    padding: 0.3rem 0.75rem;
    font-size: var(--font-size-sm);
    color: var(--color-success);
    font-weight: var(--font-weight-medium);
}

/* Action columns */
.plp-item-actions { display: flex; align-items: center; gap: 0.3rem; flex-shrink: 0; margin-left: auto; }
.plp-cb-label {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.125rem;
    font-size: var(--font-size-xs, 0.75rem);    /* 10px — see the .small-text override below, which is what actually
                               sizes the visible caption. This only covers stray text. */
    cursor: pointer;
    /* Wider than the 10px "SEL"/"PKD" caption on purpose — it is what lines the two
       checkbox columns up across every row, and the caption is ~22px at that size.
       Trimmed 38→34→30px across two passes with the rest of the row spacing; this is the
       space to the RIGHT of the item name, which is what the name gets back. The box
       itself is untouched, so the tap target is unchanged. */
    min-width: 30px;
    text-align: center;
}
/* THE caption size rule. "Sel"/"Pkd"/"Done" render as <span class="small-text"> (see
   Packlist.BuildCheckbox / BuildStepper), and .small-text sets its OWN font-size —
   var(--font-size-sm) = 0.875rem = 14px. A font-size on the .plp-cb-label PARENT only reaches
   the span by inheritance, and an inherited value always loses to a rule that matches the span
   directly, at any specificity — so sizing the label alone left these captions at 14px and did
   nothing visible. Size the span itself. (0,2,0) beats the shared bare .small-text (0,1,0), so
   this wins despite styles.css loading before the shared sheet.
   The stepper twin is included because it renders the same captions the same way — omitting it
   would leave the quantity-stepper layout showing 14px "Sel" next to the checkbox layout's 10px. */
.plp-cb-label .small-text,
.plp-qty-stepper .small-text {
    font-size: var(--font-size-xs, 0.75rem);    /* 10px, vs the 14px these captions were actually rendering at */
    line-height: 1.2;
}

/* Centering the caption under its box. The shared `.checkbox` carries margin-right: 0.375rem
   (it's written for inline "checkbox + label to the RIGHT" rows); in this centered flex COLUMN
   that trailing margin is counted in the flex item's width, pushing the box half of it — a
   visible 3px — to the left of the caption. Must be typed to (0,3,1): the previous
   `.plp-cb-label input` was only (0,1,1) and silently lost to shared's
   `input[type="checkbox"].checkbox` (0,2,1), which loads after styles.css. */
.plp-cb-label input[type="checkbox"].checkbox { margin: 0; }

/* Quantity steppers */
.plp-qty-stepper {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.125rem;
    font-size: var(--font-size-xs);
    min-width: 56px;
    text-align: center;
}
.plp-qty-stepper > div { display: flex; align-items: center; gap: 0.125rem; }
.plp-qty-btn {
    width: 24px;
    height: 24px;
    padding: 0;
    border: 1px solid var(--color-border);
    border-radius: 3px;
    background: var(--color-bg-input);
    cursor: pointer;
    font-size: 1rem;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
}
.plp-qty-btn:hover { background: var(--color-accent); color: #fff; border-color: var(--color-accent); }
.plp-qty-val { min-width: 22px; text-align: center; font-weight: var(--font-weight-medium); }

/* ⋮ More menu */
.plp-more-menu { position: relative; }
.plp-more-btn { padding: 0.25rem 0.5rem; font-size: var(--font-size-lg, 1.125rem); line-height: 1; min-height: 36px; }
/* 🔴 TASKLIST ONLY as of 2026-09-17. Packlist no longer emits this class in either render
   path (Packlist.aspx.vb AppendItemHtml, plpUpdateMenuBtn) — its Buy / Not bringing pills
   took the job over. Do not delete the rule: Tasklist.aspx.vb and tasklist-page.js still
   set it. See the .plp-flag-pill block above. */
.button.plp-more-btn-alert { background-color: var(--color-danger); }
.button.plp-more-btn-alert:hover { background-color: var(--color-delete-btn-hover); }
.plp-more-dropdown {
    position: absolute;
    /* Open to the LEFT of the kebab button (anchored to its left edge) so the
       dropdown can't extend past the viewport's right edge on mobile. */
    right: calc(100% + 4px);
    top: 0;
    z-index: 200;
    background: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    padding: 0.55rem 0.85rem;
    box-shadow: var(--shadow-lg);
    min-width: 170px;
    max-width: calc(100vw - 2rem);
    animation: navDropFade 0.18s var(--ease-out-quint);
    transform-origin: top right;
}
.plp-more-item {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    padding: 0.3rem 0;
    cursor: pointer;
    font-size: var(--font-size-sm);
    white-space: nowrap;
    color: var(--color-text);
    background: none;
    border: none;
    font-family: inherit;
    width: 100%;
    text-align: left;
}
.plp-more-item:hover {
    color: var(--color-primary);
}

/* Summary */
/* ── "What you're looking at" line, above the checklist (owner, 2026-09-17) ───────────
   One line naming the View / companion / Status / search actually in force. Written by
   RenderViewSummary in Packlist.aspx.vb.
   Deliberately QUIETER than .plp-summary below it — it is orientation, not a headline,
   and it renders on every load including the ones where nothing is narrowed. It carries
   no border for the same reason: two stacked bordered boxes above the list read as two
   competing announcements.
   ⚠ One line on a phone: the View labels run long ("Recommended + Items I've Packed
   Before"), so the text ellipsizes rather than wrapping to three lines and pushing the
   list down — the full text stays in the panel's aria-label for a screen reader. */
.plp-view-summary {
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
    margin: 0 0 0.5rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}
.plp-view-summary-icon { flex: 0 0 auto; opacity: 0.8; }
.plp-view-summary-text {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: var(--font-weight-medium);
}
.plp-view-sep { opacity: 0.55; margin: 0 0.15rem; }

/* Links inside the summary sentence (owner, 2026-09-17): "N to buy" switches Status to Buy,
   "N requested" opens the Group Items card. Underlined, because a colored word inside a
   sentence of other colored numbers is not a discoverable affordance — and the summary line
   is the one place on this page where a number is a control. */
/* 🔑 BLACK, NOT THE ACCENT BLUE (owner, 2026-09-17). These sit inside a sentence of plain
   text and read as part of it; the UNDERLINE is what marks them as clickable, and it is
   therefore load-bearing here in a way it usually is not — do not remove it "because links
   are blue". --color-text, not #000, so they stay legible in dark mode. */
/* ⚠ `a.` PREFIX ON BOTH, deliberately. styles_shared.css loads AFTER this file and carries
   a bare `a` (0,0,1) and `a:hover` (0,1,1). A plain `.plp-sum-link:hover` is 0,1,0 — it
   LOSES to that shared hover rule, so the link would have gone blue on hover anyway.
   `a.plp-sum-link:hover` is 0,1,2 and wins. */
a.plp-sum-link {
    color: var(--color-text);
    text-decoration: underline;
    cursor: pointer;
}
a.plp-sum-link:hover, a.plp-sum-link:focus-visible { color: var(--color-accent); }

.plp-summary {
    padding: 0.75rem;
    background: var(--color-bg);
    border-radius: var(--border-radius-sm);
    border: 1px solid var(--color-border);
    margin-bottom: 0.75rem;
}

/* Per-group pager */
.plp-group-pager {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    justify-content: flex-end;
    padding: 0.5rem 0.75rem;
    border-top: 1px solid var(--color-border);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

/* 🛑 .plp-pager-more (the yellow "More Items" / "More Tasks" chip at the left of this row) was
   DELETED 2026-09-14 with the chip itself — owner: "why does it still show 'More Items' when we
   switched to using Prev and Next buttons?" Nothing emits the class any more. */

/* Tightened section rule. Two-token modifier on .hr (shared sets margin:
   var(--section-gap) 0 = 1.5rem each side). Two classes outrank the shared
   `hr.hr` (0,1,1) regardless of bundle order, so no !important is needed.
   Used above the Packlist quick-nav chips, where a full section gap on BOTH
   sides of an almost-invisible rule read as dead space, not separation. */
.hr.hr-tight {
    margin-top: 0.5rem;
    margin-bottom: 0.5rem;
}

/* 🔴 .plp-group-bulk (the Select All / Deselect All bar at the top of an expanded
   group) WAS DELETED HERE 2026-09-06 with the buttons themselves — owner's request.
   Nothing emits the class any more: AppendGroupBulkBar and window.plpGroupSelectAll
   went in the same change. Removed rather than left behind because a rule with no
   markup is the kind of thing a later reader restores a feature from by accident. */

/* Expand All / Collapse All bar above the WHOLE checklist (Packlist + Tasklist).
   This one floats above the first group header and belongs to no group, so it
   carries no card background or divider rule. Right-aligned to keep the group
   names' left edge clean. (It is NOT the deleted per-group bulk bar above — Expand
   and Collapse only open and shut categories; they change no data.) */
.plp-list-tools {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    justify-content: flex-end;
    padding: 0 0.15rem 0.4rem;
}

/* .pill is written for <span> badges/chips; on a real <button> the UA supplies its
   own font-family and a gray background-image, so the pill would render in the
   system font and lose its card background. Normalize only what the element brings
   with it — everything else still comes from the shared .pill. */
button.pill {
    font-family: inherit;
    background-image: none;
    line-height: normal;
}

/* ← Prev / Next → on the Packlist AND Tasklist group pagers — BRIGHT YELLOW with black text
   (owner, 2026-09-14). Replaced Data Saver's "Show More" (and its .plp-group-showmore /
   .plp-show-more-btn rules): both Packlist modes and the Tasklist now page with these buttons.
   Emitted by packlist-page.js plpPagerHtml and tasklist-page.js tlRenderPage.
   Three classes (0,3,0) so it outranks shared `.button` / `.button:hover` (0,2,0), which load
   AFTER this file and would win a tie. #111 on #FFFF00 is ~17:1, so it passes in both themes.
   🔑 PURE #FFFF00 (owner, 2026-09-14: "change the yellow to #FFFF00 for all these buttons") — it was
   #ffd600 (hover #f2c200). Hover is a slightly deeper #E6E600 so the hover still registers. */
.plp-group-pager .button.plp-pager-btn {
    background-color: #FFFF00;
    border-color: #FFFF00;
    color: #111;
}
.plp-group-pager .button.plp-pager-btn:hover {
    background-color: #E6E600;
    border-color: #E6E600;
    color: #111;
}
/* 🔑 BOTH buttons stay SOLID BRIGHT YELLOW, even the end with nowhere to go (Prev on page 1, Next on
   the last page). Owner, 2026-09-14: "make the Prev and Next buttons bright yellow" — measured, both
   already had the yellow, but the shared `.button:disabled` .55 fade turned the dead end a washed-out
   pale yellow, which is what read as "not yellow". The fade is overridden here; "nothing that way" is
   now said by the dimmed label + not-allowed cursor instead (disabled controls are exempt from the
   AA text-contrast minimum). The button PRESSED and loading ("Loading…") keeps full #111 text. */
.plp-group-pager .button.plp-pager-btn:disabled {
    opacity: 1;
    background-color: #FFFF00;
    border-color: #FFFF00;
    color: #6b6b00;
}
.plp-group-pager .button.plp-pager-btn.is-loading:disabled {
    color: #111;
    cursor: progress;
}

/* Quick-add row at the bottom of each group */
.plp-quick-add {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    flex-wrap: wrap;
    padding: 0.5rem 0.75rem;
    border-top: 1px dashed var(--color-border);
}
input.plp-quick-add-input { flex: 1 1 160px; min-width: 160px; width: auto; display: inline-block; }
.plp-quick-add-msg  { flex-basis: 100%; min-height: 1em; margin: 0; }
.plp-quick-add-msg.is-error   { color: var(--color-danger); }
.plp-quick-add-msg.is-success { color: var(--color-success); }

/* ── Duplicate-name guard (dupcheck.js) ────────────────────────────
   The "you may already have this" panel shown beneath an item/task name
   field on the add surfaces (EditItem/EditTask new mode + Packlist/Tasklist
   quick-add). Amber so it reads as a caution, not an error; theme-aware via
   core vars + color-mix over --color-bg. */
.plp-dup-panel {
    width: 100%;
    margin: 0.4rem 0 0.6rem;
    padding: 0.6rem 0.75rem;
    border: 1px solid #ff9600;
    border-left-width: 4px;
    border-radius: var(--radius-sm, 4px);
    background: color-mix(in srgb, #ff9600 12%, var(--color-bg, #fff));
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
}
.plp-dup-head  { font-weight: 600; margin-bottom: 0.35rem; }
.plp-dup-list  { list-style: none; margin: 0 0 0.5rem; padding: 0; }
.plp-dup-row   { display: flex; align-items: center; gap: 0.5rem; padding: 0.15rem 0; }
.plp-dup-name  { font-weight: 500; }
.plp-dup-badge {
    font-size: var(--font-size-xs, 0.75rem); text-transform: uppercase; letter-spacing: 0.03em;
    padding: 0.05rem 0.45rem; border-radius: 999px; white-space: nowrap;
    background: color-mix(in srgb, var(--color-text-muted, #6c757d) 22%, transparent);
    color: var(--color-text-muted, #6c757d);
}
.plp-dup-badge.exact { background: #ff9600; color: #3a2600; font-weight: 600; }
.plp-dup-actions   { margin: 0; }
.plp-dup-confirmed { font-weight: 600; color: var(--color-success, #2e7d32); }

/* Dark mode */
[data-theme="dark"] .plp-group-header { background: #2a2a2a; border-color: #444; color: #e8eaed; }
[data-theme="dark"] .plp-products { background: #0d1f0d; border-color: #2e5c2e; }

/* ── PLP table & list-view polish ──────────────────────────────────
   Targeted enhancements to the admin / data tables rendered by
   code-behind (LogViewer, ContactUsViewer, ContactUsStatus, Changes,
   DuplicateRecordFinder, TagItemRemover, SetItem/TaskDetailLevel,
   SQL.aspx, DataEditor). Generic .data-table styling lives in
   Shared/styles_shared.css; these are PLP-scoped overrides only. */

/* Server-rendered tables that scroll horizontally on narrow viewports
   get a thin gradient on the right edge to hint at additional content.
   The hint is purely decorative — wrapper itself still has overflow-x:auto. */
.table-responsive { position: relative; }

/* Tighten the empty-state when it sits directly inside .main-card — the
   card already has its own padding, so the default empty-state padding
   adds up to a lot of whitespace and pushes the call-to-action off screen
   on shorter viewports. Halves the vertical padding without changing the
   typography. */
.main-card > .empty-state,
.main-card > div > .empty-state {
    padding-top: 1.25rem;
    padding-bottom: 1.25rem;
}

/* Pager rows (top + bottom of long admin lists). Align Prev/Next + page
   counter on a single horizontal row that wraps gracefully on narrow
   screens. Shared base style covers .log-pager; this guarantees the
   children stay legible and tappable. */
.log-pager,
.changes-pager-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin: 0.5rem 0;
}
.log-pager .button.small,
.changes-pager-row .button.small {
    min-height: 36px;
}

/* What's New: the order switch + "only what's new since my last visit" filter.
   Sits above the pager and stays put when the filter empties the list, so the
   control that turns the filter back off is never the thing that disappears. */
.changes-controls-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem;
    margin: 0 0 0.75rem;
}
.changes-sort-toggle {
    display: flex;
    gap: 0.35rem;
}
.changes-sort-toggle .button.small {
    min-height: 36px;
}
.changes-onlynew {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    cursor: pointer;
    margin: 0;
}
/* Marks an entry published after the stored last-visit marker. Uses the shared
   .pill so it matches every other chip on the site; only the accent differs. */
.pill.changes-new-badge {
    background: var(--color-success-bg, #E8F5E9);
    border-color: var(--color-success, #4CAF50);
    color: var(--color-success-text, #1B5E20);
    margin-right: 0.4em;
    font-weight: 600;
}

/* ContactUsViewer "Search comments": keep the clear (×) button glued to the
   textbox's right edge. The shared rule caps .form-group .textbox at 480px on
   desktop, but the .input-clearable wrapper still stretches to the full
   toolbar-search-grow width — leaving the absolutely-positioned × floating to
   the right of the textbox. Cap the wrapper to match the textbox at the same
   breakpoint so the × sits inside the field. */
@media (min-width: 768px) {
    .toolbar-search-grow .input-clearable { max-width: 480px; }
}

/* Admin / data tables — improve baseline readability ─────────────── */
.log-table,
.cuv-table,
.drf-table,
.detail-level-table,
.sql-results-table {
    width: 100%;
}
/* Vertically center every cell so single-line text doesn't visually
   sink relative to multi-line cells (e.g. App / Page stacked in CUV). */
.log-table td,
.cuv-table td,
.drf-table td,
.detail-level-table td,
.sql-results-table td {
    vertical-align: middle;
}
/* Right-align the short numeric columns the shared .text-center rule
   already centers via inline th class. Keep header alignment in sync
   with body alignment so columns read cleanly. */
.cuv-table th.text-center,
.cuv-table td.text-center {
    text-align: center;
}

/* Clickable rows: make the affordance obvious. Shared styles already
   provide hover; this just bumps cursor + active states so admins see
   "click me" on tables that respond to row clicks (CUV, LogViewer,
   ContactUsStatus). */
.log-table tbody tr[onclick],
.cuv-table tbody tr[onclick] {
    cursor: pointer;
}
.cuv-table tbody tr.cuv-row:hover {
    background: var(--color-info-bg);
}
.cuv-table tbody tr.cuv-selected {
    background: var(--color-accent-bg, var(--color-info-bg));
    outline: 2px solid var(--color-accent);
    outline-offset: -2px;
}

/* Sticky header for the longer admin tables so column meanings stay
   visible while scrolling a full page of results. Falls back gracefully
   in browsers without position:sticky support. */
.log-table thead th,
.cuv-table thead th {
    position: sticky;
    top: 0;
    background: var(--color-bg-card);
    z-index: 2;
}

/* LogViewer purge row — gives the days dropdown its own labeled slot
   above the danger button. .lv-purge-group constrains the dropdown
   width on desktop so it doesn't stretch to fill the form-row column;
   .btn-trailing in the action row already pushes the destructive
   button to the right. */
.lv-purge-group { max-width: 18rem; }

/* DuplicateRecordFinder — fix the children column alignment to read as
   a numeric value (right-aligned) so warning icons line up vertically
   across rows of varying widths. */
.drf-table th.drf-th-children,
.drf-table td.drf-td-children {
    text-align: right;
    white-space: nowrap;
}

/* DuplicateRecordFinder — "Keep (master)" selector. Each group can pick one row
   as the master; checked duplicates in that group get their child rows re-pointed
   to it before deletion. The bar above each group's table carries the default
   "Keep none as master" option. The Keep radio column stays narrow + centered to
   line up with the leading checkbox column. */
.drf-master-bar {
    margin: 0 0 .4rem;
    font-size: var(--font-size-sm, 0.875rem);
}
.drf-master-bar .drf-master-opt {
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: .35rem;
}
.drf-table th.drf-th-keep,
.drf-table td.drf-td-keep {
    text-align: center;
    white-space: nowrap;
    width: 1%;
}

/* DuplicateRecordFinder — visible whitespace anomaly markers. HTML collapses runs
   of spaces and hides tabs / non-breaking spaces, so duplicate rows that differ only
   in spacing ("Gardening  Gloves" vs "Gardening Gloves") look identical. Each leading/
   trailing space, run of 2+ spaces, or odd whitespace char is rendered as one of these
   red chips so the difference is obvious (and countable) when choosing which to keep.
   Tokens are theme-aware (dark-mode overrides exist for the danger bg/border). */
.drf-table .drf-ws {
    display: inline-block;
    min-width: .65em;
    text-align: center;
    color: var(--color-danger);
    background: var(--color-danger-bg);
    border: 1px solid var(--color-danger-border);
    border-radius: 3px;
    padding: 0 1px;
    line-height: 1.1;
    font-weight: 700;
}

/* SQL admin tables — wrap long string values inside cells instead of
   truncating mid-character. word-break:break-word keeps the cell within
   its max-width but still wraps unbroken identifiers cleanly. */
.sql-results-table td {
    word-break: break-word;
}

/* ── Data Editor grid (.de-table) + change-preview table (.de-preview-table) ──
   DataEditor.aspx renders an inline-editable record grid and a preview modal
   table. Both previously had no base styling (browser-default tables: no cell
   borders, no header emphasis, ragged column alignment). The page's "Compact
   Rows" toggle adds/removes .de-spacious on .de-table-wrap but had no matching
   CSS, so it did nothing. These PLP-scoped rules give the grid readable column
   separation, an emphasized sticky header, and make the compact/spacious
   toggle actually change row height. All colors use theme tokens so dark
   mode is covered automatically. */
.de-table,
.de-preview-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--font-size-sm);
}
.de-table th,
.de-table td,
.de-preview-table th,
.de-preview-table td {
    padding: 0.3rem 0.5rem;
    border-bottom: 1px solid var(--color-border);
    vertical-align: middle;
    text-align: left;
}
/* The editable grid scrolls horizontally inside .de-table-wrap, so keep the
   header labels on a single line; the wrapper provides the scroll. */
.de-table th { white-space: nowrap; }
.de-table thead th,
.de-preview-table thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--color-bg-card);
    font-weight: var(--font-weight-bold);
    border-bottom: 2px solid var(--color-border);
}
.de-table tbody tr:hover { background: var(--color-info-bg); }
/* Primary-key cells are read-only — distinguish them from the editable
   columns with muted bold text and no wrapping. */
.de-table .pk-cell {
    white-space: nowrap;
    color: var(--color-text-muted);
    font-weight: var(--font-weight-bold);
}
/* Keep the in-cell text inputs compact so a multi-column grid stays scannable;
   the .textbox base already supplies the border + focus ring. */
.de-table .de-cell {
    padding: 0.2rem 0.4rem;
    min-width: 7rem;
}
/* Pack mode chip under the progress bar (ToDo PLR-168). Sits on its own row so it does
   not crowd the bar, and the note beside it explains what is hidden — a shortened list
   with no explanation reads as lost data, which is the failure mode a filter chip has to
   avoid above all others.
   Since 2026-09-19 the row sits BELOW .plp-summary rather than inside it, so it survives the
   empty states and the summary preference; .plp-summary's own margin-bottom spaces the two. */
.plp-packmode-row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-bottom: 0.75rem;
}
/* Build Mode | Pack Mode — one segmented pair, exactly one lit (owner, 2026-09-13). The lit
   half uses .button-active below. Three-part selectors on purpose: .button / .button.small in
   styles_shared.css load AFTER this file and would win a two-class tie on border-radius. */
.plp-packmode-row .plp-mode-toggle {
    display: inline-flex;
    flex-wrap: nowrap;
}
.plp-packmode-row .plp-mode-toggle > .button {
    margin: 0;
    border-radius: 0;
}
.plp-packmode-row .plp-mode-toggle > .button:first-child {
    border-top-left-radius: var(--border-radius-sm, 6px);
    border-bottom-left-radius: var(--border-radius-sm, 6px);
}
.plp-packmode-row .plp-mode-toggle > .button:last-child {
    margin-left: -1px;   /* the two borders meet as one line */
    border-top-right-radius: var(--border-radius-sm, 6px);
    border-bottom-right-radius: var(--border-radius-sm, 6px);
}
/* The pressed state. aria-pressed carries it for assistive tech; this makes it visible.
   Deliberately the accent fill rather than a border tint: a toggle that is merely
   outlined when active is the single most-missed affordance in this codebase's UI. */
.button.button-active,
.button.transparent.button-active {
    background: var(--color-accent);
    color: #111;                      /* 7.61:1 on the cyan, same pairing as .back-to-top */
    border-color: var(--color-accent);
}

/* A cell holding a real NULL (ToDo PLR-132). It used to render byte-identically to a
   cell holding an empty string - both value="" - so nothing on screen told the admin
   which was which. The value stays "" (saving is unchanged); this is the visible half:
   a dashed left edge plus the "(null)" placeholder the code-behind emits. Deliberately
   understated - it marks a normal state, not an error. */
.de-table .de-cell.de-cell-null {
    border-left: 3px dashed var(--color-border);
}
.de-table .de-cell.de-cell-null::placeholder {
    font-style: italic;
    opacity: 0.75;
}
/* Leading checkbox column stays narrow + centered above the row checks. */
.de-table thead th:first-child,
.de-table td:first-child {
    width: 1%;
    text-align: center;
    white-space: nowrap;
}
/* Compact is the default; unchecking "Compact Rows" adds .de-spacious to the
   wrapper for roomier rows. Without this rule the toggle was a no-op. */
.de-spacious .de-table th,
.de-spacious .de-table td {
    padding-top: 0.6rem;
    padding-bottom: 0.6rem;
}
/* Preview modal: bold the incoming value so each pending change stands out. */
.de-preview-table td:last-child { font-weight: var(--font-weight-bold); }
.de-table tbody tr:last-child td,
.de-preview-table tbody tr:last-child td { border-bottom: none; }

@media (max-width: 767px) {
    /* Tighten the grid on narrow viewports so more columns stay visible before
       the horizontal scroll engages; shrink the in-cell inputs to match. */
    .de-table { font-size: var(--font-size-xs); }
    .de-table th,
    .de-table td { padding-left: 0.35rem; padding-right: 0.35rem; }
    .de-table .de-cell { min-width: 5.5rem; }
    /* Sticky header can overlap the page header on small screens — drop it so
       the whole result region scrolls cleanly (mirrors .log-table/.cuv-table). */
    .de-table thead th { position: static; }
}

/* List-row variant tables — Repeater-rendered lists (Trips, Notes,
   Itinerary, Expenses) share a "clickable row + meta line" pattern.
   Bump min row height on touch viewports so taps land reliably even
   when the row body is just a title + date. */
.trip-list-item,
.note-item,
.itin-item,
.exp-item {
    min-height: 48px;
}

/* ── Itinerary filter bar (search + type/status) ──────────────────
   Sits above the full itinerary list when there are 3+ items.
   Flex-wrapping so the inputs/dropdowns stack on phones. The
   .input-clearable wrapper handles the × button via site.js. */
.itin-filter-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.75rem;
}
.itin-filter-search {
    flex: 1 1 12rem;
    min-width: 0;
}
.itin-filter-select {
    flex: 0 0 auto;
    min-width: 8rem;
}
.itin-filter-clear {
    flex: 0 0 auto;
}
.itin-filter-results {
    flex: 1 1 100%;
    margin: 0;
}
@media (max-width: 575px) {
    .itin-filter-search,
    .itin-filter-select { flex: 1 1 100%; }
    .itin-filter-clear { width: 100%; }
}

/* ── Trip Dashboard — card header "Open →" link (2026-09-26) ──────────
   Owner: the card TITLE now toggles the card, and this small link at the
   right of the title row goes to the card's page. It lives inside the <h2>
   so it stays visible on a shut card. The title row is a wrapping flex row
   (styles_shared.css: title 0, chevron 1, summary 2, count pill 3), so:
   • order 4 puts it last on the row, and margin-left:auto pushes it right;
   • when a summary or count pill is present, THEY already carry the auto
     margin (flex splits free space between competing auto margins, which
     would strand the pill mid-row), so the link drops its own;
   • under 768px the shared rule sends the summary to its own line at
     order 4 — here it goes to 5, so the link stays up on the title row,
     and with no count pill left on that row the link takes the auto margin
     back. min-height clears the 24px tap-target minimum (WCAG 2.5.8). */
.card-title.td-has-go > .td-head-go {
    order: 4;
    margin-left: auto;
    flex: 0 0 auto;
    align-self: center;
    display: inline-flex;
    align-items: center;
    min-height: 1.6rem;
    padding: 0 0.6rem;
    border: 1px solid var(--color-border, #dee2e6);
    border-radius: 999px;
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-normal, 400);
    line-height: 1;
    color: var(--color-link, var(--color-accent));
    text-decoration: none;
    white-space: nowrap;
}
.card-title.td-has-go > .td-head-go:hover,
.card-title.td-has-go > .td-head-go:focus-visible {
    border-color: var(--color-accent);
    color: var(--color-link-hover, var(--color-accent));
}
.card-title.td-has-go.home-head-hassummary > .td-head-go,
.card-title.td-has-go.home-head-hascount > .td-head-go { margin-left: 0; }
@media (max-width: 767.98px) {
    .card-title.td-has-go > .home-head-summary { order: 5; }
    .card-title.td-has-go.home-head-hassummary:not(.home-head-hascount) > .td-head-go { margin-left: auto; }
}

/* ── Trip Dashboard — Weather card ─────────────────────────────────
   Async-loaded forecast (WeatherService → GetWeather WebMethod). A
   horizontally scrollable strip of per-day tiles so a multi-week trip
   never forces the card taller than the rest of the dashboard. */
.td-weather-loc { margin: 0 0 0.5rem; }
.td-weather-days {
    display: flex;
    gap: 0.5rem;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    padding-bottom: 0.25rem;
}
.td-weather-day {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.2rem;
    min-width: 76px;
    padding: 0.5rem 0.45rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: var(--color-bg);
    text-align: center;
}
.td-weather-date {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    line-height: 1.2;
}
.td-weather-date strong {
    display: block;
    color: var(--color-text);
    font-size: var(--font-size-sm);
}
.td-weather-icon { font-size: 1.6rem; line-height: 1; }
.td-weather-temp { font-size: var(--font-size-sm); white-space: nowrap; }
.td-weather-precip { font-size: var(--font-size-xs); color: var(--color-info-text); white-space: nowrap; }
.td-weather-horizon { margin: 0.5rem 0 0; }
.td-weather-loading { margin: 0; }
/* Open-Meteo attribution, tucked into a subtle info icon on the location line —
   dim by default, full-opacity on hover/focus; tooltip carries the credit. */
.td-weather-credit-link {
    text-decoration: none;
    color: var(--color-text-muted);
    opacity: 0.7;
    cursor: help;
    font-size: 0.85em;
    margin-left: 0.15rem;
}
.td-weather-credit-link:hover,
.td-weather-credit-link:focus { opacity: 1; }

/* ── Weather page (.wx-*) ──────────────────────────────────────────
   Standalone Weather.aspx: location chips, current-conditions card,
   16-day <details> list, and the lazy-loaded hourly tables. */

/* ── Collapsible weather cards (2026-08-16) ────────────────────────────────
   EVERY card on this page is now a <details class="main-card wx-card"> whose
   <summary class="card-title"> is the heading; styles_shared.css supplies the ▸/▾
   chevron for any summary.card-title. These rules only fix the header chrome —
   a collapsed card reads as a clean bar (no divider under a heading with nothing
   beneath it) and the divider returns when it opens. Same treatment qMEET's
   .dash2-card gets, deliberately: these two surfaces are kept in sync. */
.wx-card > summary.card-title {
    margin: 0;
    padding-bottom: 0;
    border-bottom: 0;
    align-items: center;
    cursor: pointer;
    user-select: none;
}
.wx-card[open] > summary.card-title {
    margin-bottom: 0.85rem;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--color-border);
}
.wx-card > summary.card-title:focus-visible {
    outline: none;
    box-shadow: var(--shadow-focus, 0 0 0 3px rgba(0, 176, 240, 0.35));
    border-radius: var(--border-radius-sm);
}
/* Collapsed-state teaser: the city in Location, "76.9°F Drizzle" in the today card —
   the one fact you would have expanded the card to read. Hidden while it IS open,
   where the full version of the same fact is already on screen. */
.wx-sum-teaser {
    margin-left: auto;
    font-weight: 400;
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted);
    text-align: right;
    min-width: 0;
    overflow-wrap: anywhere;
}
details[open] > summary > .wx-sum-teaser { display: none; }
/* The AQI pill, shrunk to ride on the Air Quality summary line. NOT a .wx-sum-teaser:
   it stays visible when the card is open, because it IS the headline number and the
   body below only explains it. */
.wx-sum-pill { margin-left: auto; }
.wx-sum-pill.wx-air-pill { padding: 0.15rem 0.6rem; }
.wx-sum-pill .wx-air-num { font-size: 1rem; }
.wx-sum-pill .wx-air-band { font-size: var(--font-size-xs, 0.75rem); }
/* Today's own day row closes out the "right now" card (its detail used to open the
   multi-day card). It is the last thing in that card, so it carries a top rule
   instead of the bottom one the rows in the forecast list use. */
.wx-today-card > .wx-day {
    border-bottom: none;
    border-top: 1px solid var(--color-border);
    margin-top: 0.75rem;
}

.wx-chip-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
}
.wx-loc-chip {
    appearance: none;
    -webkit-appearance: none;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    max-width: 100%;
    padding: 0.5rem 1rem;
    border: 1px solid var(--color-border);
    border-radius: 999px;
    background: var(--color-bg-card);
    color: var(--color-text);
    font-size: var(--font-size-base, 1rem);
    line-height: 1.3;
    cursor: pointer;
}
.wx-loc-chip:hover { border-color: var(--color-primary); }
.wx-loc-chip.active {
    border-color: var(--color-primary);
    background: var(--color-primary-light);
    font-weight: 600;
}
/* Saved-location group: the select chip plus its keep (star) + remove (x)
   actions, kept together so the trio wraps as one unit. */
.wx-chip-wrap {
    display: inline-flex;
    align-items: center;
    gap: 0;
    max-width: 100%;
    /* The wrapper is the pill outline; the select chip + keep/remove buttons all
       sit inside it (buttons can't legally nest inside the chip <button>). */
    border: 1px solid var(--color-border);
    border-radius: 999px;
    background: var(--color-bg-card);
    padding-right: 0.25rem;
}
.wx-chip-wrap:hover { border-color: var(--color-primary); }
/* Inside the wrap, the select chip drops its own pill chrome so there's a single
   pill outline; only its active state still fills. */
.wx-chip-wrap .wx-loc-chip {
    border-color: transparent;
    background: transparent;
    padding-right: 0.4rem;
}
.wx-chip-wrap .wx-loc-chip:hover { border-color: transparent; }
.wx-chip-wrap .wx-loc-chip.active {
    background: var(--color-primary-light);
    border-color: transparent;
}
.wx-chip-action {
    appearance: none;
    -webkit-appearance: none;
    flex: 0 0 auto;
    border: 1px solid transparent;
    border-radius: 999px;
    background: none;
    cursor: pointer;
    color: var(--color-text-light, #9aa0a8);
    font-size: var(--font-size-sm);
    line-height: 1;
    padding: 0.25rem 0.4rem;
    transition: color 0.15s ease, background-color 0.15s ease;
}
.wx-chip-action:hover { color: var(--color-text); background: var(--color-primary-light); }
.wx-chip-action:focus-visible {
    outline: 2px solid var(--color-border-focus, var(--color-primary));
    outline-offset: 1px;
}
.wx-chip-pin.active { color: var(--color-warning, #e0a500); }   /* gold star when kept */
.wx-chip-del:hover {
    color: var(--color-danger, #d9534f);
    background: var(--color-danger-bg, rgba(217, 83, 79, 0.12));
}
/* Search box + 🔍 Search button on ONE row, button immediately to the RIGHT of the
   box (owner request 2026-08-09, matching qMEET). nowrap is the point: with wrap the
   button dropped to its own line as soon as the column got narrow. The textbox absorbs
   all the slack and is allowed to shrink (flex-basis 0 + min-width 0), so even on a
   phone the button stays beside it instead of below it. */
.wx-search-row {
    display: flex;
    flex-wrap: nowrap;
    gap: 0.5rem;
    align-items: center;
}
.wx-search-row .input-clearable { flex: 1 1 0; min-width: 0; }
/* max-width:none cancels styles_shared.css's `@media (min-width:768px)
   .form-group .textbox { max-width: 480px }`. That cap deliberately skips the
   WRAPPER here (see the comment beside it) but still hit the input inside, so on a
   wide screen the field stopped at 480px while its absolutely-positioned × clear
   button stayed pinned to the full-width wrapper — the × floating in open space to
   the right of the box, with a dead gap before 🔍 Search. */
.wx-search-row .input-clearable .textbox { width: 100%; max-width: none; min-width: 0; }
/* Button keeps its natural width and never wraps its own label. */
.wx-search-row .button { flex: 0 0 auto; white-space: nowrap; }
/* ⚠ Phones: the `flex-wrap: nowrap` above cannot hold this row. The two buttons are
   `flex: 0 0 auto` + `white-space: nowrap`, so they refuse to shrink OR wrap, and the
   only flexible item left is the search field — which gets squeezed to nothing.
   Measured on /Home at a 380px viewport, 2026-08-12: row 331px wide but wanted 362;
   .input-clearable collapsed to width 0 with #wxSearchInput spilling out of it at 45px,
   the "🔍 Search" button painted ON TOP of the field (button x33→144 vs field x25→70),
   and "📍 Use My Current Location" running to x386 — past the 380px viewport and into
   body's `overflow-x: clip`, so its right edge was cut off with no scrollbar.
   ⚠ That button was renamed "📍 Check My Location" on 2026-08-20 — 8 characters shorter,
   so the x386 figure is of the OLD label and has NOT been retaken. The wrap rule below
   stays regardless: the squeeze it fixes is the search field's, which is independent of
   how wide the location button happens to be.
   Letting the row wrap fixes all three at once: the field gets a real 211px, Search
   stays beside it, and the location button drops to its own line. Nothing else is
   needed — .input-clearable is already `flex: 1 1 0`, so the line packing works out on
   its own; do NOT also pin a flex-basis here, it changes nothing and only adds a knob.
   Kept at ≤575px so the deliberate single-line desktop row is untouched. */
@media (max-width: 575px) {
    .wx-search-row { flex-wrap: wrap; }
}
/* "📍 Check My Location" (labeled "Use My Current Location" until 2026-08-20) + the
   "Found: ..." note it fills, sitting above the
   saved-location chips. The note keeps its own margin off so the row stays one
   line high while it is hidden AND after it appears. */
.wx-geo-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}
.wx-geo-row #wxGeoFound { margin: 0; }
#wxSearchResults { margin-top: 0.5rem; }
.wx-meta { margin: 0; }

/* Auto "Right now / rest of today" card (profile location, top of page) */
.wx-today-now {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.4rem 0.9rem;
    margin-bottom: 0.85rem;
}
.wx-today-icon { font-size: 2.4rem; line-height: 1; }
.wx-today-temp { font-size: 2rem; font-weight: 700; line-height: 1; white-space: nowrap; }
.wx-today-meta { display: flex; flex-direction: column; gap: 0.1rem; }
.wx-today-cond { font-weight: 600; }
/* .wx-today-subhead ("Next 24 hours …") was deleted 2026-08-09 by owner request; its
   only emitter in Weather.aspx.vb's RenderTodayCard went with it, so the rule is gone
   too. The hour strip below now sits straight under .wx-sunmoon, whose own bottom
   margin supplies the gap the heading used to. */
.wx-today-hours {
    display: flex;
    gap: 0.5rem;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    padding-bottom: 0.35rem;
}
.wx-today-hour {
    flex: 0 0 auto;
    min-width: 5rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.2rem;
    padding: 0.5rem 0.45rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius, 10px);
    background: var(--color-bg-subtle, var(--color-bg-card));
    text-align: center;
}
.wx-today-h { font-size: var(--font-size-sm); font-weight: 600; white-space: nowrap; }
.wx-today-cond-icon { font-size: 1.5rem; line-height: 1; }
.wx-today-t { font-size: var(--font-size-lg, 1.125rem); font-weight: 700; white-space: nowrap; }
.wx-today-metric {
    font-size: var(--font-size-xs, 0.78rem);
    white-space: nowrap;
    color: var(--color-text);
}
.wx-today-gust { color: var(--color-text); }

/* --- UV index (current hour) --------------------------------------------- */
/* Same shape as the AQI headline: a banded pill plus plain-language advice.
   Like the AQI bands these are FIXED swatches rather than theme tokens, so each
   pairs its background with an explicit text color measured to clear 4.5:1 on
   that exact swatch in BOTH themes. */
.wx-uv-headline {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    margin: 0 0 0.85rem;
}
.wx-uv-pill {
    display: inline-flex;
    align-items: baseline;
    gap: 0.4rem;
    padding: 0.3rem 0.65rem;
    border-radius: 999px;
    font-weight: var(--font-weight-bold, 700);
    white-space: nowrap;
}
.wx-uv-num { font-size: var(--font-size-lg, 1.125rem); line-height: 1; }
.wx-uv-band { font-size: var(--font-size-sm, 0.875rem); }
.wx-uv-meta { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
.wx-uv-advice { font-size: var(--font-size-sm, 0.875rem); }

.wx-uv-1 { background: #7ac943; color: #10240a; }   /* Low */
.wx-uv-2 { background: #fdd74b; color: #3d2f00; }   /* Moderate */
.wx-uv-3 { background: #fe9b57; color: #3d1c00; }   /* High */
.wx-uv-4 { background: #fe6a69; color: #3d0000; }   /* Very High */
.wx-uv-5 { background: #c9a3d8; color: #2a0f36; }   /* Extreme */

/* --- Sun + moon strip ----------------------------------------------------- */
/* Sunrise / sunset / daylight length, then moon phase, moonrise, moonset. Wraps
   as a chip row rather than a grid so a location missing (say) moonset simply
   yields one fewer item instead of an empty cell. */
.wx-sunmoon {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem 0.5rem;
    margin: 0 0 0.85rem;
}
.wx-sunmoon-item {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.3rem 0.6rem;
    border: 1px solid var(--color-border, #dee2e6);
    border-radius: 999px;
    background: var(--color-bg-subtle, var(--color-bg-card, #fff));
    font-size: var(--font-size-sm, 0.875rem);
    white-space: nowrap;
}

/* --- Barometer: pressure trend + rain outlook (2026-09-26) ----------------- */
/* Drawn by Shared\PressureTrend.vb on all three weather surfaces; keep this block
   identical in PLP, PM and qMEET styles.css. The left border carries the outlook
   (storm red, wet blue, maybe light blue, dry amber) so the line reads at a
   glance; the words say the same thing, so color is never the only signal. */
.wx-baro {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    margin: 0 0 0.85rem;
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--color-border, #dee2e6);
    border-left-width: 4px;
    border-radius: var(--border-radius, 6px);
    font-size: var(--font-size-sm, 0.875rem);
}
.wx-baro-read,
.wx-baro-outlook { display: flex; align-items: baseline; gap: 0.4rem; flex-wrap: wrap; }
.wx-baro-arrow { font-size: var(--font-size-lg, 1.125rem); line-height: 1; font-weight: var(--font-weight-bold, 700); }
.wx-baro-storm   { border-left-color: #dc2626; }
.wx-baro-wet     { border-left-color: #2563eb; }
.wx-baro-maybe   { border-left-color: #60a5fa; }
.wx-baro-neutral { border-left-color: #9ca3af; }
.wx-baro-dry     { border-left-color: #eab308; }

/* Current conditions */
.wx-now-headline {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 0.75rem;
}
.wx-now-icon { font-size: 2.4rem; line-height: 1; }
.wx-now-temp { font-size: 2rem; font-weight: 700; line-height: 1; white-space: nowrap; }
.wx-now-meta { display: flex; flex-direction: column; gap: 0.15rem; }
.wx-now-cond { font-weight: 600; }

/* Label/value grid shared by the current card and each day's detail */
.wx-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: 0.5rem 1rem;
    margin: 0 0 0.75rem;
}
.wx-cell dt {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    font-weight: 400;
}
.wx-cell dd { margin: 0; font-size: var(--font-size-sm); }
/* A cell that takes the whole row instead of one auto-fill column. Home's "Where Am I?"
   address is the case it exists for: a street address wraps to three lines inside a
   160px column, and it's the value on that card somebody actually reads out or copies. */
.wx-cell-wide { grid-column: 1 / -1; }

/* 16-day list */
.wx-day { border-bottom: 1px solid var(--color-border); }
.wx-day:last-child { border-bottom: none; }
.wx-day-summary {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
    padding: 0.55rem 0.25rem;
    cursor: pointer;
}
.wx-day-summary:hover { background: var(--color-primary-light); }
.wx-day-date { min-width: 5.5rem; font-size: var(--font-size-sm); }
.wx-day-icon { font-size: 1.3rem; line-height: 1; }
.wx-day-cond { flex: 1 1 auto; font-size: var(--font-size-sm); }
.wx-day-temp { font-size: var(--font-size-sm); white-space: nowrap; }
.wx-day-precip { font-size: var(--font-size-xs); color: var(--color-info-text); white-space: nowrap; }
.wx-day-detail { padding: 0.5rem 0.25rem 0.85rem; }

/* Hourly table — wide, so it scrolls inside its own wrapper */
.wx-hourly-body { margin-top: 0.6rem; }
.wx-hourly-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    border: 1px solid var(--color-border);
    border-radius: 6px;
}
.wx-hourly-table {
    border-collapse: collapse;
    font-size: var(--font-size-xs);
    white-space: nowrap;
    width: max-content;
    min-width: 100%;
}
.wx-hourly-table th,
.wx-hourly-table td {
    /* Tightened 2026-08-28 (owner request): this table is nakedly horizontal, so
       every mm of side padding is another column pushed off-screen. */
    padding: 0.25rem 0.3rem;
    border-bottom: 1px solid var(--color-border);
    text-align: right;
}
.wx-hourly-table th[scope="row"],
.wx-hourly-table thead th:first-child { text-align: left; }
.wx-hourly-table thead th {
    position: sticky;
    top: 0;
    background: var(--color-bg-card);
    z-index: 1;
}
.wx-hourly-table tbody tr:last-child td,
.wx-hourly-table tbody tr:last-child th { border-bottom: none; }
/* Conditions: the header text is gone (the cell is a single emoji, which says it),
   so the column only needs room for that emoji. */
.wx-hourly-table .wx-col-cond { padding-left: 0.2rem; padding-right: 0.2rem; }
.wx-hourly-table td:nth-child(2) { text-align: center; }
/* The unit sits UNDER its header rather than beside it, so a header is never wider
   than the longest of the two words. */
.wx-hourly-table thead th { line-height: 1.15; }
.wx-unit {
    display: block;
    font-weight: 400;
    color: var(--color-text-muted);
}

/* ── Weather extras: severe-weather alerts · air quality · rain nowcast ──────
   Ported from the qMEET dashboard weather card (2026-07-24). On the PLP Weather
   page the alerts and air-quality blocks render as their own .main-card and the
   nowcast as a standalone banner, so spacing differs from qMEET's single-card
   layout. The tier/AQI accent colors are FIXED hex on purpose — a Tornado Warning
   and the EPA AQI scale must read the same in light and dark, so only the tier
   TEXT colors get a [data-theme="dark"] lift (PLP's dark-mode convention). */

/* Alerts — left-border + text accent (tier 4 alone gets a filled background). */
.wx-alert {
    border: 1px solid var(--color-border, #dee2e6);
    border-left-width: 4px;
    border-radius: var(--border-radius, 6px);
    padding: 0.5rem 0.7rem;
    margin-bottom: 0.4rem;
    /* ⚠ --color-surface-muted was UNDECLARED until 2026-08-15, so this served the
       literal #f8f9fa in dark mode too (an undeclared custom property falls back to
       the literal, it does NOT fall through to the theme). It is now declared light +
       dark in Shared/styles_shared.css — don't "simplify" it back to a bare hex. */
    background: var(--color-surface-muted, #f8f9fa);
}
.wx-alert:last-child { margin-bottom: 0; }

/* The two NON-alert states of the alerts slot, added 2026-08-23. Both exist so that
   an empty alerts panel can only ever mean one thing: the NWS feed answered and had
   nothing. Before this, a failed lookup and a place outside NWS coverage both drew
   nothing and read as an all-clear nobody had checked.
   .wx-alerts-fail is deliberately the louder of the two — it is a warning that we do
   not know, which matters more than the quiet "not covered here" note. Neither uses
   the alert tier accents: they are not hazards, and dressing them as one would cry
   wolf. Padding matches .main-card's own so they sit level with the cards around them. */
.wx-alerts-fail,
.wx-alerts-note { padding: 0.6rem 0.8rem; }
.wx-alerts-fail {
    border-left: 4px solid var(--color-warning, #F0AD4E);
    background: var(--color-surface-muted, #f8f9fa);
}
.wx-alerts-fail p { margin: 0; }
.wx-alerts-note p { margin: 0; }
.wx-alert-summary { cursor: pointer; display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap; }
.wx-alert-name { font-weight: var(--font-weight-bold, 700); }
.wx-alert-when { font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.wx-alert-body { margin-top: 0.5rem; }
.wx-alert-text { font-size: var(--font-size-sm, 0.875rem); margin: 0 0 0.5rem; max-width: 70ch; }
.wx-alert-instruction { margin-bottom: 0.25rem; }

.wx-alert-emergency { border-left-color: #7f1d1d; background: #fee2e2; }
.wx-alert-emergency .wx-alert-name { color: #7f1d1d; }
.wx-alert-emergency .wx-alert-text,
.wx-alert-emergency .wx-alert-when,
.wx-alert-emergency .small-text { color: #450a0a; }

.wx-alert-warning  { border-left-color: #dc2626; }
.wx-alert-warning  .wx-alert-name { color: #b91c1c; }
.wx-alert-watch    { border-left-color: #f59e0b; }
.wx-alert-watch    .wx-alert-name { color: #b45309; }
.wx-alert-advisory { border-left-color: #eab308; }
.wx-alert-info     { border-left-color: var(--color-border, #9ca3af); }

[data-theme="dark"] .wx-alert-warning .wx-alert-name { color: #f87171; }
[data-theme="dark"] .wx-alert-watch   .wx-alert-name { color: #fbbf24; }

/* Rain nowcast — a slim standalone banner between the "right now" card and AQI. */
.wx-nowcast {
    margin: 0 0 1rem;
    padding: 0.55rem 0.85rem;
    border-radius: var(--border-radius, 6px);
    background: var(--color-surface-muted, #f8f9fa);
    border: 1px solid var(--color-border, #dee2e6);
    font-size: var(--font-size-sm, 0.9rem);
}
.wx-nowcast-wet { font-weight: var(--font-weight-bold, 700); }
.wx-nowcast-dry { color: var(--color-text-muted); }

/* Air quality — the .wx-air wrapper is its own .main-card, so no in-card divider. */
.wx-air-headline {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    margin-bottom: 0.75rem;
}
.wx-air-pill {
    display: inline-flex;
    align-items: baseline;
    gap: 0.4rem;
    padding: 0.35rem 0.7rem;
    border-radius: 999px;
    font-weight: var(--font-weight-bold, 700);
    white-space: nowrap;
}
.wx-air-num { font-size: 1.35rem; line-height: 1; }
.wx-air-band { font-size: var(--font-size-sm, 0.875rem); }
.wx-air-meta { display: flex; flex-direction: column; gap: 0.15rem; min-width: 0; }
.wx-air-advice { font-size: var(--font-size-sm, 0.875rem); }

.wx-aqi-1 { background: #a8e05f; color: #1a2e05; }   /* Good */
.wx-aqi-2 { background: #fdd74b; color: #3d2f00; }   /* Moderate */
.wx-aqi-3 { background: #fe9b57; color: #3d1c00; }   /* Unhealthy for Sensitive Groups */
.wx-aqi-4 { background: #fe6a69; color: #3d0000; }   /* Unhealthy */
.wx-aqi-5 { background: #a97abc; color: #ffffff; }   /* Very Unhealthy */
.wx-aqi-6 { background: #a87383; color: #ffffff; }   /* Hazardous */

/* ── Radar (RainViewer frames on a Leaflet map) ─────────────────────────────
   Ported from qMEET's Dashboard weather card 2026-08-15. A collapsed <details> on
   Weather.aspx; nothing here loads until it is opened.
   ⚠ 2026-08-16: it became a full .main-card.wx-card with a summary.card-title, so the
   old standalone-section chrome (margin-top / padding-top / border-top divider, and
   .wx-radar-summary's own font sizing) is GONE — .main-card and .card-title supply
   both now. Re-adding a divider here would double up on the card's own border. */
.wx-radar-summary {
    cursor: pointer;
    font-size: var(--font-size-base, 1rem);
    font-weight: 700;
}
.wx-radar-body { margin-top: 0.75rem; }
.wx-radar-map {
    height: 320px;
    width: 100%;
    border-radius: var(--border-radius, 6px);
    /* Leaflet paints its own tiles; a neutral base keeps the pre-load flash from
       flipping between white and the dark theme. --color-bg-card, NOT the
       --color-surface-muted / --color-surface pair qMEET's copy warns about: this one
       is declared light + dark in Shared/styles_shared.css, so it really does follow
       the theme instead of freezing on its fallback hex. */
    background: var(--color-bg-card, #eef1f4);
}
.wx-radar-controls {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    margin-top: 0.5rem;
    flex-wrap: wrap;
}
.wx-radar-slider { flex: 1 1 140px; min-width: 120px; }
@media (max-width: 640px) {
    .wx-radar-map { height: 240px; }
}

/* Radar full screen. One rule set serves BOTH mechanisms - the script adds .is-fs
   whether it got native fullscreen or fell back to the fixed overlay (iOS Safari
   won't fullscreen a <div>), so the two paths can't drift apart visually.
   position/inset are redundant under native fullscreen and harmless there. */
.wx-radar-body.is-fs {
    position: fixed;
    inset: 0;
    z-index: 10050;              /* above the sticky nav; below the toast layer */
    margin: 0;
    padding: 0.75rem;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    background: var(--color-bg-card, #ffffff);
}
/* Height must come from the flex row, not the fixed 320px above, or the map keeps
   its small box in the middle of a full-screen panel. min-height:0 lets a flex item
   shrink below its content size - without it the map overflows the viewport. */
.wx-radar-body.is-fs .wx-radar-map {
    flex: 1 1 auto;
    height: auto;
    min-height: 0;
    border-radius: 0;
}
.wx-radar-body.is-fs .wx-radar-controls { margin-top: 0; flex: 0 0 auto; }
/* The attribution paragraph is the last child and would otherwise eat vertical space. */
.wx-radar-body.is-fs > p { margin: 0; flex: 0 0 auto; }
@media (max-width: 640px) {
    .wx-radar-body.is-fs .wx-radar-map { height: auto; }
}

/* ── API Usage admin page (.au-*) ──────────────────────────────────
   ApiUsage.aspx: traffic stat chips, top-source mini tables, recent-call
   filter row, and the block-management form. */
.au-stats {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
}
.au-stat {
    display: flex;
    flex-direction: column;
    min-width: 9rem;
    padding: 0.6rem 0.9rem;
    border: 1px solid var(--color-border);
    border-radius: 8px;
    background: var(--color-bg-card);
}
.au-stat-num { font-size: 1.5rem; font-weight: 700; line-height: 1.2; }
.au-stat-label { font-size: var(--font-size-xs); color: var(--color-text-muted); }
.au-stat-bad .au-stat-num { color: var(--color-danger, #c0392b); }

.au-tops {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
    gap: 1rem;
}
.au-top-table { font-size: var(--font-size-sm); }
.au-top-table td:first-child { word-break: break-all; }
.au-refused { color: var(--color-danger, #c0392b); font-weight: 600; }

.au-filter-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.75rem;
}
/* The filter box sits in an .input-clearable wrapper (in-field × clear button),
   so the row's flex sizing rides on the wrapper; the input fills it. */
.au-filter-row .input-clearable { flex: 1 1 16rem; min-width: 0; }
.au-filter-row .input-clearable .textbox { width: 100%; min-width: 0; }
.au-recent-table { font-size: var(--font-size-xs); }
.au-recent-table code { word-break: break-all; }

.au-block-form {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 0 1rem;
    align-items: end;
    margin-bottom: 1rem;
}
.au-block-form .form-actions { grid-column: 1 / -1; }
.au-config { margin: 0; padding-left: 1.2rem; }

/* ── PLP responsive overrides ─────────────────────────────────── */
@media (max-width: 767px) {
    .cfg-controls { flex-wrap: wrap; width: 100%; }
    .cfg-select-imp, .cfg-select-tim { width: auto; flex: 1; min-width: 5rem; }
    .plp-options-checks { gap: 0.35rem 0.75rem; }
    .options-close-row .button { width: 100%; }
}
@media (max-width: 575px) {
    /* Flush left, same reason as the base rule — this is the width the phone can least
       afford to spend on anything but the item name. */
    .plp-item-row { padding: 0.35rem 0.15rem 0.35rem 0; gap: 0.25rem; }
    .plp-item-actions { gap: 0.25rem; }
    .plp-cb-label { min-width: 28px; font-size: var(--font-size-xs, 0.75rem); }
    .plp-more-btn { padding: 0.2rem 0.35rem; min-height: 32px; }
    .plp-group-header { padding: 0.5rem 0.625rem; font-size: var(--font-size-base); }
    .plp-products { padding-left: 1.25rem; }
}

/* ── PLP mobile responsiveness — wide-content safety net ──────────────
   Defensive overrides for PLP-specific patterns that risk horizontal
   overflow on narrow phones (≤575px) and tablets in portrait (≤767px).
   Shared/styles_shared.css owns the base layout; these only kick in
   when the viewport gets tight and only on PLP-prefixed classes. */

/* Long alphanumeric identifiers (Push ID, Trip Link Code, log message
   payloads) must break or scroll instead of pushing the viewport wider
   than the screen. */
/* th scope="row" defaults to text-align: center in UA stylesheet; the labels
   should align left in both narrow and wide layouts (visual matches the
   pre-a11y <td> rendering). */
.subscribe-details-table th { text-align: left; font-weight: var(--font-weight-bold, 600); }

.subscribe-details-value-id,
.share-link-input,
.tip-card-text code,
.log-detail-row pre {
    overflow-wrap: anywhere;
    word-break: break-word;
}
.log-detail-row pre { white-space: pre-wrap; }

/* Trip-invite accept card (Home + invite deep-link). Each pending invite shows
   Accept / Decline; Accept reveals a chooser so the invitee links the trip to one
   of THEIR OWN trips (or creates a new one) rather than getting a silent clone. */
.invite-row { padding: 0.75rem 0; border-top: 1px solid var(--color-border); }
.invite-row:first-child { border-top: 0; padding-top: 0; }
.invite-text { margin: 0 0 0.5rem; }
.invite-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.invite-chooser { margin-top: 0.5rem; }
.invite-chooser .invite-trip-select { width: 100%; max-width: 28rem; }
.invite-chooser .note { margin: 0.4rem 0 0.6rem; }

/* Two-panel "your two trips get LINKED" explainer, shown between Accept and the trip
   picker (Home.aspx.vb BuildInvitesHtml). Accepting does not move you onto the inviter's
   trip, and this card is the only place that's ever explained — so it renders BEFORE the
   choice it informs, not as a footnote under it.
   Panels are outlined, not filled: the card behind them is .main-card.card-accent, and
   tinting a panel on top of it would put .small-text on a background it was never
   contrast-checked against in either theme. Border-only keeps the text on --color-bg-card. */
.invite-explainer {
    display: flex;
    align-items: stretch;
    gap: 0.5rem;
    max-width: 34rem;
    margin: 0 0 0.6rem;
}
.invite-explainer-panel {
    flex: 1 1 0;
    min-width: 0;                       /* let long trip names wrap instead of stretching the row */
    padding: 0.55rem 0.7rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
}
.invite-explainer-title { margin: 0 0 0.2rem; font-weight: var(--font-weight-bold, 600); }
.invite-explainer-panel p:last-child { margin: 0; }
/* The 🔗 sits between the two panels on wide screens and between them vertically when
   they stack — either way it reads as "these two are joined". Decorative: aria-hidden. */
.invite-explainer-join {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--font-size-lg, 1.125rem);
    line-height: 1;
}
.invite-explainer-caption { max-width: 34rem; margin: 0 0 0.75rem; }

@media (max-width: 575px) {
    .invite-explainer { flex-direction: column; gap: 0.35rem; }
}

/* "Leave this trip" action under the companions roster (EditTrip Trip Link card). */
.share-roster-leave { margin-top: 0.75rem; padding-top: 0.6rem; border-top: 1px solid var(--color-border); }

/* One-line descriptor under each way of adding a companion (EditTrip Trip Link card).
   An emailed invite makes them a member the moment they accept; a Trip Link Code makes a
   'requested' row that does nothing until the organizer approves it — and the controls sat
   side by side with nothing saying so. NOT .note: this is the control's contract, not an
   aside, so it takes --color-text and stays upright rather than muted italic. */
.share-method-line {
    margin: 0.15rem 0 0.4rem;
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text);
}

/* "N requests waiting for your approval" beside the Trip Link Code. Compound selector on
   purpose: Content/styles.css loads BEFORE Shared/styles_shared.css, so a bare
   .share-pending-badge would lose background-color/border-color to plain .pill.
   Text stays --color-text (not --color-warning) — the warning tint is the background here,
   and #6c757d-family warning text on it would not clear AA. */
.pill.share-pending-badge {
    margin-left: 0.4rem;
    vertical-align: middle;
    background-color: var(--color-warning-bg);
    border-color: var(--color-warning-border);
}
.pill.share-pending-badge:hover { border-color: var(--color-warning); }
/* 🔴 REQUIRED, not defensive — same trap the shared sheet documents at §49/§50: [hidden] is
   a UA-stylesheet rule and LOSES to .pill's author-level `display: inline-flex`, so without
   this the badge renders at zero pending. */
.pill.share-pending-badge[hidden] { display: none; }

/* Tables rendered dynamically by code-behind use the standard
   .table-responsive wrapper. Belt-and-suspenders rule so the wrapper
   always scrolls horizontally even if Shared styles change. */
.table-responsive,
.de-table-wrap,
.sql-results-scroll,
.de-preview-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

@media (max-width: 767px) {
    /* SQL admin: tighten the per-cell max-width so individual long values
       don't single-handedly create huge horizontal scroll regions. */
    .sql-results-table td { max-width: 220px; }

    /* Tighten admin tables on narrow viewports: smaller cell padding +
       shrunk font keeps more columns visible before the horizontal scroll
       kicks in. Touch targets on row-click handlers stay 44px+ because
       .log-table/.cuv-table rows wrap multi-line content. */
    .log-table th,
    .log-table td,
    .cuv-table th,
    .cuv-table td,
    .drf-table th,
    .drf-table td,
    .detail-level-table th,
    .detail-level-table td {
        padding-left: 0.4rem;
        padding-right: 0.4rem;
    }

    /* On narrow screens, sticky thead can hide content under the page
       header. Drop sticky on mobile so the user can scroll the whole
       results region cleanly. */
    .log-table thead th,
    .cuv-table thead th {
        position: static;
    }

    /* LogViewer purge — let the labeled dropdown span the full width
       of the card on narrow screens. */
    .lv-purge-group { max-width: none; }
    .lv-purge-group .lv-purge-select { width: 100%; }

    /* Notes / Expenses / Itinerary list headers: ensure the action
       button row drops to its own line at full width when the title
       wraps, instead of squeezing into a too-small flex slot. */
    .notes-list-header { align-items: flex-start; }
    .notes-list-actions { width: 100%; }
    .notes-list-actions .button { flex: 1 1 auto; }

    /* DataEditor floating save bar: stack the toggle + buttons vertically
       and let them span full width so the bar doesn't overflow. */
    .de-save-bar {
        flex-wrap: wrap;
        gap: 0.5rem;
    }
    .de-save-bar .button { flex: 1 1 auto; }

    /* DataEditor toolbars wrap to multiple lines instead of overflowing. */
    .de-toolbar { flex-wrap: wrap; }
    .de-toolbar .form-group { flex: 1 1 12rem; min-width: 0; }

    /* Trip-link share row: textbox + Copy + Share… + Email stack so the
       email button doesn't drop off the screen. */
    .share-link-row {
        flex-wrap: wrap;
        gap: 0.5rem;
    }
    .share-link-row .share-link-input { flex: 1 1 100%; }
    .share-link-row .share-link-copy { flex: 0 1 auto; }

    /* Trip quick-nav and Home actions: let the row of pill-buttons wrap
       cleanly without horizontal squeeze. */
    .trip-quick-nav,
    .home-actions {
        flex-wrap: wrap;
        gap: 0.5rem;
    }

    /* Notes / Itinerary / Expenses list header actions wrap so
       "Email to Me" + "Print / PDF" don't collide with the title. */
    .notes-list-header,
    .notes-list-actions,
    .ai-response-header,
    .ai-response-actions {
        flex-wrap: wrap;
        gap: 0.5rem;
    }

    /* Itinerary day-nav (← title →) stays centered when the day-name
       wraps to two lines on narrow screens. */
    .itin-day-nav { flex-wrap: wrap; justify-content: center; }
    .itin-day-title { flex: 1 1 100%; text-align: center; order: -1; }

    /* Expenses summary row: 4 cells wrap into 2×2 instead of overflowing. */
    .exp-summary-row {
        flex-wrap: wrap;
    }
    .exp-summary-cell { flex: 1 1 calc(50% - 0.5rem); min-width: 0; }
}

@media (max-width: 575px) {
    /* Action rows: on the narrowest viewports give every button its own
       line so labels like "× Delete Old Logs" never truncate or wrap
       mid-icon. Excludes .form-actions-centered (already centered, often
       a single CTA), and excludes the floating Data Editor save bar
       (already stacks via its own rule above). */
    .form-actions:not(.form-actions-centered):not(.de-modal-actions) {
        flex-wrap: wrap;
    }
    .form-actions:not(.form-actions-centered):not(.de-modal-actions) > .button {
        flex: 1 1 100%;
    }

    /* DataEditor preview modal: the modal already has a scrolling table
       wrapper, but the action row at the bottom needs to stack too. */
    .de-modal-actions { flex-wrap: wrap; }
    .de-modal-actions .button { flex: 1 1 100%; }

    /* DataEditor save bar in narrowest viewport — full-width buttons. */
    .de-save-bar .button { flex: 1 1 100%; }

    /* SubscribeDetails table cells: stack label above value when the
       row no longer fits. */
    .subscribe-details-table td,
    .subscribe-details-table th {
        display: block;
        width: 100%;
        text-align: left;
    }
    .subscribe-details-label {
        padding-bottom: 0;
        font-weight: var(--font-weight-bold);
    }

    /* Trips card filter chips wrap and stay tappable. */
    .trip-filter-chips {
        flex-wrap: wrap;
        gap: 0.35rem;
    }

    /* Admin tables on the smallest viewports — drop to xs font and
       further tighten padding. Cells with .nowrap (timestamps) keep
       their no-wrap behavior so dates don't break in awkward places. */
    .log-table,
    .cuv-table,
    .drf-table,
    .detail-level-table,
    .sql-results-table {
        font-size: var(--font-size-xs);
    }
    .log-table th,
    .log-table td,
    .cuv-table th,
    .cuv-table td {
        padding-top: 0.35rem;
        padding-bottom: 0.35rem;
    }

    /* Pager rows: stack vertically when the prev / counter / next trio
       no longer fits on one line. Each child takes full width so the
       buttons are easy to tap. */
    .log-pager,
    .changes-pager-row {
        flex-direction: column;
        align-items: stretch;
    }
    .log-pager .button.small,
    .changes-pager-row .button.small {
        width: 100%;
    }

    /* Home Quick Actions: make each button full-width so users with
       large fingers don't mis-tap on a row of half-width pills. */
    .home-actions .button,
    .home-actions a.button {
        flex: 1 1 100%;
    }
}

/* ── Shopping List (ShoppingList.aspx) ─────────────────────────────────────
   Reuses .main-card, .pill, .checkbox, .button, .small-text, .text-muted.
   Only the magenta urgent treatment, the item→product tree layout, the
   product thumbnail, the pager, and the add-form rows are new here. */

/* Urgent: magenta pill + a magenta banner of urgent lines at the top. */
.pill.sl-urgent {
    background-color: #ff00ff;
    border-color: #ff00ff;
    color: #ffffff;
}
.pill.sl-pri-high {
    background-color: #ff0000;   /* 100% red */
    border-color: #ff0000;
    color: #ffffff;
}

/* Priority pill doubles as the press-and-hold (or focus + Enter/Space) target that
   opens the quick priority picker. Normal renders as a muted pill so every row carries
   a consistent target. touch-action:none keeps a long-press from starting a scroll. */
.sl-pri-pill { touch-action: none; white-space: nowrap; -webkit-touch-callout: none; text-transform: uppercase; }
.sl-pri-pill:focus-visible { outline: 2px solid var(--color-border-focus, #0090C8); outline-offset: 1px; }
/* Item name doubles as a hold / double-tap target that opens the edit card. Selection is
   disabled so a double-tap edits instead of selecting a word (and so a long-press isn't
   hijacked by the mobile text-selection UI); the ✎ button still handles plain clicks.
   touch-action is left default so a scroll started on the name still scrolls the page. */
.sl-row-name { cursor: pointer; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; }
.pill.sl-pri-normal {
    background-color: transparent;
    border-color: var(--color-border, #e0e0e0);
    color: var(--color-text-muted, #888);
}

/* SITE dark mode (the global [data-theme="dark"] toggle — NOT the per-list "Colors" option):
   priority pills become solid black with max-saturation COLORED text; the border follows the
   text color (currentColor) so each reads as an outlined neon badge. Only Urgent/High carry a
   saturated color in the app's palette (magenta / red) — Normal/Low/Idea have no saturated color
   so they keep neutral light/gray text on black. NOTE: .sl-pri-pill is the per-row PRIORITY badge
   and is unrelated to .sl-colors-standard/-warm/-none (the row-tint scheme). */
[data-theme="dark"] .pill.sl-pri-pill { background-color: #000000; border-color: currentColor; }
[data-theme="dark"] .pill.sl-pri-pill.sl-urgent   { color: #ff00ff; }   /* magenta */
[data-theme="dark"] .pill.sl-pri-pill.sl-pri-high { color: #ff0000; }   /* red */

/* Quick priority picker popover — appended to <body>, positioned by JS. */
.sl-pri-menu {
    position: absolute;
    z-index: 1000;
    min-width: 9.5rem;
    padding: 0.25rem;
    background: var(--color-bg-card, #ffffff);
    border: 1px solid var(--color-border, #e0e0e0);
    border-radius: var(--border-radius, 10px);
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
}
.sl-pri-menu-item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    width: 100%;
    text-align: left;
    padding: 0.45rem 0.6rem;
    background: none;
    border: none;
    border-radius: var(--border-radius-sm, 6px);
    cursor: pointer;
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text, #1a1f2e);
}
.sl-pri-menu-item:hover,
.sl-pri-menu-item:focus { background: var(--color-border, #eee); outline: none; }
.sl-pri-menu-item.is-current { font-weight: var(--font-weight-bold, 700); }
.sl-pri-swatch {
    flex: none;
    width: 0.9rem;
    height: 0.9rem;
    border-radius: 50%;
    border: 1px solid var(--color-border, #ccc);
}

/* "Colors:" option — scoped on the list wrapper (pnlList gets .sl-colors-<mode>);
   tints each ROW background by priority (sl-pri-0..4). "None" leaves rows on the
   default card background and keeps the colored priority pills. Standard's
   normal/low/idea stay on the default card bg, so they get no rule. */
/* Standard: magenta(urgent) → red(high); normal/low/idea stay on the default card bg. */
.sl-colors-standard .sl-row.sl-pri-4 { background-color: #ffabff; }   /* urgent */
.sl-colors-standard .sl-row.sl-pri-3 { background-color: #ffabab; }   /* high */

/* Warm heatmap: magenta → red → orange → amber → yellow (owner palette 2026-06-07).
   Saturated, so the SAME palette serves light and dark mode (no dark override);
   the dark-mode dark-text rules below keep text readable on these in both. */
.sl-colors-warm .sl-row.sl-pri-4 { background-color: #ff00ff; }   /* urgent */
.sl-colors-warm .sl-row.sl-pri-3 { background-color: #ff0000; }   /* high */
.sl-colors-warm .sl-row.sl-pri-2 { background-color: #ff5500; }   /* medium */
.sl-colors-warm .sl-row.sl-pri-1 { background-color: #ffaa00; }   /* low */
.sl-colors-warm .sl-row.sl-pri-0 { background-color: #ffff00; }   /* idea */

/* A crossed-off (purchased) row is never tinted, even with a Colors mode on. Declared
   after the priority rules so it wins on equal specificity. */
.sl-colors-standard .sl-row.sl-purchased,
.sl-colors-warm .sl-row.sl-purchased { background-color: var(--color-bg-card, #ffffff); }

/* ── Per-row save feedback (check/uncheck) ─────────────────────────────────
   Confirms the toggle actually persisted: a subtle dim while the save is in
   flight, then a one-shot green ring ("saved") or red ring ("didn't save").
   Uses an inset box-shadow ring so it reads on top of any priority tint. */
.sl-row.sl-saving { opacity: .55; transition: opacity .12s ease; }
.sl-row.sl-saved  { animation: slSavedPulse 1.4s ease; }
.sl-row.sl-saveerr { animation: slSaveErrPulse 1.4s ease; }
@keyframes slSavedPulse {
    0%   { box-shadow: inset 0 0 0 3px rgba(40, 167, 69, .95); background-color: rgba(40, 167, 69, .16); }
    65%  { box-shadow: inset 0 0 0 3px rgba(40, 167, 69, .95); background-color: rgba(40, 167, 69, .16); }
    100% { box-shadow: inset 0 0 0 3px rgba(40, 167, 69, 0); }
}
@keyframes slSaveErrPulse {
    0%   { box-shadow: inset 0 0 0 3px rgba(220, 53, 69, .95); background-color: rgba(220, 53, 69, .16); }
    65%  { box-shadow: inset 0 0 0 3px rgba(220, 53, 69, .95); background-color: rgba(220, 53, 69, .16); }
    100% { box-shadow: inset 0 0 0 3px rgba(220, 53, 69, 0); }
}
/* Reduced-motion users get a static ring (held for the same ~1.2s the JS keeps the
   class on) instead of the pulse, so the save confirmation is never invisible. */
@media (prefers-reduced-motion: reduce) {
    .sl-row.sl-saved  { animation: none; box-shadow: inset 0 0 0 3px rgba(40, 167, 69, .9); }
    .sl-row.sl-saveerr { animation: none; box-shadow: inset 0 0 0 3px rgba(220, 53, 69, .9); }
}

/* ── Offline: the queue and its banner (2026-08-17) ────────────────────────
   A line added with no connection. It sits at the top of the list because the
   server has not filed it under a sort or a store group yet, and the dashed
   edge says exactly that rather than letting it pass for a normal row that has
   inexplicably jumped the queue. NOT a warning color: nothing is wrong. */
/* --color-text-muted, not a literal: it is defined in BOTH themes, so the dashed edge
   follows dark mode. A var() whose token is declared nowhere silently paints its literal
   fallback in dark mode too, which is how a light-only color survives the theme switch. */
.sl-row.sl-row-pending {
    border-style: dashed;
    border-color: var(--color-text-muted);
}

.sl-offline-banner {
    display: flex;
    align-items: center;
    gap: .5rem;
    margin: .5rem 0;
    padding: .55rem .8rem;
    border-radius: 8px;
    background: #7c2d12;
    color: #fff;
    font-weight: 600;
}
.sl-offline-banner[hidden] { display: none; }

/* Sync Now, on the banner only while Work Offline is on with a queue.
   ⚠ .button is display:inline-flex, which OUTRANKS the [hidden] attribute's default
   display:none — without the rule below the button would sit there permanently, visible
   and meaningless. Same trap as any hidden .button on these sites. */
.sl-banner-sync[hidden] { display: none; }
/* .button.transparent paints itself primary-blue, close to unreadable on this dark-red
   fill. Three classes so it wins outright — styles_shared.css loads AFTER this file, so a
   tie would lose (the same correction the shared sheet already makes for
   .alert-panel .button.transparent). */
.sl-banner-sync.button.transparent {
    margin-left: auto;
    flex: 0 0 auto;
    color: #fff;
    border-color: rgba(255, 255, 255, .7);
}
.sl-banner-sync.button.transparent:hover,
.sl-banner-sync.button.transparent:focus-visible {
    background: rgba(255, 255, 255, .15);
    color: #fff;
    border-color: #fff;
}

/* Work Offline sits apart from the filters in the Options card — it is not one of them. */
.sl-options-offline {
    margin-top: .9rem;
    padding-top: .75rem;
    border-top: 1px solid var(--color-border);
}
.sl-options-offline .note { margin-top: .35rem; }

@media print { .sl-offline-banner { display: none !important; } }

/* ── Dark mode row tints ───────────────────────────────────────────────────
   Standard's light-mode pastels wash out on a dark canvas, so swap them for
   saturated equivalents (same priority→color mapping). Warm needs NO dark
   override — its palette is already saturated (one palette, both themes).
   NOTE: Standard low/idea get a dark gray here even though they're plain in
   light mode (per the original bfbfbf→404040 mapping). The bright tints get
   dark text for readability; the 404040 rows keep the default light text; and
   the purchased override is repeated last so crossed-off rows stay un-tinted
   in dark mode too. */
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-4 { background-color: #ff00ff; }   /* urgent */
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-3 { background-color: #ff0000; }   /* high */
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-1 { background-color: #404040; }   /* low */
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-0 { background-color: #404040; }   /* idea */

/* Bright tints need dark text in dark mode (skip the dark-gray 404040 low/idea rows, which
   keep the light text, and skip purchased rows, which aren't tinted). */
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-4:not(.sl-purchased),
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-3:not(.sl-purchased),
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-4:not(.sl-purchased),
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-3:not(.sl-purchased),
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-2:not(.sl-purchased),
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-1:not(.sl-purchased),
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-0:not(.sl-purchased) { color: #1a1a1a; }
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-4:not(.sl-purchased) .text-muted,
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-3:not(.sl-purchased) .text-muted,
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-4:not(.sl-purchased) .text-muted,
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-3:not(.sl-purchased) .text-muted,
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-2:not(.sl-purchased) .text-muted,
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-1:not(.sl-purchased) .text-muted,
[data-theme="dark"] .sl-colors-warm .sl-row.sl-pri-0:not(.sl-purchased) .text-muted { color: #1a1a1a; }

/* Product hyperlinks on a tinted row. The per-row "View ↗" links (.sl-prod-link) and the
   catalog suggestion links (.sl-row-products a) inherit the page cyan (--color-primary),
   which is unreadable on the bright priority tints — cyan on Warm's red/yellow is ~1.6:1.
   Mirror the dark-text override above: force these links (and the outline button's border)
   dark on every saturated/bright tint — Warm (all priorities, both themes) and Standard's
   urgent/high (pastel in light, magenta/red in dark). Standard's gray Low/Idea rows and
   untinted (Colors=None) rows keep the cyan link; purchased rows aren't tinted. */
.sl-colors-warm .sl-row:not(.sl-purchased) .sl-prod-link,
.sl-colors-warm .sl-row:not(.sl-purchased) .sl-row-products a,
.sl-colors-standard .sl-row.sl-pri-4:not(.sl-purchased) .sl-prod-link,
.sl-colors-standard .sl-row.sl-pri-4:not(.sl-purchased) .sl-row-products a,
.sl-colors-standard .sl-row.sl-pri-3:not(.sl-purchased) .sl-prod-link,
.sl-colors-standard .sl-row.sl-pri-3:not(.sl-purchased) .sl-row-products a { color: #1a1a1a; }
.sl-colors-warm .sl-row:not(.sl-purchased) .sl-prod-link,
.sl-colors-standard .sl-row.sl-pri-4:not(.sl-purchased) .sl-prod-link,
.sl-colors-standard .sl-row.sl-pri-3:not(.sl-purchased) .sl-prod-link { border-color: #1a1a1a; }

/* Store · Department line: black in SITE dark mode on EVERY row (per user, supersedes the
   earlier "keep light on dark rows" for this element specifically). On rows whose background
   stays dark (Normal priority, the 404040 Low/Idea, and Colors=None) black is low-contrast —
   lighten those row backgrounds if it needs to read better there.
   !important is REQUIRED: the meta carries Bootstrap's .text-muted, which is
   `color:#6c757d !important` — without !important here Bootstrap wins and the text stays gray
   no matter how specific this selector is. (This selector still outranks .text-muted on
   specificity, so among the !important rules ours wins.) */
[data-theme="dark"] .sl-prod-meta { color: #1a1a1a !important; }

[data-theme="dark"] .sl-colors-standard .sl-row.sl-purchased,
[data-theme="dark"] .sl-colors-warm .sl-row.sl-purchased { background-color: var(--color-bg-card, #1c1f24); }

.sl-urgent-banner {
    margin: 0.5rem 0 1rem;
    padding: 0.6rem 0.85rem;
    border: 1px solid #ff00ff;
    border-left: 4px solid #cc00cc;
    border-radius: var(--border-radius, 10px);
    background: #ff00ff;
    color: #ffffff;
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.45;
}
.sl-urgent-banner-label { font-weight: var(--font-weight-bold, 700); }
.sl-urgent-more { color: rgba(255, 255, 255, 0.85); }
/* Dark mode: black reads better than white on the magenta banner (light mode keeps white). */
[data-theme="dark"] .sl-urgent-banner { color: #000000; }
[data-theme="dark"] .sl-urgent-more { color: rgba(0, 0, 0, 0.85); }

/* Duplicate-row badge: "⇆ 2 stores" on a line that is rendered once per store in a
   store-grouped list. Neutral/outlined rather than another color fill — every priority
   already owns a fill here, and this badge has to sit legibly on ALL of them (including
   the magenta urgent row and Warm's red/yellow), so it borrows the row's own text color
   via currentColor instead of asserting one. */
.sl-row-dupes {
    background: transparent;
    border: 1px solid currentColor;
    color: inherit;
    font-weight: var(--font-weight-medium, 500);
    opacity: 0.85;
    white-space: nowrap;
}

/* Each name is a jump control (a <button class="link">, because there is no URL — it is
   an in-page action). It must NOT take .link's blue: the banner is magenta, and blue on
   magenta is unreadable. Inherit the banner's own color and carry the affordance on the
   underline + weight instead, which also keeps it distinguishable without relying on
   color alone. Everything else about .link (padding, background, border) is unwound. */
.sl-urgent-banner .sl-urgent-jump {
    color: inherit;
    background: none;
    border: 0;
    padding: 0;
    margin: 0;
    font: inherit;
    font-weight: var(--font-weight-bold, 700);
    text-decoration: underline;
    text-underline-offset: 2px;
    cursor: pointer;
}
.sl-urgent-banner .sl-urgent-jump:hover { text-decoration-thickness: 2px; }
.sl-urgent-banner .sl-urgent-jump:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 2px;
    border-radius: 2px;
}

/* The landing flash on a jumped-to row. Color is a reinforcement only — the row is also
   scrolled to the center of the viewport, which is the primary signal. Honors
   prefers-reduced-motion by holding a static ring instead of animating.

   ⚠ CYAN, NOT MAGENTA. The banner only ever links URGENT items, and an urgent row is
   ALREADY filled magenta (.sl-pri-4) — a magenta ring on a magenta row is invisible,
   which is what the first version shipped. Cyan is magenta's complement, is not used by
   any priority fill, and reads on both the light and dark page background.

   ⚠ An INSET box-shadow ring, exactly like .sl-row.sl-saved above — not `outline`, and
   not an outset shadow. Both of those were tried and measured on a real row: `outline`
   came back #1a1a1a (the priority-color blocks already declare outline longhands on
   these rows, so the ring's COLOR lost while its width won), and an outset ring composes
   with the card's own --shadow-sm. The save-feedback ring right above solved the same
   problem on the same element with `inset`, and its comment says why: it "reads on top of
   any priority tint". Same reason applies here — the banner only ever links URGENT items,
   which are magenta-filled. */
.sl-row.sl-jump-target { box-shadow: inset 0 0 0 3px rgba(0, 229, 255, 1); }
@media (prefers-reduced-motion: no-preference) {
    .sl-row.sl-jump-target { animation: slJumpFlash 2.4s ease-out 1; }
}
@keyframes slJumpFlash {
    0%, 55% { box-shadow: inset 0 0 0 3px rgba(0, 229, 255, 1); }
    100%    { box-shadow: inset 0 0 0 3px rgba(0, 229, 255, 0); }
}

/* Item (group) block. */
.sl-item.main-card { padding: 0.6rem 0.85rem; margin-bottom: 0.5rem; }
.sl-item-header { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
.sl-item-name { font-weight: var(--font-weight-medium, 500); }
.sl-buyqty { background: var(--color-info-bg, #e1f5fe); color: var(--color-info, #0277bd); border-color: transparent; }

/* Expand / collapse caret. */
.sl-expand {
    background: none; border: none; cursor: pointer; padding: 0 0.15rem;
    font-size: var(--font-size-sm, 0.875rem); line-height: 1; color: var(--color-text-muted, #666);
    transition: transform var(--transition-fast, 0.15s ease);
}

/* Struck-through (purchased) line. */
.sl-struck { text-decoration: line-through; color: var(--color-text-muted, #888); }

/* "Undo" action in the delete toast — kept on the LEFT, away from the × dismiss button,
   so closing the toast can't accidentally trigger an undo. */
.sl-undo-link { font-weight: var(--font-weight-bold, 700); margin-right: 0.6rem; }

/* Right-aligned row actions. */
.sl-row-actions { margin-left: auto; display: inline-flex; align-items: center; gap: 0.35rem; }

/* Trash + edit icons: solid black (were too faint on white). */
.sl-del {
    background: none; border: none; cursor: pointer; line-height: 1;
    font-size: 1rem; padding: 0.2rem 0.45rem; border-radius: var(--border-radius-sm, 6px);
    color: #000000;
}
.sl-del:hover, .sl-del:focus { background: var(--color-danger-bg, #fdecea); }

/* Products nested under an item. */
.sl-products { padding-left: 1.6rem; border-left: 2px solid var(--color-border, #e0e0e0); margin: 0.4rem 0 0.1rem 0.4rem; }
.sl-product { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; padding: 0.35rem 0; border-top: 1px solid var(--color-border, #eee); }
.sl-product:first-child { border-top: none; }
.sl-prod-img { width: 56px; height: 56px; object-fit: contain; border: 1px solid var(--color-border, #e0e0e0); border-radius: var(--border-radius-sm, 6px); background: #fff; }
.sl-prod-name { font-weight: var(--font-weight-medium, 500); }
.sl-prod-meta { white-space: nowrap; }

/* Pager. */
/* Pager uses the shared .pager-inline class (single line at every breakpoint). */

/* FTC affiliate disclosure footer. */
.sl-disclosure { margin-top: 0.75rem; }

/* Multi-store filter container — lays out either toggle pills (.pill[aria-pressed], filled via the
   shared rule) or checkbox labels (.sl-store-check). None selected = all stores. */
.sl-store-pills { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem 0.85rem; max-height: 11rem; overflow-y: auto; }
.sl-store-check { display: inline-flex; align-items: center; gap: 0.35rem; cursor: pointer; }
/* Per-store still-to-buy count inside a pill/label — quieter than the store name, and
   color: inherit keeps it readable on the filled (selected) pill too. */
.sl-store-count { opacity: 0.7; font-weight: var(--font-weight-normal, 400); font-size: 0.92em; }
/* .pill is inline-flex, which IGNORES the whitespace text node between the store name
   and the count span — so the markup's literal space never renders ("Grocery(3)").
   Re-create the gap with a margin. Scoped to .pill: the checkbox variant
   (.sl-store-check) already spaces its children with flex gap. */
.pill .sl-store-count { margin-left: 0.35em; }
/* "Store or List:" heading row — label on the left, "× Deselect All" pushed to the right. */
.sl-store-head { display: flex; align-items: baseline; justify-content: space-between; gap: 0.5rem; }
/* "× Deselect All" — link-styled, right-aligned next to the heading; [hidden] (no selection)
   must still hide it inside the flex container. */
.sl-store-clear { font-size: var(--font-size-sm, 0.875rem); white-space: nowrap; }
.sl-store-clear[hidden] { display: none; }

/* The item-name box in the Add/Edit card is a 2-row textarea (long Amazon names). The shared
   textarea.textbox rule forces min-height ≈ 2.5 lines, which overrode rows="2" and made it look
   ~3 lines tall. Drop the floor to a single line so the rows="2" attribute governs (exactly 2 lines);
   resize: vertical still lets the user drag it taller. */
textarea.sl-add-name { resize: vertical; min-height: var(--input-height, 2.5rem); }

/* Live "Search Amazon" fallback card (shown when a search has no local catalog match). */
.sl-amazon-fallback .button { margin-top: 0.25rem; }
.sl-amazon-results { margin-top: 0.5rem; }
/* Lighter "not seeing it?" variant appended BELOW the catalog card when there ARE local results. */
.sl-amazon-more { margin-top: 0.75rem; text-align: center; }

/* Add item / product card. */
.sl-add-row { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 0.5rem; }
/* Store/Department clear-× wrappers: each bare .textbox was width:100% (one per row);
   the .input-clearable wrapper is the flex child now, so it must carry that sizing. */
.sl-add-row .input-clearable { flex: 1 1 100%; }
/* ── Store chips (multi-store tagging) ────────────────────────────────────────
   The Store field holds several stores, each a removable chip, with a borderless
   box on the end to type the next one. The wrapper is still an .input-clearable
   (so site.js wires the × and the shared positioning applies) but has to LOOK like
   the .textbox it replaced — hence the border/background/radius here rather than
   on the inner input, which is deliberately invisible. */
.sl-chipbox {
    flex-wrap: wrap;
    gap: 0.3rem;
    min-height: var(--input-height, 2.5rem);
    padding: 0.25rem 1.9rem 0.25rem 0.5rem;   /* right pad keeps chips clear of the × */
    /* Same tokens .textbox uses in styles_shared.css, so the chip box is visually the
       field it replaced. Copied deliberately: .textbox itself sets a fixed height and
       display:block, both of which this control has to override anyway. */
    border: 1px solid var(--color-border, #e0e0e0);
    border-radius: var(--border-radius-sm, 6px);
    background-color: var(--color-bg-input, #ffffff);
    color: var(--color-text, #1a1f2e);
    cursor: text;
}
/* Mirrors .textbox:focus — the ring belongs on the whole box, not the invisible input. */
.sl-chipbox:focus-within {
    border-color: var(--color-border-focus, var(--color-primary, #0090C8));
    box-shadow: var(--shadow-focus, 0 0 0 3px rgba(0, 176, 240, 0.22));
}
/* The chip list is a plain inline wrapper — the chips themselves are the flex items,
   so they wrap alongside the input rather than being trapped on their own line. */
.sl-chip-list { display: contents; }
.sl-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    max-width: 100%;
}
.sl-chip-x {
    background: none;
    border: none;
    padding: 0 0 0 0.1rem;
    margin: 0;
    color: inherit;
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
    opacity: 0.75;
}
.sl-chip-x:hover, .sl-chip-x:focus { opacity: 1; }
/* Invisible field: the chip box draws the border, so a second one here would double it. */
.sl-chip-input {
    flex: 1 1 8rem;
    min-width: 6rem;
    border: none;
    outline: none;
    background: transparent;
    color: inherit;
    font-family: inherit;
    font-size: max(16px, var(--font-size-base, 1rem));   /* 16px floor stops iOS auto-zoom */
    padding: 0.15rem 0;
    min-height: 1.6rem;
}
.sl-chip-input:disabled { background: transparent; cursor: default; }
/* Full-width hint under the store box (the row is a wrapping flex container). */
.sl-add-row .sl-store-hint { flex: 1 1 100%; margin: -0.15rem 0 0.2rem; }

.sl-add-label { min-width: 4.5rem; }
.sl-add-name { flex: 1 1 14rem; }
.sl-priority-select { flex: 0 0 auto; width: auto; }

/* ── "Already on your list" typeahead, under the item-name box in the Add card ──────
   Sits between the name row and the Store row and pushes them apart when it appears —
   deliberately in the flow rather than an absolutely-positioned dropdown: .sl-edit-body
   is the scroll container, so a floating panel would be clipped by its own parent on a
   short viewport, which is exactly where the card is tallest. Hidden until it has
   something to say (the element carries [hidden]; styles_shared.css enforces that). */
.sl-name-matches {
    margin: -0.25rem 0 0.6rem;
    padding: 0.4rem 0.5rem 0.5rem;
    border: 1px solid var(--color-border, #b6cede);
    border-radius: var(--border-radius-sm, 6px);
    /* --color-surface-muted, not --color-bg-input: this is a panel, and it has to sit one
       step BEHIND the white match buttons in both themes (#f8f9fa / #3d3d3d). */
    background-color: var(--color-surface-muted, #f8f9fa);
}
/* Capped and self-scrolling. A full eight matches runs to ~24rem, which pushes Store,
   Department and Notes off the bottom of the card — and the card is still an ADD form, not
   a picker: whoever ignores the suggestions has to be able to reach the rest of it. */
.sl-name-match-list {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    max-height: 12rem;
    overflow-y: auto;
}
/* Each match is a real <button> so it is tabbable and fires on Enter/Space — this is the
   control that un-checks a line, not a decorative row. */
.sl-name-match {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.25rem 0.5rem;
    width: 100%;
    text-align: left;
    padding: 0.35rem 0.5rem;
    border: 1px solid var(--color-border, #b6cede);
    border-radius: var(--border-radius-sm, 6px);
    background-color: var(--color-bg-card, #ffffff);
    color: var(--color-text, #1a1f2e);
    font: inherit;
    cursor: pointer;
}
.sl-name-match:hover { border-color: var(--color-primary, #0090C8); }
.sl-name-match:focus-visible {
    outline: none;
    border-color: var(--color-border-focus, var(--color-primary, #0090C8));
    box-shadow: var(--shadow-focus, 0 0 0 3px rgba(0, 176, 240, 0.22));
}
.sl-name-match-title { font-weight: var(--font-weight-bold, 600); }
/* The tag is the whole point of the row — it says whether picking this is a re-add or a
   duplicate warning — so it keeps full contrast while the store/department dims. */
.sl-name-match-tag { font-size: var(--font-size-sm, 0.875rem); white-space: nowrap; }
.sl-name-match-bought .sl-name-match-tag { color: var(--color-primary, #0090C8); }
.sl-name-match-meta {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted, #6b7280);
    margin-left: auto;                 /* pushed right; wraps under on a narrow card */
}
.sl-prod-target { margin: 0 0 0.5rem; }
.sl-prod-url { display: block; width: 100%; margin-bottom: 0.4rem; }
/* Edit card rendered as a centered modal (reuses .modal-overlay/.modal-box). The title and
   footer stay pinned while .sl-edit-body scrolls — so a tall form (many links) never hides
   the Save/Delete buttons, and the capped height keeps it within the viewport. */
.modal-box.sl-edit-box {
    max-width: 560px;
    display: flex;
    flex-direction: column;
    max-height: calc(100vh - 2rem);
    max-height: calc(100dvh - 2rem);   /* dvh tracks the mobile toolbar; vh is the fallback */
}
.sl-edit-box .modal-title { flex: 0 0 auto; }
.sl-edit-body {
    flex: 1 1 auto;
    min-height: 0;                     /* let the body shrink + scroll inside the capped box (flex gotcha) */
    overflow-y: auto;
    padding: 0.35rem 0.25rem;          /* room so focus rings aren't clipped at the scroll edge */
}
/* Compound selector (.modal-footer.sl-edit-footer) is deliberate: the element carries both
   classes, and styles_shared.css's `.modal-footer { display:flex; justify-content:flex-end }`
   loads AFTER this file in the bundle. A bare `.sl-edit-footer` (equal specificity) would lose
   the cascade. The extra class wins by specificity so this layout sticks. */
.modal-footer.sl-edit-footer {
    flex: 0 0 auto;
    margin-top: 0.85rem;
    padding-top: 0.85rem;
    border-top: 1px solid var(--color-border, #e0e0e0);
    /* Buttons: Delete (far left) · + Link (just right of Delete) · Save (far right) — no centering.
       `order` rearranges the DOM order (which is Save, + Link, Delete); margin-left:auto on Save
       eats the free space so it sits flush right while Delete + Link stay grouped at the left. */
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-start;
    align-items: center;
    gap: 0.5rem;
}
.sl-edit-footer #sl-delete-btn { order: 1; }
.sl-edit-footer .sl-link-btn   { order: 2; margin-left: 0; }
.sl-edit-footer #sl-add-btn    { order: 3; margin-left: auto; }
/* Inline status/validation message drops to its own full-width row beneath the buttons;
   collapses entirely when empty so it adds no gap in the common case. */
.sl-edit-footer .sl-add-msg       { order: 4; flex-basis: 100%; text-align: center; }
.sl-edit-footer .sl-add-msg:empty { display: none; }
.sl-add-close { position: absolute; top: 0.5rem; right: 0.5rem; }
/* Top-right close affordance for the Options & Filters card. Pinned to the card's
   top-right corner so it sits on the same line as the first row's "Store or List:"
   label instead of taking its own row. Kept OUTSIDE the store-filter panel (absolute,
   not in .sl-store-head) so it stays visible even when that panel is hidden — i.e.
   before any store exists. The × lands on the label line, where the right column only
   holds a short label, so it doesn't overlap a control. */
#pnlControls { position: relative; }
.sl-options-topbar { position: absolute; top: var(--card-padding, 1rem); right: var(--card-padding, 1rem); margin: 0; z-index: 1; }
/* Make the close (×) read as a real button rather than a faint glyph: filled blue
   like a primary .button, white ×, rounded, with hover/active feedback. Scoped to the
   topbar so other .tip-icon-button uses (tips close, file-remove) stay transparent. */
.sl-options-topbar .tip-icon-button {
    min-width: 2.5rem; min-height: 2.5rem;
    color: #fff;
    background-color: var(--color-primary, #0090C8);
    border-radius: var(--btn-radius, 6px);
    box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.15));
    font-weight: 700;
}
.sl-options-topbar .tip-icon-button:hover {
    color: #fff;
    background-color: var(--color-primary-dark, #005a80);
}
.sl-options-topbar .tip-icon-button:active { box-shadow: var(--shadow-btn-active, inset 0 2px 4px rgba(0, 0, 0, 0.10)); }
/* Below 768px the store-filter panel spans the full card width, so its right-aligned
   "× Deselect All" would run under the pinned close ×. Reserve room for the 2.75rem
   icon button so the two never collide. (At ≥768px the panel sits in a half-width
   column, far from the corner, so no reservation is needed.) */
@media (max-width: 767px) { .sl-store-head { padding-right: 3rem; } }
/* ShoppingList action bar (Email…Uncheck All…Close): a compact 2-column grid at every
   width instead of one long row of full-size buttons. Smaller (.button.small sizing) so
   the two columns stay tidy; each button fills its cell, a lone last button stays at 50%.
   Compound selector (.form-actions.sl-actions) + the child's 3-class selector outspecify
   the shared .form-actions rules (incl. the ≤767px stack) even though PLP styles load
   before the shared sheet. Hidden buttons (Export CSV / Share) take no grid cell. */
.form-actions.sl-actions {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.5rem;
}
.form-actions.sl-actions > [class*="button"] {
    width: auto;
    min-width: 0;
}
/* Delete (danger) and Close (primary) span the full card width on their own rows,
   as before; the transparent utility buttons (Email…Uncheck All) stay two-up. All
   buttons keep their normal text size. */
.form-actions.sl-actions > .button:not(.transparent) {
    grid-column: 1 / -1;
}
/* "✓ Apply" + its "● Not applied yet" marker sit on their own line ABOVE the grid above,
   so Apply keeps its natural width and the marker sits beside it rather than becoming a
   stretched grid cell. Margin-bottom separates the two rows (the grid's own gap does not
   reach across). */
.form-actions.sl-apply-row { margin-bottom: 0.6rem; }
.sl-add-msg.is-error   { color: var(--color-danger, #b00020); }
.sl-add-msg.is-success { color: var(--color-success, #2e7d32); }
/* "Added <date>" line at the foot of the edit body (shown in edit mode only). */
.sl-edit-dateadded { margin-top: 0.5rem; }

/* Floating "+" FAB — opens the Add Item card (created by shoppinglist-page.js). Styled to
   match the shared .back-to-top scroll-to-top button (same size, shape, accent fill, shadow)
   but always visible, and pinned to the bottom-right corner. The scroll-to-top button stacks
   directly above it via the page-scoped overrides below. */
.sl-add-fab {
    position: fixed;
    right: 1rem;
    bottom: 1rem;
    width: 2.85rem;
    height: 2.85rem;
    border-radius: 50%;
    border: none;
    background: var(--color-accent);
    color: #fff;
    font-size: 1.9rem;
    line-height: 1;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: var(--shadow-lg);
    opacity: 0.92;
    transition:
        background-color 0.15s,
        box-shadow 0.15s,
        transform 0.25s var(--ease-out-quint);
    z-index: 9998;
}
.sl-add-fab:hover {
    opacity: 1;
    background: var(--color-accent-dark);
    box-shadow: var(--shadow-xl);
    transform: translateY(-2px);
}
.sl-add-fab:focus-visible {
    opacity: 1;
    outline: none;
    box-shadow: var(--shadow-lg), var(--shadow-focus-ring);
}
/* On the shopping list page the corner buttons stack above the Add FAB so they never overlap:
   the scroll-to-top button sits one slot up, and the PWA-install pill (rare) one slot higher.
   ⚠ Since PR-10 the pill is a button INSIDE a fixed .pwa-install-wrap and is itself
   position:static, so a `bottom` on the button alone is inert and the pill would drop back
   onto the Add FAB. The wrapper reads its offset from --pwa-install-bottom (declared in
   styles_shared.css), so set the variable here rather than adding a second rule that would
   have to out-specify the wrapper's own `bottom`. The bare-button line stays for the pill's
   pre-wrapper form. shoppinglist-page.js puts .sl-shopping-page on <body>, which is the
   element the variable has to land on for it to inherit down to the wrapper. */
.sl-shopping-page .back-to-top     { bottom: 4.25rem; }
.sl-shopping-page .pwa-install-btn { bottom: 7.5rem; }
.sl-shopping-page                  { --pwa-install-bottom: 7.5rem; }
@media print { .sl-add-fab { display: none !important; } }

/* "Add from catalog" search results — matching plp_Items (all detail levels) the
   user can add to their list in one click. Each row: item name left, Add button right. */
.sl-catalog-row { display: flex; align-items: center; gap: 0.5rem; padding: 0.4rem 0; border-top: 1px solid var(--color-border); }
.sl-catalog-row:first-of-type { border-top: none; }
.sl-catalog-name { flex: 1 1 auto; min-width: 0; }

/* Flat list rows — one self-contained line each (replaces the old item/product tree). */
.sl-row.main-card { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; padding: 0.55rem 0.8rem; margin-bottom: 0.4rem; }
/* Group headers shown when the primary sort is Store/Department — mirrors the sections
   the print/email/copy artifacts produce. */
.sl-group-heading { margin: 1rem 0 0.4rem; font-size: 1.05rem; }
.sl-group-heading:first-child { margin-top: 0.25rem; }
.sl-row-name { font-weight: var(--font-weight-medium, 500); }
.sl-row .sl-row-actions { margin-left: auto; }
.sl-edit { background: none; border: none; cursor: pointer; line-height: 1; font-size: 1rem; padding: 0.2rem 0.45rem; border-radius: var(--border-radius-sm, 6px); color: #000000; }
.sl-edit:hover, .sl-edit:focus { background: var(--color-border, #eee); }
/* Dark mode: the hardcoded black ✎ (and the 🗑 on platforms that render it as a text glyph)
   vanished on un-tinted rows. Inherit the row's computed color instead — light text on dark
   rows, the dark #1a1a1a on the bright urgent/high tints. */
[data-theme="dark"] .sl-edit,
[data-theme="dark"] .sl-del { color: inherit; }
.sl-row-notes { flex-basis: 100%; width: 100%; margin-top: 0.15rem; }
.sl-prod-notes { width: 100%; resize: vertical; }

/* ── Check-off consequences (shoppinglist-page.js) ─────────────────────────
   .sl-buy-note  — "Also clears Buy for this item on N other trips." Checking a trip line
                   off clears that item's Buy flag on every trip that wanted it, which
                   happens entirely off this page. flex-basis:100% because .sl-row is a
                   flex row — same trick as .sl-row-notes above.
   .sl-moved-stub — takes a hidden row's place when Purchased Items is on Hide, so the line
                   doesn't just evaporate. Deliberately quiet and dashed: it's a gap where
                   something was, not a new item.

   ⚠ .sl-buy-note deliberately sets NO color. It lives inside .sl-row, which the Colors
   option tints per priority (and which dark mode then forces to #1a1a1a on the bright
   tints) — any color picked here would be unreadable on one tint or another. It inherits
   the row's color and earns its emphasis from the ⚠ glyph and the weight instead. */
.sl-buy-note {
    flex-basis: 100%; width: 100%; margin-top: 0.2rem;
    font-weight: var(--font-weight-medium, 500);
}
.sl-buy-note::before { content: "\26A0  "; }
.sl-moved-stub {
    display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem;
    border-style: dashed; background: none;
    color: var(--color-text-muted, #888);
}
.sl-moved-line { flex-basis: 100%; width: 100%; }
/* The "show" link sits inside a sentence — keep it inline, not a block-level button. */
.sl-moved-show { background: none; border: none; padding: 0; font: inherit; cursor: pointer; }
.sl-moved-stub .sl-buy-note { margin-top: 0.1rem; }
@media print { .sl-moved-stub { display: none !important; } }

/* Product rows — thumbnail | info | "+" Add button pushed right. ONE renderer
   (ShoppingListHelper.AppendProductRows) feeds the ShoppingList search card, the
   per-row suggestions under list lines, AND Packlist/Quicklist's per-item products.
   The image slot is a fixed 56px on every row (even with no image) so names line up,
   flush left (no row padding) — mobile width is tight, don't waste it. */
.sl-cat-prod { display: flex; align-items: center; gap: 0.5rem; }
.plp-product-row.sl-cat-prod { padding-left: 0; }
/* The client-side pager (and the per-row "Show More..." extras) hide rows via [hidden] —
   the class's display:flex would otherwise outrank the UA's [hidden] rule and the rows
   would never disappear. */
.sl-cat-prod[hidden] { display: none; }
.sl-cat-prod-img { flex: 0 0 56px; display: flex; align-items: center; justify-content: center; }
.sl-cat-prod-main { flex: 1 1 auto; min-width: 0; }
.sl-cat-prod .plp-add-to-sl { flex: none; white-space: nowrap; }

/* Per-row product suggestions under a list line — the same green .plp-products block as
   Packlist's Buy-flagged items (top 3 by rating visible; "Show More..." reveals up to 10).
   Full-width block inside the flex row card; no indent (see above — mobile space). */
.sl-row-products { flex-basis: 100%; width: 100%; margin-top: 0.3rem; padding-left: 0; }
/* Align the "Show More..."/"Show Less..." link with the flush-left product rows. */
.sl-row-products .plp-product-more { padding-left: 0; }
/* Checked off → nothing left to buy. The server skips purchased rows; this also hides the
   block instantly on a live client-side check-off (before the list refresh lands). */
.sl-purchased .sl-row-products { display: none; }
/* A take-to-store printout doesn't need suggestion noise. */
@media print { .sl-row-products { display: none !important; } }
/* Inline confirmation that replaces an "Add to Shopping List" button after a successful add. */
.plp-sl-added { display: inline-flex; align-items: center; gap: 0.35rem; color: var(--color-success); font-weight: var(--font-weight-medium); white-space: nowrap; }

@media (max-width: 575px) {
    .sl-add-name, .sl-priority-select { flex: 1 1 100%; width: 100%; }
}

/* §11 touch targets: the check-off box is this page's primary control (used one-handed,
   in a store) — on coarse pointers grow it past the shared 1.125rem default and pad the
   ✎/🗑 icon buttons toward the ~44px guideline without changing the desktop look. */
@media (pointer: coarse) {
    .sl-cb { width: 1.5rem; height: 1.5rem; min-width: 1.5rem; }
    .sl-edit, .sl-del { padding: 0.55rem 0.6rem; font-size: var(--font-size-lg, 1.125rem); }
}

/* ── Donate page ────────────────────────────────────────────────
   Each donation method is a self-contained row: brand icon + name on
   the left, a wrappable URL display in the middle, and the action
   buttons (Donate + Copy link) on the right. Stacks vertically on
   narrow screens so the buttons stay full-width and tappable. */
.donate-method {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    padding: 0.5rem 0;
}
.donate-method + .donate-method { border-top: 1px solid var(--color-border); margin-top: 0.75rem; padding-top: 1rem; }
.donate-method-icon {
    flex: 0 0 2.5rem;
    width: 2.5rem;
    height: 2.5rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--color-accent-bg, var(--color-info-bg));
    color: var(--color-accent);
    font-size: 1.25rem;
    line-height: 1;
    font-weight: var(--font-weight-medium, 500);
}
.donate-method-body {
    flex: 1 1 14rem;
    min-width: 0;
}
.donate-method-name { margin: 0; font-weight: var(--font-weight-medium, 500); }
.donate-method-url {
    display: block;
    margin-top: 0.15rem;
    word-break: break-all;
    overflow-wrap: anywhere;
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}
.donate-method-actions {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
    margin-left: auto;
}
.donate-method-actions .button { white-space: nowrap; }
.donate-support-list {
    margin: 0.5rem 0 0 1.25rem;
    padding: 0;
}
.donate-support-list li { margin: 0.15rem 0; }

@media (max-width: 575px) {
    .donate-method-actions { width: 100%; margin-left: 0; }
    .donate-method-actions .button { flex: 1 1 auto; }
}

/* ── Bulk actions toolbar ───────────────────────────────────────
   Used on list pages (Notes, Expenses, Itinerary) for multi-select +
   batch delete. The bar sits above the list and only reveals its
   action buttons once the user has selected at least one row. */
.plp-bulk-bar {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin: 0 0 0.5rem;
    padding: 0.4rem 0.6rem;
    border: 1px dashed var(--color-border, #d0d0d0);
    border-radius: 0.4rem;
    background: var(--color-surface-alt, transparent);
    font-size: var(--font-size-sm);
}
.plp-bulk-bar-count {
    color: var(--color-text-muted);
    flex: 1 1 auto;
    min-width: 0;
}
.plp-bulk-bar-actions {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
    margin-left: auto;
}
.plp-bulk-bar-actions[hidden] { display: none; }

/* Per-row select checkbox. Sits as an inline label inside each list
   row; click on the checkbox itself must NOT trigger the row's
   row-edit click handler (page JS calls stopPropagation). */
.plp-bulk-row-check {
    display: inline-flex;
    align-items: center;
    margin-right: 0.5rem;
    vertical-align: middle;
}
.plp-bulk-row-check input[type="checkbox"] {
    width: 1.1rem;
    height: 1.1rem;
    cursor: pointer;
}

/* Visual emphasis on rows the user has selected for the batch. Pairs
   with the existing .selected/.note-item.selected styles — uses a
   left-edge accent rather than recoloring the whole row so it composes
   with the per-row selected state used for "currently editing". */
.plp-bulk-selected {
    box-shadow: inset 3px 0 0 0 var(--color-primary, #00B0F0);
}

/* Audit / "last updated" metadata line. Used by BasePage.BuildAuditMetaHtml
   so trip rows, Edit pages, etc. all render the same compact "Added X ago
   by Y · Updated Z ago" line. Sized to sit quietly beneath the primary
   content of a row/card. The <time data-relative> inside is rewritten
   client-side by site.js → initRelativeTimes(). */
.plp-audit-meta {
    display: block;
    font-size: var(--font-size-xs, 0.75rem);
    line-height: 1.3;
    color: var(--color-text-muted, #777);
    margin-top: 0.25rem;
}
.plp-audit-meta time {
    color: inherit;
}
.trip-item-audit {
    /* Lighter than .trip-item-counts so it doesn't fight the counts for
       attention; sits on its own line at the bottom of each trip row. */
    display: block;
    font-size: var(--font-size-xs, 0.75rem);
    color: var(--color-text-muted, #888);
    margin-top: 0.15rem;
}
/* "🔗 Shared" badge on trips linked to a shared group. Sits on its own line
   between the counts and the audit line; uses the shared .pill.small look but
   tinted to read as a status marker rather than a category tag. */
.trip-item-shared {
    display: inline-block;
    margin-top: 0.25rem;
    font-size: var(--font-size-xs, 0.75rem);
    background: var(--color-info-bg, rgba(13, 110, 253, 0.12));
    color: var(--color-primary, #0d6efd);
    border: none;
}

/* ── Accessibility helpers ──────────────────────────────────────
   A11y improvements applied site-wide. These run AFTER bootstrap and
   the page's main styles.css block but BEFORE Shared/styles_shared.css
   in bundle order, so shared rules can still override at equal specificity. */

/* .linklike-btn migrated to Shared/styles_shared.css (2026-06-07) — all 3
   sites' footers now use it. */

/* Site-wide :focus-visible fallback for interactive elements that don't
   already define one. Higher specificity (using attribute selectors)
   so it sticks even when shared/bootstrap defines a generic :focus.
   Uses outline rather than border so layout isn't shifted on focus. */
a[href]:focus-visible,
button:focus-visible,
[role="button"]:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:not([tabindex="-1"]):focus-visible {
    outline: 2px solid var(--color-border-focus, #0090C8);
    outline-offset: 2px;
    border-radius: 2px;
}

/* Skip link: visible when keyboard-focused so screen-reader / keyboard
   users can jump past the nav. Defined here as a fallback in case the
   shared stylesheet's .skip-link rule is absent or overridden — never
   negative-positions it permanently. */
.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 9999;
    padding: 0.5rem 1rem;
    background: var(--color-primary, #00B0F0);
    color: #fff;
    font-weight: 600;
    text-decoration: none;
    border-radius: 0 0 4px 0;
}
.skip-link:focus,
.skip-link:focus-visible {
    left: 0;
    outline: 2px solid #fff;
    outline-offset: -4px;
}

/* ── PLP mobile usability — additional polish ──────────────────────
   Targeted additions layered on top of the existing responsive rules
   above. Each block notes WHICH mobile pain it addresses so a future
   reader can confirm a fix is still load-bearing. Scoped to PLP markup
   or via narrow @media queries so they don't change desktop. */

/* Body-level horizontal-overflow guard. A long product title, log message,
   or trip-link code accidentally widened the viewport on Android Chrome and
   forced a horizontal-scrollbar on the whole page. overflow-x: hidden on the
   root prevents that without affecting elements that intentionally scroll
   horizontally inside their own wrappers (.table-responsive, .td-weather-days).

   CLIP, NOT HIDDEN (changed 2026-08-11). overflow-x:hidden was silently costing
   the whole site its sticky positioning: per spec, hidden on one axis forces the
   other to auto, which made html/body SCROLL CONTAINERS - and a position:sticky
   element only sticks inside its scroll container, so .site-nav's own
   "position:sticky; top:0" was doing nothing on every page. Measured before the
   change: scrollY 800 with the nav's own top at -800, i.e. scrolled clean off.
   overflow-x:clip clips exactly the same content but does NOT create a scroll
   container, so the guard below keeps working and sticky comes back. The hidden
   line stays first as the fallback for browsers that predate clip (< Safari 16);
   they ignore the clip declaration and are no worse off than before. */
html, body {
    overflow-x: hidden;
    overflow-x: clip;
}

/* ── Tap targets on touch devices ──────────────────────────────────
   Apple HIG / WCAG AAA target 44px on the dominant axis for tap reliability.
   Several small icon-only controls (ⓘ, ×, kebab) default to ~24-28px which
   misfires often on phone-sized fingers. Bump only on coarse pointers so the
   desktop mouse experience stays tight. */
@media (pointer: coarse) {
    .tip-icon-button {
        min-width: 44px;
        min-height: 44px;
        padding: 0.4rem;
    }
    .tips-close {
        min-width: 40px;
        min-height: 40px;
        padding: 0.35rem;
    }
    .input-clear-btn {
        min-width: 40px;
        min-height: 40px;
    }
    .plp-qty-btn {
        width: 32px;
        height: 32px;
    }
    .plp-more-btn {
        min-height: 40px;
        min-width: 36px;
    }
    .plp-cb-label {
        min-width: 44px;
    }
    /* ⚠ Compact mode was silently escaping both rules above. The compact overrides
       up at the top of this file are `.plp-checklist.plp-compact .plp-more-btn`
       and `... .plp-cb-label` — specificity (0,3,0) against the bare (0,1,0)
       selectors here, so they win regardless of source order and the kebab stayed
       at 30px min-height and the SEL/PKD captions at 32px on a phone. Restate at
       matching specificity so the coarse-pointer floor actually applies. Compact
       still gets its narrower padding and font-size; only the hit-box floor moves. */
    .plp-checklist.plp-compact .plp-more-btn {
        min-height: 40px;
        min-width: 36px;
    }
    .plp-checklist.plp-compact .plp-cb-label {
        min-width: 44px;
    }
    .trip-filter-chip {
        min-height: 38px;
        padding-top: 0.4rem;
        padding-bottom: 0.4rem;
    }
    .td-quicknav-chip {
        min-height: 42px;
    }
    /* Small inline buttons (Print / PDF / Calendar in page headers) often
       end up ~30px tall — bump just the floor so labels stay legible and
       the touch hit-box clears the guideline. */
    .button.small {
        min-height: 38px;
    }
    /* Hamburger menu toggle. */
    .nav-toggle {
        min-width: 44px;
        min-height: 44px;
    }
    /* Bulk-bar per-row check + edit/delete icon buttons. */
    .plp-bulk-row-check input[type="checkbox"] {
        width: 1.25rem;
        height: 1.25rem;
    }
}

/* ── Page header wraps cleanly with multi-button action clusters ───
   On Itinerary, the action area carries Print / Calendar / ⓘ — three
   items that cram alongside the title on phones. Force the actions
   onto their own row below the title, and let buttons grow to fill
   evenly. The ⓘ tip trigger is the exception: it must ALWAYS stay on
   the title line (the title row must NOT claim a full row — that was
   pushing a lone ⓘ onto its own line on every page), so a cluster-borne
   ⓘ is lifted out and pinned to the header's top-right corner instead.
   main.page-wrapper bumps specificity above any shared default. */
@media (max-width: 575px) {
    main.page-wrapper .page-header {
        flex-wrap: wrap;
        row-gap: 0.5rem;
        position: relative;   /* anchor for the pinned ⓘ below */
    }
    main.page-wrapper .page-header > div:first-child {
        min-width: 0;
    }
    main.page-wrapper .page-header-title-row {
        min-width: 0;
    }
    main.page-wrapper .page-header-actions {
        flex: 1 1 100%;
        flex-wrap: wrap;
        gap: 0.35rem;
        margin-left: 0;
        justify-content: flex-start;
    }
    main.page-wrapper .page-header-actions > .button.small,
    main.page-wrapper .page-header-actions > a.button {
        flex: 1 1 auto;
    }
    /* ⓘ inside an actions cluster: lift it out of the cluster's row and
       pin it to the title line, far upper-right — the same spot the
       bare-child ⓘ pattern renders it. */
    main.page-wrapper .page-header-actions > .tip-icon-button {
        flex: 0 0 auto;
        position: absolute;
        top: 0;
        right: 0;
    }
    /* …and keep a long title from running under the pinned icon. */
    main.page-wrapper .page-header:has(.page-header-actions > .tip-icon-button) > div:first-child,
    main.page-wrapper .page-header:has(.page-header-actions > .tip-icon-button) > .page-header-title-row {
        padding-right: 2.5rem;
    }
    /* An actions cluster whose only content is the (now-pinned) ⓘ would
       otherwise still claim an empty full-width row — collapse it. */
    main.page-wrapper .page-header > .page-header-actions:not(:has(> :not(.tip-icon-button))) {
        display: contents;
    }
}

/* ── Inline link strips with separators ─────────────────────────────
   Login.aspx (.login-links: "Demo | Join | About | Forgot | Help") and
   the site footer (.site-footer-links: "About · Help · ...") collapse
   to a single row on desktop and wrap to multiple rows on phones. When
   they wrap, the tight default line-height puts taps within a couple
   px of the next-row link — easy to mis-fire. Loosen the leading so
   the rows separate visually on phones. */
@media (max-width: 575px) {
    .login-links,
    .site-footer-links,
    .site-footer-copy {
        line-height: 2;
        text-align: center;
    }
}

/* ── Printable keyboard-shortcut cheat sheet ────────────────────────
   Press ? then Ctrl+P and you get the shortcut list on a page by itself.

   styles_shared.css:2940 hides .shortcuts-overlay in print along with the rest of
   the transient chrome. That is right for a CLOSED overlay and wrong for an open
   one, which is the entire feature. No JS and no edit to the shared sheet is
   needed: the overlay already carries an .open class while visible, so
   `.shortcuts-overlay.open` is (0,2,0) and outranks the shared `.shortcuts-overlay`
   (0,1,0) even though both carry !important — specificity decides between two
   !important declarations, not source order (which would otherwise lose, since
   Bundle.config loads this file BEFORE the shared one).

   The list is generated from the SHORTCUTS array in site.js, so the printed sheet
   cannot drift from the live bindings the way a hand-written Help section would.

   :has() suppresses the page behind the sheet so it prints alone. Where :has() is
   unsupported the rule is simply skipped and you get the page plus the sheet —
   degraded, still useful, never broken. */
@media print {
    body:has(.shortcuts-overlay.open) #main-content { display: none !important; }

    .shortcuts-overlay.open {
        display: block !important;
        position: static !important;
        background: none !important;
        padding: 0 !important;
    }
    .shortcuts-overlay.open .shortcuts-box {
        box-shadow: none !important;
        border: 1px solid #ccc;
        max-width: none;
        break-inside: avoid;
    }
    /* The Close button is screen-only furniture. */
    .shortcuts-overlay.open .shortcuts-footer { display: none !important; }
    /* Force ink-on-paper colors: the overlay inherits card/dark-mode variables
       that print as unreadable light-gray-on-white. */
    .shortcuts-overlay.open .shortcuts-box,
    .shortcuts-overlay.open .shortcuts-title,
    .shortcuts-overlay.open .shortcuts-list li,
    .shortcuts-overlay.open .kbd {
        background: #fff !important;
        color: #000 !important;
    }
    .shortcuts-overlay.open .kbd { border: 1px solid #666 !important; }
}

/* ── Notifications: reminder channel checkboxes stack ───────────────
   Three long checkbox labels ("Send push reminders (on this device,
   even when the site is closed)") need a vertical stack with generous
   spacing so they don't run together on phones. The shared check-row
   gap is too tight for these multi-line labels. */
.reminder-channels {
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
}
.reminder-channels .checkbox + * { line-height: 1.4; }

/* ── Notifications: push-state stack inside its card ─────────────────
   The page lays out as standard full-width .main-card sections (the old
   shared .subscribe-page wrapper — a narrow 480px centered column — was
   removed). The push-state blocks (loading / granted / denied / prompt)
   keep their original centered-column look inside the Push Subscription
   card. */
.notif-device-card .subscribe-state,
.notif-device-card .subscribe-state-loading {
    max-width: 480px;
    margin: 0 auto;
    text-align: center;
}

/* ── Itinerary "Suggest activities" toolbar ─────────────────────────
   Three children (Select All checkbox, count label, Regenerate link)
   need to wrap cleanly when the count text is long. */
@media (max-width: 575px) {
    .itin-suggest-toolbar {
        flex-wrap: wrap;
        gap: 0.5rem;
    }
    .itin-suggest-toolbar > .checkbox-label { flex: 1 1 auto; }
    .itin-suggest-toolbar > .small-dim-text { flex: 1 1 100%; }
    .itin-suggest-head {
        flex-wrap: wrap;
        gap: 0.5rem;
    }
    .itin-suggest-head .card-title { flex: 1 1 auto; }
    .itin-suggest-head .button { flex: 0 0 auto; }
}

/* ── Defensive long-word overflow ──────────────────────────────────
   A 30-char trip name, AI suggestion, log message, or product title
   typed without a space pushes the row wider than the viewport. Apply
   anywhere-break to the content cells most likely to carry user-typed
   strings. .main-card already gets min-width:0 via the wrapper. */
.tip-card-text,
.exp-summary-cell,
.exp-summary-cell .heading,
.plp-item-name,
.trip-list-item,
.note-item,
.itin-item,
.exp-item,
.donate-method-name {
    overflow-wrap: anywhere;
    word-break: break-word;
}
.exp-summary-cell { min-width: 0; }

/* ── Smaller card gutters on the narrowest viewports ───────────────
   Below ~480px (most phones in portrait), shared .main-card padding
   eats ~14% of the screen on each side. Tighten to give inputs and
   long content more breathing room without removing the visual card. */
@media (max-width: 480px) {
    main.page-wrapper .main-card,
    main.page-wrapper .tip-card {
        padding-left: 0.85rem;
        padding-right: 0.85rem;
    }
    /* Page wrapper itself: tighten outer gutters too. */
    main.page-wrapper {
        padding-left: 0.5rem;
        padding-right: 0.5rem;
    }
}

/* ── Modals on narrow screens use the available width ──────────────
   Default modal-box has fixed max-width that leaves big side-margins
   on phones, cramping the form fields. Let the box flex to nearly
   full width on phones while keeping comfortable inset on tablets. */
@media (max-width: 480px) {
    .modal-overlay > .modal-box {
        width: calc(100vw - 1rem);
        max-width: calc(100vw - 1rem);
        margin: 0.5rem;
    }
    /* Post-login: stack action buttons full-width. */
    .post-login-card-actions {
        flex-wrap: wrap;
    }
    .post-login-card-actions .button {
        flex: 1 1 100%;
    }
}

/* ── Trip Dashboard bottom quicknav strip ──────────────────────────
   Defensive flex-wrap so the chip row never forces horizontal scroll
   even when chip labels are long ("Recommended Gear", "Getting Started
   Checklist"). The shared rule already wraps; this is a belt-and-
   suspenders guarantee that resists future shared-CSS changes. */
.td-quicknav {
    flex-wrap: wrap;
}

/* ── Address-row inputs on EditTrip ────────────────────────────────
   On mobile, City/State/PostalCode side-by-side become awful tiny —
   shared .form-row probably stacks them already, but ensure the .form-
   group children inside .form-row stack on the narrowest viewports
   even if a future page authors a wider form-row variant. */
@media (max-width: 480px) {
    main.page-wrapper .form-row {
        flex-direction: column;
        gap: 0.5rem;
    }
    main.page-wrapper .form-row > .form-group {
        flex: 1 1 100%;
        width: 100%;
        min-width: 0;
    }
}

/* ── Sticky Save bars don't trap the viewport ──────────────────────
   When a sticky save bar (.de-save-bar, .form-actions-sticky) sits at
   the bottom on mobile, the last form field can hide beneath it. Add
   bottom padding to the wrapper so any sticky bar always reveals the
   field above. The selector hits any page that has a sticky child. */
main.page-wrapper:has(.de-save-bar) { padding-bottom: 5rem; }

/* ── Quick-add input never overflows its row ───────────────────────
   The flex: 1 1 160px lets it shrink below container width on phones;
   ensure box-sizing keeps padding inside the constraint. */
input.plp-quick-add-input {
    box-sizing: border-box;
    max-width: 100%;
}

/* ── Banners take full width on phones ─────────────────────────────
   The offline banner sits above the nav. Ensure its text wraps cleanly on tiny screens.

   ⚠ .banner-demo WAS listed here and the rule never did anything (removed 2026-08-28).
   The bundle order is [bootstrap, this file, Shared/styles_shared.css], so the shared
   sheet loads last; .banner-demo's unconditional `padding: 0.55rem 1rem` there beat this
   media query, which adds no specificity. The demo banner's narrow-screen rule now lives
   next to .banner-demo in styles_shared.css, where it applies on all three sites. */
@media (max-width: 480px) {
    .banner-offline {
        padding-left: 0.6rem;
        padding-right: 0.6rem;
        font-size: var(--font-size-sm, 0.875rem);
        line-height: 1.4;
    }
}

/* "Work offline →" inside the offline banner (2026-09-19). The banner used to state the
   problem and stop there; this is the way out of it — /offline.html lists every page
   pinned for offline use. Reported by the owner from a plane: stuck on the login page
   with no route to the pages that would still have worked.

   🔑 `a.` PREFIX ON BOTH RULES, NOT A BARE CLASS. The bundle is [bootstrap, this file,
   Shared/styles_shared.css] — the shared sheet loads LAST, so a bare `.banner-offline-link`
   (0,1,0) loses to its `a:hover` (0,1,1) and the link would flip to the site accent on
   hover, mid-red-banner. Same trap already documented for .plp-sum-link. */
a.banner-offline-link {
    color: inherit;
    text-decoration: underline;
    font-weight: var(--font-weight-semibold, 600);
    margin-left: 0.5rem;
    white-space: nowrap;
}
a.banner-offline-link:hover,
a.banner-offline-link:focus-visible {
    color: inherit;
    text-decoration: none;
}

/* Login.aspx's "your sign-in never left your device" notice, revealed by an inline script
   when the service worker reports a dead POST.
   🔑 THIS RULE IS LOAD-BEARING. `.alert-panel` sets `display: block`, which beats the UA
   stylesheet's `[hidden] { display: none }` — so without this the notice would be visible
   on EVERY login, telling everyone they were offline. styles_shared.css carries the same
   one-liner for each of its own hideable panels (.caps-lock-warning, .post-login-card …)
   for exactly this reason. */
#loginOfflineNotice[hidden] { display: none; }

/* ── Contact List page (ContactList.aspx) ──────────────────────────
   Search box + button row, and the shared row layout used by search
   results, My Contacts, and Blocked. Search-result rows put the Add
   button on the LEFT (order: -1); contact rows keep actions on the
   right. Plain author colors here are fine — none target .text-muted. */
.ct-search-bar {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    flex-wrap: wrap;
    margin-bottom: 0.75rem;
}
.ct-search-bar .input-clearable {
    flex: 1 1 16rem;
}
.ct-list {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.ct-row {
    display: flex;
    flex-wrap: wrap;                 /* let the action buttons drop to their own line when narrow */
    align-items: center;
    gap: 0.5rem 0.75rem;             /* row-gap when wrapped · column-gap inline */
    padding: 0.6rem 0.75rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm, 0.375rem);
}
.ct-row-info {
    flex: 1 1 12rem;       /* keeps name/place readable; forces actions to WRAP, not squish the text */
    min-width: 0;
}
.ct-name {
    word-break: break-word;
}
.ct-status {
    font-style: italic;    /* reads as the contact's quoted status message */
}
.ct-row-actions {
    display: flex;
    gap: 0.4rem;
    flex: 1 1 auto;        /* when wrapped to its own line, spans the row and right-aligns */
    align-items: center;
    flex-wrap: wrap;
    justify-content: flex-end;
}
.ct-row-actions.ct-add-col {
    flex: 0 0 auto;        /* the search-row Add column stays small, on the left */
}
.ct-search-row .ct-add-col {
    order: -1;             /* Add button to the LEFT of each search result */
}

/* Filter box above My Contacts */
.ct-filter {
    margin-bottom: 0.75rem;
    max-width: 24rem;
}

/* Colored initials avatar + green presence dot (mirrors the chat .qmeet-av look) */
.ct-av {
    position: relative;
    width: 40px;
    height: 40px;
    flex: 0 0 auto;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 800;
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1;
    user-select: none;
}
.ct-dot {
    position: absolute;
    right: -1px;
    bottom: -1px;
    width: 11px;
    height: 11px;
    border-radius: 50%;
    background: #22c55e;                       /* green = active in the last 5 minutes */
    border: 2px solid var(--color-bg-card);     /* notch matches the card bg in both themes */
}
/* Amber = active in the last hour but not the last 5 minutes. Same two thresholds and the
   same token qMeet PublicProfile's .profile-online-dot.is-recent uses, so the two surfaces
   read identically; past 60 minutes ContactList.aspx.vb renders no dot at all. */
.ct-dot.is-recent { background: var(--color-warning); }

/* One-line legend for .ct-dot, directly under the My Contacts card header. Sits tighter to the
   heading than a default .note paragraph so it reads as part of the header, not as body copy. */
.ct-legend {
    margin-top: -0.15rem;
    margin-bottom: 0.6rem;
}

/* The one-way indicator ("↩ Hasn't added you back") under a contact's last-active line.
   Added 2026-09-08, same rule and same wording on qFIT / paulmendelson.com / qMEET.
   🔑 STYLED DOWN, NOT UP — deliberately not a warning color. It reports a normal and very
   common state (the other person simply hasn't got round to it), and a red or amber chip
   would read as "something is wrong with this contact", which is untrue and unkind about a
   real person. Muted text on a faint neutral chip.
   ⚠ The background and border are rgba over the CARD rather than theme tokens, so one rule
   serves light and dark without a [data-theme] block. */
.ct-oneway {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-top: 0.15rem;
    padding: 2px 8px;
    border-radius: 999px;
    font-size: 11px;
    line-height: 1.4;
    color: var(--color-text-muted);
    background: rgba(128, 128, 128, 0.10);
    border: 1px solid rgba(128, 128, 128, 0.35);
}

/* (Favorites are a qMeet-only feature — no favorite star/badge on PacklistPRO.) */

/* .login-google-row moved to Shared/styles_shared.css (shared by all 4 sites). */

/* ============================================================================
   Per-page "lightbulb" feedback panel (page-feedback.js).
   The icon sits just after the .page-title; the panel is a centered modal that
   (by spec) does NOT close on outside click. Ported from qMEET.
   ============================================================================ */
/* WCAG 2.5.8 (AA) target size - 2026-08-26, plan row A11Y-11. Measured at a 390x844
   phone viewport this button was 35x21: wide enough, 3px too short, and one of the three
   named as the contained subset that can grow without shifting anything else.
   min-height alone does NOT apply to a non-replaced INLINE element, which is what this was -
   inline-flex is what makes the 24px real, and centring keeps the glyph exactly where it was.
   The other A11Y-11 shortfalls (banner links, footer buttons, .main-card headings) are
   deliberately NOT touched here: those are padding changes to shared chrome that shift
   vertical rhythm on every page of all three sites, and want a before/after look first. */
.pf-bulb {
    background: none; border: none; cursor: pointer;
    font-size: 1rem; line-height: 1; padding: 2px 6px; margin-left: 6px;
    vertical-align: middle; border-radius: 6px; opacity: .8;
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 24px; min-height: 24px;
    transition: opacity .15s ease, transform .15s ease, background-color .15s ease;
}
.pf-bulb:hover { opacity: 1; transform: scale(1.12); background-color: rgba(127,127,127,.15); }
.pf-bulb:focus-visible { outline: 2px solid var(--color-primary, #4a90d9); outline-offset: 2px; }

/* Backdrop = the shared popup look; the tokens live in Shared/styles_shared.css section 18. */
.pf-overlay {
    position: fixed; inset: 0; background-color: var(--popup-backdrop-bg, rgba(15, 23, 42, 0.55));
    -webkit-backdrop-filter: var(--popup-backdrop-filter, blur(4px) saturate(140%)); backdrop-filter: var(--popup-backdrop-filter, blur(4px) saturate(140%));
    z-index: 9995; display: flex; align-items: flex-start; justify-content: center;
    padding: 5vh 1rem; overflow-y: auto;
}
.pf-overlay[hidden] { display: none; }
body.pf-open { overflow: hidden; }

.pf-panel {
    position: relative; width: 100%; max-width: 520px;
    background: var(--color-bg-card, #fff); color: var(--color-text, #222);
    border-radius: 12px; box-shadow: var(--shadow-xl, 0 10px 40px rgba(0,0,0,.4));
    padding: 1.25rem 1.25rem 1rem; box-sizing: border-box;
}
.pf-close {
    position: absolute; top: .5rem; right: .6rem; background: none; border: none;
    font-size: 1.5rem; line-height: 1; cursor: pointer; color: var(--color-text, #222);
    opacity: .7; padding: 2px 6px; border-radius: 6px;
}
.pf-close:hover { opacity: 1; background-color: rgba(127,127,127,.15); }
.pf-heading { margin: 0 1.5rem .75rem 0; font-size: var(--font-size-lg, 1.125rem); }
.pf-text { width: 100%; box-sizing: border-box; resize: vertical; min-height: 5rem; }
.pf-screens-label { margin-top: .75rem; }
.pf-existing { margin: .25rem 0 .5rem; }
.pf-none { font-style: italic; }
.pf-shot {
    display: flex; align-items: center; gap: .5rem; padding: .25rem 0;
    border-bottom: 1px solid var(--color-border, rgba(127,127,127,.2));
}
.pf-shot .link { flex: 1 1 auto; word-break: break-all; }
.pf-shot .pf-del { flex: 0 0 auto; line-height: 1; padding: 2px 8px; }
.pf-uploadrow { display: flex; align-items: center; gap: .5rem; flex-wrap: nowrap; margin-top: .25rem; }
/* Let the input grow to fit its native "Choose Files" button (the fixed 2.5rem
   shared height clipped the button's bottom edge). The row's second slot used to
   hold an "Upload" button; picking now uploads on its own, so all that is left
   beside the picker is "↻ Try again", hidden unless an upload failed. */
.pf-uploadrow .file-picker { flex: 1 1 auto; min-width: 0; height: auto; }
.pf-uploadrow .pf-retry { flex: 0 0 auto; white-space: nowrap; }
.pf-filecount { min-height: 1.1em; margin: .35rem 0 0; }
.pf-filecount.pf-error { color: var(--color-danger, #c62828); }
.pf-actions {
    display: flex; justify-content: space-between; align-items: center;
    gap: .5rem; margin-top: 1rem;
}

/* The first-visit .primer-* modal (Packlist/Tasklist) was retired 2026-07-17 when primers
   became Tutorials. The overlay look now lives in Shared/styles_shared.css as the canonical
   .tutorial-* system (shared by the on-demand Tutorial and the auto-opening NTK popup). */

/* ── EditTrip destination rows ────────────────────────────────────────────────
   Built client-side by Scripts/edittrip-destinations.js. A trip has a list of
   destinations: "final" ones and "intermediate" stops passed through en route.
   Stops are tinted and inset so the route reads at a glance without needing to
   read each row's type dropdown. ── */
.dest-list { display: flex; flex-direction: column; gap: 0.6rem; margin-bottom: 0.75rem; }
.dest-row {
    border: 1px solid var(--color-border, #d0d7de);
    border-left: 4px solid var(--color-accent, #0090c8);
    border-radius: 0.5rem;
    padding: 0.6rem;
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
}
/* Intermediate stops: dimmer accent + a slight inset, so a route of
   destination → stop → destination is legible without reading the dropdowns. */
.dest-row.is-stop {
    border-left-color: var(--color-border, #9aa4ae);
    margin-left: 1.25rem;
    background: rgba(127, 127, 127, 0.05);
}
.dest-row-head { display: flex; gap: 0.5rem; align-items: center; }
/* The automatic stop number. Filled by syncRowState() from the row's POSITION, so it
   renumbers on add / remove / reorder — and it is the same number the route maps print
   beside the matching pin (.route-wp-label). Fixed width so a jump from 9 to 10 does not
   shove the whole head row sideways.

   🔑 THE TWO BADGE COLORS ARE THE MAP'S OWN PIN COLORS — C_FINAL #dc2626 and C_STOP
   #f59e0b out of Scripts/trip-route.js — so a glance between this list and any route map
   matches on color as well as on number. That correspondence IS the feature; do not
   re-point these at --color-accent to "match the site".

   🛑 LITERALS, AND BOTH WERE MEASURED AGAINST WHITE TEXT, because the obvious choices
   both failed: var(--color-accent) is 2.48:1 (bright cyan, fails in BOTH themes) and
   var(--color-text-muted) flips to a LIGHT gray in dark mode — rgb(177,181,187) — so the
   theme meant to help readability was the one that destroyed it. C_STOP is darkened
   #f59e0b → #b45309 for the same reason. Measured on the shipped values, identical in
   both themes: destination 4.83:1, stop 5.02:1. */
.dest-num {
    flex: 0 0 auto;
    min-width: 1.6rem;
    height: 1.6rem;
    padding: 0 0.35rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 999px;
    background: #dc2626;
    color: #fff;
    font-size: var(--font-size-xs);
    font-weight: 700;
    line-height: 1;
}
.dest-row.is-stop .dest-num { background: #b45309; }
.dest-row-head .dest-kind { flex: 0 0 auto; width: auto; min-width: 11rem; }
.dest-row-head input { flex: 1 1 auto; min-width: 0; }
.dest-row-head .dest-remove { flex: 0 0 auto; }
/* Four fields across on desktop; the media query below drops it to two. */
.dest-row-grid { display: grid; grid-template-columns: 2fr 1.2fr 1fr 1.4fr; gap: 0.5rem; }
.dest-row-grid input { min-width: 0; }
.dest-row-dates { display: flex; gap: 0.75rem; align-items: center; flex-wrap: wrap; }
.dest-row-dates label { display: inline-flex; align-items: center; gap: 0.35rem; }
.dest-row-dates .date-picker { width: auto; }
/* 🔑 NO margin-left:auto ANY MORE. It lived on the dates line and was shoved to the far
   right, which is how a reorder control ended up three fields away from the only thing on
   screen that shows order. It now sits immediately after .dest-num in .dest-row-head. */
.dest-move { flex: 0 0 auto; display: inline-flex; gap: 0.15rem; }
.dest-move button { padding: 0.1rem 0.4rem; line-height: 1.1; min-width: 0; }
.dest-move button:disabled { opacity: 0.3; cursor: default; }

@media (max-width: 700px) {
    .dest-row-grid { grid-template-columns: 1fr 1fr; }
    .dest-row-head { flex-wrap: wrap; }
    .dest-row-head .dest-kind { min-width: 0; flex: 1 1 100%; }
    .dest-row.is-stop { margin-left: 0.5rem; }
}

/* ── EditTrip: tags hidden on Show / Hide Tags but still on this trip ─────────
   These pills exist so the trip's tag list is never wider than what the picker
   shows — a hidden tag that is still attached goes on feeding the Recommended
   filter, so it has to stay tickable. It is always rendered SELECTED (that is the
   only way it gets here), so the flag cannot be a fade or a border tint: against
   the lime selected fill either one reads as a half-selected state. A word does
   not. `.tag-pill.selected` is 0,2,0 and lives in styles_shared.css, which loads
   AFTER this file — hence the doubled `.tag-pill.tag-pill-hidden` (also 0,2,0 but
   the flag is a child, so no collision) and the compound selector on the flag. ── */
.tag-pill.tag-pill-hidden { padding-right: 0.55rem; }
.tag-pill-hidden .tag-pill-hidden-flag {
    margin-left: 0.45rem;
    padding: 0.05rem 0.35rem;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.25);
    border: 1px solid rgba(255, 255, 255, 0.45);
    font-size: 0.68em;
    font-weight: var(--font-weight-normal, 400);
    letter-spacing: 0.02em;
    text-transform: lowercase;
    line-height: 1.4;
}
/* Unselected is reachable for one moment only: the user has just unticked the pill
   and the save is in flight. Keep the flag legible against the plain pill fill until
   the reload drops the pill for good. */
.tag-pill-hidden:not(.selected) .tag-pill-hidden-flag {
    background: rgba(127, 127, 127, 0.16);
    border-color: var(--color-border, #d0d7de);
}
/* Banner above the pill groups. Deliberately styled EXACTLY like .plp-tags-notice above,
   including its ⚠: no `display` override. A first pass here set `display: flex` and it
   silently did nothing — `.alert-panel { display: block }` in styles_shared.css is the same
   0,1,0 specificity and that file loads AFTER this one, so the tie goes to shared. Which is
   the right outcome: see the .plp-tags-notice comment for what flexing an .alert-panel does
   to a wrapped sentence. Normal block flow already puts the action beside the text and wraps
   it to its own line when the panel is too narrow. */
.alert-panel.et-hidden-tags-note > .button {
    margin-left: 0.5rem;
    /* Never let the label break as "Show / Hide / Tags" mid-button. */
    white-space: nowrap;
    /* `.alert-panel a { text-decoration: underline }` (0,1,1) beats `.button`'s own
       `text-decoration: none` (0,1,0) — right for a link in prose, wrong for a button.
       Three classes (0,3,0) outrank it. */
    text-decoration: none;
}

/* ── EditTrip: the Who group's consequence line ───────────────────────────────
   Sits INSIDE .tag-group-body (last child, after the pills) so it collapses with the
   group and reads as an annotation on those pills rather than a page-level alert.
   That body is `display: flex; flex-wrap: wrap`, so the panel has to claim a whole
   row of its own or it would try to sit in the pill flow. */
.alert-panel.et-who-consequence {
    flex: 0 0 100%;
    margin: 0.35rem 0 0;
}
/* edittrip-page.js toggles the `hidden` PROPERTY, and the UA's `[hidden] {
   display: none }` loses to `.alert-panel { display: block }` (0,1,0 beats 0,0,0), so
   the panel would sit there empty on every trip whose Who tags gate nothing off.
   Two classes + an attribute (0,3,0) settle it. */
.alert-panel.et-who-consequence[hidden] { display: none; }
/* One <p> per gated-off group — up to two, and they are separate consequences, so
   they get air between them rather than running together as one paragraph. */
.alert-panel.et-who-consequence > p { margin: 0; }
.alert-panel.et-who-consequence > p + p { margin-top: 0.5rem; }

/* ── Trip Dashboard: weather stop picker ──────────────────────────────────────
   Shown only when a trip has 2+ destinations. Sits above the day strip inside the
   single weather card — one card with a selector, rather than a card per stop. ── */
/* Stop picker for multi-destination trips. One rule, two hosts: the dashboard's
   weather card and the itinerary's suggestions card ask the same question ("which
   stop?") and must look identical doing it. */
.td-weather-stops,
.itin-suggest-stops {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
    margin-bottom: 0.5rem;
}
.td-weather-stops .dropdown,
.itin-suggest-stops .dropdown {
    width: auto;
    max-width: 100%;
    flex: 0 1 auto;
    padding-top: 0.2rem;
    padding-bottom: 0.2rem;
    font-size: var(--font-size-sm);
}
.td-weather-stops .dropdown:disabled,
.itin-suggest-stops .dropdown:disabled { opacity: 0.6; }
/* The per-stop note sits on its OWN line under the picker: .itin-suggest-stops is a
   wrapping flex ROW, so without flex-basis:100% this <p> lands beside the dropdown. */
.itin-suggest-stops-note {
    flex: 0 0 100%;
    margin: 0.15rem 0 0;
}

/* ── Places Near Me (GooglePlaceSearch.aspx) ──────────────────────────────────
   Leaflet map + search/category/route controls. Colors: blue = you, red = text
   results, green = categories, purple = route. Popups/tooltips are re-themed to the
   design tokens so they read correctly in dark mode (OSM tiles stay light). ── */
.gps-search-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
}
/* The .input-clearable wrapper is the flex child and grows to fill the row, so the input
   must fill the wrapper or the absolutely-positioned × lands at the wrapper's edge,
   outside the field. The max-width override is the crux: this row lives inside a
   .form-group, and the shared `@media .form-group .textbox { max-width: 480px }` was
   capping the input at 480px while the wrapper grew past 900px. */
.gps-search-row .input-clearable { flex: 1 1 260px; min-width: 0; }
.gps-search-row .input-clearable .textbox { width: 100%; min-width: 0; max-width: 100%; }

.gps-options {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem 1.5rem;
    margin-top: 0.75rem;
}
/* Replaced the .gps-cats checkbox grid (one category at a time now). .gps-check stays —
   five other checkboxes on this page still use it. */
.gps-cat-select {
    margin-top: 0.4rem;
    max-width: 22rem;
    width: 100%;
}
/* "Or Search For A Place" sits just under the category picker — set it apart. */
.gps-search-label { margin-top: 0.9rem; }

/* "(green pins)" reads as a quiet aside inside the bold label, not part of it. */
.gps-pin-note {
    font-weight: 400;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}

/* "Search Somewhere Else" — collapsed by default so it never competes with the
   normal case, which is that the browser's own location is right. */
.gps-elsewhere { margin-top: 0.35rem; }
.gps-elsewhere > summary { cursor: pointer; font-size: var(--font-size-sm, 0.875rem); }
.gps-elsewhere-row { margin-top: 0.5rem; }
.gps-elsewhere-controls {
    display: flex;
    flex-wrap: wrap;          /* stacks on a phone rather than squeezing the input */
    gap: 0.5rem;
    align-items: center;
}
/* The origin box now has an in-field × clear button, so the .input-clearable wrapper
   is the flex child and the input fills it (× sits inside, like the other rows). The
   max-width override defeats the shared .form-group .textbox 480px cap (see above). */
.gps-elsewhere-controls .input-clearable { flex: 1 1 14rem; min-width: 0; }
.gps-elsewhere-controls .input-clearable .textbox { width: 100%; min-width: 0; max-width: 100%; }
.gps-trip-origins { margin-top: 0.5rem; display: flex; flex-wrap: wrap; gap: 0.4rem; align-items: center; }
.gps-trip-origin { margin: 0; }
.gps-check {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    cursor: pointer;
    white-space: nowrap;
}
.gps-check input { margin: 0; }
.gps-cat-note { margin-top: 0.5rem; }

.gps-status {
    min-height: 1.4em;
    margin: 0 0 0.6rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}
.gps-status a { margin-left: 0.4rem; }

.gps-map {
    height: clamp(360px, 60vh, 620px);
    width: 100%;
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: var(--border-radius, 10px);
    box-shadow: var(--shadow-md);
    z-index: 0;                 /* keep tiles/controls under the site nav dropdowns */
}

.gps-legend {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem 1.25rem;
    margin-top: 0.6rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}
.gps-legend-item { display: inline-flex; align-items: center; gap: 0.35rem; }
.gps-dot { width: 0.85rem; height: 0.85rem; border-radius: 50%; border: 2px solid #fff; box-shadow: 0 0 0 1px rgba(0,0,0,0.2); }
.gps-dot-blue  { background: #2563eb; }
.gps-dot-red   { background: #dc2626; }
.gps-dot-green { background: #16a34a; }

/* Leaflet divIcon carries a default white box + border — strip it so only our SVG shows. */
.gps-pin, .gps-youdot { background: transparent; border: 0; }

/* Permanent distance label beside each result pin (small pill; arrow hidden). */
.leaflet-tooltip.gps-dist {
    background: var(--color-bg-card, #fff);
    color: var(--color-text, #222);
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: 999px;
    padding: 1px 7px;
    font-size: var(--font-size-xs);
    font-weight: 600;
    box-shadow: var(--shadow-sm);
    white-space: nowrap;
}
.leaflet-tooltip.gps-dist::before { display: none; }   /* no direction arrow */

/* ── Route waypoint captions ─────────────────────────────────────────────────
   The always-on "2 · Panama City, FL" beside each pin on the trip route, drawn by
   Scripts/trip-route.js on all six maps that show the route. The number is the row
   number on EditTrip — see .dest-num, which is the same figure.

   🛑 pointer-events: none. These are bound interactive:false so Leaflet already sets
   it, but this is restated because the caption OVERLAPS the park / trail / campsite
   pins the visitor actually came to click, and one interactive tooltip is all it takes
   to swallow those clicks with nothing on screen to explain why.

   🔑 The palette is C_YOU / C_STOP / C_FINAL out of trip-route.js — the same three
   values the pins are filled with, so a caption is unambiguously attached to its own
   dot when several sit close together. Change them in both places or not at all.

   🛑🛑 EVERY COLOR HERE IS A LITERAL, AND THERE IS NO [data-theme="dark"] RULE — THAT IS
   NOT AN OVERSIGHT. A map label does not sit on the page, it sits on OpenStreetMap raster
   tiles, which are LIGHT IN BOTH THEMES. The identical mistake is written up in full above
   .plp-mp-label in Shared/styles_shared.css: that rule used --color-bg-card / --color-text
   and MEASURED 1.1:1 contrast on PLP /Parks with data-theme="dark" — near-white text on a
   white chip — because the tokens flipped and the map underneath did not. In light mode a
   token-based version of this block looks perfect, which is exactly how that one shipped.
   Test any change to these on a DARK-THEME page. ── */
.leaflet-tooltip.route-wp-label {
    background: #ffffff;
    color: #1f2937;
    border: 1px solid rgba(0, 0, 0, 0.28);
    border-left-width: 3px;
    border-radius: 0.35rem;
    padding: 0.05rem 0.35rem;
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: 600;
    line-height: 1.3;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
    white-space: nowrap;
    opacity: 0.95;
    pointer-events: none;
}
.leaflet-tooltip.route-wp-label::before { display: none; }   /* no direction arrow */
.leaflet-tooltip.route-wp-label b { font-weight: 800; }
.leaflet-tooltip.route-wp-label.is-origin { border-left-color: #2563eb; }
.leaflet-tooltip.route-wp-label.is-stop   { border-left-color: #f59e0b; }
.leaflet-tooltip.route-wp-label.is-final  { border-left-color: #dc2626; }
/* The number only — the origin has none (it reads "Start"), so there is deliberately no
   .is-origin rule here. Amber darkened to #b45309: C_STOP #f59e0b is a fill color and
   fails contrast as 10px text on a white card. */
.leaflet-tooltip.route-wp-label.is-stop b  { color: #b45309; }
.leaflet-tooltip.route-wp-label.is-final b { color: #dc2626; }

/* ── ≈ : this pin is a TOWN CENTER, not the place ──────────────────────────────
   Owner, 2026-09-02: "anytime a stop or destination or itinerary item only has a city
   and state, the label should show a warning of some sort so the user knows the pin is
   not placed exactly - it's just placed at city center."

   🔑 ON A TRIP ROUTE THAT IS EVERY WAYPOINT — plp_TripDestinations has no street-address
   column and nothing in TripRouteService is allowed to geocode — so this has to stay
   quiet enough to sit on every caption without shouting. Amber darkened to #b45309 for
   the same reason .is-stop b is: C_STOP #f59e0b is a fill color and fails contrast as
   10px text on a white card.

   🛑 NOT HIDDEN ON A PHONE. The captions shrink below; the warning is the half that must
   survive, because a small map is exactly where a pin wrong by ten miles is hardest to
   notice. ── */
.leaflet-tooltip.route-wp-label .route-wp-approx,
.leaflet-tooltip.itin-pin-label .itin-pin-approx {
    color: #b45309;
    font-weight: 800;
}
/* 🛑 NO [data-theme="dark"] RULE HERE, AND ITS ABSENCE IS DELIBERATE. These captions sit
   on OSM raster tiles, which are LIGHT IN BOTH THEMES — the chip stays white, so a
   dark-mode lift to #fbbf24 would be amber on white. #b45309 is 5.02:1 on white and is
   the right answer in both. Same rule the .route-wp-label block itself follows. */

/* The dashed left edge says the same thing to someone reading the map rather than the
   words — an approximate caption is visibly a different object, not just a different
   string. */
.leaflet-tooltip.route-wp-label.is-approx,
.leaflet-tooltip.itin-pin-label.is-approx { border-left-style: dashed; }

/* The sentence itself, inside a popup. The ≈ tells a reader who already knows what it
   means; this is what teaches them, and the caption has no room for it. */
.route-wp-approx-note,
.itin-pin-approx-note { margin-top: 0.25rem; font-style: italic; }

/* ── Itinerary plan captions (Scripts/itinerary-pins.js, 2026-09-02) ───────────
   Owner: "let's also mark itinerary items on all the same maps, including label".

   🔑 DELIBERATELY BUILT FROM .route-wp-label. On all six of these maps a plan's caption
   and a route stop's caption sit inches apart, and two different caption designs would
   read as two different kinds of object. What differs is the left edge: blue, because a
   plan is somewhere the trip has already decided on — the same blue the pin is filled
   with, so a caption is unambiguously attached to its own pin in a cluster.

   🛑 LITERALS, NOT `--color-*` TOKENS, AND NO [data-theme] RULE — copied from
   .route-wp-label AFTER that rule was corrected. A MAP OVERLAY IS NOT A PAGE ELEMENT:
   OSM raster tiles are light in BOTH themes, so a token background flips to dark while
   the map underneath does not, and the measured result on /Parks with data-theme="dark"
   was 1.1:1 — near-white text on a white chip. In light mode the token version looks
   perfect, which is exactly how it shipped last time. #1f2937 on #ffffff, and #1d4ed8
   for the number (6.3:1 on white). ── */
.leaflet-tooltip.itin-pin-label {
    background: #ffffff;
    color: #1f2937;
    border: 1px solid rgba(0, 0, 0, 0.28);
    border-left: 3px solid #2563eb;
    border-radius: 0.35rem;
    padding: 0.05rem 0.35rem;
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: 600;
    line-height: 1.3;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
    white-space: nowrap;
    opacity: 0.95;
    pointer-events: none;
}
.leaflet-tooltip.itin-pin-label::before { display: none; }   /* no direction arrow */
.leaflet-tooltip.itin-pin-label b { font-weight: 800; color: #1d4ed8; }

/* A phone shows the same cross-country line in a third of the width, so the captions
   crowd far sooner. Shrink rather than hide: a numbered pin with no name is the state
   this whole change exists to get rid of. */
@media (max-width: 700px) {
    .leaflet-tooltip.route-wp-label,
    .leaflet-tooltip.itin-pin-label { font-size: var(--font-size-xs, 0.75rem); padding: 0 0.25rem; }
}

/* ── Map key (Scripts/map-key.js, 2026-09-02) ─────────────────────────────────
   Owner: "i think we need a legend that explains the numbers, symbols, and colors."

   🔑 THIS IS A PAGE ELEMENT, NOT A MAP OVERLAY, AND THE DISTINCTION DECIDES THE WHOLE
   BLOCK. It sits on the card under the map, so the TEXT correctly uses --color-* tokens
   and follows the theme like everything else around it. The SWATCHES do not: they are
   literals, because each one has to equal what Leaflet paints on tiles that are light in
   both themes. Getting this backwards in either direction is a shipped bug on this site
   already — .itin-pin-label was tokenized and measured 1.1:1 in dark mode, and .park-key
   was literal-but-wrong and showed a blue swatch over a red pin for months.

   🛑 EVERY COLOR BELOW IS A COPY. Change one and you have made the legend lie:
     #2563eb  C_YOU / C_PIN      trip-route.js, itinerary-pins.js, .park-key-you
     #f59e0b  C_STOP             trip-route.js
     #dc2626  C_FINAL / C_OFF    trip-route.js, itinerary-pins.js, .park-key-park
     #7c3aed  C_ROUTE            trip-route.js, .park-key-route
     #16a34a  C_DONE             itinerary-pins.js, .park-key-visited
     #b45309  the ≈ chip         .route-wp-approx / .itin-pin-approx above ── */
.plp-key { margin-top: 0.4rem; }
.plp-key > summary {
    cursor: pointer;
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted, #5a6472);
}
.plp-key-list {
    list-style: none;
    margin: 0.5rem 0 0;
    padding: 0 0 0 0.1rem;
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.45;
    color: var(--color-text-muted, #5a6472);
}
/* align-items:flex-start so a swatch sits against the FIRST line of a sentence that
   wraps to three on a phone, rather than floating to the middle of the paragraph. */
.plp-key-row { display: flex; align-items: flex-start; gap: 0.5rem; margin: 0 0 0.45rem; }
/* A fixed column, so the sentences line up into a readable left edge however wide the
   individual swatches are — the ≈ row carries two symbols and would otherwise indent
   its text further than every other row. */
.plp-key-sym {
    flex: 0 0 auto;
    min-width: 2.1rem;
    display: inline-flex;
    align-items: center;
    gap: 0.15rem;
    padding-top: 0.12rem;
}
.plp-key-txt { flex: 1 1 auto; min-width: 0; }
.plp-key-txt b { color: var(--color-text, #1f2937); font-weight: 700; }

/* The route's waypoints: a filled disc with a white ring, exactly as Leaflet draws a
   circleMarker with color:#ffffff / weight:2. Same construction as .park-key. */
.plp-key-dot {
    width: 0.75rem;
    height: 0.75rem;
    border-radius: 50%;
    display: inline-block;
    border: 2px solid #ffffff;
    box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25);
    flex: 0 0 auto;
}
.plp-key-dot.is-you { background: #2563eb; }
.plp-key-dot.is-stop { background: #f59e0b; }
.plp-key-dot.is-final { background: #dc2626; }
/* An undated plan is drawn smaller than a numbered one on the map, and the key says so
   by being smaller here too. */
.plp-key-dot.is-plan-sm { background: #2563eb; width: 0.6rem; height: 0.6rem; }
/* The same two statuses as .plp-key-num.is-done / .is-off, as DOTS — what the map draws
   once the numbers move to the route stops. */
.plp-key-dot.is-done-sm { background: #16a34a; width: 0.6rem; height: 0.6rem; }
.plp-key-dot.is-off-sm { background: #dc2626; width: 0.6rem; height: 0.6rem; }

/* The route line: the same purple core over the pale casing the map draws, flattened. */
.plp-key-line {
    width: 1.4rem;
    height: 0.3rem;
    border-radius: 0.15rem;
    display: inline-block;
    background: #7c3aed;
    box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.9), 0 0 0 2px rgba(0, 0, 0, 0.18);
    flex: 0 0 auto;
}

/* The numbered plan pin. Deliberately the same 24px/12px/700 construction as
   .itin-map-pin span in styles_shared.css — a key swatch that is merely "a circle with a
   number" would not be recognizable as the thing on the map. */
.plp-key-num {
    width: 1.35rem;
    height: 1.35rem;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 2px solid #ffffff;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
    background: #2563eb;
    color: #ffffff;
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: 700;
    font-style: normal;
    line-height: 1;
    flex: 0 0 auto;
}
.plp-key-num.is-done { background: #16a34a; }
.plp-key-num.is-off { background: #dc2626; }
/* 🔑 THE HOLLOW ONE MIRRORS THE MAP EXACTLY, INK AND ALL: white fill, #1f2937 digit, the
   status color moved into the ring. itinerary-pins.js documents why the digit is not
   painted in the status color — #16a34a on white is 3.0:1 at this size. */
.plp-key-num.is-approx {
    background: #ffffff;
    color: #1f2937;
    border-color: #2563eb;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
}

/* The "2 ·" sample standing in for a route caption's number, and the ≈ chip. Both are
   type, not pins, so they carry the caption's own weights. */
.plp-key-seq {
    font-style: normal;
    font-weight: 800;
    color: #1d4ed8;
    font-size: var(--font-size-sm, 0.875rem);
    white-space: nowrap;
}
/* 🛑 #b45309 AND NO DARK OVERRIDE — the same value, for the same reason, as the chip on
   the map: it has to read on the white caption there, and here it is simply the same
   glyph quoted back. 5.02:1 on white, 4.6:1 on this card's muted surface. */
.plp-key-approx { font-style: normal; font-weight: 800; color: #b45309; }
.plp-key-warn { font-style: normal; color: #b45309; }
/* The "this numbering is currently OFF" sample: the same "2 ·" glyph struck through and
   dimmed, so the row reads as "not this one" at a glance rather than only in the prose.
   🛑 A TOKEN, NOT A LITERAL — unlike every swatch above, this one is TYPE on the card and
   never sits on a map tile, so it must follow the theme like the text beside it. */
.plp-key-seq.is-off {
    font-weight: 700;
    color: var(--color-text-muted, #5a6472);
    text-decoration: line-through;
    opacity: 0.8;
}

/* ── "Numbers on the map" — the one-or-the-other chooser (owner, 2026-09-04) ──
   🛑 IT SITS OUTSIDE THE COLLAPSED KEY, ABOVE IT, and that is the point: the key explains
   the confusion, this is the control that ends it, and a control inside a shut <details>
   is a control nobody finds. Styled as map furniture like .park-map-settings — it belongs
   to the map, not to the filters above it, which is the same distinction .cs-overlays is
   boxed to make on CampSites. */
.plp-key-numbering {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin-top: 0.5rem;
}
.plp-key-numbering .input-label { margin: 0; font-size: var(--font-size-sm, 0.875rem); }
/* Sized to its longest option rather than stretched to the card: this is a small setting
   under a map, and a full-width control here reads as a filter. */
.plp-key-numbering .dropdown { width: auto; max-width: 100%; font-size: var(--font-size-sm, 0.875rem); padding: 0.2rem 0.4rem; }

@media (max-width: 700px) {
    .plp-key-list { font-size: var(--font-size-xs, 0.75rem); }
    .plp-key-sym { min-width: 1.9rem; }
    /* Label above the control on a phone — side by side, the select is squeezed to a few
       characters and both options truncate to the same visible text. */
    .plp-key-numbering { flex-direction: column; align-items: stretch; gap: 0.2rem; }
    .plp-key-numbering .dropdown { width: 100%; }
}

/* Popup content */
.gps-pop-name { font-weight: 700; font-size: var(--font-size-base); }
.gps-pop-type { font-size: var(--font-size-xs); color: var(--color-text-muted, #5a6472); margin-top: 1px; }
.gps-pop-meta { font-size: var(--font-size-sm); margin-top: 3px; }
.gps-pop-addr { font-size: var(--font-size-sm); margin-top: 3px; }
.gps-pop-dist { font-size: var(--font-size-sm); font-weight: 600; margin-top: 3px; }
.gps-pop-drive { color: var(--color-text-muted, #5a6472); font-weight: 500; }
.gps-pop-links { margin-top: 5px; display: flex; flex-wrap: wrap; gap: 0.5rem; font-size: var(--font-size-sm); }
.gps-open   { color: #16a34a; font-weight: 600; }
.gps-closed { color: #dc2626; font-weight: 600; }
/* "Permanently/Temporarily closed" — free on every search via businessStatus. */
.gps-pop-status { font-size: var(--font-size-sm); font-weight: 600; color: #dc2626; margin-top: 3px; }
.gps-li-closed  { color: #dc2626; font-weight: 600; }

/* Per-popup "hide this place" control (and the anon login nudge). */
.gps-pop-pref { margin-top: 6px; padding-top: 5px; border-top: 1px solid var(--color-border, #d7dbe0); font-size: var(--font-size-sm); }
.gps-pref-hide { background: none; border: 0; padding: 0; cursor: pointer; color: var(--color-danger, #dc2626); font: inherit; }
.gps-pref-hide:hover { text-decoration: underline; }

/* Persistent "manage hidden places" bar under the results card. */
.gps-hidden-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.75rem; }
.gps-hidden-note { margin: 0; }
.gps-hidden-open { background: none; border: 0; padding: 0; cursor: pointer; color: var(--color-link, #2563eb); font: inherit; text-decoration: underline; }

/* Hidden-places manager list (inside the modal). */
.gps-hidden-list { list-style: none; margin: 0; padding: 0; }
.gps-hidden-item { display: flex; align-items: center; flex-wrap: wrap; gap: 0.5rem; padding: 8px 0; border-bottom: 1px solid var(--color-border, #d7dbe0); }
.gps-hidden-item .gps-hidden-name, .gps-hidden-item .gps-hidden-link { flex: 1 1 auto; min-width: 0; }
.gps-hidden-item .gps-pref-unhide { flex: 0 0 auto; margin-left: auto; }
.gps-hidden-loading, .gps-hidden-empty { color: var(--color-text-muted, #5a6472); padding: 8px 0; }

/* ── DARK MAP (Preferences → Maps = Dark, owner 2026-09-14) ──────────────────────
   Site.Master's early <head> script stamps data-map="dark" on <html> before this sheet
   parses (SiteMaster.IsMapDark), so the first tile paints dark — no light flash. Default
   is Light, and anonymous / demo visitors always get Light. Independent of Color Scheme.

   🔑 THE SELECTOR IS THE SCOPE. It matches only an <img class="leaflet-tile"> whose src is
   tile.openstreetmap.org (with or without the {s}. subdomain), so the weather-radar frames,
   the BLM surface-management layer (gis.blm.gov) and the National Forest export layer keep
   their real colors, and markers, polylines, popups and controls — which live in other
   panes — are never touched. No tileLayer() call needed editing, and a NEW map page
   inherits this for free.
   invert + hue-rotate(180deg) keeps hue meaning (water stays blue, parks stay green). Do NOT
   grayscale these: on CampSites, Parks, Trails and Places Near Me the color is content.
   The container background covers tiles that have not loaded yet, which otherwise flash
   white while panning. The `html` prefix outranks leaflet.css, which map pages link AFTER
   the bundle (same reason as the popup rule below). */
html[data-map="dark"] .leaflet-container { background: #1f2328; }
html[data-map="dark"] .leaflet-container img.leaflet-tile[src*="tile.openstreetmap.org"] {
    filter: invert(1) hue-rotate(180deg) brightness(0.92) contrast(0.88);
}

/* Re-theme Leaflet's popup chrome for dark mode.
   The `html` prefix is load-bearing, not decoration: every map page links
   Content/leaflet.css from its own HeadContent, which renders AFTER the bundled
   stylesheets — so leaflet.css's own `.leaflet-popup-content-wrapper { background: white;
   color: #333 }` won on source order at equal specificity, and dark-mode popups came out
   as light text on a white card. The extra element selector outranks it regardless of
   order. Same reason for the map container / control rules below. */
html .leaflet-popup-content-wrapper,
html .leaflet-popup-tip {
    background: var(--color-bg-card, #fff);
    color: var(--color-text, #222);
}
.leaflet-popup-content { margin: 0.6rem 0.8rem; line-height: 1.35; }
.leaflet-popup-content a { color: var(--color-primary, #3b6fb0); }

/* Keep every Leaflet map INSIDE its own stacking context. Leaflet gives its control
   corners `z-index: 1000` and its panes 200-700; the map container itself is
   `position: relative; z-index: auto`, so it never boxed them in and those numbers
   competed directly with the page chrome. The mobile nav menu is a fixed panel at
   z-index 999 (--nav-z minus 1), so opening the menu over a map left the zoom +/-,
   the 📌 add control, the layers box ("My Places" / "This Trip") and the "Leaflet"
   attribution floating on top of it. A z-index of 0 on the positioned container makes
   all of that local, so nothing from a map can ever paint over site chrome. */
html .leaflet-container { z-index: 0; isolation: isolate; }

@media (max-width: 560px) {
    .gps-search-row .button { flex: 1 1 auto; }
}

/* ── Places Near Me: slider, route picker, extras (added with the corridor/brand update) ── */
.gps-dot-purple { background: #7c3aed; }

.gps-slider {
    width: 100%;
    accent-color: var(--color-primary, #3b6fb0);
    cursor: pointer;
    height: 1.4rem;
}

.gps-route-options {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem;
    margin-top: 0.6rem;
}
.gps-route-opt {
    border: 1px solid var(--color-border, #cfd4dc);
    background: var(--color-bg-card, #fff);
    color: var(--color-text, #222);
    border-radius: 999px;
    padding: 0.2rem 0.7rem;
    font-size: var(--font-size-sm);
    cursor: pointer;
}
.gps-route-opt:hover { border-color: var(--color-primary, #3b6fb0); }
.gps-route-opt.active {
    background: #7c3aed;
    border-color: #7c3aed;
    color: #fff;
    font-weight: 600;
}

.gps-pop-loading { font-size: var(--font-size-sm); color: var(--color-text-muted, #5a6472); font-style: italic; }

/* ── Places Near Me: two-distance sliders, Open Until, location line, counter ── */

/* Radius (how far OFF) and Distance Along Route (how far AHEAD) sit side by side so
   the pair reads as one decision rather than two unrelated knobs. */
.gps-sliders {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1.5rem;
    margin-top: 0.75rem;
}
.gps-slider-group { display: flex; flex-direction: column; gap: 0.15rem; min-width: 220px; flex: 1 1 260px; }
.gps-slider-group .input-label { margin-bottom: 0; }
.gps-slider-group output { font-weight: 700; color: var(--color-primary, #3b6fb0); }
.gps-slider-group .note { margin: 0; font-size: var(--font-size-xs); }
/* Dimmed, not hidden: the slider stays on screen so its relationship to Radius is
   still legible while it's inapplicable. */
.gps-slider-group.gps-slider-off { opacity: 0.45; }
.gps-slider-group.gps-slider-off .gps-slider { cursor: not-allowed; }
/* Radius / Distance Along Route are dropdowns now (were sliders) — full width of their
   column so they're an easy tap target and can't be nudged like the old sliders. */
.gps-slider-group .gps-dist-select { width: 100%; }

.gps-openuntil { display: inline-flex; align-items: center; gap: 0.5rem; }
.gps-openuntil .dropdown { width: auto; padding-top: 0.2rem; padding-bottom: 0.2rem; }
.gps-openuntil .input-label { margin-bottom: 0; }

/* The position every distance on the page is measured from. */
.gps-you-label {
    margin: 0.4rem 0 0 0;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}
.gps-you-warn { color: #b45309; font-weight: 600; }
[data-theme="dark"] .gps-you-warn { color: #fbbf24; }

/* 📍 Use My Location and the place it resolved to, side by side on one line. */
.gps-locate-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem 0.8rem;
}
.gps-locate-row .gps-you-label { margin: 0; }
/* One-tap "search from home" button, to the LEFT of Use My Location. Same visual weight as
   that button on purpose - they are two answers to the same question. */
.gps-locate-row .gps-home-origin { margin: 0; width: auto; }

.gps-refresh-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.9rem;
    margin-top: 0.6rem;
}
/* Live "what will this search cost" quote, next to Refresh. */
.gps-estimate {
    margin: 0;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}
.gps-estimate-high { color: #b45309; font-weight: 600; }
[data-theme="dark"] .gps-estimate-high { color: #fbbf24; }

/* "API Usage & Costs" is a collapsible <details> card, collapsed by default. Its
   summary is the heading — force display:list-item so the disclosure triangle survives
   the .input-label (inline-block) class, and raise specificity over that later-loaded
   shared rule. */
.gps-usage-card > summary {
    display: list-item;
    list-style-position: inside;
    cursor: pointer;
    margin-bottom: 0;
}
.gps-usage-card[open] > summary { margin-bottom: 0.75rem; }

/* Real per-user totals read from plp_ApiCalls. */
.gps-usage {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.3rem 1.1rem;
    margin-top: 0.6rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}
.gps-usage-label { font-weight: 600; }
.gps-usage-item b {
    color: var(--color-text, #222);
    font-variant-numeric: tabular-nums;
    margin-left: 0.2rem;
}
[data-theme="dark"] .gps-usage-item b { color: var(--color-text, #e8ecf1); }
.gps-usage-note { margin-top: 0.25rem; }
/* Flags the runs that actually cost something — a cache hit leaves it plain. */
.gps-api-bump { color: #b91c1c !important; }
[data-theme="dark"] .gps-api-bump { color: #fca5a5 !important; }

/* Collapsible cost breakdown. */
.gps-cost-explain {
    margin-top: 0.85rem;
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: var(--border-radius, 6px);
    padding: 0.4rem 0.7rem;
}
.gps-cost-explain > summary {
    cursor: pointer;
    font-weight: 600;
    font-size: var(--font-size-sm);
    list-style: revert;
}
.gps-cost-explain[open] > summary { margin-bottom: 0.6rem; }
.gps-cost-explain-body > .note:first-child { margin-top: 0; }
/* Wide table scrolls in its own box rather than pushing the page sideways. */
.gps-cost-tablewrap { overflow-x: auto; margin: 0.5rem 0 0.9rem 0; }
.gps-cost-table { border-collapse: collapse; width: 100%; font-size: var(--font-size-sm); }
.gps-cost-table th, .gps-cost-table td {
    border-bottom: 1px solid var(--color-border, #cfd4dc);
    padding: 0.35rem 0.6rem;
    text-align: left;
    vertical-align: top;
}
.gps-cost-table th { font-weight: 700; white-space: nowrap; }
.gps-cost-table td:nth-child(2) { white-space: nowrap; }
.gps-cost-table tr.gps-cost-warn td { background: #fef9c3; }
.gps-cost-table tr.gps-cost-free td { background: #dcfce7; }
[data-theme="dark"] .gps-cost-table tr.gps-cost-warn td { background: rgba(161,98,7,0.22); }
[data-theme="dark"] .gps-cost-table tr.gps-cost-free td { background: rgba(21,128,61,0.22); }
.gps-cost-cats { margin: 0.35rem 0 0 1.1rem; padding: 0; font-size: var(--font-size-sm); }
.gps-cost-cats li { margin-bottom: 0.15rem; }

.gps-pop-nodetail { font-size: var(--font-size-sm); color: var(--color-text-muted, #5a6472); font-style: italic; }
.gps-pop-phone, .gps-pop-hours { font-size: var(--font-size-sm); margin-top: 0.15rem; }
.gps-pop-hours { color: var(--color-text-muted, #5a6472); }

.gps-pop-until { font-size: var(--font-size-sm); color: #15803d; font-weight: 600; margin-top: 0.15rem; }
.gps-pop-nohours { color: var(--color-text-muted, #5a6472); font-weight: 400; font-style: italic; }
[data-theme="dark"] .gps-pop-until { color: #86efac; }
[data-theme="dark"] .gps-pop-nohours { color: #9aa4b2; }

/* Cost warning modal (uses the shared .modal-overlay/.modal-box shell). */
.gps-cost-overlay { z-index: 1200; }
.gps-cost-box { max-width: 520px; border-top: 5px solid #d97706; }
.gps-cost-title { color: #b45309; }
[data-theme="dark"] .gps-cost-title { color: #fbbf24; }
/* Corner × — same dismiss as "Got It". Only the cost modal has one, so the
   title's clearance for it is keyed off the button actually being there. */
.gps-cost-close {
    position: absolute;
    top: 6px;
    right: 8px;
    width: 32px;
    height: 32px;
    border: none;
    background: transparent;
    color: var(--color-text-muted, #5a6472);
    font-size: 24px;
    line-height: 1;
    cursor: pointer;
    border-radius: 50%;
}
.gps-cost-close:hover { background: var(--color-bg-input); color: var(--color-text); }
.gps-cost-close + .gps-cost-title { padding-right: 2rem; }
.gps-cost-body p { margin: 0 0 0.7rem 0; line-height: 1.5; }
.gps-cost-body p:last-child { margin-bottom: 0; }
.gps-cost-good {
    background: #dcfce7;
    color: #15803d;
    border-radius: var(--border-radius, 6px);
    padding: 0.5rem 0.7rem;
    font-weight: 600;
}
[data-theme="dark"] .gps-cost-good { background: rgba(21,128,61,0.28); color: #86efac; }

/* ── Places Near Me: results list, trip stops, budget + busy state ───────────── */

/* Pick a destination straight off the selected trip instead of retyping it. */
.gps-tripstops {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-top: 0.55rem;
}
.gps-tripstops .gps-trip-stop { margin: 0; width: auto; }

/* One-tap "route home" buttons from the signed-in user's profile (street address / city). */
.gps-homedests {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-top: 0.55rem;
}
.gps-homedests .gps-homedest-btn { width: auto; }

/* Site-wide daily budget sits apart from the per-user figures — it answers a
   different question, so it reads as its own item rather than a fifth total. */
.gps-usage-left {
    border-left: 1px solid var(--color-border, #cfd4dc);
    padding-left: 0.75rem;
    color: var(--color-text-muted, #5a6472);
}
.gps-api-low { color: #b91c1c !important; }
[data-theme="dark"] .gps-api-low { color: #fca5a5 !important; }

/* Past a monthly free allowance: every further call of that SKU is billed, so this is
   a stronger state than the "getting close" warning above, not the same one. */
.gps-api-over { color: #b91c1c !important; font-weight: 700; text-decoration: underline; }
[data-theme="dark"] .gps-api-over { color: #fca5a5 !important; }
/* The month row is a second line of the same strip — separate it without a hard rule. */
.gps-usage-month { margin-top: 0.15rem; }

/* "Last search: 3 new API calls · 47 from saved cache" */
.gps-lastrun { margin: 0.35rem 0 0; font-size: var(--font-size-sm, 0.875rem); }
.gps-lastrun-free { color: #15803d; }
[data-theme="dark"] .gps-lastrun-free { color: #86efac; }

/* Per-API table. Wide content scrolls inside its own box so the page never does. */
.gps-byapi { margin-top: 0.5rem; }
.gps-byapi > summary { cursor: pointer; font-weight: 600; }
.gps-byapi-wrap { overflow-x: auto; }
.gps-byapi-table { width: 100%; border-collapse: collapse; font-size: var(--font-size-sm, 0.875rem); margin-top: 0.4rem; }
.gps-byapi-table th, .gps-byapi-table td { text-align: left; padding: 0.25rem 0.6rem 0.25rem 0; white-space: nowrap; }
.gps-byapi-table .gps-num { text-align: right; font-variant-numeric: tabular-nums; }
.gps-byapi-table .gps-byapi-ep { font-family: var(--font-mono, monospace); font-size: var(--font-size-sm, 0.875rem); opacity: 0.75; }
.gps-byapi-table tbody tr + tr td { border-top: 1px solid rgba(128, 128, 128, 0.25); }
.gps-paid { color: #b91c1c; font-weight: 600; }
.gps-free { color: #15803d; }
[data-theme="dark"] .gps-paid { color: #fca5a5; }
[data-theme="dark"] .gps-free { color: #86efac; }

/* A search is in flight: dim the map so the pins on screen don't read as final. */
.gps-map.gps-map-busy { opacity: 0.6; transition: opacity 0.15s ease; }

/* "N more were hidden by Name Must Match" + its one-click, zero-cost reveal. */
.gps-hidden-note { color: var(--color-text-muted, #5a6472); }
.gps-link-btn {
    background: none;
    border: 0;
    padding: 0;
    font: inherit;
    color: var(--color-primary, #3b6fb0);
    text-decoration: underline;
    cursor: pointer;
}
.gps-link-btn:hover, .gps-link-btn:focus-visible { text-decoration: none; }

/* ── The results list ── */
.gps-list-wrap { padding-top: 0.9rem; }
.gps-list-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 0.6rem;
    margin-bottom: 0.6rem;
}
.gps-list-tools { display: flex; align-items: center; flex-wrap: wrap; gap: 0.5rem; }
.gps-list-tools .dropdown { width: auto; padding-top: 0.2rem; padding-bottom: 0.2rem; }
.gps-list-filterbox { flex: 0 1 240px; min-width: 170px; }

.gps-list {
    list-style: none;
    margin: 0;
    padding: 0;
    /* Long sweeps return hundreds of rows; keep the map reachable without a marathon
       scroll, and let the list scroll inside itself. */
    max-height: 26rem;
    overflow-y: auto;
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: var(--border-radius, 6px);
}
.gps-li { margin: 0; padding: 0; border-bottom: 1px solid var(--color-border, #cfd4dc); }
.gps-li:last-child { border-bottom: 0; }
.gps-li-btn {
    display: flex;
    align-items: flex-start;
    gap: 0.7rem;
    width: 100%;
    text-align: left;
    background: none;
    border: 0;
    padding: 0.5rem 0.7rem;
    cursor: pointer;
    color: inherit;
    font: inherit;
}
.gps-li-btn:hover, .gps-li-btn:focus-visible { background: var(--color-hover-wash, #eef1f5); }
.gps-li-dist {
    flex: 0 0 auto;
    min-width: 4.2rem;
    display: flex;
    flex-direction: column;
    font-weight: 700;
    font-size: var(--font-size-sm);
    color: var(--color-primary, #3b6fb0);
    padding-top: 0.1rem;
}
/* Drive time under the distance — lighter, so distance still reads first. */
.gps-li-time {
    font-weight: 500;
    font-size: var(--font-size-xs);
    color: var(--color-text-muted, #5a6472);
}
/* Faint pulse on the list while drive times are being fetched. */
.gps-list-wrap.gps-times-loading .gps-li-time { opacity: 0.5; }
.gps-li-main { display: flex; flex-direction: column; gap: 0.05rem; min-width: 0; }
.gps-li-name { font-weight: 600; }
.gps-li-sub, .gps-li-addr {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted, #5a6472);
    overflow-wrap: anywhere;
}
.gps-li-open { color: #15803d; font-weight: 600; }
[data-theme="dark"] .gps-li-open { color: #86efac; }
/* "Park details · ★ Rate" under a catalog row (park / trail / camp site). A SIBLING of
   .gps-li-btn, never a child — an <a> inside a <button> is invalid markup the browser
   hoists back out. The left inset lines the links up with .gps-li-name above them:
   the button's own 0.7rem padding + .gps-li-dist's 4.2rem column + the 0.7rem gap. */
.gps-li-acts {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.35rem;
    padding: 0 0.7rem 0.5rem 5.6rem;
    margin-top: -0.35rem;
    font-size: var(--font-size-xs);
}
.gps-li-actsep { color: var(--color-text-muted, #5a6472); }
.gps-li-empty {
    padding: 0.7rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
    font-style: italic;
}

@media (max-width: 560px) {
    .gps-list-head { align-items: stretch; }
    .gps-list-filterbox { flex: 1 1 100%; }
    .gps-usage-left { border-left: 0; padding-left: 0; }
}

/* ── ApiUsage.aspx: outbound provider volume/cost table ──────────────────────── */
.au-provider-head { margin-bottom: 0.75rem; font-size: var(--font-size-base); }
.au-cost {
    display: inline-block;
    padding: 0.05rem 0.5rem;
    border-radius: 999px;
    font-size: var(--font-size-xs);
    font-weight: 700;
    line-height: 1.5;
}
.au-cost-paid     { background: #fee2e2; color: #b91c1c; }
.au-cost-free     { background: #dcfce7; color: #15803d; }
.au-cost-freemium { background: #fef9c3; color: #a16207; }
.au-cost-unknown  { background: var(--color-hover-wash, #eef1f5); color: var(--color-text-muted, #5a6472); }
[data-theme="dark"] .au-cost-paid     { background: rgba(185,28,28,0.28);  color: #fca5a5; }
[data-theme="dark"] .au-cost-free     { background: rgba(21,128,61,0.28);  color: #86efac; }
[data-theme="dark"] .au-cost-freemium { background: rgba(161,98,7,0.30);   color: #fde047; }
/* "460 / 5,000" against a monthly free allowance. Three states, because "nearly out"
   and "already billing" are different decisions for the reader. */
.au-quota { font-variant-numeric: tabular-nums; font-weight: 600; }
.au-quota-ok   { color: #15803d; }
.au-quota-near { color: #a16207; }
.au-quota-over { color: #b91c1c; text-decoration: underline; }
[data-theme="dark"] .au-quota-ok   { color: #86efac; }
[data-theme="dark"] .au-quota-near { color: #fde047; }
[data-theme="dark"] .au-quota-over { color: #fca5a5; }

.au-quota-card { margin: 0.75rem 0 1.25rem; }
.au-quota-card .heading { margin-bottom: 0.4rem; }

.au-provider-table code { font-size: var(--font-size-xs); word-break: break-all; }
.au-provider-table th, .au-provider-table td { white-space: nowrap; }
.au-provider-table td.small-dim-text { white-space: normal; min-width: 180px; }

/* ============================================================
   Parks (Parks.aspx / Park.aspx) — page-scoped rules.
   Reuses shared components (.main-card, .pill, .trip-filter-chip,
   .empty-state, .dropdown, .textbox); only the .park-* specifics live here.
   ============================================================ */
/* Segmented toggles (All/My Parks, List/Map) use the same fully-themed treatment as
   .trip-filter-chip, which sits right below them: an outlined pill when idle, solid
   brand cyan when active. The previous version referenced design tokens that DON'T
   EXIST in this system (--surface / --surface-2 / --text / --text-muted / --brand), so
   every value fell back to a hard-coded light color — unreadable in dark mode (dark
   text on a dark pill) and off-palette in light mode. */
.park-scope-toggle { display: inline-flex; gap: .4rem; margin-bottom: 1rem; }
/* (.park-view-btn shared these rules until 2026-07-26, when the List/Map toggle was
   retired — Parks now shows the map AND the list, always.) */
.park-scope-btn {
    border: 1px solid var(--color-border);
    background: var(--color-bg-card);
    color: var(--color-text-muted);
    border-radius: 999px;
    cursor: pointer;
    font-weight: 600;
    padding: .4rem 1.1rem;
    transition: background-color var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
}
.park-scope-btn:hover { background: var(--color-primary-light); color: var(--color-primary-dark); border-color: var(--color-primary); }
.park-scope-btn.is-active { background: var(--color-primary); border-color: var(--color-primary); color: #fff; }

.park-filter-row { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-bottom: .75rem; }
.park-search-input { flex: 1 1 220px; min-width: 180px; }
.park-filter-row .dropdown { flex: 0 1 auto; }
/* An inline caption for a control in the filter row that cannot name itself — today that is
   only Trails' four Shape checkboxes, which have no resting-state text of their own. (The
   dropdowns all do: "All states", "Any difficulty", "Any feature".)
   The base .input-label carries a .25rem bottom margin for stacked form groups, which in a
   centerd flex row lifts the caption off the control's baseline. 🔑 The specificity here
   (0,2,0) is what makes this stick: styles_shared.css loads AFTER this file, so a bare
   .input-label override would be dead. Same construction as .mp-sort .input-label. */
.park-filter-row .input-label { margin-bottom: 0; white-space: nowrap; }
/* The search box's own row, sitting directly on top of the "N parks · page X of Y" line
   and the list (owner, 2026-08-25). It is a FLEX container purely so .park-search-input's
   `flex: 1 1 220px` still has a flex parent to grow in — moved into a plain block the box
   collapsed to its intrinsic width and read as a stray control instead of the header of
   the list under it. Nothing else lives in the row, and that is deliberate: the four
   dropdowns stayed behind in .park-filter-row at the top of the card. */
.park-search-row { display: flex; align-items: center; gap: .5rem; margin: .75rem 0 .35rem; }

/* Size-filter hint: sits on its own line under the filter row when a size is picked. */
.park-size-hint { flex-basis: 100%; margin-top: -.25rem; font-style: italic; }

/* One-line gloss on the active quick chip. Sits tight under the chip row so it reads as
   that row's caption rather than as a standalone note, and it collapses to nothing on the
   All chip (hidden attribute) so the filters don't shift down by a line on every page. */
.park-chip-note { margin: -.15rem 0 .5rem; font-style: italic; }

/* Activity filter: a collapsible chip group under the quick chips. */
.park-activity-filter { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; margin: .1rem 0 .6rem; }
#parkActToggle.has-active { color: var(--color-primary); font-weight: 600; }
.park-act-chips { margin-top: .35rem; flex-basis: 100%; }

.park-list { list-style: none; margin: .5rem 0 0; padding: 0; }
/* THE <li> IS THE ROW, the <a> is only its left-hand part. It used to be the other way
   round — one anchor filling the whole row — until the ＋ Add to Itinerary button arrived,
   and a <button> cannot live inside an <a> (invalid, and browsers un-nest it on parse). So
   the flex row moved out to the <li> and the anchor kept everything it always wrapped.
   flex-wrap + a `1 1 15rem` basis on the link is what makes the narrow case work: below
   roughly 26rem the button drops onto its own line, right-aligned, instead of squeezing the
   park name down to one word per line. */
/* ⚠ justify-content: flex-end ADDED 2026-08-25, AND IT IS NOT COSMETIC — see the 🔴 note on
   .park-item-been below. On the FIRST line it does nothing: the tick's `margin-left: auto`
   has already eaten the free space (auto margins are served before flex-grow, which is also
   why the link does not stretch). It exists for the line the ＋ Add to Itinerary button
   WRAPS onto, where it is the only item: killing that button's own auto margin — which the
   sibling rule below has to do — otherwise left-aligns it under the park name. Measured at a
   360px row: without this the button landed 204px from the right edge it used to hug. */
.park-list-item { border-bottom: 1px solid var(--color-border); display: flex; align-items: center; flex-wrap: wrap; justify-content: flex-end; }
.park-item-link { display: flex; align-items: center; gap: .75rem; padding: .7rem .25rem; text-decoration: none; color: inherit; flex: 1 1 15rem; min-width: 0; }
/* Symmetric vertical margins ON PURPOSE: they give the button breathing room on the line
   it wraps onto, and because the row is align-items:center they cancel out rather than
   shifting it off-center when it does not wrap. */
.park-item-itin { flex: 0 0 auto; margin: .4rem .25rem .4rem auto; white-space: nowrap; }
.park-item-itin:disabled { opacity: .65; cursor: default; }
/* Row-level "Been!" tick (owner, 2026-08-25 — asked for at the START of the row, then
   moved to the right with a small label in the same breath; the label was shortened from
   "Been Here!" to "Been!" on 2026-08-26). Same `margin-left: auto` trick
   as .park-item-itin: it is what right-aligns the control on a wide row and lets it drop
   onto its own line, still right-aligned, once the park name needs the width.
   🔴 TWO ITEMS MUST NOT BOTH CLAIM THE AUTO MARGIN. When a trip is selected this site
   renders the itinerary button right after this label, and flexbox SPLITS the free space
   between two auto margins — measured on a 1000px row, that put a 260px gap on EACH side of
   the tick. The sibling rule below hands the alignment to this label and gives the button a
   plain gap. (qMEET never renders that button — plpCurrentTrip is a hard-coded null there —
   so this only ever bites HERE, which is why the rule lives in both sheets anyway.)
   🛑 AND THAT OVERRIDE IS WHY .park-list-item NEEDS justify-content: flex-end. Taking the
   auto margin off the button fixes the wide row and breaks the NARROW one, where the button
   wraps onto a line of its own and that margin was the only thing right-aligning it. The two
   rules are one fix; changing either alone regresses a width. Verified 2026-08-25 at 320 /
   360 / 400 / 480 / 600 / 760 / 1000px: the tick sits 4px off the right edge at every one,
   and nothing overflows its row. */
.park-item-been {
    display: inline-flex; align-items: center; gap: .35rem; flex: 0 0 auto;
    margin: .4rem .25rem .4rem auto; white-space: nowrap; cursor: pointer;
    font-size: var(--font-size-xs, 0.75rem); color: var(--color-text-muted); user-select: none;
}
.park-item-been > input { flex: 0 0 auto; margin: 0; }
.park-item-been.is-on { color: #1e7a42; font-weight: 600; }
.park-item-been + .park-item-itin { margin-left: .5rem; }
.park-item-link:hover { background: var(--color-primary-light); }
.park-item-main { display: flex; flex-direction: column; gap: .1rem; flex: 1 1 auto; min-width: 0; }
.park-item-name { font-weight: 600; color: var(--color-text); }
.park-item-meta { font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.park-item-badges { display: flex; flex-wrap: wrap; gap: .3rem; flex: 0 0 auto; }
.park-badge-visited { background: #e6f4ea; color: #1e7a42; }
.park-badge-next    { background: #e7effd; color: #1b4fa0; }
.park-badge-high    { background: #fdefe7; color: #a0521b; }
.park-badge-fav     { background: #fdf3d6; color: #8a6d1b; }
.park-badge-rating  { background: #f0edfb; color: #5a3ea0; }
.park-badge-pending { background: #fbe9e9; color: #a02c2c; }
.park-badge-hidden  { background: #eceff3; color: #5a6472; }
/* A revealed hidden park reads as muted so it's clearly not part of the normal list. */
.park-list-item[data-hidden="1"] .park-item-name { opacity: .7; }
.park-total-line { margin-top: 1rem; }

.park-facts { display: grid; grid-template-columns: max-content 1fr; gap: .35rem 1rem; }
.park-fact { display: contents; }
.park-fact-label { font-weight: 600; color: var(--color-text-muted); }
.park-fact-value { color: var(--color-text); }
.park-activity-chips { display: flex; flex-wrap: wrap; gap: .3rem; }
.park-activity-chip { background: var(--color-primary-light); color: var(--color-primary); }
.park-links { display: flex; flex-wrap: wrap; gap: .5rem; }

/* No dark-mode overrides needed for the toggles or the row hover — the base rules now
   use themed tokens (--color-primary / --color-primary-light) that flip automatically. */

/* ── Park.aspx "Your Record" interactive panel ─────────────────────────────── */
.park-community { display: flex; align-items: baseline; gap: .6rem; flex-wrap: wrap; }
.park-community-score { font-size: 1.35rem; font-weight: 700; color: var(--color-text); }
.park-community-line { color: var(--color-text-muted); }

.park-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
/* 🔴 .park-onlist / .park-onlist-pill ARE GONE (2026-08-25). The "✓ On your list" pill and
   its wrapper span were deleted from Park.aspx's action row along with the ✓ Been Here?
   button they sat beside (owner: "then we dont need the 'On your list' pill"). Membership
   is now said by the row itself — "＋ Add to My List" turns into "Remove from My List"
   — so a pill that only ever appeared next to that button was repeating it. Their two
   dark-mode twins went with them; grep says nothing else on any of the five sites ever
   used either class. Do not re-add the CSS without the markup. */
/* Park.aspx's "I've Been Here!" tick, the detail-page half of the pair whose list-row half
   is .park-item-been above. Deliberately NOT styled like a .checkbox row elsewhere on the
   page: it sits INSIDE .park-actions, in line with real buttons, so it carries the same
   vertical rhythm as them rather than the tighter one the form checkboxes use. */
.park-been-label {
    display: inline-flex; align-items: center; gap: .4rem; margin: 0;
    cursor: pointer; user-select: none; font-weight: 600; color: var(--color-text);
}
.park-been-label > input { flex: 0 0 auto; margin: 0; }
.park-been-label.is-on { color: #1e7a42; }
/* 🔴 SPECIFICITY, NOT COLOR, IS WHY THESE ARE WRITTEN THIS WAY — do not "tidy" the
   leading .button off any of the three selectors below.
   Every one of these elements is a `class="button transparent small park-*"`.
   `.button.transparent` lives in Shared/styles_shared.css, which Bundle.config loads
   AFTER this file, so at EQUAL specificity the shared rule wins. `.park-choice.active`
   (0,2,0) therefore lost to `.button.transparent` (0,2,0) and the selected chip
   rendered byte-identical to an unselected one: "Priority to Go?" and "Would You
   Return?" both looked completely dead on click, and .park-fav-btn.active's gold was
   never seen either (the star glyph swap was carrying that control single-handed).
   Owner reported both groups as doing nothing, 2026-08-11.
   Adding `.button` makes each 0,3,0 and it wins. See CLAUDE.md → Front-end. */
.button.park-fav-btn.active { color: #8a6d1b; border-color: #d9b94b; }

.park-btn-group { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; margin-top: .35rem; }
.button.park-choice.active {
    background: var(--color-primary); color: #fff; border-color: var(--color-primary);
}
/* ⚠ And the :hover twin is NOT optional. `.button.transparent:hover` in the shared sheet
   is (0,3,0) — the SAME weight as `.button.park-choice.active` — and still loads later,
   so without this the selected chip drops back to the pale outline style the moment the
   pointer touches it, i.e. exactly when the user is looking at it. */
.button.park-choice.active:hover {
    background: var(--color-primary-dark, #005a80); color: #fff;
    border-color: var(--color-primary-dark, #005a80);
}
/* The hide toggle has the same shape as the favorite one and had the same problem. */
.button.park-hide-btn.active { color: #5a6472; border-color: #97a1ad; }
.button.park-fav-btn.active:hover { color: #8a6d1b; border-color: #d9b94b; }
.button.park-hide-btn.active:hover { color: #5a6472; border-color: #97a1ad; }

.park-visits { display: flex; flex-direction: column; gap: .5rem; margin: .25rem 0 .75rem; }
.park-visit { border: 1px solid var(--color-border); border-radius: 8px; padding: .5rem .7rem; }
.park-visit-head { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }
.park-visit-date { font-weight: 600; color: var(--color-text); }
.park-visit-meta { font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.park-visit-del { margin-left: auto; font-size: var(--font-size-sm, 0.875rem); color: #a02c2c; background: none; border: 0; cursor: pointer; padding: 0; }
.park-visit-notes { margin-top: .3rem; color: var(--color-text); white-space: pre-wrap; }
.park-log-toggle { cursor: pointer; }
.park-log-form { margin-top: .6rem; }
.park-date-parts { display: flex; flex-wrap: wrap; gap: .75rem; }
.park-date-parts .form-group { flex: 1 1 140px; margin-bottom: 0; }
.park-year-input { max-width: 10rem; }

/* ── Parks map view ────────────────────────────────────────────────────────── */
.park-view-row { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: .25rem 0 .5rem; }
.park-map { height: 60vh; min-height: 320px; width: 100%; border-radius: 10px; border: 1px solid var(--color-border); }
.park-map-detail { height: 300px; min-height: 240px; }
/* Park.aspx's four map buttons — 📍 Check My Location · Google Maps ↗ · Google Place ↗ ·
   Check the Weather — as ONE evenly-sized set (owner, 2026-08-25: "arrange them all so
   they look better and make the sizes consistent").
   🔑 A GRID, NOT A FLEX ROW, AND THAT IS THE WHOLE POINT. They were two separate rows of
   flex before — one `.button transparent small` under the map and three full-size
   `.button transparent` in a .form-actions below the route info — so no two of the four
   were the same width and the two rows did not line up with each other. `1fr` columns make
   every button exactly as wide as its neighbors whatever the label says; auto-fit reflows
   4 → 2 → 1 columns as the card narrows, and each break still leaves a tidy block rather
   than a ragged tail.
   ⚠ 11rem is the floor because "📍 Check My Location" is the longest label at ~9.5rem plus
   padding; below that it would wrap mid-phrase.
   🔑 WHAT THAT ACTUALLY PRODUCES, MEASURED 2026-08-25 (card inner width → columns, and the
   buttons are equal-width at every one of them, with no overflow at any):
       320px → 1 · 360px → 2 · 400px → 2 · 480px → 2 · 600px → 2 · 760px → 4 · 1000px → 4
   ⚠ SO THE 2-COLUMN CASE — most phones — PUTS GOOGLE MAPS AND GOOGLE PLACE ON DIFFERENT
   ROWS (2nd and 3rd of four fall diagonally), which the retired .park-goog-links wrapper
   existed to prevent. That is a KNOWN, ACCEPTED trade, not an oversight: the 2026-08-20
   complaint was a ragged flex wrap that made the pair read as two unrelated buttons, and a
   symmetric 2×2 block does not — while the owner's 2026-08-25 instruction was that all FOUR
   be one consistently sized set, which is the rule that wins where they conflict. Do not
   "fix" it by reordering: the order is the owner's, and the only arrangement that pairs Maps
   with Place at 2 columns moves Check the Weather to second. */
.park-map-actions {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
    gap: .5rem; margin-top: .75rem;
}
/* justify-content, not just text-align: .button is a flex container on some variants and a
   block on others, so both axes have to be told to center or the labels sit left-ragged in
   half the buttons. min-width:0 lets a long label ellipsize instead of pushing the column. */
.park-map-actions > .button {
    width: 100%; min-width: 0; justify-content: center; text-align: center;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* 🔴 .park-goog-links IS GONE (2026-08-25). It existed only to keep Google Maps and Google
   Place from splitting across lines inside a wrapping .form-actions; the grid above governs
   all four buttons now, so there is no wrapping row left for it to protect them from.
   Grep says nothing else on any of the five sites used the class. */

/* Routing-engine options. On Park.aspx they sit in their own row under the map's
   buttons; on Parks.aspx the equivalent pair is rendered INSIDE the pin popup
   (.park-pop-engine below). Both are hidden until there is a location to route from,
   and absent entirely when GoogleRoutes_Enabled is false.
   ⚠ .park-toll-opt is gone — that was the old always-visible checkbox parked in the
   toolbar next to "Use My Location", which read as a list filter. */
/* align-items: flex-start, not center: once the long label wraps to two lines the
   checkbox must sit against the FIRST line, not float halfway down the block. The row
   gap is split (row .4rem / column .9rem) so two wrapped labels don't touch. */
.park-engine-row { display: flex; flex-wrap: wrap; align-items: flex-start; gap: .4rem .9rem; margin: .35rem 0 .25rem; }
/* ⚠ TWO CLASSES, DELIBERATELY. These labels also carry `class="checkbox"`, and the shared
   `label.checkbox` rule (styles_shared.css) is `align-items: center` at specificity (0,1,1)
   — a bare `.park-engine-opt` (0,1,0) LOSES to it, which parked the checkbox halfway down a
   two-line label instead of against its first line. Don't "simplify" this selector. */
.park-engine-row .park-engine-opt { display: inline-flex; align-items: flex-start; gap: .35rem; margin: 0; font-size: var(--font-size-sm, 0.875rem); line-height: 1.35; }
.park-engine-opt > input { flex: 0 0 auto; margin-top: .15rem; }

/* 🔴 THE LABEL TEXT MUST BE ONE FLEX ITEM. A <label> here is a flex container, so a bare
   text node and the .small-dim-text <span> after it are TWO items — and flex items in a
   box narrower than their content SHRINK rather than wrap, each bottoming out at its own
   longest word. "Use Google Routes (alternates + tolls; billed)" therefore came out as two
   ragged side-by-side columns on a phone, which is what the owner reported on 2026-08-12
   ("it's wrapping too much within their columns"). Wrapping the text in this span makes it
   one item, and one item flows as ordinary prose.
   🛑 DO NOT ADD min-width: 0 HERE. It was tried on 2026-08-12 and is actively harmful:
   the flex default of min-width: auto (= min-content = the longest word) is the FLOOR that
   keeps the text readable, and the site inherits overflow-wrap: break-word, so releasing
   that floor in a tight container collapses the span to 0px and breaks the sentence one
   character per line. Measured at the time: 0x777px. Leave the default alone.
   Used by BOTH surfaces: .park-engine-opt (Park.aspx) and .park-pop-opt (the Parks.aspx
   pin popup) — hence the neutral name.
   flex: 1 1 auto so the text takes the room the checkbox doesn't, rather than only its
   own content width. */
.park-opt-text { flex: 1 1 auto; }

.park-pop-name { font-weight: 700; margin-bottom: .15rem; }
.park-pop-dist { font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.park-pop-route-info { margin-top: .35rem; padding-top: .35rem; border-top: 1px solid var(--color-border); }
.park-pop-note { font-size: var(--font-size-xs, 0.75rem); color: var(--color-text-muted); margin-top: .2rem; }
.park-pop-actions { display: flex; align-items: center; gap: .6rem; margin-top: .5rem; flex-wrap: wrap; }
/* "Route" is a <button> — it acts on THIS map rather than navigating — drawn as a link,
   so the popup reads as one button (Details) plus two secondary links.
   `color` is set explicitly and to the SAME value the sibling <a> gets: the generic
   `.leaflet-popup-content a` rule above tints anchors with --color-primary, and being an
   element+class selector it outranks plain `.link` — so "Navigate" came out noticeably
   darker than the "Route" button beside it. Same color here keeps the pair matched. */
.park-pop-actions .link,
.park-pop-actions a.link { color: var(--color-primary, #3b6fb0); }
.park-pop-actions .link { background: none; border: none; padding: 0; cursor: pointer; font: inherit; }
.park-pop-actions .link:disabled { opacity: .6; cursor: default; }

/* "Add to Itinerary: <trip>", on its OWN row under the actions. It is the one popup
   action that names something, and a long trip name folded into the .park-pop-actions
   flex row read as two more links rather than one wrapping one.
   text-align: left matters: button.link (styles_shared.css) strips the UA chrome but
   NOT the UA's centerd text, so a two-line label came out ragged-center while every
   other line in the popup is flush left. */
.park-pop-trip { margin-top: .45rem; }
.park-pop-trip .link { text-align: left; font-size: var(--font-size-sm, 0.875rem); }
/* The done state. Muted rather than merely faded, and hover is suppressed too — an
   underline on a control that no longer does anything invites a second click. */
.park-pop-trip .link:disabled,
.park-pop-trip .link:disabled:hover { color: var(--color-text-muted); cursor: default; text-decoration: none; }

/* Engine options inside the pin popup, directly under Route — the thing they change.
   A Leaflet popup is narrow, so these stack rather than sitting on one line. */
.park-pop-engine { margin-top: .45rem; padding-top: .4rem; border-top: 1px solid var(--color-border); }
.park-pop-opt { display: flex; align-items: flex-start; gap: .35rem; font-size: var(--font-size-xs, 0.75rem);
                line-height: 1.3; margin: 0 0 .2rem; cursor: pointer; }
.park-pop-opt:last-child { margin-bottom: 0; }
.park-pop-opt input { margin: .1rem 0 0; flex: 0 0 auto; }
/* A Leaflet popup is ~250px wide, so this is where the two-column shrink bit hardest.
   The text is wrapped in .park-opt-text for the reason spelled out on that rule above. */

/* Alternate routes — already returned by the routing call, so switching is free. */
.park-pop-alts { display: flex; flex-wrap: wrap; gap: .3rem; margin-top: .4rem; }
.park-alt-btn { border: 1px solid var(--color-border); background: transparent; border-radius: 999px;
                padding: .2rem .6rem; font-size: var(--font-size-xs, 0.75rem); cursor: pointer; color: var(--color-text); }
.park-alt-btn.is-active { background: var(--color-primary); border-color: var(--color-primary); color: #fff; }

/* Park passport stat strip */
.park-passport { display: flex; align-items: center; gap: .75rem; flex-wrap: wrap; }
.park-passport-icon { font-size: 1.5rem; }
.park-passport-stats { display: flex; flex-wrap: wrap; gap: .4rem 1.1rem; }
.park-stat { color: var(--color-text-muted); white-space: nowrap; }
.park-stat-n { font-weight: 700; font-size: var(--font-size-lg, 1.125rem); color: var(--color-text); }

/* Nearby-parks list on the detail page */
.park-nearby-list { list-style: none; margin: .25rem 0 0; padding: 0; }
.park-nearby-item { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; padding: .45rem 0; border-bottom: 1px solid var(--color-border); }
.park-nearby-item:last-child { border-bottom: 0; }
/* Trails & Parks Done (TripDashboard, 2026-09-23) - the same row rhythm as Parks Nearby above,
   with a tick box first. The meta line wraps under the name on a phone rather than squeezing it. */
.td-tdone-list { list-style: none; margin: 0; padding: 0; }
.td-tdone-row { display: flex; align-items: center; gap: .6rem; padding: .45rem 0; border-bottom: 1px solid var(--color-border); }
.td-tdone-row:last-child { border-bottom: 0; }
.td-tdone-icon { flex: 0 0 auto; }
.td-tdone-body { flex: 1 1 auto; min-width: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: .15rem .5rem; }
.td-tdone-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem; margin-top: .75rem; }
/* Heavy / large / luxury popup (TripDashboard, 2026-10-02) - item name left, its concern pills
   right; the pills wrap under the name on a phone. */
.td-bulky-list { list-style: none; margin: .5rem 0 0; padding: 0; }
.td-bulky-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .6rem; padding: .4rem 0; border-bottom: 1px solid var(--color-border); }
.td-bulky-row:last-child { border-bottom: 0; }
.td-bulky-name { flex: 1 1 auto; min-width: 0; }
.td-bulky-pills { display: flex; flex-wrap: wrap; gap: .25rem; }
.td-bulky-worst { font-weight: 700; border-color: var(--color-danger); color: var(--color-danger); }
.td-bulky-advice { margin: 0; padding-left: 1.1rem; }
.td-bulky-advice li { margin-bottom: .3rem; }
/* The popup's sections (one <details> per check), its Don't Bring It button and the
   struck-through state of a row marked not bringing. */
.td-sl-trip { margin-bottom: .5rem; }
.td-sl-sec { border-top: 1px solid var(--color-border); padding: .5rem 0; }
.td-sl-h { font-weight: 700; cursor: pointer; padding: .15rem 0; }
.td-sl-sec > p, .td-sl-sec > .td-bulky-advice { margin-top: .4rem; }
.td-bulky-list { font-size: var(--font-size-sm); }
.button.td-sl-leave { flex: 0 0 auto; margin-left: auto; padding: .2rem .6rem; font-size: var(--font-size-xs); min-height: 0; }
.td-sl-group { padding: .5rem 0 0; }
.td-bulky-row.td-sl-left .td-bulky-name, .td-bulky-row.td-sl-left .td-bulky-pills { opacity: .5; text-decoration: line-through; }
.park-nearby-link { font-weight: 600; }
.park-nearby-meta { font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.park-nearby-dist { margin-left: auto; font-size: var(--font-size-sm, 0.875rem); font-weight: 600; color: var(--color-text); white-space: nowrap; }
/* "＋ Add" button on the Itinerary page's nearby-parks rows (sits after the distance). */
.itin-park-add { flex: 0 0 auto; }


/* Pin legend */
.park-legend { display: flex; flex-wrap: wrap; gap: .9rem; margin-top: .5rem; font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.park-legend-item { display: inline-flex; align-items: center; gap: .35rem; }
/* 🏷 The map's own settings row (Show park names), directly under the legend it reads as
   part of. Sized to the legend rather than to a form control: it is map furniture, not a
   filter, and the whole point of putting it here instead of in .park-view-row was that the
   difference be obvious. align-items:flex-start so the box sits against the FIRST line once
   the label wraps on a phone — the same rule .park-engine-opt documents at length. */
.park-map-settings { margin-top: .35rem; }
.park-map-setting { display: inline-flex; align-items: flex-start; gap: .4rem; margin: 0;
                    font-size: var(--font-size-sm, 0.875rem); line-height: 1.35; cursor: pointer; }
.park-map-setting > input { flex: 0 0 auto; margin: .15rem 0 0; }
.park-key { width: .7rem; height: .7rem; border-radius: 50%; display: inline-block; border: 2px solid; }
/* 🛑 These three MUST match the C_* constants in the map script in Parks.aspx (and
   Park.aspx), which in turn match COLOR_* in Scripts/placesnearme-page.js — one map
   palette across the site: YOU is blue, a place is red, a visited place is green.
   Parks had it inverted (you = red, parks = blue) until 2026-08-11, which is why the
   owner asked where the blue location dot was. A white ring, not a darker shade of the
   fill, so a pin stays legible against both tiles and the accuracy halo. */
.park-key-park    { background: #dc2626; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
.park-key-visited { background: #16a34a; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
.park-key-you     { background: #2563eb; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }

/* CampSites.aspx adds three fee swatches and one route swatch (2026-08-30). Same rule as
   the three above: these MUST match the C_* constants in CampSites.aspx's map script and
   in Scripts/trip-route.js. Change them in both places or not at all.
   🔑 THERE ARE THREE FEE COLORS BECAUSE shared_CampSites.IsFree HAS THREE STATES — free,
   fee, and "the agency never said". Collapsing gray into red would tell somebody a site
   charges when we do not know that, and collapsing it into green is worse. Green and red
   are reused from .park-key-visited / .park-key-park deliberately: one palette per site. */
.park-key-free    { background: #16a34a; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
.park-key-fee     { background: #dc2626; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
.park-key-unknown { background: #6b7280; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
.park-key-route   { background: #7c3aed; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
/* 🔑 #fee679 is SAMPLED FROM AN ACTUAL BLM TILE, not chosen — the swatch has to match
   what the map paints or the legend is pointing at the wrong thing. Measured 2026-08-31
   off tile /8/97/44 (central Nevada): 5,099 of 5,303 opaque pixels are exactly #fee679.
   The layer renders at 0.45 opacity over the basemap, which is why this swatch looks a
   touch stronger than the map does. */
.park-key-blm     { background: #fee679; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
/* 🔑 SAMPLED, NOT CHOSEN — decoded from the USFS service's OWN legend swatches on
   2026-08-31, so the two colors mean exactly what the map paints:
     #ccebc4 "US Forest Service Land"  (campable)
     #ffffde "Non-FS Land"             (a PRIVATE INHOLDING inside the forest)
   Both are in the legend deliberately; the service exposes no queryable sublayer, so
   the private class cannot be filtered out, and showing it is the more useful answer. */
.park-key-nfs     { background: #ccebc4; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
.park-key-nonfs   { background: #ffffde; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }
/* Michigan state forest is OUR OWN rendering (a GeoJSON file, not somebody's tiles), so
   this one is a design choice rather than a sample — it matches the fill in CampSites.aspx. */
.park-key-misf    { background: #4ade80; border-color: #ffffff; box-shadow: 0 0 0 1px rgba(0,0,0,.25); }

/* The land-overlay toggle group under the map.
   🔑 IT IS BOXED SO IT CANNOT BE MISTAKEN FOR THE FILTERS (owner, 2026-09-01: "it seems
   confusing how we have those, but then we also have the dropdown with agencies"). Same
   widget, opposite job — the controls above the map narrow the RESULT SET, these three
   only shade the basemap. Unstyled they were a bare stack of checkboxes inside the same
   .main-card as the real filters, which is exactly what they looked like.
   Both tokens carry a literal fallback because this box has to read as inset in either
   theme; without one, a missing token leaves an invisible panel and the confusion back. */
.cs-overlays {
    display: flex;
    flex-direction: column;
    gap: .15rem;
    padding: .6rem .75rem;
    border: 1px solid var(--color-border, #b6cede);
    border-radius: var(--radius-sm, 4px);
    background: var(--color-surface-muted, #f8f9fa);
}
.cs-overlays .checkbox { align-items: center; gap: .35rem; }
.cs-overlays > p { margin: .1rem 0 .35rem; }
/* 🔴 THE ATTRIBUTE ALONE DOES NOT HIDE THIS. The shared sheet sets `label.checkbox` to
   display:inline-flex at specificity (0,1,1), which outranks the browser's built-in
   [hidden] { display: none } — so the Michigan row is a DIV wrapper and gets its own
   rule here. Drop this and the row shows in all 50 states again. */
.cs-overlay-row[hidden] { display: none; }

/* Trail map cluster count (Trails.aspx, 2026-08-30). The label rides on a Leaflet
   tooltip, so the default tooltip chrome — white plate, border, drop shadow, callout
   arrow — has to be cancelled or the number sits in a little speech bubble beside the
   circle instead of inside it.
   🔑 pointer-events:none is load-bearing: the tooltip covers the middle of the marker,
   and without it the label swallows the click that is supposed to zoom into the
   cluster, so clicking the number does nothing.
   The color is fixed white rather than a theme token because it sits on the marker's
   own red fill in BOTH themes — a token here would turn the digits dark-on-red in light
   mode and unreadable. */
.trail-cluster-label,
.trail-cluster-label.leaflet-tooltip {
    background: transparent;
    border: 0;
    box-shadow: none;
    padding: 0;
    color: #ffffff;
    font-weight: 700;
    font-size: .75rem;
    line-height: 1;
    pointer-events: none;
    white-space: nowrap;
}
.trail-cluster-label.leaflet-tooltip::before { display: none; }

/* The "Did it!" tick in a trail results row. Deliberately the SAME shape and the same
   ticked green as Parks' .park-item-been — the owner asked for this control to work
   "just like we have for Parks", and a control that behaves identically but looks
   different reads as a different feature.
   🔑 #1e7a42 is a LIGHT-MODE green (3.0:1 on a dark card, under AA at this size), which
   is why both dark mechanisms below re-state it as #7fe0a3 — matching the note on
   .park-item-been.is-on. Keep all three selectors in step if that color ever moves. */
.trail-done-wrap {
    display: inline-flex; align-items: center; gap: .35rem; flex: 0 0 auto;
    margin: .4rem .25rem .4rem auto; white-space: nowrap; cursor: pointer;
    font-size: var(--font-size-xs, 0.75rem); color: var(--color-text-muted); user-select: none;
}
.trail-done-wrap > input { flex: 0 0 auto; margin: 0; }
.trail-done-wrap.is-on { color: #1e7a42; font-weight: 600; }
@media (prefers-color-scheme: dark) {
  .trail-done-wrap.is-on { color: #7fe0a3; }
}
[data-theme="dark"] .trail-done-wrap.is-on { color: #7fe0a3; }

/* The per-row trip picker + Add button on CampSites. Breaks to its own full-width line on
   a phone, where a select and a button cannot share a row with the site's name. */
/* Row action buttons: Google Maps ↗ / Google ↗ / ＋ Add to Itinerary. Wraps, because on a
   phone three buttons do not fit one line and a horizontally-scrolling list row is worse
   than a two-line one.
   ⚠ The `.dropdown` rule that used to live here was for the PER-ROW trip picker, deleted
   2026-08-31 at the owner's request ("just have one dropdown total for the trip"). */
.park-nearby-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; flex: 1 0 100%; margin-top: .35rem; }

/* The same three actions inside a Leaflet popup. A popup is narrow by construction, so
   these stay links rather than buttons — except Add to Itinerary, which must be a real
   <button> for PLP.setSaving's disable to work. See CampSites.aspx. */
.rmap-pop-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }

/* ── Camp site: public tips, and the member's own private record (2026-08-31) ──────
   Owner: "we need a way to rate the site (private), add notes (private), and tips
   (public). tips is so someone can mention the site is flooded or very rough for normal
   vehicles, etc."

   The two blocks are styled to look DIFFERENT on purpose. .cs-tip is other people
   talking to you; .cs-my is your own form. A member glancing down the list must never
   have to work out which of the two boxes on screen the world can read. */
.cs-tips { flex: 1 0 100%; display: flex; flex-direction: column; gap: .25rem; margin-top: .35rem; }
.cs-tip {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text, #223);
    background: var(--color-surface-alt, rgba(37, 99, 235, .06));
    border-left: 3px solid var(--color-primary, #2563eb);
    border-radius: 0 6px 6px 0;
    padding: .3rem .5rem;
}

.cs-my { flex: 1 0 100%; margin-top: .4rem; }
.cs-my-summary {
    cursor: pointer;
    user-select: none;
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted, #5a6472);
}
.cs-my-summary:hover { color: var(--color-primary, #2563eb); }
.cs-my-stars { color: #f59e0b; letter-spacing: .05em; }
.cs-my-body {
    display: flex;
    flex-direction: column;
    gap: .5rem;
    margin-top: .5rem;
    padding: .6rem .7rem;
    border: 1px solid var(--color-border);
    border-radius: 8px;
}
.cs-my-field { display: flex; flex-direction: column; gap: .2rem; }
/* The "(private)" / "(public)" half of each label. Italic and dimmer than the field name
   but never hidden — this is the only thing on the row that says who can read what. */
.cs-my-field .input-label i {
    font-style: italic;
    font-weight: 400;
    color: var(--color-text-muted, #5a6472);
}
.cs-my-body textarea.textbox { resize: vertical; min-height: 2.6rem; }

/* Parks.aspx's trip-route card (2026-08-30). Sits with the filters rather than in
   .park-view-row, because "only parks on my route" IS a filter — the same reasoning that
   moved 📍 Use My Location in with them on 2026-08-26. Tinted so it reads as one group
   without needing a heading, which would push the real filters below the fold on a phone. */
.park-route-card {
    background: var(--color-surface-alt, rgba(124, 58, 237, .06));
    border: 1px solid var(--color-border);
    border-radius: 10px;
    padding: .6rem .75rem;
    margin-bottom: .75rem;
}
.park-route-card .park-filter-row { margin-bottom: .25rem; }
.park-route-card p { margin: 0; }



/* ── EditPark form + admin review queue ────────────────────────────────────── */
.park-form-cols { display: flex; flex-wrap: wrap; gap: .75rem; }
.park-form-cols .form-group { flex: 1 1 200px; min-width: 0; }

/* RETIRED 2026-08-09 — .park-form-more / .park-form-more-sum were EditPark's own
   copy of the "optional detail behind a disclosure" idea. EditPark now uses the
   canonical .form-more / .form-more-summary from Shared/styles_shared.css, the same
   one EditItem, EditTask, EditMethod, EditTarget, EditCategory and EditEvent use, so
   the rules here were deleted rather than left as an unreferenced fork. Zero
   occurrences of either class remain in any .aspx/.js. Don't re-add them — edit the
   shared block instead, so every page moves together. */

/* Collapsible CARDS (Park detail): the card is a <details class="main-card"> whose
   <summary class="card-title"> is the clickable header.
   🔑 THE CARET RULES WERE DELETED 2026-08-20. styles_shared.css now draws ONE
   chevron for every collapsible card — `summary.card-title::after`, sitting right
   after the title text. This local pair was a "\25B8\00a0" (▸ + nbsp) in ::before,
   a DIFFERENT pseudo-element, so it would not have been overridden: both would
   render and every <details> card would show two markers pointing opposite ways.
   The margin rules stay — they are about spacing, not the caret. */
details.main-card > summary.card-title { cursor: pointer; list-style: none; margin-bottom: 0; }
details.main-card[open] > summary.card-title { margin-bottom: .75rem; }
details.main-card > summary.card-title::-webkit-details-marker { display: none; }

/* "Add to a trip's itinerary" control in the park's Your Record panel. */
.park-itin-add { margin-top: .5rem; }
.park-itin-row { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.park-itin-row .dropdown { flex: 1 1 200px; min-width: 0; }

.park-queue-item { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; padding: .6rem 0; border-bottom: 1px solid var(--color-border); }
.park-queue-main { flex: 1 1 240px; min-width: 0; }
.park-queue-name { font-weight: 600; }
.park-queue-meta { font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.park-queue-actions { display: flex; gap: .4rem; flex: 0 0 auto; }
.park-queue-reject { flex: 1 1 100%; display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .35rem; }
.park-queue-reject .textbox { flex: 1 1 220px; }


.park-rating-grid { display: grid; grid-template-columns: 1fr 1fr; gap: .5rem 1rem; }
.park-rating-row { display: flex; flex-direction: column; gap: .15rem; min-width: 0; }
.park-rating-label { font-size: var(--font-size-sm, 0.875rem); font-weight: 600; color: var(--color-text-muted); }
/* Row layout (flex) so the checkbox + caption sit on one line. The .checkbox class
   belongs on the INPUT (it sets a fixed 1.125rem box); putting it on the label made
   the label 1.125rem wide and wrapped the caption one letter per line. */
.park-share { display: flex; align-items: center; margin-top: .5rem; }

/* "Your Ratings" auto-saves, so this line replaces the Save button: it is the only
   feedback that the change landed. min-height keeps the row from collapsing as the
   text changes between "Saving…" and "Saved.", which otherwise nudges the page. */
.park-save-status { display: flex; align-items: center; gap: .5rem; min-height: 1.75rem; }
.park-save-status .park-save-failed { color: var(--color-danger, #c0392b); font-weight: 600; }

@media (max-width: 640px) {
  .park-rating-grid { grid-template-columns: 1fr; }
}

/* Kept: genuine dark-mode tunings the tokens can't express — the ticked "Been!" green
   (the base #1e7a42 is a light-mode value) and a lighter delete-red for contrast. */
@media (prefers-color-scheme: dark) {
  .park-item-been.is-on, .park-been-label.is-on { color: #7fe0a3; }
  .park-visit-del { color: #f28b82; }
}
/* #1e7a42 is a light-mode green: 3.0:1 on a dark card, i.e. under AA for the .8rem text it
   carries. #7fe0a3 is the shade the retired "on your list" pill used against the same
   surfaces, and it clears it comfortably. Both ticked-state classes take it. */
[data-theme="dark"] .park-item-been.is-on,
[data-theme="dark"] .park-been-label.is-on { color: #7fe0a3; }
[data-theme="dark"] .park-visit-del { color: #f28b82; }

/* ============================================================================
   My Places — user pins overlaid on every Leaflet map (map-overlays.js) + the
   MyPlaces.aspx management page (myplaces-page.js).
   ============================================================================ */

/* ── Pin markers (teardrop SVG + emoji/glyph) ── */
.plp-mp-pinwrap, .plp-mp-youdot { background: none; border: none; }
.plp-mp-pin { position: relative; width: 30px; height: 42px; filter: drop-shadow(0 1px 2px rgba(0,0,0,.35)); }
.plp-mp-glyph {
  position: absolute; top: 6px; left: 0; width: 30px;
  text-align: center; font-size: 13px; line-height: 1; pointer-events: none;
}
/* The temporary placement pin (while adding/editing) — Leaflet tags draggable
   markers with this class; show a move cursor so it's clearly grabbable. */
.leaflet-marker-draggable, .leaflet-marker-draggable .plp-mp-pin { cursor: move; }

/* ── Add-a-pin toggle control on the map ── */
.plp-mp-addctl a {
  font-size: 17px; text-align: center; line-height: 30px;
  text-decoration: none; cursor: pointer;
}
.plp-mp-addctl a.active { background: #ffe9a8; }
[data-theme="dark"] .plp-mp-addctl a.active { background: #6b5a1e; }

/* ── Popups (pin detail + add/edit editor) ── */
.plp-mp-pop-title { font-weight: 600; font-size: 1rem; }
.plp-mp-pop-sub { color: var(--color-text-muted); font-size: var(--font-size-xs, 0.75rem); margin-top: 1px; }
/* ≈ "this pin is the center of a town, not the place" on a 🧳 This Trip stop
   (Shared\map-overlays.js tripPopupHtml, 2026-09-02). Every trip stop is one —
   plp_TripDestinations holds no street address — so it is italic and muted rather than
   an alert: a warning that fires on every pin has to be readable, not loud. */
.plp-mp-pop-approx { font-style: italic; margin-top: 0.25rem; }
/* The pin's street address. Wraps rather than clipping — in a popup the whole point is to
   be able to read the address, and a truncated one is worse than a two-line one. */
.plp-mp-pop-addr { margin-top: 4px; font-size: var(--font-size-xs, 0.75rem); line-height: 1.35; }
.plp-mp-pop-notes { margin-top: 4px; font-size: var(--font-size-sm, 0.875rem); }
/* Three actions now (Edit / Hide / Remove) — wrap rather than overflow the popup, which
   is narrow on a phone. */
.plp-mp-pop-actions { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 12px; }
.plp-mp-pop-actions .link { background: none; border: none; padding: 0; cursor: pointer; font: inherit; }

/* ── Add/Edit a Place — a PAGE-LEVEL modal, not a Leaflet popup ──
   It uses the site's standard .modal-overlay/.modal-box shell (appended to <body> by
   map-overlays.js), so it sits on top of the page instead of being trapped inside — and
   clipped by — the map container, and its labels pick up the normal themed card colors
   in dark mode instead of Leaflet's hard-coded white popup chrome. */
.plp-mp-modal .modal-box { max-width: 420px; }

/* The × in the top-right corner. Added 2026-08-04 with the change that stopped a backdrop
   click (and Esc) from closing this dialog: closing here THROWS AWAY the pin and everything
   typed, so it now takes a deliberate press on ×, Cancel or ✓ Save. That made the × load-
   bearing rather than decorative — it is the affordance a user looks for in that corner
   first, so it has to be visible and big enough to hit on a phone.

   Sized and positioned to match .tutorial-close (the site's other close-X) so the two read
   as the same control. .modal-box is already position:relative, so this anchors to the
   dialog. The title reserves room for it rather than sliding under it. */
.plp-mp-editor .plp-mp-close {
  position: absolute;
  top: 8px;
  right: 10px;
  width: 32px;
  height: 32px;
  border: none;
  background: transparent;
  color: var(--color-text-muted);
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
  border-radius: 50%;
}
.plp-mp-editor .plp-mp-close:hover { background: var(--color-bg-input); color: var(--color-text); }
.plp-mp-editor .modal-title { padding-right: 34px; }

.plp-mp-editor .plp-mp-field { margin-bottom: 10px; }
.plp-mp-editor .input-label { display: block; margin-bottom: 2px; color: var(--color-text); }
.plp-mp-editor .textbox { width: 100%; box-sizing: border-box; }
/* Notes is a two-line box. Its rows="2" attribute alone can't deliver that: shared CSS
   gives every textarea.textbox a min-height of 2.5x the input height (~5 lines), and
   shared loads AFTER this file, so only a more specific selector wins. min-height:0
   hands the sizing back to rows="2"; the user can still drag it taller (resize stays
   vertical from the shared rule). */
.plp-mp-editor textarea.plp-mp-f-notes { min-height: 0; }
.plp-mp-custom-row { display: flex; gap: 8px; align-items: center; }
.plp-mp-custom-row .plp-mp-f-emoji { width: 4.5em; text-align: center; }
.plp-mp-custom-row .plp-mp-f-color { width: 40px; height: 34px; padding: 0; border: 1px solid var(--color-border); border-radius: 6px; background: none; cursor: pointer; }
.plp-mp-editor .plp-mp-pop-actions { margin-top: 6px; }

/* Coordinate readout + the "Move Pin on the Map" escape hatch (the backdrop covers the map, so
   repositioning the pin is an explicit mode). */
.plp-mp-loc { margin: 2px 0 0; font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.plp-mp-coords { font-variant-numeric: tabular-nums; }
/* The Address field under the coordinate readout. It is a real <input> now, so it needs
   the field spacing every other row has; the note below it carries the "yours vs worked
   out from the pin" state and the ↻ link that switches back. (The old read-only
   `.plp-mp-addr` <p> is gone — nothing renders that class any more.) */
.plp-mp-editor .plp-mp-addrfield { margin-top: 8px; }
.plp-mp-addrnote { margin: 3px 0 0; font-size: var(--font-size-xs, 0.75rem); line-height: 1.35; color: var(--color-text-muted); }
.plp-mp-addr-reset { background: none; border: none; padding: 0; cursor: pointer; font: inherit; text-decoration: underline; white-space: nowrap; color: var(--color-link, #2563eb); }
.plp-mp-loc .plp-mp-move { background: none; border: none; padding: 0; margin-left: 6px; cursor: pointer; font: inherit; text-decoration: underline; color: var(--color-link, #2563eb); }

/* Floating bar shown while the modal is tucked away for "Move Pin on the Map". Above the modal
   layer (2000) so it stays reachable, and clear of the bottom edge on a phone. */
.plp-mp-movebar {
  position: fixed; left: 50%; transform: translateX(-50%);
  bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
  z-index: 2100;
  display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap;
  max-width: calc(100vw - 2rem);
  padding: 0.6rem 0.9rem;
  background: var(--color-bg-card); color: var(--color-text);
  border: 1px solid var(--color-border); border-radius: var(--border-radius-lg, 10px);
  box-shadow: var(--shadow-xl, 0 8px 24px rgba(0,0,0,.3));
}
.plp-mp-movebar-text { font-size: var(--font-size-sm, 0.875rem); }

/* The Places-Near-Me popup footer now holds two links (Save to My Places + Hide);
   lay them out as a wrapping row so they don't crowd. */
.gps-pop-pref { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: center; }

/* ── MyPlaces.aspx page ── */
.mp-toolbar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.mp-toolbar .mp-search { flex: 1 1 220px; min-width: 180px; }
.mp-hint { margin: 6px 0 8px; }
.mp-map { height: 460px; border-radius: 8px; overflow: hidden; margin-top: 8px; }
.mp-result-row { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }

/* "Which of these are you at?" — the 📍 Search Nearby Places picker (MyPlaces). Full-width two-line
   rows rather than the pills used for a text search: these carry a street address and
   a distance, which a pill would truncate into uselessness. Capped and scrolled so a
   dense city block (up to 15 hits) can't push the map off the screen. */
.mp-detect-list { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; max-height: 44vh; overflow-y: auto; }
.mp-detect-item {
  display: flex; flex-direction: column; gap: 2px; width: 100%; text-align: left;
  padding: 8px 10px; font: inherit; color: inherit; cursor: pointer;
  background: var(--color-bg-card); border: 1px solid var(--color-border);
  border-radius: var(--border-radius-sm, 6px);
}
.mp-detect-item:hover, .mp-detect-item:focus-visible {
  background: var(--color-bg-input); border-color: var(--color-accent); outline: none;
}
.mp-detect-name { font-weight: 600; }
.mp-detect-meta { font-size: var(--font-size-sm); color: var(--color-text-muted); }
/* The escape hatch sits in the same list but must not read as one of the candidates. */
.mp-detect-none { border-style: dashed; }

.mp-list { list-style: none; margin: 0; padding: 0; }
.mp-list-row { display: flex; align-items: center; gap: 10px; padding: 10px 4px; border-bottom: 1px solid var(--color-border); }
.mp-list-row:last-child { border-bottom: none; }
.mp-list-glyph { font-size: 20px; width: 26px; text-align: center; flex: 0 0 auto; }
.mp-list-main { flex: 1 1 auto; min-width: 0; }
.mp-list-label { display: block; font-weight: 600; }
.mp-list-addr { display: block; font-size: var(--font-size-xs, 0.75rem); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mp-list-sub { display: block; color: var(--color-text-muted); font-size: var(--font-size-xs, 0.75rem); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mp-list-actions { display: flex; gap: 8px; flex: 0 0 auto; align-items: center; }
/* The three row actions are .button.transparent.small since 2026-08-10 (they were bare
   .link). All that is restated here is that they must never wrap mid-label. */
.mp-list-actions .button { white-space: nowrap; }
.mp-list-actions .link { background: none; border: none; padding: 0; cursor: pointer; font: inherit; white-space: nowrap; }
.mp-list-actions .link.danger { color: var(--color-danger, #c0392b); }
.mp-list-row.mp-hidden { opacity: .55; }

/* ── Brought over with qMEET's My Places, 2026-08-09 ───────────────────────── */

/* Card heading + the Sort picker on one line, wrapping to two on a narrow screen. The
   picker is hidden by the page until there are at least two places to sort. */
.mp-list-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.mp-list-head .card-title { margin-bottom: 0; }
/* Groups Sort + Filter by Category so .mp-list-head's space-between still has exactly
   two children to place. Wraps on a narrow screen instead of squeezing the selects. */
.mp-list-controls { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.mp-sort { display: flex; align-items: center; gap: 6px; }
/* 🔴 REQUIRED, and it was MISSING until 2026-08-10. `display: flex` above is an AUTHOR
   rule, and the UA stylesheet's `[hidden] { display: none }` is not — author beats UA
   regardless of specificity, so the `hidden` attribute on #mpSortWrap did nothing and the
   Sort picker showed even with a single saved place. qMEET escapes this only by accident:
   its bootstrap.min.css carries `[hidden]{display:none!important}` and PLP's bootstrap.css
   does not. 🔑 ANY ELEMENT GIVEN AN AUTHOR `display` NEEDS ITS OWN `[hidden]` RULE — do
   not rely on the UA sheet, and do not assume the sister site behaves the same. */
.mp-sort[hidden] { display: none; }
/* The label sits INLINE beside the select here, so it must drop the block display and
   bottom margin .input-label gives it everywhere else. */
.mp-sort .input-label { margin: 0; display: inline; white-space: nowrap; }
.mp-sort .dropdown { width: auto; min-width: 9rem; }

/* .mp-list-main is now a real <button> (clicking it points the map at that pin), so it has
   to give back everything a button brings: chrome, centring, the browser's font, and the
   inherited text color. Alignment is restated because a button is not a block by default
   and would otherwise center its three lines. */
.mp-list-focus {
  background: none; border: none; padding: 0; margin: 0;
  font: inherit; color: inherit; text-align: left; cursor: pointer;
  display: block; width: 100%;
}
.mp-list-focus:hover .mp-list-label { text-decoration: underline; }
.mp-list-focus:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; border-radius: 4px; }

/* The row whose pin the map is currently showing. A left bar + a tint rather than a border,
   which would shift every other row by a pixel as the selection moves down the list. */
.mp-list-row.is-selected {
  background: var(--color-bg-input);
  box-shadow: inset 3px 0 0 0 var(--color-accent);
  border-radius: 4px;
}

/* 🗺️ Google is an <a>, not a <button>, so it needs the underline suppressed to sit level
   with 🧭 Route and ⋯ beside it. ⋯ gets a wider hit area — it is one glyph and the only way
   to reach the management actions. */
.mp-list-actions .mp-gmaps, .mp-result-actions .mp-gmaps { text-decoration: none; }
.mp-list-actions .mp-gmaps:hover, .mp-result-actions .mp-gmaps:hover { text-decoration: none; }
.mp-list-actions .mp-more { padding-left: 10px; padding-right: 10px; font-size: 1rem; line-height: 1.1; }

/* Text-search results. These were pills (.mp-result-row above, now unused) back when picking
   one only ever dropped a pin. They now carry a full address, a distance and THREE actions,
   none of which survives inside a pill. */
.mp-result-list { list-style: none; margin: 6px 0 0; padding: 0; }
.mp-result {
  display: flex; align-items: center; gap: 10px; padding: 8px 6px;
  border-bottom: 1px solid var(--color-border);
}
.mp-result:last-child { border-bottom: none; }
/* Matches .mp-list-row.is-selected, because it means the same thing on both lists:
   "this is the one the map is showing you". */
.mp-result.active { background: var(--color-bg-input); box-shadow: inset 3px 0 0 0 var(--color-accent); border-radius: 4px; }
.mp-result-main {
  flex: 1 1 auto; min-width: 0;
  background: none; border: none; padding: 0; margin: 0;
  font: inherit; color: inherit; text-align: left; cursor: pointer; display: block;
}
.mp-result-main:hover .mp-result-name { text-decoration: underline; }
.mp-result-main:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; border-radius: 4px; }
.mp-result-name { display: block; font-weight: 600; }
.mp-result-sub {
  display: block; color: var(--color-text-muted); font-size: var(--font-size-xs, 0.75rem);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mp-result-actions { display: flex; gap: 10px; flex: 0 0 auto; }
.mp-result-actions .link { background: none; border: none; padding: 0; cursor: pointer; font: inherit; white-space: nowrap; }

/* ── Phone layout ─────────────────────────────────────────────────────────────
   Owner, 2026-08-10: the name, the address and the category get the FULL width of
   the card, and the actions drop to a line of their own underneath.
   🔴 The breakpoint used to be 560px — narrower than a phone in landscape or a
   small tablet, so at those widths the actions stayed beside the text and clipped
   the address to an ellipsis. 767.98px is the phone/tablet boundary.
   🛑 Do NOT try to force the full width with `flex: 1 1 100%` on .mp-list-body. A
   100% BASIS cannot share a line with the 26px .mp-list-glyph, so the glyph ends up
   stranded alone on the first row. The width comes from .mp-list-actions taking
   100% below: that drops them off the line, and the body's flex-grow fills the rest. */
@media (max-width: 767.98px) {
  .mp-list-row { flex-wrap: wrap; align-items: flex-start; }
  /* The address can now use the whole width, so there is no reason to clip it to one
     line — wrap it instead of hiding the half that says WHICH Main St. */
  .mp-list-addr, .mp-list-sub { white-space: normal; overflow: visible; text-overflow: clip; }
  .mp-list-actions { width: 100%; padding-left: 36px; flex-wrap: wrap; gap: 8px; }
  .mp-sort { width: 100%; }
  .mp-sort .dropdown { flex: 1 1 auto; }
  .mp-result { flex-wrap: wrap; }
  .mp-result-actions { width: 100%; }
}

/* ══ "That one" — the pulse that answers a click in the My Places list ═══════
   Applied to the marker's own element by map-overlays.js and stripped after 2.2s so a
   second click on the same row replays it. */
@keyframes plp-mp-pulse-kf {
  0%   { transform: scale(1);    filter: drop-shadow(0 0 0 rgba(37, 99, 235, .0)); }
  30%  { transform: scale(1.25); filter: drop-shadow(0 0 10px rgba(37, 99, 235, .9)); }
  100% { transform: scale(1);    filter: drop-shadow(0 0 0 rgba(37, 99, 235, .0)); }
}
.plp-mp-pulse .plp-mp-pin, .plp-mp-pulse svg { animation: plp-mp-pulse-kf 1.1s ease-in-out 2; transform-origin: 50% 100%; }
@media (prefers-reduced-motion: reduce) {
  .plp-mp-pulse .plp-mp-pin, .plp-mp-pulse svg { animation: none; filter: drop-shadow(0 0 8px rgba(37, 99, 235, .9)); }
}

/* ══ My Places: where you are ════════════════════════════════════════════════
   The accuracy + "GPS fix taken at" readout. ⚠ IT LIVES IN .mp-toolbar since
   2026-08-17 (owner: "put it on the same line as the ＋ Add a Place button, to the right
   of it"), as that flex row's LAST child — not in a strip above the map. Same change,
   same day, on qMEET.
   🛑 .plp-loc-bar was DELETED in that same change and is the third wrapper to go from
   between the toolbar and the map, after .plp-loc-actions (2026-08-15) and
   .plp-loc-opt / .plp-loc-every (2026-08-10, the "Keep Refreshing My Location" checkbox
   and its "Every ▾" picker, which drove a second polled location stream nobody could
   observe). All three removals are owner decisions and MyPlaces.aspx carries the full
   story. Do not re-add any of these rules on the strength of an older note. */
.plp-loc-status { font-size: var(--font-size-xs, 0.75rem); color: var(--color-text-muted); }
.plp-loc-status:empty { display: none; }
/* One line, never broken mid-phrase (owner, 2026-08-17) — "~106 m" and "2:24:42 PM" each
   read as one value and a wrap through either of them looks like a rendering fault. It is
   a flex ITEM of the wrapping toolbar, so nowrap costs nothing: when the row runs out of
   room the whole readout moves to the next line intact. */
.plp-loc-status { white-space: nowrap; }
/* 🔑 THE ESCAPE HATCH, and it is load-bearing. This same element also carries the
   no-geolocation sentence ("Your browser can't share your location, so routes can't start
   from where you are.") — a full line of prose that under nowrap would run off the side of
   a phone with no way to read it. myplaces-page.js adds this class on that branch and
   removes it on the normal readout. Deleting either half re-creates the overflow. */
.plp-loc-status.is-wrappable { white-space: normal; }

/* ══ My Places: the route panel ══════════════════════════════════════════════
   BELOW the map, never on it — see the markup comment in MyPlaces.aspx for why the on-map
   version was removed and must not come back. The color SWATCH on each row is what ties a
   row to its line, since nothing on the map is labeled. */
.plp-rt { margin-top: 12px; }
.plp-rt[hidden] { display: none; }
.plp-rt-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 8px 14px; }
.plp-rt-title { font-size: 1rem; font-weight: 600; margin: 0; flex: 1 1 auto; min-width: 0; }
.plp-rt-head .link { background: none; border: none; padding: 0; cursor: pointer; font: inherit; white-space: nowrap; }
.plp-rt-gmaps { text-decoration: none; }
.plp-rt-gmaps:hover { text-decoration: underline; }

.plp-rt-list { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.plp-rt-opt {
  display: flex; align-items: flex-start; gap: 10px; width: 100%; text-align: left;
  padding: 8px 10px; font: inherit; color: inherit; cursor: pointer;
  background: var(--color-bg-card); border: 1px solid var(--color-border);
  border-radius: var(--border-radius-sm, 6px);
}
.plp-rt-opt:hover { border-color: var(--color-accent); }
.plp-rt-opt:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; }
.plp-rt-opt.active { border-color: var(--color-accent); background: var(--color-bg-input); }
.plp-rt-opt.active .plp-rt-name { font-weight: 700; }
/* The swatch is load-bearing, not decoration: it is the ONLY thing connecting this row to
   one of the colored lines on the map. Fixed size and never allowed to shrink. */
.plp-rt-swatch {
  flex: 0 0 auto; width: 14px; height: 14px; margin-top: 3px;
  border-radius: 3px; border: 1px solid rgba(255, 255, 255, .6);
}
.plp-rt-text { display: flex; flex-direction: column; min-width: 0; }
/* 🛑 WRAPS, never truncates. PlaceMapService returns a road name WHOLE on purpose — see the
   note on RouteLabel: a name cut mid-word ("via West 10 Mile Road, Walter P Reu…") can be
   genuinely ambiguous between two routes, which defeats the point of labeling them. */
.plp-rt-name { font-weight: 600; white-space: normal; overflow-wrap: anywhere; }
.plp-rt-meta { font-size: var(--font-size-sm); color: var(--color-text-muted); }
.plp-rt-status { margin-top: 8px; font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.plp-rt-status:empty { display: none; }

/* The two engine settings. Absent from the DOM entirely when GoogleRoutes_Enabled is false,
   so these rules simply never match then. */
.plp-rt-settings { margin-top: 12px; display: flex; flex-direction: column; gap: 8px; }
.plp-rt-setting { display: flex; align-items: flex-start; gap: 8px; cursor: pointer; }
.plp-rt-setting > .checkbox { margin-top: .15rem; flex: 0 0 auto; }
.plp-rt-setting-note { color: var(--color-text-muted); font-size: var(--font-size-sm); }
.plp-rt-setting[hidden] { display: none; }
/* ⚠ The CONTAINER needs its own [hidden] rule too, for the same reason the line
   above exists: `display: flex` here is an AUTHOR rule, and an author rule beats the
   UA stylesheet's `[hidden] { display: none }` no matter how specific. Without this,
   marking #mpAvoidBadWrap hidden does nothing and the checkbox shows permanently —
   including for members who have no marked roads for it to act on. */
.plp-rt-settings[hidden] { display: none; }

/* ══ The ⋯ action sheet ══════════════════════════════════════════════════════
   Built by PLPMap.openActionSheet and shared by all four maps that load the overlay, so it
   leans only on the site-wide .modal-overlay / .modal-box shell. */
.plp-mp-sheet { max-width: 380px; }
.plp-mp-sheet .modal-title { margin-bottom: 10px; overflow-wrap: anywhere; }
.plp-mp-sheet-list { display: flex; flex-direction: column; border: 1px solid var(--color-border); border-radius: var(--border-radius-sm, 6px); overflow: hidden; }
.plp-mp-sheet-item {
  padding: 14px 16px; text-align: left; font: inherit; cursor: pointer;
  background: var(--color-bg-card); color: var(--color-text);
  border: none; border-bottom: 1px solid var(--color-border);
}
.plp-mp-sheet-item:last-child { border-bottom: none; }
.plp-mp-sheet-item:hover, .plp-mp-sheet-item:focus-visible { background: var(--color-bg-input); font-weight: 600; outline: none; }
.plp-mp-sheet-item.danger { color: var(--color-danger, #c0392b); }

/* ════════════════════════════════════════════════════════════════════════
   MODERATION QUEUE (Moderation.aspx) — the cross-site review console.

   These are PacklistPRO-local on purpose. The visual design is ported from
   qMEET's admin queue (.admin2-* / .dash2-* / .result-card*), but those classes
   live ONLY in qMEET\Content\styles.css. Promoting them to Shared\styles_shared.css
   would have been the tidier-looking move and is a trap: shared CSS loads AFTER
   each site's own stylesheet, so a shared copy would out-rank qMEET's originals at
   equal specificity and silently restyle its Admin, Dashboard and search pages.
   A self-contained .mod-* namespace here changes nothing on any other site.
   ════════════════════════════════════════════════════════════════════════ */

/* Stat strip — one chip per moderatable source, doubling as a type filter link. */
.mod-stats {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    margin: 0 0 1.25rem;
}
.mod-stat {
    flex: 1 1 7rem;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.1rem;
    padding: 0.7rem 0.9rem;
    background: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    box-shadow: var(--shadow-sm);
    text-decoration: none;
    color: var(--color-text);
    transition: box-shadow .15s ease, transform .15s ease;
}
.mod-stat:hover,
.mod-stat:focus-visible {
    box-shadow: var(--shadow-md);
    transform: translateY(-1px);
    text-decoration: none;
}
.mod-stat-icon { font-size: var(--font-size-lg, 1.125rem); line-height: 1; }
.mod-stat-num {
    font-size: var(--font-size-xl);
    font-weight: var(--font-weight-bold);
    line-height: 1.1;
    color: var(--color-accent);
    font-variant-numeric: tabular-nums;
}
.mod-stat-num.is-zero { color: var(--color-text-light); }
.mod-stat-label {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}

/* Filter toolbar — site / type / state dropdowns with the search row filling. */
.mod-toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.75rem;
    margin-bottom: 0.85rem;
    justify-content: space-between;
}
.mod-filter {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}
.mod-filter .dropdown { width: auto; min-width: 7.5rem; }
.mod-toolbar .search-row { flex: 1 1 16rem; margin: 0; }

/* Count pill beside the "Queue" heading. */
.mod-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.6rem;
    height: 1.5rem;
    padding: 0 0.55rem;
    margin-left: 0.4rem;
    border-radius: 999px;
    background: var(--color-accent);
    color: #fff;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-bold);
    vertical-align: middle;
}
.mod-count.is-zero { background: var(--color-border); color: var(--color-text-muted); }

/* Queue rows. The whole card is one anchor; the left edge encodes review state.
   Colors are the literal values qMEET uses so an admin moving between the two
   sites reads the same signal: yellow = live but unreviewed, green = reviewed,
   red = removed. They are fixed rather than tokenised because the meaning is the
   color — a themed "red" that drifts pale in dark mode would lose it. */
.mod-list { margin-top: 0.25rem; }
a.mod-item {
    --mod-bg: var(--color-bg-card);
    --mod-fg: var(--color-text);
    --mod-edge: var(--color-border);
    display: block;
    background: var(--mod-bg);
    color: var(--mod-fg);
    border: 1px solid var(--mod-edge);
    border-left: 6px solid var(--mod-edge);
    border-radius: var(--border-radius);
    box-shadow: var(--shadow-sm);
    padding: 0.6rem 0.75rem;
    margin-bottom: 0.6rem;
    text-decoration: none;
    transition: box-shadow .15s ease, transform .15s ease;
}
a.mod-item:hover,
a.mod-item:focus-visible {
    box-shadow: var(--shadow-md);
    transform: translateY(-1px);
    text-decoration: none;
    color: var(--mod-fg);
}
a.mod-item:visited { color: var(--mod-fg); }
.mod-item--pending  { --mod-bg: #fff7d6; --mod-fg: #5a4500; --mod-edge: #e6c200; }
.mod-item--reviewed { --mod-bg: #d3fad3; --mod-fg: #114411; --mod-edge: #00aa00; }
.mod-item--removed  { --mod-bg: #b00020; --mod-fg: #fff;    --mod-edge: #7a0014; }

.mod-item-title  { font-size: var(--font-size-lg, 1.125rem); font-weight: var(--font-weight-bold); display: block; line-height: 1.2; }
.mod-item-status { font-size: var(--font-size-sm, 0.875rem); font-weight: var(--font-weight-medium); opacity: 0.85; margin-left: 0.4rem; }
.mod-item-meta   { font-size: var(--font-size-sm, 0.875rem); opacity: 0.85; margin-top: 0.15rem; display: block; }

@media (max-width: 560px) {
    .mod-toolbar { flex-direction: column; align-items: stretch; }
    .mod-filter { justify-content: space-between; }
    .mod-filter .dropdown { flex: 1 1 auto; }
}

/* ── Email-verification nudge modal (Site.Master #email-verify-modal) ──────────
   Reuses the shared .modal-overlay/.modal-box + .post-login-close shell; these
   rules just center the envelope glyph/title and space the inline status line.
   Ported from qMEET's Content/styles.css 2026-07-29. */
.email-verify-box { max-width: 460px; text-align: center; }
.email-verify-box .modal-title { text-align: center; }
.email-verify-box p { margin: 0 0 0.75rem; }
.email-verify-icon { font-size: 2.6rem; line-height: 1; margin: 0.25rem 0 0.6rem; }
.email-verify-status { margin: 0.75rem 0 0; text-align: left; }
.email-verify-box .modal-footer { justify-content: center; }

/* ── All Pages (AllPages.aspx) — the trusted/admin site map ─────────────
   Color IS the content on this page, so each row class sets one custom property
   (--ap-c) and the dot plus the left rule both read it. Dark mode is handled by
   [data-theme="dark"] — the site's own switch, set on <html> — and NOT by
   prefers-color-scheme, which would ignore a member who picked a theme in
   Preferences. The four light values go muddy on a dark card (orange and red
   converge), so dark gets its own lightened set rather than reusing them.

   Color is never the ONLY signal: every dot carries a title= naming the
   audience, and the legend spells the four out in words. */
.ap-legend {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    align-items: center;
    margin: 0.75rem 0 0.25rem;
}

.ap-key {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    font-size: var(--font-size-sm, 0.875rem);
}

.ap-key b { font-weight: var(--font-weight-bold, 600); }

.ap-dot {
    width: 0.7rem;
    height: 0.7rem;
    border-radius: 50%;
    background: var(--ap-c, var(--color-text-muted));
    flex: 0 0 auto;
    display: inline-block;
}

.ap-anon    { --ap-c: #1f9d4d; }   /* anyone, including signed out */
.ap-login   { --ap-c: #c9a227; }   /* signed-in members */
.ap-trusted { --ap-c: #d97706; }   /* trusted users */
.ap-admin   { --ap-c: #c0392b; }   /* admins */

.ap-filter-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.75rem;
}

.ap-filter-row .textbox {
    flex: 1 1 16rem;
    max-width: 26rem;
}

.ap-group-title {
    font-size: 1rem;
    font-weight: var(--font-weight-bold, 600);
    margin: 0 0 0.5rem;
    padding-bottom: 0.35rem;
    border-bottom: 1px solid var(--color-border);
}

.ap-row {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding: 0.4rem 0 0.4rem 0.6rem;
    border-left: 3px solid var(--ap-c, var(--color-text-muted));
    margin-bottom: 0.15rem;
}

/* .ap-dot survives in the LEGEND only - the owner removed it from the rows
   (2026-08-02), where the left rule already carries the color. */
.ap-file {
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: 400;
    color: var(--color-text-muted);
}

/* min-width:0 lets a long descriptor wrap inside the flex child instead of
   forcing the row wider than the card. */
.ap-body { min-width: 0; }

.ap-line {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.4rem;
}

.ap-name {
    font-weight: var(--font-weight-bold, 600);
    text-decoration: none;
    color: var(--color-link);
}

.ap-name:hover,
.ap-name:focus-visible { text-decoration: underline; color: var(--color-link-hover); }

.ap-tag {
    font-size: var(--font-size-xs, 0.75rem);
    line-height: 1.5;
    padding: 0 0.4rem;
    border-radius: 0.75rem;
    border: 1px solid var(--color-border);
    color: var(--color-text-muted);
    white-space: nowrap;
}

.ap-desc {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted);
    margin-top: 0.1rem;
}

.ap-warn {
    font-size: var(--font-size-sm, 0.875rem);
    color: #b3541e;
    margin-top: 0.15rem;
}

.ap-flaglist { margin: 0.5rem 0 0; padding-left: 1.2rem; }
.ap-flaglist li { margin-bottom: 0.35rem; }

[data-theme="dark"] .ap-anon    { --ap-c: #46c46f; }
[data-theme="dark"] .ap-login   { --ap-c: #e3c04a; }
[data-theme="dark"] .ap-trusted { --ap-c: #f59e42; }
[data-theme="dark"] .ap-admin   { --ap-c: #ef6b5c; }
[data-theme="dark"] .ap-warn    { color: #f0a071; }

/* ── Site Map (SiteMap.aspx) — the member-facing directory ────────────────────
   Sibling of the .ap-* block above, and deliberately NOT a reuse of it. AllPages
   is an audit map where color IS the content (each row's left rule states who
   may open that page); this page only ever lists pages the viewer can already
   open, so there is nothing for a color to say and the rows are plain. Keeping
   two small rule sets is what stops a future "make the site map prettier" edit
   from silently repainting the trusted page's access legend.

   Kept per-site rather than in Shared/styles_shared.css, matching how .ap-* is
   already duplicated across all five sites. */
.sm-search-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.75rem;
}

/* DOM-41 (2026-08-28): the search input is now inside a .input-clearable wrapper
   (it has to be - site.js looks INSIDE that element for the .input-clear-btn), so the
   wrapper is the flex item and has to carry the sizing the bare input used to have.
   Without this the row collapses to the wrapper's content width. */
.sm-search-row .input-clearable {
    flex: 1 1 16rem;
    max-width: 26rem;
}

.sm-search-row .input-clearable .textbox {
    width: 100%;
}

.sm-search-row > .textbox {
    flex: 1 1 16rem;
    max-width: 26rem;
}

.sm-group-title {
    display: flex;
    align-items: baseline;
    gap: 0.45rem;
    margin-bottom: 0.15rem;
}

/* Two-plus columns once there is room. Sections run from 2 rows (Start here) to
   13 (Your trips), so a fixed column count would leave the short ones stranded;
   auto-fill lets each section pick its own. 19rem is the narrowest a title plus a
   wrapped one-line description stays readable at. */
.sm-rows {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr));
    gap: 0.1rem 1.2rem;
    margin-top: 0.6rem;
}

/* The whole cell is the hit area, not just the text of the link — a directory is
   read by pointing at rows. padding-left + the transparent border mean the hover
   rule appears without anything shifting sideways. */
.sm-row {
    position: relative;
    padding: 0.45rem 0.5rem 0.45rem 0.6rem;
    border-left: 3px solid transparent;
    border-radius: var(--border-radius-sm);
}

/* --color-hover-wash is the shared token for exactly this, and it is already
   defined twice (a dark wash for light mode, a light one for dark) — which is
   why this block needs no [data-theme] counterpart. */
.sm-row:hover,
.sm-row:focus-within {
    border-left-color: var(--color-link);
    background: var(--color-hover-wash);
}

.sm-name {
    font-weight: var(--font-weight-bold, 600);
    text-decoration: none;
    color: var(--color-link);
}

.sm-name:hover,
.sm-name:focus-visible { text-decoration: underline; color: var(--color-link-hover); }

/* Stretches the anchor over the whole cell so the row is clickable, while the
   anchor itself stays a normal inline link for a screen reader and for the
   focus ring. ::after rather than a wrapping <a> keeps the description outside
   the link text, which would otherwise be read out as part of the link name. */
.sm-name::after {
    content: "";
    position: absolute;
    inset: 0;
}

.sm-desc {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted);
    margin-top: 0.1rem;
}

/* 🔴 REQUIRED, not tidiness. The search hides rows and sections with the [hidden]
   attribute, whose default display:none is a UA rule — any display: on .sm-row or
   .sm-group beats it on specificity and the "hidden" rows stay on screen. This is
   the line that makes the filter work. */
.sm-row[hidden],
.sm-group[hidden],
.sm-empty[hidden] { display: none; }

/* Each section folds from its title (data-fold, Shared/site-core.js). A search has to
   look inside a folded one: while the search box holds text SiteMap.aspx marks every
   section .sm-finding, and a shut section is drawn open so its matches show. More
   classes than the shared .home-collapsed rules, so it wins whichever sheet loads last. */
.sm-group.sm-finding.home-collapsible.home-collapsed > .home-card-body { display: block; }
.sm-group.sm-finding.home-collapsible.home-collapsed > .heading::after { transform: rotate(225deg); }   /* drawn as OPEN (up, since the 2026-10-10 flip) */

/* No dark-mode block: every color above is a design token that already flips
   with the theme. The .ap-* set needs one only because it hardcodes four hex
   audience colors, which is exactly what this page has none of. */

/* ══════════════════════════════════════════════════════════════════════════
   Map.aspx — search a place, then drive there (.rmap-*)

   Prefix is rmap ("route map"), NOT map: Bootstrap and Leaflet both use bare
   .map-* names and a collision here would be invisible until a tile misbehaved.
   Every color is a design token, so dark mode follows without a second block —
   the two exceptions are called out where they appear.
   ══════════════════════════════════════════════════════════════════════════ */

.rmap-search-row {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    flex-wrap: wrap;
}
/* 🔴 BOTH lines are required, and the second is the one that is easy to miss.
   .input-clearable is display:flex + position:relative, and its × is positioned
   absolutely against the WRAPPER. Sizing only the wrapper leaves the <input> at its
   default intrinsic width — narrower than the wrapper — so the × floats in the gap to
   the RIGHT of the field instead of sitting inside it. The input must be told to fill
   the wrapper. Same pair as .wx-search-row / .au-filter-row above; copy both or the
   clear button lands outside the box. (The shared `.form-group > .input-clearable`
   cap does NOT apply here — this wrapper is nested one level deeper, inside
   .rmap-search-row, and so manages its own width by design.) */
.rmap-search-row .input-clearable { flex: 1 1 18rem; min-width: 0; }
.rmap-search-row .input-clearable .textbox {
    width: 100%;
    min-width: 0;
    /* 🔴 max-width:none is the line that actually fixes the ×, and it is NOT redundant
       with width:100%. Shared has `@media (min-width:768px) { .form-group .textbox {
       max-width: 480px } }`; max-width and width are DIFFERENT properties, so a more
       specific `width:100%` does not override the cap — the field stopped at 480px inside
       a 654px wrapper and the × (positioned against the WRAPPER) floated in the 174px gap.
       Raising specificity is not the fix; overriding the right property is. */
    max-width: none;
}

/* Failure messages only — see Map.aspx. :empty collapses it on the success path so
   the map sits straight under the search row with no dead gap. */
.rmap-you {
    margin: 0.25rem 0 0.75rem;
    font-size: var(--font-size-sm);
    color: var(--color-text, #222);
    font-weight: 600;
}
.rmap-you:empty { display: none; }

/* ── Results ─────────────────────────────────────────────────────────────── */
.rmap-results { margin-bottom: 0.75rem; }
.rmap-list {
    list-style: none;
    margin: 0;
    padding: 0;
    max-height: 17rem;
    overflow-y: auto;
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: var(--border-radius, 10px);
}
.rmap-list > li + li { border-top: 1px solid var(--color-border, #cfd4dc); }

.rmap-item {
    display: block;
    width: 100%;
    text-align: left;
    background: none;
    border: 0;
    padding: 0.55rem 0.75rem;
    cursor: pointer;
    color: var(--color-text, #222);
}
.rmap-item:hover { background: var(--color-bg-hover, rgba(0, 0, 0, 0.04)); }
.rmap-item.active { background: var(--color-bg-hover, rgba(0, 0, 0, 0.04)); box-shadow: inset 3px 0 0 #7c3aed; }
.rmap-item-name { display: block; font-weight: 600; }
.rmap-item-sub {
    display: block;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}
.rmap-closed {
    margin-left: 0.4rem;
    font-size: var(--font-size-xs);
    font-weight: 600;
    color: #b45309;
}

/* ── Map ─────────────────────────────────────────────────────────────────── */
.rmap-map {
    height: clamp(360px, 60vh, 620px);
    width: 100%;
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: var(--border-radius, 10px);
    box-shadow: var(--shadow-md);
    z-index: 0;                 /* keep tiles/controls under the site nav dropdowns */
}

.rmap-status {
    margin: 0.6rem 0 0;
    font-size: var(--font-size-sm);
    color: var(--color-text, #222);
}

/* Leaflet's default .leaflet-div-icon paints a white box with a border. Passing our
   own className REPLACES that class, but these two lines are kept as belt-and-braces
   because an SVG pin inside a white square is a very obvious regression. */
.rmap-pin, .rmap-youdot { background: transparent; border: 0; }

/* ── Route options, BELOW the map ────────────────────────────────────────────
   ⚠ These were on-map pills until 2026-08-05. Owner: "it's making it so I can't
   even see the map." Three text bubbles over a phone-sized map cover the roads
   they describe, so the options moved down here as a real list of <button>s —
   focusable and keyboard-operable for free, which the divIcon pills were not.
   The SWATCH is load-bearing, not decoration: with no text on the map, the color
   is the only thing tying a row to the line it describes, so each route gets its
   own hue (ROUTE_COLORS in map-page.js) rather than "chosen purple / rest gray",
   under which two alternates would be indistinguishable. Keep the two lists in
   step if either changes. */
.rmap-routes { margin-top: 0.75rem; }
.rmap-routes-title {
    font-size: var(--font-size-sm);
    font-weight: 600;
    color: var(--color-text-muted, #5a6472);
    margin: 0 0 0.35rem;
}
.rmap-route-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.rmap-route {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    width: 100%;
    text-align: left;
    padding: 0.5rem 0.7rem;
    cursor: pointer;
    color: var(--color-text, #222);
    background: var(--color-bg-card, #fff);
    border: 1px solid var(--color-border, #cfd4dc);
    border-radius: var(--border-radius, 10px);
}
.rmap-route:hover { border-color: var(--color-primary, #3b6fb0); }
/* The chosen row is called out by WEIGHT and a ring, never by recoloring the
   swatch — the swatch has to keep matching its line on the map. */
.rmap-route.active {
    border-color: var(--color-primary, #3b6fb0);
    box-shadow: inset 0 0 0 1px var(--color-primary, #3b6fb0);
}
.rmap-route.active .rmap-route-name { font-weight: 700; }
.rmap-route-swatch {
    flex: 0 0 auto;
    width: 1.1rem;
    height: 0.3rem;
    border-radius: 999px;
}
.rmap-route-text { display: flex; flex-direction: column; min-width: 0; }
.rmap-route-name { font-weight: 600; }
.rmap-route-meta {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}
.rmap-pop-name { font-weight: 600; }
.rmap-pop-sub {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted, #5a6472);
}

/* ── Options ─────────────────────────────────────────────────────────────── */
.rmap-options {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    margin-top: 0.85rem;
}
/* The label is a flex row so a wrapped caption stays aligned beside its box instead
   of running back underneath it. align-items:flex-start (not center) keeps the box on
   the FIRST line of a two-line caption — the Google Routes one wraps on a phone. */
.rmap-opt {
    display: flex;
    align-items: flex-start;
    gap: 0.15rem;
    font-size: var(--font-size-sm);
    cursor: pointer;
}
.rmap-opt > .checkbox { margin-top: 0.15rem; flex: 0 0 auto; }
.rmap-opt-note {
    color: var(--color-text-muted, #5a6472);
    font-weight: 400;
}
.rmap-opt[hidden] { display: none; }

/* ── NAV OVERFLOW BAND  (ToDo QL-20, the PacklistPRO half of qFIT's F21) ───────
   THE BUG. Shared/styles_shared.css converts the nav into a horizontal desktop
   bar from 992px up and hides the ☰ toggle at that same breakpoint
   (styles_shared.css:3158). Between 992px and the width at which the bar fits,
   ul.nav-menu was wider than the window with flex-wrap:nowrap, so the trailing
   top-level item ran off the right edge with no drawer to fall back on.

   Measured on prod 2026-08-09, signed IN as an admin, fresh loads of /Home, each
   width in its own same-origin iframe (an iframe is its own viewport, so the
   media queries really re-evaluate — the browser-automation resize is a SILENT
   NO-OP on a maximized window: it reports success while innerWidth never changes,
   which would have faked a pass):

     viewport   ul.nav-menu   clipped top-level items
       1366         891px      0
       1200         891px      0
       1027         891px      0   <- first width that fits
       1026         891px      1   Paul (My Account)
       1024         891px      1   Paul   (item spans 952-1027)
        992         891px      1   Paul
        991           --       hamburger appears, drawer OK

   => BROKEN BAND = 992px .. 1026px inclusive. Narrow, and the mildest of the
   three affected sites.

   ⚠ LOGOUT WAS NEVER ACTUALLY UNREACHABLE HERE — unlike qFIT's F21, where four
   whole menus fell off. Only "Paul" clips, and only by 3px at 1024 (35px at 992),
   so 40-72px of the 75px item stays visible and hoverable. Its dropdown is
   right-aligned (measured 807-1027 with the real :hover rules applied), leaving
   185-217px of the 219px Logout row on screen at every width in the band. This
   was clipped chrome, not lost access — which is why it is a P3-ish tidy-up and
   not the funnel bug NobodyHasTHIS had.

   THE FIX. Reclaim the flex gap and half the root-link padding inside the band:
   measured 891px -> 675px, zero clipped at 992 and 1024, still one row, bar
   height unchanged at 56px. The alternatives were rejected for the same reasons
   qFIT rejected them: raising the .nav-toggle breakpoint means editing
   styles_shared.css:3158, which is CROSS-SITE, and copying qMEET's permanent-
   hamburger Content/nav-hamburger.css is a design change, not a bug fix.

   ▶ THE LEADING `body ` IS LOAD-BEARING. Bundle.config loads Content/styles.css
   BEFORE Shared/styles_shared.css, and that file's
   `@media (min-width:992px) { .nav-menu { gap: 0.25rem } }` (styles_shared.css:3191)
   sits at equal specificity (0,1,0). An unqualified .nav-menu here would tie and
   silently LOSE on order. `body .nav-menu` is (0,1,1) and wins without !important.

   ⚠ SCOPE. Direct-child selectors only (> .nav-item > .nav-link), so the dropdown
   panels keep their own padding. Below 992px nothing here applies, so the phone
   drawer is untouched.

   ⚠ THE NUMBERS ABOVE ARE THE SIGNED-IN BAR — the only state measurable here,
   since this browser held a live session and logging out/in against prod is
   off-limits. The ANONYMOUS bar was NOT measured and is very likely WIDER: it
   carries "Join PacklistPRO" + "Login" + About + Invite (Site.Master:809-811),
   and on NobodyHasTHIS the anonymous bar measured 1093px against ~830px derived
   for its signed-in one. The 1279.98px upper bound (matching qFIT's identical
   rule) is deliberately generous to cover that unmeasured case — do not tune it
   down to the 1026px signed-in band. If the anonymous bar is ever measured and
   still clips, it needs shorter labels too, exactly as NobodyHasTHIS did.

   flex-wrap:wrap is the insurance: if an item ever stops fitting it drops to a
   second row instead of disappearing off the edge. */
@media (min-width: 992px) and (max-width: 1279.98px) {
    body .nav-menu {
        gap: 0;
        flex-wrap: wrap;
    }
    body .nav-menu > .nav-item > .nav-link,
    body .nav-menu > div > .nav-link {
        padding-left: 0.5rem;
        padding-right: 0.5rem;
    }
}

/* ── MyPlaces: venue details (hours / phone / website / rating) ───────────────
   Rendered by PLPMap.venueHtml() into BOTH the map popup (full) and each list row
   (compact). Mirrors qMEET's .qm-vn block — the two sites show the same shared
   dbo.events_places rows, so they must read identically.

   The three status colors are load-bearing: `is-unknown` covers "hours not known"
   AND "closed for good", and must not read as the plain `is-shut` (closed now, open
   tomorrow). Color never carries it alone — the pill always has words in it. */
.plp-vn { margin-top: 6px; }
.plp-vn-row { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.plp-vn-status { font-size: var(--font-size-xs, 0.75rem); font-weight: 600; padding: 1px 7px; border-radius: 10px; white-space: nowrap; }
.plp-vn-status.is-open { background: var(--color-success-bg, #e6f5ea); color: var(--color-success, #1e7e34); }
/* 🔴 This pill set a FIXED light ground - var(--color-surface-alt, #f1f1f1), a token
   declared nowhere, so the literal won in EVERY theme - under a FOREGROUND that does
   flip (--color-text-muted -> #b1b5bb in dark). A hardcoded ground beneath a themed
   figure is the whole defect: ~1.4:1 in dark mode. Both halves have to agree, so the
   ground is theme-aware now too. Swept 2026-08-18; the identical rule exists TWICE on
   qMEET (.here-venue-status.is-shut, .qm-vn-status.is-shut) and was fixed with it -
   all three come from venueHtml in Shared\map-overlays.js. */
.plp-vn-status.is-shut { background: var(--color-surface-muted, #f1f1f1); color: var(--color-text-muted, #666); }
.plp-vn-status.is-unknown { background: var(--color-warning-bg, #fdf3e2); color: var(--color-warning-text, #8a6100); }
.plp-vn-rating, .plp-vn-price, .plp-vn-type { font-size: var(--font-size-xs, 0.75rem); color: var(--color-text-muted); white-space: nowrap; }
.plp-vn-dim { opacity: .75; }
.plp-vn-summary { margin-top: 4px; font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.plp-vn-links { margin-top: 5px; display: flex; flex-wrap: wrap; gap: 10px; }
.plp-vn-links .link { font-size: var(--font-size-sm, 0.875rem); }
.plp-vn-hours { margin-top: 5px; font-size: var(--font-size-sm, 0.875rem); }
.plp-vn-hours > summary { cursor: pointer; color: var(--color-text-muted); }
/* Cap the expanded week: a Leaflet popup grows UPWARD and the map container clips,
   so seven unbounded lines open past the top edge. See venueHtml. */
.plp-vn-hours ul { margin: 4px 0 0; padding-left: 18px; max-height: 8.5em; overflow-y: auto; }
.plp-vn-hours li { line-height: 1.45; }
.plp-vn-nohours { margin-top: 5px; font-size: var(--font-size-xs, 0.75rem); color: var(--color-text-muted); font-style: italic; }
/* In a list row it is one inline strip, not a stacked panel — the row must stay a
   single scannable line beside the label and address. */
.plp-vn-compact { margin-top: 3px; display: block; }
.plp-vn-compact .plp-vn-row { gap: 5px; }

/* Phone / website / hours in a LIST ROW — mirrors qMEET exactly. These cannot go
   inside .mp-list-main: an <a> or <details> nested in a <button> is invalid HTML,
   and the button eats the click, so a "linked" phone number would render and then
   do nothing. .mp-list-body wraps the button and this block into ONE flex child,
   preserving the row's glyph | body | actions shape.
   🔴 The obvious alternative — a fourth flex child at `flex: 1 0 100%` — needs
   `flex-wrap: wrap` on the row, which ALSO drops .mp-list-actions onto its own
   line at every width above the 560px breakpoint, on rows with no venue at all. */
.mp-list-body { flex: 1 1 auto; min-width: 0; }
/* A venue row is tall, and the row's default align-items:center parks the glyph and
   the actions halfway down beside "Wednesday". Top-align only those rows. :has() is
   a progressive enhancement: unsupported means today's centerd look, not a defect. */
.mp-list-row:has(.plp-vn-links-only) { align-items: flex-start; }
.mp-list-body .plp-vn-links-only { margin-top: 3px; }
.mp-list-body .plp-vn-links-only .plp-vn-links,
.mp-list-body .plp-vn-links-only .plp-vn-hours,
.mp-list-body .plp-vn-links-only .plp-vn-nohours { margin-top: 3px; }
/* Keep a seven-line week from turning one list row into half a screen. */
.mp-list-body .plp-vn-links-only .plp-vn-hours ul { max-height: 168px; overflow-y: auto; }

/* Google place chooser rows ("Which place is this?") - twin of qMEET's .qm-mp-choice-*.
   Three stacked lines inside the shared sheet item so a candidate reads name / where /
   how-far rather than one run-on string. */
.plp-mp-choice-name { display: block; font-weight: 600; }
.plp-mp-choice-sub { display: block; font-size: var(--font-size-sm, 0.875rem); color: var(--color-text-muted); }
.plp-mp-choice-why { display: block; font-size: var(--font-size-xs, 0.75rem); color: var(--color-text-muted); opacity: .85; }

/* ── 404 personality (PLR-210) ─────────────────────────────────────────────
   Scoped to the 404 branch of Error.aspx only; 401/403/500 keep their plain
   wording, because a joke lands very differently on "Access Denied" or on a
   crash the user is about to report. The glyph is decoration (aria-hidden in
   the markup) so it is sized in em and inherits color rather than asserting
   its own. */
.plp-404-glyph { display: block; font-size: 3em; line-height: 1; margin-bottom: .35rem; }
.plp-404-quip  { font-weight: 600; }

/* ── AutoPostBack "saving" pulse (ToDo PLR-262) ───────────────────────────
   Applied by site.js initAutoPostbackFeedback to controls whose ASP.NET-emitted
   onchange contains __doPostBack. Matched to qMEET's rule (Content/styles.css:139)
   so the same interaction looks the same on both sites - deliberately COPIED rather
   than moved into the shared sheet, because only these two sites have the helper and
   a shared rule would imply the behavior exists everywhere. */
input.saving,
select.saving,
.checkbox.saving {
    box-shadow: 0 0 0 3px rgba(0, 176, 240, 0.35);
    transition: box-shadow var(--transition-fast);
}

/* Invite email preview frame (PLR-408).
   A sandboxed iframe has no intrinsic height, so without an explicit one it
   collapses to the browser default (150px) and shows a scrap of the email. Fixed
   height + its own scrollbar is the honest choice here: the email is taller than
   anything worth reserving on the page, and the point is to glance at it, not to
   read it in full. Bordered so it reads as a preview OF something rather than as
   part of this page. */
.invite-preview-frame {
    width: 100%;
    height: 22rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: #fff;   /* the email template assumes a white ground; do NOT theme it */
}

/* ── §50 NOTE READ MODE (PLR-038, 2026-08-12) ───────────────────────────────
   The rendered half of the Notes read/edit toggle. Scoped to .nt-* so nothing
   here can collide with the .note-item list rows above, and every color comes
   from a token so dark mode follows without a second block.
   ⚠ These rules live in Content/styles.css (PLP-specific) rather than
   styles_shared.css because only this site has the control. styles_shared.css
   loads LAST, so if a shared rule ever gains the same selector at equal
   specificity it would win — keep these class names PLP-unique.            */
.nt-readwrap {
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: var(--color-bg-alt, var(--color-bg));
}
.nt-read {
    padding: 12px 14px;
    max-height: 640px;
    overflow-y: auto;
    overflow-wrap: anywhere;      /* a long confirmation URL must not widen the card */
    color: var(--color-text);
}
.nt-read p            { margin: 0 0 .65em; }
.nt-read p:last-child { margin-bottom: 0; }
.nt-read ul,
.nt-read ol           { margin: 0 0 .65em 1.25em; padding-left: .5em; }
.nt-read li           { margin: .15em 0; }
.nt-read code {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: .9em;
    padding: .1em .35em;
    border-radius: 3px;
    background: rgba(127, 127, 127, .18);   /* neutral: legible on both themes */
}
.nt-read a            { word-break: break-word; }
.nt-readbar {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    padding: 8px 10px;
    border-top: 1px solid var(--color-border);
}
.nt-readhint          { flex: 1 1 auto; }
@media (max-width: 480px) {
    .nt-readhint      { flex-basis: 100%; }
}

/* ── EditItem: read-only rendering of an item you didn't create (.ei-ro-*) ──
   PLP-only. When the viewer can't edit the shared item record, EditItem stops
   rendering the 15 form controls (they used to render disabled — a whole gray
   form for something untouchable) and prints the record as a <dl class="detail-list
   ei-ro-list"> inside a collapsed .form-more disclosure. Built server-side by
   EditItem.aspx.vb → BuildReadOnlyItemHtml.

   🔑 EVERY RULE HERE IS COMPOUNDED WITH .detail-list ON PURPOSE. .detail-list is a
   SHARED class and styles_shared.css loads AFTER this file (Bundle.config order),
   so a bare `.ei-ro-list { grid-template-columns: 1fr }` ties the shared
   `.detail-list { grid-template-columns: auto 1fr }` on specificity and LOSES —
   the phone layout would silently never apply. Keep the two-class form. */
.detail-list.ei-ro-list {
    margin-top: 0.75rem;          /* .form-more[open] > .form-group:first-of-type
                                     only matches .form-group / .form-row, not a <dl> */
}
.detail-list.ei-ro-list dd {
    overflow-wrap: break-word;    /* Description and Search Keywords are free text */
    white-space: normal;
}
@media (max-width: 480px) {
    /* Label above value: the shared "auto 1fr" columns squeeze a long value into a
       ribbon once the label is something like "Search Keywords". */
    .detail-list.ei-ro-list {
        grid-template-columns: 1fr;
        gap: 0;
    }
    .detail-list.ei-ro-list dt { margin-top: 0.7rem; }
    .detail-list.ei-ro-list dt:first-child { margin-top: 0; }
}

/* ══════════════════════════════════════════════════════════════════════════
   TRIP DOCUMENTS — Itinerary.aspx "📎 Trip Documents" card (2026-08-29)
   ──────────────────────────────────────────────────────────────────────────
   🔑 EVERY CLASS HERE IS NEW AND tf--PREFIXED, ON PURPOSE. Content/styles.css
   loads BEFORE Shared/styles_shared.css (Bundle.config order), so a bare rule
   here that re-states a SHARED class ties on specificity and LOSES — the
   .detail-list.ei-ro-list block just above this one exists entirely because of
   that trap. Brand-new names cannot collide, so these need no compounding.

   The row body deliberately reuses the shared Expenses classes rather than
   cloning them: .exp-type-badge for the category, .exp-badge / .exp-badge-shared
   for the "Shared · added by" pill, .exp-share-btn for the row actions. Those
   already carry their dark-mode colors and their contrast decisions; a parallel
   set would mean re-solving both, probably worse. What is defined below is only
   the handful of things a file row needs that a money row does not.

   No CACHE_VERSION bump: this file rides the ~/Content/css bundle, which the
   service worker takes network-first into CRITICAL_CACHE and rewrites on the
   next online load. See the plp-v296 changelog entry in service-worker.js.
   ══════════════════════════════════════════════════════════════════════════ */

/* The card is a <details>, so its <summary> is the click target. list-style
   removal in both syntaxes: ::-webkit-details-marker for older Safari/iOS,
   list-style for everything current. */
.tf-card > .tf-summary {
    cursor: pointer;
    list-style: none;
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.tf-card > .tf-summary::-webkit-details-marker { display: none; }
/* A caret drawn by us, so it can rotate on open without depending on the UA
   marker we just removed. */
.tf-card > .tf-summary::after {
    content: "▾";
    margin-left: auto;
    font-size: 0.8em;
    color: var(--color-text-muted);
    transition: transform var(--transition-fast);
}
.tf-card[open] > .tf-summary::after { transform: rotate(180deg); }
.tf-card > .tf-summary:focus-visible {
    outline: 2px solid var(--color-border-focus);
    outline-offset: 2px;
}
.tf-count { color: var(--color-text-muted); font-weight: var(--font-weight-normal); }

/* One document. Same padding + divider rhythm as .exp-item, minus the pointer
   and hover — the ROW is not clickable here, only the filename link inside it
   is, so a hover highlight on the whole row would promise a click that does
   nothing. */
.tf-item {
    padding: 0.5rem 0.25rem;
    border-bottom: 1px solid var(--color-border);
}
.tf-item:last-child { border-bottom: none; }
.tf-item-row {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.tf-item-icon { flex: 0 0 auto; }
/* flex + min-width:0 so a long "AA-1234-boarding-pass-final-v2.pdf" wraps
   inside the row instead of pushing the size off the edge on a phone. */
.tf-item-name {
    flex: 1 1 auto;
    min-width: 0;
    font-weight: var(--font-weight-medium);
    overflow-wrap: anywhere;
    word-break: break-word;
}
.tf-item-size {
    flex: 0 0 auto;
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}
/* The download arrow beside the filename. The NAME now previews the document
   (TripFile.ashx serves the allow-listed types inline as of 2026-08-30 — the
   iPhone fix), so this is the only remaining way to ask for a copy on disk.
   Its own padding because it is a second hit target on the same line as the
   filename, and on a phone the two must not share a thumb. */
.tf-item-dl {
    flex: 0 0 auto;
    text-decoration: none;
    padding: 0.125rem 0.375rem;
    margin: -0.125rem 0;
    line-height: 1;
}
.tf-item-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem 0.5rem;
    margin-top: 0.2rem;
    align-items: center;
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
}
/* Which itinerary plan this document belongs to. nowrap: it is a short label
   and breaking it mid-title makes the meta row read as two separate facts. */
.tf-item-plan { color: var(--color-text-muted); white-space: nowrap; }
/* The uploader's free-text note. The OPPOSITE of the plan chip above — this one
   is arbitrary length, so it must be allowed to wrap. */
.tf-item-desc { color: var(--color-text-muted); overflow-wrap: anywhere; }

.tf-upload { margin-top: 0.5rem; }
/* ⚠ The `max-width: 100%` that used to live here is gone — it moved into the
   shared .file-picker rule on 2026-09-02, in the same edit that fixed the
   clipped "Choose Files" button. Two site-local patches for one shared defect
   is what told us the shared rule was wrong; see the long note in
   Shared/styles_shared.css. Nothing PLP-specific is needed here any more. */

/* ── Upload progress ─────────────────────────────────────────────────────────
   The answer to "nothing ever seems to upload": on hotel wifi an 8 MB boarding
   pass takes long enough that a button with no feedback is indistinguishable
   from a broken one. Hidden via the `hidden` attribute, so it occupies nothing
   until there is something to report. */
.tf-progress {
    height: 6px;
    margin-top: 0.5rem;
    border-radius: 3px;
    background: var(--color-border, #e0e0e0);
    overflow: hidden;
}
.tf-progress-bar {
    height: 100%;
    width: 0;
    border-radius: 3px;
    background: var(--color-primary, #0090C8);
    transition: width 0.15s linear;
}
/* The result line, printed INSIDE the card rather than in pnlMessage at the top
   of the page — see the block comment on the upload form in Itinerary.aspx. */
#tfUploadMsg { margin-top: 0.75rem; }

/* ── Expenses: Receipts strip (2026-09-23) ───────────────────────────────────
   Top of the Add / Edit Expense form. Scripts/expense-receipts.js builds the
   list; every color is a token, so dark mode needs nothing of its own.
   The progress bar reuses .tf-progress above. */
.exp-receipts {
    margin-bottom: 1rem;
    padding: 0.625rem 0.75rem;
    border: 1px dashed var(--color-border);
    border-radius: 8px;
    background: var(--color-surface-muted, transparent);
}
/* Drag-over highlight: a dashed box that turns solid says "drop it here". */
.exp-receipts.exp-receipts-drop {
    border-style: solid;
    border-color: var(--color-border-focus);
}
.exp-receipt-buttons { display: flex; flex-wrap: wrap; gap: 0.5rem; }
/* "Read receipts with [AI | Free]" — trusted users only. Label beside the box on a
   wide screen, stacked on a phone. */
.exp-receipt-reader {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.25rem 0.5rem;
    margin-top: 0.5rem;
}
.exp-receipt-reader .input-label { margin: 0; }
.exp-receipt-reader-select { flex: 0 1 auto; width: auto; max-width: 100%; }
.exp-receipt-note { margin: 0.4rem 0 0; }
.exp-receipt-msg { margin: 0.5rem 0 0; }
.exp-receipt-filled { margin: 0.5rem 0 0; }
.exp-receipt-filled.exp-receipt-warn { color: var(--color-warning-text); }
.exp-receipt-list { list-style: none; margin: 0.5rem 0 0; padding: 0; }
.exp-receipt-head {
    margin-top: 0.5rem;
    padding-top: 0.5rem;
    border-top: 1px solid var(--color-border);
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
/* One receipt: tick · thumbnail · name + what was read · buttons. The buttons
   wrap under the text on a phone rather than squeezing it to nothing. */
.exp-receipt {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.625rem;
    padding: 0.4rem 0;
}
.exp-receipt + .exp-receipt { border-top: 1px solid var(--color-border); }
.exp-receipt-check { flex: 0 0 auto; }
.exp-receipt-thumb {
    flex: 0 0 auto;
    width: 3rem;
    height: 3rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--color-border);
    border-radius: 4px;
    overflow: hidden;
    background: var(--color-bg-card);
    font-size: 1.5rem;
    text-decoration: none;
}
.exp-receipt-thumb img { width: 100%; height: 100%; object-fit: cover; }
.exp-receipt-body {
    flex: 1 1 10rem;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}
.exp-receipt-name { overflow-wrap: anywhere; font-weight: var(--font-weight-medium); }
.exp-receipt-read { overflow-wrap: anywhere; }
.exp-receipt-pill { align-self: flex-start; }
.exp-receipt-actions { display: flex; flex-wrap: wrap; gap: 0.375rem; }
.exp-receipt-bulk {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin-top: 0.5rem;
}
.exp-receipt-all { display: inline-flex; align-items: center; gap: 0.375rem; cursor: pointer; }
/* A box a receipt just filled. Removed by the script the moment the traveler
   edits it, so the tint only ever marks "not yet looked at".
   GREEN, not the info blue it was first written with: PLP's inputs are already
   pale blue (--color-bg-input), so an info tint was indistinguishable from an
   untouched box — caught in the first browser screenshot, 2026-09-23. */
.exp-filled {
    background-color: var(--color-success-bg) !important;
    border-color: var(--color-success-border) !important;
    box-shadow: 0 0 0 1px var(--color-success-border);
}

/* ── Itinerary: Location Details → "Find a place" ────────────────────────────
   The search row is input + button on one line; on a phone the button drops
   under a full-width box rather than squeezing the box to nothing. */
.itin-placefind-row {
    display: flex;
    gap: 0.5rem;
    align-items: stretch;
    flex-wrap: wrap;
}
.itin-placefind-row input[type="search"] {
    flex: 1 1 12rem;
    min-width: 0;
}
.itin-placefind-row .button { flex: 0 0 auto; }
#placeSearchStatus { margin-top: 0.5rem; }

.itin-placefind-list {
    list-style: none;
    margin: 0.5rem 0 0;
    padding: 0;
    /* A long list must scroll inside the card, not push the rest of the form
       (Type, dates, Booking Details, Save) off the screen while the traveler is
       still deciding which result is theirs. */
    max-height: 17rem;
    overflow-y: auto;
}
.itin-placefind-item + .itin-placefind-item { border-top: 1px solid var(--color-border, #e0e0e0); }

/* A real <button>, so it is keyboard-reachable and announced as pressable —
   styled to read as a list row rather than a button. */
.itin-placefind-hit {
    display: block;
    width: 100%;
    text-align: left;
    padding: 0.5rem 0.6rem;
    border: none;
    background: transparent;
    color: inherit;
    font: inherit;
    cursor: pointer;
    border-radius: var(--border-radius-sm, 6px);
}
.itin-placefind-hit:hover,
.itin-placefind-hit:focus-visible {
    background: var(--color-bg, #f5f7fa);
}
.itin-placefind-hit:focus-visible {
    outline: 2px solid var(--color-accent, #0277bd);
    outline-offset: -2px;
}
.itin-placefind-name {
    display: block;
    font-weight: var(--font-weight-bold, 600);
}
.itin-placefind-addr {
    display: block;
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    overflow-wrap: anywhere;
}

/* ⚠ The Add / Edit card became a <details> on 2026-09-02 and needs NO new CSS:
   `details.main-card > summary.card-title` (styles.css:5585) and the shared
   chevron already cover it. Checked before writing a rule — a second copy of
   those two lines is exactly the kind of duplicate that later disagrees. */

/* ── EditTrip: the explanatory note under "Share Packlist" / "Share Tasklist" ──
   Added 2026-09-05 when those two toggles went live (they had been hidden since
   2026-08-09 because nothing read their columns; Packlist's and Tasklist's new
   "Companion's ..." filters are the reader).

   Two rules, both about the note belonging to the checkbox ABOVE it rather than
   floating between two of them:
     • the indent lines it up with the label text, past the 1.125rem box and the
       .check-row 0.375rem gap, so it reads as that row's explanation;
     • the bottom margin separates it from the NEXT .check-row, which is 44px tall
       and would otherwise sit as close to this note as the note sits to its own
       checkbox — the ambiguity the indent exists to remove.
   Scoped to the class so no other .note on the site is touched. */
.plp-share-note {
    margin: 0 0 0.9rem 1.5rem;
    max-width: 60ch;
}

/* ── Options & Filters disclosure card: RETIRED HERE 2026-09-15 ────────────────────
   The .plp-options-card / .plp-disclosure / .plp-options-panel port of qFIT's Checklist
   "Filters & Display" strip (added 2026-09-06) was promoted to .options-card /
   .options-disclosure / .options-panel in Shared/styles_shared.css, with the
   "N filters on" note and yellow ring added (SiteCore.refreshOptionsCounts). Owner: every
   Filters/Options panel on all five sites looks the same. Packlist, Tasklist, Quicklist,
   ConfigureItems, ConfigureTasks and ShoppingList all use the shared block.
   🛑 Do not re-add a page-local copy here - restyle the shared block. */


/* ══════════════════════════════════════════════════════════════════════════════════════════
   UI REVIEW OF 2026-10-11 (tab "PacklistPRO UI Recs"), the rows built without a decision.
   Each block names its row. Colors come from the theme's variables so both themes work.
   ══════════════════════════════════════════════════════════════════════════════════════════ */

/* [plpb Site-4] The captions under the check boxes (Sel, Pkd, Done) were 10px, the smallest text on
   the site. 12px; the column grows by about 2px on the Tasklist ("Done"). (0,3,0) beats the 10px rule. */
.plp-checklist .plp-cb-label .small-text,
.plp-checklist .plp-qty-stepper .small-text { font-size: 0.75rem; }

/* [plpb Site-22] Check box sizes: 20px in forms and filters (they were 18px), 28px on the three
   lists that are check boxes down the page (Show / Hide Tags, Configure Items / Tasks, Shopping
   List). The Packlist's and Tasklist's own boxes (.checkbox-lg, 27px) are not touched.
   Typed past the shared input[type="checkbox"].checkbox (0,2,1), which loads after this sheet. */
main input[type="checkbox"].checkbox:not(.checkbox-lg):not(.plp-cb):not(.tl-cb):not(.ql-tick):not(.sl-cb):not(.sht-show-cb):not(.cfg-show-cb) {
    width: 1.25rem; height: 1.25rem; min-width: 1.25rem;
}
/* The row boxes of the Quicklist, Shopping List, My Items, My Tasks and My Tags are the Packlist's size (owner,
   2026-10-15; their look is with the Packlist's, "[plpd Site-39]"). 🔴 The last four were meant to be 1.75rem and
   drew at 1.25rem: the rule above, (0,5,2) with its :not()s, outranked their (0,3,2) rule. So each is named out
   above; a new list box class must be too. */
main input[type="checkbox"].checkbox.ql-tick,
main input[type="checkbox"].checkbox.sl-cb,
main input[type="checkbox"].checkbox.sht-show-cb,
main input[type="checkbox"].checkbox.cfg-show-cb { width: 1.6875rem; height: 1.6875rem; min-width: 1.6875rem; margin: 0; }
main input[type="checkbox"].trail-facet,
main input[type="checkbox"].trail-shape { width: 1.25rem; height: 1.25rem; min-width: 1.25rem; }
main input[type="checkbox"].trail-done  { width: 1.5rem;  height: 1.5rem;  min-width: 1.5rem; }

/* [plpb Site-25] Finger-sized tap areas on five small controls, with no change to how they look:
   the Open pill on a Trip Dashboard card (71 x 26), Expand All / Collapse All (91 x 23), the (i)
   beside an item or task (22 x 28) and the Shopping List's edit and delete icons. The (i)'s area
   grows less sideways: it sits against the name on one side and the check boxes on the other. */
.td-head-go, .plp-item-info, .sl-edit, .sl-del, button.pill.small { position: relative; }
.td-head-go::after, .sl-edit::after, .sl-del::after, button.pill.small::after {
    content: ""; position: absolute; top: 50%; left: 0; right: 0; height: 44px; transform: translateY(-50%);
}
.plp-item-info::after { content: ""; position: absolute; top: -8px; bottom: -8px; left: -6px; right: -6px; }

/* [plpb Site-32] A product's name is the store's whole listing title (seven lines of bold on a
   phone for some). Two lines, then an ellipsis; the full title is the tooltip and is on the
   product's own page. The brand drops to its own line under it. */
.rec-product-title > .normal-text-bold {
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2;
    overflow: hidden;
}

/* [plpb Site-21] On a wide screen a search or filter box ran the whole card (1,000 to 1,118px for a
   word or two). 30rem at 992px and up; the box's clear-button wrapper is capped with it. */
@media (min-width: 992px) {
    main :is(#tbSearch, #tbTripSearch, #tbTipSearch, #ctSearch, #glossSearch, #parkSearch, #trailLoc, #gpsSearchInput, #gpsDestInput),
    main .input-clearable:has(> :is(#tbSearch, #tbTripSearch, #tbTipSearch, #ctSearch, #glossSearch, #parkSearch, #trailLoc, #gpsSearchInput, #gpsDestInput)) {
        max-width: 30rem;
    }
}


/* ── [plpb] rules handed over by the page builders of the same review (2026-10-11) ── */
/* Park-1 (Helper A): long park description shows about 6 lines until Read More is pressed. */
.park-desc-clamp {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 6;
    line-clamp: 6;
    overflow: hidden;
}

/* Trails-2 (Helper A): the Park dropdown gets a visible label above it. */
.trail-labeled-filter { display: inline-flex; flex-direction: column; gap: 0.15rem; min-width: 0; max-width: 100%; }
.trail-labeled-filter .input-label { margin: 0; }
.trail-labeled-filter .dropdown { max-width: 100%; }

/* Trails-4 (Helper A): each filter group's label on its own line, the check boxes under it in two even columns. */
#trailActivityRow, #trailFeatureRow, #trailShapeRow {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 1rem;
    row-gap: 0.35rem;
    align-items: start;
}
#trailActivityRow > .input-label, #trailFeatureRow > .input-label, #trailShapeRow > .input-label { grid-column: 1 / -1; margin: 0; }
#trailActivityRow > .checkbox, #trailFeatureRow > .checkbox, #trailShapeRow > .checkbox { min-width: 0; margin: 0; }

/* Trail-2 (Helper A): the Links card buttons sit two to a row (one column under 340px). */
#cardLinks .form-actions {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.5rem;
}
#cardLinks .form-actions > .button { min-width: 0; width: 100%; text-align: center; }
@media (max-width: 339px) {
    #cardLinks .form-actions { grid-template-columns: 1fr; }
}

/* CampSites-2 (Helper A): the shut "Shade Public Land on the Map" fold under the CampSites map. */
.cs-overlays-fold > summary { cursor: pointer; display: list-item; margin: 0; }
.cs-overlays-fold[open] > summary { margin-bottom: .35rem; }

/* PlacesNearMe-1 (Helper A): the Find Everything in the Radius label wraps inside its card. */
.gps-check.gps-sweep { white-space: normal; align-items: flex-start; max-width: 100%; }
.gps-check.gps-sweep > span { min-width: 0; overflow-wrap: anywhere; }
.gps-sweep-note { margin: 0.1rem 0 0 1.6rem; }

/* MyPlaces-1 (Helper A): a short plain line under each of the four add buttons, and the legend line under the map. */
.mp-btn-with-note { display: inline-flex; flex-direction: column; align-items: flex-start; gap: 0.15rem; }
.mp-btn-note { font-size: var(--font-size-xs, 0.75rem); line-height: 1.2; color: var(--color-text-muted); max-width: 14rem; }
.mp-map-legend { margin: 0.35rem 0 0; }

/* UI review Preferences-2 (2026-10-11): App Cache heading is a block so Clear App Cache sits under it. */
.prefs-label-block { display: block; }

/* UI review Notifications-1 (2026-10-11): Reminder Preferences as one small table (Notifications.aspx).
   Row = reminder (name + muted explanation), Push and Email columns hold the ten existing check boxes.
   The check box's own "Push"/"Email" text is kept for screen readers and hidden visually because the
   column heading says it. Fits 360 px: the two check columns are 3.5rem each. */
.reminder-table { width: 100%; border-collapse: collapse; margin: 0.5rem 0; }
.reminder-table th, .reminder-table td { padding: 0.5rem 0.25rem; border-bottom: 1px solid var(--color-border); vertical-align: top; text-align: left; }
.reminder-table thead th { font-weight: var(--font-weight-medium, 500); color: var(--color-text-muted); font-size: var(--font-size-sm, 0.875rem); }
.reminder-table thead th:not(:first-child),
.reminder-table tbody td { width: 3.5rem; text-align: center; }
.reminder-table tbody th { font-weight: normal; }
.reminder-table .reminder-why { display: block; margin-top: 0.15rem; color: var(--color-text-muted); font-size: var(--font-size-xs, 0.75rem); line-height: 1.35; }
.reminder-table .reminder-channels { align-items: center; }
body .reminder-table .reminder-channels .checkbox { justify-content: center; gap: 0; }
body .reminder-table .reminder-channels .checkbox > input[type="checkbox"] { margin: 0.15rem 0 0; }
body .reminder-table .reminder-channels .checkbox > label {
    flex: 0 0 auto; position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* UI review Invite-1 (2026-10-11): the four share buttons two to a row; the link box shows the whole
   link by scrolling sideways (no ellipsis, never cut off by the box edge). */
.invite-share-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem; }
.invite-share-actions .button { width: 100%; text-align: center; }
.invite-link-box { overflow-x: auto; text-overflow: clip; white-space: nowrap; }

/* [plpb Join1-1] Join steps 1 to 4: on a phone the green button comes first and Back / Cancel sits under it;
   on a wider screen the usual row (Back or Cancel, then Next). */
@media (max-width: 575px) {
    .form-actions.join-actions-stack { flex-direction: column-reverse; }
}


/* [plpb Site-8] The Install pill sits in the footer, under its links, instead of floating over the
   bottom right corner of every page (Scripts/site.js ensureInstallButton adds .pwa-install-inline).
   (0,2,0) against the shared sheet's .pwa-install-wrap (0,1,0), which loads after this one; the
   shared .pwa-install-wrap.visible still decides whether it shows at all. */
.pwa-install-wrap.pwa-install-inline {
    position: static;
    right: auto;
    bottom: auto;
    z-index: auto;
    margin: 0.75rem auto 0;
    box-shadow: none;
}
footer.site-footer .pwa-install-wrap.pwa-install-inline.visible { display: inline-flex; }

/* [plpb Site-6] The two links of the demo strip never break in the middle ("Log / in"). */
.banner-demo a.link, .demo-strip a.link { white-space: nowrap; }


/* [plpb Site-18] Trip Documents on the Itinerary carries the same arrow as every other card. Its
   summary is .card-title AND .tf-summary, and the two rules above and in the shared sheet each
   drew half a mark (a text caret with the shared chevron's borders around it). The text caret is
   switched off here so the shared summary.card-title::after draws the one chevron, and the open
   state turns it the shared way. */
.tf-card > summary.card-title.tf-summary::after {
    content: ""; margin-left: 0; font-size: inherit; color: inherit;
}
.tf-card[open] > summary.card-title.tf-summary::after { transform: rotate(225deg); }

/* [plpb Site-31] The 80-character cap of 2026-10-11 did not name the gray explanation inside an
   empty card (about 170 characters a line on the Trip Dashboard at 1,366px). */
@media (min-width: 992px) {
    main p.empty-state-sub { max-width: 66ch; }
}


/* ── [plpb] rules handed over by the trip-side-page builder of the same review (2026-10-11) ── */
/* Site-19 (long tips): the rest of a long blue tip sits behind "More". The summary looks like an inline link; no box. */
.tip-more { display: inline; }
.tip-more > summary {
    display: inline;
    list-style: none;
    cursor: pointer;
    color: var(--color-link);
    text-decoration: underline;
}
.tip-more > summary::-webkit-details-marker { display: none; }
.tip-more[open] > summary { margin-right: 0.25rem; }

/* ShoppingList-1: the Store / Department line under each item (.sl-prod-meta) was near-black on the dark card
   (Content/styles.css has `[data-theme="dark"] .sl-prod-meta { color: #1a1a1a !important }`; the selectors below
   outrank it, so the old line can stay or be deleted). It now takes the theme's muted text color in both themes.
   Rows that keep a light tint (Colors = Warm, and High / Urgent on Standard - the same rows whose links are already
   #1a1a1a) keep the dark text, because muted gray on a pastel row would be too faint. */
[data-theme="dark"] .sl-row .sl-prod-meta { color: var(--color-text-muted) !important; }
[data-theme="dark"] .sl-colors-warm .sl-row:not(.sl-purchased) .sl-prod-meta,
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-4:not(.sl-purchased) .sl-prod-meta,
[data-theme="dark"] .sl-colors-standard .sl-row.sl-pri-3:not(.sl-purchased) .sl-prod-meta { color: #1a1a1a !important; }

/* ShoppingList-3: the priority pill shows only when the priority is not Normal. The pill stays in the DOM
   (the script finds it, and slApplyPriority swaps its class when a priority changes, so it appears the moment
   a row becomes High / Low / Urgent / Idea and disappears when it goes back to Normal). */
.pill.sl-pri-pill.sl-pri-normal { display: none; }

/* ConfigureItems-1: a category row's count - "(11 items)" - never wraps onto two lines; a long category NAME wraps
   instead (both Configure pages; the rule is on the shared group-header class, so Packlist-style headers get it too). */
.plp-group-count { white-space: nowrap; flex: 0 0 auto; }
.plp-group-header .plp-group-name { min-width: 0; }

/* EditItem-1: the "Added ... - Updated ..." line in the blue block at the top of Edit Item and Edit Task was
   the muted gray (.plp-audit-meta) on the bright blue. Inside a blue block it takes the block's own text color.
   (Specificity beats .plp-audit-meta in Content/styles.css.) */
.alert-panel.info .plp-audit-meta { color: inherit; }

/* Weather-2: the "More" fold inside a day's opened detail (the eight main fields stay on show above it). */
.wx-more { margin: 0 0 0.75rem; }
.wx-more > summary {
    display: inline-block;
    cursor: pointer;
    color: var(--color-link);
    text-decoration: underline;
    font-size: var(--font-size-sm);
    margin-bottom: 0.4rem;
}
.wx-more > summary::-webkit-details-marker { display: none; }

/* Weather-3: the chance of rain has a fixed place - a right-hand column of its own - on every row of the
   multi-day list, at 360 px and up (below that the old wrapping flex row is kept). The date, the icon, the
   condition (takes the slack and may wrap), the high / low and the rain chance are the five children of the
   summary; the server now always writes the rain-chance span (empty when the chance is 0). */
@media (min-width: 360px) {
    .wx-day-summary {
        display: grid;
        grid-template-columns: 5.5rem 1.6rem minmax(0, 1fr) auto 3.6rem;
        column-gap: 0.6rem;
        align-items: center;
    }
    .wx-day-summary .wx-day-date { min-width: 0; }
    .wx-day-summary .wx-day-precip { text-align: right; }
}

/* Weather-3: the hourly table's right edge fades to show that it scrolls sideways. The server wraps the
   scroller in .wx-hourly-wrap; weather-page.js adds .is-end once the table is scrolled to its end, which
   removes the fade. */
.wx-hourly-wrap { position: relative; }
.wx-hourly-wrap::after {
    content: "";
    position: absolute;
    top: 1px;
    right: 1px;
    bottom: 1px;
    width: 2rem;
    pointer-events: none;
    border-radius: 0 6px 6px 0;
    background: linear-gradient(to right, transparent, var(--color-bg-card));
}
.wx-hourly-wrap.is-end::after { display: none; }


/* [plpb Weather-3, tuned after the first look] The day rows' middle column was 42px on a phone, so
   "Overcast" broke as "Overcas / t" (and "Drizzle" as "Dri / zzle" in Home's narrower weather card).
   Tighter fixed columns give the condition 58px on Home and 90px on Weather; it wraps between
   words, and inside one only if a single word still cannot fit. */
@media (min-width: 360px) {
    .wx-day-summary {
        grid-template-columns: 5.1rem 1.5rem minmax(0, 1fr) auto 2.6rem;
        column-gap: 0.35rem;
    }
    .wx-day-summary .wx-day-cond { overflow-wrap: break-word; word-break: normal; min-width: 0; }
    .wx-day-summary .wx-day-precip { white-space: nowrap; }
}


/* [plpb ShoppingList-3, tuned after the first look] With the Normal pill gone, the trip / store line
   sat beside a short item name on one row and under a long one on the next. It always takes a line
   of its own under the name, as it did when the pill pushed it there. */
.sl-row .sl-prod-meta { display: block; flex: 1 0 100%; width: 100%; white-space: normal; }


/* [plpb TripDashboard-1] The Packlist and Tasklist cards said one number twice while open: the
   card's header carries a COPY of the body's summary line ("0 of 438 items packed (0%)") for when
   the card is shut, and with the card open both were on screen. The header copy is hidden while
   the card is open and its source is a line a visitor can see (an empty list's source is
   visually hidden, and there the header copy is the only place the count shows). */
.main-card[data-summary-sel=".plp-summary p"]:not(.home-collapsed):has(.plp-summary:not(.visually-hidden)) .home-head-summary { display: none; }


/* [plpb EditTrip-4] Save on the left and Delete Trip on the right is the owner's order (2026-10-03).
   On a phone the row stacks, and the red button sat directly under the green one at the same
   width: it keeps its place and gets a gap above it, so a thumb aiming for Save does not land on it. */
@media (max-width: 575px) {
    .form-actions[data-no-action-order] > #btnDelete.button.danger { margin-top: 1rem; }
}


/* [plpb Site-31, second try] The cap above lost to the shared .empty-state[data-empty-mode] .empty-state-sub
   { max-width: none } (0,3,0), which lets an in-card empty message fill its column - right on a phone,
   170 characters a line on a laptop. Same cap, typed past it. */
@media (min-width: 992px) {
    main .empty-state[data-empty-mode] p.empty-state-sub { max-width: 66ch; }
}


/* [plpb Invite-1, second try] The two-to-a-row rule above lost on a phone to this sheet's own
   .form-actions:not(.form-actions-centered):not(.de-modal-actions) stack (0,3,0), so the four share
   buttons were still one per row. Typed past it. */
.form-actions.invite-share-actions:not(.form-actions-centered):not(.de-modal-actions) {
    display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem;
}
.form-actions.invite-share-actions:not(.form-actions-centered):not(.de-modal-actions) > .button { width: 100%; margin: 0; }


/* [plpb Invite-1, wide screens] Two to a row is for a phone. From 576px up the four share buttons are one
   row of ordinary buttons again: at 1,366px the grid above made each of them 555px wide. */
@media (min-width: 576px) {
    .form-actions.invite-share-actions:not(.form-actions-centered):not(.de-modal-actions) { display: flex; flex-wrap: wrap; }
    .form-actions.invite-share-actions:not(.form-actions-centered):not(.de-modal-actions) > .button { width: auto; }
}

/* [qmb Trail-2, carried from qMEET 2026-10-12] The Links card's buttons sit two to a row; when their number
   is odd the last one spans the row instead of sitting alone at half width. Same rule on qMEET. */
#cardLinks .form-actions > .button:last-child:nth-child(odd) { grid-column: 1 / -1; }


/* ═══════════════════════════════════════════════════════════════════════════════════════════
   THE "SIMPLER SITE" REVIEW OF 2026-10-12 (tab PacklistPRO UI Recs, rows added 10/12).
   Each rule is marked [plps <Row-ID>]. Owner: "I need to make the site simpler and easier to
   use ... I also want to make it look better, more organized, and consistent."
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* [plps Site-46] Standing guidance has the quiet look of a blue tip (pale background, a line at
   the left), not the solid bright box of a message that follows an action. A panel opts in with
   the class `standing-note`: the first-run line and the "Showing all N" banner on the lists, the
   demo's "Try it" line, the dashboard's notes. Saved / refused / warning panels are unchanged.
   `main` + three classes outranks the shared `.alert-panel.info` (0,2,0), which loads later. */
main .alert-panel.info.standing-note {
    color: var(--color-info-text);
    background-color: var(--color-info-bg);
    border-color: transparent;
    border-left: 3px solid var(--color-info-border);
    border-radius: var(--border-radius-sm, 4px);
    padding: 0.5rem 0.75rem;
}
main .alert-panel.info.standing-note .button.transparent:hover { background-color: transparent; }

/* [plps Packlist-11] Expand All / Collapse All sit at the right end of the row above the list:
   beside Build Mode | Pack Mode on the Packlist, at the end of the "what is showing" line on the
   Tasklist. On a phone the Tasklist's line keeps the full width and the two buttons wrap under
   it. Nothing is drawn when the row holds neither. */
.plp-list-head {
    display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.75rem;
    margin: 0 0 0.75rem;
}
.plp-list-head:not(:has(> *)) { display: none; }
.plp-list-head > .plp-packmode-row,
.plp-list-head > .plp-view-summary { margin-bottom: 0; flex: 1 1 auto; min-width: 0; }
.plp-list-head > .plp-list-tools { margin-left: auto; padding: 0; flex: 0 0 auto; }
@media (max-width: 575px) {
    .plp-list-head > .plp-view-summary { flex-basis: 100%; }
}

/* [plps Packlist-11] The Packlist's Show check boxes ran eight across with the ninth alone on a
   second line. Three even columns on a wide screen, when there are seven or more of them (the
   Tasklist's four stay on one row). */
@media (min-width: 992px) {
    #pnlOptionsCard .plp-options-checks:has(> :nth-child(7)) {
        display: grid; grid-template-columns: repeat(3, max-content); gap: 0.5rem 2.5rem;
    }
}

/* [plps Packlist-7] [plps Tasklist-5] While Compare With shows "Only What I Haven't Selected",
   Status is not applied: its box is dimmed (packlist-page.js / tasklist-page.js set the class).
   Dimmed, not disabled: a disabled box posts nothing and the saved Status would be lost. */
#fgStatus.plp-idle > label,
#fgStatus.plp-idle > select { opacity: 0.45; }
#fgStatus.plp-idle > select { pointer-events: none; }

/* [plps Site-42] The three-dot menu button on a list row was a solid bright-blue square, the
   loudest thing on the row and the least used. A quiet outline in the text color, so the check
   boxes and the name carry the row. Packlist, Tasklist, Configure Items, Configure Tasks. */
main .button.plp-more-btn:not(.plp-more-btn-alert) {
    background-color: transparent;
    color: var(--color-text);
    border: 1px solid var(--color-border);
    box-shadow: none;
}
main .button.plp-more-btn:not(.plp-more-btn-alert):hover,
main .button.plp-more-btn:not(.plp-more-btn-alert):focus-visible {
    background-color: transparent;
    border-color: var(--color-text);
}

/* [plps MyProfile-3] The plain fold on My Profile that holds Backup Email Address and Backup Phone
   Number (details#profileBackups). It opens by itself when either box has a value. */
.profile-backups { margin-bottom: 1rem; }
.profile-backups > summary { cursor: pointer; display: inline-block; }
.profile-backups[open] > summary { margin-bottom: 0.75rem; }

/* [plps MyProfile-4] The account forms on a laptop (992px and up; a phone is unchanged).
   My Profile: Birthday's Month / Day / Year sized to what they hold. Keyed on the Birthday card, so
   Join's own row is not touched, and nothing at 480px and below (the 2026-10-11 phone fix) changes.
   Preferences: .prefs-grid puts its dropdowns in two columns. A label with a button reads heading,
   one line, the button under it (the markup is in that order; .prefs-action-group only stacks it).
   Contact Us: Urgency, Importance and Expecting a Reply on one row of three. */
@media (min-width: 992px) {
    .main-card[data-card-key="birthday"] .join-row.join-birthday-row { grid-template-columns: 200px 90px 120px; justify-content: start; }
    .prefs-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.5rem; align-items: start; }
}
/* Contact Us: Urgency, Importance and Expecting a Reply are three equal columns from 768px up and two
   columns on a phone, as on qFIT (carried the same night; it was three from 992px in the first cut).
   pnlNonAdminFields is display:contents so Expecting a Reply joins the grid; the email box under it
   spans the row. */
.cu-three-row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1rem; }
.cu-three-row > .cu-contents { display: contents; }
.cu-three-row > .form-group,
.cu-three-row > .cu-contents > .form-group { min-width: 0; }
.cu-three-row #pnlContactFields { grid-column: 1 / -1; min-width: 0; }
.cu-three-row .cu-select-auto { width: 100%; }
@media (min-width: 768px) {
    .cu-three-row { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.prefs-action-group { display: flex; flex-direction: column; align-items: flex-start; }
.prefs-action-group > .button { margin-top: 0.25rem; }

/* [plps HelpHub-3] The help pages on a laptop (992px and up; a phone is unchanged). `body` in front:
   the shared sheet loads later and sets .about-grid-3's columns with the same weight.
   Help: a visitor sees four choice cards (four across from 1200px, two and two below it); a member
   sees five (three, then two). Never three and one.
   Tips: the topic cards two to a row; every other block keeps the full row. The Find a Tip script
   hides cards with the hidden attribute, which a grid honors.
   Tutorials: the shut group bars two across; an open group takes the whole row, and an odd last
   bar spans the row. */
@media (min-width: 992px) {
    body .about-grid-3.hub-router { grid-template-columns: repeat(12, minmax(0, 1fr)); }
    body .about-grid-3.hub-router > .hub-tile { grid-column: span 6; }
    body .about-grid-3.hub-router > .hub-tile:first-child:nth-last-child(5),
    body .about-grid-3.hub-router > .hub-tile:first-child:nth-last-child(5) + .hub-tile,
    body .about-grid-3.hub-router > .hub-tile:first-child:nth-last-child(5) + .hub-tile + .hub-tile { grid-column: span 4; }

    body .tips-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.25rem; align-items: start; }
    body .tips-grid > * { grid-column: 1 / -1; }
    body .tips-grid > details.main-card[data-pp-group] { grid-column: auto; }

    body .tut-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 1.25rem; align-items: start; }
    body .tut-grid > details.tut-group[open] { grid-column: 1 / -1; }
    body .tut-grid > details.tut-group:last-child:nth-child(odd) { grid-column: 1 / -1; }
}
@media (min-width: 1200px) {
    body .about-grid-3.hub-router > .hub-tile:first-child:nth-last-child(4),
    body .about-grid-3.hub-router > .hub-tile:first-child:nth-last-child(4) ~ .hub-tile { grid-column: span 3; }
}

/* [plps Site-62] The one box that says a page, or a part of one, needs an account: one short line,
   the green Join Free button and a Log in link. `.join-box` alone inside an existing card;
   `.main-card.join-box` where it stands by itself. It replaces four looks (a solid blue band with
   two small links, the band in a card, the band alone, an italic line over a button). */
.join-box > p { margin: 0 0 0.75rem; }
.join-box-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem 1.25rem; }

/* [plps Itinerary-7] The Itinerary's open Add / Edit form on a laptop used five box widths in one
   column (Title 480, Description 656, Type and Status 320 each, Start Date 324, others inside
   Location). One rule: a single box runs the width of the column, a pair is two halves. The pairs
   (.form-row, .itin-datetime-row) already split the column, so only the caps on the single boxes are
   lifted; the boxes that are narrow on purpose (Sort Order, a sub-item's Time, the Add to Expenses
   amount and currency) stay narrow. The order of the boxes is unchanged; a phone is unchanged. */
@media (min-width: 992px) {
    #itinFormCard .form-group .textbox:not(.input-w-narrow):not(.input-w-narrow-md):not(.itin-subedit-time),
    #itinFormCard .form-group select.textbox:not(.input-w-narrow):not(.input-w-narrow-md),
    #itinFormCard .form-group .textarea {
        max-width: none;
    }
}

/* [plps Trips-6] The "Selected trip:" bar on All Trips is drawn only while the selected trip's row
   is off the screen (trips-page.js sets `hidden`); the bar's own rule sets display, so the
   attribute needs this to take effect. */
.trip-selected-bar[hidden] { display: none; }

/* [plps EditTrip-10] Edit Trip on a laptop. Trip Details: Leaving Date, Return Date and Leave
   House By on one row (they were two rows, each box 480px in a 1,150px card). Starting Location:
   City, State / Province, Postal Code and Country on one row under the street. A phone is
   unchanged: these wrappers are plain blocks below 992px. */
@media (min-width: 992px) {
    .et-when-row { display: flex; gap: 1rem; align-items: flex-start; }
    .et-when-row > #datesRow { flex: 2 1 0; }
    .et-when-row > #leaveHouseRow { flex: 1 1 0; }
    .et-start-row { display: flex; gap: 1rem; align-items: flex-start; }
    .et-start-row > .form-row { flex: 1 1 0; }
}

/* [plps EditTrip-9] The fold at the foot of the Trip Link card that holds the two boxes for
   someone else's Trip Link Code. A plain fold whose summary reads as a link. */
.et-code-fold > summary { cursor: pointer; display: inline-block; margin-bottom: 0.25rem; }
.et-code-fold[open] > summary { margin-bottom: 0.75rem; }

/* [plps Site-61] The block that heads Edit Item and Edit Task is a standing note now (the quiet tip
   look of Site-46, where it was a solid blue block that outweighed the form). The item's or task's
   name is its large line. */
.standing-note .standing-note-title { font-size: var(--font-size-lg, 1.125rem); font-weight: var(--font-weight-bold, 700); color: var(--color-text); }

/* [plps ConfigureItems-3] The small "Show" heading above the first row of an open category on
   Configure Items and Configure Tasks (div.cfg-show-head). It sits over the check-box column, so it
   takes the width of .plp-cb-label (30px; 28px on a phone; 32px in Compact Rows; 44px on a touch
   screen) and centers its word, like the SEL / PKD captions on the Packlist. It replaces a
   dismissible tip that explained what the unlabeled column was. */
.cfg-show-head {
    width: 30px; padding: 0.25rem 0 0; font-size: var(--font-size-xs, 0.75rem); font-weight: 600; line-height: 1.2;
    text-align: center; color: var(--color-text-muted);
}
.plp-checklist.plp-compact .cfg-show-head { width: 32px; }
@media (max-width: 575px) {
    .cfg-show-head { width: 28px; }
    .plp-checklist.plp-compact .cfg-show-head { width: 32px; }
}
@media (pointer: coarse) {
    .cfg-show-head,
    .plp-checklist.plp-compact .cfg-show-head { width: 44px; }
}

/* [plps ShoppingList-5] The Add Item box carries the red star instead of the hint "(required)":
   the textarea sits inside div.sl-add-name-wrap so the star can sit in its right edge. The wrapper
   takes over the flex sizing .sl-add-name had. The Store tip's wrapper (hidden until a first store
   is added) keeps the full row the tip had. */
.sl-add-name-wrap { position: relative; flex: 1 1 14rem; min-width: 0; }
.sl-add-name-wrap > .sl-add-name { width: 100%; padding-right: 1.6rem; }
.sl-add-star { position: absolute; top: 0.55rem; right: 0.7rem; line-height: 1; pointer-events: none; }
@media (max-width: 575px) {
    .sl-add-name-wrap { flex: 1 1 100%; width: 100%; }
}
.sl-add-row > #sl-store-hint-wrap { flex: 1 1 100%; }

/* [plps Quicklist-4] A logged-out visitor's send bar on the Quicklist holds only the count and
   Clear Checkboxes: the row drops the bottom margin it keeps for a member's controls under it. */
.ql-send-bar.ql-send-bar-lone .ql-send-lead { margin-bottom: 0; }

/* [plps Site-55] Options & Filters closes one way on the six list pages: no corner x, and the foot
   row (.options-close-row). Configure Items / Tasks keep their green Apply there, with Close as an
   outline button beside it; on the foot row's blue band an outline button in the link color could not
   be read, so it is white there. */
main .options-close-row .button.transparent { color: #fff; border-color: rgba(255, 255, 255, 0.85); }
main .options-close-row .button.transparent:hover,
main .options-close-row .button.transparent:focus-visible { background-color: rgba(255, 255, 255, 0.15); color: #fff; border-color: #fff; }

/* [plps Site-59] Configure Items / Tasks: the search row sat flush on the card under it. */
.plp-search-row.cfg-search-row { margin-bottom: 1rem; }

/* [plps Parks-5] Park and Trail on a laptop: About and Location side by side (.pd-pair is a plain
   div around the two cards; below 992px an ordinary block). With no map About keeps the full width.
   align-items:start so a card the member shut does not stretch to the height of the other. */
@media (min-width: 992px) {
    .pd-pair { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: 1rem; align-items: start; }
    .pd-pair > #cardAbout:only-child { grid-column: 1 / -1; }
}

/* [plps Park-3] "+ Add to Itinerary" sits with the buttons under the map on a park and beside
   "+ I Hiked This" on a trail. With a selected trip, or exactly one trip, the trip dropdown is hidden
   by the page script and the button names the trip: it fills its row and cuts a long name with an
   ellipsis; with several trips and none selected the dropdown is back beside it. */
.park-map-actions > .park-itin-add { grid-column: 1 / -1; margin-top: 0; }
.park-itin-pick { flex: 1 1 200px; min-width: 0; }
.park-itin-row > .button {
    flex: 1 1 11rem; min-width: 0; max-width: 100%; justify-content: center; text-align: center;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.trail-itin-slot { min-width: 0; }
@media (max-width: 575px) {
    .form-actions > .trail-itin-slot { flex: 1 1 100%; }
}

/* [plps Trails-5] The Trails and Camping filter cards on a laptop (992px and up; a phone keeps the
   2026-10-11 arrangement of Trails-4). Trails: the five dropdowns on one row (Park widest), the
   check-box groups four across. Both pages: the search box and Apply / Reset share a row. Camping:
   State, Agency and Type on one row. The Trails card was 1,180px tall. */
@media (min-width: 992px) {
    .park-filter-row.trail-filter-selects {
        display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr) repeat(3, minmax(0, 1fr));
        gap: 0.5rem; align-items: end;
    }
    .trail-filter-selects > .dropdown,
    .trail-filter-selects > .trail-labeled-filter { width: 100%; max-width: 100%; min-width: 0; }
    .park-filter-row.cs-filter-selects { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.5rem; }
    .cs-filter-selects > .dropdown { width: 100%; max-width: 100%; min-width: 0; }
    #trailActivityRow, #trailFeatureRow, #trailShapeRow { grid-template-columns: repeat(4, minmax(0, 1fr)); }
    .filter-search-row { display: grid; grid-template-columns: minmax(0, 30rem) auto; column-gap: 1rem; align-items: end; }
    .filter-search-row > .form-actions { margin: 0 0 1rem; }
}

/* [plps PlacesNearMe-5] Places Near Me: How Far Along the Route sits in a plain wrapper that is hidden
   until a route is drawn; the wrapper takes the place its group had in the row.
   My Places: the road-marking and record buttons are Leaflet controls drawn on the map by the shared
   map scripts, so they cannot be moved into a fold. myplaces-page.js puts `mp-tools-on` on the map's
   card while the fold "More Map Tools" is open (and while a recording is running); without the class
   the two controls are not drawn. 🛑 The folds are .mp-fold, never .mp-more: the page script treats a
   click inside .mp-more as a row's menu button. */
.gps-sliders > .gps-slider-wrap { min-width: 220px; flex: 1 1 260px; }
#mpMapCard:not(.mp-tools-on) .mr-ctl,
#mpMapCard:not(.mp-tools-on) .rec-ctl { display: none; }
.mp-fold { margin-top: 0.4rem; }
.mp-fold > summary { cursor: pointer; font-size: var(--font-size-sm, 0.875rem); }
.mp-fold-body { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 0.5rem; }
.mp-map-tools { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 0.4rem 1rem; margin-top: 0.5rem; }
.mp-map-tools > .mp-fold { margin-top: 0; align-self: center; }

/* [plps TripDashboard-9] The small "Open" pill sits at the right edge of EVERY card's title row. On
   the Packlist and Tasklist cards it sat directly after the title: those two have a summary on
   the title row which carries the auto margin, and the summary is not drawn while the card is
   open (the [plpb TripDashboard-1] rule above), so nothing pushed the pill right. Where that rule
   hides the summary the pill takes the margin back. */
.main-card[data-summary-sel=".plp-summary p"]:not(.home-collapsed):has(.plp-summary:not(.visually-hidden)) .card-title.td-has-go > .td-head-go { margin-left: auto; }

/* [plps Site-43] (the part built) On a wide screen a category's count sits directly after its name
   ("Bags & Containers (23 items)"): at the right edge it was about 1,000px from the name it belongs
   to. A phone keeps it at the right edge. The row's other half, holding the lists themselves to
   about 760px on a wide screen, is NOT built: it changes the look of ten pages and is the owner's
   call (see the row's Notes in the workbook). */
@media (min-width: 992px) {
    .plp-group-header .plp-group-count { margin-left: 0.25rem; }
}

/* ── Carried from qFIT's build of 2026-10-12 (the same pages on both sites; qsb\carry_items.md) ── */

/* [plps carry Donate] "Copy Venmo Link" / "Copy PayPal Link" are small text links UNDER their green
   buttons (same elements, ids and handlers). The shared phone rule gives .donate-cta a 100% flex
   basis, which in a column would be a height, so it is put back to full width here; `body` + three
   classes because this sheet loads before the shared one. */
body .donate-method .donate-method-actions { flex-direction: column; align-items: center; gap: 0.35rem; }
body .donate-method .donate-method-actions .donate-copy-link { flex: 0 0 auto; font-size: var(--font-size-sm); white-space: nowrap; }
@media (max-width: 575px) {
    body .donate-method .donate-method-actions { align-items: stretch; }
    body .donate-method .donate-method-actions .donate-cta { flex: 0 0 auto; width: 100%; }
    body .donate-method .donate-method-actions .donate-copy-link { align-self: center; }
}

/* [plps carry SiteMap] The Site Map's groups ship shut (data-fold="shut" + home-collapsed, written by
   SiteMap.aspx.vb). The fold script is deferred, so until it has built the fold the groups would
   paint open and snap shut: this hides all but the title from the first paint and stops applying the
   moment the fold is built. The page carries a <noscript> rule that undoes it. A search opens the
   groups with a match (the .sm-finding rules above). */
.sm-group.home-collapsed:not([data-collapsible="1"]) > *:not(.sm-group-title) { display: none; }

/* [plps carry ContactList] On each My Contacts row Block and Remove sit behind one small "..." button
   (details.ct-more, the two buttons unchanged inside .ct-more-menu). Blocked rows keep Unblock and
   Remove in the open. Remove's red words come from the shared sheet, as before. */
.ct-more { position: relative; }
.ct-more > summary { list-style: none; cursor: pointer; }
.ct-more > summary::-webkit-details-marker { display: none; }
.ct-more-menu {
    position: absolute; right: 0; top: calc(100% + 0.25rem); z-index: 5;
    display: flex; flex-direction: column; gap: 0.4rem; min-width: 9rem; padding: 0.5rem;
    background: var(--color-bg-card); border: 1px solid var(--color-border); border-radius: 0.375rem;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
}
.ct-more-menu .button { width: 100%; justify-content: flex-start; }

/* [plps Home-9] Home's Weather card on a laptop. The location picker is not drawn as a card inside
   the card, and Check My Location, the city box and Search share one row; the city box is held to
   30rem like every other search box (it ran 964px). Before a forecast is loaded the card was 430px
   tall for one button and one box. Home only (.wx-home-card): the Weather page keeps its own
   layout. A phone is unchanged. */
@media (min-width: 992px) {
    .wx-home-card > #wxLocCard.main-card {
        border: 0; box-shadow: none; background: transparent; padding: 0; margin-bottom: 0.75rem;
    }
    .wx-home-card .wx-loc-row { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 0.5rem 1rem; }
    .wx-home-card .wx-loc-row > .form-group { margin-bottom: 0; }
    .wx-home-card .wx-loc-row > .form-group:last-child { flex: 0 1 38rem; }
    .wx-home-card .wx-loc-row .wx-geo-row { margin-bottom: 0; }
    .wx-home-card .wx-loc-row .wx-search-row .input-clearable { max-width: 30rem; }
    /* Home's row of ten chips was 17px too wide for one line at 1,366px: "Walkthrough" wrapped alone.
       A row of ten or more gets 2px less padding each side of a chip, which fits it. */
    main nav.td-quicknav:has(> .td-quicknav-chip:nth-child(10)) > .td-quicknav-chip { padding-left: 0.72rem; padding-right: 0.72rem; }
}

/* [quick-edit] Quick Edit (owner, 2026-10-12): the pop-up a hold or double-click on a name
   opens on Packlist, Tasklist and Quicklist (Scripts/quick-edit.js). The backdrop, card and
   buttons are the shared .sc-modal; these rules only lay out its form. Every selector carries
   .plp-qe so it outranks the shared one-class rules, which load after this sheet. The twin of
   qFIT's .chk-qe block: same sizes. */
.sc-modal.plp-qe {
    max-width: 440px;
    max-height: calc(100vh - 2rem);
    overflow-y: auto;
}
.plp-qe .plp-qe-name {
    margin: 0 0 0.85rem;
    overflow-wrap: anywhere;
}
.plp-qe .plp-qe-row {
    display: flex;
    gap: 0.75rem;
    margin-bottom: 0.85rem;
}
.plp-qe .plp-qe-field {
    flex: 1 1 0;
    min-width: 0;
}
.plp-qe .plp-qe-field .dropdown { width: 100%; }
.plp-qe .plp-qe-check {
    margin: 0 0 0.6rem;
}
.plp-qe .plp-qe-loading { margin: 0.5rem 0 1rem; }
.plp-qe .plp-qe-msg { margin: 0.35rem 0 0; }
.plp-qe .plp-qe-msg:empty { display: none; }
.plp-qe .plp-qe-msg.is-error { color: var(--color-danger-text, var(--color-danger)); }
.plp-qe .plp-qe-actions {
    flex-wrap: wrap;
    align-items: center;
    margin-top: 0.75rem;
}
/* Edit Item / Edit Task sits at the left, away from Cancel and Save. */
.plp-qe .plp-qe-links {
    display: flex;
    gap: 0.5rem;
    margin-right: auto;
}
.plp-qe .plp-qe-links .button { margin: 0; }
/* On a narrow phone the three buttons do not fit one line: Edit takes a line of its own, so
   Cancel and Save stay side by side under it. */
@media (max-width: 400px) {
    .plp-qe .plp-qe-links { flex: 1 1 100%; }
}

/* [plps carry ContactUsLog] With nothing sent yet the Contact Us Log writes <div class="empty-state cul-empty">:
   icon, title, ONE sentence, one green button (qFIT's UI review Site-172, carried 2026-10-12). The shared sheet
   gives the title and the sentence the same size, so the title is one step larger here. While that state shows,
   the title row's own Send New Message button is hidden: the page has the one button. `main` / `body` because
   this sheet loads before the shared one. */
main .cul-empty .empty-state-title { font-size: var(--font-size-xl); }
main .cul-empty .empty-state-sub { font-size: var(--font-size-base); }
body:has(.cul-empty) .page-header-actions { display: none; }
/* css_S1.css - PacklistPRO, helper S1, 2026-10-13. Two blocks for the lead to merge into
   PacklistPRO/Content/styles.css. Neither Preferences.aspx nor HelpHub.aspx has a <style> block. */

/* -- Preferences-2 (qFIT UI review, carried 2026-10-13): Preferences is three folding cards (Display, Site Behavior,
      Security), all shipped shut: class home-collapsed + data-fold="shut" + class pref-card in the markup.
      site-core.js is deferred, so until it has built the fold there is no .home-card-body for .home-collapsed to
      hide and the cards would paint open and then snap shut. This hides everything but the title from the first
      paint and stops applying the moment the fold is built (data-collapsible="1"). Preferences.aspx carries a
      <noscript> rule in its head that shows the cards whole to a reader with no script. Same rule as qFIT's
      (written there with body.qfit-page in front); put it next to the Site Map's anti-flash rule
      (.sm-group.home-collapsed:not([data-collapsible="1"]) ...) in Content/styles.css. ------------------------- */
.pref-card.home-collapsed:not([data-collapsible="1"]) > *:not(.card-title) { display: none; }

/* -- HelpHub-6 (qFIT UI review, carried 2026-10-13; qFIT's HelpHub-5): each Help destination is ONE tappable row
      (its name and one line under it, the whole row a link, about 60px tall) in a single column on a phone and two
      across from 768px. Copied from qFIT's Content/styles.css with its body.qfit-page prefix replaced by plain
      body, the way the shared sheet writes body .hub-tile: Content/styles.css loads BEFORE Shared/styles_shared.css,
      whose a:hover rule (0,1,1) would otherwise turn the hovered row's name the link color, so the hover rule below
      also sets the color. The class names are qFIT's (.hub-list, .hub-row, .hub-row-name, .hub-row-line) so one
      copy can later move into the shared sheet (drop the body then). Written by HelpHub.aspx.vb BuildRouter.
      The old .hub-router / .hub-tile card rules (this site's HelpHub-3 of 2026-10-12, "[plps HelpHub-3]" in
      Content/styles.css, and body .hub-tile in the shared sheet) are no longer used by any page; they can stay. --- */
body .hub-list {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.5rem;
}
body .hub-row {
    display: block;
    min-height: 60px;
    padding: 0.6rem 0.9rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-lg, 0.5rem);
    background: var(--color-bg-card);
    color: var(--color-text);
    text-decoration: none;
}
body .hub-row:hover,
body .hub-row:focus-visible {
    border-color: var(--color-primary, var(--color-accent));
    color: var(--color-text);
    text-decoration: none;
}
body .hub-row-name {
    display: block;
    font-size: var(--font-size-lg, 1.125rem);
    font-weight: var(--font-weight-bold, 700);
    line-height: 1.3;
}
body .hub-row-line {
    display: block;
    font-size: 0.875rem;
    line-height: 1.3;
    color: var(--color-text-muted);
}
@media (min-width: 768px) {
    body .hub-list {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* ----- Trails: State stands above the "Options & Filters" fold (the same change as on qMEET; qMEET UI review
   Parks-1 = this site's row Trails-1, owner 2026-10-13: "as you recommend"), so the dropdown row inside the
   fold holds four: Park (widest), Difficulty, Sort, Length. The earlier rule ([plps Trails-5]) sized five
   columns; this one, with an id in front so the order of the two does not matter, sizes four. */
@media (min-width: 992px) {
    #trailOptions .park-filter-row.trail-filter-selects {
        grid-template-columns: minmax(0, 1.6fr) repeat(3, minmax(0, 1fr));
    }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════
   THE ROWS THE OWNER DECIDED ON 2026-10-13 (tab "PacklistPRO UI Recs"; each block is marked [plpd <Row-ID>]).
   ════════════════════════════════════════════════════════════════════════════════════════════════ */

/* ----- [plpd Site-51] The trip's name in the trip bar is a link to All Trips (owner: "yes, do what you
   recommend": the name itself as the link, with no extra words). It keeps the bar's size and weight and takes
   the link color, so it reads as the one thing in the bar that goes somewhere. */
a.trip-header-name,
a.trip-header-name:visited {
    color: var(--color-link);
    text-decoration: none;
}
a.trip-header-name:hover,
a.trip-header-name:focus-visible {
    text-decoration: underline;
}

/* ----- [plpd Site-40] The trip's pages as a row under its name (owner: "yes"; the same chips that ended each
   trip page, now drawn once by TripHeader.ascx.vb). The row takes the bar's whole width, so it always sits
   on a line of its own. The chip being read is filled (aria-current="page"), the look .trip-filter-chip.is-active
   has. On a phone the row does not wrap: it scrolls sideways, and site.js initTripNav brings the filled chip
   into view. */
.trip-nav {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    flex: 1 1 100%;
    min-width: 0;
    margin: 0;
}
.trip-nav-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    flex: 0 0 auto;
    min-height: 38px;
    padding: 0.35rem 0.8rem;
    border: 1px solid var(--color-border);
    border-radius: 999px;
    background: var(--color-bg-card);
    color: var(--color-text);
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    text-decoration: none;
    white-space: nowrap;
}
.trip-nav-chip:hover {
    background: var(--color-primary-light);
    border-color: var(--color-primary);
    color: var(--color-text);
    text-decoration: none;
}
.trip-nav-chip:focus-visible {
    outline: 2px solid var(--color-border-focus);
    outline-offset: 2px;
}
.trip-nav-chip[aria-current="page"] {
    background: var(--color-primary);
    border-color: var(--color-primary);
    color: #111;                      /* 7.6:1 on the brand blue, as .trip-filter-chip.is-active */
    font-weight: var(--font-weight-bold, 600);
}
.trip-nav-icon { font-size: 1em; line-height: 1; }
@media (forced-colors: active) {
    .trip-nav-chip[aria-current="page"] { background: Highlight; color: HighlightText; forced-color-adjust: none; }
}
@media (max-width: 767.98px) {
    .trip-nav {
        flex-wrap: nowrap;
        overflow-x: auto;
        overscroll-behavior-x: contain;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        /* the row runs to the bar's own edges, so a chip cut by the edge says "there is more this way" */
        margin: 0 -0.9rem;
        padding: 0 0.9rem 2px;
    }
    .trip-nav::-webkit-scrollbar { display: none; }
    .trip-nav-chip { min-height: 42px; }
}
@media print {
    .trip-nav { display: none; }
}

/* ----- [plpd Site-39] ONE check box per row on the Packlist and Tasklist, first in the row (owner: "yes. Let's
   make it obvious what mode the user is in somehow. Possibly different color checkboxes as well?").
   The box means what the list's mode says: Selected while building (plp-mode-build), Packed / Done while
   checking off (plp-mode-pack on the Packlist, plp-mode-do on the Tasklist). So the box takes the mode's
   color, at rest (a ring) and checked (the fill): the brand blue to choose, the Save green to check off;
   the lit mode button above the list is filled with the same color. The captions SEL / PKD / DONE are gone,
   so the label is the box alone; its 30 / 44px width (the tap area) is kept by the older .plp-cb-label rules. */
.plp-checklist { --plp-box-color: var(--color-accent); }
.plp-checklist.plp-mode-pack,
.plp-checklist.plp-mode-do { --plp-box-color: var(--color-save-btn); }
/* Preferences' "Show Both Check Boxes" (owner, 2026-10-14; default off): Selected and Packed / Done side by
   side at the left in either mode, so each box takes its OWN field's color, not the mode's. */
.plp-checklist.plp-both-boxes .plp-cb-main input { --plp-box-color: var(--color-accent); }
.plp-checklist.plp-both-boxes .plp-cb-main input[data-field="packed"],
.plp-checklist.plp-both-boxes .plp-cb-main input[data-field="complete"] { --plp-box-color: var(--color-save-btn); }
.plp-checklist.plp-both-boxes .plp-item-row > .plp-cb-label.plp-cb-main + .plp-cb-label.plp-cb-main { margin-left: -0.1rem; }
/* The two words over the columns (Packlist.BoxHeadHtml / Tasklist.BoxHeadHtml: Take / Packed, Do / Done), first
   in every open category. Both columns are one fixed width while the option is on, so head and boxes line up
   at every width and in Compact Rows; the head copies the row's gap and the box's margins. */
.plp-checklist.plp-both-boxes .plp-item-row > .plp-cb-label.plp-cb-main,
.plp-checklist.plp-both-boxes .plp-box-head > span { width: 2.75rem; min-width: 2.75rem; }
.plp-box-head {
    display: flex; gap: 0.25rem; padding: 0.35rem 0 0;
    font-size: var(--font-size-xs, 0.75rem); font-weight: 600; line-height: 1.2; color: var(--color-text-muted);
}
.plp-box-head > span { flex: 0 0 auto; text-align: center; }
.plp-box-head > span:first-child { margin-right: 0.15rem; }
.plp-box-head > span + span { margin-left: -0.1rem; }
/* Centered between the row's divider lines (owner, 2026-10-15: "a little bit too high in each row"). It was
   flex-start, so the 27px box sat at the top of a row the 44px ⋮ button makes 61px tall (8px above, 26px below).
   The row wraps, and a wrapped flex row centers each LINE on its own, so on a row with a second line the box
   stays level with the name. */
.plp-item-row > .plp-cb-label.plp-cb-main {
    flex: 0 0 auto;
    align-self: center;
    margin-right: 0.15rem;
}
.plp-checklist .plp-cb-main input[type="checkbox"].checkbox {
    accent-color: var(--plp-box-color);
    border-radius: 5px;
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--plp-box-color) 75%, transparent);
}
/* The same box on the Quicklist and the Shopping List (owner, 2026-10-15: "make the checkboxes look the same on
   Quicklist? (maybe black border, instead of blue or green?) make use those same checkboxes on ShoppingList as
   well"). Neither list has modes, so the ring and the fill are the text color: black on the light theme, light
   on the dark one. Later the same day My Items, My Tasks and My Tags' Show boxes took it too (owner: "do (5)").
   All five are 27px by the "[plpb Site-22]" size rules. paulmendelson.com's To-Do has the same look in its own
   sheet. */
main input[type="checkbox"].checkbox.ql-tick,
main input[type="checkbox"].checkbox.sl-cb,
main input[type="checkbox"].checkbox.sht-show-cb,
main input[type="checkbox"].checkbox.cfg-show-cb {
    accent-color: var(--color-text);
    border-radius: 5px;
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-text) 75%, transparent);
}
.plp-packmode-row .plp-mode-toggle > #btnPackMode.button-active,
.plp-packmode-row .plp-mode-toggle > #btnDoMode.button-active {
    background: var(--color-save-btn);
    border-color: var(--color-save-btn);
    color: #111;                      /* 9:1 on the Save green */
}
@media (forced-colors: active) {
    .plp-checklist .plp-cb-main input[type="checkbox"].checkbox,
    main input[type="checkbox"].checkbox.ql-tick,
    main input[type="checkbox"].checkbox.sl-cb,
    main input[type="checkbox"].checkbox.sht-show-cb,
    main input[type="checkbox"].checkbox.cfg-show-cb { box-shadow: none; }
}

/* ----- [plpd Site-49] Item and task names are drawn in the ordinary text color (owner: "yes"), as the
   Quicklist draws them: blue goes back to meaning "this goes somewhere". The row set --color-info-text
   for everything in it; the name's own look (weight, the struck-through muted state) is unchanged. Covers
   every list built from .plp-item-row: Packlist, Tasklist, Configure Items / Tasks, Show / Hide Tags. */
.plp-item-row { color: var(--color-text); }

/* ----- [plpd Site-45] Itinerary, Notes and Expenses in one order: title + one green "+ Add ..." button, the
   trip bar, the add / edit form, the list (open), the other cards (shut). The form card is NOT DRAWN while it
   is shut: the title-row button (or choosing a row) opens it, in place, directly under the trip bar. */
details.add-form-card:not([open]) { display: none; }
details.add-form-card { scroll-margin-top: calc(var(--nav-height, 56px) + 0.75rem); }
/* The form used to be the right-hand column beside the list (38% / 62% from 768px); the list is alone now. */
.notes-layout > .notes-list-col:only-child { flex: 1 1 100%; }

/* ----- [plpd Site-28] Email, Print and Export in ONE place on every trip page: a small row at the foot of the
   page ("Share / Print", then the page's own buttons, unchanged). Itinerary, Notes, Expenses, Packlist, Tasklist. */
.trip-share-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-top: var(--section-gap, 1.5rem);
}
.trip-share-label {
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-bold, 600);
    color: var(--color-text-muted);
    margin-right: 0.25rem;
}
@media print {
    .trip-share-row { display: none; }
}

/* ----- [plpd ContactUs-1] Contact Us: Expecting a Reply is a check box (owner: "keep Importance. Make
   expecting a reply a checkbox"), in the third cell of .cu-three-row. The cell sits at the bottom of the
   grid row so the box lines up with the two dropdowns' boxes, not with their labels. */
.cu-reply-cell { display: flex; flex-direction: column; justify-content: flex-end; }
.cu-reply-check { display: flex; align-items: center; gap: 0.5rem; min-height: 2.5rem; margin: 0; cursor: pointer; }
.cu-reply-check .input-label { margin: 0; }

/* ----- [plpd About-2] About: the section cards under Screenshots ship shut (owner: "yes"; class about-fold +
   home-collapsed + data-fold="shut" in About.aspx). site-core.js is deferred, so until it has built the fold
   there is no body for .home-collapsed to hide and the cards would paint open and then snap shut. This hides
   everything but the title from the first paint and stops applying once the fold is built
   (data-collapsible="1"). About.aspx carries a <noscript> rule that shows the cards whole. Same shape as the
   .pref-card rule. */
.about-fold.home-collapsed:not([data-collapsible="1"]) > *:not(.heading) { display: none; }

/* ----- [plpd Packlist-10] Recommended Gear is a small outline link at the right-hand end of the Share / Print
   row at the foot of the Packlist (owner: "yes"); "+ Add Item" is the title row's one green button. */
.trip-share-aside { margin-left: auto; }

/* ----- [plpd Packlist-3] Options & Filters in two parts (owner: "yes"): the everyday choices, then the
   "More Options" fold (details.form-more#optionsMore, the Edit Item fold's look). The row of everyday choices
   above it carries 1rem of bottom margin and the fold 1rem of top margin: one gap, not two. Shared
   .form-more[open] only spaces a first child that is a .form-group / .form-row; here the first child is the
   Show row or whatever is drawn first. */
#optionsPanel > .form-row + #optionsMore { margin-top: 0; }
#optionsMore[open] > .form-more-summary + * { margin-top: 0.75rem; }

/* ----- [plpd Site-30] The search box shares the top row of the Options & Filters card (owner: "yes"): ONE
   line holding the Options & Filters button and, beside it, the search box with its clear x and its search
   button. The card's children are the button (#btnShowOptions), the search Panel
   (#pnlFiltersCard.plp-search-wrap) and the panel (#optionsPanel); they stay DIRECT children of the card
   because the shared .options-card rules (the tint, the dimmer, the filled strip) select
   "> .options-disclosure" and "> .options-panel". So the card itself is the flex row. The ids outrank the
   shared "width: 100%" on the button and the base .plp-search-input { flex: 2; min-width: 180px }. Only the
   Packlist and the Tasklist have these ids. */
#pnlOptionsCard {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
}
#pnlOptionsCard > button.options-disclosure { flex: 0 1 auto; width: auto; min-width: 0; }
#pnlOptionsCard > .plp-search-wrap {
    flex: 1 1 13rem;
    min-width: 13rem;
    box-sizing: border-box;
    padding: 0.35rem 0.65rem 0.35rem 0.25rem;
}
#pnlOptionsCard > .options-panel { flex: 1 0 100%; box-sizing: border-box; }
#pnlOptionsCard .plp-search-row { flex-wrap: nowrap; align-items: center; gap: 0.4rem; }
#pnlOptionsCard .plp-search-input { flex: 1 1 0; min-width: 0; }
#pnlOptionsCard .plp-search-row > .button { flex: 0 0 auto; }
@media (max-width: 575px) {
    /* The Options button gives up its gear icon and some size, and its "N filters on" note goes UNDER the
       words, so the button is no wider than "Options & Filters" whether or not the note shows. */
    #pnlOptionsCard > button.options-disclosure {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        column-gap: 0.3rem;
        row-gap: 0;
        align-items: center;
        padding: 0.45rem 0.45rem 0.45rem 0.55rem;
        font-size: var(--font-size-sm, 0.875rem);
    }
    #pnlOptionsCard > button.options-disclosure .options-disclosure-icon { display: none; }
    #pnlOptionsCard > button.options-disclosure .options-disclosure-text { grid-column: 1; grid-row: 1; }
    #pnlOptionsCard > button.options-disclosure .options-disclosure-hint { grid-column: 1; grid-row: 2; }
    #pnlOptionsCard > button.options-disclosure::after { grid-column: 2; grid-row: 1 / span 2; margin: 0; }
    #pnlOptionsCard .plp-search-row > .button { padding-left: 0.55rem; padding-right: 0.55rem; min-width: 2.4rem; }
}

/* ----- [plpd TripDashboard-6] A new trip's dashboard (owner: "yes"). The Next Step card: one ordered list,
   three rows. A done row = a check mark and muted words (not struck through); an open row = its number and
   a link, the first open one a green button. The card never folds. Under it, one row of "+" chips for what
   the trip does not have yet (the .td-quicknav-chip pill). A card with nothing in it is not drawn. */
.td-nextstep-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}
.td-nextstep-list > li {
    display: flex;
    align-items: center;
    gap: 0.6rem;
}
.td-nextstep-mark {
    flex: none;
    width: 1.5rem;
    text-align: center;
    font-weight: var(--font-weight-medium, 600);
    color: var(--color-text-muted);
}
.td-nextstep-done { color: var(--color-text-muted); }
.td-add-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin: 0 0 1rem;
}
/* [plpd TripDashboard-3 / -6] A card grid whose cards were all left off must not leave its margin as a gap. */
.td-card-grid:not(:has(> .main-card)) { display: none; }
/* A card opened by an address that names it (Itinerary#tripFilesCard from the "+ Document" chip) is brought
   into view clear of the fixed header. */
details.main-card { scroll-margin-top: calc(var(--nav-height, 56px) + 0.75rem); }

/* ----- [plpd Home-5] The next-trip card that leads a member's Home (owner: "yes"): the trip's name (a link),
   the countdown pill, one "N of M packed" line and two buttons. */
.main-card .home-nexttrip-name { margin: 0; }
.home-nexttrip-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem 0.75rem;
    margin: 0.35rem 0 0;
}
.home-nexttrip-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-top: 0.75rem;
}
@media (max-width: 575px) {
    .home-nexttrip-actions > .button { flex: 1 1 0; text-align: center; }
}

/* ----- [plpd Home-8] The second heading in Getting Started, "Explore When You're Ready" (owner: "yes").
   It carries no count; the card's pill counts the six first steps only. */
.home-todo-heading {
    margin: 0.9rem 0 0.25rem;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium, 600);
    color: var(--color-text-muted);
}
.home-todo-heading[hidden] { display: none; }

/* ----- [plpd Site-41] Standard is the simple site (owner 2026-10-13: "yes").
   The line at the foot of the open menu: "Show Everything" / "Show Less" (Site.Master.vb NavModeSwitchHtml;
   <li class="nav-mode-switch"><a class="nav-mode-link">). A plain list item, not a .nav-item, so the shared
   wide-screen column rule does not turn it into a column. Phone: the last row of the open menu. Wide screen: a
   small right-aligned line under the columns; with the menu shut it is not drawn. */
.site-nav .nav-menu > li.nav-mode-switch {
    list-style: none;
    margin: 0;
}
.site-nav .nav-menu > li.nav-mode-switch .nav-mode-link {
    display: block;
    padding: 0.75rem 1rem;
    color: inherit;
    text-decoration: underline;
    font-size: var(--font-size-sm, 0.875rem);
}
.site-nav .nav-menu > li.nav-mode-switch .nav-mode-link:hover,
.site-nav .nav-menu > li.nav-mode-switch .nav-mode-link:focus {
    text-decoration: none;
}
@media (min-width: 992px) {
    .site-nav .nav-menu:not(.open) > li.nav-mode-switch { display: none; }
    body .site-nav .nav-menu.open > li.nav-mode-switch {
        flex: 0 0 100%;
        order: 99;
        text-align: right;
    }
    body .site-nav .nav-menu.open > li.nav-mode-switch .nav-mode-link {
        display: inline-block;
        padding: 0.25rem 0;
        font-size: var(--font-size-xs, 0.75rem);
    }
}

/* ----- [plpd Site-41] Edit Trip: a card that Simple and Standard put away (Starting Location, Companions, Trip
   Summary) carries the `hidden` attribute; the card class sets display, so the attribute needs its own rule
   (Destinations and Trip Summary already have theirs for the template mode). */
#pnlStartCard[hidden],
#pnlLinkCard[hidden] { display: none; }

/* The row of "+" chips after the last card (Trip Dashboard's chips: .td-add-row, .td-quicknav-chip). A row whose
   chips are all put away (the Trip Summary chip while a TEMPLATE is being edited) is not drawn. */
.et-more-row { margin-top: 0.25rem; }
.et-more-row:not(:has([data-et-reveal]:not(.d-none))) { display: none; }

/* ----- [plpd Site-36] A NEW trip is two short steps (UI review Site-36, owner 2026-10-13: "yes").
   EditTrip.aspx: #etStepLine ("Step 1 of 2" / "Step 2 of 2", new-trip mode only) and #etStepSummary
   (the trip's name and dates above the Trip Tags card in step 2, with an Edit link). Neither rule sets
   `display`, so the `hidden` attribute on #etStepSummary and on the line keeps working.
   #etStepActions (Next / Skip under the tags in step 2) needs no rule of its own: it is a plain wrapper
   around .form-actions. */
.et-step-line {
    margin: -0.25rem 0 0.5rem;
}
.et-step-summary {
    margin: 0 0 0.75rem;
    font-weight: var(--font-weight-bold, 600);
    color: var(--color-text);
    overflow-wrap: anywhere;
}
.et-step-summary .link {
    margin-left: 0.5rem;
}

/* ══ THE SHARED BUILDING BLOCKS ON THIS SITE (2026-10-13) ══════════════════════════════════
   qFIT UI review row Site-176 (owner, 2026-10-13: "yes, as you recommend", then "continue with Site-176"),
   carried to this site: one look for each small part, defined in Shared/styles_shared.css and applied site by
   site. The blocks are .seg-group (a pick-one control), .pill (a filter chip, 34px), .notice (information that
   sits on the page), .no-match and .empty-state (nothing matches / nothing here yet). qFIT\CLAUDE.md, section
   "the building blocks", says what each is for.

   TEXT SIZES. Text is set in six sizes: 12, 14, 16, 18, 22 and 28 px at the Medium text size, written as the
   tokens --font-size-xs / -sm / (1rem) / -lg / -xl / -xxl. This site's own literal sizes were moved to the
   nearest step on 2026-10-13 (D:\Claude\build\qd13\snap_fonts.js). 🛑 Write a NEW font size as a token.
   The rules below move what the SHARED sheet sets off the scale. They start with "body" because this sheet
   loads BEFORE the shared one, where an equal rule would lose. */
body { --btn-font-size: 1rem; }                                   /* a button's label: 16px (it was 15px) */
body main code,
body main kbd { font-size: 1rem; }
body main .note code,
body main .small-text code { font-size: inherit; }
body .data-table th { font-size: var(--font-size-xs, 0.75rem); }

/* HEADINGS: one space under a card's title, whichever title class the card uses. */
body .main-card:not(.home-collapsed) > .heading:first-child { margin-bottom: 0.75rem; }

/* CARDS: one gap between cards (some pages set theirs 24px apart with a spacing class) and one padding. (The
   blue top edge on cards is NOT changed on this site: on Home it marks the cards that ask for something.) */
body main .main-card.mb-4 { margin-bottom: 1rem !important; }
body main .main-card.mt-4 { margin-top: 1rem !important; }   /* Account & Security spaces its cards from above */
body .main-card.card-lg { padding: var(--card-padding, 1rem); }

/* PacklistPRO already had a quiet look for standing guidance (class standing-note, [plps Site-46], 2026-10-12).
   It is the same thing as the shared .notice, so it takes the notice's box: a thin outline, a 4px edge at the
   left, 10px corners, 14px text in the normal text color. */
body main .alert-panel.info.standing-note {
    border: 1px solid var(--color-info-border, #81d4fa);
    border-left-width: 4px;
    border-radius: var(--border-radius, 10px);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    padding: 0.55rem 0.8rem;
}

/* [ptf Site-18] The small triangle on a list's category row (Packlist, Tasklist, My Items, My Tasks, My Tags) and on a
   tag group (Quicklist, Edit Trip) is the same drawn chevron the cards use: at the right edge of the row, pointing down
   when shut and up when open (UI review, 2026-10-14). The glyph in the markup is kept (it is the element the scripts
   find); only its look changes. An item's own products arrow is a different element and is not touched. */
.plp-group-header > .plp-expand-icon,
.tag-group-header > .tag-group-arrow {
    order: 3;
    width: 0.5rem;
    height: 0.5rem;
    margin: -0.2rem 0.3rem 0 0;
    padding: 0;
    overflow: hidden;
    font-size: 0;
    line-height: 0;
    color: inherit;
    border: 0;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    opacity: 0.55;
    transform: rotate(45deg) !important;
    flex: 0 0 auto;
}
.plp-group-header[aria-expanded="true"] > .plp-expand-icon,
.tag-group-header[aria-expanded="true"] > .tag-group-arrow {
    margin-top: 0.2rem;
    transform: rotate(225deg) !important;
}
@media (min-width: 992px) {
    .plp-group-header > .plp-expand-icon { margin-left: auto; }
}

/* [ptf CampSites-4] Camping: the Sort dropdown joins State, Agency and Type, so the laptop row is four across
   instead of three (the 3-column rule of Trails-5 is above and is not touched). The location box beside its button
   takes the rest of the row, as Trails'. (UI review, 2026-10-14) */
@media (min-width: 992px) {
    .park-filter-row.cs-filter-selects { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
#csLoc { flex: 1 1 14rem; min-width: 0; max-width: 24rem; }

/* [sl-search-add] Shopping List: the search box, 🔍 and a small green "+ Add" share one row at every width (owner,
   2026-10-22: "Make the add button small and move it to the right of the search button"). The box takes what the
   two buttons leave; the base .plp-search-input { min-width: 180px } and the row's wrap would otherwise drop the
   buttons under the box on a 360px phone. Same shape as the Packlist's #pnlOptionsCard search row. */
#slSearchWrap .plp-search-row { flex-wrap: nowrap; align-items: center; gap: 0.4rem; }
#slSearchWrap .plp-search-input { flex: 1 1 0; min-width: 0; }
#slSearchWrap .plp-search-row > .button { flex: 0 0 auto; }
#slSearchWrap #btnSearchAdd { white-space: nowrap; }
/* The header's "+ Add Item" shows only while the list is empty (the attribute is flipped by the page);
   .button sets display, so [hidden] needs saying. */
.page-header-actions .sl-add-top[hidden] { display: none; }
@media (max-width: 575px) {
    /* Narrower buttons on a phone, so the box keeps room for its hint ("Search items or stores" fits from 360px). */
    #slSearchWrap .plp-search-row > .button { padding-left: 0.55rem; padding-right: 0.55rem; min-width: 2.4rem; }
}

/* ============================================================
   Shared styles - canonical rules for qFIT, PacklistPRO, qMEET.
   ONE rule per element type. SINGLE SOURCE OF TRUTH for every
   design token (colors, spacing, typography, shadows, etc.).
   Per-site Content/styles.css should NOT redefine these variables.
   Sizes use rem so the html.font-* preference scales everything.
   ============================================================ */

/* ── CSS Variables - Light Mode (canonical values, used by all 3 sites) ── */
:root {
    /* Native form controls (checkbox / radio / scrollbar / date picker) follow
       the SITE theme, not the OS. Each master ships
       `<meta name="color-scheme" content="light dark">`, which on its own makes
       the browser render native checkboxes DARK whenever the OS is in dark mode
       — even while the user has the site in Light Mode (the reported "dark
       checkbox in light mode" bug). Pinning color-scheme to the theme here
       (light) and under [data-theme="dark"] (dark) overrides that meta default
       so a Light-Mode checkbox gets a white background and a Dark-Mode checkbox
       a dark one. */
    color-scheme: light;

    /* Brand / accent */
    --color-accent:        #00B0F0;
    --color-accent-dark:   #0090C8;
    --color-accent-deeper: #005a80;
    --color-accent-light:  #e0f6fe;
    --color-primary:       var(--color-accent);
    --color-primary-dark:  var(--color-accent-dark);
    --color-primary-light: #e0f6fe;

    /* Surface-relative hover wash. Composites against whatever is underneath,
       so it stays correct on the page, on a card, and inside an input alike.
       Used ONLY by .input-clear-btn:hover — see the note there for why that
       control cannot use --color-primary-light. */
    --color-hover-wash: rgba(0, 0, 0, 0.10);

    /* Semantic */
    --color-success:          #2e7d32;
    --color-success-bg:       #e8f5e9;
    --color-success-border:   #a5d6a7;
    --color-save-btn:         #32cd32;
    --color-save-btn-hover:   #28a828;
    --color-danger:           #c62828;
    --color-danger-bg:        #ffebee;
    --color-danger-border:    #ef9a9a;
    --color-delete-btn:       #d32f2f;
    --color-delete-btn-hover: #b71c1c;
    --color-warning:          #e65100;
    --color-warning-bg:       #fff3e0;
    --color-warning-border:   #ffcc80;

    /* Readable TEXT on the tinted -bg surfaces above. Distinct from --color-success/
       -danger/-warning, which are ACCENT colors sized for borders and icons: at #2e7d32 on
       the dark #1b3a1e fill the accent measures ~2.7:1. These were referenced by
       .drf-conf-* (and PLP/qFIT status pills) as var(--color-success-text, #1b5e20) while
       being declared NOWHERE, so the light literal won in BOTH themes - dark green on a
       near-black fill. Declared 2026-08-25; the dark values reuse the -border tints, which
       measure 5.7-8:1 on their own -bg. */
    --color-success-text:     #1b5e20;
    --color-danger-text:      #7a1c14;
    --color-warning-text:     #7a4b00;
    /* CONTRAST (WCAG 1.4.3 AA) - changed 2026-08-23, row A11Y-01. #0277bd measures 4.27:1
       on --color-info-bg (#e1f5fe), which is the surface it is ALWAYS shown against in
       .inline-tip and the info alert, and only 3.73:1 on the page background - so the
       inline tips shipped just under the 4.5:1 minimum everywhere they appeared. #01639b
       clears it on all three surfaces (tip bg 5.74, card 6.44, page 5.01).
       Safe to change here because this token is TEXT ONLY: the fill comes from
       --color-info-bg and the rule from --color-info-border, both untouched. */
    --color-info:             #01639b;
    --color-info-bg:          #e1f5fe;
    --color-info-border:      #81d4fa;
    --color-info-text:        #01639b;   /* info color as TEXT; the dark theme lightens it (UI review, PacklistPRO Site-1) */

    /* Text */
    --color-text:       #1a1f2e;
    /* CONTRAST (WCAG 1.4.3 AA) — changed 2026-08-23, test-plan row A11Y-01.
       #6c757d (Bootstrap's muted gray) measures 4.69:1 on a white card but only
       3.65:1 on --color-bg (#dbe4ed), which is the PAGE background this design
       actually uses — so every .note and .back-btn-text sitting on the page rather
       than in a card failed. #5c636a is the LIGHTEST value that clears 4.5:1 on all
       three light surfaces at once: page 4.74, card 6.09, input (#e2f1fb) 5.28.
       Measured, not estimated. Dark mode keeps #b1b5bb (6.13:1 on the dark card),
       which already passes and is unchanged.

       🛑 REVISED SAME DAY, and the revision is the important part: --color-bg is NOT one
       color. The [data-bg="…"] block further down offers FIFTEEN user-selectable light
       backgrounds, and a token tuned only for the #dbe4ed default fails on the darker ones.
       Measured across all fifteen with #5c636a: SEVEN failed — slate 4.42, stone 4.51*,
       forest 4.49, plum 4.57*, lavender 4.62*, graphite 3.66, blue-cyan-40 3.61 (*those
       three clear 4.5 for muted but not for the link token below, and both sit on the same
       surface). Since the palette is the VIEWER'S choice and any of them can be active, the
       token has to clear the DARKEST one, not the default. #4d5157 is the lightest value
       that does: worst case 4.73 (on blue-cyan-40 #99ccff), 7.98 on a white card.
       🔑 This is the trap to remember: reading --color-bg from one dev session measures that
       session's PREFERENCE, not the site's background. Test a text token against every
       palette in the [data-bg] block. */
    --color-text-muted: #4d5157;
    --color-text-light: #9aa0a8;
    /* CONTRAST (WCAG 1.4.3 AA) — changed 2026-08-23, test-plan row A11Y-01.
       These used to resolve to --color-accent (#00B0F0) and --color-accent-dark
       (#0090C8). As LINK TEXT on a light surface both fail badly: #00B0F0 is
       2.48:1 on a white card, 1.93:1 on the page background; #0090C8 is 3.61:1.
       That was the single biggest accessibility defect measured in this pass —
       23 of the 25 failing text nodes on qMEET Home were one of these two values
       under .link / .button / button.link, and the same tokens are used 44 times
       across the shared sheet and all three site sheets, so it was every link on
       every site. The rule at a.link already reads var(--color-link, ...) FIRST
       and carries #0090C8 as its hard-coded fallback, so the darker intent was
       there; the token simply pointed back at the brand cyan and the fallback
       could never fire.
       🔑 THE BRAND CYAN IS NOT CHANGED. --color-accent stays #00B0F0 and still
       fills buttons, borders, chips and the toast — only TEXT-ON-LIGHT moved.
       🛑 REVISED SAME DAY to #00516f. The first pass picked #006C96 as "the lightest cyan
       that clears 4.5:1", measured against the #dbe4ed default page background only — but
       --color-bg is FIFTEEN user-selectable palettes (see the [data-bg] block), and #006C96
       fails on seven of them: slate 4.25, stone 4.34, forest 4.32, plum 4.39, lavender 4.44,
       graphite 3.52, blue-cyan-40 3.47. The palette is the viewer's choice, so the token must
       clear the DARKEST one. #00516f is the lightest value that does — worst case 5.17 (on
       blue-cyan-40 #99ccff), 8.73 on a white card, 4.5+ on every palette, card and input.
       Hover goes to --color-accent-deeper (#005a80), darker again — correct for light mode.
       ⚠ DARK MODE MUST NOT INHERIT THESE. #006C96 on the dark card is 2.16:1, far
       worse than what it replaces. The [data-theme="dark"] block below re-points
       both tokens back at the bright cyan and to a LIGHTER hover — see the note
       there before touching either value. */
    --color-link:       #00516f;
    --color-link-hover: var(--color-accent-deeper);

    /* Backgrounds */
    --color-bg:       #dbe4ed;   /* page: cool blue-gray so white cards lift off it (high contrast) */
    --color-bg-card:  #ffffff;
    --color-bg-input: #e2f1fb;   /* inputs: faint brand-cyan tint → recessed wells, on-brand with accent */
    --color-bg-nav:   #1a1a2e;
    /* 🔴 DECLARED 2026-08-15 BECAUSE IT WAS ALREADY BEING USED AND WAS NOT DECLARED
       ANYWHERE. The weather blocks on qMEET (Dashboard card) and PacklistPRO/paulmendelson
       (Weather.aspx) write `background: var(--color-surface-muted, #f8f9fa)` for severe-alert
       and nowcast panels. An undeclared custom property does NOT fall through to the theme —
       it serves the literal fallback, so those panels painted the LIGHT #f8f9fa in dark mode
       too, giving dark-on-light text. Declaring it here fixes all three at once and changes
       nothing in light mode (the value IS #f8f9fa). Meaning: a panel recessed slightly from
       --color-bg-card, one step short of --color-bg-input. */
    --color-surface-muted: #f8f9fa;

    /* Borders */
    --color-border:       #b6cede;   /* soft blue-gray so card/input outlines are clearly visible */
    --color-border-focus: var(--color-accent);

    /* Radii */
    --border-radius:    10px;
    --border-radius-sm: 6px;
    --border-radius-lg: 14px;

    /* Shadows (layered for modern depth) */
    --shadow-sm:          0 1px 2px rgba(15, 23, 42, 0.08), 0 1px 3px rgba(15, 23, 42, 0.10);
    --shadow-md:          0 4px 6px -2px rgba(15, 23, 42, 0.08), 0 2px 4px -2px rgba(15, 23, 42, 0.10);
    --shadow-lg:          0 12px 24px -8px rgba(15, 23, 42, 0.15), 0 4px 10px -4px rgba(15, 23, 42, 0.12);
    --shadow-xl:          0 20px 40px -12px rgba(15, 23, 42, 0.25);
    --shadow-focus:       0 0 0 3px rgba(0, 176, 240, 0.22);
    --shadow-focus-ring:  0 0 0 3px rgba(0, 176, 240, 0.35);
    --shadow-btn:         0 1px 2px rgba(15, 23, 42, 0.15), 0 1px 3px rgba(15, 23, 42, 0.10);
    --shadow-btn-hover:   0 4px 8px -2px rgba(15, 23, 42, 0.18), 0 2px 4px -2px rgba(15, 23, 42, 0.12);
    --shadow-btn-active:  inset 0 2px 4px rgba(0, 0, 0, 0.10);
    --shadow-card-hover:  0 8px 16px -6px rgba(15, 23, 42, 0.14), 0 4px 8px -4px rgba(15, 23, 42, 0.10);
    --shadow-card:        0 2px 4px rgba(15, 23, 42, 0.10), 0 6px 14px -3px rgba(15, 23, 42, 0.16);  /* card resting shadow — stronger depth so cards lift off the page */
    --text-shadow-heading: 0 1px 1px rgba(0,0,0,0.10);

    /* Spacing */
    --card-padding:    1rem;
    --card-padding-lg: 1.5rem;
    --section-gap:     1.5rem;

    /* Typography */
    --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    --font-size-xs:   0.75rem;
    --font-size-sm:   0.875rem;
    --font-size-base: 1.125rem;
    --font-size-lg:   1.125rem;
    --font-size-xl:   1.375rem;
    --font-size-xxl:  1.75rem;
    --font-weight-normal: 400;
    --font-weight-medium: 500;
    --font-weight-bold:   600;
    --line-height: 1.5;

    /* Input sizing */
    --input-height:  2.5rem;
    --input-padding: 0.5rem 0.75rem;

    /* Buttons */
    --btn-padding:     0.5rem 1.25rem;
    --btn-padding-sm:  0.375rem 0.875rem;
    --btn-font-size:   0.9375rem;
    --btn-font-weight: 500;
    --btn-radius:      6px;
    --btn-transition:  background-color 0.15s ease, opacity 0.15s ease, box-shadow 0.15s ease;

    /* Nav structural */
    --nav-height: 56px;
    --nav-z:      1000;
    --color-bg-nav-dropdown: color-mix(in srgb, var(--color-bg-nav) 85%, #ffffff 15%);

    /* Transitions / easing */
    --ease-out-quint:  cubic-bezier(0.22, 1, 0.36, 1);
    --ease-out-back:   cubic-bezier(0.34, 1.56, 0.64, 1);
    --ease-in-out:     cubic-bezier(0.4, 0, 0.2, 1);
    --transition-fast: 0.15s var(--ease-out-quint);
    --transition-mid:  0.25s var(--ease-out-quint);
    --transition-slow: 0.4s  var(--ease-out-quint);

    /* Text selection (brand-tinted) */
    --selection-bg:    rgba(0, 176, 240, 0.22);
    --selection-color: var(--color-text);
}

/* ── CSS Variables - Dark Mode Overrides ──────────────────── */
[data-theme="dark"] {
    color-scheme: dark;          /* native checkbox/scrollbar/picker → dark */
    --color-text:       #e8eaed;
    --color-text-muted: #b1b5bb;
    --color-text-light: #7c8088;

    /* CONTRAST (WCAG 1.4.3 AA) — added 2026-08-23, test-plan row A11Y-01.
       🛑 THIS BLOCK IS LOAD-BEARING. The light-mode defaults were darkened to
       #006C96 / #005a80 so links pass on white and on the #dbe4ed page background.
       Dark mode must NOT inherit them: #006C96 measures 2.16:1 on the dark card
       (#333) and #005a80 just 1.67:1 — both far worse than the values they
       replaced. Re-pointing --color-link at the brand cyan restores 5.10:1 on the
       dark card and 8.47:1 on the pure-black page.
       Hover moves LIGHTER here, not darker, which is the opposite of light mode and
       is the whole reason this needs its own declaration: dark mode previously fell
       through to --color-accent-dark (#0090C8), which is 3.50:1 on the dark card and
       was ALREADY failing before this change. #5CCDF7 measures 6.94:1 on the dark
       card and 11.53:1 on the page. All figures measured against the tokens actually
       declared in this block, not estimated. */
    --color-link:       var(--color-accent);
    --color-link-hover: #5CCDF7;

    --color-bg:       #000000;   /* page pure black → cards/inputs float (high contrast: dark #8) */
    --color-bg-card:  #333333;
    --color-bg-input: #555555;   /* inputs lighter than card → clearly recessed wells */
    --color-bg-nav:   #0d0d0f;
    /* One step lighter than --color-bg-card, one step darker than --color-bg-input:
       a recessed panel that still reads as sitting inside a card. See the light-mode
       declaration for why this token exists at all. */
    --color-surface-muted: #3d3d3d;

    --color-border:        #555555;
    --color-primary-light: #082a3d;
    --color-hover-wash: rgba(255, 255, 255, 0.14);   /* lightens in dark mode */

    --color-success-bg:     #1b3a1e;
    --color-success-border: #2e7d32;
    --color-danger-bg:      #3b1212;
    --color-danger-border:  #c62828;
    --color-warning-bg:     #3a2a10;
    --color-warning-border: #e65100;
    --color-info-bg:        #082a3d;
    --color-info-border:    #0277bd;
    --color-info-text:      #81d4fa;   /* --color-info is not redeclared for dark (it is also a fill): text uses this */

    /* Light tints on the dark -bg fills above (see the light-mode block for why). */
    --color-success-text:   #a5d6a7;
    --color-danger-text:    #ef9a9a;
    --color-warning-text:   #ffcc80;

    --shadow-sm:         0 1px 2px rgba(0, 0, 0, 0.35), 0 1px 3px rgba(0, 0, 0, 0.30);
    --shadow-md:         0 4px 8px -2px rgba(0, 0, 0, 0.45), 0 2px 4px -2px rgba(0, 0, 0, 0.30);
    --shadow-lg:         0 12px 24px -8px rgba(0, 0, 0, 0.55), 0 4px 10px -4px rgba(0, 0, 0, 0.40);
    --shadow-xl:         0 20px 40px -12px rgba(0, 0, 0, 0.65);
    --shadow-focus:      0 0 0 3px rgba(0, 176, 240, 0.35);
    --shadow-focus-ring: 0 0 0 3px rgba(0, 176, 240, 0.45);
    --shadow-btn:        0 1px 2px rgba(0, 0, 0, 0.50);
    --shadow-btn-hover:  0 4px 8px -2px rgba(0, 0, 0, 0.55);
    --shadow-card-hover: 0 8px 16px -6px rgba(0, 0, 0, 0.55);
    --shadow-card:       0 2px 6px rgba(0, 0, 0, 0.45), 0 6px 16px -4px rgba(0, 0, 0, 0.40);  /* card resting shadow — stronger depth so cards lift off the page */

    --selection-bg: rgba(0, 176, 240, 0.45);

    --color-bg-nav-dropdown: color-mix(in srgb, var(--color-bg-nav) 85%, #ffffff 15%);
}

/* ── Site background palette (Preferences → Site Background) ────────────────────
   Per-user PAGE-background tint, applied via data-bg on <html> by the early head
   script (no flash) + site.js applyPreferences. Only --color-bg (the body
   background) changes — cards/nav/inputs keep their own --color-bg-* vars, so
   content contrast is untouched. Each token is theme-aware: a soft tint in light
   mode, a deep tint in dark mode (the [data-theme="dark"] rules below win by
   specificity). The token is a server-whitelisted value (Preferences.aspx.vb),
   never raw user input. Lives in the SHARED sheet so all sites get the palette. */
/* Light-mode shades — dark text sits on these, so they stay light; the "darker"
   choices (graphite especially) are medium grays that still read fine under the
   large page-title text. */
[data-bg="gray"]     { --color-bg: #e7e9ec; }
[data-bg="slate"]    { --color-bg: #d6dce5; }
[data-bg="stone"]    { --color-bg: #e3ddd4; }
[data-bg="graphite"] { --color-bg: #c4c9d1; }
[data-bg="ocean"]    { --color-bg: #d6e4f5; }
[data-bg="sky"]      { --color-bg: #d8e9fb; }
[data-bg="teal"]     { --color-bg: #d3ebeb; }
[data-bg="sage"]     { --color-bg: #daeadd; }
[data-bg="forest"]   { --color-bg: #cfe2d3; }
[data-bg="sand"]     { --color-bg: #efe6d2; }
[data-bg="rose"]     { --color-bg: #f3e0e6; }
[data-bg="plum"]     { --color-bg: #e7dbec; }
[data-bg="lavender"] { --color-bg: #e4ddf3; }

/* Dark-mode shades — light text sits on these, so they stay dark, but are now
   CLEARLY hued/varied (the previous values were within a few RGB points of the
   default #121418, so the tint was invisible). Includes lifted + darker neutral
   grays so "Gray / Slate / Warm Gray / Graphite" are distinguishable in dark mode. */
[data-theme="dark"][data-bg="gray"]     { --color-bg: #1e2024; }
[data-theme="dark"][data-bg="slate"]    { --color-bg: #141a23; }
[data-theme="dark"][data-bg="stone"]    { --color-bg: #1c1813; }
[data-theme="dark"][data-bg="graphite"] { --color-bg: #0a0b0d; }
[data-theme="dark"][data-bg="ocean"]    { --color-bg: #0b1726; }
[data-theme="dark"][data-bg="sky"]      { --color-bg: #0d1f34; }
[data-theme="dark"][data-bg="teal"]     { --color-bg: #08201f; }
[data-theme="dark"][data-bg="sage"]     { --color-bg: #0e1a13; }
[data-theme="dark"][data-bg="forest"]   { --color-bg: #0a1710; }
[data-theme="dark"][data-bg="sand"]     { --color-bg: #1d180f; }
[data-theme="dark"][data-bg="rose"]     { --color-bg: #20141a; }
[data-theme="dark"][data-bg="plum"]     { --color-bg: #190f20; }
[data-theme="dark"][data-bg="lavender"] { --color-bg: #15101f; }

/* ── Expanded spectrum palette (PacklistPRO) — LIGHT-mode shades ────────────────
   60 options = 12 hues × 5 levels (50/40/30/20/10%). Token = "{hue}-{level}";
   whitelisted in PacklistPRO BasePage.BackgroundThemeTokens + exposed in its
   Preferences → Site Background dropdown. PLP-only: the other sites keep the
   neutral-tint palette above (their tokens are untouched). Only --color-bg (the
   page background) changes; cards/nav/inputs keep their own vars. LIGHT shades are
   each pure hue blended toward white (50% = halfway, 10% = near-white pastel). The
   100% (pure) level was removed. The 10% level is LIGHT-only — in dark mode the
   *-10 tokens fall back to the default dark bg (pinned in the dark block below). The
   DARK shades below win in dark mode by specificity (0,2,0 vs 0,1,0). Owner's spec. */
[data-bg="red-50"]          { --color-bg: #ff8080; }
[data-bg="red-40"]          { --color-bg: #ff9999; }
[data-bg="red-30"]          { --color-bg: #ffb3b3; }
[data-bg="red-20"]          { --color-bg: #ffcccc; }
[data-bg="red-10"]          { --color-bg: #ffe6e6; }

[data-bg="red-magenta-50"]  { --color-bg: #ff80bf; }
[data-bg="red-magenta-40"]  { --color-bg: #ff99cc; }
[data-bg="red-magenta-30"]  { --color-bg: #ffb3d9; }
[data-bg="red-magenta-20"]  { --color-bg: #ffcce5; }
[data-bg="red-magenta-10"]  { --color-bg: #ffe6f2; }

[data-bg="magenta-50"]      { --color-bg: #ff80ff; }
[data-bg="magenta-40"]      { --color-bg: #ff99ff; }
[data-bg="magenta-30"]      { --color-bg: #ffb3ff; }
[data-bg="magenta-20"]      { --color-bg: #ffccff; }
[data-bg="magenta-10"]      { --color-bg: #ffe6ff; }

[data-bg="purple-50"]       { --color-bg: #bf80ff; }
[data-bg="purple-40"]       { --color-bg: #cc99ff; }
[data-bg="purple-30"]       { --color-bg: #d9b3ff; }
[data-bg="purple-20"]       { --color-bg: #e5ccff; }
[data-bg="purple-10"]       { --color-bg: #f2e6ff; }

[data-bg="blue-50"]         { --color-bg: #8080ff; }
[data-bg="blue-40"]         { --color-bg: #9999ff; }
[data-bg="blue-30"]         { --color-bg: #b3b3ff; }
[data-bg="blue-20"]         { --color-bg: #ccccff; }
[data-bg="blue-10"]         { --color-bg: #e6e6ff; }

[data-bg="blue-cyan-50"]    { --color-bg: #80bfff; }
[data-bg="blue-cyan-40"]    { --color-bg: #99ccff; }
[data-bg="blue-cyan-30"]    { --color-bg: #b3d9ff; }
[data-bg="blue-cyan-20"]    { --color-bg: #cce5ff; }
[data-bg="blue-cyan-10"]    { --color-bg: #e6f2ff; }

[data-bg="cyan-50"]         { --color-bg: #80ffff; }
[data-bg="cyan-40"]         { --color-bg: #99ffff; }
[data-bg="cyan-30"]         { --color-bg: #b3ffff; }
[data-bg="cyan-20"]         { --color-bg: #ccffff; }
[data-bg="cyan-10"]         { --color-bg: #e6ffff; }

[data-bg="cyan-lime-50"]    { --color-bg: #80ffbf; }
[data-bg="cyan-lime-40"]    { --color-bg: #99ffcc; }
[data-bg="cyan-lime-30"]    { --color-bg: #b3ffd9; }
[data-bg="cyan-lime-20"]    { --color-bg: #ccffe5; }
[data-bg="cyan-lime-10"]    { --color-bg: #e6fff2; }

[data-bg="lime-50"]         { --color-bg: #80ff80; }
[data-bg="lime-40"]         { --color-bg: #99ff99; }
[data-bg="lime-30"]         { --color-bg: #b3ffb3; }
[data-bg="lime-20"]         { --color-bg: #ccffcc; }
[data-bg="lime-10"]         { --color-bg: #e6ffe6; }

[data-bg="lime-yellow-50"]  { --color-bg: #bfff80; }
[data-bg="lime-yellow-40"]  { --color-bg: #ccff99; }
[data-bg="lime-yellow-30"]  { --color-bg: #d9ffb3; }
[data-bg="lime-yellow-20"]  { --color-bg: #e5ffcc; }
[data-bg="lime-yellow-10"]  { --color-bg: #f2ffe6; }

[data-bg="yellow-50"]       { --color-bg: #ffff80; }
[data-bg="yellow-40"]       { --color-bg: #ffff99; }
[data-bg="yellow-30"]       { --color-bg: #ffffb3; }
[data-bg="yellow-20"]       { --color-bg: #ffffcc; }
[data-bg="yellow-10"]       { --color-bg: #ffffe6; }

[data-bg="orange-50"]       { --color-bg: #ffbf80; }
[data-bg="orange-40"]       { --color-bg: #ffcc99; }
[data-bg="orange-30"]       { --color-bg: #ffd9b3; }
[data-bg="orange-20"]       { --color-bg: #ffe5cc; }
[data-bg="orange-10"]       { --color-bg: #fff2e6; }

/* ── Expanded spectrum palette (PacklistPRO) — DARK-mode shades ─────────────────
   48 tinted levels (50/40/30/20% × 12 hues); each pure hue darkened toward black.
   Wins over the light [data-bg] rules above by specificity in dark mode. The 100%
   (pure) level was removed. The 10% level is LIGHT-only — the *-10 tokens are pinned
   to the default dark bg below so the near-white light pastel can't bleed into dark
   mode. Hex values are the owner's exact spec. */
[data-theme="dark"][data-bg="red-50"]          { --color-bg: #800000; }
[data-theme="dark"][data-bg="red-40"]          { --color-bg: #660000; }
[data-theme="dark"][data-bg="red-30"]          { --color-bg: #4d0000; }
[data-theme="dark"][data-bg="red-20"]          { --color-bg: #330000; }

[data-theme="dark"][data-bg="red-magenta-50"]  { --color-bg: #800040; }
[data-theme="dark"][data-bg="red-magenta-40"]  { --color-bg: #660033; }
[data-theme="dark"][data-bg="red-magenta-30"]  { --color-bg: #4d0026; }
[data-theme="dark"][data-bg="red-magenta-20"]  { --color-bg: #330019; }

[data-theme="dark"][data-bg="magenta-50"]      { --color-bg: #800080; }
[data-theme="dark"][data-bg="magenta-40"]      { --color-bg: #660066; }
[data-theme="dark"][data-bg="magenta-30"]      { --color-bg: #4d004d; }
[data-theme="dark"][data-bg="magenta-20"]      { --color-bg: #330033; }

[data-theme="dark"][data-bg="purple-50"]       { --color-bg: #400080; }
[data-theme="dark"][data-bg="purple-40"]       { --color-bg: #330066; }
[data-theme="dark"][data-bg="purple-30"]       { --color-bg: #26004d; }
[data-theme="dark"][data-bg="purple-20"]       { --color-bg: #1a0033; }

[data-theme="dark"][data-bg="blue-50"]         { --color-bg: #000080; }
[data-theme="dark"][data-bg="blue-40"]         { --color-bg: #000066; }
[data-theme="dark"][data-bg="blue-30"]         { --color-bg: #00004d; }
[data-theme="dark"][data-bg="blue-20"]         { --color-bg: #000033; }

[data-theme="dark"][data-bg="blue-cyan-50"]    { --color-bg: #004080; }
[data-theme="dark"][data-bg="blue-cyan-40"]    { --color-bg: #003366; }
[data-theme="dark"][data-bg="blue-cyan-30"]    { --color-bg: #00264d; }
[data-theme="dark"][data-bg="blue-cyan-20"]    { --color-bg: #001a33; }

[data-theme="dark"][data-bg="cyan-50"]         { --color-bg: #008080; }
[data-theme="dark"][data-bg="cyan-40"]         { --color-bg: #006666; }
[data-theme="dark"][data-bg="cyan-30"]         { --color-bg: #004d4d; }
[data-theme="dark"][data-bg="cyan-20"]         { --color-bg: #003333; }

[data-theme="dark"][data-bg="cyan-lime-50"]    { --color-bg: #008040; }
[data-theme="dark"][data-bg="cyan-lime-40"]    { --color-bg: #006633; }
[data-theme="dark"][data-bg="cyan-lime-30"]    { --color-bg: #004d26; }
[data-theme="dark"][data-bg="cyan-lime-20"]    { --color-bg: #00331a; }

[data-theme="dark"][data-bg="lime-50"]         { --color-bg: #008000; }
[data-theme="dark"][data-bg="lime-40"]         { --color-bg: #006600; }
[data-theme="dark"][data-bg="lime-30"]         { --color-bg: #004d00; }
[data-theme="dark"][data-bg="lime-20"]         { --color-bg: #003300; }

[data-theme="dark"][data-bg="lime-yellow-50"]  { --color-bg: #408000; }
[data-theme="dark"][data-bg="lime-yellow-40"]  { --color-bg: #336600; }
[data-theme="dark"][data-bg="lime-yellow-30"]  { --color-bg: #264d00; }
[data-theme="dark"][data-bg="lime-yellow-20"]  { --color-bg: #1a3300; }

[data-theme="dark"][data-bg="yellow-50"]       { --color-bg: #808000; }
[data-theme="dark"][data-bg="yellow-40"]       { --color-bg: #666600; }
[data-theme="dark"][data-bg="yellow-30"]       { --color-bg: #4d4d00; }
[data-theme="dark"][data-bg="yellow-20"]       { --color-bg: #333300; }

[data-theme="dark"][data-bg="orange-50"]       { --color-bg: #804000; }
[data-theme="dark"][data-bg="orange-40"]       { --color-bg: #663300; }
[data-theme="dark"][data-bg="orange-30"]       { --color-bg: #4d2600; }
[data-theme="dark"][data-bg="orange-20"]       { --color-bg: #331900; }

/* 10% is LIGHT-only: pin the *-10 tokens to the default dark bg (#121418, same as
   the [data-theme="dark"] base) so the near-white light pastel above doesn't bleed
   into dark mode — equal specificity would otherwise let the light rule win on
   source order. Keep this color in sync with [data-theme="dark"] { --color-bg }. */
[data-theme="dark"][data-bg="red-10"],
[data-theme="dark"][data-bg="red-magenta-10"],
[data-theme="dark"][data-bg="magenta-10"],
[data-theme="dark"][data-bg="purple-10"],
[data-theme="dark"][data-bg="blue-10"],
[data-theme="dark"][data-bg="blue-cyan-10"],
[data-theme="dark"][data-bg="cyan-10"],
[data-theme="dark"][data-bg="cyan-lime-10"],
[data-theme="dark"][data-bg="lime-10"],
[data-theme="dark"][data-bg="lime-yellow-10"],
[data-theme="dark"][data-bg="yellow-10"],
[data-theme="dark"][data-bg="orange-10"] { --color-bg: #121418; }

/* ── Grayscale ramp ─────────────────────────────────────────────
   Neutral page-background ramp, theme-split (Preferences shows only the half
   that fits the active theme): White→Gray 50% are the LIGHT-mode options,
   Gray 50%→Black the DARK-mode options; gray-50 (#808080) is the shared
   midpoint shown in both. Token number = lightness % (100 = white, 0 = black).
   Like the spectrum above, only --color-bg changes — cards/nav/inputs keep
   their own vars. */
[data-bg="gray-100"] { --color-bg: #ffffff; }
[data-bg="gray-90"]  { --color-bg: #e5e5e5; }
[data-bg="gray-80"]  { --color-bg: #cccccc; }
[data-bg="gray-70"]  { --color-bg: #b3b3b3; }
[data-bg="gray-60"]  { --color-bg: #999999; }
[data-bg="gray-50"]  { --color-bg: #808080; }

[data-theme="dark"][data-bg="gray-50"] { --color-bg: #808080; }
[data-theme="dark"][data-bg="gray-40"] { --color-bg: #666666; }
[data-theme="dark"][data-bg="gray-30"] { --color-bg: #4d4d4d; }
[data-theme="dark"][data-bg="gray-20"] { --color-bg: #333333; }
[data-theme="dark"][data-bg="gray-10"] { --color-bg: #1a1a1a; }
[data-theme="dark"][data-bg="gray-0"]  { --color-bg: #000000; }

/* The light-half tokens (gray-100…gray-60) carry a light --color-bg that would
   bleed into dark mode (equal specificity, source order) if a user picked one
   and later switched to Dark. Pin them to the default dark bg so a stale
   "White" never paints a dark page white. Keep in sync with
   [data-theme="dark"] { --color-bg }. gray-50 is deliberately NOT pinned —
   #808080 is its value in both themes. */
[data-theme="dark"][data-bg="gray-100"],
[data-theme="dark"][data-bg="gray-90"],
[data-theme="dark"][data-bg="gray-80"],
[data-theme="dark"][data-bg="gray-70"],
[data-theme="dark"][data-bg="gray-60"] { --color-bg: #121418; }

/* ── Dark-mode semantic TEXT contrast ──────────────────────────
   The saturated light-mode semantic colors (danger/info/warning/success)
   stay as-is so badge/button FILLS keep enough contrast for their white text.
   But used as FOREGROUND text on the dark card / banner / *-bg surfaces they
   fall below WCAG AA (e.g. #c62828 danger text on the #3b1212 danger-bg is
   ~1.9:1; the required-star and inline-tip measured 2.9 / 3.1 on dark cards).
   Lighten the text-only uses to AA-passing tints. Benefits all 3 sites. */
[data-theme="dark"] .required-star,
[data-theme="dark"] .error-message,
[data-theme="dark"] .field-validation-error,
[data-theme="dark"] .banner-offline,
[data-theme="dark"] .exp-badge-unsettled { color: #ef5350; }

[data-theme="dark"] .inline-tip { color: #4fc3f7; }

[data-theme="dark"] .banner-demo,
[data-theme="dark"] .banner-saved-copy,
[data-theme="dark"] .caps-lock-warning,
[data-theme="dark"] .note-date-badge,
[data-theme="dark"] .drf-warn-icon,
[data-theme="dark"] .exp-badge-est { color: #ffa726; }

[data-theme="dark"] .exp-badge-settled { color: #66bb6a; }

[data-theme="dark"] .exp-badge-shared { color: #4fc3f7; }

/* Dark-mode TEXT lightening for the semantic text utilities + itinerary status
   pills (they still sit on dark surfaces). Toasts (.site-toast.*) and inline
   message panels (.alert-panel.*) are now SOLID, theme-independent colors with
   fixed near-black text (see the cross-site message palette below), so they are
   deliberately no longer listed here — a success/error/etc. message looks
   identical in light and dark mode. */
[data-theme="dark"] .itin-status-confirmed,
[data-theme="dark"] .itin-status-completed,
[data-theme="dark"] .text-success { color: #66bb6a; }

[data-theme="dark"] .text-danger { color: #ef5350; }

::selection      { background: var(--selection-bg); color: var(--selection-color); }
::-moz-selection { background: var(--selection-bg); color: var(--selection-color); }

/* ── 1. User font-size preference (scales all rem-based sizes) ── */
html              { font-size: 16px; }   /* default: 1rem = 16px */
html.font-small   { font-size: 14px; }
html.font-medium  { font-size: 16px; }
html.font-large   { font-size: 18px; }

/* ── 2. Document base ──────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }

html {
    -webkit-text-size-adjust: 100%;
    scroll-behavior: smooth;
    /* Anchor-link offset so the sticky nav (56px tall) doesn't obscure jump-targets */
    scroll-padding-top: calc(var(--nav-height, 56px) + 0.5rem);
}
body {
    margin: 0;
    padding: 0;
    font-family: var(--font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);
    font-size: var(--font-size-base, 1rem);
    color: var(--color-text, #1a1f2e);
    background-color: var(--color-bg, #f5f7fa);
    line-height: var(--line-height, 1.5);
    -webkit-font-smoothing: antialiased;
    overflow-wrap: break-word;
}

/* ── 2a. Scrollbar tinting ────────────────────────────────── */
* {
    scrollbar-width: thin;
    scrollbar-color: color-mix(in srgb, var(--color-text-muted) 40%, transparent) transparent;
}
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-thumb {
    background: color-mix(in srgb, var(--color-text-muted) 35%, transparent);
    border: 2px solid transparent;
    background-clip: padding-box;
    border-radius: 999px;
}
*::-webkit-scrollbar-thumb:hover {
    background: color-mix(in srgb, var(--color-text-muted) 55%, transparent);
    background-clip: padding-box;
}

/* ── 2b. Inline code / kbd / pre ─────────────────────────── */
code, kbd, samp, tt {
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace;
    font-size: 0.875em;
}
:not(pre) > code {
    padding: 0.12em 0.4em;
    background: color-mix(in srgb, var(--color-primary-light) 70%, transparent);
    color: var(--color-text);
    border-radius: 4px;
    border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
    white-space: nowrap;
}
[data-theme="dark"] :not(pre) > code {
    background: color-mix(in srgb, var(--color-primary) 16%, var(--color-bg-input));
}
/* ⚠ On a phone the `white-space: nowrap` above is not a style choice, it is CONTENT LOSS.
   An inline snippet longer than the column cannot wrap, so it runs off the right edge — and
   body/html carry `overflow-x: clip` on all three sites, which clips WITHOUT giving a
   scrollbar. There is then no gesture that reveals the rest of the text. Measured at a 380px
   viewport on 2026-08-12: qFIT /SecurityAndPrivacy lost 182px of `(UserID = templateUserID)`,
   156px of a `FeedbackID = @FID` clause and four more; qMEET /AbuseTerms lost 119px of a
   `Cache-Control:` header. These are documentation pages whose whole point is the snippet.
   `overflow-wrap: anywhere` rather than `break-all`: it breaks at spaces first and only
   splits inside a token when a single token genuinely cannot fit, so short pills like
   `plp_Logs` still render intact and the nowrap look is kept everywhere it fits.
   Scoped to ≤767px because that is where it actually bites — the widest offender needs
   ~562px, which fits inside the content column from 768px up, so desktop keeps the
   deliberate no-wrap pill exactly as it was. */
@media (max-width: 767px) {
    :not(pre) > code {
        white-space: normal;
        overflow-wrap: anywhere;
    }
}
pre {
    font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
    font-size: 0.85em;
    line-height: 1.5;
    background: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    padding: 0.75rem 0.9rem;
    overflow-x: auto;
}

/* Responsive media defaults */
img, svg { max-width: 100%; height: auto; }

/* ── 3. Page title ─────────────────────────────────────────── */
.page-title {
    font-size: var(--font-size-xxl, 1.75rem);
    font-weight: var(--font-weight-bold, 600);
    color: var(--color-text, #1a1f2e);
    margin: 0 0 0.5rem 0;
    line-height: 1.2;
    letter-spacing: -0.01em;
    text-align: left;   /* left-justify titles on all 3 sites; .text-center (a utility defined later) still overrides where a page opts in */
}
.page-title-flush { margin-bottom: 0; }

/* ── 4. Typography ─────────────────────────────────────────── */
.normal-text-bold { font-weight: var(--font-weight-bold, 600); }

.small-dim-text {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted, #6c757d);
}

/* "Press Esc to clear" under a search / find / filter box (site-core.js
   installSearchEscClear). Always a line of its own: the box above it often sits in a
   flex or grid row, where a bare <p> would be laid out as one more column. */
.esc-hint {
    flex: 0 0 100%;
    grid-column: 1 / -1;
    width: 100%;
    margin-bottom: 0;
}

/* Same color as normal body text, just smaller. Use for fine-print, captions,
   metadata, etc. where the content is still primary, not a side-note. */
.small-text {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text, #1a1f2e);
}

.inline-tip {
    display: inline-block;
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-info, #0277bd);
    background-color: var(--color-info-bg, #e1f5fe);
    border-left: 3px solid var(--color-info-border, #81d4fa);
    padding: 0.25rem 0.6rem;
    border-radius: var(--border-radius-sm, 4px);
    margin: 0.3rem 0;
    /* Tips are side-notes, so they are deliberately shorter than body copy: the
       block's height is padding + line-height + the floated ×, and all three were
       tuned down together. Do NOT raise .tip-dismiss's min-height back to 32px —
       .inline-tip is an inline-block, so it establishes a BFC and the float DOES
       count toward its height; a 32px button alone sets a taller floor than the
       text needs. The button keeps a 32px min-WIDTH plus this padding, so the tap
       target still clears the 24px floor. */
    line-height: 1.35;
}

/* ── Dismissible tips: the × ────────────────────────────────────
   site-core.js (SiteCore.tips) puts this button on every standing .inline-tip and
   remembers what was hidden. Nothing here is per-tip — do NOT fork these rules into a
   site's Content/styles.css; all five sites read this file.

   FLOATED, NOT FLEXED. A tip's content is a SENTENCE. Making the container a flex row
   turns every inline fragment between its <b>/<a> tags into a separate flex item and
   shreds the sentence into narrow columns — the same trap .alert-panel documents further
   down this file, and the reason qMEET's chat retention notice floats its own ×. A float
   leaves normal text flow intact and simply lets the sentence wrap around the button.

   The button is injected as the FIRST child: a right float only pushes aside content that
   follows it in source order, so appended last it would drop below the text instead of
   sitting beside it.

   Color is `inherit` + opacity, not a fixed gray, so it rides .inline-tip's own color in
   both themes (light #0277bd, and the [data-theme="dark"] override to #4fc3f7 above)
   without needing a second dark-mode rule. */
.tip-dismiss {
    float: right;
    margin: -0.1rem -0.35rem 0 0.4rem;
    min-width: 32px;                    /* 32px wide + 24px tall clears the tap-target     */
    min-height: 24px;                   /* floor; see .inline-tip above before raising it. */
    padding: 0 0.25rem;
    background: none;
    border: none;
    border-radius: var(--border-radius-sm, 4px);
    cursor: pointer;
    font-size: 18px;
    line-height: 1;
    color: inherit;
    opacity: 0.55;
    transition: opacity var(--transition-fast, 0.15s ease);
}
.tip-dismiss:hover { opacity: 1; }
.tip-dismiss:focus-visible {
    opacity: 1;
    outline: 2px solid var(--color-link, #06f);
    outline-offset: 1px;
}

/* !important because a tip may carry Bootstrap's .d-block (display:block !important) —
   measured on qMEET's retention notice, where a plain rule lost the specificity fight and
   the panel just sat there after the tap. */
.inline-tip.tip-hidden { display: none !important; }

/* Anti-flash gate. Site.Master's synchronous head script adds .tips-gate to <html> ONLY
   when this browser has at least one dismissal on record, so a first-time visitor never
   pays for it. site-core.js drops the class the instant its first pass finishes, and the
   master drops it on a timer too, so a JS failure can never leave someone tip-less.
   `visibility`, not `display`: it holds the tip's box, so revealing the ones that are NOT
   hidden costs no layout shift — only the genuinely dismissed ones reflow.
   The :not() chain keeps CONTROLS visible throughout — "(fix capitalization)", "hmm?",
   "(refresh list)". They are never dismissible, so they have nothing to hide for, and
   blanking a control mid-load looks broken. Both tests are needed and neither is
   redundant: measured on EditEvent, `(refresh list)` is an <asp:LinkButton> whose CssClass
   is a bare "inline-tip" with NO .link — so only :not(a) catches it — while other pages
   put .link on a <span>. The gate cannot key on .tip-dismissible instead, because it has
   to be right BEFORE the script that adds that class has run. */
.tips-gate .inline-tip:not(.link):not(a):not(button) { visibility: hidden; }

@media print {
    .tip-dismiss { display: none; }
}

.note {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted, #6c757d);
    font-style: italic;
    margin: 0.25rem 0;
}

.input-label {
    display: inline-block;
    font-weight: var(--font-weight-medium, 500);
    color: var(--color-text, #1a1f2e);
    margin-bottom: 0.25rem;
}

.link,
/* 🛑 BARE <a> — added 2026-08-23, test-plan row A11Y-01. An anchor with no class fell through
   to Bootstrap's own `a { color: #0d6efd }`, which is 3.50:1 on --color-bg (#dbe4ed), the page
   background this design actually uses — under the 4.5:1 minimum. It is not a rare case:
   qMEET /CitiesNearMe alone renders 340 such anchors (its city links and act links), and they
   accounted for 251 of the 254 contrast failures measured on that page.
   Pointing them at --color-link rather than at a second, darker BLUE is deliberate: the token
   is already theme-aware (#006C96 light, brand cyan in dark mode), so this fixes both themes at
   once, and it makes an unclassed link look like every other link on the site instead of like
   a Bootstrap default that happened to leak through.
   Specificity is 0,0,1 — the lowest there is — so every component that sets its own link color
   (.site-footer a, the nav, .button, .page-tab, …) still wins. It only catches the anchors
   nothing else claimed. Bootstrap's rule is also 0,0,1 but loads earlier in the bundle, so this
   wins on order. */
a {
    color: var(--color-link, #006C96);
}
a:hover {
    color: var(--color-link-hover, var(--color-accent-deeper, #005a80));
}

a.link {
    color: var(--color-link, var(--color-primary, #0090C8));
    text-decoration: none;
    font-weight: var(--font-weight-bold, 600);
    cursor: pointer;
    transition: color var(--transition-fast, 0.15s ease);
}
.link:hover,
a.link:hover {
    color: var(--color-link-hover, var(--color-primary-dark, #005a80));
    text-decoration: underline;
}
/* When .link is applied to a <button> (e.g. a "Hide Overview" toggle that must
   POST/run JS rather than navigate), strip the native button chrome so it reads
   as an inline text link. Without this the button keeps the UA ButtonFace
   background (#f0f0f0) — which never themes to dark, so the bold cyan link text
   sat on a light-gray pill in dark mode (~2.2:1). */
button.link {
    background: none;
    border: none;
    padding: 0;
    margin: 0;
    font: inherit;
    font-weight: var(--font-weight-bold, 600);
    line-height: inherit;
    -webkit-appearance: none;
    appearance: none;
}

/* ── 5. Lists - accent-colored bullets/numbers by default ──
   Applies to every <ul> and <ol> on the site. The named classes
   .bullet-list and .numbered-list are optional explicit aliases. */
ul li::marker { color: var(--color-primary, #0090C8); }
ol li::marker { color: var(--color-primary, #0090C8); font-weight: var(--font-weight-bold, 600); }
.bullet-list   { list-style-type: disc; }
.numbered-list { list-style-type: decimal; }

/* Home-page "what you get" benefit list — accent check (✓) bullets.
   Used by the marketing/welcome cards on all four sites' Home.aspx. The
   ::before check replaces the native marker, so list-style is removed. */
.home-checklist { list-style: none; margin: 0 0 .25rem; padding: 0; }
.home-checklist li {
    position: relative;
    padding-left: 1.7em;
    margin: 0 0 .45em;
    line-height: 1.45;
}
.home-checklist li::before {
    content: "\2713"; /* ✓ */
    position: absolute;
    left: 0;
    top: 0;
    color: var(--color-accent, #00B0F0);
    font-weight: 700;
}

/* ── 6. Cards ──────────────────────────────────────────────── */
.main-card {
    background-color: var(--color-bg-card, #ffffff);
    border: 1px solid var(--color-border, #e0e0e0);
    border-radius: var(--border-radius, 8px);
    padding: var(--card-padding, 1rem);
    margin-bottom: 1rem;
    box-shadow: var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.08));
}

/* Corner-× close for "Options & Filters" controls cards. A top-right × that
   collapses the card and (where the card has one) triggers its existing
   Save/Apply/Close action — a more reachable alternative to a footer button.
   The host card carries .card-options-host so it becomes the positioning anchor
   (a plain class, not :has(), so the bundler's CSS minifier can't drop it).
   Promoted from PLP ShoppingList's original .sl-options-topbar so all four
   sites share one look. The .card-options-topbar div is placed as a child of
   the (open) options panel. */
.card-options-host { position: relative; }
.card-options-topbar {
    position: absolute;
    top: var(--card-padding, 1rem);
    right: var(--card-padding, 1rem);
    margin: 0;
    z-index: 1;
}
/* 🛑 RETIRED 2026-08-25 — NOTHING USES THESE THREE RULES ANY MORE. Do not style a new
   corner × with them, and do not "restore consistency" by pointing a card at them.
   They made the × a filled primary-blue button, deliberately, so it would "read as a
   real button rather than a faint icon". The owner's call went the other way: every
   tips / NTK / tutorial panel across all five sites closes with the quiet transparent
   .tutorial-close circle, and one dismiss gesture should not have two looks. All nine
   options cards were swept to .tutorial-close that day — qFIT ToDo / Checklist /
   BulkEdit / ChecklistCsv, PacklistPRO Packlist / Quicklist / Tasklist /
   ConfigureItems / ConfigureTasks, qMEET MemberMatch, NHT Gallery (page-local copy).
   ⚠ LEFT IN PLACE RATHER THAN DELETED ON PURPOSE. This sheet is ONE source with FIVE
   physical copies in production, so a deploy can leave a site briefly serving an older
   .aspx against a newer .css; dead rules cost nothing and cannot cause that mismatch.
   .card-options-topbar itself (the positioning wrapper, above) is likewise unused.
   ⚠ .tip-icon-button on its own is NOT retired — 259 pages use it for tips-close,
   file-remove and similar. Only this topbar-scoped OVERRIDE is dead. */
.card-options-topbar .tip-icon-button {
    min-width: 2.5rem;
    min-height: 2.5rem;
    color: #111;
    background-color: var(--color-primary, #0090C8);
    border-radius: var(--btn-radius, 6px);
    box-shadow: var(--shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.15));
    font-weight: 700;
}
.card-options-topbar .tip-icon-button:hover {
    color: #111;
    background-color: var(--color-primary-dark, #005a80);
}
.card-options-topbar .tip-icon-button:active {
    box-shadow: var(--shadow-btn-active, inset 0 2px 4px rgba(0, 0, 0, 0.10));
}

.tip-card {
    background-color: var(--color-info-bg, #e1f5fe);
    border: 1px solid var(--color-info-border, #81d4fa);
    border-radius: var(--border-radius, 8px);
    padding: var(--card-padding, 1rem);
    margin-bottom: 1rem;
    position: relative;
    /* Hidden by default so the card doesn't flash on pages where the user
       previously closed it. initTips() adds .tip-visible to show it. */
    display: none;
}
.tip-card.tip-visible { display: block; }

/* The "Turn On Notifications" nudge (qFIT Checklist + PLP/NHT/PM Home) wears .tip-card for
   its LOOK only — its visibility is driven by the [hidden] attribute (page JS clears it when
   Notification.permission isn't granted), never by initTips()/.tip-visible. Without this
   override the base display:none above made the nudge unrevealable — it shipped dead on all
   four sites (found 2026-07-20 during the help-system redesign). */
.tip-card.home-notif-nudge { display: block; }
.tip-card.home-notif-nudge[hidden] { display: none; }

/* Always-visible tip card — used on Tips.aspx to display read-only copies of
   each page's own tips (no ⓘ trigger, no × close, never collapsed). initTips()
   leaves these alone because they don't carry the .tip-card class, so the page
   header's single ⓘ trigger can't toggle them. */
.tip-card-static {
    background-color: var(--color-info-bg, #e1f5fe);
    border: 1px solid var(--color-info-border, #81d4fa);
    border-radius: var(--border-radius, 8px);
    padding: var(--card-padding, 1rem);
    margin: 0 0 0.85rem 0;
    position: relative;
}
.tip-card-static:last-child { margin-bottom: 0; }
.tip-card-static .tip-card-heading { margin-right: 0; }

/* ── Collapsible tip card — <details class="tip-card-static"> ──────────────
   Added 2026-08-06, replacing qMeet's legacy "(tips)" / "(how does this work?)"
   LinkButtons. Those were a postback that swapped the link's own .Text for a
   paragraph of help, so the trigger DISAPPEARED on expand (the only way back was
   to click the paragraph), the copy could not contain markup, and revealing one
   sentence re-rendered the page. All 16 are gone; this is what a tip reaches for
   when it is genuinely too long to sit open.

   🔑 Reach for this ONLY when the copy is long. The house default is still an
   always-visible <p class="inline-tip"> under the control for a sentence or two,
   and a plain (non-<details>) .tip-card-static for a consequence warning — never
   hide a warning behind a click. See Shared\docs\DeadTipCopy.md.

   Consumers: qMEET EditEventMembers.aspx + EditGroupMembers.aspx, the ~200-word
   "creates a real account for them" bulk-add disclosure. Both ship <details OPEN>
   — collapsing exists so the organizer can fold the wall away AFTER reading it,
   not so the page can arrive with the warning hidden. If you add a consumer that
   starts closed, make sure what stays visible in the <summary> is the whole point
   of the tip, because that is all most people will ever read.

   🛑 <details>/<summary>, not a button + JS. <summary> is already a button to the
   accessibility tree and exposes aria-expanded natively, and it needs no script —
   which matters here because .tip-card (the ⓘ-triggered panel) is display:none
   until site.js initTips() runs, and a tip that ships invisible is the exact bug
   the .tip-card-static family exists to avoid. Mirrors .form-more-summary. */
details.tip-card-static > summary.tip-card-summary {
    list-style: none;
    cursor: pointer;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.15rem 0.4rem;
    font-size: var(--font-size-lg, 1.125rem);
    font-weight: var(--font-weight-bold, 600);
    color: var(--color-text, #1a1f2e);
    line-height: 1.3;
    border-radius: 4px;
}
details.tip-card-static > summary.tip-card-summary::-webkit-details-marker { display: none; }
details.tip-card-static > summary.tip-card-summary::before {
    content: "\25B8";                  /* the caret; becomes the open form below */
    font-size: 0.8em;
    color: var(--color-text-muted);
    flex: 0 0 auto;
}
details.tip-card-static[open] > summary.tip-card-summary::before { content: "\25BE"; }
/* Names the action as well as showing state — same reasoning as .form-more-summary.
   Visual reinforcement only; <summary> already supplies the accessible name, so do
   NOT promote this to an aria-label. */
details.tip-card-static > summary.tip-card-summary::after {
    content: "Show";
    margin-left: auto;
    flex: 0 0 auto;
    font-size: 0.7em;
    font-weight: var(--font-weight-bold, 600);
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--color-text-muted);
}
details.tip-card-static[open] > summary.tip-card-summary::after { content: "Hide"; }
details.tip-card-static > summary.tip-card-summary:focus-visible {
    outline: 2px solid var(--color-accent, #0277bd);
    outline-offset: 2px;
}
/* Only once open does the body need separating from the summary — collapsed, this
   margin would leave the card looking bottom-padded for no reason. */
details.tip-card-static[open] > summary.tip-card-summary { margin-bottom: 0.5rem; }

/* ── 6a. Generic card ─────────────────────────────────────── */
.card {
    background-color: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    box-shadow: var(--shadow-card);
    padding: var(--card-padding);
    margin-bottom: var(--section-gap);
    transition: box-shadow var(--transition-mid), border-color var(--transition-mid);
}
.card-lg { padding: var(--card-padding-lg); }
.card-title {
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    margin: 0 0 0.75rem 0;
    color: var(--color-text);
    padding-bottom: 0.45rem;
    border-bottom: 1px solid var(--color-border);
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    flex-wrap: wrap;
}

/* Read-only "Account activity" card list (MyProfile across all 4 sites).
   A simple key/value list — label in normal weight, value bold via <strong>.
   The host .main-card supplies the box; this just spaces the rows. */
.account-activity-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.account-activity-list li {
    padding: 0.2rem 0;
    color: var(--color-text);
}
.account-activity-list li + li {
    border-top: 1px solid var(--color-border);
}

summary { cursor: pointer; }
/* Disclosure chevron for <details> cards whose <summary> is the card title.
   .card-title is display:flex, which suppresses the native ::marker triangle —
   without this the heading gives no visual hint it can expand (e.g. the
   Trip Dashboard Retrospectives and Recent Activity cards).

   🔑 REWRITTEN 2026-08-20 (owner: "some cards are missing the up/down arrow …
   move all the arrows so they're right after the title"). This used to be a
   TEXT triangle in ::before — a "▸ " sitting BEFORE the title, which was a
   third arrow position on top of the two the JS-enhanced cards already had,
   and read as a bullet rather than a control. It is now the SAME drawn chevron
   as .home-head-toggle::after below, in ::after with `order: 1` so it lands
   immediately after the title text and ahead of any count pill / summary.
   Rotation matches those cards too. FLIPPED 2026-10-10 (owner, UI review Site-67): closed points
   DOWN, open points UP, on every card of this kind. */
summary.card-title { list-style: none; }
summary.card-title::-webkit-details-marker { display: none; }
summary.card-title::after {
    content: "";
    flex: 0 0 auto;
    align-self: center;
    order: 1;
    width: 0.5em;
    height: 0.5em;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg);            /* closed = points DOWN (flipped 2026-10-10, UI review Site-67) */
    transition: transform 0.15s ease;
    opacity: 0.55;
}
details[open] > summary.card-title::after { transform: rotate(225deg); }   /* open = points UP */

/* ── Progressive-disclosure block inside a form card (.form-more) ──────────
   The "required fields + Save up front, everything else behind one summary"
   pattern. Introduced on PacklistPRO EditItem 2026-08-04; qFIT EditMethod and
   qMeet EditEvent followed, then on 2026-08-09 PLP EditTask, qFIT EditTarget,
   qFIT EditCategory and qMeet EditGroup. SEVEN pages now share this block —
   change it here rather than forking a per-site copy.
   PLP EditPark folded its page-local .park-form-more onto this on 2026-08-09
   (those rules are deleted, not orphaned); it is the one page that keeps TWO
   disclosures, because its optional fields are two genuinely separate groups on
   a short public submission form rather than one "everything else".
   ⚠ qFIT EditGoals is deliberately NOT on this pattern — it is a bulk
   goal-setting wizard with no required fields, so there is nothing to leave
   visible and its four sections ARE the page. Don't "finish the set".

   🔴 WHY <details> AND NOT A SERVER-SIDE Visible TOGGLE. A collapsed <details>
   sets its children display:none but leaves them in the DOM with their loaded
   values, so they still post and still round-trip. A control given
   Visible="False" stops rendering, reads back as "", and an unconditional
   UPDATE then writes NULL over a column the user never touched. Never
   "optimize" a .form-more into server-side visibility. */
.form-more {
    border-top: 1px solid var(--color-border);
    margin: 1rem 0 0.5rem;
    padding-top: 0.5rem;
}
/* THE SUMMARY IS A BAR, NOT A LINE OF LINK TEXT (2026-08-05). Two owner
   reports, one rule: "More options" was breaking across two lines, and nothing
   said the thing could be opened. Three changes, each answering one of those:

     • display:flex + border + fill → it reads as a control you can press.
       inline-flex shrink-wrapped to the text, which is exactly what made it
       look like a sentence in the middle of a form.
     • .form-more-label { white-space: nowrap } → the label is now its OWN
       element and can never break. It used to be a bare text node, i.e. an
       anonymous flex item, so there was no selector to hang the rule on:
       when the count text squeezed it, "More options" wrapped to "More" /
       "options". qMeet's count is a six-item list, so it always did.
     • ::after Show/Hide alongside the ▸/▾ caret → names the action as well as
       showing the state. <summary> already exposes role=button and
       aria-expanded natively, so this is visual reinforcement and NOT the
       accessible name — do not "improve" it into an aria-label.

   🔑 The count sits on its OWN flex line (flex-basis:100%) and ::after is
   pulled AHEAD of it with order, giving "title row + subtitle" at every width.
   Without the order swap ::after follows the wrapped count and Show/Hide
   drifts to the bottom-right corner of the block.

   🛑 NOT a button element and not a JS toggle. <summary> is already a button
   to the accessibility tree and the keyboard, and <details> is what keeps the
   collapsed fields in the DOM (see the 🔴 note above) — swapping it out would
   re-open that whole hazard for a look that CSS gives us for free. */
.form-more-summary {
    list-style: none;
    cursor: pointer;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.15rem 0.4rem;
    padding: 0.55rem 0.75rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    background-color: var(--color-bg-input);
    font-weight: 600;
    color: var(--color-link);
    transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
}
.form-more-summary::-webkit-details-marker { display: none; }
.form-more-summary::before {
    content: "\25BE";              /* ▾ — becomes ▴ when open (flipped 2026-10-10) */
    font-size: 0.8em;
    color: var(--color-text-muted);
    flex: 0 0 auto;
}
.form-more[open] > .form-more-summary::before { content: "\25B4"; }   /* closed points down, open points up: flipped 2026-10-10 (UI review Site-67); it was right / down */
.form-more-summary::after {
    content: "Show";
    order: 2;                      /* ahead of the count — see 🔑 above */
    margin-left: auto;
    flex: 0 0 auto;
    font-size: 0.75em;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--color-text-muted);
}
.form-more[open] > .form-more-summary::after { content: "Hide"; }
.form-more-summary:hover {
    color: var(--color-link-hover);
    border-color: var(--color-border-focus);
    /* A translucent wash composited OVER the base fill, not an opaque token.
       --color-primary-light is the obvious pick and is wrong in BOTH themes on
       top of --color-bg-input: identical to it in light (#e0f6fe vs #e2f1fb, no
       visible hover at all) and DARKER than it in dark (#082a3d vs #555555).
       Same trap, same fix as .input-clear-btn:hover — see the note there. */
    background-image: linear-gradient(var(--color-hover-wash), var(--color-hover-wash));
}
.form-more-summary:focus-visible {
    outline: none;
    box-shadow: var(--shadow-focus);
}
/* The label never breaks. It exists purely so that rule has something to
   target; keep the markup wrapping "More options" on all three pages. */
.form-more-label { white-space: nowrap; }
/* "(all optional)" — states the rule the disclosure implies, so nobody has to
   open it to find out whether something in there is required. Own line, indented
   under the label, so however long the list gets it can never squeeze the label. */
.form-more-count {
    order: 3;
    flex-basis: 100%;
    padding-left: 1.1em;
    font-weight: 400;
    font-size: var(--font-size-sm, 0.875rem);   /* 14px, a step of the text scale (it was 0.9em = 16.2px): Site-176, 2026-10-13 */
    color: var(--color-text-muted);
}
.form-more[open] > .form-group:first-of-type,
.form-more[open] > .form-row:first-of-type { margin-top: 0.75rem; }

/* A titled sub-group inside .form-more — a second record edited by the same
   Save (EditItem's "My Settings"). Not another disclosure: one level only. */
.form-more-group {
    border-top: 1px solid var(--color-border);
    margin-top: 1.5rem;
    padding-top: 0.75rem;
}
.form-more-group-title {
    font-size: 1rem;
    font-weight: 600;
    margin: 0 0 0.25rem;
    color: var(--color-text);
}
.card-interactive { cursor: pointer; }
.card-interactive:hover,
.card:hover.card-interactive {
    box-shadow: var(--shadow-card-hover);
    border-color: color-mix(in srgb, var(--color-accent) 25%, var(--color-border));
}
.card-accent {
    border-top: 3px solid var(--color-accent);
    border-radius: var(--border-radius);
}

/* Card list styling — branded bullets for unclassed <ul>/<ol> inside cards */
.card > ul:not([class]),
.card > ul.small,
.card > ol:not([class]),
.card > ol.small {
    padding-left: 1.15rem;
    margin: 0.5rem 0;
}
.card > ul:not([class]) > li,
.card > ul.small > li,
.card > ol:not([class]) > li,
.card > ol.small > li {
    margin-bottom: 0.55rem;
    line-height: 1.55;
}
.card > ul:not([class]) > li:last-child,
.card > ul.small > li:last-child,
.card > ol:not([class]) > li:last-child,
.card > ol.small > li:last-child { margin-bottom: 0; }
.card > ul:not([class]),
.card > ul.small {
    list-style: none;
    padding-left: 1.25rem;
}
.card > ul:not([class]) > li,
.card > ul.small > li {
    position: relative;
    padding-left: 0.6rem;
}
.card > ul:not([class]) > li::before,
.card > ul.small > li::before {
    content: "";
    position: absolute;
    left: -0.55rem;
    top: 0.7em;
    width: 0.4rem;
    height: 0.4rem;
    border-radius: 50%;
    background: var(--color-accent);
    transform: translateY(-50%);
}
.card > ol:not([class]) > li::marker,
.card > ol.small > li::marker { color: var(--color-accent); font-weight: 700; }

.tip-card-heading {
    font-size: var(--font-size-lg, 1.125rem);
    font-weight: var(--font-weight-bold, 600);
    color: var(--color-text, #1a1f2e);
    margin: 0 1.5rem 0.5rem 0;
    line-height: 1.3;
}

.tip-card-text {
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text, #1a1f2e);
    margin: 0;
    line-height: 1.5;
}

/* ── Tip card "show more" (progressive disclosure) ─────────────
   Long tip cards (many <li>) collapse to the first few items with a
   "Show N more" toggle so the card stays compact. Activated entirely by
   site.js initTips(): it adds .tips-collapsible to the card, .tip-extra to
   the overflow items, and toggles .tips-expanded. This block is inert until
   that JS runs, so it is safe to ship to every site ahead of the per-site
   JS rollout (short cards never get .tips-collapsible). */
.tip-card.tips-collapsible:not(.tips-expanded) .tip-extra { display: none; }
.tips-more {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-top: 0.5rem;
    padding: 0.25rem 0;
    border: none;
    background: transparent;
    color: var(--color-accent, #0277bd);
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-bold, 600);
    cursor: pointer;
    text-decoration: underline;
    text-underline-offset: 2px;
}
.tips-more:hover { text-decoration: none; }
.tips-more:focus-visible {
    outline: 2px solid var(--color-accent, #0277bd);
    outline-offset: 2px;
    border-radius: 4px;
}

/* ── 7. Form inputs ────────────────────────────────────────── */
.textbox,
input.textbox,
textarea.textbox,
select.textbox,
.textarea,
.dropdown,
.date-picker,
.file-picker {
    display: block;
    width: 100%;
    max-width: 100%;
    height: var(--input-height, 2.5rem);
    padding: var(--input-padding, 0.5rem 0.75rem);
    font-family: inherit;
    font-size: max(16px, var(--font-size-base, 1rem));  /* 16px floor prevents iOS auto-zoom */
    color: var(--color-text, #1a1f2e);
    background-color: var(--color-bg-input, #ffffff);
    border: 1px solid var(--color-border, #e0e0e0);
    border-radius: var(--border-radius-sm, 6px);
    -webkit-appearance: none;
    appearance: none;
    transition: border-color var(--transition-fast, 0.15s ease),
                box-shadow var(--transition-fast, 0.15s ease),
                background-color var(--transition-fast, 0.15s ease);
}
.textarea,
textarea.textbox {
    height: auto;
    min-height: calc(var(--input-height, 2.5rem) * 2.5);
    resize: vertical;
    line-height: 1.5;
}
.dropdown,
select.textbox {
    padding-right: 2.25rem;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'><path d='M1 1.5 L6 6.5 L11 1.5' stroke='%23808080' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/></svg>");
    background-repeat: no-repeat;
    background-position: right 0.75rem center;
    background-size: 0.75rem;
}
[data-theme="dark"] .dropdown,
[data-theme="dark"] select.textbox {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'><path d='M1 1.5 L6 6.5 L11 1.5' stroke='%239aa0a6' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/></svg>");
}
.textbox:hover:not(:focus):not(:disabled),
input.textbox:hover:not(:focus):not(:disabled),
textarea.textbox:hover:not(:focus):not(:disabled),
select.textbox:hover:not(:focus):not(:disabled),
.textarea:hover:not(:focus):not(:disabled),
.dropdown:hover:not(:focus):not(:disabled),
.date-picker:hover:not(:focus):not(:disabled),
.file-picker:hover:not(:focus):not(:disabled) {
    border-color: color-mix(in srgb, var(--color-text-muted, #6c757d) 35%, var(--color-border, #e0e0e0));
}
.textbox:focus,
input.textbox:focus,
textarea.textbox:focus,
select.textbox:focus,
.textarea:focus,
.dropdown:focus,
.date-picker:focus,
.file-picker:focus {
    outline: none;
    border-color: var(--color-border-focus, var(--color-primary, #0090C8));
    box-shadow: var(--shadow-focus, 0 0 0 3px rgba(0, 176, 240, 0.22));
}

.textbox:disabled,
input.textbox:disabled,
textarea.textbox:disabled,
select.textbox:disabled,
.textarea:disabled,
.dropdown:disabled,
.date-picker:disabled,
.file-picker:disabled {
    opacity: 0.6;
    background-color: var(--color-bg, #f5f7fa);
    cursor: not-allowed;
}

/* ── The file picker is NOT a text box, and sizing it like one clipped it ──────
   Owner, 2026-09-02: "The 'Choose Files' surrounding blue area box is too short
   and cutting off the bottom of the 'Choose Files' button."

   He is describing arithmetic, not a rendering quirk. The block above gives every
   input `height: 2.5rem` and `padding: 0.5rem 0.75rem`, and with the global
   `box-sizing: border-box` that leaves a 22px content box (40 − 16 padding − 2
   border). A file input's content is the browser's own NATIVE "Choose Files"
   button, which is ~24–30px tall and does not shrink — so it overflowed the
   bordered box and its bottom edge was cut off.

   🔑 A FIXED HEIGHT IS THE BUG. The fix is `height: auto` with the same value as a
   MINIMUM, so the control still lines up with the text boxes above and below it on
   a normal row and simply grows when the platform's button is taller. The vertical
   padding also comes down, because a native button carries its own.

   ⚠ THIS IS THE THIRD PLACE THAT HAS HAD TO WORK AROUND IT. PacklistPRO's
   `.pf-uploadrow .file-picker` (profile photo) already set `height: auto`, and
   `.tf-upload .file-picker` had its own override; two site-local patches for a
   defect in the shared rule is the signal that the shared rule was wrong. Fixed
   here so every upload surface on all five sites gets it — ContactUs, the profile
   photo, Itinerary's Trip Documents and any future one.

   🛑 Keep this AFTER the block above: same specificity (0,1,0), so order decides. */
.file-picker,
input[type="file"].file-picker {
    height: auto;
    min-height: var(--input-height, 2.5rem);
    padding-top: 0.3rem;
    padding-bottom: 0.3rem;
    line-height: 1.6;
    /* Long filenames must not push the card sideways on a phone. */
    max-width: 100%;
}

/* Invalid-state input styling (aria-invalid from ASP.NET validators, or .input-invalid
   from client-side JS). Mirrors the focus ring in danger color. */
.textbox[aria-invalid="true"],
.textbox.input-invalid {
    border-color: var(--color-danger);
}
.textbox[aria-invalid="true"]:focus,
.textbox.input-invalid:focus {
    box-shadow: 0 0 0 3px rgba(198, 40, 40, 0.18);
}
.textbox.input-error,
input.input-error,
select.input-error,
textarea.input-error {
    border-color: var(--color-danger);
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-danger) 18%, transparent);
}

/* Native placeholder text inside textbox/textarea.
   Sized to the design system's normal UI text (--font-size-sm), deliberately SMALLER
   than the host input's reading size (--font-size-base, ~18px) so the placeholder hint
   doesn't dominate the field. (Was `inherit` = same size as typed text, which read too
   large.) Color is mid-gray #808080 per design req. One rule for all 4 sites — the shared
   sheet loads last. One deliberate override exists: qMEET LiveChat's .lc-input::placeholder
   scales with the page's --lc-font chat font-size setting, at the same 0.875 ratio. */
input::placeholder,
textarea::placeholder,
.textbox::placeholder,
.textarea::placeholder {
    color: #808080;
    font-size: var(--font-size-sm, 0.875rem);
    opacity: 1;  /* Firefox lowers it by default */
}

.checkbox,
input[type="checkbox"].checkbox,
.checkbox > input[type="checkbox"] {
    width: 1.125rem;
    height: 1.125rem;
    min-width: 1.125rem;
    cursor: pointer;
    accent-color: var(--color-primary, #0090C8);
    vertical-align: middle;
    margin-right: 0.375rem;
}
.checkbox:disabled,
.checkbox > input[type="checkbox"]:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}
/* 🔴 THE BARE `.checkbox` RULE ABOVE SIZES A BOX, so any element that borrows the class
   as a WRAPPER inherits an 18x18 cage it was never meant to have. An ASP.NET CheckBox
   renders <span class="checkbox"><input type=checkbox></span>, which is why span had an
   escape hatch from the start — but a hand-written <label class="checkbox">Text</label>
   is the same shape and had none, so it was pinned to width: 18px / min-width: 18px.
   On a plain label the text simply OVERFLOWS the box and looks fine, which is how this
   survived unnoticed; the damage shows the moment the label is a flex container, because
   then its children are laid out inside 18px and shrink to their longest word instead of
   wrapping. That is exactly what made "Use Google Routes (alternates + tolls; billed)"
   render as two ragged side-by-side columns on Park.aspx (owner, 2026-08-12: "it's
   wrapping too much within their columns").
   Measured that day: 4 such labels exist across all five sites, all on PacklistPRO —
   Park.aspx (x2), Notes.aspx, LogViewer.aspx.
   ⚠ Keep label and span on ONE rule. Splitting them is how the next wrapper element to
   borrow .checkbox gets the cage back. */
span.checkbox,
label.checkbox {
    display: inline-flex;
    align-items: center;
    width: auto;
    height: auto;
    min-width: 0;
    margin-right: 0;
}
.checkbox-nowrap { white-space: nowrap; }
/* Large checkbox variant — add `checkbox-lg` alongside `checkbox` for big, tap-
   friendly boxes (e.g. the per-day completion tally on TargetDetails/MethodDetails).
   An ASP.NET CheckBox renders <span class="checkbox checkbox-lg"><input type=checkbox></span>,
   so the actual control is the INPUT *child* of the span — size that (plus a bare
   input.checkbox-lg for non-server markup). 1.6875rem = 150% of the 1.125rem default;
   matches the base rule's specificity and wins by load order. */
.checkbox-lg > input[type="checkbox"],
input[type="checkbox"].checkbox-lg {
    width: 1.6875rem;
    height: 1.6875rem;
    min-width: 1.6875rem;
}
/* Stacked reminder/notification channel checkboxes — a flex column so every checkbox's left
   edge lines up perfectly (replaces per-item .form-group wrappers, which didn't align cleanly). */
.reminder-channels { display: flex; flex-direction: column; align-items: flex-start; gap: 0.5rem; }
.check-row {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    min-height: 44px;
    cursor: pointer;
}
.radio-button,
input[type="radio"].radio-button,
.radio-button > input[type="radio"] {
    width: 1.125rem;
    height: 1.125rem;
    min-width: 1.125rem;
    vertical-align: middle;
    accent-color: var(--color-primary, #0090C8);
    cursor: pointer;
    margin: 0 0.375rem 0 0;
}
span.radio-button {
    display: inline-flex;
    align-items: center;
    width: auto;
    height: auto;
    min-width: 0;
    margin-right: 0;
}
/* asp:RadioButtonList renders bare <input type="radio"> with NO .radio-button class, so
   the rule above never applies and the dot sits flush against its <label> (e.g. qFIT
   Join3 gender). Give un-classed radios the same gap + alignment so every plain
   RadioButtonList across the four sites reads consistently. :not(.radio-button) avoids
   double-spacing the design-system radios that already set this margin. */
input[type="radio"]:not(.radio-button) {
    vertical-align: middle;
    margin: 0 0.375rem 0 0;
}

/* ── 8. Buttons ────────────────────────────────────────────── */
.button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    vertical-align: middle;
    gap: 0.375rem;
    padding: var(--btn-padding, 0.5rem 1.25rem);
    font-family: inherit;
    font-size: var(--btn-font-size, 0.9375rem);
    font-weight: var(--btn-font-weight, 500);
    line-height: 1;
    text-align: center;
    text-decoration: none;
    /* CONTRAST (WCAG 1.4.3 AA). Near-black, NOT white, on the brand cyan.
       White on --color-primary (#00B0F0) measures 2.48:1 — below the 4.5:1
       normal-text minimum and below even the 3:1 large-text floor. #111 on the
       same cyan measures 7.61:1. The brand cyan is unchanged; only the text on
       top of it moved. Matches .alert-panel.info / .site-toast.toast-info,
       which already use #111 on this exact fill.
       ⚠ The colored variants (.save / .danger / .warning / .saved /
       .save-error) each re-declare color: #ffffff on their own darker fills and
       are all LATER in this file, so they keep white and are unaffected. */
    color: #111;
    background-color: var(--color-primary, #0090C8);
    border: none;
    border-radius: var(--btn-radius, 6px);
    cursor: pointer;
    transition: background-color var(--transition-fast, 0.15s ease),
                color var(--transition-fast, 0.15s ease),
                box-shadow var(--transition-fast, 0.15s ease),
                opacity var(--transition-fast, 0.15s ease);
    white-space: nowrap;
    box-shadow: var(--shadow-btn, 0 1px 2px rgba(0,0,0,0.15));
    min-height: 44px;             /* iOS touch-target accessibility */
    min-width: 44px;
    -webkit-tap-highlight-color: transparent;
    user-select: none;
}
.button:hover {
    background-color: var(--color-primary-dark, #005a80);
    /* #111 on --color-primary-dark (#0090C8) = 5.24:1. White here was 3.61:1,
       so the hover state failed AA too even before the rest state was fixed. */
    color: #111;
    text-decoration: none;
}
.button:focus-visible {
    outline: none;
    box-shadow: var(--shadow-btn, 0 1px 2px rgba(0,0,0,0.15)),
                var(--shadow-focus-ring, 0 0 0 3px rgba(0, 176, 240, 0.35));
}
.button:active {
    opacity: 0.92;
    box-shadow: var(--shadow-btn-active, inset 0 2px 4px rgba(0, 0, 0, 0.10));
}
.button:disabled,
.button[disabled] {
    opacity: 0.55;
    cursor: not-allowed;
    pointer-events: none;
}

/* Save (lime green) - .button.save */
/* CONTRAST (WCAG 1.4.3 AA) — text changed 2026-08-23, test-plan row A11Y-01.
   .button above moved its label to #111 on the brand cyan for exactly this reason, and its
   comment then claimed "the colored variants (.save / .danger / .warning / .saved /
   .save-error) each re-declare color: #ffffff on their own DARKER fills ... so they keep
   white and are unaffected". Measured, that is true of .danger (#d32f2f, 4.98:1), .saved
   (#2e7d32, 5.13:1) and .save-error (#d32f2f, 4.98:1) — but NOT of this one. Lime #32cd32
   is the LIGHTEST fill in the set and white on it is 2.12:1, the worst ratio measured
   anywhere in this pass, on the Save button that appears on nearly every form. The hover
   fill #28a828 is only 3.12:1, so it failed too.
   #111 measures 8.91:1 on the resting fill and 6.04:1 on hover. The brand lime is NOT
   changed — only the label on top of it moved, the same trade .button already made. */
.button.save {
    background-color: var(--color-save-btn, #32cd32);
    border-color: var(--color-save-btn, #32cd32);
    color: #111;
}
.button.save:hover {
    background-color: var(--color-save-btn-hover, #28a828);
    border-color: var(--color-save-btn-hover, #28a828);
}

/* Danger (red) - .button.danger - Delete, Clear, Cancel */
.button.danger {
    background-color: var(--color-delete-btn, #d32f2f);
    border-color: var(--color-delete-btn, #d32f2f);
    color: #ffffff;
}
.button.danger:hover {
    background-color: var(--color-delete-btn-hover, #b71c1c);
    border-color: var(--color-delete-btn-hover, #b71c1c);
}

/* Transparent (outline only) - .button.transparent
   CONTRAST (WCAG 1.4.3 AA text + 1.4.11 AA non-text) — changed 2026-08-23, row A11Y-01.
   This variant is the ONE button style whose brand cyan is TEXT rather than a fill, so the
   reasoning at .button above (which moved the text to #111 and kept the cyan as background)
   never applied to it. Both properties used --color-primary (#00B0F0), which measures
   2.48:1 on a white card — failing the 4.5:1 text minimum AND the 3:1 minimum for the
   button's own outline, so neither the label nor the boundary was reliably visible. On
   qMEET Home alone this was 7 controls ("Take the site tour", "Verify Email", "My Profile",
   "Add Photo", "My Interests"...).
   Both now use --color-link, which is theme-aware: #006C96 in light mode (5.86:1 on a card,
   4.56:1 on the page background) and back to the bright brand cyan in dark mode (5.10:1 on
   the dark card). That keeps the control unmistakably on-brand — still cyan, just deep
   enough to read — rather than restyling it. Hover moves to --color-accent-deeper against
   the pale --color-primary-light wash, which is darker again and comfortably passes.
   ⚠ Do NOT put --color-primary back here. It is correct for FILLS (see .button, .save,
   .danger, which all pair it with #111 or white ON TOP) and wrong for text on a light
   surface. */
.button.transparent {
    background-color: transparent;
    color: var(--color-link, #006C96);
    border: 1px solid var(--color-link, #006C96);
    box-shadow: none;
}
.button.transparent:hover {
    background-color: var(--color-primary-light, #e0f6fe);
    color: var(--color-accent-deeper, #005a80);
    border-color: var(--color-accent-deeper, #005a80);
}

/* Warning (orange) - .button.warning - Caution/alert action */
/* CONTRAST (WCAG 1.4.3 AA) — text changed 2026-08-23, test-plan row A11Y-01. Second of the
   two colored variants the .button comment wrongly cleared as "darker fills, keep white":
   white on the brand orange #e65100 measures 3.79:1, under the 4.5:1 normal-text minimum
   (it clears only the 3:1 large-text floor, and these labels are not large text). #111 on
   the same orange measures 4.98:1 and is better again on the lighter #d97706 hover fill.
   Brand orange unchanged; only the label moved. See .button.save just above. */
.button.warning {
    background-color: var(--color-warning, #e65100);
    border-color: var(--color-warning, #e65100);
    color: #111;
}
.button.warning:hover {
    background-color: #d97706;
    border-color: #d97706;
}

/* Focus rings for colored button variants */
.button.save:focus-visible {
    box-shadow: var(--shadow-btn), 0 0 0 3px rgba(50, 205, 50, 0.35);
}
.button.danger:focus-visible {
    box-shadow: var(--shadow-btn), 0 0 0 3px rgba(211, 47, 47, 0.35);
}

/* Small modifier - .button.small */
.button.small {
    padding: var(--btn-padding-sm, 0.375rem 0.875rem);
    font-size: 0.875rem;
}

/* Save-state feedback (set by site.js setSaving / setSaved / setSaveError). */
.button.saving { opacity: 0.75; cursor: wait; }
.button.saved { background-color: var(--color-success, #2e7d32); color: #fff; }
.button.save-error {
    background-color: var(--color-delete-btn, #d32f2f);
    color: #fff;
    animation: flashError 0.6s ease forwards;
}
@keyframes flashError {
    0%   { background-color: var(--color-delete-btn, #d32f2f); }
    100% { background-color: var(--color-primary, #0090C8); }
}

/* Icon-only button (e.g. the ⓘ Tips trigger, × close). */
.tip-icon-button,
.tips-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.75rem;
    min-height: 2.75rem;
    padding: 0.25rem;
    border: none;
    background: transparent;
    color: var(--color-text-muted, #6c757d);
    font-size: 1.25rem;
    line-height: 1;
    cursor: pointer;
    border-radius: var(--border-radius-sm, 6px);
    transition: color var(--transition-fast, 0.15s ease),
                background-color var(--transition-fast, 0.15s ease);
}
.tip-icon-button:hover,
.tips-close:hover {
    color: var(--color-text, #1a1f2e);
    background-color: var(--color-primary-light, #e0f6fe);
}
.tip-icon-button:focus-visible,
.tips-close:focus-visible {
    outline: 2px solid var(--color-border-focus, var(--color-primary, #0090C8));
    outline-offset: 2px;
}
/* Make the (i) glyph itself bold — the U+24D8 ⓘ default weight reads as a
   thin outline at this font-size and gets visually lost in the header row.
   Scoped to [aria-expanded] so only the tip-opener triggers go bold; other
   uses of .tip-icon-button (× close, × file-remove) never set aria-expanded
   and keep their original weight. */
.tip-icon-button[aria-expanded] {
    font-weight: bold;
}

/* The trigger is the way to OPEN the Tips card. Once the card is open the
   trigger is redundant (and the card has its own × close button), so hide
   it; it reappears when the user closes the card and aria-expanded flips
   back to "false". Tips-toggle JS is the only thing that sets aria-expanded
   on .tip-icon-button, so other tip-icon-button uses (file-remove buttons,
   inline closers) which never get aria-expanded are unaffected. */
.tip-icon-button[aria-expanded="true"] {
    display: none;
}

/* ── 9. Pills ──────────────────────────────────────────────── */
.pill {
    display: inline-flex;
    align-items: center;
    padding: 0.35rem 0.85rem;
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-medium, 500);
    color: var(--color-text, #1a1f2e);
    background-color: var(--color-bg-card, #ffffff);
    border: 1px solid var(--color-border, #e0e0e0);
    border-radius: 999px;
    cursor: pointer;
    user-select: none;
    text-decoration: none;
    transition: background-color var(--transition-fast, 0.15s ease),
                border-color var(--transition-fast, 0.15s ease),
                color var(--transition-fast, 0.15s ease);
}
.pill:hover, .pill:focus { text-decoration: none; }
/* Visible focus ring on a pill that is actually interactive (ToDo QFR-122, 2026-08-09).
   Pills are used two ways: as a static label, and as a <span role="button" tabindex="0">
   filter chip (qFIT's Muscles and RecommendedActivities pages). The second kind is in the
   tab order, and the `.pill:focus` rule above was stripping its underline without putting
   anything back — so a keyboard user tabbing across a row of filters had no idea which one
   they were on. Same treatment as .button:focus-visible so the whole design system agrees.
   :focus-visible, not :focus — a mouse click on a pill should not leave a ring behind. */
.pill:focus-visible {
    outline: none;
    box-shadow: var(--shadow-focus-ring, 0 0 0 3px rgba(0, 176, 240, 0.35));
}
.pill:hover { border-color: var(--color-primary, #0090C8); }
.pill.active,
.pill[aria-pressed="true"] {
    background-color: var(--color-primary, #0090C8);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
    border-color: var(--color-primary, #0090C8);
}
.pill.small {
    padding: 0.15rem 0.55rem;
    font-size: var(--font-size-xs, 0.75rem);
}

/* ── 10. Alert / inline message panels ─────────────────────────
   BLOCK, deliberately — NOT flex. A message panel's content is a SENTENCE
   ("Choose <a>Tags for your Trip</a> so the <strong>Recommended Items</strong>
   filter can be used"), and under display:flex every inline fragment between
   the elements becomes its own anonymous flex item. With the default
   flex-wrap:nowrap those items shrink into narrow side-by-side COLUMNS, each
   wrapping internally — the sentence renders as a jumbled grid. Normal block
   flow is the only layout that lets text, links and <strong> flow as one
   paragraph, so every panel on every site reads correctly with no per-call-site
   wrapper span. The leading data-icon marker is absolutely positioned (below)
   to keep the hanging indent flex used to provide. Fixed 2026-07-21. */
.alert-panel {
    display: block;
    padding: 0.75rem 1rem 0.75rem 0.85rem;
    margin: 0.5rem 0 1rem;
    border: 1px solid transparent;
    border-left-width: 4px;          /* solid accent stripe on the left */
    border-radius: var(--border-radius, 10px);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.45;
    overflow-wrap: break-word;       /* long URLs/tokens can't force a scrollbar */
}
/* Block children (<p>, <ul>, headings) keep their inner rhythm but must not add
   their own margin on top of the panel's padding — flex used to suppress this. */
.alert-panel > :first-child { margin-top: 0; }
.alert-panel > :last-child  { margin-bottom: 0; }
.alert-panel a {
    color: inherit;
    font-weight: var(--font-weight-medium, 500);
    text-decoration: underline;
    text-underline-offset: 2px;
}
.alert-panel a:hover { text-decoration-thickness: 2px; }
/* Optional leading icon (data-icon="⚠️"). Absolutely positioned in the extra
   left padding so the text block keeps a clean hanging indent — the panel is
   block flow now, so a plain ::before would sit INSIDE the text and only the
   first line would be indented. */
.alert-panel[data-icon] {
    position: relative;
    padding-left: 2.4rem;
}
.alert-panel[data-icon]::before {
    content: attr(data-icon);
    position: absolute;
    left: 0.85rem;
    top: 0.75rem;
    font-size: 1.05em;
    line-height: 1.45;
}
/* Solid, saturated message colors — the SINGLE cross-site standard for BOTH
   inline message panels (.alert-panel) and floating toasts (.site-toast, far
   below, which reuse the exact same values). Fixed hex (NOT theme tokens) so a
   success / error / warning / info message looks IDENTICAL on every site and in
   light AND dark mode. Text is near-black (#111) on lime/orange/cyan (white is
   unreadable there) and WHITE on the red error variant (conventional error
   styling, per request). Set 2026-06-10 per the cross-site message unification. */
.alert-panel.success {
    color: #111;
    background-color: #00ff00;   /* pure lime */
    border-color: rgba(0,0,0,0.22);
    border-left-color: rgba(0,0,0,0.45);
}
.alert-panel.error {
    color: #fff;
    background-color: #ff0000;   /* pure red */
    border-color: rgba(0,0,0,0.22);
    border-left-color: rgba(0,0,0,0.45);
}
.alert-panel.warning {
    color: #111;
    background-color: #ff9600;   /* pure orange */
    border-color: rgba(0,0,0,0.22);
    border-left-color: rgba(0,0,0,0.45);
}
.alert-panel.info {
    color: #111;
    background-color: #00B0F0;   /* accent blue */
    border-color: rgba(0,0,0,0.22);
    border-left-color: rgba(0,0,0,0.45);
}
/* An outline button sitting INSIDE a solid panel must borrow the panel's fixed
   text color. .button.transparent is primary-blue by default, which is the SAME
   #00B0F0 as the .info background — the label rendered blue-on-blue and was
   invisible (qFIT Error.aspx's "Copy Reference ID"); it is also poor on the lime,
   orange and red variants. currentColor tracks whichever color the variant set,
   so the button stays readable on all four. */
.alert-panel .button.transparent {
    color: inherit;
    border-color: currentColor;
}
.alert-panel .button.transparent:hover {
    color: inherit;
    background-color: rgba(255,255,255,0.35);
    border-color: currentColor;
}

/* Welcome banner — a PERSISTENT, dismissible variant of .alert-panel used for the
   one-time post-signup message (see BasePage.ShowWelcomeBanner on each site). It
   carries onboarding tips, so unlike a normal success panel it does NOT auto-dismiss;
   the × button (.welcome-banner-close) hides it client-side. Color comes from the
   success class the host site applies (.success or .alert-success). */
.welcome-banner {
    position: relative;
    padding-right: 2.5rem;
}
.welcome-banner-close {
    position: absolute;
    top: 0.35rem;
    right: 0.5rem;
    width: 1.75rem;
    height: 1.75rem;
    padding: 0;
    background: transparent;
    border: none;
    border-radius: 50%;
    font-size: 1.4rem;
    line-height: 1;
    color: inherit;
    opacity: 0.7;
    cursor: pointer;
}
.welcome-banner-close:hover { opacity: 1; }

/* Dismissible inline message panel — the × that BasePage.PopulateAlertPanel appends
   to the PERSISTENT variants (.error / .warning) on all five sites. success/info fade
   themselves out via data-auto-dismiss, so those never get one and never need the
   right-hand gutter. Before this, a server-rendered red error banner had NO close
   control at all: it sat there until the user navigated away or posted back.
   Geometry deliberately matches .welcome-banner-close above — same component, same ×.
   NOTE: clicking the panel BODY does not dismiss it; only the × does, matching the
   floating .site-toast rule. */
.alert-panel.is-dismissible {
    position: relative;
    padding-right: 2.5rem;
}
.alert-panel-close {
    position: absolute;
    top: 0.35rem;
    right: 0.5rem;
    width: 1.75rem;
    height: 1.75rem;
    padding: 0;
    background: transparent;
    border: none;
    border-radius: 50%;
    font-size: 1.4rem;
    line-height: 1;
    color: inherit;
    opacity: 0.7;
    cursor: pointer;
}
.alert-panel-close:hover { opacity: 1; }
.alert-panel-close:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 1px;
}

/* ── 11. Section headings ─────────────────────────────────── */
.largeheading {
    font-size: var(--font-size-xl, 1.375rem);
    font-weight: 700;
    color: var(--color-text);
    margin: 0 0 0.5rem 0;
    line-height: 1.25;
    letter-spacing: -0.005em;
}
.heading {
    font-size: var(--font-size-lg, 1.125rem);
    font-weight: var(--font-weight-bold, 600);
    color: var(--color-text);
    margin: 0 0 0.4rem 0;
    line-height: 1.3;
}

/* ── 12. Horizontal rule ──────────────────────────────────── */
.hr,
hr.hr {
    border: none;
    border-top: 1px solid var(--color-border);
    margin: var(--section-gap, 1.5rem) 0;
}

/* ── 13. Required-field indicator ─────────────────────────── */
.required-star {
    color: var(--color-danger);
    margin-left: 0.1em;
}

/* ── 14. Loading spinner ──────────────────────────────────── */
.spinner {
    display: inline-block;
    width: 1em;
    height: 1em;
    border: 2px solid rgba(255, 255, 255, 0.28);
    border-top-color: #ffffff;
    border-radius: 50%;
    animation: spin 0.65s linear infinite;
    vertical-align: middle;
    will-change: transform;
}
.spinner-dark {
    border-color: rgba(0, 0, 0, 0.2);
    border-top-color: var(--color-primary);
}
@keyframes spin { to { transform: rotate(360deg); } }

/* ── 14a. Inline "updating…" indicator for UpdateProgress ──────
   The standard body of an <asp:UpdateProgress> ProgressTemplate on every site:
   a muted, inline line that appears (after DisplayAfter ms) while an UpdatePanel
   is re-rendering, so a filter change that takes a beat still looks alive.

   Deliberately inline-flex and unobtrusive rather than an overlay: the whole
   point of the UpdatePanel is that the page does NOT flash or move, so a modal
   scrim would undo the win. Reuses the shared .spinner above; the dark variant
   is applied by the caller (`spinner spinner-dark`) on light backgrounds.

   Generalized 2026-08-04 from qMeet's page-local .mm2-updating, which was the
   first instance of this pattern and stays as-is (it is referenced by name in
   MemberMatch's markup and comments). */
.ajax-updating {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0 0 0.6rem;
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}

/* ── 14b. Full-page navigation loading overlay ─────────────────
   Shown by site.js (initPageNavSpinner) when a real page switch / postback has
   been in flight for a short beat — reassures the user their click registered
   while a slow server or cold app-pool renders the next page. The reveal is
   delayed, so fast loads finish first and the spinner never flashes on them.
   The overlay is created once per page and torn down for free when the next
   page loads. Reuses the `spin` keyframes above. */
#pageNavOverlay {
    position: fixed;
    inset: 0;
    z-index: 20000;                 /* above every modal / drawer / toast */
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(0, 0, 0, 0.32);
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.18s ease;
    pointer-events: none;
}
#pageNavOverlay.show {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;           /* block stray clicks while the next page loads */
}
.page-nav-spinner-box {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.85rem;
    padding: 1.5rem 1.9rem;
    border-radius: 14px;
    background: var(--color-bg-card, #ffffff);
    color: var(--color-text, #222222);
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.35);
    min-width: 150px;
}
.page-nav-spinner {
    width: 2.4rem;
    height: 2.4rem;
    border: 3px solid rgba(128, 128, 128, 0.28);
    border-top-color: var(--color-primary, #0a84ff);
    border-radius: 50%;
    animation: spin 0.65s linear infinite;
    will-change: transform;
}
.page-nav-spinner-text {
    font-size: 0.95rem;
    font-weight: 600;
    letter-spacing: 0.01em;
}
@media (prefers-reduced-motion: reduce) {
    .page-nav-spinner { animation-duration: 1.3s; }
    #pageNavOverlay { transition: none; }
}

/* ── 14a. Character counter (below textareas with max length) ── */
.char-counter {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    text-align: right;
    margin-top: 0.2rem;
    transition: color 0.2s, font-weight 0.2s;
    font-variant-numeric: tabular-nums;
}
.char-counter.near-limit { color: var(--color-warning); font-weight: var(--font-weight-medium); }
.char-counter.at-limit   { color: var(--color-danger);  font-weight: var(--font-weight-bold);   }
/* qFIT EditRoutines is the one place that puts this class on a <span>, and `text-align`
   on an INLINE element only moves that element's own inline children — it cannot move
   the element itself, so the counter rendered flush LEFT under a full-width textarea
   while every other counter on the five sites right-aligns. Force block-level wherever
   the class lands; every other counter is already a <p> or a <div>, so in practice this
   rule changes exactly that one span. */
span.char-counter { display: block; }

/* ── 15. Back button ──────────────────────────────────────── */
.back-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    text-decoration: none;
    padding: 0.375rem 0.55rem;
    margin-left: -0.55rem;
    min-height: 44px;
    border-radius: var(--border-radius-sm);
    transition: color var(--transition-fast),
                background-color var(--transition-fast);
}
.back-btn:hover {
    color: var(--color-text);
    text-decoration: none;
    background-color: var(--color-primary-light);
}
.back-btn:focus-visible {
    outline: none;
    box-shadow: var(--shadow-focus);
    color: var(--color-text);
}

/* Labeled variant: "← Back" instead of a bare ←. Applied by each site's site.js
   applyBackLabel(). A lone arrow immediately left of the <h1> reads as a label FOR
   that <h1> (the iOS "← Settings" convention), which next to the CURRENT page's title
   says the opposite of what it does; pairing the arrow with the WORD is the fix.
   See initBackButton() in Scripts/site.js.

   Stays on the title's row at every width — a second line costs more on a phone than
   this control is worth, and at one short word it always fits.

   ⚠ CHANGED 2026-08-12 (owner decision), and the rules below now read differently
   than they did. This used to render the destination too — "← Back to Events" — and
   this comment used to justify the elision as the deliberate trade-off: "a second
   line costs more on a phone than a truncated destination name does, so the back
   label elides before the title reflows." In practice the elision did not degrade
   gracefully, it cut mid-word: measured on qFIT /Calculators at a 380px viewport,
   "Back to Checklist" wanted 89px against 78px available and painted
   "← Back to Chec…". Every destination longer than ~11 characters did the same
   (Checklist, Dashboard, Preferences, Troubleshooting, Places Near Me).
   The destination did not move into the title — it moved onto aria-label and title=,
   so screen readers and hover tooltips still announce "Back to Checklist".
   🔑 SHORTENING THE TEXT WAS NOT ENOUGH ON ITS OWN — the sizing had to change with it.
   These rules were built for a long, shrinkable label: `flex: 0 1 auto` + `min-width: 0`
   let the control shrink below its content, and a proportional `max-width` (50%, 44% on
   phones) bounded it. With one short word that combination still truncated, because the
   percentage is of the TITLE ROW, not the viewport, and that row is far narrower than
   you would guess: measured on qFIT /Dashboard at a 380px viewport the row is 193px, so
   the cap was 85px — but `flex-shrink: 1` squeezed the anchor to 51px anyway to make
   room for the title, leaving the text span 17px against the 25px "Back" needs. It
   rendered "← B…". The word only survives at `flex: 0 0 auto`.
   ⇒ The back button now keeps its natural width and the TITLE absorbs the shrink
   (it wraps; `.page-header-title-row > :not(.back-btn)` already gives it `min-width: 0`).
   Re-measured after the change: text 25px unclipped, anchor 58px, title 136px in the
   same 193px row, page scrollWidth still 380 = viewport.
   🔑 ALL FIVE sites that share this sheet now render the short label — qFIT, qMEET and
   PacklistPRO first, then NobodyHasTHIS and paulmendelson.com the same day. Keep their
   five copies of applyBackLabel() in step; a site left on "Back to <Destination>" is
   the one case these rules still have to survive, which is why the cap stays.
   🔑 THE max-width AND ELLIPSIS ARE A BACKSTOP, NOT DEAD WEIGHT. "Back" is ~25px
   against a ~85px cap at 380px, so nothing reaches them today — but paired with
   `flex-shrink: 0` they are what stops a re-lengthened label from refusing to shrink
   and shoving the title out of the row: the cap clamps it and the ellipsis takes over.
   What must NOT come back is `flex-shrink: 1`. Shrink, not the cap, is what truncated
   the short word — it squeezed the anchor BELOW the cap to make room for the title. */
.back-btn.back-btn-labeled {
    flex: 0 0 auto;
    max-width: 50%;
    white-space: nowrap;
}
.back-btn.back-btn-labeled .back-btn-text {
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 0;
}
@media (max-width: 480px) {
    .back-btn.back-btn-labeled {
        max-width: 44%;
        font-size: var(--font-size-xs, 0.8rem);
    }
}

/* ── 16. Utility classes ──────────────────────────────────── */
.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0,0,0,0);
    white-space: nowrap;
    border: 0;
}
/* 🛑 !important is REQUIRED here — added 2026-08-23, test-plan row A11Y-01. All three sites
   bundle Content/bootstrap.min.css, which ships
   `.text-muted{--bs-text-opacity:1;color:#6c757d!important}`. This sheet loads LAST in the
   bundle, so ordinary specificity would be enough — but Bootstrap's declaration is
   !important, so a plain rule here LOSES and every .text-muted element kept the hard-coded
   #6c757d no matter what --color-text-muted was set to. That is exactly what happened: the
   token was correctly darkened to #5c636a and the elements still computed to #6c757d,
   which is 3.65:1 on the --color-bg page background and fails AA. Verified in the browser
   before and after (PacklistPRO /Weather: 6 nodes, .small-text.text-muted).
   PacklistPRO's own Content/styles.css already documents this same Bootstrap collision at
   its meta rule, for the same reason. Do not "clean up" the !important. */
.text-muted   { color: var(--color-text-muted) !important; }
.text-danger  { color: var(--color-danger); }
.text-success { color: var(--color-success); }
.text-center  { text-align: center; }
.text-right   { text-align: right; }
.text-left    { text-align: left; }
.d-none       { display: none !important; }
.d-flex       { display: flex; }
.d-block      { display: block; }
.flex-wrap    { flex-wrap: wrap; }
.gap-1        { gap: 0.25rem; }
.gap-2        { gap: 0.5rem; }
.gap-3        { gap: 0.75rem; }
.gap-4        { gap: 1rem; }
.mt-1 { margin-top: 0.25rem; }
.mt-2 { margin-top: 0.5rem; }
.mt-3 { margin-top: 0.75rem; }
.mt-4 { margin-top: 1rem; }
.mb-1 { margin-bottom: 0.25rem; }
.mb-2 { margin-bottom: 0.5rem; }
.mb-3 { margin-bottom: 0.75rem; }
.mb-4 { margin-bottom: 1rem; }
.w-100 { width: 100%; }
.cursor-pointer { cursor: pointer; }
.nowrap { white-space: nowrap; }
.select-auto { width: auto; }
.col-w-date { width: 8rem; white-space: nowrap; }
.col-w-chk  { width: 2.5rem; }
.detail-card-hidden { display: none; }

/* ── 16a. Toolbar row helpers ────────────────────────────── */
.toolbar-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    align-items: flex-end;
}
.toolbar-row-spaced {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    align-items: flex-end;
    margin-top: 0.75rem;
}
.toolbar-actions {
    display: flex;
    gap: 0.5rem;
    padding-bottom: 0.25rem;
}
.toolbar-search-grow {
    flex: 1;
    min-width: 200px;
    margin-bottom: 0;
}

/* ── 16b. Responsive hide/show ───────────────────────────── */
@media (max-width: 575px) { .hide-xs { display: none !important; } }
@media (max-width: 767px) { .hide-sm { display: none !important; } }
@media (min-width: 768px) { .show-xs-only { display: none !important; } }

/* ── 17. Focus visible (accessibility) ────────────────────── */
:focus-visible {
    outline: 3px solid var(--color-border-focus);
    outline-offset: 2px;
}

/* ── 18. Modals ───────────────────────────────────────────── */
/* 🔑 THE POPUP BACKDROP - ONE LOOK ON ALL FIVE SITES (owner, 2026-10-06): whenever a popup
   panel opens, the page behind it is dimmed AND blurred, the way qMEET Chat's Word popup
   (a plain .modal-overlay) always was. The two tokens below are the whole definition.
   Every backdrop rule - here, in each site's Content/styles.css and in the few pages that
   carry their own <style> - reads them, so changing the look is an edit to these two lines.
   A NEW popup: put .modal-overlay (or .popup-backdrop, which is only the look, no layout)
   on its full-screen layer, or copy the three declarations from .popup-backdrop.
   ⚠ Rules outside this file repeat the values as var() fallbacks on purpose: NobodyHasTHIS
   Gallery.aspx is standalone and never loads this file, and an undefined var() with no
   fallback silently drops the whole declaration.
   ⚠ Photo viewers (.chat-lightbox, .cus-lightbox, Gallery's .lightbox) take the blur token
   only and keep their own near-black, because a photo needs a dark surround.
   Reduce-transparency users get a solid dim instead - section 47.9 re-points the tokens. */
:root {
    --popup-backdrop-bg: rgba(15, 23, 42, 0.55);
    --popup-backdrop-filter: blur(4px) saturate(140%);
}
.popup-backdrop {
    background: var(--popup-backdrop-bg);
    -webkit-backdrop-filter: var(--popup-backdrop-filter);
    backdrop-filter:         var(--popup-backdrop-filter);
}
.modal-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: var(--popup-backdrop-bg);
    -webkit-backdrop-filter: var(--popup-backdrop-filter);
    backdrop-filter:         var(--popup-backdrop-filter);
    z-index: 2000;
    align-items: center;
    justify-content: center;
    padding: 1rem;
    animation: modalFade 0.18s var(--ease-out-quint);
}
.modal-overlay.open { display: flex; }

/* ⚠ .back-to-top is z-index 9998 (see §"Back to top" below) — FIVE layers above this
   overlay's 2000 — so the ↑ button rendered ON TOP of the dimmed backdrop of every
   shared modal, and stayed clickable behind the dialog. Seen on PacklistPRO
   /PlacesNearMe with the "This Page Costs Money" modal open, 380px viewport,
   2026-08-12; it is not page-specific — .modal-overlay is the shared dialog shell.
   Hidden by state rather than by a z-index bump: the button scrolls a page the user
   cannot reach while a modal is up, and bumping 2000 past 9998 would collide with the
   toast layer (9999) and with .sc-modal-overlay (10050, deliberately above toasts).
   🔑 .sc-modal-overlay needs no rule here — at 10050 it already clears the button.
   🔑 One selector on purpose: every per-page variant (.gps-cost-overlay, etc.) carries
   .modal-overlay too, so matching the shell covers them all. On an engine without
   :has() the rule simply drops and behavior is today's. (54 other :has() rules
   already ship across these stylesheets.) */
body:has(.modal-overlay.open) .back-to-top { display: none; }

.modal-box {
    background-color: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-lg);
    box-shadow: var(--shadow-xl);
    max-width: 480px;
    width: 100%;
    padding: 1.5rem;
    position: relative;
    animation: modalPop 0.22s var(--ease-out-back);
}

/* 🔴 EVERY dialog caps to the viewport and scrolls INSIDE the box - AT EVERY WIDTH.
   Without this a .modal-box taller than the screen is centerd inside a position:fixed
   overlay that cannot scroll, so BOTH ends run off the viewport and the footer buttons
   are simply unreachable. The symptom is width-dependent and reads backwards: qMEET's
   Content/styles.css added the cap only inside @media (max-width:640px), so a phone
   scrolled fine while a WIDE desktop window - where the box is narrower and therefore
   TALLER - silently clipped. Reported 2026-08-18 on the My Places "Which place is this?"
   Google-place chooser (Shared/map-overlays.js openActionSheet), which lists one row per
   candidate venue and can easily out-run the screen. It is not a My Places bug: the same
   shell is shared by every dialog on all five sites, and PacklistPRO, paulmendelson.com,
   qFIT and smarterjuicing.com had NO cap at any width at all.
   🔑 Four separate modals had already been patched one at a time for exactly this
   (.share-box below, qMEET's .here-modal-box / .place-modal-box / .meetup-modal). This
   is that fix, made the default, so the fifth one does not have to be found by a user.

   ⚠ :where() ON PURPOSE - it contributes ZERO specificity, so this is a floor that every
   existing 0-1-0 rule still beats. That matters here because styles_shared.css loads
   AFTER each site's Content/styles.css (see Bundle.config), so a normal `.modal-box`
   selector would have SILENTLY OVERRIDDEN all four of those hand-tuned caps - including
   .meetup-modal's deliberate 85vh, which exists to keep the backdrop visibly clickable,
   and qMEET's tighter phone rule. With :where() they all keep winning and this only
   fills the gap where nothing was set.

   2rem = the overlay's own 1rem top+bottom padding, so a capped box exactly fills the
   space the overlay leaves it and the overlay itself never needs to scroll. Making the
   BOX the scroll container (rather than the overlay) is the established pattern here -
   it keeps the backdrop tap-to-close target on screen, and it is what the existing
   `position:sticky; bottom:0` modal footers (.place-modal-box, .svy-popup-box) already
   stick to. */
:where(.modal-box) {
    max-height: calc(100vh - 2rem);
    overflow-y: auto;
}
@keyframes modalFade {
    from { opacity: 0; }
    to   { opacity: 1; }
}
@keyframes modalPop {
    from { opacity: 0; transform: translateY(8px) scale(0.97); }
    to   { opacity: 1; transform: translateY(0)   scale(1); }
}

.modal-title {
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    margin: 0 0 0.75rem 0;
}

.modal-footer {
    display: flex;
    gap: 0.75rem;
    margin-top: 1.25rem;
    justify-content: flex-end;
    flex-wrap: wrap;
}

/* ── 19. Breadcrumbs ──────────────────────────────────────── */
.breadcrumb {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    align-items: center;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    list-style: none;
    padding: 0;
    margin: 0 0 0.75rem 0;
}
.breadcrumb-item + .breadcrumb-item::before {
    content: "›";
    margin-right: 0.3rem;
    color: var(--color-text-light);
    font-size: 1.05em;
    line-height: 1;
}
.breadcrumb-item a { color: var(--color-link); text-decoration: none; }
.breadcrumb-item a:hover { text-decoration: underline; text-underline-offset: 2px; }
.breadcrumb-item.active { color: var(--color-text); font-weight: var(--font-weight-medium); }

/* ── 20. Tip-card structural helpers ──────────────────────── */
/* Used alongside .tip-card to position the × close button, hold the ⓘ trigger,
   and clear the float. The .tip-card itself is position:relative so .tips-close
   can be absolutely positioned inside. */
.tips-close {
    position: absolute;
    top: 0.5rem;
    right: 0.75rem;
}

/* TipsPanel.ascx renders the Ⓘ trigger BEFORE the page header on most pages.
   A plain float:right left the icon on its own line above the title. Anchor
   the trigger absolutely to the upper-right of <main class="page-wrapper">
   so it always sits in the upper-right corner of the title row. */
main.page-wrapper { position: relative; }
.tips-trigger-wrap {
    float: none;
    position: absolute;
    top: 1rem;
    right: 1rem;
    z-index: 5;
    margin: 0;
}
@media (min-width: 768px) {
    .tips-trigger-wrap { top: 1.5rem; right: 1.5rem; }
}
@media (min-width: 1200px) {
    .tips-trigger-wrap { top: 2rem; right: 1.5rem; }
}
.tips-clear { display: none; }

/* Reserve right-side space so a long page title can't visually overlap the
   absolutely-positioned Ⓘ trigger. Applies to .page-title (single-element
   title) as well as the .page-header pattern used elsewhere. */
.tips-trigger-wrap ~ .page-title,
.tips-trigger-wrap ~ .page-header,
.tips-trigger-wrap ~ * .page-title,
.tips-trigger-wrap ~ * .page-header {
    padding-right: 3rem;
}

/* ── 21. Form layout helpers ──────────────────────────────── */
.form-group {
    margin-bottom: 1rem;
}
.form-group-flush { margin-bottom: 0; }
.form-group .input-label,
.form-group .label { margin-bottom: 0.25rem; }
.form-group .textbox { width: 100%; }
@media (min-width: 768px) {
    .form-group .textbox { max-width: 480px; }
    /* A .form-group .textbox is capped at 480px on desktop, but a wrapping
       .input-clearable stretches to the full form-group width — leaving its
       absolutely-positioned × clear button floating to the RIGHT of the (narrower)
       textbox instead of inside it. Cap the wrapper to match so the × sits in the
       field. Child combinator on purpose: custom search bars that nest
       .input-clearable deeper (e.g. .wx-search-row > .input-clearable) manage
       their own width and must NOT be capped here. */
    .form-group > .input-clearable { max-width: 480px; }
    /* IDENTICAL BUG, IDENTICAL FIX, for the 👁 show-password button (owner, 2026-08-14,
       reported on qMEET UpdateCreds and confirmed to affect all five sites — every
       Login / Join4 / ResetPassword / UpdateCreds puts .password-wrapper directly
       inside a .form-group). .password-toggle is position:absolute anchored to
       .password-wrapper, so once the wrapper grew past the 480px the INPUT is capped
       at, the eye rendered outside the field it belongs to. The companion
       `.password-wrapper .textbox { max-width: none }` below makes the input fill the
       wrapper, so the two edges agree at every width and at every nesting depth. */
    .form-group > .password-wrapper { max-width: 480px; }
    /* SAME BUG, THIRD SURFACE (owner, 2026-08-20, reported on PacklistPRO EditTrip and
       then swept across all five sites). The "0 / 2000" character counter under a field
       is a plain block <p>/<div>, so it stretches to the FULL .form-group width while
       the input beside it stops at 480px — and its `text-align: right` therefore parked
       it against the CARD's right edge. Measured on prod at a 1360px viewport: the
       EditTrip counter's right edge was 1234px, the textarea's was 596px, 639px apart.
       Capping the counter to the same 480px makes the two right edges agree at every
       width, exactly as .input-clearable and .password-wrapper above.

       ⚠ :has() ON PURPOSE — a BLANKET cap would BREAK the counters that are already
       correct. Not every field in a .form-group is capped: qMEET MyProfile's About Me
       opts out via .textbox-uncapped, and a .textarea / .dropdown was never in the
       480px rule to begin with (qFIT EmailTest's Body, qFIT EditRoutines, qMEET
       GroupDetails' join reason). Those fields run full width and their counters
       already line up with them; capping the counter alone would pull it 600px+ to
       the LEFT of its own field. So gate on "this group holds a field the 480px cap
       actually reaches" and the counter follows whatever its field does.
       Below 768px neither one is capped, so this belongs in the media query only. */
    .form-group:has(.textbox:not(.textbox-uncapped)) > .char-counter { max-width: 480px; }
    /* FOURTH SURFACE, same fix (owner, 2026-10-08, My Profile on all five sites): the
       "Why?" link ends .input-label-row, a full-width flex row, so it sat against the
       card's right edge while the textbox under it stopped at 480px. Same :has() gate as
       the counter: a group holding only a .dropdown (State, Gender) runs full width and
       its Why? already lines up with it. */
    .form-group:has(.textbox:not(.textbox-uncapped)) > .input-label-row { max-width: 480px; }
}

.form-row {
    display: flex;
    flex-wrap: wrap;
    column-gap: 1rem;
    row-gap: 0.5rem;
    margin-bottom: 1rem;
}
.form-row .form-group {
    flex: 1 1 100%;
    margin-bottom: 0;
}
@media (min-width: 640px) {
    .form-row .form-group { flex: 1 1 calc(50% - 0.5rem); }
}

.form-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    margin-top: 0.25rem;
    align-items: center;
}
.form-actions-centered { justify-content: center; }

/* ── Action pairs: Save/Add right, Close/Cancel/Delete left ─────────────────
   Owner, 2026-08-20: where a popup or panel puts a Save/Add button and a
   Close/Cancel/Delete button ON THE SAME LINE, the Save/Add one belongs on the
   RIGHT (easier to reach with a thumb) and the other on the LEFT.

   The two attributes are written by Shared/site-core.js (installActionOrder) —
   read the block above aoApplyRow for what does and does not qualify. Nothing
   here selects a class name, so this reaches every action row on all five sites,
   including the ones built in JavaScript after load, with no markup edits.

   `margin-right: auto` is what right-ALIGNS the pair rather than merely swapping
   them: the left button eats the whole gap. An auto margin beats the container's
   own `justify-content`, so this also works inside .form-actions-centered — and
   it works whether the row wraps or not, because a 2-item row that fits on one
   line is the only case site-core.js ever tags.

   Selectors are `[attr] > [attr]` (0,2,0), so no site sheet needs to know about
   this and no !important is involved. To opt a row out, put
   data-no-action-order on it — site-core.js then never tags it at all. */
[data-action-pair="1"] > [data-action-role="secondary"] { order: 1; margin-right: auto; }
[data-action-pair="1"] > [data-action-role="primary"]   { order: 2; }

/* ── VerifyDevice: narrow card + oversized one-time-code entry field.
   Promoted from qMEET Content/styles.css to shared 2026-08-12: the other four
   sites carried the same two declarations as inline style= attributes on
   VerifyDevice.aspx, so the sizing now lives in one place for all five. --- */
.verify-card { max-width: 480px; }
.verify-code { font-size: 2em; height: 2em; }

/* ── ImpersonateUser (admin): result rows + single-line "find a user" box.
   Consolidated here 2026-08-12. qMEET had these in its own Content/styles.css
   while the other four repeated them in a page-level <style> block on
   ImpersonateUser.aspx; the four inline copies had already drifted (PacklistPRO
   and paulmendelson.com were missing the input-height fix, and qMEET's
   separator referenced a --border-color token that is not defined anywhere, so
   it always fell back to a flat gray instead of the theme border).
   The search-row override is scoped to .imp-picker so the shared .search-row,
   which many other pages use, is left alone. --- */
.imp-card { display: flex; align-items: center; justify-content: space-between; gap: 1rem;
            padding: .6rem .25rem; border-bottom: 1px solid var(--color-border); }
.imp-card:last-child { border-bottom: 0; }
.imp-card-main { min-width: 0; }
.imp-card-action { flex: 0 0 auto; }
.imp-picker .search-row { align-items: center; }
.imp-picker .search-row #txtSearch { flex: 1 1 240px; min-width: 200px;
            height: var(--input-height, 2.5rem); min-height: 0; }

/* ── Quiet Hours window (DoNotDisturb.ascx) ────────────────────
   Keep the From + Until label/dropdown pairs together on one line — two short
   half-hour dropdowns always fit. Wraps the second pair below only on a very
   narrow viewport. Shared across PacklistPRO / qMeet / qFIT. */
.dnd-window-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    column-gap: 1.25rem;
    row-gap: 0.5rem;
    margin-bottom: 1rem;
}
.dnd-window-row .dnd-window-field {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
}
.dnd-window-row .input-label {
    margin-bottom: 0;       /* override the stacked-label bottom margin for inline use */
    white-space: nowrap;
}
.dnd-window-row .dropdown {
    width: 9rem;            /* fits "12:00 AM" + chevron; stable width as the value changes */
}

/* ── Donate page ───────────────────────────────────────────────
   Payment-method row: a round method icon on the left, a wrappable
   name + URL in the middle, and the action buttons (Donate + Copy
   link) on the right. Stacks vertically on narrow screens so the
   buttons stay full-width and tappable. Shared across PacklistPRO /
   qMeet / qFIT Donate pages. The icon / name / url / actions /
   support-list sub-parts were promoted here from PacklistPRO so every
   site renders the same donate layout from the shared design system. */
.donate-method {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    padding: 0.5rem 0;
}
.donate-method + .donate-method {
    border-top: 1px solid var(--color-border);
    margin-top: 0.75rem;
    padding-top: 1rem;
}
.donate-method-icon {
    flex: 0 0 2.5rem;
    width: 2.5rem;
    height: 2.5rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--color-accent-bg, var(--color-info-bg));
    color: var(--color-accent);
    font-size: 1.25rem;
    line-height: 1;
    font-weight: var(--font-weight-medium, 500);
}
.donate-method-body { flex: 1 1 14rem; min-width: 0; word-break: break-word; }
.donate-method-name { margin: 0; font-weight: var(--font-weight-medium, 500); }
.donate-method-url {
    display: block;
    margin-top: 0.15rem;
    word-break: break-all;
    overflow-wrap: anywhere;
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}
.donate-method-actions {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
    margin-left: auto;
}
.donate-method-actions .button { white-space: nowrap; }
.donate-method .button { flex: 0 0 auto; }
.donate-support-list { margin: 0.5rem 0 0 1.25rem; padding: 0; }
.donate-support-list li { margin: 0.15rem 0; }
@media (max-width: 575px) {
    .donate-method-actions { width: 100%; margin-left: 0; }
    .donate-method-actions .button { flex: 1 1 auto; }
}
@media (max-width: 480px) {
    .donate-method { gap: 0.5rem; }
    .donate-method-body { flex: 1 1 100%; }
}

/* Suggested-amount picker (Donate pages) — shared so all sites match.
   THEME-AWARE: pills read --color-bg / --color-text / --color-border so they
   stay readable in dark mode. (An earlier qFIT-local version used a token that
   doesn't exist — var(--color-surface-2,…) — and fell back to a hard-coded
   near-white #f3f4f6, giving light text on a white pill in dark mode.)
   Selected pill = accent fill + white text. */
.donate-amounts-card .donate-amount-fieldset { border: 0; padding: 0; margin: 0; }
.donate-amount-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: stretch;
    margin-top: 0.4rem;
}
.donate-amount-pill {
    appearance: none;
    -webkit-appearance: none;
    background: var(--color-bg);
    color: var(--color-text);
    border: 1px solid var(--color-border);
    border-radius: 999px;
    padding: 0.5rem 1.1rem;
    font-size: 1rem;
    font-weight: var(--font-weight-bold, 600);
    cursor: pointer;
    min-width: 64px;
    transition: background-color .15s ease, border-color .15s ease, color .15s ease, transform .05s ease;
}
.donate-amount-pill:hover { border-color: var(--color-accent); }
.donate-amount-pill:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; }
.donate-amount-pill:active { transform: translateY(1px); }
.donate-amount-pill.selected,
.donate-amount-pill[aria-checked="true"] {
    background: var(--color-accent);
    border-color: var(--color-accent);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
}
/* "Other Amount": a normal labeled box UNDER the chips (owner, 2026-10-09, all five Donate
   pages). It was a fifth pill holding a dollar sign and a small borderless input
   (.donate-amount-custom-label / .donate-amount-custom, both removed with it), with "Other"
   as placeholder text only. The input keeps its id (donateAmountCustom), which is all each
   page's script looks for. */
.donate-other { margin-top: 0.9rem; }
.donate-other-field {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
.donate-other-sign { font-weight: var(--font-weight-bold, 600); }
.donate-other-field > input.donate-other-input { width: 9rem; max-width: 100%; }
/* The payment addresses are no longer shown (each <code class="donate-method-url"> is
   `hidden`: it was a raw web address in a gray box and put a personal name on the page; it
   stays in the markup because Copy Link copies its text). So the body holds the method's
   name and nothing else, and the full-row basis it gets on a phone further up, made for a
   name over a long address, left the round icon alone on a line. A small basis keeps icon
   and name side by side at every width. Two classes, to beat that rule and each site's own
   one-class .donate-method-body. */
.donate-method > .donate-method-body { flex: 1 1 6rem; }
/* Amount-aware "Donate via" CTA sits in .donate-method-actions next to Copy link. */
.donate-cta { min-width: 12.5rem; }
@media (max-width: 575px) {
    .donate-amount-pill { flex: 1 1 calc(50% - 0.5rem); min-width: 0; }
    .donate-cta { min-width: 0; }
}

/* ── Feedback icon after a page title (each site's Scripts/page-feedback.js) ─────
   The icon is a DRAWN speech bubble (stroke="currentColor"), so this color is its color:
   the title's text color on either theme. It was the speech-balloon emoji, which Windows
   draws white and which all but vanished on the light theme's pale page (owner,
   2026-10-09). Each site's own .pf-bulb block (size, padding, hover) sets no color, so
   this one line applies on all five whatever the load order.
   .pf-keep holds the title's LAST WORD and the icon on one line, so a title that wraps on
   a phone never leaves the icon alone on a line of its own; -loose is set by the script
   when the pair is wider than the title itself, so a very long last word can still break. */
.pf-bulb { color: var(--color-text, #222); }
.pf-bulb-icon { display: block; width: 1.15em; height: 1.15em; }
.pf-keep { white-space: nowrap; }
.pf-keep.pf-keep-loose { white-space: normal; }

/* Compact horizontal pager row: [‹ Prev]  page X of Y  [Next ›].
   Stays a single line at every breakpoint and ships tighter button
   padding than .button.small so the pager doesn't dominate the page. */
.pager-inline {
    display: flex;
    flex-wrap: nowrap;
    justify-content: center;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.25rem;
}
.pager-inline > .button {
    padding: 0.15rem 0.55rem;
    font-size: 0.8rem;
    line-height: 1.2;
}

/* ── 22. Responsive table wrapper ─────────────────────────── */
.table-responsive {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/* ── 23. Banners (full-width strip below the nav) ─────────── */
.banner-demo {
    background-color: var(--color-warning-bg);
    border-bottom: 1px solid var(--color-warning-border);
    color: var(--color-warning);
    padding: 0.55rem 1rem;
    font-size: var(--font-size-sm);
    text-align: center;
    font-weight: var(--font-weight-medium);
}
.banner-demo a {
    font-weight: var(--font-weight-bold);
    text-decoration: underline;
    text-underline-offset: 2px;
}
/* Optional leading icon kept smaller than text so it acts as a quiet marker. */
.banner-demo-icon {
    font-size: 1.05em;
    margin-right: 0.15rem;
    vertical-align: -1px;
}

/* ── Keep the banner's text out from under the floating "?" pill ───────────────
   🔴 SAME BUG §23a already fixes for .banner-simplemode-inner, on the OTHER top-of-document
   bar — it was never applied here. .tutorial-help-pill is position:fixed at top:0.5rem with
   z-index 1502 and .banner-demo renders ABOVE the sticky .site-nav, so at scroll-top the pill
   lands on this bar's own text.
   MEASURED on prod PacklistPRO 2026-08-28, anonymous, 1610px viewport: the banner's text ran
   to x=1316.9 while #tutorialHelpPill occupied x=1289.6-1320.0 at y=8-38.4 and the text sat at
   y=9.5-29.8 — the final word of "...Login if you already have one." was completely covered.
   That sentence is the demo visitor's sign-in route, so this is the worst line on the site to
   lose. MSBuild, aspnet_compiler and a served-HTML grep all pass; only measuring the rendered
   box catches it.

   WHY A FLOAT AND NOT padding-right (which is what .banner-simplemode-inner uses): that bar is
   `display:flex; justify-content:space-between`, so padding shortens it once and costs nothing.
   THIS bar is centerd, wrapping prose — a padding big enough to clear the pill would be taken
   off EVERY line and out of BOTH sides to keep the centring honest, which on a 360px phone is
   about half the bar. An empty right float is taken out of flow, shortens only the line boxes
   the pill actually overlaps, and leaves every line below it full width.
   ▶ ::before, NOT ::after — a float is placed on the line where it appears in source order, so
     an ::after (last child) would reserve the corner of the LAST line, not the first.
   Width tracks --pill-cluster-right, the same custom property the pill anchors itself with, so
   the gap follows the pill per site instead of being a guess (qMEET sets it for its three-pill
   cluster; the other four fall back). 2.4rem = the pill's own min-width (1.9rem) plus room. */
.banner-demo::before,
.banner-saved-copy::before {
    content: "";
    float: right;
    width: calc(var(--pill-cluster-right, 1rem) + 2.4rem);
    height: 1.9rem;
}
/* The corner is TWO pills wide wherever the light/dark .theme-pill renders (admins + trusted
   users), so the reserved gap doubles — same :has() test, and the same reasoning, as the rule
   §23a carries for .banner-simplemode-inner. A browser without :has() falls back to the
   one-pill gap, i.e. to today's behavior, not to something broken. */
body:has(.theme-pill) .banner-demo::before,
body:has(.theme-pill) .banner-saved-copy::before {
    width: calc(var(--pill-cluster-right, 1rem) + 4.8rem);
}
/* ⚠ ONE case is knowingly left short: qMEET pushes its ❓ further left again with its own
   `--pill-admin-slot` when the admin-review pill is up (qMEET/Content/styles.css), and that
   slot is not added here. It affects admins only, on the impersonation banner rather than the
   demo one, and the reservation above still clears more than the zero this rule replaced — so
   it is a smaller gap, never a regression. Add `+ var(--pill-admin-slot, 0rem)` to both widths
   if that corner ever needs to be exact; the fallback makes it a no-op on the other four sites. */
/* Below 992px the shared .nav-toggle (☰) appears, and the pill's own rule moves it left to
   clear it (`right: var(--pill-cluster-right, 3.75rem)`). The reservation has to move with it
   or the banner slides straight back under the pill on exactly the widths where the bar is
   already wrapping. Fallback kept in lockstep with that rule. */
@media (max-width: 991px) {
    .banner-demo::before,
    .banner-saved-copy::before {
        width: calc(var(--pill-cluster-right, 3.75rem) + 2.4rem);
    }
    body:has(.theme-pill) .banner-demo::before,
    body:has(.theme-pill) .banner-saved-copy::before {
        width: calc(var(--pill-cluster-right, 3.75rem) + 4.8rem);
    }
}

/* Narrow screens: drop the horizontal padding so the banner's two links don't wrap
   to four lines on a phone.

   ⚠ THIS RULE HAS TO LIVE HERE, NOT IN A SITE'S Content/styles.css (2026-08-28).
   Every site's bundle is [bootstrap, Content/styles.css, Shared/styles_shared.css],
   so the shared sheet loads LAST. A `.banner-demo` override in a site sheet is at
   equal specificity (0,1,0) and a media query adds none, so `.banner-demo`'s
   unconditional `padding: 0.55rem 1rem` above simply wins and the override is dead.
   PacklistPRO had exactly that dead rule in Content/styles.css until this was added.
   All three sites use .banner-demo for the auto-demo banner as of 2026-08-28 (qMEET
   was .banner-anon, which rendered blue while qFIT and PacklistPRO rendered amber). */
@media (max-width: 480px) {
    .banner-demo {
        padding: 0.5rem 0.6rem;
        font-size: var(--font-size-xs);
        line-height: 1.4;
    }
}

/* ── 23a. Simple-mode notice (CROSS-SITE) ──────────────────────
   "You are in Simple mode - some features are hidden." Rendered site-wide from each
   master page's ConfigureSimpleModeBar when SiteMode = 1, for a signed-in member who
   has not dismissed it. Without it, every feature Simple hides just looks absent.

   LIVES HERE, NOT IN A SITE'S styles.css, ON PURPOSE (2026-08-04): the owner asked for
   ONE bar that is identical on qMEET, qFIT and PacklistPRO. It is deliberately
   self-contained - it does NOT reuse qMEET's .banner-events-* inner classes, which is
   what the original qMEET-only version did, because those classes exist ONLY in
   qMEET/Content/styles.css and would have rendered an unstyled bar on the other two.
   All three sites load this file after their own styles.css, so these rules win.

   Teal, so that on qMEET - the only one of the three that stacks several bars - it stays
   distinct from the gray chat bar, the blue events bar and the purple invites bar.
   White-on-teal reads correctly in both light and dark themes, so it needs no
   prefers-color-scheme variant. No "restore" chip: dismissal is for good (1-year cookie),
   and switching Site Mode always brings it back. ── */
.banner-simplemode {
    background-color: #0f766e;
    color: #fff;
    padding: 0.4rem 0.5rem 0.4rem 0.35rem;
    font-size: var(--font-size-sm);
}
.banner-simplemode-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    /* 🔴 Reserve the top-right corner for the floating "?" help pill.
       .tutorial-help-pill is position:fixed at top:0.5rem with z-index 1502, and this bar sits
       at the very top of the document - so at scroll-top the pill lands exactly on top of this
       bar's x. MEASURED in Chrome on PacklistPRO 2026-08-04 before this rule existed:
       elementFromPoint() at the center of the x returned #tutorialHelpPill, i.e. the dismiss
       button was completely unclickable. MSBuild, aspnet_compiler and a served-HTML grep all
       passed - only looking at the rendered page caught it.
       Reserved via the SAME custom property the pill anchors itself with, so the gap tracks the
       pill per site instead of being a guess: qMEET sets --pill-cluster-right in its own :root
       for its three-pill cluster, while qFIT and PacklistPRO fall back to 1rem. The 2.4rem is
       the pill's own min-width (1.9rem) plus breathing room. */
    padding-right: calc(var(--pill-cluster-right, 1rem) + 2.4rem);
}
/* Added 2026-08-19: the corner is now TWO pills wide wherever the light/dark .theme-pill
   renders (admins + trusted users), so the reserved gap has to double or the banner's x moves
   back under a floating button — the exact failure the rule above was written for. Scoped with
   :has() rather than applied unconditionally, because for everyone else the corner really is
   one pill wide and the extra 2.4rem would just be wasted banner width. A browser without
   :has() ignores this rule and falls back to the one-pill gap, i.e. to the pre-2026-08-19
   behavior, not to something broken. */
body:has(.theme-pill) .banner-simplemode-inner {
    padding-right: calc(var(--pill-cluster-right, 1rem) + 4.8rem);
}
/* Pin the body color: some sites style bare text inside banners, and this bar has to
   stay legible on teal regardless of which site it renders on. */
.banner-simplemode-body { color: #fff; }
.banner-simplemode-icon {
    font-size: 1.05em;
    margin-right: 0.25rem;
    vertical-align: -1px;
}
/* "Show everything" - the one-click switch to Standard. An inverted pill so it reads as
   the action in a bar that is otherwise plain text. Every state pinned, or a site's own
   :visited / :hover link rules would repaint it mid-bar. */
.banner-simplemode-cta,
.banner-simplemode-cta:link,
.banner-simplemode-cta:visited,
.banner-simplemode-cta:hover,
.banner-simplemode-cta:focus,
.banner-simplemode-cta:active {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.1rem 0.55rem;
    border-radius: 999px;
    background-color: #fff;
    color: #0f766e;
    font-weight: var(--font-weight-medium);
    text-decoration: none;
    white-space: nowrap;
}
.banner-simplemode-cta:hover,
.banner-simplemode-cta:focus { background-color: #e6fffa; }
/* Secondary link through to the setting itself, for the same reason the CTA pins its
   colors. */
.banner-simplemode-link,
.banner-simplemode-link:link,
.banner-simplemode-link:visited,
.banner-simplemode-link:hover,
.banner-simplemode-link:focus,
.banner-simplemode-link:active {
    margin-left: 0.55rem;
    color: #fff;
    text-decoration: underline;
    text-underline-offset: 2px;
    white-space: nowrap;
}
/* Dismiss. Sized to the 24px minimum tap target rather than to the glyph. */
.banner-simplemode-x {
    flex: 0 0 auto;
    min-width: 24px;
    min-height: 24px;
    padding: 0 0.25rem;
    border: 0;
    background: transparent;
    color: #fff;
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
}
.banner-simplemode-x:hover,
.banner-simplemode-x:focus { color: #e6fffa; }

/* Deep-link highlight for Preferences > Site Mode. The notice links to
   /Preferences#sitemode; the fragment does the scrolling, and this ring is what tells the
   member WHICH of the ~12 form groups they were just sent to. Without it the page scrolls
   and leaves them hunting. Every site's Preferences.aspx carries id="sitemode" on that
   form-group; keep the three in step. */
#sitemode:target {
    border-radius: 4px;
    box-shadow: 0 0 0 2px var(--color-accent);
    padding: 0.35rem;
}

/* ── 23b. Persistent demo state ────────────────────────────────
   .banner-demo above renders ABOVE the sticky .site-nav in both masters, so it
   scrolls out of view after the first screenful. That is fine on a page whose
   only controls are chrome (a tutorial overlay, a client-side filter) but wrong
   on a page that offers a Save an anonymous visitor cannot complete: by the time
   they reach the button, the only warning they were given is off-screen.

   .demo-strip is the persistent form — pinned to the bottom edge, always in view,
   and deliberately NOT dismissible (the constraint it describes does not go away
   when the notice is closed). Pinned to the BOTTOM rather than the top because
   .site-nav already owns `position:sticky; top:0` and two stickies at top:0 in one
   scroll container overlap.

   Paired with .demo-action-badge, which site-core.js stamps next to each primary
   action so the warning also exists at the point of decision. Both are driven by
   `<body data-demo-state="persistent">`, rendered by each site's master. */
.demo-strip {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 9996;              /* the established bottom-furniture band; below the
                                   toast stack (9999) so a toast is never obscured */
    background-color: var(--color-warning-bg);
    border-top: 2px solid var(--color-warning-border);
    color: var(--color-warning);
    padding: 0.5rem 1rem;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    text-align: center;
    box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.12);
}
.demo-strip a {
    font-weight: var(--font-weight-bold);
    text-decoration: underline;
    text-underline-offset: 2px;
    color: inherit;
}

/* Lift the two bottom-right fixed buttons clear of the strip.
   ⚠ The install pill's offset MUST reach .pwa-install-wrap where that wrapper exists:
   inside it the button is position:static, so a `bottom` on the button alone is inert
   and the pill would sit under the strip. It is delivered as an INHERITED CUSTOM
   PROPERTY on <body> rather than as a `body.has-demo-strip .pwa-install-wrap` rule,
   because that would be a second place where the pill's resting offset is written and
   the two would have to keep winning a specificity argument against each other every
   time either moved. A variable set on the ancestor simply inherits: whoever sets
   --pwa-install-bottom last in the cascade wins, and there is only one rule that ever
   reads it. The bare-button selector stays for the sister sites, which append a lone
   .pwa-install-btn and have no wrapper. */
body.has-demo-strip .back-to-top     { bottom: 4rem; }
/* The "On this page" button sits in the same row as .back-to-top; it used to be left behind
   the strip (2026-10-09). Two classes + the element, so it also beats qMEET's `body .toc-btn`. */
body.has-demo-strip .toc-btn         { bottom: 4rem; }
body.has-demo-strip .pwa-install-btn { bottom: 7.25rem; }
body.has-demo-strip                  { --pwa-install-bottom: 7.25rem; }

/* Reserve the strip's height so it never covers the end of the page (footer, last
   form action).
   ⚠ This is a real in-flow SPACER ELEMENT, not `body { padding-bottom }`, because
   padding on <body> is inert on these pages: body carries `overflow: hidden auto`
   and is not the scroll container, so a measured `padding-bottom: 52px` — set from
   the stylesheet OR inline with !important — changed neither the computed value nor
   body.scrollHeight. A spacer in normal flow inside the content wrapper reserves the
   space regardless of which ancestor scrolls. site-core.js appends it. */
.demo-strip-spacer {
    height: 3.25rem;
    flex: 0 0 auto;     /* survives a flex-column wrapper, where height alone can collapse */
}

/* The at-the-point-of-action marker. Inline-flex so it sits on the button's line;
   `.button + &` spacing is handled by the gap in .form-actions where present. */
.demo-action-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    margin-left: 0.5rem;
    padding: 0.15rem 0.5rem;
    border: 1px solid var(--color-warning-border);
    border-radius: 999px;
    background-color: var(--color-warning-bg);
    color: var(--color-warning);
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: var(--font-weight-medium);
    line-height: 1.4;
    white-space: nowrap;
    vertical-align: middle;
}

/* Dark mode: --color-warning-bg / -border ARE redeclared for dark, but
   --color-warning itself is NOT (it stays #e65100, ~3:1 on the dark surface),
   which is why .banner-demo carries an explicit dark color above. Same here. */
[data-theme="dark"] .demo-strip,
[data-theme="dark"] .demo-action-badge { color: #ffa726; }

.banner-offline {
    background-color: var(--color-danger-bg);
    border-bottom: 1px solid var(--color-danger-border);
    color: var(--color-danger);
    padding: 0.55rem 1rem;
    font-size: var(--font-size-sm);
    text-align: center;
    font-weight: var(--font-weight-medium);
    display: none;
    animation: bannerSlideIn 0.22s var(--ease-out-quint);
}
body.offline .banner-offline { display: block; }

/* "Work offline →" inside the offline banner (2026-09-20, all five sites). The banner used to
   state the problem and stop there; this is the way out of it — offline.html lists every page
   pinned for offline use. Reported on PacklistPRO: stranded on the login page with no route to
   the pages that would still have worked.

   🔑 `a.` PREFIX ON BOTH RULES, NOT A BARE CLASS. A bare `.banner-offline-link` (0,1,0) loses
   to this sheet's own `a:hover` (0,1,1), so the link would flip to the site accent on hover,
   mid-red-banner. Same trap already documented for PLP's .plp-sum-link.
   ⚠ PacklistPRO also carries an identical rule in its own Content/styles.css (added a day
   earlier, before this was generalized). This sheet loads LAST there, so this one wins; they
   are byte-equivalent in effect, but if you change one, change both or delete the local copy. */
a.banner-offline-link {
    color: inherit;
    text-decoration: underline;
    font-weight: var(--font-weight-semibold, 600);
    margin-left: 0.5rem;
    white-space: nowrap;
}
a.banner-offline-link:hover,
a.banner-offline-link:focus-visible {
    color: inherit;
    text-decoration: none;
}

/* "You're looking at a saved copy of this page" (2026-09-29, all five sites). Built by each
   site's site.js (_showSavedCopyBar) whenever the service worker answered a page from its
   cache because the network fetch failed — owner, on spotty cell service, got a cached
   PacklistPRO Expenses page with nothing on screen to say so. Amber, not red: it is a fact
   about the PAGE (it may be out of date), not a verdict on the connection — the red
   .banner-offline above still answers that separately, and this bar sits directly under it.
   Block + text-align:center rather than flex, so the float that keeps the corner clear of the
   "?" help pill (the .banner-demo::before rule below, which this class shares) still works —
   a float inside a flex container is ignored. Dark text color: see the [data-theme="dark"]
   list near the top (--color-warning is not redeclared for dark). */
.banner-saved-copy {
    background-color: var(--color-warning-bg);
    border-bottom: 1px solid var(--color-warning-border);
    color: var(--color-warning);
    padding: 0.45rem 1rem;
    font-size: var(--font-size-sm);
    line-height: 1.45;
    text-align: center;
    font-weight: var(--font-weight-medium);
    animation: bannerSlideIn 0.22s var(--ease-out-quint);
}
.banner-saved-copy-btn {
    display: inline-flex;
    align-items: center;
    min-height: 2rem;
    margin-left: 0.5rem;
    padding: 0.15rem 0.75rem;
    border: 1px solid currentColor;
    border-radius: 999px;
    background: transparent;
    color: inherit;
    font: inherit;
    font-weight: var(--font-weight-semibold, 600);
    white-space: nowrap;
    vertical-align: middle;
    cursor: pointer;
}
.banner-saved-copy-btn:hover,
.banner-saved-copy-btn:focus-visible {
    text-decoration: underline;
}
.banner-saved-copy-close {
    min-width: 2rem;
    min-height: 2rem;
    margin-left: 0.25rem;
    padding: 0 0.4rem;
    border: 0;
    background: transparent;
    color: inherit;
    font: inherit;
    font-size: 1.25em;
    line-height: 1;
    vertical-align: middle;
    cursor: pointer;
}
@media (max-width: 480px) {
    .banner-saved-copy {
        padding: 0.45rem 0.6rem;
        font-size: var(--font-size-xs);
    }
}
@media print {
    .banner-saved-copy { display: none; }
}

@keyframes bannerSlideIn {
    from { transform: translateY(-100%); }
    to   { transform: translateY(0); }
}

/* ── 24. ASP.NET validator / inline field error ───────────── */
/* A small red "!" bullet precedes the message so it reads as an error even on
   calm pages. inline-flex keeps the bullet aligned with the wrapped message.
   🔴 The space after the bullet is a MARGIN on it, not a flex `gap` (2026-10-09). An
   ASP.NET validator shown by the page's own script is given style="display:inline", which
   is not a flex box, so the gap did nothing there and the bullet touched the first letter
   ("!Please choose ..." on every Contact Us form). A margin holds in either display. */
.field-validation-error,
.error-message {
    color: var(--color-danger);
    font-size: var(--font-size-sm);
    display: inline-flex;
    align-items: center;
    margin-top: 0.2rem;
}
.field-validation-error::before,
.error-message::before {
    content: "!";
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.05em;
    height: 1.05em;
    flex-shrink: 0;
    margin-right: 0.35rem;   /* the space before the message: see the note above */
    background: var(--color-danger);
    color: #ffffff;
    border-radius: 50%;
    font-size: 0.7em;
    font-weight: 700;
    line-height: 1;
}

/* ── Clearable search input ────────────────────────────────────────
   Wrapper + clear button for search/filter fields. */
.input-clearable {
    position: relative;
    display: flex;
    align-items: center;
}
/* Scoped to `input`, not `.textbox`: several pages put a bespoke class on the
   field (NHT Gallery's .tile-filter, etc.). When these rules were .textbox-only
   those fields reserved no room for the × (so it sat on top of the text) and
   kept the native WebKit cancel button, giving two ×'s side by side. */
.input-clearable input { padding-right: 2rem; }
/* ── MAIN LIST SEARCH BOX: one size on PLP Packlist + Tasklist and qFIT Checklist (owner,
   2026-09-14: "make the font size in the search text box bigger ... they should all be the
   same font size"). ONE token, so the three cannot drift:
     • PLP: #tbSearch inside .plp-search-input — this rule (0,2,1) beats .textbox (0,1,0).
     • qFIT: checklist2-page.css `.cl2-search #txtSearch` reads this same token; it has to set
       it there, because checklist-page.css's `#txtSearch { font-size: 20px }` is an ID rule.
   rem, so it follows the member's font-size preference (html.font-small/medium/large).
   1.375rem = 22px at the default size (owner, 2026-09-14: "let's try 22px"; it was 20px that
   morning). Stays above the 16px iOS zoom floor even at font-small (19.25px). */
:root { --list-search-font-size: 1.375rem; }
.plp-search-input > input.textbox { font-size: var(--list-search-font-size, 1.375rem); }
.input-clearable input::-webkit-search-cancel-button,
.input-clearable input::-webkit-search-decoration {
    -webkit-appearance: none;
    appearance: none;
}
.input-clear-btn {
    position: absolute;
    right: 0.5rem;
    background: none;
    border: none;
    cursor: pointer;
    color: var(--color-text-light, #9aa0a8);
    font-size: 1.1rem;
    line-height: 1;
    padding: 0.25rem;
    border-radius: var(--border-radius-sm, 6px);
    transition: color var(--transition-fast, 0.15s ease),
                background-color var(--transition-fast, 0.15s ease);
    /* ALWAYS visible — the × is a permanent affordance, not a state indicator.
       It used to be display:none until the box had a value, which (a) made the
       control appear/disappear as you typed and (b) failed outright on inputs
       with no placeholder attribute, since the reveal rule keyed off
       :not(:placeholder-shown). Clicking it on an empty box is a harmless no-op. */
    display: block;
}
/* The hover fill is a surface-relative wash, NOT --color-primary-light. That
   token is picked elsewhere precisely because it flips per theme, but it is an
   OPAQUE value chosen against the page background, and this × is the one place
   that sits INSIDE a .textbox — the lightest surface in either theme. Measured:
   dark-mode input #555555 has luminance 0.091 against the token's dark #082a3d
   at 0.020, so the fill landed DARKER than the field and painted a near-black
   chip; light-mode input #e2f1fb is visually indistinguishable from the token's
   light #e0f6fe, so the hover disappeared entirely. A translucent wash
   composites against whatever is actually underneath and is correct on both.
   Same reasoning would apply to .password-toggle:hover (also in-field). */
.input-clear-btn:hover {
    color: var(--color-text, #1a1f2e);
    background-color: var(--color-hover-wash, rgba(0, 0, 0, 0.10));
}
.input-clear-btn:focus {
    outline: 2px solid var(--color-border-focus, var(--color-primary, #0090C8));
    outline-offset: 2px;
}
/* .is-visible is now a no-op (the button is always shown); the rule is kept so
   any page still adding that class doesn't break. The old companion rule
   `.textbox:not(:placeholder-shown) ~ .input-clear-btn` was removed with the
   always-visible change above. */
.input-clear-btn.is-visible {
    display: block;
}

/* ── Skip-to-content link (WCAG 2.4.1) ────────────────────── */
.skip-link {
    position: absolute;
    top: -100px;
    left: 0.5rem;
    background-color: var(--color-accent, #00B0F0);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
    padding: 0.5rem 0.875rem;
    border-radius: var(--border-radius-sm, 6px);
    text-decoration: none;
    font-weight: var(--font-weight-bold, 600);
    z-index: calc(var(--nav-z) + 100);
    transition: top 0.15s ease;
}
.skip-link:focus,
.skip-link:focus-visible {
    top: 0.5rem;
    /* The ring sits OUTSIDE the pill (outline-offset), against the page
       background, so it stays white; only the text on the cyan changed. */
    outline: 3px solid #fff;
    outline-offset: 2px;
    color: #111;
}

/* ── Card enter animation ─────────────────────────────────── */
html[data-page-enter] .card {
    animation: cardEnter 280ms var(--ease-out-quint, cubic-bezier(0.22, 1, 0.36, 1)) both;
}
html[data-page-enter] .card:nth-child(2) { animation-delay: 40ms; }
html[data-page-enter] .card:nth-child(3) { animation-delay: 80ms; }
html[data-page-enter] .card:nth-child(4) { animation-delay: 120ms; }
html[data-page-enter] .card:nth-child(n+5) { animation-delay: 160ms; }
@keyframes cardEnter {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
    html[data-page-enter] .card { animation: none; }
}

/* ── Data table ───────────────────────────────────────────── */
.data-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--font-size-sm, 0.875rem);
}
.data-table th {
    text-align: left;
    padding: 0.65rem 0.75rem;
    border-bottom: 2px solid var(--color-border, #e0e0e0);
    color: var(--color-text-muted, #6c757d);
    font-weight: var(--font-weight-medium, 500);
    white-space: nowrap;
    text-transform: uppercase;
    font-size: 0.72rem;
    letter-spacing: 0.04em;
}
.data-table td {
    padding: 0.6rem 0.75rem;
    border-bottom: 1px solid var(--color-border, #e0e0e0);
    vertical-align: middle;
    transition: background-color var(--transition-fast);
}
.data-table tr:last-child td { border-bottom: none; }
.data-table tbody tr:nth-child(even) td { background-color: color-mix(in srgb, var(--color-bg) 50%, transparent); }
.data-table tr:hover td { background-color: var(--color-primary-light, #e0f6fe); }
.data-table-sticky thead th {
    position: sticky;
    top: var(--nav-height, 56px);
    z-index: 2;
    background: var(--color-bg-card);
}
/* Inside .table-responsive the wrapper is the scroll box, so the offset meant for the fixed
   header pinned the headings 56px down INSIDE the table, on top of its second row (qFIT
   Export Tracking History, UI review TrackingHistoryCsv-1, 2026-10-09). */
.table-responsive .data-table-sticky thead th { top: 0; }

/* ── Footer ───────────────────────────────────────────────── */
.site-footer {
    background-color: var(--color-bg-nav, #1a1a2e);
    color: rgba(255,255,255,0.6);
    font-size: var(--font-size-sm, 0.875rem);
    text-align: center;
    padding: 1.5rem 1rem;
    margin-top: 3rem;
}
.site-footer a { color: rgba(255,255,255,0.8); text-decoration: none; }
.site-footer a:hover { color: #fff; text-decoration: underline; }
/* 🛑 The same treatment for the footer's link-styled BUTTONS ("Press ? for shortcuts",
   "Back to top ↑"). Added 2026-08-23 alongside the A11Y-01 token change, and it is not
   cosmetic: the rule above is `.site-footer a` (0,1,1) and matches ANCHORS ONLY, so a
   <button class="link linklike-btn"> never picked up the footer's white and fell through
   to the generic .link color instead. That was survivable while --color-link resolved to
   the bright brand cyan (8.47:1 on this #1a1a2e chrome); it is NOT survivable now that
   light-mode links are correctly darkened to #006C96, which measures 2.91:1 here. The
   footer is dark chrome inside a LIGHT theme, so it is the one place a darker link color
   makes contrast worse rather than better - the same trap the [data-theme="dark"] block
   guards against. Matching the anchors exactly also fixes an inconsistency that predates
   this change: these two buttons never looked like the links sitting beside them. */
.site-footer button.link,
.site-footer .linklike-btn { color: rgba(255,255,255,0.8); text-decoration: none; }
.site-footer button.link:hover,
.site-footer .linklike-btn:hover { color: #fff; text-decoration: underline; }

/* WCAG 2.5.8 (AA) target size - 2026-09-02, plan row A11Y-11. #site-footer-shortcuts
   measured 19.6px tall and #site-footer-top 18px, both computed display:inline.
   min-height does NOT apply to a non-replaced INLINE element, so a bare min-height here
   would have silently done nothing - inline-flex is what makes the 24px real. That is the
   same mechanism .pf-bulb documents, and the same trap.

   🛑 SCOPED TO THE FOOTER ON PURPOSE, NOT PUT ON .linklike-btn ITSELF. That class has 27
   uses across the sites and several are INLINE IN RUNNING PROSE - qMEET Error.aspx's
   "try clearing cookies", qFIT Home.aspx's "First time here, actually? See what qFIT does".
   WCAG 2.5.8 explicitly EXCLUDES a target inline in a sentence, so those need no growing,
   and making them inline-flex would turn a multi-word label into an ATOMIC box that can no
   longer wrap mid-phrase - a layout regression in exchange for a rule that does not apply.
   The footer pair are standalone controls on their own line, which is why they are in scope
   and the prose ones are not.

   The footer NAV LINKS (About, Security & Privacy, Terms of Service, Troubleshooting,
   Contact Us, Donate) measured 18.7px and are in the same selector for the same reason and
   in the same place: they are NAVIGATION, not prose, so the inline-in-a-sentence exception
   does not cover them either. Doing both together means the footer's vertical rhythm changes
   ONCE rather than twice.

   Visual consequence is confined to the footer: each control gains ~5px of height inside a
   line already set to line-height 1.8. The other A11Y-11 shortfalls - the reminder banner
   links (a#lnkEventReminder, a#lnkToDoReminder at 21px) and the .main-card h2.heading
   collapsibles (23.4px, ONE pixel short) - are still NOT touched here: those sit in shared
   page chrome where a padding change shifts rhythm on every page of all three sites, and
   want a before/after look first. */
.site-footer .linklike-btn,
.site-footer-links a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 24px;
}

.site-footer p { margin: 0.25rem 0; }
.site-footer-links {
    text-align: center;
    line-height: 1.8;
    margin: 0 auto 0.4rem;
}
.site-footer-sep { color: rgba(255,255,255,0.35); }
.site-footer-copy { color: rgba(255,255,255,0.5); font-size: var(--font-size-xs, 0.75rem); }
.site-footer-copy a { color: rgba(255,255,255,0.65); }

/* .linklike-btn: a <button> that should visually present as an inline link
   (footer "Press ? for shortcuts" / "Back to top" on all 3 sites). Keeps
   semantic HTML (button = action, link = navigation) while preserving the
   inline-text appearance the surrounding paragraph expects. Single-class
   selector (0,1,0) so a co-applied .link class still controls color +
   text-decoration for buttons authored as class="link linklike-btn".
   (Migrated here from PacklistPRO Content/styles.css 2026-06-07.) */
.linklike-btn {
    background: transparent;
    border: 0;
    padding: 0;
    margin: 0;
    font: inherit;
    cursor: pointer;
    text-align: inherit;
    display: inline;
    line-height: inherit;
}

/* ── Page layout ──────────────────────────────────────────── */
.page-wrapper {
    max-width: 1200px;
    margin: 0 auto;
    padding: 1rem;
}
@media (min-width: 768px)  { .page-wrapper { padding: 1.5rem; } }
@media (min-width: 1200px) { .page-wrapper { padding: 2rem 1.5rem; } }
.page-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 0.75rem;
    margin-bottom: 1.25rem;
    padding-bottom: 0.65rem;
    border-bottom: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
}
.page-header-actions {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    align-items: center;
}
.page-header-title-row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
}

/* ── Empty state ──────────────────────────────────────────── */
.empty-state {
    text-align: center;
    padding: 2rem 1rem;
    color: var(--color-text-muted, #6c757d);
}
.empty-state-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 4rem;
    height: 4rem;
    margin-bottom: 0.75rem;
    background: var(--color-primary-light);
    color: var(--color-primary);
    border-radius: 50%;
    font-size: 1.75rem;
    border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
}
.empty-state-title {
    color: var(--color-text);
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    margin: 0 0 0.4rem;
}
.empty-state-text { margin-top: 0.5rem; }
.empty-state-sub {
    color: var(--color-text-muted);
    margin: 0 0 1rem;
    max-width: 32rem;
    margin-left: auto;
    margin-right: auto;
}
.empty-state-actions {
    display: flex;
    gap: 0.5rem;
    justify-content: center;
    flex-wrap: wrap;
}
.empty-state .button { margin-top: 0.75rem; }

/* ── Session expired modal ────────────────────────────────── */
#session-expired-modal .modal-box {
    text-align: center;
    padding-top: 2rem;
}
#session-expired-modal .modal-box::before {
    content: "\23F1";
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 3.25rem;
    height: 3.25rem;
    margin: 0 auto 0.75rem;
    background: var(--color-primary-light);
    color: var(--color-primary);
    border-radius: 50%;
    font-size: 1.5rem;
    border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
}
#session-expired-modal .modal-footer {
    justify-content: center;
}

/* ── Bootstrap dark-mode fix ─────────────────────────────── */
[data-theme="dark"] .modal-content {
    background-color: var(--color-bg-card);
    color: var(--color-text);
    border-color: var(--color-border);
}
[data-theme="dark"] .modal-header {
    border-bottom-color: var(--color-border);
}
[data-theme="dark"] .modal-footer {
    border-top-color: var(--color-border);
}
[data-theme="dark"] .btn-close {
    filter: invert(1) grayscale(100%) brightness(200%);
}

/* ── Password wrapper ────────────────────────────────────── */
.password-wrapper              { position: relative; display: flex; align-items: center; }
/* 🔑 max-width:none is LOAD-BEARING, not tidying. The desktop cap
   `.form-group .textbox { max-width: 480px }` is a DESCENDANT selector, so it reaches
   the input in here and stopped it short of the wrapper. .password-toggle is anchored
   to the WRAPPER, so the eye then floated outside the field (owner, 2026-08-14).
   The wrapper now owns the width; the input matches it exactly. Removing this puts the
   bug back on every Login / Join4 / ResetPassword / UpdateCreds on all five sites. */
.password-wrapper .textbox     { flex: 1; padding-right: 2.5rem; max-width: none; min-width: 0; }
.password-toggle {
    position: absolute;
    right: 0.4rem;
    background: none;
    border: none;
    cursor: pointer;
    color: var(--color-text-muted);
    font-size: 1.1rem;
    padding: 0.3rem 0.45rem;
    line-height: 1;
    min-height: 0;
    min-width: 0;
    border-radius: var(--border-radius-sm);
    transition: color var(--transition-fast), background-color var(--transition-fast);
}
.password-toggle:hover  { color: var(--color-text); background: var(--color-primary-light); }
.password-toggle:focus-visible { outline: none; box-shadow: var(--shadow-focus); color: var(--color-text); }

/* ── Caps-lock warning (shown by site.js initCapsLockWarning on password fields) ── */
.caps-lock-warning {
    display: block;
    margin-top: 0.25rem;
    font-size: var(--font-size-sm);
    color: var(--color-warning);
    font-weight: var(--font-weight-medium);
}
.caps-lock-warning[hidden] { display: none; }

/* ── Textarea sizing variants ────────────────────────────── */
.textbox-ml-xs   { min-height: 60px; }
.textbox-ml-sm   { min-height: 75px; }
.textbox-ml      { min-height: 100px; }
.textbox-ml-md   { min-height: 150px; }
.textbox-ml-lg   { min-height: 200px; }
.textbox-ml-xl   { min-height: 300px; }

/* ── Print ────────────────────────────────────────────────── */
@media print {
    .site-nav, .site-footer, .skip-link, .banner-offline, .banner-demo,
    .demo-strip, .demo-action-badge,
    .tips-trigger-wrap, .tips-panel, .tips-trigger,
    .tip-card, .tip-icon-button,
    .back-to-top, .pwa-install-btn, .pwa-install-wrap, .shortcuts-overlay, .scroll-progress-bar,
    .site-toast, .toc-btn, .toc-overlay,
    .modal-overlay, .form-actions, .toolbar-actions,
    .page-header-actions { display: none !important; }
    body { background: #fff !important; color: #000 !important; }
    body.has-demo-strip { padding-bottom: 0 !important; }   /* the strip is hidden above */
    .card, .main-card { box-shadow: none !important; border: 1px solid #ccc !important; break-inside: avoid; }
    .page-wrapper { max-width: none; padding: 0; }
    a[href]:not([href^="#"])::after {
        content: " (" attr(href) ")";
        font-size: 0.85em;
        color: #555;
    }
    .progress-track { border: 1px solid #999; }
    .progress-fill  { background: #555 !important; }
    .exp-typebar-seg { filter: grayscale(0.25) !important; }
}

/* ── Print: page numbering ─────────────────────────────────────────
   Adds "Page X of Y" to the bottom-right of every printed page so a
   multi-page packlist / event detail / fitness report can be reassembled
   if pages get separated. counter(page) and counter(pages) are CSS
   built-ins kept by the print engine. Browsers that don't yet support
   @page margin boxes (older Safari, older Firefox) will silently ignore
   this; the rest of the print layout is unaffected. Users on those
   browsers can still enable the built-in "Headers and footers" option
   in the browser's print dialog as a fallback.

   @top-* boxes are intentionally left empty so the layout doesn't
   conflict with whatever the user has set as the browser's print header.
   Margins are also left untouched here — each site's @media print block
   handles per-page chrome (hiding nav, footer, etc.). */
@page {
    @bottom-right {
        content: "Page " counter(page) " of " counter(pages);
        font-size: 9pt;
        color: #666;
        font-family: var(--font-family, sans-serif);
    }
}

/* ── 25. Dirty-form save indicator ────────────────────────────── */
[data-dirty-watch].is-dirty .button.save:not(.saving):not(.saved) {
    position: relative;
    box-shadow: var(--shadow-btn), 0 0 0 2px color-mix(in srgb, var(--color-save-btn) 40%, transparent);
}
[data-dirty-watch].is-dirty .button.save:not(.saving):not(.saved)::before {
    content: "";
    position: absolute;
    top: 4px;
    right: 4px;
    width: 8px;
    height: 8px;
    background: #fff;
    border-radius: 50%;
    box-shadow: 0 0 0 2px var(--color-save-btn);
    animation: saveDotPulse 1.5s var(--ease-in-out) infinite;
}
@keyframes saveDotPulse {
    0%, 100% { transform: scale(1);   opacity: 0.95; }
    50%      { transform: scale(1.2); opacity: 0.7; }
}
@media (prefers-reduced-motion: reduce) {
    [data-dirty-watch].is-dirty .button.save::before { animation: none; }
}

/* ── Contact Us form layout helpers ──────────────────────────── */
.cu-site-row {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    align-items: flex-end;
}
.cu-site-group { margin-bottom: 0; }
.cu-site-select { width: auto; }
.cu-page-group {
    margin-bottom: 0;
    flex: 1;
    min-width: 160px;
}
/* form-group with extra top margin when stacked below another form-group */
.cu-group-spaced { margin-top: 0.5rem; }
/* 🛑 REMOVED 2026-08-20 (owner): `.cu-char-counter { text-align: left; }`. Contact Us was
   the only surface whose character counter sat on the LEFT; every other counter on the
   five sites right-aligns under its field, and the owner asked for one consistent rule.
   The class is still on the markup of all five Contact Us pages as an inert hook — it
   deliberately has no declarations now, so the counter inherits the standard
   `.char-counter { text-align: right }` and the 480px cap in the .form-group block. Do
   not re-add a left-align here without changing the other 20 counters to match. */
/* Attachments file picker row */
.cu-file-row {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    margin-top: 0.35rem;
}
.cu-file-picker-label {
    cursor: pointer;
    margin: 0;
}
/* Drop-zone wrapper around the file picker — gets the dashed border and overlay
   on dragover. Picker continues to work for click-to-upload too. */
.cu-file-drop {
    position: relative;
    border: 1px dashed transparent;
    border-radius: var(--border-radius-sm);
    padding: 0.35rem;
    transition: background-color var(--transition-fast), border-color var(--transition-fast);
}
.cu-file-drop-hint {
    color: var(--color-text-muted);
    font-style: italic;
}
@media (hover: none) and (pointer: coarse) {
    /* Hide the drag hint on touch devices — drag-and-drop isn't a natural mobile gesture. */
    .cu-file-drop-hint { display: none; }
}
.cu-file-drop.cu-file-dragover {
    border-color: var(--color-accent);
    background: var(--color-primary-light);
}
.cu-file-drop-overlay {
    position: absolute;
    inset: 0.35rem;
    display: none;
    align-items: center;
    justify-content: center;
    background: color-mix(in srgb, var(--color-primary-light) 90%, transparent);
    color: var(--color-primary-dark);
    border-radius: var(--border-radius-sm);
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    pointer-events: none;
    text-align: center;
}
.cu-file-drop.cu-file-dragover .cu-file-drop-overlay { display: flex; }
/* File-error alert — hidden when there are no messages to show.
   Uses :empty so the panel auto-hides whenever JS clears innerHTML to '' and
   reappears as soon as JS writes any text. :empty has higher specificity than
   the shared .alert-panel { display: block } so we win the cascade without
   needing !important. The .has-error class is kept as a styling hook (e.g.
   for any future "shake" animation) but no longer drives display. */
.cu-file-error {
    margin-top: 0.5rem;
    font-size: var(--font-size-sm);
}
.cu-file-error:empty { display: none; }
/* Narrow auto-width selects (Urgency/Importance/Expecting a Reply) */
.cu-select-auto { width: auto; }

/* Submit row spacing */
.cu-submit-row {
    margin-top: 0.75rem;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.75rem;
}

/* File upload list (Contact Us attachments) */
.cu-file-list {
    list-style: none;
    margin: 0.35rem 0 0;
    padding: 0;
}
.cu-file-item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.3rem 0.5rem;
    border-bottom: 1px solid var(--color-border);
    font-size: var(--font-size-sm);
}
.cu-file-item:last-child { border-bottom: none; }
.cu-file-name  { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cu-file-size  { color: var(--color-text-muted); flex-shrink: 0; }
.cu-file-remove { color: var(--color-danger); flex-shrink: 0; }

/* About-page hero — slightly tinted background + a soft "spotlight" radial gradient. */
.about-hero {
    background-image:
        radial-gradient(circle at top right,
            color-mix(in srgb, var(--color-accent) 8%, transparent) 0%,
            transparent 55%),
        linear-gradient(180deg, var(--color-bg-card), var(--color-bg-card));
}
[data-theme="dark"] .about-hero {
    background-image:
        radial-gradient(circle at top right,
            color-mix(in srgb, var(--color-accent) 18%, transparent) 0%,
            transparent 55%),
        linear-gradient(180deg, var(--color-bg-card), var(--color-bg-card));
}

/* ── 13. Navigation ──────────────────────────────────────────── */

.site-nav {
    position: sticky;
    top: 0;
    z-index: var(--nav-z);
    background-color: var(--color-bg-nav);
    /* Subtle gradient sheen instead of flat color — adds depth without distraction.
       Falls back to flat bg if linear-gradient unsupported (none modern). */
    background-image: linear-gradient(to bottom,
                       color-mix(in srgb, var(--color-bg-nav) 88%, #ffffff 12%) 0%,
                       var(--color-bg-nav) 100%);
    height: var(--nav-height);
    display: flex;
    align-items: center;
    box-shadow: var(--shadow-md);
    /* Hairline accent under the bar, separating nav from page content */
    border-bottom: 1px solid rgba(0, 0, 0, 0.25);
}
.site-nav .nav-inner {
    width: 100%;
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 1rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.nav-brand {
    font-size: 1.3rem;
    font-weight: 700;
    color: #fff;
    text-decoration: none;
    letter-spacing: 0.005em;
    transition: opacity var(--transition-fast);
}
.nav-brand:hover { color: #fff; text-decoration: none; opacity: 0.92; }
.nav-brand-accent { color: var(--color-accent); }
/* Hamburger toggle */
.nav-toggle {
    display: block;
    background: none;
    border: none;
    cursor: pointer;
    padding: 0.5rem;
    color: #fff;
    font-size: 1.5rem;
    line-height: 1;
    min-height: 44px;
    min-width: 44px;
}
@media (min-width: 992px) { .nav-toggle { display: none; } }

/* Nav menu */
.nav-menu {
    display: none;
    flex-direction: column;
    position: fixed;
    top: var(--nav-height);
    left: 0;
    right: 0;
    bottom: 0;
    background-color: var(--color-bg-nav);
    overflow-y: auto;
    z-index: calc(var(--nav-z) - 1);
    padding: 0.5rem 0 2rem;
    /* Strip the default UL bullet — without this, <li class="nav-item"> rows
       (Home, My Trips, Quicklist, etc.) render with a disc, while role-gated
       <asp:Panel> items (Setup, Admin, My Account, Login — rendered as <div>)
       don't, so the menu looks inconsistent. The dot has no semantic purpose. */
    list-style: none;
    margin: 0;
}
.nav-menu.open { display: flex; }

@media (min-width: 992px) {
    .nav-menu {
        display: flex;
        flex-direction: row;
        position: static;
        background: none;
        overflow: visible;
        padding: 0;
        align-items: center;
        gap: 0.25rem;
    }
}

/* Nav items */
.nav-item { position: relative; }

.nav-link {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    padding: 0.75rem 1.25rem;
    color: rgba(255,255,255,0.85);
    text-decoration: none;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    transition: color var(--transition-fast), background-color var(--transition-fast);
    white-space: nowrap;
    position: relative;
}
.nav-link:visited { color: rgba(255,255,255,0.85); }

/* 🔴 BOOTSTRAP'S `.nav-link:focus` IS WHY A FOCUSED NAV LINK WENT BLACK-ON-BLACK.
   Reported 2026-09-07: click "Setup" or "Learn", the section expands and the word
   itself vanishes. Measured on prod the same day — the focused trigger computed to
   rgb(26,31,46), i.e. --color-text, on a #1a1a2e bar.

   MECHANISM, because the obvious reading is wrong twice. bootstrap.css ships
   `.nav-link:focus { color: var(--bs-nav-link-hover-color) }`. These sites do not
   use Bootstrap's nav component, so that variable is NEVER DEFINED — and an
   undefined var() is "invalid at computed-value time", which for an INHERITED
   property like color does not fall back to the earlier declaration, it computes to
   `inherit`. So the link inherits the page text color, which is dark by design.
   Second: this sheet loads after bootstrap, but `.nav-link` is (0,1,0) and
   `.nav-link:focus` is (0,2,0), so source order never came into it — specificity
   did. That is why :hover looked fine (this file has a :hover rule at (0,2,0) that
   wins on order) and only :focus broke.

   🔑 IT MUST STAY ABOVE THE :hover AND .active RULES BELOW. All three are (0,2,0),
   so the later one wins — which is what we want: a focused link that is also hovered
   or current keeps the cyan fill with #111 on it. Move this block down and a focused
   .active link renders white on cyan (2.48:1).
   ⚠ Deliberately NOT :focus-visible. The bug is Bootstrap's :focus rule, and a mouse
   click sets :focus without :focus-visible — which is exactly the case reported. The
   keyboard focus RING is a separate rule and is untouched.
   ⚠ Dropdown children are unaffected: `.nav-dropdown .nav-link` is also (0,2,0) and
   sits later in this file, so they keep their dimmer 0.7 white. */
.nav-link:focus {
    color: rgba(255,255,255,0.85);
}

/* Hover/active fill the link with the brand cyan, so the label must go
   near-black: white on #00B0F0 is 2.48:1, #111 is 7.61:1. The nav's resting
   links stay white — they sit on the dark --color-bg-nav bar, not on cyan. */
.nav-link:hover {
    color: #111;
    background-color: var(--color-accent);
    border-radius: var(--border-radius-sm);
    text-decoration: none;
}
.nav-link.active {
    color: #111;
    background-color: var(--color-accent);
    border-radius: var(--border-radius-sm);
    text-decoration: none;
    font-weight: var(--font-weight-bold);
}

/* Logout link — red text so the destructive sign-out action is unmistakable.
   The ancestor selector (.nav-menu) raises specificity above .nav-dropdown
   .nav-link's mobile override so the red color sticks on every viewport. */
.nav-menu .nav-link.nav-link-logout,
.nav-menu .nav-link.nav-link-logout:visited {
    color: #ef5350;
}
.nav-menu .nav-link.nav-link-logout:hover {
    color: #ff8a80;
    background-color: rgba(239, 83, 80, 0.12);
}
/* Underline accent on hover for root-level desktop links — appears beneath the link
   bar without shifting layout. Hidden by default; expands from center on hover/active. */
@media (min-width: 992px) {
    .nav-menu > .nav-item > .nav-link::after {
        content: "";
        position: absolute;
        bottom: 4px;
        left: 50%;
        width: 0;
        height: 2px;
        background: var(--color-accent);
        transition: width var(--transition-fast), left var(--transition-fast);
        border-radius: 1px;
    }
    .nav-menu > .nav-item > .nav-link.active::after,
    .nav-menu > .nav-item:hover > .nav-link::after {
        width: calc(100% - 2.5rem);
        left: 1.25rem;
    }
    /* Don't double-decorate when the active state already applies a full background. */
    .nav-menu > .nav-item > .nav-link.active::after { display: none; }
}

/* Root-level nav links: slightly larger than dropdown links */
.nav-menu > .nav-item > .nav-link {
    font-size: var(--font-size-base); /* 1rem vs --font-size-sm (0.875rem) for dropdowns */
}

/* Dropdown arrow */
.nav-link-has-dropdown::after {
    content: "▾";
    font-size: 0.75rem;
    margin-left: 0.25rem;
}

/* Dropdown menu */
.nav-dropdown {
    display: none;
    list-style: none;
    margin: 0;
    padding: 0;
}
/* Dropdown links slightly larger than the old sm default */
.nav-dropdown .nav-link { font-size: 1.0625rem; }

/* "(soon)" / "(no menu entry)" suffix marking a link to a stub page. Smaller and
   dimmer than the label so the link still reads as real, just unbuilt.

   FIXED 2026-08-25 - the base rule was color:rgba(255,255,255,.5) on a
   rgba(255,255,255,.07) pill, i.e. a DARK-NAV treatment, with a `.card .nav-soon`
   override intended to correct it on content surfaces. Nothing on any of the five
   sites puts .nav-soon in the nav: its ONLY use is PacklistPRO/Admin.aspx (6 spans),
   whose container is `.main-card`, NOT `.card`. So the override never matched and
   every label rendered white on white - measured contrast ratio 1.0. The base is now
   the content-surface treatment, theme-aware in both modes, and the light-on-dark
   variant is scoped to the nav that actually has a fixed dark surface. */
.nav-soon {
    font-size: 0.7em;
    color: var(--color-text-muted);
    font-style: italic;
    margin-left: 0.3rem;
    padding: 0.05rem 0.35rem;
    border-radius: 999px;
    background: var(--color-bg);
    border: 1px dashed var(--color-border);
    letter-spacing: 0.02em;
}
/* The nav bar is dark in BOTH themes, so a label there needs the light-on-dark
   treatment rather than the theme tokens above. Kept for the day a nav link uses it. */
.site-nav .nav-soon,
.nav-menu .nav-soon {
    color: rgba(255,255,255,0.5);
    background: rgba(255,255,255,0.07);
    border: 0;
}
/* "New since last visit" badge — small accent-colored dot next to a nav link
   (currently used on Changes / New Features). The dot pulses gently to draw
   the eye without being obnoxious. Visit the destination page → server-side
   clears the cookie → badge disappears on next render. */
.nav-badge-new {
    display: inline-block;
    margin-left: 0.3rem;
    font-size: 0.7em;
    color: var(--color-accent);
    line-height: 1;
    vertical-align: middle;
    animation: navBadgePulse 2s var(--ease-in-out) infinite;
}
@keyframes navBadgePulse {
    0%, 100% { opacity: 1;   transform: scale(1); }
    50%      { opacity: 0.55; transform: scale(0.85); }
}
@media (prefers-reduced-motion: reduce) {
    .nav-badge-new { animation: none; }
}

/* Red count pill for the admin "Admin" nav item — shows how many items are
   waiting in the moderation queue (Site.Master.SetAdminBadge, admin-only).
   Shares the navBadgePulse animation so it reads as "needs attention". */
.nav-badge-count {
    display: inline-block;
    min-width: 1.25em;
    margin-left: 0.35rem;
    padding: 0.05em 0.4em;
    font-size: 0.7em;
    font-weight: var(--font-weight-bold);
    line-height: 1.3;
    text-align: center;
    color: #fff;
    background-color: var(--color-danger);
    border-radius: 999px;
    vertical-align: middle;
    animation: navBadgePulse 2s var(--ease-in-out) infinite;
}
@media (prefers-reduced-motion: reduce) {
    .nav-badge-count { animation: none; }
}

@media (max-width: 991px) {
    .nav-dropdown { padding-left: 1rem; background-color: var(--color-bg-nav-dropdown); }
    .nav-dropdown.open { display: block; }
    .nav-dropdown .nav-link {
        padding: 0.5rem 1.25rem;
        color: rgba(255,255,255,0.7);
    }
    .nav-dropdown .nav-link.active {
        background-color: var(--color-accent);
        color: #111;                 /* 7.61:1 on the cyan; white was 2.48:1 */
        font-weight: var(--font-weight-bold);
    }
}
@media (min-width: 992px) {
    .nav-item:hover .nav-dropdown,
    .nav-item:focus-within .nav-dropdown {
        display: block;
        position: absolute;
        top: 100%;
        left: 0;
        min-width: 220px;
        background-color: var(--color-bg-nav-dropdown);
        backdrop-filter: blur(12px);
        -webkit-backdrop-filter: blur(12px);
        border: 1px solid rgba(255,255,255,0.10);
        border-radius: var(--border-radius);
        box-shadow: var(--shadow-lg);
        z-index: 999;
        padding: 0.35rem 0;
        margin-top: 0.25rem;
        /* Subtle slide-down + fade for dropdown reveal */
        animation: navDropFade 0.18s var(--ease-out-quint);
        transform-origin: top center;

        /* ── Long-menu overflow (added 2026-07-28) ───────────────────────
           .site-nav is position:sticky/top:0, and this panel is absolutely
           positioned inside it, so it does NOT move when the page scrolls.
           Without a cap, a tall menu (qFIT's and qMEET's "More" are the worst)
           simply ran past the bottom of the viewport and those entries were
           permanently unreachable on desktop — no amount of page scrolling
           brought them back. Cap to the space actually below the bar and let
           the panel scroll itself.
           overscroll-behavior: contain stops the scroll chaining to the page
           once the menu hits its end. */
        max-height: calc(100vh - var(--nav-height, 56px) - 1rem);
        overflow-y: auto;
        overscroll-behavior: contain;
        /* Thin, theme-appropriate scrollbar on the dark nav panel. */
        scrollbar-width: thin;
        scrollbar-color: rgba(255,255,255,0.35) transparent;
    }
    .nav-dropdown::-webkit-scrollbar { width: 8px; }
    .nav-dropdown::-webkit-scrollbar-track { background: transparent; }
    .nav-dropdown::-webkit-scrollbar-thumb {
        background-color: rgba(255,255,255,0.3);
        border-radius: 999px;
    }
    .nav-dropdown::-webkit-scrollbar-thumb:hover { background-color: rgba(255,255,255,0.45); }

    /* Invisible bridge so the cursor stays in hover when crossing from
       the trigger to the dropdown — the dropdown has margin-top: 0.25rem
       which creates a dead zone where neither the nav-item nor the
       dropdown is hovered, so it vanishes mid-traversal.
       ⚠ This USED TO be .nav-dropdown::before at top:-10px. That breaks the
       moment the panel becomes a scroll container (above): overflow in the
       block-START direction is clipped and never scrollable, so the bridge
       was clipped away and the menu vanished mid-traversal again. It now
       hangs off the TRIGGER LINK instead, which is not a scroll container.
       ::before, not ::after — .nav-link-has-dropdown::after is the ▾ caret. */
    .nav-item:hover > .nav-link-has-dropdown::before,
    .nav-item:focus-within > .nav-link-has-dropdown::before {
        content: "";
        position: absolute;
        top: 100%;
        left: 0;
        right: 0;
        height: 10px;
        background: transparent;
    }

    /* Right-aligned dropdown for trailing nav items (e.g. the My Account
       menu on the far right of the navbar). Without this, left:0 anchors
       the panel to the trigger's left edge and the panel overflows the
       viewport on the right. Opt in by adding .nav-item-end on the parent
       .nav-item. */
    .nav-item.nav-item-end:hover .nav-dropdown,
    .nav-item.nav-item-end:focus-within .nav-dropdown {
        left: auto;
        right: 0;
    }
    .nav-dropdown .nav-link {
        padding: 0.5rem 1rem;
        border-radius: 0;
    }
    .nav-dropdown .nav-link:hover {
        background-color: var(--color-accent);
        color: #111;                 /* 7.61:1 on the cyan; white was 2.48:1 */
    }
    .nav-dropdown .nav-link.active {
        background-color: var(--color-accent);
        color: #111;                 /* 7.61:1 on the cyan; white was 2.48:1 */
        font-weight: var(--font-weight-bold);
    }
}
@keyframes navDropFade {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
}

/* Section label + divider inside long dropdowns. */
.nav-section-label {
    list-style: none;
    padding: 0.5rem 1rem 0.25rem;
    font-size: 0.625rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: #808080;
    font-weight: var(--font-weight-bold);
    pointer-events: none;
}
.nav-divider {
    list-style: none;
    margin: 0.25rem 0;
    border-top: 1px solid rgba(255,255,255,0.12);
    height: 0;
}
@media (max-width: 991px) {
    .nav-section-label {
        padding-left: 1.25rem;
        padding-right: 1.25rem;
    }
}

/* Nav right section (auth links) */
.nav-right {
    display: flex;
    flex-direction: column;
}
@media (min-width: 992px) {
    .nav-right {
        flex-direction: row;
        align-items: center;
        gap: 0.25rem;
        margin-left: auto;
    }
}

.footer-kbd {
    display: inline-block;
    min-width: 1.4em;
    padding: 0 0.35em;
    font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
    font-size: 0.85em;
    line-height: 1.4;
    color: rgba(255,255,255,0.9);
    background: rgba(255,255,255,0.08);
    border: 1px solid rgba(255,255,255,0.2);
    border-bottom-width: 2px;
    border-radius: 3px;
    text-align: center;
}
/* Hide the inline shortcut hint on touch devices — there's no keyboard. */
@media (hover: none) and (pointer: coarse) {
    #site-footer-shortcuts,
    #site-footer-shortcuts + .site-footer-sep { display: none; }
}

/* ── 22. Checklist items (Packlist / Tasklist) ───────────────── */

.checklist-item {
    display: flex;
    align-items: center;
    gap: 0.625rem;
    padding: 0.625rem 0;
    border-bottom: 1px solid var(--color-border);
}
.checklist-item:last-child { border-bottom: none; }
.checklist-item.checked > .item-label { text-decoration: line-through; color: var(--color-text-muted); }

.item-label {
    flex: 1;
    font-size: var(--font-size-base);
    cursor: pointer;
}

/* Options panel Save & Close row — sits below the Email / Print row so the
   close affordance is unambiguous. Top border separates it visually from the
   secondary actions above; centered so it reads as a primary "I'm done" action. */
.options-close-row {
    border-top: 1px solid var(--color-border);
    padding-top: 0.75rem;
    margin-top: 0.5rem;
}

/* ── Post-login Install + Push modal (site.js initPostLoginPrompts) ───────
   Shown on the first authenticated page load after a successful login.
   Two stacked cards (Install PWA, Enable push) inside one modal — each
   independently hideable; modal auto-closes when both are dismissed. The
   markup lives in each site's Site.Master (server-rendered, gated on the
   one-shot post-login cookie). Styling is shared across all 3 sister
   sites; per-site copy/strings live in the markup, not here. */
.post-login-box {
    max-width: 540px;
    width: 100%;
    position: relative;
}
.post-login-intro {
    margin: 0 0 1rem;
}
.post-login-close {
    position: absolute;
    top: 0.5rem;
    right: 0.5rem;
    width: 2rem;
    height: 2rem;
    background: transparent;
    border: 0;
    cursor: pointer;
    font-size: 1.5rem;
    line-height: 1;
    color: var(--color-text-muted);
    padding: 0;
}
.post-login-close:hover { color: var(--color-text); }
.post-login-close:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
    border-radius: var(--border-radius-sm);
}
.post-login-card {
    display: flex;
    align-items: flex-start;
    gap: 0.85rem;
    padding: 0.9rem 1rem;
    background: var(--color-info-bg, rgba(0, 176, 240, 0.06));
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    margin-bottom: 0.75rem;
}
.post-login-card:last-of-type { margin-bottom: 0; }
.post-login-card[hidden] { display: none; }
.post-login-card-icon {
    flex: 0 0 auto;
    font-size: 1.75rem;
    line-height: 1;
}
.post-login-card-body { flex: 1 1 auto; min-width: 0; }
.post-login-card-title {
    margin: 0 0 0.25rem;
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    color: var(--color-text);
}
.post-login-card-desc {
    margin: 0 0 0.5rem;
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
    line-height: 1.45;
}
.post-login-card-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.5rem;
}
.post-login-never {
    background: transparent;
    border: 0;
    padding: 0.25rem 0.5rem;
    color: var(--color-text-light);
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-normal);
    cursor: pointer;
    text-decoration: underline;
}
.post-login-never:hover { color: var(--color-text); }
.post-login-never:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 2px;
    border-radius: var(--border-radius-sm);
}
.post-login-instructions {
    margin: 0.5rem 0 0;
    padding: 0.5rem 0.75rem;
    background-color: var(--color-bg-card);
    border: 1px dashed var(--color-border);
    border-radius: var(--border-radius-sm);
    font-size: var(--font-size-sm);
    color: var(--color-text);
}
.post-login-instructions[hidden] { display: none; }
.post-login-instructions-list {
    margin: 0;
    padding-left: 1.1rem;
    line-height: 1.55;
}
.post-login-instructions-list li { margin: 0.15rem 0; }
.post-login-footer-note {
    margin: 0.75rem 0 0;
    font-size: var(--font-size-sm);
    color: var(--color-text-light);
    text-align: center;
}
@media (max-width: 560px) {
    .post-login-card { flex-wrap: wrap; gap: 0.6rem; }
    .post-login-card-icon { font-size: 1.4rem; }
}
/* ── Changes (changelog) page ─────────────────────────────────────────── */
.changes-pager-row     { margin-bottom: 0.75rem; }
.changes-app-divider   { margin: 1.5rem 0; }
.changes-app-heading {
    margin: 0 0 0.25rem;
    font-size: var(--font-size-xl);
}
.changes-type-heading  { margin: 1rem 0 0.5rem; }

/* Hamburger ⇄ close-X icon swap (cross-site). Two glyph spans share the nav
   toggle button; CSS picks the visible one from the button's aria-expanded
   state so the icon always matches what tapping will do next — no JS DOM write
   per toggle. (site.js only flips aria-expanded.) */
.nav-toggle .nav-toggle-icon { display: inline-block; line-height: 1; }
.nav-toggle[aria-expanded="false"] .nav-toggle-icon-close,
.nav-toggle[aria-expanded="true"]  .nav-toggle-icon-open { display: none; }

/* Client-side filter row above the changelog rows (WhatsNew / Changes). */
.changes-filter-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin: 0 0 1rem 0;
}
/* #changesFilter now sits inside an .input-clearable wrapper (standard in-field ×
   clear button), so the row's flex sizing rides on the wrapper; the input fills it. */
.changes-filter-row .input-clearable {
    flex: 1 1 18rem;
    min-width: 0;
}
.changes-filter-row .input-clearable #changesFilter { width: 100%; min-width: 0; }

/* ── ContactUs Viewer / Duplicate Record Finder shared row spacing ───── */
.cuv-summary-line   { margin-bottom: 0.5rem; }
.drf-note-spacing   { margin-top: 0.75rem; }

/* ── MessageSent thank-you detail paragraph ─────────────────────────── */
.ms-detail-text {
    color: var(--color-text-muted);
    margin: 0;
}

/* MessageSent confirmation hero — celebratory success-check badge + a readable
   centered measure for the follow-up paragraph. Pairs with .ms-detail-text
   (above) and .ms-message-banner / .ms-action-row so every site's MessageSent
   confirmation looks identical. Additive and page-agnostic — safe for any site. */
.ms-check {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 4.25rem;
    height: 4.25rem;
    margin: 0 auto 0.85rem;
    border-radius: 50%;
    background: var(--color-success-bg);
    color: var(--color-success);
    border: 1px solid var(--color-success-border);
    font-size: 2.1rem;
    line-height: 1;
    box-shadow: var(--shadow-sm);
    animation: msCheckPop 0.28s var(--ease-out-back, ease-out) both;
}
/* Keep the centered follow-up paragraph to a comfortable reading measure. */
.ms-hero .ms-detail-text {
    max-width: 48ch;
    margin-left: auto;
    margin-right: auto;
}
@keyframes msCheckPop {
    from { opacity: 0; transform: scale(0.6); }
    to   { opacity: 1; transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) {
    .ms-check { animation: none; }
}

/* ── Subscribe1 (push notification preferences) ───────────────────────────
   Replaces ~30 inline style attributes that previously lived in markup. */
.subscribe-page {
    max-width: 480px;
    margin: 2.5rem auto;
    padding: 0 1rem;
    text-align: center;
    font-family: var(--font-family);
}
/* The page-level text-align:center above is for the subscribe states
   (icon + headline + button stack). Tips cards inside live by the same
   left-aligned convention used everywhere else, so opt them back out. */
.subscribe-page .tip-card,
.subscribe-page .tip-card-text,
.subscribe-page .tip-card-heading { text-align: left; }
.subscribe-intro   { color: var(--color-text-muted); margin-bottom: 1.75rem; }

.subscribe-state-loading { color: var(--color-text-light); }

.subscribe-state-icon {
    font-size: 2.25rem;
    font-weight: var(--font-weight-bold);
}
.subscribe-state-icon-ok  { color: var(--color-success); }
.subscribe-state-icon-bad { color: var(--color-danger); }

.subscribe-state-headline {
    font-weight: var(--font-weight-bold);
    margin: 0.75rem 0 0.375rem;
}
.subscribe-state-headline-ok  { color: var(--color-success); }
.subscribe-state-headline-bad { color: var(--color-danger); }

.subscribe-state-sub {
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}
.subscribe-state-sub-spaced { margin-bottom: 1rem; }

.subscribe-state-prompt    { color: var(--color-text); margin: 0.75rem 0 1.25rem; }
.subscribe-prompt-btn      { min-width: 180px; }
.subscribe-prompt-msg      { margin-top: 0.875rem; color: var(--color-text-muted); font-size: var(--font-size-sm); }

.subscribe-details-card {
    margin: 1.25rem 0 1.125rem;
    text-align: left;
    background: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    padding: 0.875rem 1rem;
    font-size: var(--font-size-sm);
}
.subscribe-details-title {
    display: block;
    margin-bottom: 0.625rem;
    color: var(--color-text);
}
.subscribe-details-table {
    border-collapse: collapse;
    width: 100%;
}
.subscribe-details-label {
    color: var(--color-text-muted);
    padding: 0.25rem 0.75rem 0.25rem 0;   /* right gap: on a phone the label has no fixed width, and "Permission" ran into its value */
    width: 7.5rem;
    vertical-align: top;
}
.subscribe-details-value {
    color: var(--color-text);
    padding: 0.25rem 0;
}
.subscribe-details-value-id {
    color: var(--color-text-light);
    word-break: break-all;
    font-size: var(--font-size-xs);
}
.subscribe-details-value-ok  { color: var(--color-success); }
.subscribe-details-value-bad { color: var(--color-danger); }

.subscribe-action-btn   { min-width: 200px; }
.subscribe-result-line  {
    display: block;
    margin-top: 0.75rem;
    font-size: var(--font-size-sm);
    min-height: 1.125rem;
}

.subscribe-help-list {
    text-align: left;
    color: var(--color-text);
    font-size: var(--font-size-sm);
    margin: 0 auto 1.25rem;
    max-width: 360px;
    line-height: 1.8;
}

.progress-track {
    height: 10px;
    background: color-mix(in srgb, var(--color-border) 70%, transparent);
    border-radius: 999px;
    margin-top: 0.375rem;
    overflow: hidden;
    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.06);
}
/* Progress fill starts at 0% and is animated to data-width by JS on load.
   Default width here means we can drop the inline style="width:0%" attribute
   from the markup — last remaining inline style on user-facing pages. */
.progress-fill {
    width: 0%;
    height: 100%;
    border-radius: 999px;
    background-color: var(--color-save-btn);
    /* Subtle diagonal stripe pattern that gently animates — communicates "still active"
       even when the percentage isn't changing. */
    background-image: linear-gradient(
        45deg,
        rgba(255, 255, 255, 0.15) 25%,
        transparent 25%,
        transparent 50%,
        rgba(255, 255, 255, 0.15) 50%,
        rgba(255, 255, 255, 0.15) 75%,
        transparent 75%,
        transparent
    );
    background-size: 16px 16px;
    transition: width 0.5s var(--ease-out-quint), background-color 0.3s;
    animation: progressStripes 1.4s linear infinite;
}
@keyframes progressStripes {
    from { background-position: 0 0; }
    to   { background-position: 16px 0; }
}
/* When the progress bar reaches 100%, dial up the saturation slightly and stop
   the stripes — communicates "done!" without needing a separate badge. The
   data-width attribute is the source of truth; site.js applies the
   .progress-complete class after animating to width if the value is 100%. */
.progress-fill.progress-complete {
    animation: none;
    background-image: linear-gradient(
        90deg,
        var(--color-save-btn),
        color-mix(in srgb, var(--color-save-btn) 80%, #fff)
    );
    background-size: auto;
    box-shadow: 0 0 6px color-mix(in srgb, var(--color-save-btn) 50%, transparent);
}
@media (prefers-reduced-motion: reduce) {
    .progress-fill { animation: none; background-image: none; }
}

/* ── 30. Notes page ──────────────────────────────────────────── */

.notes-layout {
    display: flex;
    flex-direction: column;
    gap: var(--section-gap);
}
@media (min-width: 768px) {
    .notes-layout     { flex-direction: row; align-items: flex-start; }
    .notes-list-col   { flex: 0 0 38%; min-width: 0; }
    .notes-edit-col   { flex: 1; min-width: 0; }
}

.note-item {
    padding: .625rem .75rem;
    border-bottom: 1px solid var(--color-border);
    cursor: pointer;
    transition: background-color var(--transition-fast), padding-left var(--transition-fast);
    border-radius: var(--border-radius-sm);
    position: relative;
}
.note-item:last-child  { border-bottom: none; }
.note-item:hover       { background-color: var(--color-primary-light); padding-left: .9rem; }
.note-item:focus       { outline: 2px solid var(--color-border-focus); outline-offset: -2px; }
.note-item.selected {
    background-color: var(--color-primary-light);
    border-left: 3px solid var(--color-primary);
    padding-left: calc(.75rem - 3px);
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-primary) 25%, transparent);
}
.note-item-title {
    font-weight: var(--font-weight-medium);
    color: var(--color-text);
}
.note-item-meta {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    margin-top: .2rem;
    display: flex;
    flex-wrap: wrap;
    gap: .25rem;
    align-items: center;
}

.note-badge {
    display: inline-block;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-medium);
    padding: .15rem .55rem;
    border-radius: 999px;
    line-height: 1.5;
    white-space: nowrap;
    letter-spacing: 0.01em;
}
.note-badge-private {
    background-color: var(--color-bg);
    border: 1px solid var(--color-border);
    color: var(--color-text-muted);
}
.note-badge-shared {
    background-color: var(--color-primary-light);
    color: var(--color-primary);
}

/* Notes list header row: title + action buttons on one line */
.notes-list-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.notes-list-title { margin: 0; }
.notes-list-actions {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}
/* Filter row above the notes list — JS-revealed once this trip has 3+ notes,
   the point at which filtering beats scrolling and the control earns its
   vertical space. */
.notes-search-row {
    margin: 0.5rem 0 0.65rem;
}
.notes-search-input { width: 100%; }
.notes-search-results {
    margin: 0.35rem 0 0;
    min-height: 1.2em;
}

/* ⚠ The Notes edit form's own rows must be capped to the SAME width as the field
   they belong to. `.form-group .textbox` is capped at 480px from 768px up (see the
   .form-group block), but a sibling <p> or label row is a plain block and stretches
   to the full column — so the "Proper-Case Title" button and the "n / 8000" counter
   were flush with the CARD edge, floating well right of the input they describe.
   Cap them to match and they line up with the field's right edge. */
/* The row's shared default is align-items:baseline, which is right for the quiet
   text links it usually holds; Proper-Case Title is a real .button with padding,
   so center it against the label instead. */
.notes-edit-col .form-group .input-label-row { align-items: center; }
@media (min-width: 768px) {
    /* ⓘ The .char-counter half of this pair was GENERALIZED on 2026-08-20 — the
       `.form-group:has(.textbox…) > .char-counter` rule in §21 now caps every counter on
       all five sites, so this line is redundant (same 480px, so it cannot conflict). It
       stays because .input-label-row still needs it and the two share a declaration; if
       you ever split them, delete the .char-counter selector rather than duplicating it. */
    .notes-edit-col .form-group .input-label-row,
    .notes-edit-col .form-group .char-counter { max-width: 480px; }
}

/* Badge marking a filtered row that survived on a note-BODY match rather than its
   title. Both [hidden] rules below are mandatory, not defensive: the [hidden]
   attribute comes from the UA stylesheet and loses to any author `display:` rule —
   .note-item-meta sets display:flex and .field-validation-error sets
   display:inline-flex, so without these the "hidden" elements render. */
.note-item-match[hidden] { display: none; }

/* Live duplicate-title warning under the Note Title field. Inherits the red "!"
   treatment from .field-validation-error; this class only adds the hidden state and
   room for the inline "Open that note instead" button. */
.note-title-dup[hidden] { display: none; }
.note-title-dup {
    /* display:flex, not the inherited inline-flex, so the message always occupies its
       own block regardless of what sits above it in the form group. The [hidden] rule
       above still wins (higher specificity), so this can't un-hide it. */
    display: flex;
    align-items: flex-start;   /* bullet beside the FIRST line of a message that wraps */
    gap: 0.35rem;
}
/* One flex item for the whole message so the "!" can't wrap onto its own line. The
   "Open that note instead" button flows inline after the sentence. */
.note-title-dup-msg { min-width: 0; }

/* Note Title row: input + "Proper-Case" link side-by-side */
.notes-title-row {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    flex-wrap: wrap;
}
.notes-title-input {
    flex: 1;
    min-width: 0;
}

/* Date input is narrow — don't stretch full-width */
.notes-date-input { max-width: 200px; }

/* "Shared (view/edit)" label sits beside the checkbox without inheriting label margin */
.notes-shared-label {
    margin: 0;
    cursor: pointer;
}

.note-date-badge {
    display: inline-block;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-medium);
    background-color: var(--color-warning-bg);
    color: var(--color-warning);
    border: 1px solid var(--color-warning-border);
    border-radius: var(--border-radius-sm);
    padding: .1rem .4rem;
    white-space: nowrap;
}

/* ── 31. Login page & Logo ───────────────────────────────── */

.login-page {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 2rem 1rem 3rem;
}
.login-container {
    width: 100%;
    max-width: 420px;
    /* A bit more elevation than a standard card so the login form feels like the page focus */
    box-shadow: var(--shadow-lg) !important;
    padding: 1.75rem !important;
    border-radius: var(--border-radius-lg) !important;
}

/* Tips area sits ABOVE the login card; matches its width so the right-aligned
   ⓘ trigger lines up with the card's right edge. */
.login-tips-area {
    width: 100%;
    max-width: 420px;
}
.login-tips-trigger-row {
    display: flex;
    justify-content: flex-end;
    margin-bottom: 0.25rem;
}
.login-tips-trigger-row .tips-trigger {
    font-size: 1.25rem;
}

/* CSS text logo (Logo.ascx) */
.site-logo        { text-align: center; margin-bottom: 1.5rem; }
.logo-link        {
    font-size: 1.75rem;
    font-weight: var(--font-weight-bold);
    text-decoration: none;
    color: var(--color-text);
    letter-spacing: 0.02em;
}
.logo-link:hover                { color: var(--color-text); text-decoration: none; }
.logo-accent                    { color: var(--color-primary); font-weight: 700; }
.logo-link:hover .logo-accent   { color: var(--color-primary-dark); }

/* ── 32. Home page ───────────────────────────────────────────── */

/* Flex-wrap grid for the shortcut action buttons */
.home-actions {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: 0.55rem;
    margin-top: 0.85rem;
}

.home-actions .button,
.home-actions a.button,
.home-actions span.button {
    width: 100%;
    justify-content: center;
    text-align: center;
    box-sizing: border-box;
    /* Slightly taller than default — gives the home tiles a more tap-friendly target
       and matches the feel of an app launcher. */
    min-height: 3rem;
    font-weight: var(--font-weight-medium);
    /* Override the global .button { white-space: nowrap } so longer labels like
       "✓ Getting Started Checklist" wrap to 2 lines instead of overflowing the 140px
       (or 110px on mobile) grid cell. line-height bumps so wrapped text doesn't
       collide; word-break/overflow-wrap protect against unhyphenable long words. */
    white-space: normal;
    line-height: 1.2;
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* .home-btn-walkthrough: no special sizing — same grid cell as every other button. */

/* Spacing above the shortcut button grid */
.home-trip-context {
    margin-bottom: 0.75rem;
}

/* Disabled shortcut buttons — no trip selected */
.action-btn-disabled {
    opacity: 0.45;
    cursor: not-allowed;
    pointer-events: none;
    user-select: none;
}

/* Recent-trips compact list on Home (authenticated only). Each row is a single
   tappable link with name + countdown badge + dates on one line, wrapping on
   narrow viewports. */
.home-recent-trips {
    list-style: none;
    margin: 0;
    padding: 0;
}
.home-recent-trip + .home-recent-trip {
    border-top: 1px solid var(--color-border);
}
.home-recent-trip-link {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    padding: 0.55rem 0.25rem;
    color: var(--color-text);
    text-decoration: none;
    transition: background-color var(--transition-fast), padding-left var(--transition-fast);
    border-radius: var(--border-radius-sm);
    min-height: 44px;
}
.home-recent-trip-link:hover,
.home-recent-trip-link:focus-visible {
    background: var(--color-primary-light);
    color: var(--color-text);
    text-decoration: none;
    padding-left: 0.6rem;
}
.home-recent-trip-link:focus-visible {
    outline: 2px solid var(--color-border-focus);
    outline-offset: 1px;
}
.home-recent-trip-name {
    font-weight: var(--font-weight-medium);
    flex: 1 1 auto;
    min-width: 0;
}
.home-recent-trip-dates {
    flex: 0 0 auto;
}

/* ── 33. Quicklist page ──────────────────────────────────── */

.ql-filters {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: 1rem;
}
.ql-filter-checks {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    align-items: center;
}
.ql-filter-divider {
    display: inline-block;
    width: 1px;
    height: 1.25rem;
    background: var(--color-border);
    margin: 0 0.25rem;
    align-self: center;
}
.ql-check-label {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    cursor: pointer;
    font-size: var(--font-size-sm);
}

/* Detail-level dropdown sits in the filter row without bottom margin */
.ql-detail-group  { margin-bottom: 0; }
.ql-detail-select { width: auto; }

/* "Show Quicklist" button row spacing; flex so the selected-tag count sits beside the button */
.ql-show-row      { margin-top: 0.75rem; display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; }

/* Trip Tags heading above the tag accordion. The gap under it is now carried by the
   gloss below rather than the heading itself, so the two read as one block. */
.ql-tag-heading   { margin-bottom: 0.15rem; }

/* "(Activities, Context)" — a gloss on the heading, not part of it. It used to sit
   inside the <h2>, which set a parenthetical aside at heading size and weight. */
.ql-tag-heading-note { margin: 0 0 0.5rem; }

/* Expand All / Collapse All above the accordion. Borrows the Packlist's .plp-list-tools
   bar so the two lists carry the same control; only the alignment differs — the Packlist's
   bar is right-aligned over a full-width checklist, while this one sits in a 340px sidebar
   under a left-aligned heading, where flex-end would strand it away from what it acts on.
   Declared AFTER .plp-list-tools in the cascade (Content/styles.css loads before this file),
   so the equal-specificity override lands without needing a compound selector. */
.ql-tag-tools     { justify-content: flex-start; padding-left: 0; }

/* Two-column layout */
.ql-layout        { display: flex; gap: 1.5rem; align-items: flex-start; margin-top: 0; }
/* Fixed-width sidebar (NOT max-content — that let the column grow to fit all tag
   pills on one line, so .tag-group-body never wrapped on desktop and ran off the
   screen). A constrained basis forces the pills to wrap within the column. */
.ql-filter-col    { flex: 0 0 340px; min-width: 0; }
.ql-results-col   { flex: 1; min-width: 0; }
/* Before any results are shown, the tag card spans the full page width (and the
   empty results column is hidden); it shrinks to the sidebar once items/tasks render. */
.ql-layout-full .ql-filter-col  { flex: 1 1 auto; }
.ql-layout-full .ql-results-col { display: none; }
@media (max-width: 768px) {
    .ql-layout     { flex-direction: column; }
    .ql-filter-col { width: 100%; flex: none; }
}

/* Results */
.ql-section-header      { font-size: var(--font-size-lg); font-weight: var(--font-weight-bold);
                           padding: 0.75rem 0 0.4rem; margin: 0.5rem 0 0.25rem;
                           border-bottom: 3px solid var(--color-accent); color: var(--color-accent); }
.ql-section-header:first-child { margin-top: 0; }
.ql-tag-header          { font-weight: var(--font-weight-bold); padding: 0.6rem 0 0.3rem;
                           border-bottom: 2px solid var(--color-border); margin-bottom: 0.25rem; }
.ql-item-list           { margin-bottom: 1rem; }
.ql-item                { padding: 0.35rem 0 0.35rem 0.5rem; border-bottom: 1px solid var(--color-border); }
.ql-item:last-child     { border-bottom: none; }
/* Item/task name at normal reading size; Why/Descriptions/Notes drop to the small size below. */
.ql-item-row            { display: flex; align-items: center; gap: 0.4rem; cursor: pointer; font-size: var(--font-size-base); }
/* The name doubles as the hold / double-click target that opens EditItem / EditTask
   (site.js initLongPress), mirroring .plp-item-name[data-longpress-url] on Packlist and
   Tasklist. Selection is off so a double-click edits instead of selecting the word, and so
   a hold isn't hijacked by the mobile text-selection callout. touch-action stays default —
   a scroll that starts on a name must still scroll the list.
   🔑 Keyed off the ATTRIBUTE: read-only (demo) rows drop it and must not get an affordance
   the page then refuses. No cursor here — the whole .ql-item-row is already pointer. */
.ql-item-name[data-longpress-url] {
    user-select: none;
    -webkit-user-select: none;
    -webkit-touch-callout: none;
}
/* ✎ Edit — the VISIBLE route from a Quicklist row to EditItem / EditTask, added
   2026-09-08. Until then the hold / double-click above was the only one on this page,
   which made Quicklist the exception to Home's tutorial promise that "there's always a
   visible route too". Packlist and Tasklist answer that with the ⋮ menu; this page has
   no ⋮, so the link goes on the row itself.
   🔑 flex-shrink 0 and margin-left:auto: .ql-item-row is a flex row, so without these a
   long item name would squeeze the ✎ to nothing. auto parks it at the right-hand end,
   the same consistent column the qFIT Checklist ⓘ sits in.
   🔑 currentColor + opacity rather than --color-primary: this sits inside a <label> whose
   whole job is the checkbox, and a saturated accent here would out-shout the tick. */
.ql-item-edit {
    flex: 0 0 auto;
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    text-decoration: none;
    color: inherit;
    opacity: 0.7;
    border-radius: 50%;
}
.ql-item-edit:hover,
.ql-item-edit:focus-visible { opacity: 1; text-decoration: none; }
.ql-item-edit:focus-visible { outline: 2px solid currentColor; outline-offset: 1px; }
.ql-field-label         { font-weight: var(--font-weight-medium); }
.ql-item-reason,
.ql-item-desc,
.ql-item-notes          { font-size: var(--font-size-sm); color: var(--color-text-muted); margin-top: 0.1rem; }

/* "Send these to a trip" — the only persisting action on an otherwise throw-away
   page, so it sits at the TOP of the results card where it can't be missed, and is
   set off from the list by a tinted well rather than yet another card. */
/* Page background, NOT --color-bg-input: the well has a <select> and a <textbox>
   sitting in it, and those already carry --color-bg-input — same fill would erase
   their affordance (in light mode #e2f1fb vs #e0f6fe is invisible). --color-bg
   differs from both the card and the inputs in light AND dark. */
.ql-send-bar {
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm, 4px);
    padding: 0.6rem 0.75rem;
    margin-bottom: 1rem;
}
/* The muted token is retired INSIDE the bar. --color-text-muted (#6c757d) is tuned
   for --color-bg-card (#ffffff → 4.69:1); on this well's --color-bg (#dbe4ed) it
   computes to 3.65:1, under AA for the 14px it is used at. --color-text is 12.67:1
   on the same fill (and 17.4:1 in dark, measured). Size and weight still carry the
   hierarchy, so nothing is lost but the failing color. */
.ql-send-bar .note,
.ql-send-bar .small-dim-text { color: var(--color-text); }
.ql-send-lead {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}
.ql-send-controls {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-bottom: 0.35rem;
}
/* Auto-width so the picker and the button share one line on desktop; both go
   full-width on narrow screens (below) rather than crushing to unreadable.
   The max-width is load-bearing, not tidiness: a <select> sizes to its LONGEST
   option, and trip names run to 200 chars ("2026-07-16 Camper Van, Canada Fires,
   OH/..."), which ate the whole row and wrapped the Send button onto its own line.
   ⚠ The element qualifiers are REQUIRED, not style. Both controls also carry
   .textbox, and that rule is written `select.textbox` / `input.textbox`
   (specificity 0,1,1) with `width:100%; max-width:100%`. A bare `.ql-send-select`
   (0,1,0) LOSES to it — measured: computed max-width came back 100% and the select
   rendered 729px wide. Qualifying by element ties the specificity, and this block
   sits later in the file, so it wins. */
.ql-send-controls select.ql-send-select  { width: auto; max-width: min(100%, 24rem); margin-bottom: 0; }
.ql-send-controls input.ql-send-newname  { width: auto; flex: 1 1 12rem; min-width: 0; max-width: 100%; margin-bottom: 0; }
/* Deliberately --color-text, not --color-success: #2e7d32 lands at 4.45:1 on the
   light well and 1.45:1 on the dark one (dark mode retunes --color-success-bg but
   leaves --color-success alone). The ✓ in the copy carries the "it worked" signal;
   the color doesn't have to. */
.ql-send-result  {
    margin: 0.5rem 0 0;
    font-size: var(--font-size-sm);
    color: var(--color-text);
    font-weight: var(--font-weight-medium);
}
/* Row badge for "this is now on your trip". SOLID --color-success with white text,
   NOT --color-success on --color-success-bg: dark mode redefines only the -bg
   token (to #1b3a1e) and leaves --color-success at #2e7d32, which would land at
   2.45:1 there. White on #2e7d32 is 5.1:1 and identical in both themes. */
.ql-sent-pill {
    background-color: var(--color-success);
    border-color: var(--color-success);
    color: #ffffff;
    cursor: default;
}
.ql-sent-pill:hover { border-color: var(--color-success); }
/* Stack on narrow screens. Element-qualified for the same reason as the desktop
   rule above — an unqualified selector here would lose to the one it must override. */
@media (max-width: 768px) {
    .ql-send-controls > * { width: 100%; }
    .ql-send-controls select.ql-send-select,
    .ql-send-controls input.ql-send-newname { width: 100%; max-width: 100%; }
}

/* ── 35. Contact Us Viewer ───────────────────────────────────── */

/* Results table */
.cuv-table tbody tr.cuv-row { cursor: pointer; }
.cuv-table tbody tr.cuv-row:hover td { background: var(--color-primary-light); }
.cuv-table tbody tr.cuv-row.cuv-selected td { background: var(--color-primary-light); font-weight: var(--font-weight-medium); }
.cuv-table tbody tr.cuv-unviewed td:first-child { font-weight: var(--font-weight-bold); }

/* Status badges */
.cuv-badge { display:inline-block; padding:0.18rem 0.55rem; border-radius:999px;
             font-size:0.7rem; font-weight:700; white-space:nowrap;
             text-transform:uppercase; letter-spacing:0.04em; line-height:1.5; }
.cuv-badge-new        { background:#f5f5f5; color:#616161; border:1px solid #e0e0e0; }
.cuv-badge-queued     { background:var(--color-info-bg); color:var(--color-info-text); }
.cuv-badge-future     { background:#f3e5f5; color:#7b1fa2; }
.cuv-badge-resolved   { background:var(--color-success-bg); color:var(--color-success); }
.cuv-badge-partial    { background:var(--color-warning-bg); color:var(--color-warning); }
.cuv-badge-unresolved { background:#fafafa; color:#9e9e9e; border:1px solid #e0e0e0; }
.cuv-badge-rejected   { background:var(--color-danger-bg); color:var(--color-danger); }

/* Dark-mode overrides for badges that aren't keyed to a CSS variable.
   The neutral (new/unresolved) and purple (future) swatches don't have
   palette tokens, so they get explicit dark equivalents here. */
[data-theme="dark"] .cuv-badge-new        { background:#2a2a2a; color:#bdbdbd; border-color:#444; }
[data-theme="dark"] .cuv-badge-future     { background:#2d1f3a; color:#ce93d8; }
[data-theme="dark"] .cuv-badge-unresolved { background:#1e1e1e; color:#9e9e9e; border-color:#444; }

/* Importance/urgency number chips */
.cuv-num { font-weight:var(--font-weight-medium); }
.cuv-imp-1, .cuv-urg-1 { color:var(--color-text-muted); }
.cuv-imp-2, .cuv-urg-2 { color:var(--color-text); }
.cuv-imp-3, .cuv-urg-3 { color:var(--color-warning); font-weight:var(--font-weight-bold); }
.cuv-imp-4, .cuv-urg-4 { color:var(--color-danger);  font-weight:var(--font-weight-bold); }

/* ContactUsViewer edit/files card layout */
.cuv-page-edit { /* see toolbar-search-grow; this is the marker for the "Page" field */ }
.cuv-group-top { margin-top: 0.75rem; }
.cuv-group-spaced { margin-top: 0.5rem; }
/* The edit-feedback message slot stays hidden until JS adds .is-visible */
.cuv-edit-msg {
    display: none;
    margin-top: 0.5rem;
}
.cuv-edit-msg.is-visible { display: flex; }

/* Edit card read-only info bar */
.cuv-readonly-info {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    padding: 0.5rem 0.75rem;
    background: var(--color-bg);
    border-radius: var(--border-radius-sm);
    font-size: var(--font-size-sm);
    margin-bottom: 0.25rem;
}
.cuv-info-item { white-space: nowrap; }

/* Attachments grid */
.cuv-files-grid { display:flex; flex-wrap:wrap; gap:1rem; }
.cuv-file-card  { width:140px; display:flex; flex-direction:column; gap:0.25rem;
                  padding:0.5rem; border:1px solid var(--color-border);
                  border-radius:var(--border-radius-sm); }
.cuv-file-thumb { width:100%; height:100px; object-fit:cover;
                  border-radius:var(--border-radius-sm); display:block; }
.cuv-file-icon  { font-size:2.5rem; text-align:center; line-height:100px; }

/* ── 36. Log Viewer ──────────────────────────────────────────── */

/* Row severity tints, all five now derived from palette tokens (2026-08-11, PLR-299).
   critical and security used to hardcode hex and therefore needed their own
   [data-theme="dark"] overrides; those two rules are gone, because the tokens
   already carry dark values and now flip on their own.

   security WAS #fff3e0, byte-identical to --color-warning-bg, so in LIGHT mode this
   is a pure rename with no visual change whatsoever. In DARK it shifts very slightly
   (#3b2400 -> #3a2a10) and now matches .log-row-warn exactly. That is stated rather
   than hidden: the two tints were already identical in light, so the dark difference
   was a hand-picked value rather than a design decision, and severity is carried by
   the row's badge, not by a brown you cannot tell from another brown. If security
   ever needs its own tint, give it a real token rather than a literal.

   critical is NOT simply --color-danger-bg, and that is deliberate. Using the bare
   token would make it identical to .log-row-error and lose the severity step. The
   mix keeps critical a deeper red than error in BOTH themes — which also fixes a
   real gap, since the old dark override (#3b1212) was exactly the dark
   --color-danger-bg, so in dark mode critical and error were indistinguishable. */
.log-row-error    { background-color: var(--color-danger-bg); }
.log-row-critical { background-color: color-mix(in srgb, var(--color-danger-bg) 85%, var(--color-danger) 15%); }
.log-row-warn     { background-color: var(--color-warning-bg); }
.log-row-security { background-color: var(--color-warning-bg); }
.log-row-audit    { background-color: var(--color-info-bg); }

/* Hover darkens the tint slightly */
.log-row { cursor: pointer; }
.log-row:hover td { filter: brightness(0.96); }

/* AI response header: heading + cache status badge on one line */
.ai-response-header {
    display: flex;
    align-items: center;
    gap: 0.625rem;
    margin-bottom: 0.75rem;
    flex-wrap: wrap;
}
.ai-response-header .heading { margin: 0; }
.ai-response-actions {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    margin-left: auto;
}

/* AI metadata two-column grid */
.ai-meta-grid {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.4rem 1.25rem;
    font-size: var(--font-size-sm);
    align-items: baseline;
}
.ai-meta-label {
    font-weight: var(--font-weight-medium);
    color: var(--color-text-muted);
    white-space: nowrap;
}
.ai-meta-sep {
    grid-column: span 2;
    border: none;
    border-top: 1px solid var(--color-border);
    margin: 0.25rem 0;
}
.ai-meta-code {
    font-family: monospace;
    font-size: var(--font-size-xs);
    word-break: break-all;
    background: var(--color-bg-card);
    padding: 0.1rem 0.3rem;
    border-radius: var(--border-radius-sm);
}
.ai-meta-prompt {
    white-space: pre-wrap;
    word-break: break-word;
}

/* Level badge pill — uppercase, tracking, tabular numerics for legibility in dense tables */
.log-badge {
    display: inline-block;
    padding: 0.15rem 0.55rem;
    border-radius: 999px;
    font-size: 0.7rem;
    font-weight: 700;
    white-space: nowrap;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    line-height: 1.5;
}
/* INFO badge uses the success palette by design — INFO is a "good" signal here.
   critical / security stay hardcoded because their high-contrast appearance is
   intentional and works in both light and dark modes (strong red / strong orange). */
.log-badge-info     { background: var(--color-success-bg); color: var(--color-success); }
.log-badge-warn     { background: var(--color-warning-bg); color: var(--color-warning); }
.log-badge-error    { background: var(--color-danger-bg);  color: var(--color-danger); }
.log-badge-critical { background: #f44336; color: #fff; }
.log-badge-security { background: #e65100; color: #fff; }
.log-badge-audit    { background: var(--color-info-bg);    color: var(--color-info-text); }

/* Message cell truncates on long lines */
.log-msg {
    max-width: 40vw;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

/* Detail row — hidden by default, toggled by JS */
.log-detail-row { background-color: var(--color-bg); }
.log-detail-row td { padding: 1rem 1.25rem; }
.log-detail-row--hidden { display: none; }

/* Key/value fields inside the detail row */
.log-detail-grid {
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
    font-size: var(--font-size-sm);
}
.log-detail-item {
    line-height: 1.4;
}
.log-detail-stack {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    margin-top: 0.25rem;
}
.log-detail-label {
    font-weight: var(--font-weight-medium);
    color: var(--color-text-muted);
    white-space: nowrap;
    margin-right: 0.25rem;
}
.log-detail-grid pre {
    margin: 0;
    white-space: pre-wrap;
    word-break: break-all;
    font-family: monospace;
    font-size: var(--font-size-xs);
    background: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    padding: 0.5rem 0.625rem;
    max-height: 12rem;
    overflow-y: auto;
}

/* LogViewer purge-days select sits inline next to the Delete button */
.lv-purge-select {
    width: auto;
    display: inline-block;
}

/* Pager controls (used by LogViewer + ContactUsViewer — both display
   screen-width tables with no other content beside the pager row). */
.log-pager {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    padding: 0.5rem 0;
    font-size: var(--font-size-sm);
}

.log-table { min-width: 640px; }

.login-links {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-wrap: wrap;
    gap: 0 0.3rem;
    font-size: var(--font-size-sm);
}

/* IP address display under password — small muted note */
.login-ip-display {
    font-size: 0.7rem;
    text-align: center;
    margin: 0.25rem 0 0;
    color: var(--color-text-light);
}

/* ── Sign in with Google row (Login.aspx) ──────────────────────────
   The Login button sits full-width on its own line; the GIS button sits
   on the next line, centered. Google's button renders inside a sandboxed
   iframe at its own intrinsic width (we can't restyle its surface), so we
   just center the iframe under the full-width Login button. Shared by all
   4 sites. */
.login-google-row {
    display: flex;
    justify-content: center;
}

/* ── Sign in with Google "shell" (Login.aspx) ──────────────────────
   We can't make the sandboxed GIS iframe stretch full-width or take the
   Login button's 6px corners. Instead we wrap it in a shell that DOES
   take those — a full-width, white, rounded, bordered box matching the
   Login button's height — and center the Google widget inside it. The
   shell border uses Google's own outline gray (#dadce0) so the widget's
   inner border blends, and the whole thing reads as one full-width
   "Sign in with Google" button aligned with the Login button above. */
.login-google-shell {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    min-height: 44px;                 /* match .button touch-target height */
    padding: 0.25rem 0.5rem;
    background-color: #ffffff;
    border: 1px solid #dadce0;        /* Google GIS outline gray */
    border-radius: var(--btn-radius, 6px);
    box-shadow: var(--shadow-btn, 0 1px 2px rgba(0,0,0,0.15));
    box-sizing: border-box;
}
/* The GIS widget keeps a faint white inner surface; against the white
   shell it disappears, leaving the shell as the visible button frame. */
.login-google-shell > div { max-width: 100%; }
/* In dark mode keep the shell white so the Google widget (which always
   renders on white) sits on a matching surface rather than a dark seam. */
[data-theme="dark"] .login-google-shell {
    background-color: #ffffff;
    border-color: #dadce0;
}

/* ── 34. Trips page ──────────────────────────────────────────── */

/* Trip selection list */
.trip-list {
    list-style: none;
    margin: 0 0 0.5rem 0;
    padding: 0;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    overflow: hidden;
}
/* Belt-and-suspenders: suppress UA list styling on li directly */
.trip-list li {
    list-style: none;
    padding-left: 0;
}

.trip-list-item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.55rem 1rem;
    cursor: pointer;
    border-bottom: 1px solid var(--color-border);
    transition: background-color var(--transition-fast), padding-left var(--transition-fast);
    user-select: none;
    min-height: 52px;
    -webkit-tap-highlight-color: transparent;
    position: relative;
}
.trip-list-item:last-child { border-bottom: none; }
.trip-list-item:hover       { background-color: var(--color-primary-light); padding-left: 1.15rem; }
.trip-list-item:active      { background-color: var(--color-primary-light); }
.trip-list-item:focus       { outline: 2px solid var(--color-border-focus); outline-offset: -2px; }

/* Text content stacks vertically inside the flex row */
.trip-item-text {
    display: flex;
    flex-direction: column;
    gap: 0.05rem;
    flex: 1;
    min-width: 0;
}

/* Radio indicator — the row's PRIMARY affordance. A trip row selects; it does not
   open. It used to carry a CSS chevron here instead, which is the universal "this
   navigates" signal and was the single loudest thing telling users the wrong story
   about what a tap does. The radio says "one of these is chosen" before the tap, and
   the .trip-item-open button beside it carries the navigation the chevron promised. */
.trip-item-radio {
    flex-shrink: 0;
    width: 1.05rem;
    height: 1.05rem;
    border-radius: 50%;
    border: 2px solid var(--color-text-light);
    background: var(--color-bg-card);
    transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
}
.trip-list-item:hover .trip-item-radio { border-color: var(--color-primary); }
.trip-list-item.trip-selected .trip-item-radio {
    border-color: var(--color-primary);
    /* Inset ring draws the filled dot without a second element. */
    box-shadow: inset 0 0 0 3px var(--color-primary);
}

/* "Selected" badge. Rendered on EVERY row and revealed by the selected class, so the
   selection is styling-only and the JS that moves .trip-selected needs to know nothing
   about it. display:none also keeps the 9 unselected copies out of the a11y tree. */
.trip-item-selected-badge {
    display: none;
    align-self: flex-start;
    background: var(--color-primary);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
    border-color: var(--color-primary);
}
.trip-list-item.trip-selected .trip-item-selected-badge { display: inline-flex; }

/* .trip-item-text is a COLUMN flex container, so every pill inside it — the
   JS-inserted .trip-badge ("In 11 days"), the 🔗 Shared pill, and the Selected badge
   above — is a flex ITEM and inherits align-items:stretch. All three were written to
   sit INLINE after the trip name (hence .trip-badge's margin-left), so each was being
   blown out to the full width of the row: a 900px-wide "In 11 days" lozenge. Pin them
   to the start and drop the indent that only made sense inline. Scoped to the trip list
   so nothing else that uses .pill / .trip-badge is affected. */
.trip-item-text > .trip-badge,
.trip-item-text > .trip-item-nodates,
.trip-item-text > .trip-item-shared {
    align-self: flex-start;
    margin-left: 0;
}

/* Open — the separate, explicit navigation action. Kept out of .trip-item-text so a
   long trip name wraps against it instead of pushing it off the row. */
.trip-item-actions {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: 0.4rem;
}
/* .trip-item-edit is the ✎ link added 2026-09-08 beside Open — the visible route to
   Edit Trip, which until then existed only as a press-and-hold / double-click on the
   row. Same nowrap rule: both sit in the fixed-width actions cell and a wrapped
   two-line button would push the trip name's column around. */
.trip-item-open,
.trip-item-edit { white-space: nowrap; }

/* Selected trip highlight */
.trip-list-item.trip-selected {
    background-color: var(--color-primary-light);
    border-left: 3px solid var(--color-primary);
    padding-left: calc(1rem - 3px);
}

/* "Selected trip: …" bar at the top of the trips card (trips-page.js renderSelectedBar).
   Sits ABOVE the search box and the filter chips because it is the one statement about
   the selection that those controls cannot hide. */
.trip-selected-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.4rem;
    margin: 0 0 0.75rem;
    padding: 0.5rem 0.75rem;
    border-radius: var(--border-radius, 0.5rem);
    background-color: var(--color-primary-light);
    border-left: 3px solid var(--color-primary);
    font-size: var(--font-size-sm);
}
/* Nothing selected. Deliberately quiet — it is a statement of fact, not a problem, so it
   drops the accent color rather than escalating to a warning panel. */
.trip-selected-bar.is-empty {
    background-color: transparent;
    border-left-color: var(--color-border);
    color: var(--color-text-muted);
    font-style: italic;
}
.trip-selected-bar-label { color: var(--color-text-muted); }
.trip-selected-bar-name  { font-weight: var(--font-weight-medium); color: var(--color-text); }

/* Brief highlight after "Show in list" scrolls the row back into view — a list of ten
   near-identical rows needs the eye pointed at the right one. Ends on the row's own
   selected background, so nothing has to clean the class up afterwards. */
@keyframes trip-flash {
    from { background-color: var(--color-primary); }
    to   { background-color: var(--color-primary-light); }
}
.trip-list-item.trip-flash { animation: trip-flash 1.2s ease-out 1; }
@media (prefers-reduced-motion: reduce) {
    .trip-list-item.trip-flash { animation: none; }
}

/* The row-level hint above the list ("Tap a trip to select it…"). Explains the
   select-don't-open model in words, next to where it applies. */
.trip-list-hint {
    margin: 0 0 0.5rem;
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}

.trip-item-name {
    font-weight: var(--font-weight-medium);
    color: var(--color-text);
    font-size: var(--font-size-base);
}
.trip-item-dates {
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}

/* Occupies the .trip-item-dates slot on a trip that has no Leaving/Return date, so the
   row never renders with a silently missing date line — which read as "this trip didn't
   save". Emitted server-side (Trips.aspx.vb BuildListItemHtmlFromEval), NOT by the
   countdown-badge JS, and deliberately NOT classed .trip-badge: renderTripBadges guards
   with `!nameEl.parentElement.querySelector('.trip-badge')`, so borrowing that class
   would suppress a real countdown on any row that ever had both.
   Lives HERE rather than in a site's own styles.css because .pill (above, same file)
   would otherwise win on source order at equal specificity and restore the pointer
   cursor + card background — the trap .trip-item-shared already falls into. */
.trip-item-nodates {
    margin-top: 0.15rem;
    background: var(--color-bg);
    color: var(--color-text-muted);
    border: 1px dashed var(--color-border);
    /* Static marker, not a control — .pill's cursor:pointer/hover would promise a click. */
    cursor: default;
}
.trip-item-nodates:hover { border-color: var(--color-border); }
.trip-item-counts {
    color: var(--color-text-muted);
    font-size: var(--font-size-xs);
}

/* Tag group accordion */
.tag-group {
    border-bottom: 1px solid var(--color-border);
}
.tag-group:last-child { border-bottom: none; }

.tag-group-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    padding: 0.625rem 0.25rem;
    background: none;
    border: none;
    cursor: pointer;
    text-align: left;
    font-family: var(--font-family);
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    color: var(--color-text);
    user-select: none;
}
.tag-group-header:hover { color: var(--color-primary); }
.tag-group-header:focus { outline: 2px solid var(--color-border-focus); outline-offset: 2px; }

.tag-group-label { flex: 1; }

/* Subdued suffix of a tag-group label (the " - subtype" portion after " - "). */
.tag-group-label-subdued {
    font-weight: 300;
    opacity: 0.55;
}

.tag-group-count {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    font-weight: normal;
    margin-right: 0.5rem;
    flex-shrink: 0;
}

.tag-group-arrow {
    font-size: 0.6rem;
    color: var(--color-text-muted);
    transition: transform var(--transition-fast);
    flex-shrink: 0;
}

.tag-group-body {
    display: none;
    flex-wrap: wrap;
    gap: 0.5rem;
    padding: 0.5rem 0.25rem 0.75rem;
}
.tag-group-body.open { display: flex; }

/* Explanatory line inside a tag group, rendered AFTER the pills (Quicklist's Who
   group; RenderTagAccordion queues it as that group's footer). The body is a
   flex-wrap ROW, so a bare <p> in it is just another flex item and would sit
   BESIDE a short pill row; flex-basis 100% is what forces it onto its own line
   under the last pill. margin-top instead of the .mb-2 it carried while it
   rendered above them. */
.tag-group-note {
    flex: 0 0 100%;
    margin: 0.25rem 0 0;
}

/* Tag pill — replaces checkbox+label; gray unselected, lime green selected */
.tag-pill {
    display: inline-flex;
    align-items: center;
    padding: 0.4rem 0.9rem;
    min-height: 36px;
    border-radius: 999px;
    border: 1.5px solid var(--color-border);
    background-color: var(--color-bg);
    color: var(--color-text-muted);
    font-family: var(--font-family);
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-normal);
    cursor: pointer;
    user-select: none;
    white-space: nowrap;
    transition: background-color var(--transition-fast),
                border-color    var(--transition-fast),
                color           var(--transition-fast),
                transform       var(--transition-fast),
                box-shadow      var(--transition-fast);
    -webkit-tap-highlight-color: transparent;
}
.tag-pill:hover {
    border-color: var(--color-save-btn);
    color: var(--color-text);
    transform: translateY(-1px);
    box-shadow: var(--shadow-sm);
}
.tag-pill:active { transform: translateY(0); }
.tag-pill.selected {
    background-color: var(--color-save-btn);
    border-color:     var(--color-save-btn);
    color: #111;    /* was white: 2.1 to 1 on the green. Dark, as on the green Save buttons (UI review, PacklistPRO Site-2) */
    font-weight: var(--font-weight-medium);
    box-shadow: 0 2px 6px -2px color-mix(in srgb, var(--color-save-btn) 60%, transparent);
}
.tag-pill.selected:hover {
    background-color: var(--color-save-btn-hover);
    border-color:     var(--color-save-btn-hover);
}
.tag-pill:focus-visible {
    outline: none;
    box-shadow: var(--shadow-focus-ring);
}

/* Inline message near save buttons */
.trip-section-msg {
    display: none;
    font-size: var(--font-size-sm);
    margin-top: 0.5rem;
}

/* Trip Link Code share row: read-only code field + Copy button.
   Read-only state gets a "code-y" treatment (monospace, slightly tinted bg) so the
   value reads as a token to copy rather than an editable field. */
.share-link-row {
    display: flex;
    gap: 0.5rem;
    align-items: stretch;
    max-width: 480px;
}
.share-link-input {
    font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
    font-size: var(--font-size-sm);
    letter-spacing: 0.04em;
    background: var(--color-primary-light);
    border-color: color-mix(in srgb, var(--color-primary) 30%, var(--color-border));
    cursor: text;
    /* Disable the muted/gray "disabled" look — read-only is intentional, not disabled */
    opacity: 1 !important;
    color: var(--color-text);
    flex: 1;
    min-width: 0;
}
.share-link-input:read-only {
    background: var(--color-primary-light);
    color: var(--color-text);
}
/* The class also sizes the boxes that share a row with a button on the Trip Link card. A list
   of NAMES and an EMAIL address are not codes: they read in the page's own font, at the size
   every other box has (owner, 2026-10-11: "is the font different in the drop-down of names?"). */
select.share-link-input,
input[type="email"].share-link-input {
    font-family: inherit;
    font-size: max(16px, var(--font-size-base, 1rem));
    letter-spacing: normal;
}
[data-theme="dark"] .share-link-input {
    background: color-mix(in srgb, var(--color-primary) 18%, var(--color-bg-input));
}
.share-link-copy {
    flex-shrink: 0;
    align-self: stretch;
    /* Match the input height precisely so they align */
    min-height: var(--input-height);
}

/* Circled-i info toggle button — uses CSS to avoid Unicode font issues */
.btn-info-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.25rem;
    height: 1.25rem;
    border-radius: 50%;
    border: 1.5px solid var(--color-text-muted);
    background: none;
    cursor: pointer;
    font-size: 0.75rem;
    font-style: italic;
    font-weight: 700;
    line-height: 1;
    color: var(--color-text-muted);
    padding: 0;
    flex-shrink: 0;
    transition: color var(--transition-fast), border-color var(--transition-fast);
    vertical-align: middle;
}
.btn-info-toggle:hover { color: var(--color-primary); border-color: var(--color-primary); }
.btn-info-toggle:focus { outline: 2px solid var(--color-border-focus); outline-offset: 2px; }

/* Trip list pager */
.trip-pager-controls {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    margin-top: 0.5rem;
}
/* Row of action + quick-jump buttons under the Trips card */
.trip-quick-nav {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
    align-items: center;
    margin-top: 0.75rem;
}

/* Trips card fills available viewport height so the list isn't sitting in
   a tiny card with empty space below. Offset is approximate — leaves room
   for the site nav, page header, tips toggle, and the bottom button row. */
.trips-card-fill {
    min-height: calc(100vh - 18rem);
}

/* Trips search row: textbox + emoji button on the same line */
.trips-search-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
    margin-bottom: 0.75rem;
}
.trips-search-input {
    flex: 1;
    min-width: 180px;
}
.trips-search-results {
    display: none;
    margin: 0 0 0.5rem;
}
.trips-search-results.has-results { display: block; }

/* Page title with no bottom margin (when sitting next to a right-aligned
   action button — collapses the gap below for a tighter header). */

/* Inside collapsible card-section toggles, the heading span should be
   flush with the toggle arrow — clear its default margin. */
.card-section-toggle .heading { margin: 0; }
.trip-pager-info {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    white-space: nowrap;
}
@media (max-width: 575px) {
    .trip-pager-nav { flex-basis: 100%; }
}


/* ── 37. Duplicate Record Finder ─────────────────────────────── */

.drf-section { margin-bottom: 1.5rem; }

.drf-section-title {
    padding-bottom: 0.375rem;
    border-bottom: 2px solid var(--color-border);
    margin: 0 0 0.75rem 0;
}

.drf-group {
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    overflow: hidden;
    margin-bottom: 0.875rem;
}

/* Matching-method picker (checkbox list, one method per line) */
.drf-passes {
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    padding: 0.75rem 1rem;
    margin: 0.5rem 0 1rem 0;
}
.drf-passes legend { padding: 0 0.375rem; }
.drf-pass-list label {
    display: block;
    padding: 0.2rem 0;
    font-size: var(--font-size-sm);
    cursor: pointer;
}
.drf-pass-list input[type="checkbox"] { margin-right: 0.5rem; }

/* Confidence badge on each group. Color is a reading aid only - the number itself
   is the signal, and the caveat beside it says what moved it. */
.drf-conf-bar {
    padding: 0.375rem 0.75rem;
    border-bottom: 1px solid var(--color-border);
    background: var(--color-bg);
}
.drf-conf {
    display: inline-block;
    padding: 0.1rem 0.5rem;
    border-radius: 999px;
    font-size: var(--font-size-xs);
    font-weight: 600;
    border: 1px solid transparent;
}
.drf-conf-high { background: var(--color-success-bg,  #e6f4ea); color: var(--color-success-text, #1b5e20); }
.drf-conf-med  { background: var(--color-warning-bg,  #fdf3e0); color: var(--color-warning-text, #7a4b00); }
.drf-conf-low  { background: var(--color-danger-bg,   #fdecea); color: var(--color-danger-text,  #7a1c14); }
.drf-conf-note { margin-left: 0.25rem; }

/* Results table */
.drf-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--font-size-sm);
}
.drf-table th {
    padding: 0.4rem 0.75rem;
    background: var(--color-bg);
    text-align: left;
    border-bottom: 1px solid var(--color-border);
    white-space: nowrap;
    font-weight: var(--font-weight-medium);
}
.drf-table td {
    padding: 0.45rem 0.75rem;
    border-bottom: 1px solid var(--color-border);
    vertical-align: middle;
}
.drf-table tbody tr:last-child td { border-bottom: none; }
.drf-table tbody tr:hover td { background: var(--color-bg); }

.drf-th-check    { width: 2rem; }
.drf-th-children { width: 5.5rem; text-align: center; }
.drf-td-children { text-align: center; }

/* Duplicate Record Finder results header row */
.drf-results-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-bottom: 0.75rem;
}
.drf-results-heading { margin: 0; }
/* Merge options: decisions made once, before working through the groups. Kept out of the
   sticky bar below so that bar can stay one line tall. */
.drf-merge-options {
    padding: 0.5rem 0 0.75rem 0;
    border-bottom: 1px solid var(--color-border);
    margin-bottom: 0.75rem;
}

/* ⚠ STICKY, and it only works because html/body carry `overflow-x: clip`. `overflow-x:
   hidden` would make body a scroll container and silently kill every sticky element on the
   page — that exact bug was fixed across all five sites; do not reintroduce it.
   `bottom: 0` (not `position: fixed`) means the bar rides the viewport bottom while the
   results card scrolls, then settles at the card's end instead of covering the footer.
   The negative margins pull it out to the card's padding edges so it reads as a bar. */
/* ⚠ COMPOUND selectors below, and that is specificity — not fussiness.
   `.drf-delete-actions` alone (0,1,0) LOSES to two rules that both apply to this element:
   the `.form-actions { flex-direction: column }` mobile stack lives further DOWN this same
   sheet (~line 7500), so it wins an equal-specificity tie on source order; and PacklistPRO's
   own sheet carries `.form-actions:not(.form-actions-centered):not(.de-modal-actions) >
   .button` at (0,4,0), which outranks anything with fewer classes.
   Measured: with the bare selectors the bar still computed `flex-direction: column` and
   198px tall. Same trick, and the same reason, as `.form-actions.sl-actions` in
   PacklistPRO/Content/styles.css. */
.form-actions.drf-delete-actions {
    position: sticky;
    bottom: 0;
    /* Above the group cards, far below .back-to-top / the PWA install pill at 9998. */
    z-index: 20;
    margin-top: 1rem;
    display: flex;
    /* ROW, explicitly. The design system stacks `.form-actions` into a COLUMN below the
       tablet breakpoint — correct for an ordinary form, wrong for a bar pinned to the bottom
       of the viewport: at a 584px-wide window it made this bar a THIRD of the visible page. */
    flex-direction: row;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
    background: var(--color-bg-card, #ffffff);
    border-top: 1px solid var(--color-border);
    /* Right padding clears the fixed .back-to-top button (right: 1rem, 2.85rem wide) and the
       PWA install pill, which stack in the same corner at z-index 9998 and would otherwise
       sit on top of whatever wrapped onto the bar's last row. */
    padding: 0.625rem 4.25rem 0.625rem 0.75rem;
    margin-left: calc(var(--card-padding, 1rem) * -1);
    margin-right: calc(var(--card-padding, 1rem) * -1);
    margin-bottom: calc(var(--card-padding, 1rem) * -1);
    border-bottom-left-radius: var(--border-radius, 8px);
    border-bottom-right-radius: var(--border-radius, 8px);
    box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.06);
}
/* Content-width buttons — the same mobile rules that set the column direction also stretch
   them to 100% / `flex: 1 1 100%`. `.main-card` is in the selector purely to reach (0,4,0)
   and beat PacklistPRO's `:not():not() > .button`; the bar is always inside the results card. */
.main-card .form-actions.drf-delete-actions > [class*="button"] {
    width: auto;
    flex: 0 0 auto;
}
/* Deliberately NOT `margin-left: auto`: pushing the count to the right edge parks it under
   the back-to-top / install-pill furniture on narrow screens. Everything stays left. */
.drf-sel-count {
    white-space: nowrap;
}

@media (max-width: 575.98px) {
    .form-actions.drf-delete-actions {
        padding: 0.5rem 3.75rem 0.5rem 0.5rem;
        gap: 0.375rem;
    }
    .main-card .form-actions.drf-delete-actions > [class*="button"] {
        padding: 0.35rem 0.6rem;
        font-size: var(--font-size-sm);
    }
}
.drf-sel-count-active {
    font-weight: 600;
    color: var(--color-text);
}

/* "Update Keywords" sits under the master radio, on its own line. The compound selector
   matches `.drf-master-bar .drf-master-opt` in the per-site sheets at (0,2,0) and, because
   the shared bundle loads last, wins the cascade without an !important. */
.drf-master-bar .drf-keywords-opt {
    display: flex;
    align-items: flex-start;
    gap: 0.35rem;
    margin-top: 0.25rem;
}
.drf-master-bar .drf-keywords-opt input[type="checkbox"] {
    flex: 0 0 auto;
    margin-top: 0.15rem;
}

/* The option's NAME must never break away from its checkbox. A flex label puts bare text
   nodes in their own flex items that wrap independently, which is how "Update Keywords"
   ended up stacked as "Update / Keywords" beside its note. One span holds all the text; the
   name gets nowrap so only the note is allowed to wrap. */
.drf-opt-text {
    display: block;
    min-width: 0;
}
.drf-opt-name {
    white-space: nowrap;
    font-weight: 600;
}
.drf-fill-blanks {
    display: flex;
    align-items: flex-start;
    gap: 0.4rem;
    width: 100%;
    font-size: var(--font-size-sm);
    cursor: pointer;
}
.drf-fill-blanks input[type="checkbox"] {
    flex: 0 0 auto;
    margin-top: 0.15rem;
}
/* ⚠ There is deliberately NO dimmed/disabled state here. An earlier version grayed the box
   out until the card had a master; across a long result list that meant EVERY box on the
   page rendered dim, which reads as "the feature is missing" rather than "not applicable
   yet". The label's "needs a master" note carries that instead. */
.drf-confirm-msg {
    margin-top: 0.5rem;
    line-height: 1.6;
}

/* Warning icon for rows with children */
.drf-warn-icon {
    color: var(--color-warning);
    font-size: 0.9rem;
}

/* "Not duplicates" marks. A marked card stays in place and fades rather than being
   removed: the operator is working down a long list by eye, and a card vanishing under
   the cursor loses their place. It is committed on Save marks, not on click. */
.drf-mark-bar {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    padding: 0.25rem 0.75rem 0.375rem 0.75rem;
    border-bottom: 1px solid var(--color-border);
    background: var(--color-bg);
}
.drf-mark-btn {
    padding: 0.1rem 0.5rem;
    font-size: var(--font-size-xs);
}
.drf-mark-flag {
    display: inline-block;
    padding: 0.1rem 0.5rem;
    border-radius: 999px;
    font-size: var(--font-size-xs);
    font-weight: 600;
    background: var(--color-surface-muted, #eee);
    color: var(--color-text-muted, #555);
}
.drf-group.drf-marked {
    opacity: 0.45;
}
.drf-group.drf-marked .drf-mark-btn {
    opacity: 1;
}

/* The search option that brings marked pairs back so one can be restored. */
.drf-master-note {
    display: block;
    padding: 0.125rem 0 0.25rem 1.5rem;
}

.drf-dismiss-option {
    margin: 0 0 0.75rem 0;
}

[data-theme="dark"] .drf-mark-flag { background: #2a2a2a; color: #bbb; }
[data-theme="dark"] .drf-mark-bar  { border-bottom-color: #444; }

/* Dark mode adjustments */
[data-theme="dark"] .drf-group    { border-color: #444; }
[data-theme="dark"] .drf-table th { background: #1e1e1e; }

/* ── Collapsible card sections (Trips page) ──────────────────────────────── */

/* Heading wrapper around .card-section-toggle — gives screen readers a proper
   heading landmark for each accordion section (WAI-ARIA accordion pattern) while
   keeping the button itself as the interactive control. Resets the browser's
   default h2 margins/font so the visible layout is identical to the bare button. */
.card-section-heading {
    margin: 0;
    font-size: inherit;
    font-weight: inherit;
    line-height: inherit;
}

.card-section-toggle {
    display: flex;
    align-items: center;
    justify-content: space-between;
    width: 100%;
    background: none;
    border: none;
    padding: 0.15rem 0;
    cursor: pointer;
    text-align: left;
    margin: -0.15rem 0;
    border-radius: var(--border-radius-sm);
    transition: color var(--transition-fast);
}
.card-section-toggle:hover .heading,
.card-section-toggle:hover .card-section-arrow { color: var(--color-accent); }
.card-section-toggle:focus-visible { outline: none; box-shadow: var(--shadow-focus); }

/* Selected-count summary beside a card-section heading (e.g. Trip Tags "3 selected").
   margin-right:auto hugs the count to the heading and pushes the arrow to the far
   right, overriding the toggle's space-between for this three-child case. */
.card-section-count {
    margin-left: 0.5rem;
    margin-right: auto;
    font-size: var(--font-size-xs);
    font-weight: normal;
    color: var(--color-text-muted);
}

.card-section-body {
    display: none;
    padding-top: 0.85rem;
    /* Smooth reveal — opacity transitions from 0 to 1 as the body opens. The display
       toggle still snaps (CSS can't animate display:none), but the fade softens the
       transition for the user. */
    animation: cardSectionFade 0.22s var(--ease-out-quint);
}
.card-section-body.open { display: block; }
@keyframes cardSectionFade {
    from { opacity: 0; transform: translateY(-2px); }
    to   { opacity: 1; transform: translateY(0); }
}

.card-section-arrow {
    /* Unicode chevron replaced with a CSS-drawn arrow so it tints with currentColor
       (matches heading hover color) without a font fallback gamble. */
    display: inline-block;
    width: 0.7rem;
    height: 0.7rem;
    flex-shrink: 0;
    margin-left: 0.6rem;
    border-right: 2px solid var(--color-text-muted);
    border-bottom: 2px solid var(--color-text-muted);
    transform: rotate(45deg); /* collapsed: pointing DOWN (flipped 2026-10-10, UI review Site-67) */
    transition: transform var(--transition-mid), border-color var(--transition-fast);
}
.card-section-arrow::before { content: ""; }
.card-section-toggle[aria-expanded="true"] .card-section-arrow {
    transform: rotate(-135deg);  /* expanded: pointing UP */
}
.card-section-toggle:hover .card-section-arrow { border-color: var(--color-accent); }

[data-theme="dark"] .card-section-toggle:hover .heading { color: var(--color-accent); }

/* ── Trip Dashboard page ─────────────────────────────────────────────────── */

/* Card heading link — inherits size/weight, subtle dashed underline */
.card-title-link {
    color: inherit;
    text-decoration: none;
    border-bottom: 1px dashed var(--color-accent);
}
.card-title-link:hover {
    color: var(--color-accent);
    border-bottom-color: transparent;
}

/* Disabled card heading (e.g. Expenses placeholder) */
.card-title-disabled {
    color: var(--color-text-muted);
    cursor: default;
}

/* Notes summary list */
.tripdashboard-notes-list {
    list-style: none;
    margin: 0.5rem 0 0;
    padding: 0;
}
.tripdashboard-note-item {
    display: flex;
    flex-direction: column;
    padding: 0.4rem 0;
    border-bottom: 1px solid var(--color-border);
}
.tripdashboard-note-item:last-child {
    border-bottom: none;
}
.tripdashboard-note-title {
    font-size: var(--font-size-sm);
    font-weight: 700;
}
.tripdashboard-note-date {
    color: var(--color-text-muted);
    margin-top: 0.1rem;
}

/* TripDashboard trip name header — heading line is flush, dates sit immediately below */
.tripdashboard-trip-heading { margin: 0; }
.tripdashboard-trip-subline { margin: 0.1rem 0 0; }

/* Previous trip sub-cards */
.prev-trip-item {
    border-left: 3px solid var(--color-accent);
    padding: 0.5rem 0.75rem;
    margin-bottom: 0.75rem;
    background: #f8f9fa;
    border-radius: 0 var(--border-radius-sm) var(--border-radius-sm) 0;
}
.prev-trip-item:last-child {
    margin-bottom: 0;
}

[data-theme="dark"] .prev-trip-item {
    background: #1e1e1e;
}

/* Help page step list — extra breathing room between steps + brand-tinted numbers */
.help-steps { padding-left: 1.5rem; }
.help-steps li { margin-bottom: 0.95rem; line-height: 1.55; }
.help-steps li:last-child { margin-bottom: 0; }
.help-steps li::marker { color: var(--color-accent); font-weight: 700; }

/* ── MessageSent confirmation hero (cross-site) ──────────────────────────────
   Shared so every site's post-ContactUs "Message Sent" page renders the same
   celebratory hero. Reuses shared tokens so it's theme-aware; the only bespoke
   piece is the success-tinted check badge. .ms-detail-text carries the muted
   follow-up paragraph (constrained for readable line length when centered). */
.ms2-hero { padding-top: var(--card-padding-lg); padding-bottom: var(--card-padding-lg); }
.ms2-check {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 4.25rem;
    height: 4.25rem;
    margin: 0 auto 0.85rem;
    border-radius: 50%;
    background: var(--color-success-bg);
    color: var(--color-success);
    border: 1px solid var(--color-success-border);
    font-size: 2.1rem;
    line-height: 1;
    box-shadow: var(--shadow-sm);
    animation: ms2CheckPop 0.28s var(--ease-out-back, ease-out) both;
}
.ms2-headline { margin: 0 0 0.5rem; }
.ms2-hero .ms-detail-text { max-width: 46ch; margin-left: auto; margin-right: auto; }
@keyframes ms2CheckPop {
    from { opacity: 0; transform: scale(0.6); }
    to   { opacity: 1; transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) {
    .ms2-check { animation: none; }
}

/* Error.aspx layout */
.error-card {
    max-width: 640px;
    margin: 2rem auto;
}
.error-detail-pre {
    background: #f5f5f5;
    padding: 1rem;
    border-radius: 4px;
    overflow-x: auto;
    font-size: 0.8rem;
    white-space: pre-wrap;
    word-break: break-word;
    max-height: 400px;
    overflow-y: auto;
}
[data-theme="dark"] .error-detail-pre { background: #1e1e1e; }
.error-cid {
    font-size: 1rem;
    user-select: all;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    background: var(--color-bg);
    padding: 0.125rem 0.375rem;
    border-radius: var(--border-radius-sm);
    border: 1px solid var(--color-border);
}

/* Message Sent confirmation page */
.ms-message-banner { margin-bottom: 1.25rem; }
.ms-action-row { margin-top: 1.5rem; }

/* ContactUsStatus detail panel */
.cus-detail-header {
    display: flex;
    justify-content: flex-end;
    margin-bottom: 0.5rem;
}
.cus-section { margin-top: 0.75rem; }
.cus-section-thin { margin-top: 0.25rem; }
.cus-block {
    margin-top: 0.25rem;
    padding: 0.5rem;
    border: 1px solid var(--color-border);
    border-radius: 4px;
    max-height: 300px;
    overflow-y: auto;
}
.cus-pre { white-space: pre-wrap; }
.cus-pre-inline { white-space: pre-wrap; }
.cus-reply { margin-top: 0.25rem; }

/* ── Toast (PLP.showToast) ─────────────────────────────────────
   Slides down + fades in on appearance, then fades out before removal (handled
   in site.js by setting opacity=0). The toast shares the SAME solid color palette
   as .alert-panel.* (success/error/warning/info) but gets a brighter shadow
   because it floats above all chrome. */
/* Toast stack container — fixed-position column that holds 1..N toasts.
   Each toast inside is normal flow, so simultaneous toasts stack vertically
   instead of stacking visually at the same coordinates. pointer-events: none
   on the container lets clicks pass through the empty space; toasts themselves
   re-enable interactivity. */
.site-toast-stack {
    position: fixed;
    top: calc(var(--nav-height, 56px) + 14px);
    left: 50%;
    transform: translateX(-50%);
    z-index: 9999;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    max-width: min(92vw, 560px);
    width: max-content;
    pointer-events: none;
}
.site-toast {
    position: relative;
    min-width: 280px;
    max-width: min(92vw, 560px);
    padding: 0.75rem 2.25rem 0.75rem 1.25rem;
    border-radius: var(--border-radius);
    font-size: var(--font-size-sm);
    box-shadow: var(--shadow-lg);
    transition: opacity 0.4s, transform 0.4s;
    animation: toastIn 0.28s var(--ease-out-quint);
    pointer-events: auto;
    /* A click ANYWHERE on the toast dismisses it — exactly what the × does — so the
       whole body is a pointer target. The RED error/danger toasts opt out just below:
       they are the one message the user has to finish reading, so a stray click must
       not wipe them off screen and only their × closes them. Identical rule on all
       five sister sites; the click handler itself is in each Scripts/site.js. */
    cursor: pointer;
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    text-align: center;
}
/* Solid toast palette — the SAME fixed colors as .alert-panel.* above, so an
   inline message and its floating-toast twin are identical. Theme-independent
   (light = dark); #111 text on lime/orange/cyan, WHITE on the red error/danger. */
.site-toast.toast-success { background: #00ff00; color: #111; border: 1px solid rgba(0,0,0,0.28); }
.site-toast.toast-error,
.site-toast.toast-danger  { background: #ff0000; color: #fff; border: 1px solid rgba(0,0,0,0.28); }
.site-toast.toast-warning { background: #ff9600; color: #111; border: 1px solid rgba(0,0,0,0.28); }
.site-toast.toast-info    { background: #00B0F0; color: #111; border: 1px solid rgba(0,0,0,0.28); }
/* Red = the user MUST read it, so the body is not a dismiss target (site.js attaches no
   body handler for type 'error'/'danger'). The arrow cursor advertises that; the ×
   keeps its own `cursor: pointer` from .site-toast-close below, so the one control that
   DOES close a red toast still looks clickable. Compound selector = higher specificity
   than the bare .site-toast rule above, so it wins wherever it sits in the file. */
.site-toast.toast-error,
.site-toast.toast-danger  { cursor: default; }
/* Canonical dismiss animation — shared by all 3 sites' showToast() so the exit
   motion is identical. JS adds .site-toast-dismissing; the .site-toast transition
   above animates the fade + slide-up. */
.site-toast.site-toast-dismissing { opacity: 0; transform: translateY(-8px); }
.site-toast-msg  { flex: 1; min-width: 0; }
/* A link or link-button inside a toast takes the toast's text color, underlined: the
   site's link blue vanished on the cyan info toast (qMEET Alerts Bar "use Preferences.
   Undo" read as cut off, owner 2026-10-16). */
.site-toast .site-toast-msg a,
.site-toast .site-toast-msg .linklike-btn { color: inherit; text-decoration: underline; font-weight: var(--font-weight-bold, 700); }
/* "↶ Undo" inside a toast, emitted by SiteShared.UndoOffer.UndoLinkHtml. Kept on the
   LEFT, away from .site-toast-close, so dismissing the toast can never misfire the undo.
   Canonicalised here 2026-07-31 from two byte-identical per-site copies that had drifted
   only in NAME: qMEET's .qm-undo-link (preset toast) and PacklistPRO's .sl-undo-link
   (ShoppingList delete toast, still live and still using its own name). */
.undo-link { font-weight: var(--font-weight-bold, 700); margin-right: 0.6rem; }
/* Toast ACTION BUTTON — the scripted sibling of .undo-link above, added 2026-08-07 so
   PacklistPRO's showToast can carry an "Undo" for the destructive Tasklist un-tick (PL-05).
   .undo-link is server-emitted markup inside the message; this is a real <button> the toast
   builds when a caller passes {actionText, onAction}. Same placement rule and same reason:
   FIRST child, hard left, away from .site-toast-close.
   Additive only — no existing selector changed, and a toast without opts.actionText never
   gets one of these, so every other toast on all five sites renders exactly as before. */
.site-toast-action {
    flex: 0 0 auto;
    order: -1;
    margin-right: 0.6rem;
    border: 1px solid currentColor;
    background: transparent;
    color: inherit;
    font: inherit;
    font-weight: var(--font-weight-bold, 700);
    line-height: 1;
    padding: 0.25rem 0.6rem;
    border-radius: var(--radius-sm, 0.25rem);
    cursor: pointer;
}
.site-toast-action:hover { opacity: 0.8; }
.site-toast-action:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
.site-toast-close {
    position: absolute;
    top: 0.35rem;
    right: 0.45rem;
    width: 1.5rem;
    height: 1.5rem;
    border: none;
    background: transparent;
    color: currentColor;
    font-size: 1.25rem;
    line-height: 1;
    cursor: pointer;
    opacity: 0.55;
    border-radius: 50%;
    padding: 0;
    transition: opacity var(--transition-fast), background-color var(--transition-fast);
}
.site-toast-close:hover  { opacity: 1; background: rgba(0,0,0,0.08); }
/* Red error/danger toasts only: the shared 0.55 opacity above blends the × into the
   solid #ff0000 background and it reads pink, not white. These are also the ONLY
   toasts whose body does NOT dismiss on click (see the cursor:default rule above),
   so the × is the sole control — it has to be plainly visible. Full-strength white,
   and a WHITE hover wash (the shared black one darkens rather than lifts on red). */
.site-toast.toast-error   .site-toast-close,
.site-toast.toast-danger  .site-toast-close { color: #fff; opacity: 1; }
.site-toast.toast-error   .site-toast-close:hover,
.site-toast.toast-danger  .site-toast-close:hover { background: rgba(255,255,255,0.22); }
.site-toast-close:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 1px;
}
@keyframes toastIn {
    from { opacity: 0; transform: translateY(-14px); }
    to   { opacity: 1; transform: translateY(0); }
}
/* Phones only (portrait, below the tablet breakpoint): toasts span the
   available width instead of being content-sized. The stack stays centerd
   (left:50% + translateX(-50%)), so widening it to 92vw yields a symmetric
   4vw gutter on each side by construction; the toasts stretch to fill it. */
@media (max-width: 575px) {
    .site-toast-stack { width: 92vw; max-width: 92vw; }
    .site-toast       { max-width: none; min-width: 0; }
}

/* ── Back-to-top floating button ───────────────────────────────
   SMALLER AND SEE-THROUGH since 2026-10-09 (owner, first on qFIT, then all five sites):
   2.25rem across (was 2.85rem), 60% opaque until pointed at or focused. Each site's
   site.js (revealWhileScrollingUp) shows it, and the "On this page" button beside it,
   only while the page is scrolled back UP. Before that both sat over the bottom-right
   corner of the content the whole way down a page, covering right-aligned numbers and the
   last button on a phone screen.
   ⚠ The 2.25rem is repeated by .toc-btn's `right` further down (1rem + 2.25rem + 0.35rem)
   and by qMEET's own `body .toc-btn` rule (it adds the safe-area inset). Change one,
   change all three. */
.back-to-top {
    position: fixed;
    right: 1rem;
    bottom: 1rem;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 50%;
    border: none;
    background: var(--color-accent);
    /* 7.61:1 on the cyan (white was 2.48:1). :hover swaps the fill to
       --color-accent-dark and inherits this color: #111 there = 5.24:1. */
    color: #111;
    font-size: 1.2rem;
    line-height: 1;
    cursor: pointer;
    box-shadow: var(--shadow-lg);
    opacity: 0;
    pointer-events: none;
    transform: translateY(8px) scale(0.9);
    transition:
        opacity 0.25s var(--ease-out-quint),
        transform 0.25s var(--ease-out-quint),
        background-color 0.15s,
        box-shadow 0.15s;
    z-index: 9998;
}
.back-to-top.visible {
    opacity: 0.6;
    pointer-events: auto;
    transform: translateY(0) scale(1);
}
.back-to-top:hover {
    opacity: 1;
    background: var(--color-accent-dark);
    box-shadow: var(--shadow-xl);
    transform: translateY(-2px) scale(1);
}
.back-to-top:focus-visible {
    opacity: 1;
    outline: none;
    box-shadow: var(--shadow-lg), var(--shadow-focus-ring);
}
/* Room under the last line of the footer, so the end of a page can always be scrolled clear
   of the two floating buttons (1rem inset + 2.25rem button + 0.5rem). Up to the width where
   the buttons sit beside the 1200px content column and not over it. This was a phones-only
   rule (inside the 575px block, 4.25rem for the larger button) until 2026-10-09.
   🔑 `body ` is load-bearing: PacklistPRO and qMEET both set `body .site-footer` (0,1,1)
   padding in their own sheets, which a bare `.site-footer` (0,1,0) here would lose to no
   matter that this sheet loads last.
   🔑 The env() term is re-stated, not dropped: those two rules add the home-indicator inset,
   and overriding padding-bottom without it would put the footer text back under the iOS home
   bar. It collapses to 0 where there is no inset. */
@media (max-width: 1299px) {
    body .site-footer {
        padding-bottom: calc(3.75rem + env(safe-area-inset-bottom, 0px));
    }
}

/* ── Scroll progress indicator ────────────────────────────────
   Thin accent-colored bar pinned to the top of the viewport that fills
   left-to-right as the user scrolls. Driven by site.js initScrollProgress();
   CSS only handles the visual. Auto-hidden on very short pages where it
   would always sit at 100% (handled in JS by removing .visible). */
.scroll-progress-bar {
    position: fixed;
    top: 0;
    left: 0;
    height: 3px;
    width: 0;
    background: linear-gradient(90deg, var(--color-accent), var(--color-accent-dark));
    z-index: 10001;          /* above nav so it's never overlapped */
    pointer-events: none;
    transition: width 0.06s linear, opacity 0.2s ease;
    opacity: 0;
    border-bottom-right-radius: 2px;
}
.scroll-progress-bar.visible { opacity: 1; }

/* ── DataEditor admin grid (extracted from DataEditor.aspx) ──── */
.de-toolbar { display:flex; flex-wrap:wrap; gap:.5rem; align-items:flex-end; }
.de-toolbar .form-group { margin-bottom:0; }
.de-chips { display:flex; flex-wrap:wrap; gap:.4rem; margin-top:.5rem; min-height:1.5rem; }
.de-chip { display:inline-flex; align-items:center; gap:.3rem; background:var(--color-primary-light); color:var(--color-text); border:1px solid var(--color-border); border-radius:1rem; padding:.15rem .6rem; font-size:.85rem; }
.de-chip-remove { background:none; border:none; cursor:pointer; color:var(--color-text-muted); font-size:1rem; line-height:1; padding:0 .1rem; }
.de-chip-remove:hover { color:var(--color-delete-btn); }
/* Move-earlier / move-later on a column chip (PLR-368). Deliberately the same bare
   glyph-button affordance as the remove control, and placed beside it rather than in
   the per-site sheet, so all three controls in a chip read as one set. Slightly
   smaller than the remove glyph because two arrows plus a cross on one chip is a
   crowded row, and the destructive control should stay the most prominent. */
.de-chip-move { background:none; border:none; cursor:pointer; color:var(--color-text-muted); font-size:.8rem; line-height:1; padding:0 .1rem; }
.de-chip-move:hover { color:var(--color-accent); }
.de-paging { display:flex; align-items:center; gap:.75rem; flex-wrap:wrap; }
.de-table-wrap { overflow-x:auto; margin-top:.75rem; }
.de-table { border-collapse:collapse; width:100%; line-height:1; }
.de-table th { background:var(--color-bg-card); padding:1px 3px; border:1px solid var(--color-border); white-space:nowrap; text-align:left; font-weight:600; line-height:1.3; }
.de-table td { padding:0; margin:0; border:1px solid var(--color-border); vertical-align:middle; height:1.35rem; }
.de-table tr:hover td { background:var(--color-bg); }
.de-table .pk-cell { color:var(--color-text-muted); white-space:nowrap; padding:0 2px; }
.de-table .de-cell { width:100%; min-width:60px; box-sizing:border-box; padding:0 2px; margin:0; font-size:inherit; height:1.35rem; border:none; background:transparent; color:inherit; }
.de-table td:first-child { width:2rem; text-align:center; padding:0; }
.de-table thead th:first-child { border:none; background:transparent; }
.de-table input[type=checkbox] { margin:0; display:block; }
/* Spacious mode — toggled by the "Compact Rows" checkbox unchecking. Adds
   breathing room to every cell so the grid is easier to read and interact with. */
.de-spacious .de-table th  { padding: 0.45rem 0.6rem; }
.de-spacious .de-table td  { padding: 0.3rem 0.1rem; height: auto; }
.de-spacious .de-table .de-cell { padding: 0.3rem 0.5rem; height: auto; min-height: 2rem; font-size: var(--font-size-sm); }
.de-spacious .de-table .pk-cell { padding: 0.3rem 0.5rem; }
.de-spacious .de-table td:first-child { padding: 0.3rem; }
.de-save-bar { position:sticky; bottom:0; background:var(--color-bg-card); border-top:2px solid var(--color-border); padding:.6rem 1rem; display:flex; align-items:center; gap:1rem; flex-wrap:wrap; z-index:100; box-shadow:0 -2px 6px rgba(0,0,0,.08); }
.de-preview-overlay { display:none; position:fixed; inset:0; background:var(--popup-backdrop-bg); -webkit-backdrop-filter:var(--popup-backdrop-filter); backdrop-filter:var(--popup-backdrop-filter); z-index:200; overflow-y:auto; }
.de-preview-overlay.is-open { display: block; }
.de-button-row { padding-top: 1.4rem; }
.de-toolbar-spaced { margin-top: 0.75rem; }
.de-filter-input { width: 200px; }
.de-paging-spaced { margin-top: 0.5rem; }
.de-preview-toggle {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    cursor: pointer;
    margin: 0;
}
.de-preview-label { margin: 0; }
.de-preview-scroll { overflow-x: auto; }
.de-modal-actions { margin-top: 1rem; }
.de-preview-old { color: var(--color-danger); }
.de-preview-new { color: var(--color-success); }
.de-preview-box { background:var(--color-bg-card); margin:2rem auto; max-width:800px; border-radius:6px; padding:1.5rem; }
.de-preview-table { border-collapse:collapse; width:100%; font-size:.875rem; }
.de-preview-table th, .de-preview-table td { border:1px solid var(--color-border); padding:.3rem .5rem; }
.de-preview-table th { background:var(--color-bg-card); }
.de-changed { background:var(--color-warning-bg) !important; }
[data-theme="dark"] .de-chip { background:#2a3a5e; }

/* ── 38. Expenses page ─────────────────────────────────────────────────────
   List rows mirror .note-item, but each row also carries a chip-style "type"
   badge plus 1-2 status badges (Estimate / Split — Settled / Split — Owed).
   The form reuses .notes-edit-col and shared .form-row / .check-row layout. */

.exp-summary-card {
    margin-bottom: 1rem;
    /* Subtle gradient surface so the totals card visually anchors the page */
    background-image:
        radial-gradient(circle at top left,
            color-mix(in srgb, var(--color-accent) 6%, transparent) 0%,
            transparent 60%),
        linear-gradient(180deg, var(--color-bg-card), var(--color-bg-card));
}
[data-theme="dark"] .exp-summary-card {
    background-image:
        radial-gradient(circle at top left,
            color-mix(in srgb, var(--color-accent) 16%, transparent) 0%,
            transparent 60%),
        linear-gradient(180deg, var(--color-bg-card), var(--color-bg-card));
}
.exp-summary-row {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(10.5rem, 1fr));
    gap: 0.75rem 1.5rem;
    align-items: stretch;
}
.exp-summary-cell {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    padding: 0.65rem 0.9rem;
    background: color-mix(in srgb, var(--color-bg) 60%, transparent);
    border-radius: var(--border-radius-sm);
    border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
}
.exp-summary-label {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-weight: var(--font-weight-medium);
}
.exp-summary-value {
    font-size: 1.35rem;
    font-weight: 700;
    color: var(--color-text);
    font-variant-numeric: tabular-nums;
    line-height: 1.2;
}

/* ── Multi-currency summary (Expenses) ───────────────────────────────────
   Nothing on this page converts between currencies, so a trip holding more
   than one gets a figure PER currency in each money cell instead of a single
   total. The list is the total: there is deliberately no grand sum to show. */
.exp-money-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}
/* Several stacked figures in a cell that was sized for one — step the type down
   so three currencies don't push the summary card to twice its height. */
.exp-money-list .exp-summary-value { font-size: 1.05rem; }

/* The ISO code riding alongside an amount ("$40.00 USD"). Only rendered when the
   figure would otherwise be ambiguous — several currencies in play, or a code we
   have no symbol for — so it must read as an annotation, not as part of the number. */
.exp-money-code {
    margin-left: 0.3em;
    font-size: 0.7em;
    font-weight: var(--font-weight-medium);
    color: var(--color-text-muted);
    letter-spacing: 0.03em;
    white-space: nowrap;
}

/* "Of which estimated" / "Split — unsettled" when no currency contributes to it.
   A dash, not "$0.00": with several currencies on the trip there is no single
   currency a zero could honestly be expressed in. */
.exp-summary-none { color: var(--color-text-muted); }

/* The "not converted" sentence. Sits under the figures it explains. */
.exp-currency-note { margin: 0.85rem 0 0; }

/* Names the currency a category bar belongs to. Only present when there is more
   than one bar — on a single-currency trip the whole card is already in it. */
.exp-typebar-caption {
    margin: 0 0 0.5rem;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-medium);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

/* ── Spend-by-type breakdown bar (Expenses summary) ──────────────────────
   Stacked horizontal bar above an inline legend. Each segment is one expense
   type; widths come from server-rendered inline `width:%` styles. The 6 colors
   cycle to support up to 6 distinct types in the bar (the legend below shows
   all types regardless). */
.exp-typebar {
    margin-top: 1rem;
    padding-top: 0.85rem;
    border-top: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
}
.exp-typebar-track {
    display: flex;
    width: 100%;
    height: 10px;
    border-radius: 999px;
    overflow: hidden;
    background: color-mix(in srgb, var(--color-border) 30%, transparent);
}
.exp-typebar-seg {
    display: block;
    height: 100%;
    transition: filter var(--transition-fast);
}
.exp-typebar-seg:hover { filter: brightness(1.08); }
/* 6-color palette tuned to be distinct without clashing — keeps the accent hue
   for the top spender and steps through cool→warm. */
.exp-typebar-seg-1 { background: var(--color-accent); }
.exp-typebar-seg-2 { background: #7c3aed; }   /* violet */
.exp-typebar-seg-3 { background: #f59e0b; }   /* amber */
.exp-typebar-seg-4 { background: #10b981; }   /* emerald */
.exp-typebar-seg-5 { background: #ef4444; }   /* red */
.exp-typebar-seg-6 { background: #64748b; }   /* slate */

.exp-typebar-legend {
    list-style: none;
    margin: 0.75rem 0 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
    gap: 0.35rem 1rem;
}
.exp-typebar-legend li {
    display: grid;
    grid-template-columns: 0.75rem 1fr auto;
    grid-template-areas: "swatch name pct" "swatch amt pct";
    column-gap: 0.45rem;
    align-items: center;
    font-size: var(--font-size-sm);
}
.exp-typebar-swatch {
    grid-area: swatch;
    display: inline-block;
    width: 0.75rem;
    height: 0.75rem;
    border-radius: 3px;
    align-self: center;
}
.exp-typebar-name { grid-area: name; color: var(--color-text); font-weight: var(--font-weight-medium); }
.exp-typebar-amt  { grid-area: amt;  color: var(--color-text-muted); font-size: var(--font-size-xs); font-variant-numeric: tabular-nums; }
.exp-typebar-pct  { grid-area: pct;  color: var(--color-text-muted); font-size: var(--font-size-xs); font-variant-numeric: tabular-nums; }

.exp-item {
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--color-border);
    cursor: pointer;
    transition: background-color var(--transition-fast);
    border-radius: var(--border-radius-sm);
}
.exp-item:last-child { border-bottom: none; }
.exp-item:hover     { background-color: var(--color-primary-light); }
.exp-item:focus     { outline: 2px solid var(--color-border-focus); outline-offset: -2px; }
.exp-item.selected {
    background-color: var(--color-primary-light);
    border-left: 3px solid var(--color-primary);
    padding-left: calc(0.75rem - 3px);
}
.exp-item-row {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.exp-item-date {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    white-space: nowrap;
    min-width: 6.5rem;
}
.exp-item-summary {
    flex: 1;
    font-weight: var(--font-weight-medium);
    color: var(--color-text);
    word-break: break-word;
}
.exp-item-amount-value {
    font-weight: var(--font-weight-bold);
    color: var(--color-text);
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}
/* An estimated amount. The "Estimate" pill that used to sit in the meta line was
   removed 2026-09-21 (owner request) — the highlight on the figure itself IS the
   signal now, so it has to be loud. Bright yellow with dark text in BOTH themes:
   a yellow marker stroke reads the same on a light or dark card. The "~" prefix
   and the title attribute stay, so the fact survives without color. */
.exp-item-amount-value.exp-item-est {
    background: #ffeb3b;
    color: #1a1a1a;
    padding: 0 0.3rem;
    border-radius: 3px;
}
.exp-item-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem 0.5rem;
    margin-top: 0.2rem;
    align-items: center;
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
}
.exp-type-badge {
    display: inline-block;
    font-size: 0.68rem;
    font-weight: 700;
    background: var(--color-primary-light);
    color: var(--color-primary);
    padding: 0.15rem 0.55rem;
    border-radius: 999px;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    line-height: 1.5;
}
.exp-badge {
    display: inline-block;
    font-size: 0.68rem;
    font-weight: 700;
    padding: 0.15rem 0.55rem;
    border-radius: 999px;
    /* Proper case, not uppercase (owner, 2026-09-21): "Split (unsettled)", and a
       debt pill like "You owe Kacie T." must not shout somebody's name. */
    text-transform: none;
    letter-spacing: 0;
    line-height: 1.5;
}
.exp-badge-est {
    background: var(--color-warning-bg);
    color: var(--color-warning);
    border: 1px solid var(--color-warning-border);
}
.exp-badge-unsettled {
    background: var(--color-danger-bg);
    color: var(--color-danger);
    border: 1px solid var(--color-danger-border);
}
.exp-badge-settled {
    background: var(--color-success-bg);
    color: var(--color-success);
    border: 1px solid var(--color-success-border);
}
/* "Paid by Dana" / "For Dana" / "For everyone" — WHO, not a money state.
   Deliberately NEUTRAL: the other four badges in this family are semantic colors
   (warning = estimate, danger = unsettled, success = settled, info = shared) and
   every one of them says something about whether a figure is final or owed. These
   two say nothing about money at all, so borrowing any of those colors would read
   as a debt that isn't there. Mixed case, like .exp-badge-shared — these carry a
   person's name, and uppercasing somebody's name is not a style choice to make for
   them. Added 2026-08-29 with the who-paid / who-for dropdowns. */
.exp-badge-people {
    background: var(--color-surface-muted, #f8f9fa);
    color: var(--color-text-muted);
    border: 1px solid var(--color-border);
    text-transform: none;
    letter-spacing: 0;
}
/* Group-shared expense (lives on the board, editable by every active member). */
.exp-badge-shared {
    background: var(--color-info-bg);
    color: var(--color-info-text);
    border: 1px solid var(--color-info-border);
    text-transform: none;
    letter-spacing: 0;
}
/* ── Settling Up card (Expenses) ─────────────────────────────────────────
   Who owes the traveler money and who they owe, one line per person per
   currency. Added 2026-08-29. Two groups side by side on a wide screen and
   stacked on a phone: they are read as a pair ("Dana owes me, I owe Sam"), so
   putting them in one column on a desktop wastes the comparison. */
.exp-settle-card { margin-bottom: 1rem; }
.exp-settle-group { margin-top: 0.5rem; }
.exp-settle-code {
    font-size: var(--font-size-xs);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--color-text-muted);
    margin: 0.9rem 0 0.15rem;
}
.exp-settle-code:first-of-type { margin-top: 0.35rem; }
.exp-settle-title {
    font-size: var(--font-size-xs);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-weight: var(--font-weight-medium);
    color: var(--color-text-muted);
    margin: 0 0 0.3rem;
}
.exp-settle-list { list-style: none; margin: 0 0 0.75rem; padding: 0; }
.exp-settle-item {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    padding: 0.4rem 0.65rem;
    border-radius: var(--border-radius-sm);
    background: color-mix(in srgb, var(--color-bg) 55%, transparent);
    border: 1px solid color-mix(in srgb, var(--color-border) 55%, transparent);
}
.exp-settle-item + .exp-settle-item { margin-top: 0.3rem; }
/* The name takes the slack so the amount stays hard right and the column of
   figures lines up down the list. */
.exp-settle-who { flex: 1 1 auto; font-weight: var(--font-weight-medium); min-width: 0; overflow-wrap: anywhere; }
.exp-settle-amount {
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
.exp-settle-count {
    flex: 0 0 auto;
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    white-space: nowrap;
}
/* Direction is carried by the heading AND the color, never by a minus sign —
   a "-$24.00" under a heading that already says "You owe" reads as a negative
   debt. Success/danger are the page's existing settled/unsettled pair, which is
   the same distinction one step further on. */
.exp-settle-in  .exp-settle-amount { color: var(--color-success); }
.exp-settle-out .exp-settle-amount { color: var(--color-danger); }
/* "Everyone on the trip" and "Someone (not named)" are real outstanding money
   but not a person you can settle with, so they read one step quieter. */
.exp-settle-item-group .exp-settle-who { font-weight: var(--font-weight-normal); font-style: italic; }
.exp-settle-note { margin-top: 0.25rem; }
/* Per-person "Settle up" / "Undo". Pushed hard right so the name and the figure keep
   the reading order; it is the action, not the content. */
.exp-settle-btn { flex: 0 0 auto; margin-left: auto; white-space: nowrap; }
/* The collapsed "Already settled" section. Quieter than the outstanding list on
   purpose — it exists to be reversible, not to be read. */
.exp-settle-done { margin-top: 0.75rem; }
.exp-settle-done > summary {
    cursor: pointer;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    padding: 0.2rem 0;
}
.exp-settle-done .exp-settle-item { opacity: 0.75; }
@media (min-width: 40rem) {
    .exp-settle-card .exp-settle-group { display: inline-block; vertical-align: top; width: calc(50% - 0.6rem); }
    .exp-settle-card .exp-settle-group + .exp-settle-group { margin-left: 1rem; }
}
[data-theme="dark"] .exp-settle-in  .exp-settle-amount { color: #66bb6a; }
[data-theme="dark"] .exp-settle-out .exp-settle-amount { color: #ef5350; }

/* ── Undivided group splits (Expenses, 2026-08-30) ────────────────────────
   A 'shared' expense that nobody has been named on. It is INCOMPLETE, not wrong,
   so neither of these borrows the danger palette the "Unsettled" badge uses —
   accent/info is the "there is something to do here" tier, and reserving red for
   money that is actually owed keeps that signal worth reading. */
.exp-settle-todo {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem;
    margin: 0.5rem 0 0;
    padding: 0.5rem 0.65rem;
    border-radius: var(--border-radius-sm);
    background: var(--color-info-bg);
    border: 1px solid var(--color-info-border);
    color: var(--color-info-text);
    font-size: var(--font-size-sm);
}
.exp-undivided-jump { flex: 0 0 auto; }
/* The row pill. It is a <button> inside a row that is itself a click target, so it
   has to READ as pressable — the other .exp-badge-* are static labels. Same pill
   geometry, mixed case (it is a question, not a status), and a pointer cursor. */
.exp-badge-todo {
    background: var(--color-info-bg);
    color: var(--color-info-text);
    border: 1px dashed var(--color-info-border);
    text-transform: none;
    letter-spacing: 0;
    font: inherit;
    font-size: var(--font-size-xs);
    font-weight: 700;
    cursor: pointer;
}
.exp-badge-todo:hover,
.exp-badge-todo:focus-visible {
    background: var(--color-info);
    color: #ffffff;
    border-style: solid;
}

/* ── Group headers (Expenses list, 2026-08-30) ────────────────────────────
   Written by expenses-page.js, one per day or per category, with the group's own
   per-currency subtotal. Deliberately NOT card-like: it is a divider inside a list,
   and a second box around each run would make a 40-expense trip read as 12 cards. */
.exp-group-head {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
    margin: 0.9rem 0 0.35rem;
    padding: 0 0.15rem 0.25rem;
    border-bottom: 1px solid var(--color-border);
}
.exp-group-head:first-child { margin-top: 0.15rem; }
.exp-group-name {
    font-weight: var(--font-weight-medium);
    font-size: var(--font-size-sm);
}
.exp-group-count {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
}
/* Hard right, tabular, so the column of subtotals lines up down the page — the
   same treatment the per-person figures get in the Settling Up card above. */
.exp-group-total {
    margin-left: auto;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* ── Group + sort controls (Expenses, 2026-08-30) ─────────────────────────
   One row, wrapping to two on a phone. The selects are deliberately narrow: they
   are a view switch sitting under two rows of filter chips, and full-width inputs
   there would read as another thing to fill in. */
.exp-view-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem 0.6rem;
    margin: 0.5rem 0 0.25rem;
}
.exp-view-label {
    font-size: var(--font-size-xs);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--color-text-muted);
    margin: 0;
}
.exp-view-select {
    width: auto;
    min-width: 9rem;
    padding-top: 0.25rem;
    padding-bottom: 0.25rem;
    font-size: var(--font-size-sm);
}
.exp-status-chips { margin-top: 0.35rem; }
.exp-status-chips[hidden] { display: none; }

/* The "Per day" cell's parenthetical divisor. Quieter than the label it follows —
   it qualifies the figure, it is not a second label. */
.exp-summary-basis {
    font-weight: var(--font-weight-normal);
    text-transform: none;
    letter-spacing: 0;
    color: var(--color-text-light);
}

/* Duplicate's confirmation line. It says the two things the copy CHANGED, so it
   is information, not celebration — hence the neutral muted treatment rather than
   the success palette. */
.exp-duplicate-hint { margin-top: 0.5rem; }
.exp-duplicate-hint[hidden] { display: none; }

/* A two-second attention pull after a jump, for the one row (or the one control)
   the user asked to be taken to. Fades rather than blinks, and is suppressed
   entirely under reduced-motion — the outline still lands, just without animation. */
.exp-item-flash, .exp-split-flash {
    animation: expFlash 2s ease-out 1;
    border-radius: var(--border-radius-sm);
}
@keyframes expFlash {
    0%   { box-shadow: 0 0 0 3px var(--color-info-border); }
    100% { box-shadow: 0 0 0 3px transparent; }
}
@media (prefers-reduced-motion: reduce) {
    .exp-item-flash, .exp-split-flash { animation: none; outline: 2px solid var(--color-info); }
}

/* ── Who owes whom, on TripDashboard's Expenses card (2026-08-30) ─────────
   The names under that card's two gross totals. One line per person, netted, in
   the ledger's own order. Lighter than the Expenses page's Settling Up card on
   purpose: there is no Settle button here, so these are a readout, not a control
   surface — going there is what the card title links to. */
.td-exp-people { list-style: none; margin: 0.25rem 0 0; padding: 0; }
.td-exp-person {
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
    font-size: var(--font-size-sm);
    padding: 0.1rem 0;
}
.td-exp-person strong { margin-left: auto; font-variant-numeric: tabular-nums; white-space: nowrap; }
.td-exp-in  { color: var(--color-success); }
.td-exp-out { color: var(--color-danger); }
/* "Everyone on the trip" / "Someone (not named)" — real money, but not somebody
   you can settle with. Same one-step-quieter treatment as on the Expenses page. */
.td-exp-person-group { font-style: italic; }
[data-theme="dark"] .td-exp-in  { color: #66bb6a; }
[data-theme="dark"] .td-exp-out { color: #ef5350; }

/* ── Home's cross-trip money card (2026-08-30) ────────────────────────────
   Same person lines as the dashboard, but grouped under the TRIP they belong to —
   which is the whole reason this card exists rather than a number on Home. */
.home-owed-trip + .home-owed-trip { margin-top: 0.75rem; }
.home-owed-tripname {
    display: block;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    margin: 0 0 0.15rem;
}
.home-owed-tripname .link { text-decoration: none; }
.home-owed-cur {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    margin: 0 0 0.1rem;
}

/* ── "Split between" participant picker (Expenses form) ──────────────────
   An asp:CheckBoxList with RepeatLayout="Flow" emits bare <input>/<label>
   pairs with no wrapper, so the rhythm has to come from the label itself. */
/* ONE ROW THAT WRAPS, rather than one name per line (owner, 2026-08-29).
   The control renders RepeatLayout="UnorderedList", so each tick and its name
   share an <li> — that <li> is the flex item, which is what keeps a box from
   ending a line while its label starts the next one. */
.exp-split-people {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.15rem 1.1rem;
    list-style: none;
    margin: 0;
    padding: 0;
}
.exp-split-people li { display: flex; align-items: center; gap: 0.35rem; }
.exp-split-people label {
    margin: 0;
    font-size: var(--font-size-sm);
    white-space: nowrap;
}
.exp-split-people input[type="checkbox"] { margin: 0; flex: 0 0 auto; }
/* The live "4 people · $27.50 each" line. Emphasized over a plain .note because
   it is the one place the user sees what their ticks actually cost before
   saving — and it is a preview, so it must not look like a stored figure. */
.exp-split-preview {
    margin: 0.35rem 0 0;
    font-weight: var(--font-weight-medium);
    color: var(--color-text);
}

/* Per-row "Share" / "Make private" action + the add-form "Add to group" toggle. */
.exp-share-btn { padding: 0.1rem 0.55rem; font-size: 0.72rem; line-height: 1.4; }
.exp-share-toggle { margin: 0.25rem 0 0.75rem; }
.exp-item-loc { color: var(--color-text-muted); white-space: nowrap; }

/* Form helpers — narrower inputs for date / amount / ratings so they don't
   stretch full-width inside a .form-row when they only need a few characters. */
.exp-date-input    { max-width: 200px; }
.exp-amount-input  { max-width: 200px; }
.exp-rating-input  { max-width: 110px; }

.exp-ratings-details {
    margin: 0.25rem 0 1rem;
}
.exp-ratings-summary {
    cursor: pointer;
    color: var(--color-link);
    font-weight: var(--font-weight-medium);
    font-size: var(--font-size-sm);
    padding: 0.25rem 0;
}
.exp-ratings-summary:hover { color: var(--color-link-hover); }
.exp-ratings-row { margin-top: 0.5rem; }

/* ── 38a. Join wizard (Join.aspx through Join7.aspx) ────────────
   The wizard reuses .card + .form-group but needs its own narrower card width and
   per-step typography. The "Step X of 7" pill, the big question prompt, the
   collapsible "Why?" disclosure, and the multi-column rows all live here. */

.join-card {
    max-width: 540px;
    margin: 0 auto 1.5rem;
    padding: 1.75rem;
    border-radius: var(--border-radius-lg);
    box-shadow: var(--shadow-md);
}
@media (max-width: 575px) {
    .join-card { padding: 1.25rem; border-radius: var(--border-radius); }
}

/* "Step X of 7" pill above the page title. The :where wrapper isolates from .label
   margin defaults so it sits flush above the H1. */
.join-progress {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    margin: 0 0 0.35rem;
    padding: 0.2rem 0.7rem;
    background: var(--color-primary-light);
    color: var(--color-primary);
    border-radius: 999px;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-bold);
    text-transform: uppercase;
    letter-spacing: 0.06em;
}
.join-progress::before {
    content: "";
    width: 0.4rem;
    height: 0.4rem;
    border-radius: 50%;
    background: var(--color-primary);
    /* Soft pulse so users see the wizard is "live", not a static page */
    animation: joinDotPulse 1.8s var(--ease-in-out) infinite;
}
@keyframes joinDotPulse {
    0%, 100% { opacity: 1;   transform: scale(1); }
    50%      { opacity: 0.45; transform: scale(0.8); }
}
@media (prefers-reduced-motion: reduce) {
    .join-progress::before { animation: none; }
}

/* Step prompt — slightly larger than .heading, slightly tighter than .page-title */
.join-question {
    font-size: 1.45rem;
    font-weight: 700;
    color: var(--color-text);
    margin: 0 0 0.4rem;
    line-height: 1.25;
    letter-spacing: -0.005em;
}

/* "Why?" disclosure row — small link sitting just under the prompt, with the
   info text expanding inline when clicked. ASP.NET toggles Visible on lblInfo. */
.join-why {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin: 0 0 1rem;
    font-size: var(--font-size-sm);
}
.join-why .link {
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
}
/* NOTE: this used to carry a ::before round badge holding a literal "?", so the
   link rendered as "? Why?". Removed 2026-08-06 at the owner's request — the
   doubled question mark read as a formatting glitch, not as an icon. Do not
   reinstate it here or on .field-why; the word alone is the affordance. */
.join-why-info {
    color: var(--color-text-muted);
    font-style: italic;
    font-size: var(--font-size-sm);
    padding: 0.4rem 0.65rem;
    background: var(--color-bg);
    border-left: 3px solid var(--color-primary);
    border-radius: 0 var(--border-radius-sm) var(--border-radius-sm) 0;
    width: 100%;
    /* gentle slide-in when revealed */
    animation: joinInfoIn 0.22s var(--ease-out-quint);
}
@keyframes joinInfoIn {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
}

/* ── Per-field "Why?" help toggle ─────────────────────────────────────
   A quieter, multi-field cousin of .join-why for forms like MyProfile,
   where many fields each want an optional "why is this useful?" hint. The
   label and a small "Why?" link share one baseline row; clicking the link
   reveals an italic explanation just below the field. Pure client-side
   (site.js initFieldWhy toggles the [hidden] attribute) — no postback. */
.input-label-row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
}
.input-label-row .input-label { margin-bottom: 0; }
.field-why {
    /* a real <button> styled as a quiet link (keyboard- & screen-reader-friendly) */
    appearance: none;
    -webkit-appearance: none;
    background: none;
    border: 0;
    padding: 0;
    margin: 0;
    cursor: pointer;
    font-family: inherit;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    color: var(--color-link, var(--color-primary, #0090C8));
    line-height: 1.2;
    white-space: nowrap;
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    transition: color var(--transition-fast, 0.15s ease);
}
.field-why:hover,
.field-why:focus-visible { color: var(--color-link-hover, var(--color-primary-dark, #005a80)); }
.field-why:hover .field-why-label,
.field-why:focus-visible .field-why-label { text-decoration: underline; }
/* NOTE: a ::before round badge holding a literal "?" used to sit here, so every
   toggle rendered as "? Why?" — and "? Tips" once the edit forms were relabeled.
   Removed 2026-08-06 at the owner's request. See the matching note on .join-why. */
.field-why-info {
    margin: 0.4rem 0 0;
    color: var(--color-text-muted);
    font-style: italic;
    font-size: var(--font-size-sm);
    padding: 0.4rem 0.65rem;
    background: var(--color-bg);
    border-left: 3px solid var(--color-primary);
    border-radius: 0 var(--border-radius-sm) var(--border-radius-sm) 0;
    animation: joinInfoIn 0.22s var(--ease-out-quint);
}

/* Two-column row (first/last name). Stacks on mobile, splits at 540px+. */
.join-row {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.85rem;
    margin-bottom: 0.5rem;
}
@media (min-width: 540px) {
    .join-row             { grid-template-columns: 1fr 1fr; }
    .join-row.three       { grid-template-columns: 1fr 1fr 1fr; }
}
.join-row .form-group { margin-bottom: 0; }
.join-row .textbox    { max-width: none; }

/* Trailing "Already have an account?" link below the wizard card */
.join-already {
    text-align: center;
    margin: 1rem 0 0;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}
.join-already .link { font-weight: var(--font-weight-medium); }

/* The "All steps take about a minute..." reassurance line sits between page header
   and join card; .text-center already covers alignment, but it can look orphaned
   without breathing room. */
.note.text-center { margin: 0.5rem auto 1.25rem; max-width: 540px; }

/* Step-progress dot strip (decorative; visualizes the 7 steps).
   Pages don't render it yet — add `<ol class="join-stepper" data-step="2">...</ol>`
   to surface it once the markup is updated. Defined here so the styling is ready. */
.join-stepper {
    list-style: none;
    display: flex;
    gap: 0.5rem;
    justify-content: center;
    padding: 0;
    margin: 0 auto 1.25rem;
    max-width: 540px;
}
.join-stepper li {
    flex: 1;
    height: 4px;
    background: var(--color-border);
    border-radius: 999px;
    transition: background-color var(--transition-mid);
}
.join-stepper li.done    { background: var(--color-primary); }
.join-stepper li.current { background: var(--color-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 25%, transparent); }

/* Checkbox + wrapping label on one baseline — the "I agree to the Terms of
   Service" row on the final Join step, and any other checkbox whose label runs
   to more than one line (a bare .checkbox would top-align the box against the
   first line and let line 2 wrap underneath it).

   PROMOTED FROM qMEET 2026-07-18: these three rules lived only in
   qMEET/Content/styles.css, yet PacklistPRO, qFIT, NobodyHasTHIS and
   paulmendelson.com ALL emit .checkbox-row / .checkbox-row-text on their final
   Join step — so the class was dead on four of five sites and that ToS row
   rendered unstyled. qMEET's local copy is now redundant (shared loads last, so
   these win at equal specificity); it can be deleted from
   qMEET/Content/styles.css whenever that file is next touched. */
.checkbox-row { display: flex; align-items: flex-start; gap: .5rem; }
.checkbox-row .checkbox { margin-top: .15rem; flex: 0 0 auto; }
.checkbox-row-text { line-height: 1.4; }


/* ── 38a. Increased-contrast accessibility ────────────────────────
   Honor the OS-level "increase contrast" or "high contrast" setting (Windows
   High Contrast on supporting builds, macOS Increased Contrast, Android Color
   Correction → high-contrast text). Strengthens borders, removes subtle muted
   colors, and ensures focus rings remain visible. Override only the design
   tokens — components inherit because they're built on the variables. */
@media (prefers-contrast: more) {

    /* ToDo row CU-3003. The comment above has always said "override only the design
       tokens - components inherit because they're built on the variables", but until
       2026-08-12 this block overrode NO tokens at all: it named five component classes
       and nothing else, so every other bordered surface on the site (cards, inputs,
       dropdowns, textareas, tables, the nav) kept its low-contrast border under an OS
       high-contrast setting. These four lines are what make the stated approach true.
       Both themes are covered because the tokens are redefined per theme and this
       block overrides whichever set is in play. */
    :root, :root[data-theme="dark"] {
        --color-border:       var(--color-text);
        --color-text-muted:   var(--color-text);
        --shadow-focus-ring:  0 0 0 3px var(--color-accent-dark);
    }

    /* Pure-white-on-pale interactive surfaces (info/success/warning pills)
       can wash out under increased contrast — strengthen their borders. */
    .alert-panel,
    .trip-badge,
    .trip-countdown,
    .trip-filter-chip,
    .td-quicknav-chip { border-width: 2px; }
    /* Subtle muted text becomes too quiet — bump up. */
    .note, .small.text-muted { color: var(--color-text); opacity: 0.85; }
}

/* ── 39. Reduced motion (accessibility) ──────────────────────────
   Users with vestibular disorders, motion sensitivity, or a low-end device may
   prefer minimal animation. Honor the OS-level setting by collapsing transitions
   and animations to a tick. Targeted selectors below preserve essential motion
   (toast fade, spinner) — without an explicit override the spinner would freeze. */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
    /* The progress bar still needs to animate to its target width, but the
       0.01ms above effectively turns it into a snap which is fine. */
    .back-to-top { transition: opacity 0.01ms; }
    /* Spinner: keep spinning so users know work is happening. */
    .spinner { animation: spin 0.6s linear infinite !important; }
}

/* ── 40. PWA install button (capture beforeinstallprompt) ──────── */
.pwa-install-btn {
    position: fixed;
    right: 1rem;
    bottom: 4.25rem; /* sits just above .back-to-top */
    z-index: 9998;
    display: none; /* shown by JS when beforeinstallprompt fires */
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.8rem;
    background: var(--color-accent);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    border: none;
    border-radius: 999px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.25);
    cursor: pointer;
}
.pwa-install-btn.visible { display: inline-flex; }
.pwa-install-btn:hover, .pwa-install-btn:focus { background: var(--color-accent-dark); outline: none; }
.pwa-install-btn::before { content: "⤓"; font-size: 1rem; line-height: 1; }

/* ── Install pill wrapper + visible dismiss (ToDo PR-10) ───────
   The pill used to be a lone fixed <button> whose ONLY dismiss path was a
   right-click / long-press that nothing on the page mentioned. It now sits in a
   wrapper alongside a real "x" button.
   ⚠ The x MUST be a SIBLING, not a child of the pill: a <button> inside a <button>
   is invalid HTML and the inner one is unclickable, so the obvious markup silently
   produces a dismiss control that does nothing.
   Only PacklistPRO's site.js builds this wrapper today; on the sister sites these
   rules match nothing and the bare-button rules above still apply unchanged. */
.pwa-install-wrap {
    position: fixed;
    right: 1rem;
    /* Default = the slot the lone button used to occupy, just above .back-to-top.
       Pages that need it lifted (the demo strip, the shopping list's Add FAB) set
       --pwa-install-bottom on <body>; see the note by body.has-demo-strip above for
       why that is an inherited variable and not a more specific rule. */
    bottom: var(--pwa-install-bottom, 4.25rem);
    z-index: 9998;
    display: none;      /* shown by JS when beforeinstallprompt fires */
    align-items: stretch;
    border-radius: 999px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.25);
}
.pwa-install-wrap.visible { display: inline-flex; }

/* Hand positioning to the wrapper. Specificity 0,2,0 beats the bare .pwa-install-btn
   block above, and the shadow moves to the wrapper so the two halves cast one. */
.pwa-install-wrap .pwa-install-btn {
    position: static;
    right: auto;
    bottom: auto;
    z-index: auto;
    box-shadow: none;
    border-radius: 999px 0 0 999px;
    padding-right: 0.5rem;
}
.pwa-install-wrap .pwa-install-close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 0.6rem 0 0.4rem;
    background: var(--color-accent);
    color: #111;                     /* matches the pill: 7.61:1 on the cyan */
    font-size: 1.05rem;
    line-height: 1;
    border: none;
    border-left: 1px solid rgba(0,0,0,0.18);   /* the only seam between the two halves */
    border-radius: 0 999px 999px 0;
    cursor: pointer;
}
.pwa-install-wrap .pwa-install-close:hover,
.pwa-install-wrap .pwa-install-close:focus { background: var(--color-accent-dark); outline: none; }
.pwa-install-wrap .pwa-install-close:focus-visible { box-shadow: var(--shadow-focus-ring); }

/* ── 41. Keyboard-shortcuts help overlay ──────────────────────── */
.shortcuts-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: var(--popup-backdrop-bg);
    -webkit-backdrop-filter: var(--popup-backdrop-filter);
    backdrop-filter:         var(--popup-backdrop-filter);
    z-index: 10000;
    align-items: center;
    justify-content: center;
    padding: 1rem;
}
.shortcuts-overlay.open { display: flex; }
.shortcuts-box {
    background: var(--color-bg-card);
    color: var(--color-text);
    border-radius: var(--border-radius-lg);
    box-shadow: var(--shadow-lg);
    max-width: 460px;
    width: 100%;
    padding: 1.25rem 1.5rem;
}
.shortcuts-title { font-size: var(--font-size-lg); font-weight: var(--font-weight-bold); margin: 0 0 0.75rem; }
.shortcuts-list { list-style: none; margin: 0; padding: 0; }
.shortcuts-list li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.35rem 0;
    border-bottom: 1px solid var(--color-border);
}
.shortcuts-list li:last-child { border-bottom: none; }
.shortcuts-list .shortcut-keys { display: inline-flex; gap: 0.25rem; }
.kbd {
    display: inline-block;
    min-width: 1.5em;
    padding: 0.1em 0.4em;
    font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
    font-size: 0.8125rem;
    line-height: 1.4;
    color: var(--color-text);
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-bottom-width: 2px;
    border-radius: 4px;
    text-align: center;
}
.shortcuts-footer {
    display: flex;
    justify-content: flex-end;
    margin-top: 0.75rem;
}

/* ── 41a. Shared visibility utility ─────────────────────────────────────────
   Applied by Shared/site-core.js (e.g. to auto-hide a "↺ Reset Filters" button
   while every filter/sort control is still at its default). !important so it
   wins over a component's own display rule on the element it hides. */
.sc-hidden { display: none !important; }

/* ── 41b. Styled confirm / alert modal (SiteCore.confirm / SiteCore.alert) ──
   Cross-site replacement for the native window.confirm()/window.alert() dialog.
   The .sc-modal-* markup is built by Shared/site-core.js; the backdrop + card
   mirror the shortcuts overlay, and the buttons reuse the .button design-system
   classes (so they inherit each site's theme) — the rules here only add layout,
   the enter/leave transition, and a focus ring. */
.sc-modal-overlay {
    position: fixed;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1rem;
    background: var(--popup-backdrop-bg);
    -webkit-backdrop-filter: var(--popup-backdrop-filter);
    backdrop-filter:         var(--popup-backdrop-filter);
    z-index: 10050;              /* above toasts (10000) so a confirm is never buried */
    opacity: 0;
    transition: opacity 0.15s ease;
}
.sc-modal-overlay.open { opacity: 1; }
.sc-modal {
    background: var(--color-bg-card);
    color: var(--color-text);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-lg);
    box-shadow: var(--shadow-lg);
    max-width: 420px;
    width: 100%;
    padding: 1.25rem 1.5rem 1.15rem;
    transform: translateY(8px) scale(0.98);
    transition: transform 0.15s ease;
}
.sc-modal-overlay.open .sc-modal { transform: none; }
.sc-modal-danger { border-top: 3px solid var(--color-danger); }
.sc-modal-title {
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    margin: 0 0 0.5rem;
}
.sc-modal-body {
    line-height: 1.5;
    margin: 0;
    overflow-wrap: break-word;
}
.sc-modal-actions {
    display: flex;
    justify-content: flex-end;
    gap: 0.5rem;
    margin-top: 1.25rem;
}
/* .button provides the look; these only guarantee a sensible tap target and that
   the modal buttons never stretch full-width the way some form-context rules do. */
.sc-modal-btn {
    min-width: 5.5rem;
    width: auto;
    margin: 0;
}
@media (prefers-reduced-motion: reduce) {
    .sc-modal-overlay, .sc-modal { transition: none; }
}

/* ── 42. Auto-resize textarea — disable vertical resize handle when JS-managed ── */
textarea.textbox[data-autoresize] {
    overflow: hidden;
    resize: none;
}

/* ── 43. Copy-to-clipboard helper ────────────────────────────────
   Small inline button that pairs with [data-clipboard-target]. After a copy
   the button briefly flips to .copied (green check) before reverting. */
.copy-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.2rem 0.55rem;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    color: var(--color-text);
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    cursor: pointer;
    transition: background-color var(--transition-fast), color var(--transition-fast);
}
.copy-btn:hover  { background: var(--color-primary-light); }
.copy-btn:focus  { outline: 2px solid var(--color-border-focus); outline-offset: 2px; }
.copy-btn.copied { background: var(--color-success-bg); color: var(--color-success); border-color: var(--color-success-border); }
.copy-btn.copied::before { content: "✓"; }

/* ── 43b. "Coming Soon" stub-page treatment ───────────────────────
   Walkthroughs, Debug, ManageItems/Tags etc. all use a "Coming soon" card.
   Give those stubs a more deliberate visual so users immediately understand
   the page is intentionally unbuilt — not broken. */
.stub-card {
    text-align: center;
    padding: 2.5rem 1.5rem;
}
.stub-card::before {
    content: "🚧";
    display: block;
    font-size: 2.75rem;
    line-height: 1;
    margin-bottom: 0.85rem;
    /* very subtle bob to communicate "in progress" */
    animation: stubBob 4s var(--ease-in-out) infinite;
}
@media (prefers-reduced-motion: reduce) {
    .stub-card::before { animation: none; }
}
@keyframes stubBob {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-4px); }
}

/* ── 43a0. Trip Dashboard 2-up card grid ─────────────────────────
   On wide screens, pair Packlist + Tasklist and Notes + Expenses side-by-side.
   Cards keep their own margin-bottom, so we zero the bottom margin inside the
   grid and let `gap` provide consistent spacing. Stacks to one column under
   768px so phones don't squish two narrow cards next to each other. */
.td-card-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--section-gap);
    margin-bottom: var(--section-gap);
}
/* The grid's children are .main-card, not .card. When only `.card` was zeroed
   here, every card inside kept its own 1rem margin-bottom ON TOP of the grid
   `gap`, which read as an extra blank line between Packlist / Tasklist /
   Itinerary / Notes / Expenses. Zero both. */
.td-card-grid > .card,
.td-card-grid > .main-card { margin-bottom: 0; }
@media (min-width: 768px) {
    .td-card-grid { grid-template-columns: 1fr 1fr; }
}
/* The trip-name heading inside this grid would otherwise inherit the grid's
   centering. Leave it alone — already controlled by .tripdashboard-trip-heading. */

/* ── 43a0. Trip Dashboard prep-timeline card ─────────────────────
   The trip's Timing buckets as a dated countdown. A vertical rail with one
   node per stage; the rail is drawn on the <ol> so it cannot outlive the
   last stage the way a per-item border would. Stage rows wrap on narrow
   screens (label, then count) rather than truncating the count, which is the
   part being looked for. */
.td-prep-list {
    list-style: none;
    margin: 0.25rem 0 0.5rem;
    padding: 0 0 0 1.1rem;
    position: relative;
    border-left: 2px solid var(--color-border);
}
.td-prep-stage {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.3rem 0.6rem;
    padding: 0.4rem 0;
    position: relative;
}
/* Node on the rail. Sits on the border drawn above, so its offset is half its
   own width plus the border, not a guessed value. */
.td-prep-stage::before {
    content: "";
    position: absolute;
    left: calc(-1.1rem - 5px);
    top: 0.75rem;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--color-border);
}
.td-prep-stage.is-complete::before { background: var(--color-success, #2e7d32); }
.td-prep-stage.is-overdue::before  { background: var(--color-danger, #c62828); }
.td-prep-when { font-weight: 600; }
/* The count sits hard right, opposite the stage name, so the whole column of
   pills lines up and can be read down in one pass. margin-left:auto rather than
   justify-content:space-between because the row can wrap: with auto, a wrapped
   count still hugs the right edge instead of stretching the gap on the line
   above. (.td-prep-date, the "Thu 11 Jun · 70 days ago" line that used to sit
   between them, was removed 2026-08-20.) */
.td-prep-count { margin-left: auto; }
/* Completed stages recede but stay legible — this is a plan, and a stage you
   finished is still part of it. Not display:none, and not a strikethrough on
   the whole row. */
.td-prep-stage.is-complete .td-prep-when { font-weight: 500; opacity: 0.75; }
/* The count pill is a TWO-STATE traffic light (owner request 2026-08-20): solid red
   with white text while anything is left, solid lime the moment the stage is done.
   Not the old 15%-tint-when-overdue rule — "10 of 10 left" is worth seeing whether or
   not its date has passed, and a tint at that opacity read as decoration.

   Compounded with .pill so it beats the base `.pill.small` background (0,2,0) that the
   markup also carries; the site's own button tokens are reused so the red matches every
   Delete button and the lime matches every Save button rather than being a third green.
   Explicit `color` on both — a .pill inherits body text, which is unreadable on either. */
.td-prep-stage .td-prep-count.pill {
    background-color: var(--color-delete-btn, #d32f2f);
    border-color: var(--color-delete-btn, #d32f2f);
    color: #ffffff;
}
.td-prep-stage.is-complete .td-prep-count.pill {
    background-color: var(--color-save-btn, #32cd32);
    border-color: var(--color-save-btn, #32cd32);
    color: #111;    /* was white, 2.1 to 1 on the green (UI review, PacklistPRO Site-2) */
}
.td-prep-summary { margin: 0.35rem 0 0; }

/* ── 43a1. Trip Dashboard readiness card ─────────────────────────
   Big percentage on the left, headline + per-list breakdown on the right.
   Progress bar underneath fills with the same percentage. Visually anchors
   the page — gives users a "how prepared am I overall?" snapshot. */
.td-readiness {
    background-image:
        radial-gradient(circle at top right,
            color-mix(in srgb, var(--color-accent) 7%, transparent) 0%,
            transparent 60%),
        linear-gradient(180deg, var(--color-bg-card), var(--color-bg-card));
}
[data-theme="dark"] .td-readiness {
    background-image:
        radial-gradient(circle at top right,
            color-mix(in srgb, var(--color-accent) 18%, transparent) 0%,
            transparent 60%),
        linear-gradient(180deg, var(--color-bg-card), var(--color-bg-card));
}
.td-readiness-row {
    display: flex;
    align-items: center;
    gap: 1rem;
    flex-wrap: wrap;
}
.td-readiness-pct {
    flex: 0 0 auto;
    font-size: 3rem;
    font-weight: 700;
    line-height: 1;
    color: var(--color-accent);
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.02em;
}
.td-readiness-pct-sym {
    font-size: 0.5em;
    color: var(--color-text-muted);
    margin-left: 0.1em;
    font-weight: 500;
}
.td-readiness-body {
    flex: 1 1 16rem;
    min-width: 0;
}
.td-readiness-headline {
    margin: 0;
    font-weight: var(--font-weight-bold);
    font-size: var(--font-size-lg);
    color: var(--color-text);
}
.td-readiness-flavor { margin: 0.1rem 0 0.45rem; color: var(--color-text-muted); }
.td-readiness-breakdown {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem 1rem;
    font-size: var(--font-size-sm);
    color: var(--color-text);
}
.td-readiness-breakdown strong { font-variant-numeric: tabular-nums; }
.td-readiness-track {
    margin-top: 0.75rem;
}

/* ── 43a9. Trip Dashboard AI Trip Review card ──────────────────────
   Sits under Trip Readiness and shares its accent wash, because the two answer
   the same question — the score, then the critique of the score.

   Every color below resolves through an existing token that is defined for BOTH
   themes, so there is no separate [data-theme="dark"] block and no
   var(--token, #literal) fallback. A literal fallback here would paint light in
   dark mode the moment a token was renamed, and the failure is silent. */
.td-aireview {
    background-image:
        radial-gradient(circle at top right,
            color-mix(in srgb, var(--color-accent) 7%, transparent) 0%,
            transparent 60%),
        linear-gradient(180deg, var(--color-bg-card), var(--color-bg-card));
}
.td-air-intro { margin: 0 0 0.75rem; }
.td-air-controls { margin-bottom: 0.25rem; }
.td-air-actions {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
}
.td-air-status { color: var(--color-text-muted); }
/* .td-air-empty is gone with the "No review yet" line (2026-08-20); the class is
   kept in this selector only so an older cached page still reads correctly. */
.td-air-empty, .td-air-working { margin: 0.5rem 0 0; color: var(--color-text-muted); }

.td-air-head {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    flex-wrap: wrap;
    margin-top: 0.5rem;
}
.td-air-rating {
    flex: 0 0 auto;
    font-size: 2.25rem;
    font-weight: var(--font-weight-bold);
    line-height: 1;
    color: var(--color-accent);
    font-variant-numeric: tabular-nums;
}
.td-air-rating-sym {
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-normal);
    color: var(--color-text-muted);
}
.td-air-headline {
    margin: 0;
    font-weight: var(--font-weight-bold);
    font-size: var(--font-size-lg);
    color: var(--color-text);
}
.td-air-text { margin: 0.5rem 0 0; color: var(--color-text); }
.td-air-h {
    margin: 1rem 0 0.4rem;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-bold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--color-text-muted);
}

.td-air-gaps { list-style: none; margin: 0; padding: 0; }
.td-air-gap {
    padding: 0.5rem 0 0.5rem 0.75rem;
    border-left: 3px solid var(--color-border);
    margin-bottom: 0.4rem;
}
/* Severity is carried by a border AND a text badge, never by color alone —
   color-blind users and grayscale printouts both have to be able to read the
   ranking, which is the whole point of the ordering.

   🔑 THE -bg / -border TOKENS, NOT THE BASE ONES. --color-danger (#c62828) and
   --color-warning (#e65100) are declared once at :root and are NOT redefined
   under [data-theme="dark"] — only their -bg and -border variants are. Painting
   badge TEXT with the base tokens would leave dark red on a dark card. The pair
   used here is theme-aware on both sides, so the badge re-tints with the theme
   and the text stays on --color-text. */
.td-air-sev-critical { border-left-color: var(--color-danger-border); }
.td-air-sev-important { border-left-color: var(--color-warning-border); }
.td-air-sev-nice { border-left-color: var(--color-border); }
.td-air-badge {
    display: inline-block;
    padding: 0.05rem 0.45rem;
    margin-right: 0.35rem;
    border-radius: 999px;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-bold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    border: 1px solid var(--color-border);
    color: var(--color-text-muted);
}
.td-air-badge-critical {
    border-color: var(--color-danger-border);
    background-color: var(--color-danger-bg);
    color: var(--color-text);
}
.td-air-badge-important {
    border-color: var(--color-warning-border);
    background-color: var(--color-warning-bg);
    color: var(--color-text);
}
.td-air-go { margin-left: 0.35rem; font-size: var(--font-size-sm); }
.td-air-why {
    display: block;
    margin-top: 0.15rem;
    color: var(--color-text-muted);
}
.td-air-strengths, .td-air-improve {
    margin: 0;
    padding-left: 1.2rem;
    color: var(--color-text-muted);
}
/* A keyword-only catalog match. Flagged rather than hidden: "binoculars" resolving to
   "Opera Glasses" is a real measured outcome, and the user has to be able to see that the
   match is a guess. */
.td-air-weak {
    border: 1px solid var(--color-border);
    border-radius: 999px;
    padding: 0 0.4rem;
    margin-left: 0.3rem;
    white-space: nowrap;
}
/* Suggestions with no catalog row at all. Deliberately quiet - it is information, not
   something the user can act on. */
.td-air-unstocked {
    margin: 0.5rem 0 0;
    font-style: italic;
}
/* ── Advisories: conditions, closures and warnings ─────────────────
   Same severity border/badge language as the gap list, so "critical" looks the
   same wherever it appears on the card, plus a SOURCE row the gap list has no
   equivalent of.

   🔑 THE SOURCE CHIP IS NOT DECORATION. A live National Weather Service warning
   and a half-remembered road closure are rendered in the same list and must not
   look equally authoritative. The chip carries a WORD ("Live" / "Web" /
   "Unverified"), not just a color, for the same reason the severity badge does:
   grayscale printouts and color-blind readers still have to be able to tell a
   measured fact from a recollection. Color only reinforces it. */
.td-air-advisories, .td-air-mustsee { list-style: none; margin: 0; padding: 0; }
.td-air-adv, .td-air-see {
    padding: 0.5rem 0 0.5rem 0.75rem;
    border-left: 3px solid var(--color-border);
    margin-bottom: 0.4rem;
}
/* What KIND of thing it is (Roads / Permit / Closure), ahead of the text itself. */
.td-air-kind {
    font-size: var(--font-size-xs);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--color-text-muted);
    margin-right: 0.25rem;
}
.td-air-where { margin-left: 0.25rem; }
.td-air-srcline {
    display: block;
    margin-top: 0.25rem;
}
.td-air-src {
    display: inline-block;
    padding: 0 0.4rem;
    margin-right: 0.3rem;
    border-radius: 999px;
    border: 1px solid var(--color-border);
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-bold);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    white-space: nowrap;
    color: var(--color-text);
}
/* -bg / -border tokens only, never the base --color-success / --color-warning:
   those two are declared once at :root and are NOT redefined under
   [data-theme="dark"], so painting chip text with them leaves dark ink on a dark
   card. The pairs below are theme-aware on both sides. */
.td-air-src-feed { border-color: var(--color-success-border); background-color: var(--color-success-bg); }
.td-air-src-web { border-color: var(--color-info-border); background-color: var(--color-info-bg); }
.td-air-src-know { border-color: var(--color-warning-border); background-color: var(--color-warning-bg); }
/* The "it had search and never used it" caveat. Quiet, but not hidden — it is the
   line that stops the Web chips above from being read as verified. */
.td-air-searchnote {
    margin: 0.4rem 0 0;
    font-style: italic;
}
.td-air-when { margin-left: 0.3rem; white-space: nowrap; }
.td-air-websearch { margin-top: 0.5rem; }
.td-air-websearch-note { margin: 0.2rem 0 0; }

.td-air-budget { margin: 0.35rem 0 0; }
.td-air-meta {
    margin: 0.9rem 0 0;
    padding-top: 0.5rem;
    border-top: 1px solid var(--color-border);
    font-variant-numeric: tabular-nums;
}
.td-air-done { margin: 0 0 0.35rem; color: var(--color-success); }

/* ── 43b0. Trip Dashboard quick-nav chips ──────────────────────────
   One-tap jump targets for Packlist / Tasklist / Notes / Expenses, sitting
   immediately under the trip-name heading. Wraps on narrow screens; tappable
   targets are at least 44px tall to honor mobile touch guidelines. */
.td-quicknav {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin: 0 0 1rem;
}
.td-quicknav-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.4rem 0.85rem;
    background: var(--color-bg-card);
    color: var(--color-text);
    border: 1px solid var(--color-border);
    border-radius: 999px;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    text-decoration: none;
    min-height: 38px;
    transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast), transform var(--transition-fast);
}
.td-quicknav-chip:hover {
    background: var(--color-primary-light);
    border-color: var(--color-primary);
    color: var(--color-primary-dark);
    text-decoration: none;
    transform: translateY(-1px);
}
.td-quicknav-chip:active { transform: translateY(0); }
.td-quicknav-chip:focus-visible {
    outline: 2px solid var(--color-border-focus);
    outline-offset: 2px;
}
.td-quicknav-icon { font-size: 1em; line-height: 1; }
@media (prefers-reduced-motion: reduce) {
    .td-quicknav-chip:hover { transform: none; }
}

/* ── 43a2. Stat strip ──────────────────────────────────────────────
   A responsive row of metric tiles (big value + small label) for
   surfacing a record's key numbers near the top of a detail/dashboard
   page (e.g. totals, streaks, "this week", last-done). Generic and
   cross-site; theme tokens make it dark-mode-correct automatically.
   Tiles flex-grow to share the row and wrap on narrow screens. */
.stat-strip {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    margin: 0 0 1.25rem;
}
.stat-tile {
    flex: 1 1 7rem;
    min-width: 6rem;
    text-align: center;
    padding: 0.7rem 0.85rem;
    background: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius);
    box-shadow: var(--shadow-sm);
}
.stat-tile-value {
    display: block;
    font-size: var(--font-size-xl);
    font-weight: var(--font-weight-bold);
    line-height: 1.15;
    color: var(--color-text);
}
.stat-tile-label {
    display: block;
    margin-top: 0.15rem;
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
/* Accent variant — highlight the one tile that matters most (e.g. progress). */
.stat-tile.accent { border-color: color-mix(in srgb, var(--color-accent) 45%, var(--color-border)); }
/* CONTRAST (WCAG 1.4.3 AA) — changed 2026-08-23, row A11Y-01. --color-accent (#00B0F0) as
   TEXT on the white tile is 2.48:1, which fails even the 3:1 large-text floor, so the stat
   number — the whole point of the tile — was the least readable thing on it. --color-link is
   the theme-aware text-safe cyan (#00516f light, brand cyan in dark mode), so the tile still
   reads as accent-colored in both themes. The tile's border/background keep --color-accent. */
.stat-tile.accent .stat-tile-value { color: var(--color-link, #00516f); }

/* ── 43b1. Trip filter chips (Trips.aspx) ──────────────────────────
   Compact pill row above the trip list. Active chip uses accent fill.
   Hidden by JS when the user has fewer than 2 trips. */
.trip-filter-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin: 0.4rem 0 0.6rem;
}
.trip-filter-chips[hidden] { display: none; }
.trip-filter-chip {
    display: inline-flex;
    align-items: center;
    padding: 0.25rem 0.7rem;
    border: 1px solid var(--color-border);
    border-radius: 999px;
    background: var(--color-bg-card);
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    line-height: 1.4;
    cursor: pointer;
    transition: background-color var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
    font-family: var(--font-family);
}
.trip-filter-chip:hover {
    background: var(--color-primary-light);
    color: var(--color-primary-dark);
    border-color: var(--color-primary);
}
.trip-filter-chip:focus-visible {
    outline: 2px solid var(--color-border-focus);
    outline-offset: 2px;
}
.trip-filter-chip.is-active {
    background: var(--color-primary);
    border-color: var(--color-primary);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
}
.trip-filter-chip-count {
    margin-left: 0.35rem;
    font-size: var(--font-size-xs);
    opacity: 0.85;
}
/* When a chip filter is hiding a list item, the search-results <p> still
   shows the count for the visible subset. */
.trip-hidden-by-filter { display: none !important; }

/* ── 43c0. On-this-page TOC ─────────────────────────────────────────
   Floating "☰" launcher button bottom-right (left of back-to-top) that opens
   a centered overlay listing all section headings on the page. Driven by
   site.js initPageTOC when a parent element has data-page-toc. */
.toc-btn {
    position: fixed;
    right: 3.6rem;            /* tucks left of .back-to-top (1rem + 2.25rem + 0.35rem) */
    bottom: 1rem;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 50%;
    background: var(--color-bg-card);
    color: var(--color-text);
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
    box-shadow: var(--shadow-md);
    border: 1px solid var(--color-border);
    opacity: 0;
    pointer-events: none;
    transform: translateY(8px) scale(0.9);
    transition:
        opacity 0.25s var(--ease-out-quint),
        transform 0.25s var(--ease-out-quint),
        background-color 0.15s;
    z-index: 9997;
}
/* Same size, see-through look and scroll-up-only rule as .back-to-top beside it
   (2026-10-09), so the pair comes and goes together. */
.toc-btn.visible {
    opacity: 0.6;
    pointer-events: auto;
    transform: translateY(0) scale(1);
}
.toc-btn.visible:hover { opacity: 1; }
.toc-btn:hover { background: var(--color-primary-light); border-color: var(--color-primary); }
/* This button keeps its place in the tab order while hidden (it is the only way into the
   section list), so keyboard focus alone has to bring it into view. */
.toc-btn:focus-visible {
    outline: 2px solid var(--color-border-focus);
    outline-offset: 2px;
    opacity: 1;
    pointer-events: auto;
    transform: none;
}

.toc-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: var(--popup-backdrop-bg);
    -webkit-backdrop-filter: var(--popup-backdrop-filter);
    backdrop-filter:         var(--popup-backdrop-filter);
    z-index: 10000;
    align-items: center;
    justify-content: center;
    padding: 1rem;
}
.toc-overlay.open { display: flex; }
.toc-panel {
    background: var(--color-bg-card);
    color: var(--color-text);
    border-radius: var(--border-radius-lg);
    box-shadow: var(--shadow-lg);
    max-width: 460px;
    width: 100%;
    max-height: 80vh;
    overflow: auto;
    padding: 1.25rem 1.5rem;
}
.toc-title {
    margin: 0 0 0.75rem;
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
}
.toc-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.toc-list li + li { margin-top: 0.1rem; }
.toc-link {
    display: block;
    padding: 0.5rem 0.65rem;
    border-radius: var(--border-radius-sm);
    color: var(--color-text);
    text-decoration: none;
    transition: background-color var(--transition-fast), color var(--transition-fast);
}
.toc-link:hover,
.toc-link:focus-visible {
    background: var(--color-primary-light);
    color: var(--color-primary-dark);
    text-decoration: none;
}
/* ── Two-level outline (added 2026-07-30) ───────────────────────────────────
   A long reference page is a document, not a flat list: qFIT's Security & Privacy
   has 13 sections over 97 subsections, which rendered as 110 undifferentiated rows.
   An <h3> row now sits indented and lighter beneath its <h2>.

   ⚠ BOTH rules are deliberately scoped so no other site's TOC can shift:
   .toc-sub is emitted only by a TOC that tracks heading depth (qFIT's initPageTOC
   today), and the top-level weight rule is gated behind :has(li.toc-sub) so a flat
   list — every PacklistPRO / qMEET / NobodyHasTHIS page, and every qFIT page with no
   h3 — keeps its current appearance exactly. Do not un-scope either one. */
.toc-list li.toc-sub .toc-link {
    padding-left: 1.6rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}
.toc-list li.toc-sub .toc-link:hover,
.toc-list li.toc-sub .toc-link:focus-visible { color: var(--color-primary-dark); }
.toc-list:has(li.toc-sub) li:not(.toc-sub) .toc-link {
    font-weight: var(--font-weight-medium);
}
.toc-list:has(li.toc-sub) li.toc-sub + li:not(.toc-sub) .toc-link { margin-top: 0.35rem; }
.toc-footer {
    display: flex;
    justify-content: flex-end;
    margin-top: 0.75rem;
}
@media print { .toc-btn, .toc-overlay { display: none !important; } }

/* ── 43d. Trip countdown badge (Trips.aspx list) ───────────────────
   Small inline pill rendered next to the trip name on the Trips list when
   a trip is within ~30 days. Three flavors: upcoming, today, in-progress.
   Populated by JS in Trips.aspx using the trip's data-start/data-end attrs. */
.trip-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.05rem 0.5rem;
    margin-left: 0.5rem;
    border-radius: 999px;
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-medium);
    line-height: 1.4;
    white-space: nowrap;
    vertical-align: 1px;
}
.trip-badge-upcoming   { background: var(--color-info-bg);    color: var(--color-info-text);    border: 1px solid var(--color-info-border); }
.trip-badge-today      { background: var(--color-warning-bg); color: var(--color-warning); border: 1px solid var(--color-warning-border); }
.trip-badge-active     { background: var(--color-success-bg); color: var(--color-success); border: 1px solid var(--color-success-border); }
.trip-badge-past       { background: var(--color-bg);         color: var(--color-text-muted); border: 1px solid var(--color-border); }
.trip-badge::before    { content: ""; display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }

/* ── 43e. Trip Dashboard countdown banner ──────────────────────────
   Prominent card shown at the top of TripDashboard when a trip leaves in
   the near future or is currently in progress. Renders inline in the trip
   subline so it appears immediately under the trip name. */
.trip-countdown {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.25rem 0.7rem;
    margin-left: 0.5rem;
    border-radius: 999px;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-medium);
    line-height: 1.3;
    border: 1px solid;
}
.trip-countdown-upcoming { color: var(--color-info-text);    background: var(--color-info-bg);    border-color: var(--color-info-border); }
.trip-countdown-today    { color: var(--color-warning); background: var(--color-warning-bg); border-color: var(--color-warning-border); animation: countdownPulse 2s var(--ease-in-out) infinite; }
.trip-countdown-active   { color: var(--color-success); background: var(--color-success-bg); border-color: var(--color-success-border); }
.trip-countdown-past     { color: var(--color-text-muted); background: var(--color-bg); border-color: var(--color-border); }
.trip-countdown-icon     { font-size: 0.95em; line-height: 1; }
@keyframes countdownPulse {
    0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-warning) 35%, transparent); }
    50%      { box-shadow: 0 0 0 6px transparent; }
}
@media (prefers-reduced-motion: reduce) {
    .trip-countdown-today { animation: none; }
}

/* ── 43f. Mobile responsiveness ──────────────────────────────────────
   Targeted overrides for narrow screens. The desktop layout is the
   default in the shared stylesheet; these rules stack, simplify, and
   enlarge touch targets so every page works on a phone.
   Breakpoints: 767px (tablet portrait & below), 575px (phone). */

@media (max-width: 767px) {

    /* ── Forms: stack .form-row children vertically ─────────────
       The shared .form-row is display:flex with wrap. On narrow
       screens we force column direction so 5-8 dropdowns don't
       squeeze into a tiny row. */
    .form-row {
        flex-direction: column;
    }
    .form-row > .form-group {
        width: 100%;
        min-width: 0;
        flex: none;
    }

    /* ── Buttons: stack in .form-actions ────────────────────── */
    .form-actions {
        flex-direction: column;
    }
    .form-actions > .button,
    .form-actions > [class*="button"] {
        width: 100%;
        text-align: center;
        justify-content: center;
    }

    /* ── Tables: tighter cells for horizontal space ────────── */
    .data-table th,
    .data-table td {
        padding: 0.4rem 0.5rem;
        font-size: var(--font-size-xs);
    }
    .data-table th {
        font-size: 0.65rem;
    }

    /* Log message column: relax the max-width on mobile so it
       doesn't truncate to a few words. The table is inside a
       table-responsive wrapper so horizontal scroll handles
       overflow. */
    .log-msg {
        max-width: 60vw;
    }
    .log-table {
        min-width: 520px;
    }

    /* ── Toolbar rows: children already wrap, but ensure
       the search field doesn't demand too much space ───────── */
    .toolbar-search-grow {
        min-width: 140px;
        flex-basis: 100%;
    }

    /* ── DataEditor: stack toolbar fields ───────────────────── */
    .de-toolbar {
        flex-direction: column;
        align-items: stretch;
    }
    .de-filter-input {
        width: 100%;
    }
    .de-button-row {
        padding-top: 0;
    }
    .de-save-bar {
        flex-wrap: wrap;
        gap: 0.5rem;
        padding: 0.5rem 0.65rem;
    }
    .de-save-bar .button {
        flex: 1 1 auto;
        min-height: 44px;
        text-align: center;
        justify-content: center;
    }
    .de-preview-box {
        margin: 1rem 0.5rem;
        max-width: none;
        padding: 1rem;
    }
    .de-paging {
        gap: 0.4rem;
    }
    .de-table .de-cell {
        min-width: 80px;
        min-height: 44px;
        height: auto;
        padding: 0.25rem 4px;
    }
    .de-table td {
        height: auto;
    }
    .de-table td:first-child {
        min-width: 44px;
        min-height: 44px;
    }

    /* ── Expenses: summary grid adapts to narrow screens ───── */
    .exp-summary-row {
        grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
    }
    .exp-summary-value {
        font-size: 1.15rem;
    }

    /* ── Share link row (EditTrip): stack code + button ─────── */
    .share-link-row {
        flex-direction: column;
        max-width: none;
    }

    /* ── Quicklist filters: tighter gap ─────────────────────── */
    .ql-filters {
        gap: 0.5rem;
    }
    .ql-filter-divider {
        display: none;
    }

    /* ── Subscribe page: details table labels ──────────────── */
    .subscribe-details-label {
        width: auto;
        white-space: normal;
    }

    /* ── ContactUsViewer / DuplicateRecordFinder tables ─────── */
    .drf-table th,
    .drf-table td {
        padding: 0.35rem 0.5rem;
    }
    .drf-th-children {
        width: auto;
    }

    /* ── AI metadata grid: single column on mobile ─────────── */
    .ai-meta-grid {
        grid-template-columns: 1fr;
    }
    .ai-meta-label {
        white-space: normal;
    }

    /* ── Page header: tighter gap ──────────────────────────── */
    .page-header {
        gap: 0.5rem;
    }

    /* ── Contact Us form: stack site/page row ───────────────── */
    .cu-site-row {
        flex-direction: column;
    }
    .cu-site-select {
        width: 100%;
    }
}

@media (max-width: 575px) {

    /* ── Page wrapper: reduce padding on phones ────────────── */
    .page-wrapper {
        padding: 0.65rem;
    }

    /* ── Cards: slightly less padding ──────────────────────── */
    .card {
        padding: 0.75rem;
    }
    .card-lg {
        padding: 1rem;
    }

    /* ── Expenses form: let narrow inputs stretch full-width ── */
    .exp-date-input,
    .exp-amount-input,
    .exp-rating-input {
        max-width: none;
    }

    /* ── Notes date input: also stretch ─────────────────────── */
    .notes-date-input {
        max-width: none;
    }

    /* ── Home page: force exactly 2 columns on phones ──────── */
    .home-actions {
        grid-template-columns: repeat(2, 1fr);
        gap: 0.4rem;
    }

    /* ── Trip readiness: scale down percentage ─────────────── */
    .td-readiness-pct {
        font-size: 2.25rem;
    }

    /* ── Modals / overlays: tighter padding on phones ──────── */
    .shortcuts-box,
    .toc-panel {
        padding: 0.85rem 1rem;
    }
    #session-expired-modal .modal-box {
        padding: 1.25rem;
    }

    /* ── Footer: tighter on phones ─────────────────────────── */
    .site-footer {
        padding: 1rem 0.75rem;
    }
    /* …but keep the last footer line out from under the ↑ FAB. .back-to-top is
       fixed at bottom:1rem and is 2.85rem tall, so it owns the bottom 3.85rem of
       the VIEWPORT — and once the page is scrolled to the end, that band is the
       footer's own last line. Measured on PacklistPRO /PlacesNearMe at 380px,
       2026-08-12: the footer's "Back to top" button ran x275→346 while the FAB
       sat x318→364, so 28px of the label was covered by an opaque 0.92 disc and
       the right half of the button was unclickable. Same footer + same FAB on all
       three sites, so this belongs here rather than in any one site's sheet.
       🔑 `body ` qualifier is load-bearing: PacklistPRO (Content/styles.css:143)
       and qMEET (Content/styles.css:6447) BOTH set `body .site-footer` (0,1,1)
       phone padding, which a bare `.site-footer` (0,1,0) here would lose to no
       matter that this sheet loads last.
       🔑 env() term is re-stated, not dropped: those two rules add the home-
       indicator inset here, and overriding padding-bottom without it would put the
       footer text back under the iOS home bar. qFIT has no such rule and the term
       collapses to 0 there.
       ⚠ MOVED 2026-10-09: the rule itself is now beside the .back-to-top rules, in a
       1299px block (the button shrank to 2.25rem, so it is 3.75rem, and it applies on
       tablets and small laptops too). This note stays for the measurement behind it. */
    .site-footer-links {
        line-height: 2;
    }

    /* ── Expenses type-bar legend: narrower min ─────────────── */
    .exp-typebar-legend {
        grid-template-columns: repeat(auto-fill, minmax(8.5rem, 1fr));
    }

    /* ── Buttons in .form-actions: ensure tappable height ──── */
    .form-actions > .button {
        min-height: 44px;
    }

    /* ── Toolbar actions: stack and stretch ─────────────────── */
    .toolbar-actions {
        flex-direction: column;
        width: 100%;
    }
    .toolbar-actions > .button {
        width: 100%;
        text-align: center;
        justify-content: center;
    }

    /* ── LogViewer / ContactUsViewer: pager wraps tighter ──── */
    .log-pager {
        gap: 0.4rem;
        flex-wrap: wrap;
    }

    /* ── Quicklist: section/tag headers smaller ─────────────── */
    .ql-section-header {
        font-size: var(--font-size-base);
    }

    /* ── Duplicate Record Finder: results groups tighter ───── */
    .drf-group {
        margin-bottom: 0.5rem;
    }
    .drf-results-header {
        flex-direction: column;
        align-items: flex-start;
    }

    /* ── ContactUs viewer: read-only info bar stacks ───────── */
    .cuv-readonly-info {
        flex-direction: column;
        gap: 0.25rem;
    }

    /* ── DataEditor: phone-specific tightening ─────────────── */
    .de-save-bar .button {
        font-size: var(--font-size-sm);
        padding: 0.4rem 0.5rem;
    }
    .de-chips {
        gap: 0.3rem;
    }
    .de-chip {
        font-size: 0.8rem;
        padding: 0.2rem 0.5rem;
    }
    .de-preview-box {
        margin: 0.5rem;
        padding: 0.75rem;
    }
    .de-preview-table {
        font-size: 0.8rem;
    }
    .de-preview-table th,
    .de-preview-table td {
        padding: 0.2rem 0.35rem;
    }
}

/* Card title with top separator — marks a second logical section within
   a single card (e.g. "Site behavior" below "Display" on Preferences). */
.card-title-spaced {
    margin-top: 1.5rem;
    padding-top: 1rem;
    border-top: 1px solid var(--color-border);
}

/* ═══════════════════════════════════════════════════════════════════════════
   PAGE TAB STRIP — sibling pages presented as tabs (.page-tabs / .page-tab)

   Emitted by InterestsTabs.ascx.vb (qMEET's four Interests pages) and by
   HelpTabs.ascx.vb (the Help hub plus the five help pages, on all three sites).
   Sits directly under .page-header.

   PROMOTED FROM qMEET/Content/styles.css TO THIS FILE 2026-08-04, when the Help
   hub (X3) gave qFIT and PacklistPRO a second consumer. It was qMEET-only until
   then, and there is deliberately NO copy left in any site sheet: this file loads
   LAST on every site, so a leftover local copy would win the cascade on that one
   site and then silently drift from the other two.

   These are ANCHORS to separate pages, not in-page panels — see the header
   comment in InterestsTabs.ascx / HelpTabs.ascx for why the markup is a <nav>
   with aria-current rather than an ARIA tablist. The styling is the only part
   that pretends they are tabs, which is exactly the right place for the pretense.

   Color comes entirely from tokens, so the strip follows dark mode with no
   second ruleset: the inactive tab is muted text on the page background, the
   active one is accent text sitting on --color-bg-card with an accent underline,
   so it reads as the sheet the content below belongs to.
   ═══════════════════════════════════════════════════════════════════════════ */
.page-tabs {
    display: flex;
    align-items: stretch;
    gap: 0.25rem;
    margin: -0.5rem 0 1.25rem;
    border-bottom: 2px solid color-mix(in srgb, var(--color-border) 70%, transparent);
    /* A long strip must scroll sideways on a phone rather than wrapping into a
       second row of half-width tabs, which stops reading as a tab bar. */
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: thin;
    -webkit-overflow-scrolling: touch;
}

.page-tab {
    flex: 0 0 auto;
    padding: 0.5rem 1.1rem;
    border: 1px solid transparent;
    border-bottom: none;
    border-radius: var(--border-radius-sm, 6px) var(--border-radius-sm, 6px) 0 0;
    /* The 2px pulls each tab down onto the strip's own border so the active
       tab's underline replaces that border instead of stacking under it. */
    margin-bottom: -2px;
    color: var(--color-text-muted, #6c757d);
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-medium, 500);
    line-height: 1.4;
    text-decoration: none;
    white-space: nowrap;
    transition: color var(--transition-fast, 0.15s ease),
                background-color var(--transition-fast, 0.15s ease);
}

/* CONTRAST (WCAG 1.4.3 AA) — hover/active color changed 2026-08-23, row A11Y-01.
   --color-primary (#00B0F0) is 2.48:1 as TEXT on the white tab strip. --color-link is the
   theme-aware text-safe cyan (#006C96 in light = 5.86:1 on a card; back to the brand cyan
   in dark mode). The active tab's 2px bottom BORDER below deliberately KEEPS
   --color-primary: that is a non-text indicator, and holding the brand cyan there is what
   keeps the selected tab reading as brand-colored now that its label has darkened. */
.page-tab:hover,
.page-tab:focus-visible {
    color: var(--color-link, #006C96);
    background-color: color-mix(in srgb, var(--color-accent) 8%, transparent);
    text-decoration: none;
}

.page-tab:focus-visible {
    outline: none;
    box-shadow: var(--shadow-focus-ring, 0 0 0 3px rgba(0, 176, 240, 0.35));
}

.page-tab.is-active {
    color: var(--color-link, #006C96);
    background-color: var(--color-bg-card, #ffffff);
    border-color: color-mix(in srgb, var(--color-border) 70%, transparent);
    border-bottom: 2px solid var(--color-primary, #00B0F0);
    font-weight: var(--font-weight-bold, 600);
    cursor: default;
}

/* The active tab is the page you are already on, so hovering it must not
   suggest it will take you somewhere. */
.page-tab.is-active:hover,
.page-tab.is-active:focus-visible {
    background-color: var(--color-bg-card, #ffffff);
}

/* About page: responsive feature grids. Stacks on mobile, splits at md. */
.about-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.25rem;
}
@media (min-width: 768px) {
    .about-grid { grid-template-columns: repeat(2, 1fr); }
}
.about-grid-3 {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.25rem;
}
@media (min-width: 768px) {
    .about-grid-3 { grid-template-columns: repeat(3, 1fr); }
}

/* ── 43b. Invite page (all five sites) ────────────────────────────
   Promoted here 2026-07-28 when Invite.aspx was unified across qFIT /
   PacklistPRO / qMEET / NobodyHasTHIS / paulmendelson.com. Before that,
   `.invite-qr` and `.invite-link-row` were defined ONLY in qMEET's and qFIT's
   local sheets — PLP, NHT and PM shipped markup using both classes with NO
   rule anywhere, so their QR sat unsized (falling back to the width/height
   attributes) and the copy row never became a flex row. Keep these here, not
   in a site sheet: styles_shared.css loads LAST on every site, so a local
   copy would be out-ranked by this one anyway and only drift. */

/* QR image — centered, capped, never wider than its card. */
.invite-qr {
    display: block;
    width: 100%;
    max-width: 320px;
    height: auto;
    margin: 0.5rem auto 0;
    border-radius: 8px;
}

/* "Or Share Your Link" — read-only URL grows, 📋 Copy sits beside it and
   wraps underneath on narrow screens. */
.invite-link-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: stretch;
}
.invite-link-row .textbox { flex: 1 1 220px; min-width: 0; }
.invite-link-row .button { flex: 0 0 auto; }
@media (max-width: 480px) {
    .invite-link-row .textbox { flex: 1 1 100%; }
}

/* Field caption on the left, the "(add @gmail.com)" link flush RIGHT with the
   right edge of the textbox below it. The 480px cap MUST mirror §21's
   `.form-group .textbox { max-width: 480px }` at >=768px — change one and the
   link stops lining up. Below 768px the box is full-width and so is this row. */
.invite-label-row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem;
    width: 100%;
}
@media (min-width: 768px) {
    .invite-label-row { max-width: 480px; }
}

/* ── 44. Itinerary page ──────────────────────────────────────────── */

/* ── Day bar ───────────────────────────────────────────────────────────────
   ← Day 3 — Thu, 6/5/2026 → · Today, above the itinerary list.

   Replaced the #todayCard block on 2026-08-30 (see the long note in
   Itinerary.aspx). Its .itin-day-nav / .itin-day-title rules are gone with it —
   they styled a card that carried style="display:none" and that nothing ever
   un-hid, so they had not painted a pixel on any site for a month. Nothing else
   on any of the five sites used either class. */
.itin-day-bar {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    padding: 0.375rem 0;
    margin-bottom: 0.5rem;
    border-bottom: 1px solid var(--color-border);
}
.itin-day-bar-label {
    flex: 1;
    min-width: 10rem;
    text-align: center;
    font-weight: var(--font-weight-bold);
    font-size: var(--font-size-sm);
}
.itin-day-note { margin: 0 0 0.5rem; }

/* The flash that says "here is the thing you just jumped to". Wrapped in a
   reduced-motion guard: a background pulse is exactly the kind of movement the
   preference is asking us not to make. Without the animation the class still
   applies the resting highlight, so the target is still identified. */
.itin-flash { background-color: var(--color-primary-light); }
@media (prefers-reduced-motion: no-preference) {
    .itin-flash { animation: itinFlash 1.6s ease-out; }
    @keyframes itinFlash {
        0%   { background-color: var(--color-accent); }
        100% { background-color: transparent; }
    }
}

/* ── Continuation row ──────────────────────────────────────────────────────
   "↳ Hilton Garden Inn · day 2 of 4" — drawn by itinerary-page.js under each day
   a multi-day plan runs through. Deliberately quieter than a real row: it is a
   POINTER to a plan listed in full further up, not a second copy of it, and
   making the two look alike would be the lie. */
.itin-cont {
    opacity: 0.75;
    font-size: var(--font-size-sm);
    border-bottom-style: dashed;
}
.itin-cont .itin-item-title { font-weight: var(--font-weight-normal); }

/* Zone badge beside a time — "6:00 PM CET". Renders only on the plans that
   carry a TimeZone, which is the handful that cross zones. */
.itin-tz {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

/* Weather on a day heading. Pushed to the right of the heading text so the day
   label stays the thing the eye lands on — the forecast is decoration. */
.itin-day-wx {
    float: right;
    font-weight: var(--font-weight-normal);
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
}

/* The 💲 pill linking a plan to the expense it produced. */
.itin-exp-pill { text-decoration: none; }
.itin-exp-pill:hover { text-decoration: underline; }

/* ── Trip map ──────────────────────────────────────────────────────────────
   The map itself reuses .park-map (Parks / Trails / CampSites) so all four pages
   are the same height. Only the numbered day pin is new. */
.itin-map-card > summary { cursor: pointer; }
.itin-map-pin span {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    border: 2px solid #ffffff;
    box-shadow: 0 1px 3px rgba(0,0,0,0.4);
    color: #ffffff;
    font-size: 12px;
    font-weight: 700;
    line-height: 1;
}

/* ── Read-only share card ──────────────────────────────────────────────────── */
.itin-share-card > summary { cursor: pointer; }
.itin-share-what { margin: 0.5rem 0 0.75rem; }
.itin-share-row {
    display: flex;
    gap: 0.5rem;
    align-items: center;
    margin: 0.5rem 0 0.25rem;
}
/* min-width:0 is what lets the input actually shrink inside the flex row — a
   text input's default intrinsic width otherwise pushes the Copy button off a
   phone screen. */
.itin-share-url { flex: 1; min-width: 0; font-size: var(--font-size-sm); }

/* Item rows */
.itin-item {
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--color-border);
    cursor: pointer;
    transition: background-color var(--transition-fast);
}
.itin-item:last-child { border-bottom: none; }
.itin-item:hover { background-color: var(--color-primary-light); }
.itin-item:focus-visible { outline: 2px solid var(--color-border-focus); outline-offset: -2px; }
.itin-item.selected {
    background-color: var(--color-primary-light);
    border-left: 3px solid var(--color-accent);
}

.itin-item-row {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.itin-item-time {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    min-width: 5.5rem;
    flex-shrink: 0;
}
.itin-item-title {
    font-weight: var(--font-weight-medium);
    flex: 1;
    min-width: 0;
    word-break: break-word;
}
.itin-item-meta {
    display: flex;
    gap: 0.375rem;
    flex-wrap: wrap;
    align-items: center;
    margin-top: 0.125rem;
}

/* ── Sub-items: the checklist under one itinerary plan ─────────────────────
   Two surfaces share these classes so they cannot drift apart visually: the
   collapsed list under each row on the itinerary (.itin-sub-list, rendered by
   the server) and the editor in the right-hand form (.itin-subedit-*, rendered
   by itinerary-page.js from the same payload).

   🔑 The rows sit INSIDE .itin-item, which is itself a click-to-edit button, so
   every control in here is deliberately its own hit target with padding of its
   own — a checkbox a thumb misses becomes "open the edit form" instead, which
   on a phone at a trailhead is the difference between ticking a trail off and
   losing your place. */
.itin-sub-pill {
    cursor: pointer;
    border: 1px solid var(--color-border);
    background: transparent;
    font: inherit;
    font-size: var(--font-size-sm);
    line-height: 1.2;
    padding: 0.125rem 0.5rem;
}
.itin-sub-pill:hover { border-color: var(--color-border-focus); }
.itin-sub-pill-done { background: var(--color-success-bg); color: var(--color-success); }

.itin-sub-list {
    list-style: none;
    margin: 0.375rem 0 0.125rem;
    padding: 0 0 0 0.5rem;
    border-left: 2px solid var(--color-border);
}
.itin-sub-row {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.375rem;
    padding: 0.25rem 0;
}
.itin-sub-check {
    display: flex;
    align-items: baseline;
    gap: 0.375rem;
    cursor: pointer;
    /* Roomy enough to hit without catching the row behind it. */
    padding: 0.125rem 0.25rem;
    margin: -0.125rem -0.25rem;
}
.itin-sub-glyph { font-size: var(--font-size-sm); color: var(--color-text-muted); }
.itin-sub-title { word-break: break-word; }
/* Sub-item Time input: wide enough for "12:45 PM" plus the picker icon. */
/* Compound selector on purpose: `input.textbox { width:100% }` (0,1,1) beats a bare class. */
input.textbox.itin-subedit-time {
    width: 11em;
    max-width: 100%;
}
/* Sub-item time of day, right after the name (2026-09-12). */
.itin-sub-time {
    margin-left: 0.4em;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    white-space: nowrap;
}
.itin-sub-desc,
.itin-sub-when {
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    word-break: break-word;
}
.itin-sub-when { white-space: nowrap; }

/* The "Move to…" picker that replaces a sub-item row's buttons in place. Wraps onto
   its own line on a phone rather than squeezing a 30-character plan name into the
   width left over beside Edit and ×. */
.itin-sub-move-pick {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.375rem;
    max-width: 100%;
}
.itin-sub-move-select {
    max-width: 100%;
    font-size: var(--font-size-sm);
}

/* ── Attached documents: the 📎 pill and its list under one itinerary plan ──
   Deliberately built from the same shapes as .itin-sub-* above rather than a look
   of its own. The two pills sit side by side in the same meta row and answer the
   same question ("is there more inside this plan?"), so a traveler who has
   learned one has learned both. Same hit-target reasoning too: every control in
   here sits inside .itin-item, which is a click-to-edit button, so a near-miss
   must not silently open the edit form instead. */
.itin-file-pill {
    cursor: pointer;
    border: 1px solid var(--color-border);
    background: transparent;
    font: inherit;
    font-size: var(--font-size-sm);
    line-height: 1.2;
    padding: 0.125rem 0.5rem;
}
.itin-file-pill:hover { border-color: var(--color-border-focus); }

.itin-file-list {
    list-style: none;
    margin: 0.375rem 0 0.125rem;
    padding: 0 0 0 0.5rem;
    border-left: 2px solid var(--color-border);
}
.itin-file-row {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.375rem;
    padding: 0.25rem 0;
}
.itin-file-glyph { flex: 0 0 auto; font-size: var(--font-size-sm); }
/* min-width:0 so a long "AA-1234-boarding-pass-final-v2.pdf" wraps inside the row
   instead of pushing the size off the edge of a phone — same fix as .tf-item-name.
   Its own padding because it is a link inside a click-to-edit row. */
.itin-file-name {
    flex: 1 1 auto;
    min-width: 0;
    overflow-wrap: anywhere;
    word-break: break-word;
    padding: 0.125rem 0.25rem;
    margin: -0.125rem -0.25rem;
}
.itin-file-size {
    flex: 0 0 auto;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

/* "Trail details ↗" on a sub-item that came from the trail catalog (2026-08-29,
   with plp_TripItinerarySubItems.TrailID). Small and quiet — it is a way out of the
   checklist, not a thing to read. nowrap because "Trail details ↗" broken across two
   lines inside a flex row reads as two separate controls. */
.itin-sub-link {
    font-size: var(--font-size-sm);
    white-space: nowrap;
}

/* Done rows stay legible rather than fading out: the whole point of a completed
   trail is that you can still read which one it was. Only the NAME is struck. */
.itin-sub-done > .itin-sub-check > .itin-sub-title {
    text-decoration: line-through;
    color: var(--color-text-muted);
}

/* ── Sub-item editor (right-hand form, edit mode only) ─────────────────── */
.itin-subedit {
    border-top: 1px solid var(--color-border);
    padding-top: 0.75rem;
}
.itin-subedit-title {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: var(--font-size-base);
    font-weight: var(--font-weight-bold);
    margin: 0 0 0.25rem;
}
/* The progress pill in the editor heading is a status readout, not a control. */
.itin-subedit-title .itin-sub-pill { cursor: default; }
.itin-subedit-title .itin-sub-pill:hover { border-color: var(--color-border); }
.itin-subedit-empty { margin: 0.5rem 0; }
.itin-subedit-rows { list-style: none; margin: 0.5rem 0; padding: 0; }
.itin-subedit-row {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.375rem;
    padding: 0.375rem 0;
    border-bottom: 1px solid var(--color-border);
}
.itin-subedit-row:last-child { border-bottom: none; }
.itin-subedit-actions {
    margin-left: auto;
    display: flex;
    gap: 0.25rem;
    flex-shrink: 0;
}
.itin-subedit-add {
    border-top: 1px dashed var(--color-border);
    padding-top: 0.5rem;
    margin-top: 0.25rem;
}
/* Two lines, and it stays two lines. rows="2" alone does NOT get you two lines here:
   `.textarea` sets min-height to 2.5 input-heights (~4 rows), which wins over the rows
   attribute. Neutralising min-height and letting height:auto honor rows="2" is the same
   fix `textarea.share-comment` below uses — and it beats hard-coding a height, because the
   browser adds the real padding and line-height rather than my estimate of them.
   `textarea.` prefix for specificity over `.textarea`, matching that precedent, so this
   does not silently break if the rules are ever reordered. resize:none because a box the
   user can drag taller walks the Add button down the page. */
textarea.itin-subedit-desc {
    min-height: 0;
    height: auto;
    resize: none;
    overflow-y: auto;
}

/* Day headers in full itinerary */
.itin-day-header {
    padding: 0.5rem 0.75rem;
    background: var(--color-bg);
    border-bottom: 1px solid var(--color-border);
    font-weight: var(--font-weight-bold);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    position: sticky;
    top: 0;
    z-index: 1;
}
[data-theme="dark"] .itin-day-header { background: var(--color-bg-card); }

/* Status badge variants */
.itin-status-confirmed { background: var(--color-success-bg); color: var(--color-success); }
.itin-status-cancelled { text-decoration: line-through; opacity: 0.65; }
.itin-status-completed { background: var(--color-success-bg); color: var(--color-success); opacity: 0.7; }

/* Collapsible details sections */
.itin-details { border: 1px solid var(--color-border); border-radius: var(--border-radius-sm); }
.itin-details-summary {
    padding: 0.5rem 0.75rem;
    cursor: pointer;
    font-weight: var(--font-weight-medium);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    list-style: none;
}
.itin-details-summary::before { content: "▸ "; }
.itin-details[open] > .itin-details-summary::before { content: "▾ "; }
.itin-details-summary::-webkit-details-marker { display: none; }
.itin-details-body { padding: 0 0.75rem 0.75rem; }

/* Date + Time pairs (Start Date/Time, End Date/Time): keep the two fields on
   one line at every width. The general .form-row stacks to a column below
   768px so a dense row of dropdowns doesn't squeeze, but a date input plus a
   short time dropdown comfortably fit two-up — so this row opts out of that
   stacking. Declared after the max-width:767px .form-row override above, so it
   wins on equal specificity. */
.itin-datetime-row {
    flex-direction: row;
    flex-wrap: nowrap;
    column-gap: 0.5rem;
}
.itin-datetime-row > .form-group {
    flex: 1 1 0;
    width: auto;
    min-width: 0;
}

/* Responsive: time column narrower on phones */
@media (max-width: 575px) {
    .itin-item-time { min-width: auto; }
}

/* ── Suggested activities panel (Itinerary.aspx) ─────────────────────
   Additive only — reuses .main-card / .checkbox / .pill / .link. Each
   suggestion is a <label> row so the whole row toggles its checkbox,
   mirroring the Setup Checklist rows below. */
.itin-suggest-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.itin-suggest-toolbar {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    margin: 0.75rem 0 0.25rem;
}
.itin-suggest-toolbar .small-dim-text { margin-right: auto; }
/* "Email Suggestions to Me" row sits at the top, directly under the Select-all
   toolbar (left-aligned, tight spacing) so it's reachable without scrolling. */
.itin-suggest-emailrow { justify-content: flex-start; margin: 0 0 0.75rem; }
.itin-suggest-item {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding: 0.6rem 0.25rem;
    border-bottom: 1px solid var(--color-border);
    cursor: pointer;
}
.itin-suggest-item:last-child { border-bottom: none; }
.itin-suggest-item:hover { background-color: var(--color-primary-light); }
.itin-suggest-cb { margin-top: 0.2rem; flex: 0 0 auto; }
.itin-suggest-body {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
    min-width: 0;
}
.itin-suggest-row {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
}
.itin-suggest-when {
    font-size: 0.85rem;
    color: var(--color-text-muted);
    white-space: nowrap;
}
.itin-suggest-title { font-weight: 600; }
.itin-suggest-metarow {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.35rem;
}
.itin-suggest-desc { display: block; }
.itin-suggest-links { display: block; font-size: 0.9rem; }
.itin-suggest-loc { white-space: nowrap; }

/* ── 45. Home "Suggested ToDo's" list ────────────────────────────────
   Onboarding to-dos surfaced on Home. Every INCOMPLETE checklist item is
   one aligned row: [checkbox] [what to do] [button → its page]. The three
   columns line up vertically across every row because all rows share ONE
   grid — each .home-todo-row is display:contents, so its three cells become
   grid items of the parent .home-todo-list and inherit its columns. Ticking
   the checkbox marks that item done (persisted via the setupChecklist pref)
   and removes the row. Time-sensitive alerts (approvals waiting, drafts not
   live, RSVPs due) render above in a standout yellow so they don't blend in
   with the ordinary to-dos — they aren't checklist items and self-resolve. */

/* Yellow attention alerts — NOT checklist items; no checkbox, they clear
   themselves once you act on them (approve a member, publish a draft, …). */
.home-todo-alerts { list-style: none; padding: 0; margin: 0 0 1rem; }
.home-todo-alerts li {
    padding: 0.6rem 0.85rem;
    margin-bottom: 0.4rem;
    border-radius: var(--radius-md, 8px);
    background: var(--color-warning-bg);
    border: 1px solid var(--color-warning-border);
    color: var(--color-warning);
    line-height: 1.4;
}
.home-todo-alerts li:last-child { margin-bottom: 0; }
.home-todo-alerts .link {
    color: var(--color-warning);
    text-decoration: underline;
    font-weight: var(--font-weight-medium, 600);
}
/* The 1rem below the list is spacing between the alerts and the checklist rows that
   USED to follow them. Since the alerts were split into their own "Reminders" card
   (qMEET/PacklistPRO/qFIT, 2026-08-06) nothing follows them there, so that margin is
   dead space inside the card. Only zeroed when the list really is the last thing in the
   collapsible body, so any layout that still puts rows underneath keeps its gap. */
.home-card-body > .home-todo-alerts:last-child { margin-bottom: 0; }

/* RED variant — for alerts about data that is actually WRONG rather than merely
   waiting on you (PacklistPRO's trip date warnings: a placeholder or missing
   start/end date makes a trip's dates and status read incorrectly everywhere).
   Same box, danger palette. The dark-mode text override is required: unlike the
   warning pair, --color-danger is NOT re-declared for dark, so the light #c62828
   would land on the dark #3b1212 panel at under 2:1. */
.home-todo-alerts-danger li {
    background: var(--color-danger-bg);
    border-color: var(--color-danger-border);
    color: var(--color-danger);
}
.home-todo-alerts-danger .link { color: var(--color-danger); }
[data-theme="dark"] .home-todo-alerts-danger li,
[data-theme="dark"] .home-todo-alerts-danger .link { color: #ff8a80; }

/* Aligned checklist to-do rows. Each row is its own 3-column grid; because the
   checkbox column is a fixed width and the middle 1fr eats the slack, the checkbox
   left edges, the text left edges, and the button RIGHT edges all line up vertically
   across every row. The divider is a continuous border on the row itself.
   .home-todo-list is just a plain container — the rows carry all the layout. */
.home-todo-row {
    display: grid;
    grid-template-columns: 1.5rem 1fr auto;   /* checkbox | text | button */
    align-items: start;                        /* top-align — descriptions can wrap to 2+ lines */
    column-gap: 0.85rem;
    padding: 0.7rem 0;
    border-top: 1px solid var(--color-border, #e0e0e0);
}
.home-todo-row:first-child { border-top: none; }
.home-todo-row:hover { background: var(--color-hover-bg, rgba(0, 0, 0, 0.03)); }

/* Fully custom-drawn checkbox. We can't lean on accent-color here: a DISABLED checked
   box (our "auto-completed" server-detected items are rendered disabled so they can't be
   un-ticked) is grayed out by the browser's native rendering no matter what accent-color
   or opacity we set — which is exactly why auto-checked boxes looked different from the
   ones the user ticks. appearance:none removes the native control entirely so WE paint
   every state, making auto-checked and manually-checked boxes pixel-identical blue. */
.home-todo-check {
    -webkit-appearance: none;
    appearance: none;
    box-sizing: border-box;
    width: 1.5rem !important;
    height: 1.5rem !important;
    min-width: 1.5rem !important;
    margin: 0.05rem 0 0 0 !important;   /* nudge to sit level with the title line */
    border: 2px solid var(--color-primary, #0090C8);
    border-radius: 4px;
    background-color: transparent;
    background-repeat: no-repeat;
    background-position: center;
    background-size: 74% 74%;
    cursor: pointer;
    opacity: 1;
    transition: background-color 0.12s ease, border-color 0.12s ease;
}
/* Checked — solid blue fill + white check. The :checked rule (0,2,0) beats the base
   .checkbox rules, and because there is no native control left, the DISABLED variant
   below inherits this exact look instead of the browser's gray. */
.home-todo-check:checked {
    background-color: var(--color-primary, #0090C8);
    border-color: var(--color-primary, #0090C8);
    background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Cpath%20fill='none'%20stroke='white'%20stroke-width='2.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20d='M3.5%208.5l3%203%206-7'/%3E%3C/svg%3E");
}
/* Auto-checked (server-detected) items are disabled so they can't be un-accomplished —
   force the identical blue + full opacity, overriding the base .checkbox:disabled
   {opacity:.5} that otherwise faded them. */
.home-todo-check:disabled { cursor: default; opacity: 1 !important; }
.home-todo-check:disabled:checked {
    background-color: var(--color-primary, #0090C8) !important;
    border-color: var(--color-primary, #0090C8) !important;
}
.home-todo-text { min-width: 0; }
.home-todo-title { font-weight: var(--font-weight-medium, 600); line-height: 1.35; }
.home-todo-desc {
    color: var(--color-text-muted, #555);
    font-size: var(--font-size-sm, 0.9375rem);
    line-height: 1.4;
    margin-top: 0.1rem;
}
.home-todo-action { justify-self: end; }
.home-todo-action .button { margin: 0; white-space: nowrap; }

/* Progressive reveal: the list shows only the first few OPEN to-dos; JS tags the rest
   with .home-todo-more-hidden and the "Show More" link reveals the whole rest at once.
   (The yellow alerts above are never capped — every warning always shows.) */
.home-todo-row.home-todo-more-hidden { display: none; }

/* Completed items: hidden by default (the card shows only what's left to do); the
   "Show all" toggle adds .show-all to the list to reveal them, struck-through. */
.home-todo-row.home-todo-done { display: none; }
.home-todo-list.show-all .home-todo-row.home-todo-done { display: grid; }
.home-todo-done .home-todo-title {
    text-decoration: line-through;
    text-decoration-color: var(--color-text-muted, #999);
    opacity: 0.7;
}
.home-todo-done .home-todo-desc { opacity: 0.85; }

/* "You're all done" note — shown in the default (incomplete-only) view when nothing
   is left; JS toggles the hidden attribute. */
.home-todo-alldone { margin: 0.35rem 0 0; }
/* Footer row: "Show More" (reveal the rest of the open to-dos) on the LEFT, the
   "Show / Hide Completed" toggle pushed to the RIGHT (margin-left:auto). Both sit on one
   line; margin-left:auto keeps the toggle right-aligned even when "Show More" is hidden. */
.home-todo-foot {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0.35rem 1rem;
    margin-top: 0.75rem;
}
/* Author display:flex above would otherwise defeat the `hidden` attribute — re-assert it. */
.home-todo-foot[hidden] { display: none; }
.home-todo-more-wrap { margin: 0; }
.home-todo-toggle-wrap { margin: 0; margin-left: auto; }
/* "Reset Checkboxes" — trails the Show Completed toggle on the right. Only ever shown
   when at least one user-ticked box exists, which also means a completed row exists,
   so in practice it sits beside the toggle rather than alone. No `display` here: that
   would defeat the `hidden` attribute the script uses to show/hide it (same trap the
   .home-todo-foot[hidden] rule above exists to undo). */
.home-todo-reset-wrap { margin: 0; }

@media (max-width: 575px) {
    /* On a phone the row is TWO columns, checkbox and text, and the row's button goes UNDER
       the text on a second line of the text column (owner, 2026-10-09). Three columns were
       kept here before ("tighten so all three still fit"), and at 390px the button's column
       squeezed each description into a narrow strip five lines tall. A row with no button
       gets no empty line. */
    .home-todo-row { grid-template-columns: 1.375rem 1fr; column-gap: 0.6rem; padding: 0.6rem 0; }
    .home-todo-check {
        width: 1.375rem !important;
        height: 1.375rem !important;
        min-width: 1.375rem !important;
    }
    .home-todo-action {
        grid-column: 2;
        justify-self: start;
        margin-top: 0.45rem;
    }
    .home-todo-action:empty { display: none; }
    .home-todo-action .button { padding-left: 0.5rem; padding-right: 0.5rem; }
}

/* ── Page header: ← Back button + left-justified titles (cross-site) ────────
   Shared by PacklistPRO, qMeet, and qFIT. The title left-justify lives on the
   base .page-title rule above (so the .text-center utility can still override
   it on the few pages that opt in — e.g. Login / Message-Sent). These rules
   pin the header's right-hand cluster (tip ⓘ / .page-header-actions) to the
   far right so the title group stays flush-left even on 3-item headers, and
   keep the ← glued to the title.

   The ← itself is injected / normalized by each site's site.js initBackButton()
   and rendered statically on each Error.aspx. */
.page-header > .tip-icon-button,
.page-header > .page-header-actions { margin-left: auto; }

/* Keep the ← on the same line as the title and let a long title wrap within
   its own column instead of orphaning the icon on a line above it.
   flex-basis 0% (not auto): the row's base size must never exceed the flex
   line, or a long title pushes the ⓘ trigger / actions cluster onto the next
   line on phones — instead the title shrinks and wraps inside its column. */
.page-header > .page-header-title-row {
    flex: 1 1 0%;
    min-width: 0;
    flex-wrap: nowrap;
}
.page-header-title-row > :not(.back-btn) {
    flex: 1 1 auto;
    min-width: 0;
}

/* A subtitle / description line sitting beside the title row — qMeet Surveys'
   "Take surveys shared with you…", CitiesNearMe's blurb, PacklistPRO's Park
   and EditPark intros. It is a SIBLING of the title row on the same flex line,
   and because the rule directly above gives the title row flex-basis 0% the
   title column absorbs 100% of the shrink: the description keeps its full
   max-content width and the title collapses toward nothing. Measured on prod
   2026-08-01 — qMeet Surveys at a 427px viewport left a 13px title column
   rendering "Surveys" ONE LETTER PER LINE (0px wide x 269px tall, .page-title
   has overflow-wrap:break-word), and PacklistPRO EditPark a 54px one. The band
   is wherever the description's max-content ALMOST fills the header, so it also
   bites on tablets: CitiesNearMe broke at 636-697px, not on phones.
   flex-basis 100% drops the description onto its own row under the title at
   every width, which is what all four call sites already mean by "subtitle".
   Bare <p> is covered so a page that simply drops a paragraph in the header is
   right by default; add .page-header-desc when the line is not a <p>.
   qMeet reached this same fix first, scoped to one class (Content/styles.css,
   `.page-header > .event-group-line`) — that rule still stands on its own.
   min-width, NOT just flex-basis: a max-width on the description CLAMPS its
   flex base size, so basis alone is not enough. qMeet's .cnm-subtitle caps at
   60ch, and with `flex: 1 0 100%` alone CitiesNearMe still broke at 637-697px
   (title 0-42px wide) because the clamped 582px base fit beside the title.
   min-width beats max-width, so the full-row break is unconditional. Corollary:
   a max-width on a description in here is now inert — don't add one expecting a
   reading measure (qMeet's .cnm-subtitle had one and it was removed, not
   overridden, so the dead declaration wouldn't mislead the next reader). */
.page-header > p,
.page-header > .page-header-desc {
    flex: 1 0 100%;
    min-width: 100%;
}

/* ← Back button icon. Two-class selector (.back-btn.back-btn-icon) so it wins
   over the base single-class .back-btn rules above. */
.back-btn.back-btn-icon {
    font-size: 1.6rem;
    line-height: 1;
    padding: 0.1rem 0 0.1rem 0.35rem;  /* no right padding — sit flush against the title */
    margin: 0 -0.5rem 0 -0.35rem;      /* R: cancel the title-row's 0.5rem flex gap; L: flush-left */
    min-height: 0;
    color: inherit;
    text-decoration: none;
    flex: 0 0 auto;
    align-self: center;                /* vertically center against the title */
}
.back-btn.back-btn-icon:hover,
.back-btn.back-btn-icon:focus-visible {
    background-color: transparent;
    opacity: 0.65;
    box-shadow: none;
}
@media print {
    .back-btn.back-btn-icon { display: none !important; }
}

/* ── 46. Color-picker grid (§4.3) ─────────────────────────────────────
   A client-side grid of color swatches for choosing a record color
   (categories, tags, etc.). Markup:
     <div class="color-picker-preview" …></div>
     <div class="color-picker-grid" role="group" aria-label="…">
        <button type="button" class="cp-swatch" data-color="#xxxxxx"
                aria-label="Color #xxxxxx" style="background-color:#xxxxxx"></button>
        …
     </div>
   Page JS wires clicks to a hidden field + the preview; no postbacks. */
.color-picker-preview {
    width: 100%;
    height: 2.25rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    margin: 0.25rem 0 0.5rem;
}
.color-picker-grid {
    display: grid;
    grid-template-columns: repeat(8, minmax(28px, 1fr));
    gap: 4px;
    max-width: 380px;
    margin-bottom: 0.75rem;
}
.cp-swatch {
    height: 28px;
    min-height: 28px;
    border: 1px solid rgba(0, 0, 0, 0.25);
    border-radius: 4px;
    cursor: pointer;
    padding: 0;
    font-size: 0.7rem;
    line-height: 1;
    transition: transform var(--transition-fast, 0.15s);
}
@media (pointer: coarse) {
    .cp-swatch { height: 32px; min-height: 32px; }
}
.cp-swatch:hover { transform: scale(1.08); }
.cp-swatch:focus-visible {
    outline: 2px solid var(--color-accent);
    outline-offset: 1px;
}
.cp-swatch.selected {
    box-shadow: 0 0 0 2px var(--color-bg-card), 0 0 0 3px var(--color-accent);
}
[data-theme="dark"] .cp-swatch { border-color: rgba(255, 255, 255, 0.25); }

/* ============================================================
   47. Cross-site visual-system extensions (additive, June 2026)
   Purely additive design tokens + utility classes that round out
   the existing system. Touches no existing rule. Safe for all
   three sites because every rule introduces NEW class names or
   NEW custom-property names that did not previously resolve. The
   token block also adds bigger-ring focus shadows for the danger
   and warning button variants so red/orange buttons no longer
   pick up the cyan default. Section header pattern matches the
   sections above so future audits can find the boundary.
   ============================================================ */

/* ── 47.1 Additional design tokens ────────────────────────────
   Light-mode values live in :root, dark overrides in [data-theme="dark"].
   The spacing / z-index scales formalize values that were repeated as
   magic numbers throughout the file; existing rules keep their literal
   values until they are migrated piecemeal. */
:root {
    /* Spacing scale — matches the existing utility ladder
       (gap-1=0.25, gap-2=0.5, gap-3=0.75, gap-4=1, plus 1.5, 2). */
    --space-0: 0;
    --space-1: 0.25rem;
    --space-2: 0.5rem;
    --space-3: 0.75rem;
    --space-4: 1rem;
    --space-5: 1.5rem;
    --space-6: 2rem;
    --space-7: 3rem;

    /* Touch target floor (iOS HIG 44px). Pre-existing min-height: 44px
       literals scattered through .button / .nav-toggle / .back-btn / etc. */
    --touch-target: 44px;

    /* Page container max-width — matches .page-wrapper / .site-nav .nav-inner. */
    --container-max: 1200px;

    /* Z-index scale — standardizes layer naming so future stacking-context
       additions don't fight existing numbers (nav 1000, modal 2000, toast 9999). */
    --z-base:     1;
    --z-sticky:   10;
    --z-dropdown: 100;
    --z-nav:      var(--nav-z, 1000);
    --z-overlay:  1500;
    --z-modal:    2000;
    --z-popover:  3000;
    --z-toast:    9999;

    /* Variant-tinted focus rings — pair with the matching button colors so
       the focus indicator is hue-consistent with the action it surrounds.
       Existing --shadow-focus-ring (cyan) remains the default. */
    --shadow-focus-danger:  0 0 0 3px rgba(211,  47,  47, 0.32);
    --shadow-focus-success: 0 0 0 3px rgba( 50, 205,  50, 0.32);
    --shadow-focus-warning: 0 0 0 3px rgba(230,  81,   0, 0.32);
    --shadow-focus-info:    0 0 0 3px rgba(  2, 119, 189, 0.32);
}
[data-theme="dark"] {
    --shadow-focus-danger:  0 0 0 3px rgba(239,  83,  80, 0.45);
    --shadow-focus-success: 0 0 0 3px rgba(102, 187, 106, 0.45);
    --shadow-focus-warning: 0 0 0 3px rgba(255, 167,  38, 0.45);
    --shadow-focus-info:    0 0 0 3px rgba( 79, 195, 247, 0.45);
}

/* ── 47.2 Missing focus rings for colored button variants ─────
   The base .button:focus-visible always paints the cyan accent ring,
   which clashes with red/orange/transparent buttons. Variant-matched
   rings keep the indicator hue-consistent without changing layout. */
.button.warning:focus-visible {
    box-shadow: var(--shadow-btn, 0 1px 2px rgba(0,0,0,0.15)),
                var(--shadow-focus-warning, 0 0 0 3px rgba(230, 81, 0, 0.32));
}
.button.transparent:focus-visible {
    box-shadow: 0 0 0 3px var(--color-primary-light),
                0 0 0 5px var(--color-primary);
}

/* ── 47.3 Layout / display utilities ─────────────────────────
   Round out the .d-* + .flex-* set. All additive — none of these
   class names appeared anywhere in the shared file as of audit. */
.d-inline       { display: inline; }
.d-inline-block { display: inline-block; }
.d-inline-flex  { display: inline-flex; }
.d-grid         { display: grid; }

.flex-column    { flex-direction: column; }
.flex-row       { flex-direction: row; }
.flex-row-reverse    { flex-direction: row-reverse; }
.flex-column-reverse { flex-direction: column-reverse; }
.flex-nowrap    { flex-wrap: nowrap; }
.flex-1         { flex: 1 1 0%; }
.flex-auto      { flex: 0 0 auto; }
.flex-grow-1    { flex-grow: 1; }
.flex-shrink-0  { flex-shrink: 0; }

.justify-start    { justify-content: flex-start; }
.justify-center   { justify-content: center; }
.justify-end      { justify-content: flex-end; }
.justify-between  { justify-content: space-between; }
.justify-around   { justify-content: space-around; }

.align-start    { align-items: flex-start; }
.align-center   { align-items: center; }
.align-end      { align-items: flex-end; }
.align-baseline { align-items: baseline; }
.align-stretch  { align-items: stretch; }

/* ── 47.4 Spacing utilities — round out the existing mt- / mb- set ── ──────────
   ⚠ NEVER let an asterisk be followed by a slash inside a comment here — that is
   the comment terminator, and it CLOSES THE COMMENT EARLY. Writing the class
   family as "mt-" star "/mb-" star does exactly that. This heading did until
   2026-08-11: the tail of the line then merged with the next selector, and the
   `.m-0` rule below was silently swallowed — it was absent from the CSSOM while
   its siblings .mt-0 / .mb-0 / .mt-5 were all present, which is how it was found.
   The damage was invisible on sites that also load Bootstrap, because Bootstrap
   defines .m-0 with !important; anywhere without Bootstrap it was simply gone. */
.m-0  { margin: 0; }
.mt-0 { margin-top: 0; }
.mr-0 { margin-right: 0; }
.mb-0 { margin-bottom: 0; }
.ml-0 { margin-left: 0; }
.mt-5 { margin-top: 1.5rem; }
.mb-5 { margin-bottom: 1.5rem; }
.mt-6 { margin-top: 2rem; }
.mb-6 { margin-bottom: 2rem; }
.mx-auto { margin-left: auto; margin-right: auto; }
.ms-auto { margin-left: auto; }
.me-auto { margin-right: auto; }
.my-auto { margin-top: auto; margin-bottom: auto; }

.p-0  { padding: 0; }
.p-1  { padding: 0.25rem; }
.p-2  { padding: 0.5rem; }
.p-3  { padding: 0.75rem; }
.p-4  { padding: 1rem; }
.p-5  { padding: 1.5rem; }
.pt-0 { padding-top: 0; }
.pb-0 { padding-bottom: 0; }
.pt-1 { padding-top: 0.25rem; }
.pt-2 { padding-top: 0.5rem; }
.pt-3 { padding-top: 0.75rem; }
.pt-4 { padding-top: 1rem; }
.pb-1 { padding-bottom: 0.25rem; }
.pb-2 { padding-bottom: 0.5rem; }
.pb-3 { padding-bottom: 0.75rem; }
.pb-4 { padding-bottom: 1rem; }
.px-1 { padding-left: 0.25rem; padding-right: 0.25rem; }
.px-2 { padding-left: 0.5rem;  padding-right: 0.5rem; }
.px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }
.px-4 { padding-left: 1rem;    padding-right: 1rem; }
.py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }
.py-2 { padding-top: 0.5rem;  padding-bottom: 0.5rem; }
.py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }
.py-4 { padding-top: 1rem;    padding-bottom: 1rem; }

.gap-0 { gap: 0; }
.gap-5 { gap: 1.5rem; }

.w-auto { width: auto; }
.h-100  { height: 100%; }
.h-auto { height: auto; }
.mw-100 { max-width: 100%; }

/* ── 47.5 Typography utilities ──────────────────────────────── */
.fw-normal { font-weight: var(--font-weight-normal); }
.fw-medium { font-weight: var(--font-weight-medium); }
.fw-bold   { font-weight: var(--font-weight-bold); }

.fs-xs   { font-size: var(--font-size-xs); }
.fs-sm   { font-size: var(--font-size-sm); }
.fs-base { font-size: var(--font-size-base); }
.fs-lg   { font-size: var(--font-size-lg); }
.fs-xl   { font-size: var(--font-size-xl); }
.fs-xxl  { font-size: var(--font-size-xxl); }

/* Tabular numerals — keeps columns of numbers (counters, prices, time
   remaining) from jittering across digit changes. Already used inline in
   .char-counter and .pager; standardize the helper class. */
.tabular-nums { font-variant-numeric: tabular-nums; }

/* Text color tokens to complete the .text-muted/.text-danger/.text-success
   triad with the remaining semantic colors. */
.text-info    { color: var(--color-info-text); }
.text-warning { color: var(--color-warning); }

/* Long-text overflow helpers. */
.text-truncate {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.text-break  { overflow-wrap: anywhere; word-break: break-word; }
.text-nowrap { white-space: nowrap; }
.text-wrap   { white-space: normal; }

/* ── 47.6 Border / shape helpers ────────────────────────────── */
.rounded     { border-radius: var(--border-radius); }
.rounded-sm  { border-radius: var(--border-radius-sm); }
.rounded-lg  { border-radius: var(--border-radius-lg); }
.rounded-pill { border-radius: 999px; }
.rounded-circle { border-radius: 50%; }
.border       { border: 1px solid var(--color-border); }
.border-top   { border-top: 1px solid var(--color-border); }
.border-bottom{ border-bottom: 1px solid var(--color-border); }
.border-0     { border: 0 !important; }
.shadow-sm    { box-shadow: var(--shadow-sm); }
.shadow-md    { box-shadow: var(--shadow-md); }
.shadow-lg    { box-shadow: var(--shadow-lg); }

/* ── 47.7 Responsive show/hide — extend the existing helpers ──
   Existing helpers:
     .hide-xs        (max-width: 575px)
     .hide-sm        (max-width: 767px)
     .show-xs-only   (hidden at min-width: 768px)
   Filling in the gap so the same idiom works at md and lg breakpoints. */
@media (max-width: 991px)  { .hide-md      { display: none !important; } }
@media (max-width: 1199px) { .hide-lg      { display: none !important; } }
@media (max-width: 575px)  { .show-sm-up   { display: none !important; } }
@media (max-width: 767px)  { .show-md-up   { display: none !important; } }
@media (max-width: 991px)  { .show-lg-up   { display: none !important; } }
@media (max-width: 1199px) { .show-xl-up   { display: none !important; } }

/* ── 47.8 Skip-link target marker ─────────────────────────────
   Pair with the existing .skip-link. The skip target needs tabindex="-1" to
   receive focus at all; this suppresses the ring it would otherwise draw.
   All five masters render the target as id="main-content" (class is
   page-wrapper), so that selector is the one that actually fires -- it was
   missing until 2026-08-12 and the whole rule was inert. The [id="main"] and
   .main-content selectors stay for any page using those older markers. */
[id="main"]:focus,
[id="main-content"]:focus,
.main-content:focus { outline: none; }

/* ── 47.9 prefers-reduced-transparency (a11y) ─────────────────
   Honor the OS setting (macOS Reduce Transparency, Windows Transparency
   effects off). Solidify backdrop-filtered surfaces so motion-sensitive or
   low-contrast users don't get hard-to-read blurred chrome. */
@media (prefers-reduced-transparency: reduce) {
    /* Every popup backdrop reads these two tokens (section 18), so re-pointing them here
       covers all of them at once - not only .modal-overlay, which was the one rule this
       block used to name. */
    :root {
        --popup-backdrop-bg: rgba(15, 23, 42, 0.85);
        --popup-backdrop-filter: none;
    }
    .nav-item:hover .nav-dropdown,
    .nav-item:focus-within .nav-dropdown {
        backdrop-filter: none;
        -webkit-backdrop-filter: none;
        background-color: var(--color-bg-nav);
    }
}

/* ── 47.10 Forced-colors mode (Windows High Contrast) ─────────
   Tabs/buttons/forms must continue to read in WHCM. Outlines replace
   color cues, and the explicit `forced-color-adjust: auto` keeps the
   system theme in charge of decoration on interactive elements. */
@media (forced-colors: active) {
    .button,
    .pill,
    .nav-link,
    .alert-panel,
    .card,
    .main-card,
    .data-table th,
    .data-table td { forced-color-adjust: auto; }
    .button { border: 1px solid ButtonText; }
    :focus-visible { outline-color: Highlight; }

    /* 🛑 A CONTROL DRAWN ONLY AS A BACKGROUND IMAGE HAS NO RENDERING LEFT IN THIS MODE.
       Bootstrap's .btn-close is exactly that: an empty <button> whose × is a black SVG
       background-image. Forced-colors DROPS background images, so the button becomes a
       blank box - present to a screen reader (it carries aria-label="Close") but invisible
       to a sighted high-contrast user, who sees nothing to click.
       That is not cosmetic. It dismisses seven PacklistPRO modals (EditTrip, TripDashboard,
       Trips) and qMEET's chat toast - and on a RED chat toast the × is the ONLY way to close
       it, because the click-anywhere-to-dismiss handler is deliberately skipped for error
       toasts. So in Windows High Contrast the one dismiss control disappears.
       Draw a real glyph instead of relying on the image, and give it a border so the hit
       area is visible. Scoped entirely inside this media block, so normal rendering keeps
       Bootstrap's SVG untouched. (Test plan row A11Y-31.) */
    .btn-close {
        background-image: none;
        border: 1px solid ButtonText;
        opacity: 1;
        position: relative;
        forced-color-adjust: none;
    }
    .btn-close::before {
        content: "\00D7";
        color: ButtonText;
        position: absolute;
        top: 0; right: 0; bottom: 0; left: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 1.1em;
        line-height: 1;
    }
}

/* ── 47.11 Data-table density variant ─────────────────────────
   .data-table-compact tightens row padding for log viewers / admin
   grids that prioritize density over breathing room. Stripe / hover /
   sticky behaviors continue to come from the base .data-table rules. */
.data-table-compact th,
.data-table-compact td {
    padding: 0.35rem 0.5rem;
}
.data-table-compact th { font-size: 0.68rem; }

/* ── 47.12 Image-rendering helpers ─────────────────────────────
   Some sites embed pixel-art icons (8-bit progress badges) that look
   blurred under the default smooth scaling. */
.img-crisp { image-rendering: pixelated; }
.img-cover { object-fit: cover; }

/* ── 47.13 Cursor + interaction helpers ──────────────────────── */
.cursor-not-allowed { cursor: not-allowed; }
.cursor-grab        { cursor: grab; }
.user-select-none   { user-select: none; }
.user-select-all    { user-select: all; }

/* ── 47.14 Aspect-ratio helpers ─────────────────────────────── */
.ratio-1x1  { aspect-ratio: 1 / 1; }
.ratio-4x3  { aspect-ratio: 4 / 3; }
.ratio-16x9 { aspect-ratio: 16 / 9; }

/* ── 48. Profile hero, avatar & detail-list (cross-site) ───────────────────
   Reusable building blocks for member/public-profile pages: a hero band with a
   circular avatar (photo or colored monogram fallback) + name + an at-a-glance
   status/location line, plus a two-column key/value "detail list" for use inside
   cards. Introduced for qMeet's PublicProfile2 (card-based redesign) but named
   generically so any site's profile page can adopt them. Theme-aware via tokens. */

.profile-hero {
    display: flex;
    flex-direction: row;      /* avatar on the left, presence + location to its right */
    align-items: center;
    text-align: left;
    gap: 1rem;
}
.profile-hero-body { min-width: 0; }

/* Online/recent/idle status dot beside the "Active …" line. */
.profile-hero-status {
    display: flex;
    align-items: center;
    justify-content: flex-start;   /* left-aligned beside the avatar */
    gap: 0.45rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}
.profile-hero-loc {
    margin-top: 0.25rem;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}
.profile-online-dot {
    display: inline-block;
    width: 0.6rem;
    height: 0.6rem;
    flex-shrink: 0;
    border-radius: 50%;
    background: var(--color-text-light);   /* idle / unknown */
}
.profile-online-dot.is-online {
    background: #22c55e;
    box-shadow: 0 0 0 3px color-mix(in srgb, #22c55e 25%, transparent);
}
.profile-online-dot.is-recent { background: var(--color-warning); }

/* Circular avatar — fixed square, image cover-cropped; monogram modifier paints
   an accent disc with a centered initial when the member has no photo. */
.profile-avatar {
    display: block;
    width: 84px;
    height: 84px;
    flex-shrink: 0;
    border-radius: 50%;
    overflow: hidden;
    border: 1px solid var(--color-border);
}
.profile-avatar img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.profile-avatar-mono {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--color-accent);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
    font-size: 2rem;
    font-weight: var(--font-weight-bold);
    line-height: 1;
    text-transform: uppercase;
    border-color: transparent;
}
@media (max-width: 480px) {
    .profile-avatar { width: 64px; height: 64px; }
    .profile-avatar-mono { font-size: 1.5rem; }
}

/* Title text inside a collapsible card's toggle (icon + label on one baseline). */
.profile-card-title {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
}

/* Two-column key/value list (label | value), e.g. profile "Details" card. */
.detail-list {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 0.4rem 1rem;
    margin: 0;
}
.detail-list dt,
.detail-label {
    margin: 0;
    color: var(--color-text-muted);
    font-weight: var(--font-weight-medium);
}
.detail-list dd,
.detail-value {
    margin: 0;
    color: var(--color-text);
    min-width: 0;
}

/* ── Site-wide announcement banner ─────────────────────────────────────────
   Rendered after the nav on every page by Site.Master when an active
   announcement exists for the site (see Shared\SiteAnnouncements.vb). Mirrors
   the qMeet ChatUC ".reply-quote" panel: bordered card + absolute close button.
   Dark-mode colors come automatically from the host site's [data-theme] vars. */
.site-announce {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    margin: 0.75rem auto;
    max-width: 1100px;
    padding: 0.7rem 2.4rem 0.7rem 0.9rem;
    border: 1px solid rgba(255, 255, 255, 0.25);
    border-left: 4px solid rgba(255, 255, 255, 0.55);
    border-radius: 8px;
    background: #0000ff;          /* info: blue */
    color: #ffffff;
    font-size: var(--font-size-sm, 0.95rem);
    line-height: 1.4;
}
.site-announce--warn {
    background: #ff8000;          /* warning: orange */
    color: #1a1a1a;               /* dark text — white is unreadable on bright orange */
}
/* Warn variant flips the white text/links/close (set above for the blue info banner) to
   dark so they stay legible on the orange background. More specific than the base rules,
   so it wins regardless of source order. */
.site-announce--warn .site-announce-text a { color: #1a1a1a; }
.site-announce--warn .site-announce-close { color: rgba(0, 0, 0, 0.6); }
.site-announce--warn .site-announce-close:hover { color: #000000; }
.site-announce-body { flex: 1 1 auto; min-width: 0; word-wrap: break-word; overflow-wrap: anywhere; }
.site-announce-title { font-weight: var(--font-weight-bold, 700); text-transform: uppercase; }
.site-announce-text a { color: #ffffff; text-decoration: underline; }
.site-announce-close {
    position: absolute;
    top: 0.35rem;
    right: 0.5rem;
    background: none;
    border: none;
    cursor: pointer;
    color: rgba(255, 255, 255, 0.75);
    font-size: 1.25rem;
    font-weight: bold;
    line-height: 1;
    padding: 0 0.25rem;
}
.site-announce-close:hover { color: #ffffff; }

/* ── Collapsible Home cards ─────────────────────────────────────────────────
   The per-site Home page enhances each .main-card: everything after the card's
   first .heading is wrapped in .home-card-body and the heading becomes a toggle
   (adds .home-collapsible; clicking toggles .home-collapsed to hide the body).
   A chevron on the heading shows the state. */
.home-collapsible > .heading {
    cursor: pointer;
    user-select: none;
    display: flex;
    align-items: center;
    gap: 0.5rem;
}
.home-collapsible > .heading::after {
    content: "";
    flex: 0 0 auto;
    /* order + NO auto margin: the chevron sits immediately after the title text,
       ahead of the count pill and summary (owner, 2026-08-20). See the ordering
       note on .home-head-count below. */
    order: 1;
    width: 0.5em;
    height: 0.5em;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(225deg);           /* chevron points UP = expanded (flipped 2026-10-10, UI review Site-67) */
    transition: transform 0.15s ease;
    opacity: 0.55;
}
.home-collapsible.home-collapsed > .heading::after {
    transform: rotate(45deg);            /* chevron points DOWN = collapsed */
}
.home-collapsible.home-collapsed > .home-card-body {
    display: none;
}

/* ── Card headline: count pill + short summary ───────────────────────────────
   Stamped by SiteCore.cardCounts onto a card's title from its data-count-sel /
   data-summary-sel attributes, so a SHUT card still says how much is inside.
   Both live inside the title element, which is why they survive the collapse:
   the enhancers only ever hide what comes AFTER the title.

   Moved here from qMEET's Content/styles.css on 2026-08-06 — it was the only site
   with the badge and all five needed it. Do not re-add a local copy.

   🔑 TITLE-ROW ORDER, set 2026-08-20 — chevron 1, summary 2, count 3 (the title
   text is an anonymous flex item at the default 0, so it always leads).
   DOM order is title, summary, count and the chevron is an ::after, i.e. LAST —
   so without `order` the chevron can only ever render at the far right, which is
   exactly the inconsistency the owner reported: a card with no pill put its arrow
   at the right edge, a card with one put it right of the pill, and a <details>
   card put a "▸" before the title. Three positions for one control.

   ⚠ THE CHEVRON MUST NOT CARRY margin-left:auto. Flexbox splits free space EQUALLY
   between competing auto margins, so when it had one too the pill landed halfway
   across the title instead of at the right edge — which is what the pair of
   `.home-head-hascount ::after { margin-left: 0 }` rules deleted here existed to
   patch. With the chevron's auto margin gone, the pill's is the only one and it
   reaches the right edge on its own, in every combination. */
.home-head-count {
    margin-left: auto;
    order: 3;
    flex: 0 0 auto;
    align-self: center;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.5rem;
    height: 1.35rem;
    padding: 0 0.5rem;
    border-radius: 999px;
    background: var(--color-accent);
    color: #111;                     /* 7.61:1 on the cyan; white was 2.48:1 */
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-bold);
    font-variant-numeric: tabular-nums;
}
/* The written-out alternative, for cards whose body is a sentence rather than a
   list ("Daily pace: 12% vs last week"). Quiet, never bold, and clipped rather
   than allowed to push the title into a second and third line. */
.home-head-summary {
    margin-left: auto;
    order: 2;
    align-self: center;
    min-width: 0;
    max-width: 60%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-normal);
    color: var(--color-text-muted);
}
/* A summary AND a badge: the summary takes the free space, the badge sits last. */
.home-head-hascount .home-head-summary { margin-right: 0.15rem; }
.home-head-hascount .home-head-summary + .home-head-count,
.home-head-summary + .home-head-count { margin-left: 0; }
/* ⚠ CHANGED 2026-08-12 (owner decision): below 768px the sentence gets its OWN LINE
   instead of being clipped. This block used to read `max-width: 45%` under 575.98px,
   with the note "on a phone the title itself needs the width more than the sentence
   does" — but the base rule above is nowrap + ellipsis, so the narrower cap did not
   shorten the sentence, it AMPUTATED it. Measured on qFIT /Dashboard at a 380px
   viewport: "Daily pace: ▼ 39% vs last week · ▲ 23% vs last month" wanted 329px and
   got 143px, so everything from "last week" onward — the entire second statistic —
   was invisible, not abbreviated. It is two independent figures joined by a
   separator, and the cap always cut the second one.
   ⇒ full width, wrapping, nothing hidden. Re-measured after: 318px wide, 2 lines,
   scrollWidth == clientWidth, sitting on its own line under the title, page
   scrollWidth still 380 = viewport.
   🔑 767.98px, NOT 575.98px. The base cap is 60% OF THE TITLE ROW, so the clipping
   does not stop at the phone breakpoint — at a 576px viewport the row is ~530px and
   60% of that is ~318px, still short of the 329px the sentence needs. 768px up is the
   first width where the one-line form genuinely fits, so that is where it resumes.
   🔑 `order: 4` sends the sentence to its own line while keeping the CHEVRON (1) and
   the count pill (3) up on the title's row — a full-width summary ordered ahead of
   them would push both onto a third line. It was `order: 1` until 2026-08-20, which
   worked only while the chevron and pill sat at the default 0; it MUST stay above
   whatever `.home-head-count` uses. No card pairs a summary with a count today
   (checked /Dashboard, /Home, /ToDo, /MyWeek, /CatchUp, /Charts — one summary card,
   no count), but the `.home-head-summary + .home-head-count` rule above anticipates
   the pairing, so this stays correct if it ever ships. */
@media (max-width: 767.98px) {
    .home-head-summary {
        flex: 1 0 100%;
        order: 4;
        max-width: none;
        margin-left: 0;
        white-space: normal;
        overflow: visible;
        text-overflow: clip;
    }
}

/* ── Collapsible `.card-title` cards (the dashboards) ────────────────────────
   SiteCore.collapsibleCards stamps .home-head-toggle on the title it made
   clickable. Keyed on that class rather than on `.card-title` so the many
   non-collapsible cards using the same class are untouched, and so it works
   whether the title is the card's first child (PacklistPRO's Trip Dashboard) or
   nested in a header row beside its buttons (qFIT's Exercise Randomizer). */
.home-head-toggle { cursor: pointer; user-select: none; }
.home-head-toggle::after {
    content: "";
    flex: 0 0 auto;
    align-self: center;
    /* order + NO auto margin — see .home-head-count below. */
    order: 1;
    width: 0.5em;
    height: 0.5em;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(225deg);           /* chevron points UP = expanded (flipped 2026-10-10, UI review Site-67) */
    transition: transform 0.15s ease;
    opacity: 0.55;
}
.home-collapsed .home-head-toggle::after {
    transform: rotate(45deg);            /* chevron points DOWN = collapsed */
}
/* The title keeps its underline while open; a shut card has no body under it, so
   the rule would draw a line across the bottom of an otherwise empty box.
   🔑 The :not([open]) arm was added 2026-08-20. A native <details> card is shut by
   a mechanism the JS never touches, so it never gets .home-collapsed and kept its
   underline — sitting next to a JS card that had dropped it, which is the same
   "one control, two appearances" the chevron rewrite above fixes. */
.home-collapsible.home-collapsed > .card-title,
.home-collapsible.home-collapsed > * > .card-title,
details.main-card:not([open]) > summary.card-title {
    margin-bottom: 0;
    padding-bottom: 0;
    border-bottom: 0;
}
/* A hero card's title is a <p class="largeheading"> (2026-09-27, [data-fold]). Unlike
   .card-title and .home-collapsible > .heading it is not a flex row, so the ::after
   chevron above — sized with width/height — would be an empty inline box and draw nothing. */
.home-collapsible > .largeheading.home-head-toggle {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}
.home-collapsible.home-collapsed > .largeheading.home-head-toggle {
    margin-bottom: 0;
}


/* ── Share panel (EventSearch / GroupSearch "🔗 Share" float panel) ──────────────
   Reuses the .modal-overlay/.modal-box centered-dialog shell; these rules style the
   inner sections. Injected once into <body> by Scripts/share-panel.js. */
.share-box {
    max-width: 30rem;
    text-align: left;
    /* Cap the panel to the viewport and scroll inside it. A Share / Invite panel with the
       contacts + invite sections open was overflowing the screen on desktop (>640px) with no
       way to reach the bottom actions — only the inner contact list scrolled. (On phones the
       .modal-box already caps + scrolls via the ≤640px rule.) */
    max-height: calc(100vh - 2rem);
    overflow-y: auto;
}
.share-subtitle { margin: 0.15rem 0 0.75rem; font-weight: 600; }
.share-batch-hint { margin: 0.5rem 0 0; }
.share-section { margin-bottom: 0.9rem; }
.share-section .input-label { display: block; margin-bottom: 0.3rem; }
.share-link-row,
.share-email-row { display: flex; gap: 0.4rem; align-items: stretch; }
.share-link-row .textbox,
.share-email-row .textbox { flex: 1 1 auto; min-width: 0; }
.share-link-row .button,
.share-email-row .button { flex: 0 0 auto; white-space: nowrap; }

.share-contact-list {
    max-height: 11rem;
    overflow-y: auto;
    border: 1px solid var(--color-border, rgba(127, 127, 127, 0.3));
    border-radius: 8px;
    padding: 0.25rem;
    margin-top: 0.35rem;
}
.share-contact-row {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    padding: 0.4rem 0.5rem;
    border-radius: 6px;
    cursor: pointer;
}
.share-contact-row:hover { background: var(--color-bg-hover, rgba(127, 127, 127, 0.12)); }
.share-contact-row .checkbox { flex: 0 0 auto; margin: 0; }
.share-contact-name { flex: 1 1 auto; }

/* Contacts already invited / already on the event or group: dimmed, not selectable,
   with a small status badge so the picker indicates who's already been invited. */
.share-contact-row.is-done { cursor: default; opacity: 0.72; }
.share-contact-row.is-done:hover { background: transparent; }
.share-contact-row.is-done .share-contact-name { color: var(--color-text-muted, #6b7280); }
.share-contact-badge {
    flex: 0 0 auto;
    font-size: 0.72rem;
    line-height: 1;
    font-weight: 600;
    padding: 0.2rem 0.45rem;
    border-radius: 999px;
    white-space: nowrap;
}
.share-contact-badge.invited {
    color: #166534;
    background: rgba(34, 197, 94, 0.16);
    border: 1px solid rgba(34, 197, 94, 0.4);
}
.share-contact-badge.member {
    color: var(--color-text-muted, #6b7280);
    background: rgba(127, 127, 127, 0.14);
    border: 1px solid rgba(127, 127, 127, 0.32);
}

.share-domain-chips { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.45rem; }
.share-domain { cursor: pointer; }

/* Optional personal note sent with the share/invite. min-height:0 beats the `.textarea`
   floor above (~2.5 input-heights) so rows="2" governs — this box is an OPTIONAL extra at
   the bottom of an already-tall panel, and a six-line well reads as required.
   ⚠ The box must carry class "textarea", not "textbox": the floor matches the former at
   0,1,0 (so this 0,1,1 selector wins on specificity anywhere) but the latter at 0,1,1,
   where a site-local override would tie and then LOSE on load order. */
textarea.share-comment { min-height: 0; height: auto; }
.share-comment-hint { margin: 0.3rem 0 0; }
/* Remaining-character readout, only rendered near the cap (see renderCommentCount). */
.share-comment-count { display: inline-block; margin-left: 0.25rem; font-variant-numeric: tabular-nums; }

.share-email-tags { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.5rem; }
.share-tag {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.2rem 0.3rem 0.2rem 0.6rem;
    border-radius: 999px;
    background: var(--color-bg-hover, rgba(127, 127, 127, 0.16));
    font-size: 0.9em;
}
.share-tag-x {
    border: none;
    background: transparent;
    color: inherit;
    cursor: pointer;
    font-size: 1.1em;
    line-height: 1;
    padding: 0 0.2rem;
    opacity: 0.7;
}
.share-tag-x:hover { opacity: 1; }

.share-actions { justify-content: space-between; margin-top: 0.5rem; }
.share-login-nudge { margin: 0.25rem 0 0.5rem; }
.share-result { margin-top: 0.5rem; min-height: 1.2em; font-weight: 600; }

/* ── PWA info popup ──────────────────────────────────────────────────────
   Any element with class "pwa-info-link" opens the #pwa-info-overlay panel
   (markup + JS live in each site's Site.Master). Explains what an installed
   app (PWA) is and how to install it on iPhone/Android. Mirrors the primer
   modal's look; scoped to .pwa-info-*. */
.pwa-info-overlay {
    position: fixed; inset: 0; z-index: 1200;               /* above chat/notification bars + primer */
    display: flex; align-items: center; justify-content: center;
    padding: 16px; background: var(--popup-backdrop-bg);
    -webkit-backdrop-filter: var(--popup-backdrop-filter); backdrop-filter: var(--popup-backdrop-filter);
    animation: pwa-info-fade .18s ease-out;
}
.pwa-info-overlay[hidden] { display: none; }
@keyframes pwa-info-fade { from { opacity: 0; } to { opacity: 1; } }
body.pwa-info-lock { overflow: hidden; }
.pwa-info-dialog {
    position: relative; width: 100%; max-width: 540px; max-height: calc(100vh - 32px);
    overflow-y: auto;
    background: var(--color-bg-card, #fff); color: var(--color-text);
    border: 1px solid var(--color-border); border-radius: var(--border-radius, 12px);
    box-shadow: 0 18px 50px rgba(0,0,0,.35); padding: 22px 22px 18px; outline: none;
    animation: pwa-info-pop .2s ease-out;
}
@keyframes pwa-info-pop { from { transform: translateY(8px) scale(.98); opacity: 0; } to { transform: none; opacity: 1; } }
.pwa-info-close {
    position: absolute; top: 8px; right: 10px; width: 32px; height: 32px;
    border: none; background: transparent; color: var(--color-text-muted);
    font-size: 24px; line-height: 1; cursor: pointer; border-radius: 50%;
}
.pwa-info-close:hover { background: var(--color-bg-input); color: var(--color-text); }
.pwa-info-h { font-size: var(--font-size-xl, 1.3rem); font-weight: var(--font-weight-bold, 700); margin: 0 6px 10px 0; padding-right: 28px; }
.pwa-info-sub { font-size: var(--font-size-lg, 1.1rem); font-weight: var(--font-weight-bold, 700); margin: 16px 0 6px; }
.pwa-info-dialog p { margin: 0 0 10px; line-height: var(--line-height, 1.5); }
.pwa-info-steps { margin: 0; padding-left: 22px; }
.pwa-info-steps li { margin: 0 0 6px; line-height: var(--line-height, 1.5); }
.pwa-info-actions { margin-top: 18px; display: flex; justify-content: flex-end; }

/* ==========================================================================
   City autocomplete  (shared/city-autocomplete.js)
   Server-backed US-city typeahead popup anchored under any input carrying
   data-city-autocomplete. Theme-aware via the shared color tokens.
   ========================================================================== */
.city-ac-anchor { position: relative; }
.city-ac-list {
    position: absolute; z-index: 1000; left: 0; right: 0; top: 100%;
    margin: 4px 0 0; padding: 4px; list-style: none;
    max-height: 260px; overflow-y: auto;
    background: var(--color-bg-card, #fff);
    border: 1px solid var(--color-border, #b6cede);
    border-radius: var(--border-radius-sm, 6px);
    box-shadow: var(--shadow-lg, 0 12px 24px -8px rgba(15,23,42,.15));
}
.city-ac-list[hidden] { display: none; }
.city-ac-item {
    display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
    padding: 7px 10px; cursor: pointer;
    border-radius: var(--border-radius-sm, 6px);
    color: var(--color-text, #1a1f2e);
    line-height: var(--line-height, 1.4);
}
.city-ac-item:hover,
.city-ac-item.active {
    background: var(--color-accent-light, #e0f6fe);
    color: var(--color-text, #1a1f2e);
}
:root[data-theme="dark"] .city-ac-item:hover,
:root[data-theme="dark"] .city-ac-item.active {
    background: var(--color-bg-input, #555);
}
.city-ac-name { font-weight: var(--font-weight-medium, 500); }
.city-ac-state {
    flex: none; font-size: .85em; font-weight: var(--font-weight-bold, 700);
    letter-spacing: .04em; color: var(--color-text-muted, #6c757d);
}
.city-ac-empty {
    padding: 8px 10px; color: var(--color-text-muted, #6c757d);
    font-style: italic; cursor: default;
}

/* ════════════════════════════════════════════════════════════════════════
   📖 TUTORIAL SYSTEM  (Scripts/tutorial.js + TutorialButton.ascx)
   Cross-site canonical copy (added 2026-07-17 during the help-system redesign
   that ported the qMEET pattern to PacklistPRO / qFIT / NobodyHasTHIS /
   paulmendelson.com). Two surfaces share ONE look:
     • Tutorial — opened on demand (📖 button / Tutorials index / ?tutorial=1).
     • "Need to Know" (NTK) — auto-opens once, DB-tracked; identical
       dialog with a warning-colored top stripe as the only tell.
   All colors use shared design tokens so it tracks light/dark automatically.
   Deliberately NEW names (.tutorial-*) so they never collide with the older
   .tips-trigger-wrap / .tip-icon-button / .primer-* rules that some sites
   still render during the transition.
   ════════════════════════════════════════════════════════════════════════ */

/* ── 📖 trigger (TutorialButton.ascx) ─────────────────────────────────────
   Sits in the upper-right of <main class="page-wrapper">, same footprint as
   the ⓘ Tips trigger it replaces. (main.page-wrapper{position:relative} is
   already set site-wide and is what these absolute offsets hang off.) */
.tutorial-trigger-wrap {
    position: absolute;
    top: 1rem;
    right: 1rem;
    z-index: 5;
    margin: 0;
}
@media (min-width: 768px) {
    .tutorial-trigger-wrap { top: 1.5rem; right: 1.5rem; }
}
@media (min-width: 1200px) {
    .tutorial-trigger-wrap { top: 2rem; right: 1.5rem; }
}

/* 2.75rem is the minimum comfortable tap target — the glyph is small, the hit
   area is not. Matches the ⓘ it replaces pixel for pixel. */
.tutorial-icon-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.75rem;
    min-height: 2.75rem;
    padding: 0.25rem;
    border: none;
    background: transparent;
    color: var(--color-text-muted, #6c757d);
    font-size: 1.25rem;
    line-height: 1;
    cursor: pointer;
    border-radius: var(--border-radius-sm, 6px);
    transition: color var(--transition-fast, 0.15s ease),
                background-color var(--transition-fast, 0.15s ease);
}
.tutorial-icon-button:hover {
    color: var(--color-text, #1a1f2e);
    background-color: var(--color-primary-light, #e0f6fe);
}
.tutorial-icon-button:focus-visible {
    outline: 2px solid var(--color-border-focus, var(--color-primary, #0090C8));
    outline-offset: 2px;
}

/* Reserve right-side space so a long page title can't run under the trigger. */
.tutorial-trigger-wrap ~ .page-title,
.tutorial-trigger-wrap ~ .page-header,
.tutorial-trigger-wrap ~ * .page-title,
.tutorial-trigger-wrap ~ * .page-header {
    padding-right: 3rem;
}

/* ── modal overlay (Tutorial + NTK) ─────────────────────────────────────── */
.tutorial-overlay {
    position: fixed;
    inset: 0;
    z-index: 1100;                     /* above sticky nav / chat / notification bars */
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 16px;
    background: var(--popup-backdrop-bg);
    -webkit-backdrop-filter: var(--popup-backdrop-filter);
    backdrop-filter: var(--popup-backdrop-filter);
    animation: tutorial-fade .18s var(--ease-out-quint, ease-out);
}
.tutorial-overlay[hidden] { display: none; }
@keyframes tutorial-fade { from { opacity: 0; } to { opacity: 1; } }

/* Lock background scroll while any tutorial/NTK panel is open. */
body.tutorial-lock { overflow: hidden; }

/* ⚠ The overlay's z-index (1100 above) is NOT enough on its own. It was chosen to clear
   the sticky nav / chat / notification bars, but the fixed pill cluster and the
   scroll-to-top button were added LATER at higher layers and so rendered ON TOP of the
   dimmed backdrop — visible over the dialog and still clickable behind it:
       .tutorial-help-pill  1502  (this file, all sites)
       .back-to-top         9998  (this file, all sites)
       .here-badge          1500  (qMEET/Content/styles.css)
       .admin-review-fab    1501  (qMEET/Content/styles.css)
   Measured on qMEET /Home with the NTK panel open, 380px viewport, 2026-08-12.
   Hiding them off body.tutorial-lock — the class that ALREADY locks background scroll —
   fixes every one of them at once and ends the z-index arms race a bump would start
   (back-to-top has nothing to scroll while the lock is on, and the ❓ only reopens the
   panel that is already open). Raising the overlay instead would have to clear 9998 and
   would still lose to the next fixed thing anyone adds.
   🔑 Two-class selectors (0,2,0) beat each pill's own single-class rule at ANY load
   order, so this needs no !important even though styles_shared.css loads LAST.
   .here-badge / .admin-review-fab are qMEET-only; naming them here keeps the cluster in
   one place and costs nothing on the sites that never render them. */
body.tutorial-lock .tutorial-help-pill,
body.tutorial-lock .back-to-top,
body.tutorial-lock .here-badge,
body.tutorial-lock .admin-review-fab { display: none; }

.tutorial-dialog {
    position: relative;
    width: 100%;
    max-width: 540px;
    max-height: calc(100vh - 32px);
    display: flex;
    flex-direction: column;
    background: var(--color-bg-card, #fff);
    color: var(--color-text);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius, 12px);
    box-shadow: 0 18px 50px rgba(0, 0, 0, .35);
    padding: 22px 22px 18px;
    outline: none;
    animation: tutorial-pop .2s var(--ease-out-quint, ease-out);
}
@keyframes tutorial-pop {
    from { opacity: 0; transform: translateY(8px) scale(.98); }
    to   { opacity: 1; transform: none; }
}

.tutorial-close {
    position: absolute;
    top: 8px;
    right: 10px;
    width: 32px;
    height: 32px;
    border: none;
    background: transparent;
    color: var(--color-text-muted);
    font-size: 24px;
    line-height: 1;
    cursor: pointer;
    border-radius: 50%;
}
.tutorial-close:hover { background: var(--color-bg-input); color: var(--color-text); }

/* ── Dialog titlebar: WHICH page this popup belongs to ─────────────────────
   Added 2026-07-31. Every NTK panel's own <h2> reads "💡 Things You Should
   Know" — identical on all 45 of them across three sites — so before this row
   existed the popup carried no clue which page had raised it. Authored per
   page in the markup (NOT derived from the page's <h1> at runtime: half the
   host pages render an ENTITY name there — the exercise, the item, the event —
   which is not the page's name).

   Deliberately a quiet titlebar and not a second heading: it sits above the
   panel's <h2> and must never compete with it. */
.tutorial-pagetitle {
    font-size: var(--font-size-sm, .85rem);
    font-weight: var(--font-weight-bold, 700);
    color: var(--color-text-muted);
    letter-spacing: .02em;
    margin: 0 0 12px;
    padding: 0 28px 8px 0;             /* clear the × */
    border-bottom: 1px solid var(--color-border);
}

/* Progress: "Step X of N" + dots */
.tutorial-progress {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 14px;
    padding-right: 28px;               /* clear the × */
    min-height: 12px;                  /* hold the row height on a multi-panel overlay */
}
/* A single-panel overlay hides this row wholesale (tutorial.js) — one dot is not
   progress, it is an unexplained blue dot, and the step count is blank there too.
   The [hidden] attribute alone would LOSE to the display:flex above, so state it. */
.tutorial-progress[hidden] { display: none; }
.tutorial-stepcount {
    font-size: var(--font-size-sm, .85rem);
    color: var(--color-text-muted);
    white-space: nowrap;
}
.tutorial-dots { display: flex; gap: 7px; flex-wrap: wrap; }
.tutorial-dot {
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background: var(--color-border);
    transition: background .15s ease, transform .15s ease;
}
.tutorial-dot.active {
    background: var(--color-accent, var(--color-primary));
    transform: scale(1.15);
}

/* Panels */
.tutorial-body {
    flex: 1 1 auto;
    overflow-y: auto;
    min-height: 150px;
}
.tutorial-panel { animation: tutorial-fade .18s ease-out; }
.tutorial-panel[hidden] { display: none; }
.tutorial-h {
    font-size: var(--font-size-xl, 1.3rem);
    font-weight: var(--font-weight-bold, 700);
    margin: 0 0 10px;
}
.tutorial-panel p { margin: 0 0 10px; line-height: var(--line-height, 1.5); }
.tutorial-panel ul { margin: 0 0 10px; padding-left: 1.15rem; }
.tutorial-panel li { margin: 0 0 7px; line-height: var(--line-height, 1.5); }

/* Optional inline color-swatch chips (e.g. demoing item color codes in a tour). */
.tutorial-swatch {
    display: inline-block;
    width: 14px; height: 14px;
    border-radius: 3px;
    border: 1px solid var(--color-border);
    vertical-align: -2px;
    margin-right: 2px;
}
.tutorial-swatch-important { background: #ffff00; border-color: #000; }
.tutorial-swatch-low { background: #b0b0b0; border-color: #000; }

/* "Don't keep showing this" — lives IN the footer, immediately left of the ✓ Got It button.
   margin-right:auto pins it to the far left of the row; the button stays hard right. */
.tutorial-dontshow {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-right: auto;
    cursor: pointer;
    font-size: var(--font-size-sm, .9rem);
    line-height: 1.3;
}
.tutorial-dontshow[hidden] { display: none; }

/* Footer nav. flex-end + an auto right-margin on the left-hand item (rather than space-between)
   so a single-panel NTK — which hides Back entirely — still leaves "✓ Got It" hard right. */
.tutorial-footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 10px;
    margin-top: 18px;
    padding-top: 14px;
    border-top: 1px solid var(--color-border);
}
.tutorial-footer .button { min-width: 96px; }
.tutorial-footer .button[disabled] { opacity: .45; cursor: default; }
.tutorial-footer .tutorial-back { margin-right: auto; }
.tutorial-footer .tutorial-back[hidden] { display: none; }
/* When Back is visible too (a multi-panel NTK), Back owns the left edge and the checkbox
   sits beside the button instead — only one element can claim the auto margin. */
.tutorial-footer .tutorial-back:not([hidden]) ~ .tutorial-dontshow { margin-right: 0; }

@media (max-width: 480px) {
    /* Stack rather than crush the checkbox label against the button on a narrow screen. */
    .tutorial-footer { flex-wrap: wrap; }
    .tutorial-dontshow { margin-right: 0; flex: 1 1 100%; order: -1; }
}

/* ── "Need to Know" accent ──────────────────────────────────────
   Same dialog, one signal that this popped up on its own and is the critical
   stuff — a warning-colored top stripe. */
.tutorial-overlay[data-tutorial-key="ntk"] .tutorial-dialog {
    border-top: 4px solid var(--color-warning, #e0a800);
}
/* The hand-off row to the full Tutorial at the end of a NTK. */
.tutorial-more {
    margin-top: 14px;
    padding-top: 12px;
    border-top: 1px solid var(--color-border);
}

/* The closing note at the BOTTOM of every "Need to Know" popup — "closing this without checking
   the box will snooze it until tomorrow…". Added 2026-08-02 with the once-a-day gate.

   🔑 There is NO markup for this in any .aspx: Scripts/tutorial.js (addSnoozeNote) appends one
   <p class="tutorial-snooze-note"> to each NTK's .tutorial-dialog at runtime, so all 45 popups
   across qMEET / qFIT / PacklistPRO get the same sentence and any new one inherits it. Searching
   the markup for this class finds nothing — that is expected, not a missing file.

   It sits AFTER .tutorial-footer (last child of the dialog), so it reads as a footnote under the
   checkbox and button it describes; the top border separates it from that row the same way
   .tutorial-more separates the hand-off button from the panel body above it.

   Quiet on purpose: this is the least important text in the dialog and must never compete with
   the panel's actual content. It carries the inline ? badge (.tutorial-help-glyph-inline), which
   sets its own colors, so the muted color here applies to the surrounding sentence only. */
.tutorial-snooze-note {
    margin: 14px 0 0;
    padding-top: 12px;
    border-top: 1px solid var(--color-border);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.5;
    color: var(--color-text-muted, #6c757d);
}

@media (max-width: 480px) {
    .tutorial-dialog { padding: 18px 16px 14px; }
    .tutorial-h { font-size: var(--font-size-lg, 1.15rem); }
}

/* ── The site-wide floating "❓ Help" pill (Site.Master #tutorialHelpPill) ─────────────────
   Added 2026-07-18. Replaces the per-page 📖 TutorialButton on every site: the book icon was
   hard to spot and .tutorial-trigger-wrap reserved space that pushed page content down.
   Scripts/tutorial.js unhides it ONLY on pages that actually carry a Tutorial overlay, so a
   page with no tutorial shows nothing.

   🔑 WHY `var(--pill-cluster-right, …)` AND NOT A PLAIN VALUE — this one declaration has to be
   correct on all five sites, and they differ:
     • qMEET defines --pill-cluster-right in its own :root because it has a THREE-pill cluster
       ([Status] [❓] [Admin]) and shows its hamburger at EVERY width, so the anchor must track
       the centerd nav container. Those cluster rules stay in qMEET/Content/styles.css.
     • PacklistPRO / qFIT / NobodyHasTHIS / paulmendelson.com have no competing floating pills
       and their .nav-toggle is phone-only (`@media (min-width: 992px) { display: none }`), so
       the fallback is all they need.
   ⚠ styles_shared.css loads AFTER each site's Content/styles.css, so a plain `right: 1rem`
   here would OVERRIDE qMEET's tuned cluster and drop the ❓ on top of its ☰. The var+fallback
   form lets the same rule resolve per site. Do not "simplify" it to a literal. */
.tutorial-help-pill {
    position: fixed;
    top: 0.5rem;
    right: var(--pill-cluster-right, 1rem);
    z-index: 1502;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.9rem;
    height: 1.9rem;
    padding: 0 0.45rem;
    border: 0;
    border-radius: 999px;
    background: var(--color-primary, #0090C8);
    /* Latent until now: the visible "?" is .tutorial-help-pill-glyph (#000,
       8.47:1). This is the fallback for any other text in the pill. */
    color: #111;
    font-weight: 600;
    font-size: 0.9rem;
    line-height: 1;
    box-shadow: var(--shadow-lg);
    cursor: pointer;
}
.tutorial-help-pill[hidden] { display: none; }
.tutorial-help-pill:hover { filter: brightness(1.08); }
.tutorial-help-pill:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
/* The pill's glyph is a plain text "?" in a span (NOT the ❓ emoji — an emoji ignores CSS
   color and always renders its own red). Black per the 2026-07-20 request; all 5 Site.Masters
   carry the matching <span class="tutorial-help-pill-glyph">?</span>. */
.tutorial-help-pill-glyph { color: #000; font-size: 1.05rem; font-weight: 700; }

/* The SAME badge, inline — carried by the "Open the Tutorial" button inside every "Need to
   Know" popup (45 of them across qMEET / PacklistPRO / qFIT). Added 2026-08-01 at the owner's
   request: that button used to show a book glyph, which taught nobody that the round ? at the
   top of the screen opens the very same Tutorial overlay. Making the two look identical is the
   entire point of this class.

   🔑 Mirrors .tutorial-help-pill + .tutorial-help-pill-glyph on purpose: same round shape, same
   var(--color-primary) fill, same BLACK bold "?" — and, for the same reason spelled out above,
   a plain text "?" and NOT the ❓ emoji, which ignores `color` and always renders its own red.
   Sized under the floating pill's 1.9rem so it sits on the text baseline inside a .button
   without stretching the button's line-height.

   ⚠ If the floating pill's fill or glyph color ever changes, change it HERE TOO — two rules
   that are supposed to look identical will not tell you when they drift. */
.tutorial-help-glyph-inline {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.35rem;
    height: 1.35rem;
    padding: 0 0.3rem;
    border-radius: 999px;
    background: var(--color-primary, #0090C8);
    color: #000;
    font-size: 0.85rem;
    font-weight: 700;
    line-height: 1;
    vertical-align: -0.2em;
}

/* Below 992px the shared .nav-toggle (☰) appears in the top-right corner, so the pill has to
   clear it. On qMEET the var is defined and already accounts for its always-on hamburger, so
   this resolves to qMEET's own cluster anchor and changes nothing there. */
@media (max-width: 991px) {
    .tutorial-help-pill { right: var(--pill-cluster-right, 3.75rem); }
}

/* ── The light/dark pill (Site.Master #themePill) ─────────────────────────────────────────
   Added 2026-08-19. Shipped on paulmendelson.com only on 2026-08-18 (as .pm-theme-pill in
   that site's own Content/styles.css); moved HERE and rolled out to all five when the owner
   asked for the same button everywhere. One rule, five sites — the reason .pm-theme-pill is
   gone rather than left behind as a sibling is that two declarations meant to look identical
   never tell you when they drift.

   Sits immediately LEFT of the ❓, or in the ❓'s own slot when that one is hidden — which is
   most pages, since tutorial.js only unhides it where the page actually carries an overlay.

   ⚠ THE BUTTON MUST STAY THE NEXT ELEMENT AFTER #tutorialHelpPill IN EVERY Site.Master. The
   "slide right when the ❓ is not there" rule below is an ADJACENT-SIBLING selector and CSS
   has no previous-sibling to write it the other way round. <asp:PlaceHolder> renders no
   wrapper of its own, so the adjacency survives the server control.

   ⚠ SPECIFICITY, load-bearing twice over:
     • `#tutorialHelpPill[hidden] + .theme-pill` is (1,1,1) and beats the bare `.theme-pill`
       (0,1,0) at any load order — which is what we want.
     • Because that id rule outranks the class rule, the phone breakpoint must restate BOTH.
     • qMEET runs a THREE-pill cluster ([Status] [❓] [Admin]) off --pill-*-slot tokens and
       overrides both of these from its own Content/styles.css with a leading `body ` — that
       is what keeps this file (which loads AFTER the site sheets) from dropping the pill on
       top of its always-on ☰. Don't raise the specificity here without fixing that too. */
.theme-pill {
    position: fixed;
    top: 0.5rem;
    right: calc(var(--pill-cluster-right, 1rem) + 2.4rem);   /* 1.9rem pill + 0.5rem gap */
    z-index: 1502;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.9rem;
    height: 1.9rem;
    padding: 0 0.45rem;
    border: 0;
    border-radius: 999px;
    background: var(--color-primary, #0090C8);
    color: #111;
    font-weight: 600;
    font-size: 0.9rem;
    line-height: 1;
    box-shadow: var(--shadow-lg);
    cursor: pointer;
}
/* No tutorial on this page => no ❓ => take its slot. */
#tutorialHelpPill[hidden] + .theme-pill { right: var(--pill-cluster-right, 1rem); }

.theme-pill:hover { filter: brightness(1.08); }
.theme-pill:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* ☀ U+2600 / ☾ U+263E are TEXT-presentation glyphs, so unlike the ☀️/🌙 emoji they honor
   `color` — that is why the pill can guarantee its own contrast, and it is the same reason
   the ❓ pill's badge is a plain "?" and not ❓. Sized a shade under the ❓'s 1.05rem because
   both of these draw wider than a "?" and were otherwise crowding the pill's edges. */
.theme-pill-glyph { color: #000; font-size: 1rem; font-weight: 700; }

/* Hidden wherever the ❓ it is paired with is hidden, for the reasons those rules give:
   a fixed pill floating over the tutorial's dimmed backdrop looks broken and stays clickable
   through it. Two-class selectors (0,2,0) beat .theme-pill's own rule at any load order. */
body.tutorial-lock .theme-pill { display: none; }

@media (max-width: 991px) {
    .theme-pill { right: calc(var(--pill-cluster-right, 3.75rem) + 2.4rem); }
    #tutorialHelpPill[hidden] + .theme-pill { right: var(--pill-cluster-right, 3.75rem); }
}

@media print {
    .theme-pill { display: none !important; }
}

/* ── 49. In-card empty state — "prerequisite missing" vs "genuinely empty" ──────────────
   Added 2026-07-29 for qMEET / qFIT / PacklistPRO.

   THE PROBLEM THIS EXISTS TO FIX. Across the three sites the overwhelmingly common shape
   for a data card is: declare it `Visible="false"` in markup, load the data, and set
   `Visible = True` only on the happy path. Every other outcome — the user has not set the
   prerequisite yet, the prerequisite exists but resolves to nothing, the query legitimately
   returned zero rows, the loader threw and was swallowed — exits early and leaves the card
   hidden. All four render as *the same nothing*: the card simply is not on the page, so a
   user who is one click away from making the feature work gets exactly as much information
   as a user for whom there is genuinely nothing to show. (PacklistPRO's `pnlParksNearby` is
   the canonical example: no destination, unresolvable destination, no park within 60 miles,
   and an exception are four different situations behind one blank space.)

   THE FIX IS THE CARD STAYS. It renders one of these two notes instead of vanishing:

     data-empty-mode="prereq"  — something is MISSING and the user can go get it. Says what is
                                 needed and links straight to the page that provides it. Amber,
                                 because it is actionable.
     data-empty-mode="none"    — the prerequisite IS satisfied and the answer is honestly zero.
                                 Muted gray, no call to action, because there is nothing to do.

   The distinction is the whole point: "you have no trip destination" and "there are no parks
   near your destination" must not look alike.

   RELATIONSHIP TO THE EXISTING `.empty-state`. That block (§ above, ~line 2217) is the big
   centerd page-level treatment — 4rem circled icon, centerd text — and it is used on ~64
   pages. It is deliberately NOT changed here. Adding `data-empty-mode` re-lays the same
   element out compactly and left-aligned so it sits *inside* a card next to other cards
   without shouting. The child classes (`.empty-state-icon` / `-title` / `-sub` / `-actions`)
   are reused verbatim so there is only ever one empty-state vocabulary to learn.
   `.empty-state-hero` opts a moded block back into the big centerd look for whole-page use.

   🔑 The mode signal is carried by the CONTAINER (left rule + tinted well), never by the
   glyph. Emoji ignore `color:` and always render their own palette — the same reason
   `.tutorial-help-pill-glyph` above is a plain text "?" and not ❓. So the glyph is free to
   be any emoji the caller likes without weakening the prereq/none distinction.

   ⚠ Do NOT put `.admin2-*`, `.dash2-*` or `.result-card` rules in this file — those are
   qMEET-only and live in qMEET/Content/styles.css. Nothing below references a card class at
   all: this block is self-contained so it drops into `.main-card`, `.dash-panel`,
   `<details class="card">`, or a bare div identically on all three sites. */
.empty-state[data-empty-mode] {
    display: grid;
    grid-template-columns: auto 1fr;
    align-items: start;
    gap: 0.7rem;
    text-align: left;
    padding: 0.85rem 1rem;
    margin: 0.25rem 0 0;
    border-radius: var(--border-radius-sm, 6px);
    border: 1px solid transparent;
    border-left-width: 3px;
}

/* Shrink the shared 4rem circle down to an in-card badge. Same element, same class — only
   the metrics change — so a block can be moved between hero and in-card use by adding or
   removing one attribute. */
.empty-state[data-empty-mode] .empty-state-icon {
    width: 1.9rem;
    height: 1.9rem;
    margin-bottom: 0;
    font-size: 1rem;
    border-radius: 50%;
}
/* A literal 1rem, not a token: the note sits INSIDE a card that already has a `.card-title`,
   and `.card-title` is `--font-size-lg` (1.125rem) bold — as is the page-level
   `.empty-state-title`. --font-size-base is ALSO 1.125rem here, so reaching for it would
   have left the note's heading exactly as loud as the card's own, which is the one thing
   an in-card note must not be. There is no token between --font-size-sm (0.875) and
   --font-size-lg, so the step down is spelled out. */
.empty-state[data-empty-mode] .empty-state-title {
    font-size: 1rem;
    margin: 0 0 0.15rem;
}
/* The page-level `.empty-state-sub` centers itself with auto margins and clamps to 32rem.
   In a card it should just fill the column. */
.empty-state[data-empty-mode] .empty-state-sub {
    margin: 0;
    max-width: none;
    font-size: var(--font-size-sm, 0.9rem);
}
.empty-state[data-empty-mode] .empty-state-actions {
    justify-content: flex-start;
    margin-top: 0.55rem;
}
.empty-state[data-empty-mode] .empty-state-actions:empty { display: none; }
/* `.empty-state .button { margin-top: 0.75rem }` from the page-level block double-spaces the
   action row once `.empty-state-actions` already has its own margin. */
.empty-state[data-empty-mode] .button { margin-top: 0; }

/* ── Mode: prerequisite missing (actionable) ── */
.empty-state[data-empty-mode="prereq"] {
    background: var(--color-warning-bg, #fff3e0);
    border-color: var(--color-warning-border, #ffcc80);
    border-left-color: var(--color-warning, #e65100);
}
.empty-state[data-empty-mode="prereq"] .empty-state-icon {
    background: color-mix(in srgb, var(--color-warning) 18%, transparent);
    border-color: color-mix(in srgb, var(--color-warning) 35%, transparent);
    color: var(--color-warning, #e65100);
}
.empty-state[data-empty-mode="prereq"] .empty-state-title { color: var(--color-text); }

/* ── Mode: genuinely empty (informational, no call to action) ── */
.empty-state[data-empty-mode="none"] {
    background: color-mix(in srgb, var(--color-text-muted) 8%, transparent);
    border-color: color-mix(in srgb, var(--color-border) 60%, transparent);
    border-left-color: color-mix(in srgb, var(--color-text-muted) 45%, transparent);
}
.empty-state[data-empty-mode="none"] .empty-state-icon {
    background: color-mix(in srgb, var(--color-text-muted) 12%, transparent);
    border-color: color-mix(in srgb, var(--color-border) 60%, transparent);
    color: var(--color-text-muted, #6c757d);
}

/* Opt a moded block back into the page-level centerd treatment (whole-page empties that
   still want the prereq/none distinction — e.g. a search page with no saved filters yet). */
.empty-state-hero[data-empty-mode] {
    display: block;
    text-align: center;
    padding: 2rem 1rem;
}
.empty-state-hero[data-empty-mode] .empty-state-icon {
    width: 4rem;
    height: 4rem;
    margin-bottom: 0.75rem;
    font-size: 1.75rem;
}
.empty-state-hero[data-empty-mode] .empty-state-sub {
    max-width: 32rem;
    margin-left: auto;
    margin-right: auto;
}
.empty-state-hero[data-empty-mode] .empty-state-actions { justify-content: center; }

@media (max-width: 480px) {
    .empty-state[data-empty-mode] { grid-template-columns: 1fr; gap: 0.4rem; }
}

/* 🔴 REQUIRED, not optional. `[hidden]` is a UA-stylesheet rule and LOSES to any author
   `display:` declaration — and `.empty-state[data-empty-mode]` above sets `display: grid`.
   Without this line, `el.hidden = true` (and `Visible="false"`-adjacent client toggling, as
   qMEET/ChatTextReplacements.aspx already does with `<div class="empty-state" hidden>`)
   renders the block VISIBLE. Same trap already worked around ~7 times elsewhere in this file.
   Keep it LAST in this section so it wins on source order against the equal-specificity
   display rules above. */
.empty-state[hidden] { display: none; }

/* ── 50. "Search ignores your filters" notice ──────────────────────────────────────────
   Added 2026-07-29 for qMEET (FindEvents) + PacklistPRO (Packlist / Tasklist / ShoppingList).
   Server half: Shared/SearchFilterNotice.vb (the one string; this is the one class).

   THE PROBLEM THIS EXISTS TO FIX. All four pages deliberately let a typed search term BYPASS
   the page's filters — a search that "can't find" an item because a filter is quietly
   excluding it reads as a broken search. But the filter dropdowns keep displaying their
   selections the whole time, so from the user's side the filters just stopped working. This
   notice is the missing half of that decision: it sits directly under the search box while a
   term is active, says the filters are paused, and offers the one-tap way back.

   INFO, NOT WARNING. Nothing is wrong and nothing was lost, so this is deliberately the info
   palette rather than the amber `warning` one that §49's `prereq` mode uses — it should be
   noticed on the way past, not treated as an error to clear.

   🔑 Every color here is a THEME-AWARE token. The qMEET-local `.es2-search-paused` rule this
   replaces used `--color-accent-light` (#e0f6fe), which has no dark-mode override, so in dark
   mode it painted near-white behind `--color-text`'s near-white type. `--color-info-bg` /
   `--color-info-border` both flip under [data-theme="dark"], and `color` is set explicitly
   rather than inherited, so the text can never be left riding an unrelated background. */
.search-filter-notice {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.25rem 0.6rem;
    margin: 0.4rem 0 0;
    padding: 0.4rem 0.7rem;
    border: 1px solid var(--color-info-border, #81d4fa);
    border-left-width: 3px;
    border-radius: var(--border-radius-sm, 6px);
    background: var(--color-info-bg, #e1f5fe);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.35;
}

/* The clear action is an <asp:LinkButton>, i.e. a real <a> that posts back — so it inherits
   the site-wide link color/underline unless told otherwise. Given its own weight + underline
   here so it reads as the actionable half of the sentence next to the plain text beside it. */
.search-filter-notice-clear {
    font-weight: var(--font-weight-semibold, 600);
    color: var(--color-info, #0277bd);
    text-decoration: underline;
    white-space: nowrap;
    cursor: pointer;
}
.search-filter-notice-clear:hover,
.search-filter-notice-clear:focus-visible {
    color: var(--color-text, #1a1f2e);
    text-decoration: underline;
}
/* --color-info is NOT overridden for dark mode (it is one flat #0277bd), and against
   --color-info-bg's dark value (#082a3d) it falls under 4.5:1. Lift the link to the same
   family the dark-mode info borders use so the actionable word stays the readable one. */
[data-theme="dark"] .search-filter-notice-clear { color: #7fd3f7; }

/* Same trap as §49's closer: `[hidden]` is a UA-stylesheet rule and LOSES to the author
   `display: flex` above, so an attribute-hidden notice would render VISIBLE. */
.search-filter-notice[hidden] { display: none; }

/* ══════════════════════════════════════════════════════════════════════════════
   §51 — "we'll send sign-in codes and password resets to X" email-use notice
   Server half: Shared/EmailUseNotice.vb (the one sentence; this is the one class).
   Live on all three sites in three places: Join2 (live readback under the email
   field), the post-signup ?welcome=1 banner, and Preferences beside the
   Two-Factor toggle.

   THE PROBLEM THIS EXISTS TO FIX. 2FA defaults ON everywhere (a NULL preference
   reads as True), so the address typed once on Join2 is the only way back into
   the account — yet that screen never said so and never read the address back.
   A typo stays invisible until the second device, when the emailed code and
   Forgot Login are both unreachable at once.

   INFO, NOT WARNING. Nothing is wrong yet; this is a confirm prompt, not an
   error. Same info palette and the same theme-aware tokens as §50 — every color
   below flips under [data-theme="dark"], and `color` is set explicitly rather
   than inherited so the text can never end up riding an unrelated background.
   ══════════════════════════════════════════════════════════════════════════════ */
.email-use-notice {
    display: block;
    margin: 0.4rem 0 0;
    padding: 0.5rem 0.7rem;
    /* The shape of the shared .notice (Site-176, 2026-10-13): a 4px edge, 10px corners, 14px text.
       It was a 3px edge, 6px corners and 14.4px. */
    border: 1px solid var(--color-info-border, #7ec8e8);
    border-left-width: 4px;
    border-radius: var(--border-radius, 10px);
    background: var(--color-info-bg, #e8f6fd);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.4;
}
.email-use-notice strong { white-space: nowrap; }

/* Same trap as §49's and §50's closers: `[hidden]` is a UA-stylesheet rule and
   LOSES to the author `display: block` above, so an attribute-hidden notice
   would render VISIBLE. Both forms are covered because Join2 hides it via the
   attribute (client-side) while the server surfaces use Visible="false". */
.email-use-notice[hidden] { display: none; }

/* ══════════════════════════════════════════════════════════════════════════════
   SAVE MODEL  —  "does this card save as you go, or not until you press something?"
   ------------------------------------------------------------------------------
   THE CANONICAL, CROSS-SITE definition. Rendered ONLY by Shared\SaveModelNotice.vb
   (linked into all three .vbproj) — if you find this markup hand-built in an .aspx
   or an .ascx, that copy is the bug.

   Promoted here 2026-07-31, replacing TWO rival implementations of the same idea
   that had grown up independently and looked nothing alike:
     • qFIT   .save-model         in qFIT/Content/styles.css  (flex, icon + body)
     • PLP    .options-save-model in THIS file                (plain block, no icon)
   Both are retired; their pages now render this. `.options-save-model` is kept
   below purely as a compatibility alias — do not write new markup against it.

   🔑 BOTH VARIANTS ARE INTENTIONALLY IDENTICAL IN LOOK. [data-save-model="auto"]
   and [data-save-model="deferred"] get the same box, border, color and weight;
   only the sentence and the leading icon differ. That is the whole mechanism:
   because everything else is constant from card to card and site to site, the
   sentence is the one thing that changes as you move between them, so the change
   is what you notice. Give one variant its own color and the eye files them as
   two unrelated notices and stops comparing the words. There is a data attribute
   rather than a modifier class precisely so nobody reaches for
   `.save-model--deferred { background: … }` without reading this.

   🔴 Do NOT re-home this on .alert-panel. That component silently loses any
   `display:flex` a variant sets (a later shared rule wins), which is exactly the
   icon+body layout this needs; and a full alert at the top of every control group
   reads as a page full of errors. This is a quiet standing note, not an alert.
   ══════════════════════════════════════════════════════════════════════════════ */
.save-model {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    margin: 0 0 0.9rem;
    padding: 0.55rem 0.75rem;
    background-color: var(--color-info-bg, #e1f5fe);
    border: 1px solid var(--color-info-border, #81d4fa);
    border-left-width: 4px;
    border-radius: var(--border-radius, 10px);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.4;
}
/* Same trap as §49's / §50's closers and .email-use-notice: [hidden] is a UA-sheet
   rule and LOSES to the author `display: flex` above, so an attribute-hidden notice
   would render VISIBLE. */
.save-model[hidden] { display: none; }
.save-model-icon {
    flex: 0 0 auto;
    font-size: 1rem;
    line-height: 1.4;
}
/* min-width:0 so a long sentence wraps inside the flex row instead of stretching it. */
.save-model-body { min-width: 0; }
.save-model-headline { font-weight: var(--font-weight-bold, 600); }
/* The button caption, quoted verbatim from the card's own button. Not styled as a
   button — it names one, it isn't one. */
.save-model-button { white-space: nowrap; }
/* 🔴 NOT var(--color-text-muted). Measured on this component's own background:
   #6c757d on the light --color-info-bg (#e1f5fe) is 4.13:1 — under AA for text
   this size. The muted token is sized for muted-on-card, and this box is not a
   card. #5a6570 on the same background measures 5.16:1. Dark mode keeps the
   token: #b1b5bb on the dark --color-info-bg (#082a3d) is 7.05:1, already clear.
   (Same class of fix, and the same reason, as the semantic-text overrides in
   the "Dark-mode semantic TEXT contrast" section of this file.) */
.save-model-detail {
    display: block;
    margin-top: 0.1rem;
    color: #5a6570;
    font-size: var(--font-size-xs, 0.75rem);
    font-weight: var(--font-weight-normal, 400);
}
[data-theme="dark"] .save-model-detail { color: var(--color-text-muted, #b1b5bb); }

/* The card's corner-× is absolutely positioned at top/right inside the padding box
   and is ~2.5rem tall, so it overlaps the first line or two of anything up there.
   Reserve room for it on every notice inside such a card (PLP ShoppingList still
   uses its own pre-promotion .sl-options-topbar, hence the second selector). */
.card-options-host > .save-model,
.sl-options-topbar ~ .save-model { padding-right: 3.25rem; }

/* ── Compatibility alias, 2026-07-31 ────────────────────────────────────────────
   .options-save-model was PLP's local name for this line before it was shared. The
   three PLP pages that used it now render .save-model, so nothing in the workspace
   needs this rule — it exists only so an un-migrated copy (a BACKUPS restore, a
   half-deployed FTP push) degrades to the right look instead of an unstyled <p>.
   Do not add new markup against it; delete it once a deploy has settled. */
.options-save-model {
    display: block;
    margin: 0 0 0.85rem;
    padding: 0.5rem 0.7rem;
    border: 1px solid var(--color-info-border, #81d4fa);
    border-left-width: 3px;
    border-radius: var(--border-radius-sm, 4px);
    background-color: var(--color-info-bg, #e1f5fe);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1.45;
}
.options-save-model[hidden] { display: none; }
.card-options-host .options-save-model,
.sl-options-topbar ~ .options-save-model { padding-right: 3.25rem; }

/* The marker. Inline so it sits on the Apply button's baseline in the same row. */
.options-pending {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    /* No margin-left: every host row is a .form-actions flex row, which already
       supplies the gap. A margin here would double it. */
    padding: 0.3rem 0.6rem;
    border: 1px solid var(--color-warning-border, #ffcc80);
    border-radius: 999px;
    background-color: var(--color-warning-bg, #fff3e0);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-medium, 500);
    line-height: 1.3;
    vertical-align: middle;
    white-space: nowrap;
}
.options-pending[hidden] { display: none; }
.options-pending .options-pending-dot { color: var(--color-warning, #e65100); }
[data-theme="dark"] .options-pending .options-pending-dot { color: #ffa726; }

/* The ring on the Apply button itself. An ASP.NET Button renders as
   <input type="submit"> — a REPLACED element, so ::before/::after never render on
   it. That is why the ● lives in the sibling .options-pending and the button only
   gets an outline, which works on an input. outline (not box-shadow) so it stacks
   with the button's own shadow instead of replacing it. */
.button.is-pending,
.is-pending.button {
    outline: 2px solid var(--color-warning, #e65100);
    outline-offset: 2px;
}
[data-theme="dark"] .button.is-pending { outline-color: #ffa726; }

/* Motion-safe attention pulse on the ring's first appearance only. */
@media (prefers-reduced-motion: no-preference) {
    .button.is-pending { animation: optionsPendingPulse 0.9s var(--ease-out-quint, ease-out) 1; }
}
@keyframes optionsPendingPulse {
    0%   { outline-offset: 6px; }
    100% { outline-offset: 2px; }
}

/* ══════════════════════════════════════════════════════════════════════════
   MARKED ROADS  (🛣 Mark a Road — Shared\map-roads.js)

   These rules are UNPREFIXED (`mr-*`) on purpose. qMEET's own sheet namespaces
   with qm-* and PacklistPRO's with plp-*, so a per-site prefix here would mean
   writing every rule twice for a module whose whole point is to exist once.
   They live in the SHARED sheet because the script does — same folder, same
   deploy script (Shared\Deploy-Shared.ps1).
   ══════════════════════════════════════════════════════════════════════════ */

/* ── The work bar ─────────────────────────────────────────────────────────
   Injected by the script immediately AFTER the map element, so it is in normal
   flow directly beneath the map and never covers it. See the 🛑 note in
   map-roads.js: covering the map with the controls that act on it is a mistake
   this page has already made once and had reverted by the owner. */
.mr-bar {
    display: none;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin: 0.6rem 0 0.2rem;
    padding: 0.6rem 0.75rem;
    background-color: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-left: 4px solid #f59e0b;
    border-radius: var(--border-radius);
    box-shadow: var(--shadow-md);
}
.mr-bar.open { display: flex; }

.mr-bar-step { flex: 1 1 14rem; min-width: 0; color: var(--color-text); }
.mr-bar-hint { flex: 1 1 100%; font-size: 0.85rem; color: var(--color-text-muted); }

/* The low-confidence warning takes the whole row: it is a sentence, not a chip,
   and squeezing it beside the buttons is how it stops being read. */
.mr-bar-warn {
    flex: 1 1 100%;
    font-size: 0.9rem;
    color: var(--color-warning, #e65100);
    line-height: 1.35;
}
[data-theme="dark"] .mr-bar-warn { color: #ffa726; }

.mr-warn { color: var(--color-warning, #e65100); }
[data-theme="dark"] .mr-warn { color: #ffa726; }

/* ── The 🛣 map control ───────────────────────────────────────────────────
   Matches the pin tool's 📌 control, which is a plain .leaflet-bar anchor. The
   emoji needs a nudge to sit centerd in Leaflet's 26px box. */
.mr-ctl a {
    font-size: 1.05rem;
    line-height: 1.55rem;
    text-align: center;
    text-decoration: none;
}
.mr-ctl a.active {
    background-color: #f59e0b;
    color: #fff;
}

/* ── The name/surface form ────────────────────────────────────────────────
   Rides the shared .modal-overlay (which owns the backdrop and the .open
   display switch); this is only the box inside it. */
.mr-editor {
    width: min(30rem, 100%);
    max-height: 90vh;
    overflow-y: auto;
    background-color: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-lg);
    box-shadow: var(--shadow-xl);
    padding: 1.1rem 1.2rem 1rem;
}
.mr-editor-head { font-size: 1.15rem; font-weight: 600; color: var(--color-text); }
.mr-editor-sub {
    margin: 0.15rem 0 0.9rem;
    font-size: 0.875rem;
    color: var(--color-text-muted);
}

/* ── The popup on a saved road ────────────────────────────────────────────
   ⚠ Actions are flat <button>s in a flex row — never an <a> or a <details>
   nested inside one. That nesting is invalid HTML and the inner element becomes
   unclickable, which has already cost this codebase a live bug once. */
.mr-pop-title { font-weight: 600; color: var(--color-text); }
.mr-pop-sub { font-size: 0.85rem; color: var(--color-text-muted); margin-top: 0.1rem; }
.mr-pop-src { font-size: 0.8rem; color: var(--color-text-muted); font-style: italic; margin-top: 0.15rem; }
.mr-pop-notes {
    margin-top: 0.45rem;
    font-size: 0.875rem;
    color: var(--color-text);
    white-space: pre-wrap;
    word-break: break-word;
}
.mr-pop-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin-top: 0.6rem;
}

/* Leaflet hard-codes a white popup with dark text. Without this the popup is a
   white card in the middle of a dark page — the same fix the pin popups carry. */
[data-theme="dark"] .mr-pop-title,
[data-theme="dark"] .mr-pop-notes { color: #0f172a; }
[data-theme="dark"] .mr-pop-sub,
[data-theme="dark"] .mr-pop-src { color: #475569; }

/* ── The bad-road warning inside a ROUTE row ──────────────────────────────
   Lives in the route list, which is a per-site forked file (qm-rt-* on qMEET,
   plp-rt-* on PLP) — so this one element takes the neutral mr-* namespace and
   both sites share the single rule. `display:block` puts it on its own line
   under the distance/duration: it is a sentence naming a road, and squeezed
   beside the metadata it stops being read. */
.mr-rt-badroads {
    display: block;
    margin-top: 0.15rem;
    font-size: 0.82rem;
    line-height: 1.3;
    color: var(--color-warning, #e65100);
    white-space: normal;
}
[data-theme="dark"] .mr-rt-badroads { color: #ffa726; }

/* A route crossing a road marked IMPASSIBLE is not a stronger warning of the same
   kind — it is a different verdict (the route is excluded from ranking outright),
   so it reads in the danger color rather than a louder amber. */
.mr-rt-badroads.is-blocked { color: var(--color-danger, #b91c1c); font-weight: 600; }
[data-theme="dark"] .mr-rt-badroads.is-blocked { color: #f87171; }

/* Shown only when EVERY alternate is blocked — see allRoutesBlocked(). Full width
   above the list, because it is a statement about the whole answer, not about one row. */
.mr-rt-allblocked { margin: 0.5rem 0 0.35rem; font-size: 0.88rem; line-height: 1.4; }

/* 🔴 ONE LINE MEANS ONE LINE (owner, 2026-08-10, twice). `rows="1"` on the markup is not
   enough by itself: the shared `.textarea` rule sets
   `min-height: calc(var(--input-height) * 2.5)`, which is ~3 lines and wins over the rows
   attribute entirely. THE ATTRIBUTE IS NOT THE HEIGHT — a CSS min-height is. `resize:
   vertical` is inherited from that same rule and deliberately kept, so a long note can
   still be dragged open when the member wants it. */
.mr-f-notes {
    min-height: var(--input-height, 2.5rem);
}

/* ── Severity on a saved road ─────────────────────────────────────────────
   Only rendered when a level was actually recorded (popupHtml omits it entirely at
   severity 0), so there is no "not rated" state to style. */
/* 🔑 SAME FOUR HUES AS THE LINE ON THE MAP — yellow / orange / red / magenta, from
   SEVERITIES in map-roads.js. These are TEXT on a card, so each is a step darker than the
   line color for legibility; the dark-mode set goes the other way for the same reason.
   ⚠ Three surfaces carry this ramp — the line (map-roads.js SEVERITIES.color), this text,
   and the recording buttons (.rec-sev-* below). Change one, change all three, or the
   button you tap stops matching the road it draws. */
.mr-pop-sev { font-size: 0.85rem; font-weight: 600; margin-top: 0.1rem; }
.mr-sev-1 { color: #a16207; }   /* yellow  */
.mr-sev-2 { color: #c2410c; }   /* orange  */
.mr-sev-3 { color: #b91c1c; }   /* red     */
.mr-sev-4 { color: #a21caf; }   /* magenta */
[data-theme="dark"] .mr-sev-1 { color: #fbbf24; }
[data-theme="dark"] .mr-sev-2 { color: #fb923c; }
[data-theme="dark"] .mr-sev-3 { color: #f87171; }
[data-theme="dark"] .mr-sev-4 { color: #f0abfc; }

/* ── ✂ Adjust ends: the two draggable trim handles ────────────────────────
   L.divIcon markers, NOT the circleMarkers the drawing tool uses for its ends —
   a circleMarker cannot be dragged in Leaflet at all. 44px is the touch-target
   floor; these get dragged with a thumb, often in a moving vehicle's passenger
   seat. The inner span is what is actually seen; the box around it is grab area. */
.mr-trim-handle {
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: grab;
    background: none;
    border: none;
}
.mr-trim-handle:active { cursor: grabbing; }
.mr-trim-handle span {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    font-size: 0.7rem;
    color: #fff;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}
.mr-trim-start span { background-color: #16a34a; }
.mr-trim-end span { background-color: #dc2626; }

/* ═══ ⏺ RECORD A BAD ROAD (Shared\map-record.js) ══════════════════════════
   Its own bar, separate from .mr-bar: both can legitimately be open at once,
   because recording does not stop the member marking a road by hand. Same rule
   as the work bar though — BELOW the map, never on it. */
.rec-bar {
    display: none;
    flex-direction: column;
    gap: 0.5rem;
    margin: 0.6rem 0 0.2rem;
    padding: 0.7rem 0.8rem;
    background-color: var(--color-bg-card);
    border: 1px solid var(--color-border);
    border-left: 4px solid #dc2626;
    border-radius: var(--border-radius);
    box-shadow: var(--shadow-md);
}
.rec-bar.open { display: flex; }

.rec-head { font-size: 1rem; color: var(--color-text); }
.rec-sub { font-size: 0.85rem; color: var(--color-text-muted); line-height: 1.35; }
.rec-warn { color: var(--color-warning, #e65100); }
[data-theme="dark"] .rec-warn { color: #ffa726; }

/* The live indicator pulses so a glance confirms it is still running — a frozen
   "RECORDING" is exactly what a lost GPS or a backgrounded tab looks like. */
.rec-live { color: var(--color-danger, #b91c1c); font-weight: 600; }
[data-theme="dark"] .rec-live { color: #f87171; }
.rec-live::first-letter { animation: rec-pulse 1.4s ease-in-out infinite; }
@keyframes rec-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.25; } }
@media (prefers-reduced-motion: reduce) {
    .rec-live::first-letter { animation: none; }
}

.rec-gps { font-size: 0.8rem; font-weight: 400; white-space: nowrap; }
.rec-gps-ok { color: var(--color-text-muted); }
.rec-gps-wait { color: var(--color-text-muted); }
.rec-gps-stale { color: var(--color-danger, #b91c1c); }
[data-theme="dark"] .rec-gps-stale { color: #f87171; }

/* START and the four severity buttons are tapped AT SPEED. 3rem is well past the
   44px accessibility floor on purpose — this is the one control on the site with a
   genuine safety argument for being oversized. */
.rec-big {
    min-height: 3.25rem;
    font-size: 1.05rem;
    font-weight: 700;
}

/* START and Done share one row. The bar is a flex COLUMN, so a bare button stretches
   to full width and Done would claim a second oversized row it does not deserve — it
   is the rare escape hatch, not the control being aimed at. START keeps the whole
   remaining width (and the 3.25rem target); Done is sized to its text. */
.rec-actions {
    display: flex;
    align-items: stretch;
    gap: 0.5rem;
}
.rec-actions .rec-big { flex: 1 1 auto; }
.rec-actions .button.transparent { flex: 0 0 auto; }

/* Two columns rather than four: four across is ~80px per target on a phone, and
   these are aimed at without looking. */
.rec-sevs {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 0.5rem;
}
.rec-sev {
    min-height: 3rem;
    font-size: 0.95rem;
    font-weight: 600;
    color: #fff;
}
/* 🔑 EXACTLY THE LINE COLORS FROM SEVERITIES in map-roads.js — the button you tap at
   speed is the color the road then draws on the map, so the two are learnable as one
   thing. Ramped yellow → orange → red → magenta so they are distinguishable at a glance,
   but the TEXT still says which is which, because color alone is not a label.
   ⚠ Level 4 is MAGENTA, not the darker red it used to be: it is a different KIND of
   verdict (the route is excluded outright), not merely a worse one, and a fourth shade of
   red read as "very red" rather than as its own thing. */
.rec-sev-1 { background-color: #eab308; border-color: #eab308; color: #1c1917; }
.rec-sev-2 { background-color: #ea580c; border-color: #ea580c; }
.rec-sev-3 { background-color: #dc2626; border-color: #dc2626; }
.rec-sev-4 { background-color: #c026d3; border-color: #c026d3; }

/* ── Map full screen (.map-fs) ─────────────────────────────────────────────
   Driven by MapFullscreen.enable() in Shared\map-fullscreen.js, which rides the
   site-wide script bundle on both sites. EVERY Leaflet map on PacklistPRO and qMEET
   opts in (My Places, Places Near Me, Parks, Park, Cities Near Me, the Edit Event venue
   picker, the members/search map on eight pages, the check-in journey and the event
   presence map) — the two weather radars excepted, because they expand .wx-radar-body,
   map PLUS scrubber, through the native Fullscreen API and already have their own ⛶.
   Read that module's header before changing anything here — several of these
   declarations are load-bearing for reasons the CSS cannot show:

   🔴 `position: fixed` MUST keep its !important. Leaflet writes
      `style="position: relative"` INLINE on the map container inside L.map(), and an
      inline declaration beats every selector, however specific. Drop the flag and the
      map stays in its card, `inset: 0` has nothing to stretch against, and the element
      collapses to ZERO height — measured on qMEET My Places, 2026-08-20. This is the
      one place in this file where !important is the mechanism, not a shortcut.

   🔴 THE z-index HAS A CEILING AND A FLOOR, and 1700 is the only comfortable gap.
      • FLOOR — it must clear the fixed-pill band: qMEET's .here-badge is 1500,
        .admin-review-fab 1501, .theme-pill / .tutorial-help-pill 1502, .cap-popover
        1600. Sitting AT 1500 (which is what --z-overlay resolves to, and why this rule
        does NOT use that token) merely TIES .here-badge, and a tie is settled by DOM
        order — so the badge floated over the "full screen" map until this moved to 1700.
      • CEILING — it must stay BELOW --z-modal (2000). This map's own pin editor, its
        "move this pin" bar and every toast are appended to <body>, not to the map; lift
        the map above 2000 (PacklistPRO's radar sits at 10050) and it buries the very
        editor you opened from it.
      Anything new landing in the 1500-1600 band is covered automatically. */
.map-fs {
    position: fixed !important;
    inset: 0;
    width: auto;
    height: auto;
    /* 🔑 min-height:0 is NOT redundant beside height:auto. Every map on the two sites
       carries its own sizing class and two of them set a FLOOR — .park-map is
       `min-height: 320px` and .park-map-detail `240px` — which `height: auto` does not
       undo. A phone in landscape is under 400px tall, so without this the "full screen"
       map would be taller than the screen and its own ✕ could sit off the bottom. */
    min-height: 0;
    margin: 0;
    /* Edge to edge: the per-map classes carry a border, a radius and (on .gps-map) a
       shadow, all of which frame a map sitting IN a card and are wrong on one that has
       become the whole screen. */
    border: 0;
    border-radius: 0;
    box-shadow: none;
    z-index: 1700;
}
/* …and the z-index AGAIN, one class heavier — this one is load-bearing on BOTH sites.
   PacklistPRO's sheet carries `html .leaflet-container { z-index: 0; isolation: isolate }`
   — a deliberate rule that boxes each map's controls into their own stacking context so
   they can't paint over the mobile nav — and at (0,1,1) it outranks a plain `.map-fs`
   (0,1,0). So on PacklistPRO the full-screen map sat at z-index 0 and the ❓/🌓 pills
   showed straight through it, while My Places on qMEET looked fine: ONE bug, visible on
   ONE site. qMEET then reaches the same place from the other direction — .search-map,
   .cnm-map and .park-venue-map each set `z-index: 0` for the same "keep Leaflet's panes
   under the sticky chrome" reason, and those tie `.map-fs` at (0,1,0).
   Pairing the two classes is (0,2,0) and wins outright, with no second !important. */
.map-fs.leaflet-container { z-index: 1700; }

/* Lock the page behind the map. BOTH elements, and that is not belt-and-braces:
   body's overflow only propagates to the viewport when html's is `visible`, and
   PacklistPRO sets `html { overflow-x: clip }` (the replacement for the overflow-x:hidden
   that used to kill position:sticky). So on PacklistPRO the body rule alone left the real
   scrollbar in place — a 10px strip down the side of a "full screen" map, with the page
   still scrolling behind it. :has() on the parent is the only way to reach html from a
   body class; browsers without it simply keep today's behavior on that one site.
   ⚠ Yes, this is overflow:hidden on html — the thing that breaks position:sticky. It is
   safe ONLY because it lasts exactly as long as a full-screen map is covering every
   sticky thing on the page, and map-fullscreen.js removes the class on the way out —
   including from its `unload` teardown, so a map torn down WHILE full screen (searchmap.js
   and checkin-journey.js both call map.remove() and rebuild) cannot strand the lock. */
body.map-fs-open { overflow: hidden; }
html:has(> body.map-fs-open) { overflow-y: hidden; }
/* The bottom-right furniture is what the z-index cannot deal with: .back-to-top and the
   PWA install pill both sit at 9998, far above any z-index this map could safely take.
   They are also MEANINGLESS here — the scrolling ↑ exists to undo is locked, and an
   install prompt over a full-screen map is just in the way. Same list the print sheet
   hides, minus .site-toast, which must still reach the top (the map deliberately sits
   below it). */
body.map-fs-open .back-to-top,
body.map-fs-open .pwa-install-wrap,
body.map-fs-open .pwa-install-btn,
body.map-fs-open .scroll-progress-bar { display: none; }
/* ── Two-finger maps (.map-2f-hint) — Shared\map-twofinger.js ───────────────
   On a phone a map does not take one-finger drags (they scroll the page); a one-finger
   drag on it shows this hint. Fixed colors on purpose: it sits over map tiles, which
   are the same in both themes. pointer-events:none so it never eats the next touch.
   z-index 750: over the tile/marker/popup panes (≤700), under the controls (800+). */
.leaflet-container .map-2f-hint {
    position: absolute;
    inset: 0;
    z-index: 750;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 16px;
    text-align: center;
    font-size: 1rem;
    font-weight: 600;
    color: #fff;
    background: rgba(0, 0, 0, 0.45);
    pointer-events: none;
    opacity: 0;
    transition: opacity 0.2s ease;
}
.leaflet-container .map-2f-hint.on { opacity: 1; }
/* "Checking your location…" (.map-locating) — Shared\map-twofinger.js, owner 2026-10-17: shown on
   a map while the browser is asked where the member is, so a map about to move does not look stuck.
   A small pill at the top, fixed colors like the hint above (it sits over tiles), never eats a touch. */
.leaflet-container .map-locating {
    position: absolute;
    top: 10px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 750;
    pointer-events: none;
    display: flex;
    align-items: center;
    gap: 8px;
    max-width: calc(100% - 110px);
    padding: 6px 12px;
    border-radius: 999px;
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: 600;
    line-height: 1.3;
    color: #fff;
    background: rgba(17, 24, 39, 0.82);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.leaflet-container .map-locating::before {
    content: '';
    flex: 0 0 auto;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background: #3d9be9;
    animation: map-locating-pulse 0.9s ease-in-out infinite alternate;
}
@keyframes map-locating-pulse { from { opacity: 0.35; transform: scale(0.8); } to { opacity: 1; transform: scale(1.15); } }
@media (prefers-reduced-motion: reduce) { .leaflet-container .map-locating::before { animation: none; } }
/* 🔴 Load-bearing: with dragging off the map is `touch-action: pan-x pan-y`, and a
   touch's effective touch-action is the intersection with its ancestors — so without
   this the browser would scroll the page instead of moving My Places' "move this pin"
   marker or the road tool's trim handles. `none` on the marker wins the intersection. */
.leaflet-container .leaflet-marker-draggable { touch-action: none; }

/* Matches .mr-ctl's 🛣, .rec-ctl's ⏺ and the pin tool's 📌 in the normal state. */
.map-fs-ctl a {
    font-size: 1.05rem;
    line-height: 1.55rem;
    text-align: center;
    text-decoration: none;
}
/* …but full screen is the one state where this control is the ONLY way back — there is
   no page furniture left to tap — so there it gets a real touch target. Leaflet's own
   bar anchors are 26px; --touch-target is 44px. Beats `.leaflet-bar a` (0,1,1) at
   (0,2,1), so width/height/line-height must all be restated together or the glyph
   stops sitting centerd. */
.map-fs .map-fs-ctl a {
    width: 40px;
    height: 40px;
    line-height: 40px;
    font-size: 1.15rem;
}
/* Keep the controls — above all the ✕ — clear of a notch or a rounded corner in
   landscape. env() resolves to 0px everywhere it does not apply, so this is inert on a
   desktop and only ever pads the full-screen state. */
.map-fs .leaflet-top    { padding-top:    env(safe-area-inset-top,    0px); }
.map-fs .leaflet-bottom { padding-bottom: env(safe-area-inset-bottom, 0px); }
.map-fs .leaflet-left   { padding-left:   env(safe-area-inset-left,   0px); }
.map-fs .leaflet-right  { padding-right:  env(safe-area-inset-right,  0px); }

/* The ⏺ map control, matching .mr-ctl's 🛣 and the pin tool's 📌. */
.rec-ctl a {
    font-size: 1.05rem;
    line-height: 1.55rem;
    text-align: center;
    text-decoration: none;
}
/* Armed or recording — the control itself carries the state, so the member can see
   the GPS is live even after scrolling the bar off screen. */
.rec-ctl a.rec-on {
    color: #dc2626;
    background-color: #fee2e2;
}
[data-theme="dark"] .rec-ctl a.rec-on { background-color: #7f1d1d; color: #fff; }

@media (min-width: 40rem) {
    .rec-sevs { grid-template-columns: repeat(4, 1fr); }
}

/* ── The saved-roads list under the map ───────────────────────────────────── */
.mr-list-row {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    padding: 0.5rem 0.15rem;
    border-bottom: 1px solid var(--color-border);
}
.mr-list-row:last-child { border-bottom: none; }

/* The color swatch is what ties a row to its line on the map — the same device
   the route list uses, and for the same reason: nothing on the map is labeled. */
.mr-swatch {
    flex: 0 0 auto;
    width: 1.5rem;
    height: 0.3rem;
    border-radius: 2px;
}
.mr-list-main { flex: 1 1 auto; min-width: 0; }
.mr-list-name { font-weight: 600; color: var(--color-text); }
.mr-list-meta { font-size: 0.82rem; color: var(--color-text-muted); }
.mr-list-row.is-hidden .mr-list-name,
.mr-list-row.is-hidden .mr-list-meta { opacity: 0.55; }

/* Phone layout (owner, 2026-08-10) — the same shape as My Places' saved-place rows,
   so the two lists on that page behave the same way: the road name and its
   type/length/severity line get the full width of the card, and 🔍 Find it / 👁 Hide
   drop to a line of their own underneath.
   The 34px indent lines those buttons up under the text rather than under the color
   swatch, which is what makes the second line read as belonging to the row above it.
   🛑 The two buttons are wrapped in ONE .mr-list-acts flex item on purpose. Left as
   two separate flex children they cannot be dropped to a shared second line: a 100%
   flex-basis on the first only breaks the line if it also wins over max-content, and
   the width has to come from a single child taking 100% — exactly the same reason
   .mp-list-actions exists on the saved-place rows. And it must NOT come from a 100%
   basis on .mr-list-main, which cannot share a line with the swatch and would strand
   the swatch alone on row one. */
.mr-list-acts { display: flex; gap: 8px; flex: 0 0 auto; align-items: center; }
.mr-list-acts .button { white-space: nowrap; }
@media (max-width: 767.98px) {
    .mr-list-row { flex-wrap: wrap; align-items: flex-start; }
    .mr-list-acts { width: 100%; padding-left: 34px; flex-wrap: wrap; }
}

/* ─────────────────────────────────────────────────────────────────────────────
   NAVIGATION PROGRESS BAR  (ToDo row CU-5026, added 2026-08-12)

   Why this exists: every Web Forms page takes an EXCLUSIVE per-session lock for
   the whole request, so a click can sit queued behind a request already running
   and the browser paints nothing at all in the meantime. The site already has a
   per-button spinner for AJAX saves, but a full page navigation had no feedback
   whatsoever — the reported symptom was "I select a menu item and then nothing
   happens for several seconds".

   The bar is painted by the DEPARTING page, because that is the only page that
   exists during the wait; the destination has not sent a byte yet. site-core.js
   shows it on link click and form submit, after a short delay so fast pages
   never flash it. Measured warm production pages answer in 95-200 ms, which is
   under that delay, so in the common case this renders nothing.

   Fixed to the viewport top and pointer-events:none, so it can never intercept
   a click. Height stays 3px on every breakpoint — it is peripheral feedback and
   should not read as content.
   ───────────────────────────────────────────────────────────────────────────*/
.nav-progress {
    position: fixed;
    top: 0;
    left: 0;
    height: 3px;
    width: 0;
    z-index: 2147483000;
    background: var(--color-accent, #00B0F0);
    box-shadow: 0 0 8px rgba(0, 176, 240, 0.7);
    pointer-events: none;
    opacity: 0;
    transition: width 200ms ease-out, opacity 160ms ease-out;
}
.nav-progress.is-active { opacity: 1; }

/* Fade out on completion without shrinking the width back to zero, which would
   read as the load going backwards. */
.nav-progress.is-done {
    width: 100%;
    opacity: 0;
    transition: width 120ms ease-out, opacity 260ms ease-out 80ms;
}

/* A user who has asked for reduced motion still gets the bar — it is the only
   signal that anything is happening — but it appears at its width rather than
   sliding, and the glow is dropped. */
@media (prefers-reduced-motion: reduce) {
    .nav-progress,
    .nav-progress.is-done { transition: opacity 100ms linear; box-shadow: none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   MY PLACES — PIN NAME LABELS + THE "OTHER" ICON PICKER
   (Shared\map-overlays.js, added 2026-08-17)

   ⚠ THESE ARE THE ONE PLACE map-overlays.js's SITE-PREFIXED CLASSES ARE STYLED
   SHARED. Every other rule for that module lives twice — qm-mp-* in qMEET's
   Content\styles.css and plp-mp-* in PacklistPRO's — because reconciling ~70
   existing rules and two action-sheet skins is a separate, purely-CSS pass (see
   the module's header). New rules should not join that fork: both prefixes are
   listed on each selector here, so one edit changes both sites.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── The small name beside each saved pin ─────────────────────────────────
   A permanent Leaflet tooltip. Deliberately quiet: the map is already carrying
   colored pins, route lines and (on qMEET) check-in discs, so a label that
   competed with any of those would make the map harder to read, not easier.
   pointer-events:none is load-bearing — a label sitting over a neighboring pin
   must never swallow the click meant for that pin. */
/* FIXED COLORS, NO THEME TOKENS - AND DO NOT "MODERNISE" THEM BACK.
   These three declarations shipped on 2026-08-17 as
       background: var(--color-surface, #ffffff);
       color:      var(--color-text,    #1f2937);
       border:     1px solid var(--color-border, #d7dde5);
   and were UNREADABLE IN DARK MODE (owner, 2026-08-18: "can you make the text black?
   it's hard to read. light text on white background"). Two independent reasons, and
   fixing only one would have left it broken:

   1. --color-surface IS DEFINED NOWHERE, on either site. An undefined custom property
      means the LITERAL FALLBACK is used in EVERY theme - so the chip painted #ffffff
      white in dark mode while --color-text, which IS defined, correctly flipped to a
      near-white. MEASURED on PLP /Parks with data-theme="dark": color rgb(232,234,237)
      on background rgb(255,255,255). About 1.1:1. (qMEET's own stylesheet already
      carries two comments warning that this token does not exist; this rule was
      written without them.)
   2. Even with a real surface token this would still be wrong. The label does not sit
      on the PAGE, it sits on OpenStreetMap raster tiles, which are light in BOTH
      themes - a dark-mode chip would be a dark box on a light map. What is behind a
      map overlay is the MAP, so its colors must not follow the page theme at all.

   Test any change to these on a DARK-THEME page. In light mode the old rule looked
   perfect, which is exactly how it shipped. */
.leaflet-tooltip.qm-mp-label,
.leaflet-tooltip.plp-mp-label {
    background: #ffffff;
    color: #1f2937;
    border: 1px solid rgba(0, 0, 0, 0.28);
    border-radius: 0.35rem;
    padding: 0.05rem 0.3rem;
    font-size: 0.7rem;
    line-height: 1.25;
    font-weight: 600;
    white-space: nowrap;
    max-width: 11rem;
    overflow: hidden;
    text-overflow: ellipsis;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
    opacity: 0.95;
    pointer-events: none;
}
/* Leaflet draws a CSS-triangle callout on every tooltip. It points at the pin
   the label is already touching, and at this size it is more clutter than cue. */
.leaflet-tooltip.qm-mp-label::before,
.leaflet-tooltip.plp-mp-label::before { display: none; }

/* ── The "Other" pin-icon picker ──────────────────────────────────────────
   Two labeled tiers (Popular, then More) inside ONE scroll box, so the long
   tail is a scroll rather than a second click — and so the modal itself does
   not grow past the viewport on a phone. */
.qm-mp-emojinote,
.plp-mp-emojinote {
    margin: 0 0 0.35rem;
    font-size: 0.85rem;
    color: var(--color-text-muted, #6b7280);
}
.qm-mp-emojigrid,
.plp-mp-emojigrid {
    max-height: 11rem;
    overflow-y: auto;
    padding: 0.35rem;
    border: 1px solid var(--color-border, #d7dde5);
    border-radius: var(--radius-md, 0.5rem);
    /* --color-surface-alt is declared NOWHERE, so this served the literal #f7f9fc in
       DARK mode too - a near-white panel carrying .qm-mp-emojihead's --color-text-muted
       (#b1b5bb), i.e. an unreadable heading. --color-surface-muted IS declared
       (styles_shared :root #f8f9fa / [data-theme=dark] #3d3d3d) and means exactly this:
       a recessed panel inside a card. Light moves #f7f9fc -> #f8f9fa, one step and
       invisible; dark stops being white. Swept 2026-08-18 alongside the pin-label fix
       above - same undeclared-token family, same day, same picker. */
    background: var(--color-surface-muted, #f8f9fa);
}
.qm-mp-emojihead,
.plp-mp-emojihead {
    margin: 0.15rem 0 0.3rem;
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    color: var(--color-text-muted, #6b7280);
}
/* The Recent tier's "forget these" × (2026-08-17). Inline in the heading rather
   than a control of its own: it has to be reachable, but nobody comes to this
   picker looking for it, and a full-width button above the icons would read as
   more important than the icons. No danger tone — clearing a convenience list is
   not a destructive act, and --color-danger has no dark-mode value, so borrowing
   it here would paint the same mid-red on both grounds. */
.qm-mp-emojiclear,
.plp-mp-emojiclear {
    margin-left: 0.4rem;
    padding: 0 0.3rem;
    font-size: 0.95rem;
    line-height: 1;
    cursor: pointer;
    color: inherit;
    background: none;
    border: 1px solid transparent;
    border-radius: var(--radius-sm, 0.35rem);
    vertical-align: baseline;
}
.qm-mp-emojiclear:hover,
.plp-mp-emojiclear:hover {
    color: var(--color-primary, #1e73be);
    border-color: var(--color-border, #d7dde5);
}
.qm-mp-emojirow,
.plp-mp-emojirow {
    display: flex;
    flex-wrap: wrap;
    gap: 0.2rem;
    margin-bottom: 0.4rem;
}
/* 2.1rem square: comfortably past the 44px-ish tap target once the gap is
   counted, without turning 138 icons into four screenfuls. */
.qm-mp-emoji,
.plp-mp-emoji {
    width: 2.1rem;
    height: 2.1rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.15rem;
    line-height: 1;
    padding: 0;
    cursor: pointer;
    /* --color-surface is declared nowhere (see the pin-label block above), so all 138 of
       these tiles painted #ffffff in dark mode - white squares inside a dark modal, each
       ringed by a dark --color-border. --color-bg-card is #ffffff at :root, so LIGHT MODE
       IS BYTE-IDENTICAL BY CONSTRUCTION and only the broken dark case moves (to #333333). */
    background: var(--color-bg-card, #ffffff);
    border: 1px solid var(--color-border, #d7dde5);
    border-radius: var(--radius-sm, 0.35rem);
}
.qm-mp-emoji:hover,
.plp-mp-emoji:hover { border-color: var(--color-primary, #1e73be); }
/* The chosen one is ringed rather than merely tinted: at this size a background
   change is easy to miss against 138 neighbors. */
.qm-mp-emoji.sel,
.plp-mp-emoji.sel {
    border-color: var(--color-primary, #1e73be);
    box-shadow: 0 0 0 2px var(--color-primary, #1e73be) inset;
    /* Was var(--color-surface-alt, #eef4fb) - undeclared, so a pale blue that never
       flipped. --color-primary-light is the site's real selected/active tint and IS
       declared both ways (#e0f6fe / #082a3d); it also matches the primary ring this rule
       already draws, so selection reads as one gesture in both themes. */
    background: var(--color-primary-light, #eef4fb);
}

/* ── Emoji search (2026-08-17) ─────────────────────────────────────────────
   The box sits ABOVE the grid and the grid is where results land, so the two
   curated tiers and 3,944 searchable emoji share one scroll box and the modal
   never changes height as you type. An empty box browses; that is unchanged. */
.qm-mp-emojisearchrow,
.plp-mp-emojisearchrow { margin: 0 0 0.4rem; }
.qm-mp-emojisearch,
.plp-mp-emojisearch {
    width: 100%;
    /* Match the grid it feeds rather than the taller form fields around it. */
    padding: 0.35rem 0.55rem;
    font-size: 0.9rem;
}
/* Safari draws its own round search chrome, which reads as a different control
   from every other box in this form. */
.qm-mp-emojisearch,
.plp-mp-emojisearch { -webkit-appearance: none; appearance: none; }
.qm-mp-emojisearch::-webkit-search-decoration,
.plp-mp-emojisearch::-webkit-search-decoration { -webkit-appearance: none; }
/* "Searching all emoji…", "No icon matches…", the result cap, and the offline
   note all land here. Never hidden behind a scroll: it is the only thing that
   distinguishes "nothing matches" from "the list has not arrived yet". */
.qm-mp-emojistatus,
.plp-mp-emojistatus {
    margin: 0.3rem 0.15rem;
    font-size: 0.82rem;
    color: var(--color-text-muted, #6b7280);
}

/* ── MyPlaces "Search" (the client-side list filter, #mpFind) ─────────────
   Sits in .mp-list-controls beside Sort and Filter, and since 2026-08-17 is laid out
   the SAME way they are (owner: "format that like Sort and Filter by Category"):
   label INLINE to the left of the control, 6px gap, all three on one line. It shipped
   with a stacked label (flex-direction: column), which made this one control a head
   taller than the two beside it and left the row visibly out of square.
   ⚠ The three labels were SHORTENED later the same day, in a second owner pass:
   "Search Your Places" → "Search" and "Filter by Category" → "Filter", so the row now
   reads Sort · Filter · Search. Sizing below is unchanged and did not need to be —
   the labels only got narrower. Match the MARKUP, not this comment, if they diverge.
   🔑 These rules deliberately mirror `.mp-sort`, which is defined in EACH site's
   Content/styles.css (qMEET ~15766, PacklistPRO ~5335) rather than here. They live
   in this file because both qMEET and PacklistPRO render this markup — and because
   shared CSS loads AFTER Content/styles.css, so a same-specificity tie resolves in
   this file's favor. If `.mp-sort`'s inline-label treatment ever changes, change it
   here in the same pass or the row splits again.
   Narrower than a full-width textbox so all three controls still fit one row on a
   tablet; it drops to its own full-width line on a phone (media query below). */
.mp-find { display: flex; align-items: center; gap: 6px; }
/* Belt and braces, for the same reason `.mp-sort[hidden]` is restated per site:
   `display: flex` is an AUTHOR rule and the UA sheet's `[hidden] { display: none }`
   is not, so `hidden` only wins here by accident. qMEET's bootstrap.min.css happens
   to ship `[hidden]{display:none!important}`; PacklistPRO's does NOT — which is
   exactly how its Sort picker once showed unconditionally. */
.mp-find[hidden] { display: none; }
/* The label sits INLINE beside the field here, so it has to drop the block display
   and bottom margin .input-label gives it everywhere else — same two overrides
   `.mp-sort .input-label` makes. */
.mp-find .input-label { margin: 0; display: inline; white-space: nowrap; }
/* 🔑 Size the WRAPPER, not the input. The field is width:100% of .input-clearable,
   and that wrapper is position:relative — it is what the × is absolutely positioned
   against. Sizing the input directly (as this rule did until 2026-08-17) leaves the
   wrapper at its own shrink-to-fit width and the × lands beside the field instead of
   inside it. min-width:0 lets it shrink below the input's intrinsic width when the
   row is tight, instead of forcing an early wrap. */
.mp-find .input-clearable { flex: 0 1 14rem; min-width: 0; max-width: 100%; }
.mp-find .textbox { width: 100%; min-width: 0; max-width: none; }

/* Phone: the field gets a line of its own, matching what each site's styles.css
   already does to `.mp-sort` at this same 767.98px boundary (the site's phone /
   tablet split). Squeezed beside its label on a 360px screen there is barely room
   for a word of what you typed. */
@media (max-width: 767.98px) {
    .mp-find { width: 100%; }
    .mp-find .input-clearable { flex: 1 1 auto; }
}

/* ============================================================================
   FORGOT LOGIN — shared card sizing (parity row UI-05, 2026-09-02)
   ----------------------------------------------------------------------------
   These two rules lived only in qMEET/Content/styles.css. The owner picked qMEET's
   ForgotLogin as the model for all five, so they move here rather than being copied
   into four local stylesheets. qMEET's local copy is now redundant but harmless —
   this sheet loads LAST, so identical values cannot conflict.
   The narrow card is the point: ForgotLogin is a two-field form, and a full-width
   card on a desktop leaves two short inputs stranded in a wide empty box.
   ============================================================================ */
.forgot-card     { max-width: 480px; margin: 0 auto; }
.forgot-back-row { margin-top: 1rem; }

/* ============================================================================
   BILLED-ACTION BADGE  (SecurityHelper.BilledBadge, 2026-09-04)
   ----------------------------------------------------------------------------
   Marks a checkbox or button whose action calls a metered provider. Owner:
   "for any feature (checkbox, button, etc) that has a cost, add a warning, for
   trusted users and admin only" - so the helper renders NOTHING at all for the
   5,056 standard accounts and this rule only ever paints for the four who can
   actually spend.

   Lives in the SHARED sheet because both PacklistPRO and qMEET carry their own
   copy of SecurityHelper and both emit this class; a site-local rule would have
   to be written twice and would drift.

   Colors are literal, not tokens. This badge means one specific thing - money
   leaves the account - and a theme that repurposes --color-warning would quietly
   restyle a cost warning into something else. Both values are AA on their own
   background, checked in both themes.
   ============================================================================ */
.billed-badge {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.05rem 0.4rem;
    border: 1px solid #b45309;
    border-radius: 999px;
    background: #fef3c7;
    color: #7c2d12;
    font-size: 0.72rem;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
    vertical-align: middle;
    cursor: help;
}
[data-theme="dark"] .billed-badge {
    border-color: #f59e0b;
    background: #3b2f11;
    color: #fbbf24;
}

/* ── Filters / Options disclosure card — ONE look on all five sites ──────────────────
   Added 2026-09-15. Owner: "in qfit Checklist, i like how the 'Filters & Display' card is
   formatted when it's closed - how it is smash, has an arrow on the right, and a yellow
   border. also has a note like '1 filter on'. Can we change ALL Filters, Options,
   'Filters & Options' etc panels so they look the same - all 5 sites?"
   A promotion of qFIT's .cl2-options-card / .cl2-disclosure (qFIT/Content/checklist2-page.css).
   That page keeps its own copy and its own counter JS; every OTHER Filters/Options panel
   uses this block, so restyle here and then bring checklist2-page.css along.

   TWO MARKUP SHAPES, ONE LOOK:
     A. <details class="main-card options-card">
          <summary class="options-disclosure" data-filter-count="">
            <span class="options-disclosure-icon" aria-hidden="true">(icon)</span>
            <span class="options-disclosure-text">Filters</span>
            <span class="options-disclosure-hint"></span>
          </summary>
          …controls…
        </details>
     B. <div class="main-card options-card">
          <button type="button" class="options-disclosure" aria-expanded="false"
                  aria-controls="optsX" data-filter-count="#optsX">…the same three spans…</button>
          <div id="optsX" class="options-panel">…controls…</div>
        </div>
   Shut, both are one full-width strip: icon, bold label, a muted "N filters on" note, and a
   chevron on the right. .is-filtered adds the inset yellow ring.

   🔑 THE NOTE AND THE RING ARE WRITTEN BY Shared/site-core.js (scRefreshOptionsCounts), opt-in
   by data-filter-count on the strip. It counts only controls that DECLARE data-filter-default
   and differ from it, so a display option (show descriptions, rows per page) stays out of
   "filters on" by not declaring one. Shape B's chevron turns on aria-expanded, shape A's on
   [open], so neither needs the page's toggle JS to rewrite the strip's text.

   🛑 DO NOT PUT .card-title ON THE <summary> AS WELL. `details.main-card:not([open]) >
   summary.card-title` (Cards section) zeroes padding-bottom at (0,3,2), which beats this
   block and leaves a shut strip lopsided.

   ⚠ Shape A zeroes the card padding only while SHUT, and while open pulls the summary out to
   the card edges with negative margins, so a <details> needs no body wrapper. There is
   deliberately NO overflow:hidden on the card (qFIT's original has one): it would clip a city
   autocomplete or any other absolutely positioned popup inside the panel.

   ⚠ A corner × (.tutorial-close as a direct child of the <details>) lands exactly on the
   chevron. Give such a card .has-corner-close: while open the chevron hides and the × takes
   its place, so the right end of the strip reads ▾ shut and × open. */
.options-card { padding: 0; }
details.options-card[open] { padding: 0 var(--card-padding, 1rem) var(--card-padding, 1rem); }

.options-card .options-disclosure {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: 0.55rem;
    box-sizing: border-box;
    margin: 0;
    padding: 0.85rem var(--card-padding, 1rem);
    min-height: 3rem;
    text-align: left;
    background: transparent;
    border: 0;
    border-radius: var(--border-radius, 8px);
    box-shadow: none;
    color: var(--color-text);
    font-family: inherit;
    font-size: var(--font-size-base, 1rem);
    font-weight: var(--font-weight-bold, 600);
    line-height: 1.3;
    list-style: none;
    cursor: pointer;
    transition: background var(--transition-fast, 0.15s) ease;
}
/* A <button> does not stretch the way a block <summary> does. */
.options-card button.options-disclosure { width: 100%; }
.options-card summary.options-disclosure::-webkit-details-marker { display: none; }

.options-card .options-disclosure-icon { flex: 0 0 auto; font-size: 1.1rem; line-height: 1; opacity: 0.8; }
.options-card .options-disclosure-text { min-width: 0; }
.options-card .options-disclosure-hint {
    font-weight: var(--font-weight-normal, 400);
    font-size: var(--font-size-sm, 0.875rem);
    color: var(--color-text-muted);
    white-space: nowrap;
}
.options-card .options-disclosure-hint:empty { display: none; }

/* The chevron. Every drawn-chevron property of summary.card-title::after is reset here, in
   case a page's own sheet adds one to a summary. \25BE = ▾ (escaped so the byte
   encoding of this file can never turn it into junk). */
.options-card .options-disclosure::after {
    content: "\25BE";
    flex: 0 0 auto;
    order: 0;
    align-self: center;
    width: auto;
    height: auto;
    margin-left: auto;
    border: 0;
    opacity: 1;
    font-size: 0.9rem;
    font-weight: var(--font-weight-normal, 400);
    line-height: 1;
    color: var(--color-text-muted);
    transform: none;
    transition: transform var(--transition-fast, 0.15s) ease;
}
.options-card .options-disclosure[aria-expanded="true"]::after,
details.options-card[open] > .options-disclosure::after { transform: rotate(180deg); }

/* Theme token, not a literal: the fill has to stay legible on both grounds. */
.options-card .options-disclosure:hover { background: var(--color-primary-light); }
.options-card .options-disclosure:focus-visible {
    outline: 2px solid var(--color-border-focus, var(--color-accent));
    outline-offset: -2px;
}
/* "Filters are on". Inset, so it reads as an accent inside the card rather than a second
   border; !important for the same reason as qFIT's original (a page's own button or
   summary box-shadow must not quietly erase it). */
.options-card .options-disclosure.is-filtered { box-shadow: inset 0 0 0 3px #FFD400 !important; }
/* 🔴 THE RING STOPPED SHORT OF THE CARD ON PHONES (owner screenshot, 2026-09-18). PLP,
   NobodyHasTHIS and paulmendelson.com each tighten `main.page-wrapper .main-card` to 0.85rem
   side padding at <=480px — (0,2,1), which beats `.options-card { padding: 0 }` — so a shape-B
   card grew side gutters and the full-width header strip (and its ring) floated inside it.
   Shape A is left alone: an OPEN <details> is meant to carry side padding. */
main.page-wrapper .main-card.options-card:not(details) { padding: 0; }

/* Open — shape A (<details>) */
details.options-card[open] > .options-disclosure {
    margin: 0 calc(-1 * var(--card-padding, 1rem)) 0.85rem;
    border-bottom: 1px solid var(--color-border);
    border-bottom-left-radius: 0;
    border-bottom-right-radius: 0;
}
details.options-card.has-corner-close[open] > .options-disclosure { padding-right: 3.25rem; }
details.options-card.has-corner-close[open] > .options-disclosure::after { visibility: hidden; }

/* Open — shape B (<button> + panel) */
.options-card button.options-disclosure[aria-expanded="true"] {
    border-bottom-left-radius: 0;
    border-bottom-right-radius: 0;
}
.options-card > .options-panel {
    padding: var(--card-padding, 1rem);
    border-top: 1px solid var(--color-border);
}

@media (max-width: 640px) {
    /* The note stays on a phone: that is exactly where the panel is shut and the ring is the
       only other signal. Smaller, never wrapped. */
    .options-card .options-disclosure-hint { font-size: 0.78rem; }
}
@media (max-width: 576px) {
    .options-card .options-disclosure { min-height: 2.5rem; padding: 0.55rem 0.65rem; }
    details.options-card.has-corner-close[open] > .options-disclosure { padding-right: 2.75rem; }
    /* Re-centers the 32px × on the shorter strip. */
    details.options-card.has-corner-close > .tutorial-close { top: 4px; }
    .options-card > .options-panel { padding: 0.75rem 0.65rem; }
}

/* ── .options-emphasis — "you are IN the options now" (owner, 2026-09-18) ──
   Owner: once the panel was open and scrolled into, nothing said you were looking at options
   rather than the page — only the chevron flipped, and the panel was a white card like every
   other. Picked from a mockup comparison ("E" = A + B + C):
     A  the open card becomes a tinted sheet: header filled dark blue, colored border, shadow;
     B  the rest of the page is dimmed behind it;
     C  the ✓ Close row pins to the bottom of the screen while the panel scrolls past.
   Trialled on PLP Packlist.aspx, then ROLLED OUT TO EVERY OPTIONS CARD ON ALL FIVE SITES the
   same day (owner: "roll that out to ALL options/filters cards", + dim slightly more). There is
   no opt-in class any more: it applies to all three shapes of card —
     shape A  <details class="options-card"> + <summary class="options-disclosure">, open = [open]
     shape B  .options-card > <button class="options-disclosure" aria-expanded> + .options-panel
     qFIT     .cl2-options-card > #btnToggleOptions.cl2-disclosure (the original Checklist card)
   🔑 .options-calm OPTS A CARD OUT OF THE DIMMER ONLY (it keeps the sheet). For cards rendered
   OPEN ON EVERY LOAD because the filters ARE the page — qMEET AdminLogs, MemberSearch,
   MemberMatch — a dimmer would grey out the results on arrival, every time.
   🔑 The open state is read from markup every toggle already keeps right (aria-expanded or
   [open]), so no page JS changes. No :has() support = the plain look, nothing breaks.
   ⚠ THE DIMMER IS A body::after, NOT AN ELEMENT. A click on it targets <body>, which is
   "outside the card" to SiteCore.installOptionsCardAutoClose, so on a card with
   [data-options-autoclose] tapping the dimmed page saves and closes exactly as clicking away
   always did. Cards WITHOUT autoclose (qMEET FindEvents/FindGroups/GroupEventSuggester, PLP
   ShoppingList, pm.com ProductRatings/ToDo) are closed by SiteCore.installOptionsDimmerTap,
   which presses the card's own header — never a second close path of its own.
   z-index 1400/1401 sits above the sticky nav (--nav-z 1000) and below the theme pills
   (1502), toasts and modals (9995+), so a dialog opened from inside the panel still lands on
   top. The card's z-index makes it a stacking context: popups inside it stay inside it.
   🔴 KEEP THE THREE "OPEN" SELECTOR LISTS BELOW IN STEP (card, dimmer, header). */
.options-card,
.cl2-options-card {
    --oe-fill: var(--color-accent-deeper, #005a80);
    --oe-tint: color-mix(in srgb, var(--color-accent) 7%, var(--color-bg-card));
    --oe-pad-x: var(--card-padding, 1rem);
    --oe-pad-b: var(--card-padding, 1rem);
}
[data-theme="dark"] .options-card,
[data-theme="dark"] .cl2-options-card { --oe-fill: #0077a8; }

/* A — the open card is a tinted sheet. */
.options-card:has(> .options-disclosure[aria-expanded="true"]),
details.options-card[open],
.cl2-options-card:has(> .cl2-disclosure[aria-expanded="true"]) {
    position: relative;
    z-index: 1401;
    background: var(--oe-tint);
    border: 2px solid var(--oe-fill);
    box-shadow: 0 10px 28px rgba(0, 0, 0, 0.3);
}

/* B — everything else dims. Owner 2026-09-18: 0.45 was a touch light; now 0.58. */
body:has(.options-card:not(.options-calm) > .options-disclosure[aria-expanded="true"],
         details.options-card[open]:not(.options-calm),
         .cl2-options-card > .cl2-disclosure[aria-expanded="true"])::after {
    content: "";
    position: fixed;
    inset: 0;
    z-index: 1400;
    background: rgba(12, 22, 38, 0.58);
    /* The blur is the shared popup one (section 18). The dim stays this rule's own - the
       owner tuned it on 2026-09-18 and it has a dark-theme value just below. */
    -webkit-backdrop-filter: var(--popup-backdrop-filter);
    backdrop-filter:         var(--popup-backdrop-filter);
    cursor: pointer;
}
[data-theme="dark"] body:has(.options-card:not(.options-calm) > .options-disclosure[aria-expanded="true"],
                             details.options-card[open]:not(.options-calm),
                             .cl2-options-card > .cl2-disclosure[aria-expanded="true"])::after {
    background: rgba(0, 0, 0, 0.72);
}

/* The header strip fills dark blue. (1,3,0) for qFIT's id-based #btnToggleOptions rules. */
.options-card > button.options-disclosure[aria-expanded="true"],
details.options-card[open] > summary.options-disclosure,
.cl2-options-card > #btnToggleOptions.cl2-disclosure[aria-expanded="true"] {
    background: var(--oe-fill);
    color: #fff;
    border-radius: calc(var(--border-radius, 10px) - 2px) calc(var(--border-radius, 10px) - 2px) 0 0;
}
.options-card > button.options-disclosure[aria-expanded="true"]:hover,
details.options-card[open] > summary.options-disclosure:hover,
.cl2-options-card > #btnToggleOptions.cl2-disclosure[aria-expanded="true"]:hover {
    background: color-mix(in srgb, var(--oe-fill) 85%, #ffffff);
}
.options-card > button.options-disclosure[aria-expanded="true"] .options-disclosure-hint,
.options-card > button.options-disclosure[aria-expanded="true"]::after,
details.options-card[open] > summary.options-disclosure .options-disclosure-hint,
details.options-card[open] > summary.options-disclosure::after,
.cl2-options-card > #btnToggleOptions.cl2-disclosure[aria-expanded="true"] .cl2-disclosure-hint,
.cl2-options-card > #btnToggleOptions.cl2-disclosure[aria-expanded="true"]::after {
    color: rgba(255, 255, 255, 0.85);
}
/* Shape A's open summary already drops a border-bottom; on the fill it is just a seam. */
details.options-card[open] > summary.options-disclosure { border-bottom-color: transparent; }
.options-card > .options-panel { border-top: 0; }
/* A shape-A corner × sits ON the filled strip (.has-corner-close), so it goes white too. */
details.options-card[open] > .tutorial-close { color: #fff; }
details.options-card[open] > .tutorial-close:hover { background: rgba(255, 255, 255, 0.18); color: #fff; }

/* The "filters on" ring: standard blue, not yellow (owner, 2026-09-18). !important and a
   higher specificity than the yellow rules above and in qFIT checklist2-page.css. */
.options-card > .options-disclosure.is-filtered,
.cl2-options-card > #btnToggleOptions.cl2-disclosure.chk-filters-active {
    box-shadow: inset 0 0 0 3px var(--color-accent) !important;
}

/* C — the pinned Close row. Negative margins pull it out to the panel's edges; the padding
   custom properties track the panel's own padding at each width (see the 576px block).
   Only shape-B cards with an .options-close-row have one (PLP Packlist, Quicklist, Tasklist);
   the others close from the strip, the corner × or a tap on the dimmed page. */
.options-card:has(> .options-disclosure[aria-expanded="true"]) .options-close-row {
    position: sticky;
    bottom: 0;
    z-index: 2;
    margin: 0.75rem calc(-1 * var(--oe-pad-x)) calc(-1 * var(--oe-pad-b));
    padding: 0.6rem var(--oe-pad-x) calc(0.6rem + env(safe-area-inset-bottom, 0px));
    background: var(--oe-fill);
    border-top: 0;
    border-radius: 0 0 calc(var(--border-radius, 10px) - 2px) calc(var(--border-radius, 10px) - 2px);
}
@media (max-width: 576px) {
    .options-card { --oe-pad-x: 0.65rem; --oe-pad-b: 0.75rem; }
}
/* PLP / NHT / pm.com set .main-card side padding to 0.85rem at <=480px, but an open <details>
   pulls its summary out by var(--card-padding) = 1rem — so the filled strip overhung the card
   by 0.15rem each side. Match the variable to the padding. */
@media (max-width: 480px) {
    main.page-wrapper details.main-card.options-card { --card-padding: 0.85rem; }
}
@media print {
    body::after { display: none !important; }
    .options-card, .cl2-options-card { box-shadow: none !important; }
}

/* ── "Save for offline" strip (offline sets, 2026-10-01) ───────────────────────────────
   Built by Shared/offline-sets.js inside any <div class="offline-set" data-offline-set="…">:
   Save / Update / Remove buttons, a progress bar and one status line.
   Hidden until the script adds .is-on — it does that only once the page's service worker
   has answered and knows the set, so a browser that cannot honor the button never shows it.
   (qFIT's Common Problems strip predates this and keeps its own .cp-offline rules.) */
.offline-set { display: none; align-items: center; flex-wrap: wrap; gap: 0.6rem; margin: 0 0 1rem; font-size: 0.88rem; }
.offline-set.is-on { display: flex; }
.offline-set [hidden] { display: none !important; }
.offline-set-status { opacity: 0.8; }
.offline-set progress { width: 12rem; max-width: 100%; height: 0.6rem; vertical-align: middle; }
/* "Saved on this device" list ([data-offline-saved-list], drawn by the same script). */
.offline-saved-title { margin: 0.75rem 0 0.25rem; font-size: 0.88rem; font-weight: 600; }
.offline-saved-items { margin: 0 0 0.5rem; padding-left: 1.25rem; font-size: 0.88rem; }
.offline-saved-items li { margin: 0.15rem 0; }
/* The map's own line under a strip (Shared/offline-maps.js): saved / saving / not saved yet.
   Pulled up under the strip it belongs to, which carries a 1rem bottom margin. */
.offline-map-note { margin: -0.6rem 0 1rem; font-size: 0.88rem; }
.offline-map-note[hidden] { display: none !important; }
.offline-map-note .button { margin-left: 0.25rem; }
/* A map with its own Save / Update / Remove (the itinerary's trip map, My Places): the
   same script draws the buttons and a status line inside the host element. */
.offline-map-own { display: flex; align-items: center; flex-wrap: wrap; gap: 0.6rem; margin: 0.6rem 0 0; font-size: 0.88rem; }
.offline-map-own[hidden], .offline-map-own [hidden] { display: none !important; }
.offline-map-status { opacity: 0.8; }
@media print { .offline-set, .offline-map-note, .offline-map-own { display: none !important; } }

/* =====================================================================================
   UI REVIEW RULES SHARED BY ALL FIVE SITES (2026-10-10)
   Written and tested on qFIT first (its Content/styles.css, section 70 onward, where each
   rule also stands as "body.qfit-page ..."), then ported here so qMEET, PacklistPRO,
   NobodyHasTHIS and paulmendelson.com get the same fixes. The row ids in the comments are
   the qFIT review's (Shared/docs/CONTROL_PageTesting.xlsx, tab "qFIT UI Recs").
   Each rule is written "body ..." so that it out-ranks the single-class base rule it
   corrects wherever that rule sits in this file. A site sheet that loads AFTER this one
   (each site's nav-hamburger.css) still wins at equal weight.
   ===================================================================================== */

/* Checklist-13: the two demo notices carry a long and a short wording
   (AppMessages.MSG_DEMO_MODE and MSG_DEMO_MODE_PERSISTENT); a phone gets the short one. */
.demo-narrow { display: none; }
@media (max-width: 575px) {
    .demo-wide { display: none; }
    .demo-narrow { display: inline; }
}

/* Site-156: headings and card names wrap in balanced lines, so a title that needs two
   lines does not leave one short word alone on the last one. */
body h1, body h2, body h3,
body .page-title, body .card-title, body .heading,
body .largeheading { text-wrap: balance; }

/* Site-23 (and Site-5, Site-96): on a phone the Back link has its own small line above
   the page title, so the title gets the full width; it used to start 72px in, which is
   why so many titles wrapped. The Back link keeps its natural width (it must not become
   a full-width tap strip): the TITLE is what takes the whole next line. */
@media (max-width: 575px) {
    body .page-header > .page-header-title-row:has(> .back-btn) { flex-wrap: wrap; row-gap: 0.1rem; }
    body .page-header-title-row:has(> .back-btn) > :not(.back-btn) { flex: 1 0 100%; }
}
@media (max-width: 399px) {
    body .page-title { font-size: var(--font-size-xl, 1.375rem); }   /* 22px, a step of the text scale (it was 24px): Site-176 stage 3, 2026-10-13 */
}

/* Site-69 (and MethodDetails-2, Motivation-3, AtYourAge-3, Compete-1): stat tiles on a
   phone sit two to a row at equal width, and a row of exactly three sits three across.
   The last odd tile is no longer stretched across the whole card. */
@media (max-width: 575px) {
    body .stat-strip > .stat-tile { flex: 0 1 calc(50% - 0.3rem); min-width: 0; }
    body .stat-strip:has(> .stat-tile:nth-child(3):last-child) > .stat-tile {
        flex-basis: calc(33.333% - 0.4rem); padding-left: 0.35rem; padding-right: 0.35rem;
    }
}

/* Site-22: the sub-headings inside an open menu group were 10px gray capitals. */
body .nav-section-label { font-size: 0.8125rem; color: #a6a6a6; }

/* Site-30: in the "Sign in to save" pop-up for a signed-out visitor, Join Free is the one
   green button and Login the outline one. (The same pop-up without the Join button - a
   real expired session - keeps Login green.) */
body .modal-footer > .d-inline + .button.save[data-session-login] {
    background-color: transparent;
    color: var(--color-link, #006C96);
    border: 1px solid var(--color-link, #006C96);
    box-shadow: none;
}

/* Site-122: on a wide screen a dropdown is no wider than the text boxes beside it. */
@media (min-width: 992px) {
    body select.dropdown, body select.textbox { max-width: 30rem; }
}

/* Site-24: on a page shorter than the window (Login, Reset Password, Verify Email, a
   returning visitor's Home) the footer sits at the bottom of the window, not under the
   content with bare background below it. The page is a column: header, content, footer;
   the content takes the spare height. */
body:has(> form#aspnetForm > main.page-wrapper) { min-height: 100vh; min-height: 100dvh; box-sizing: border-box; display: flex; flex-direction: column; }
body > form#aspnetForm:has(> main.page-wrapper) { flex: 1 0 auto; display: flex; flex-direction: column; min-width: 0; }
body > form#aspnetForm:has(> main.page-wrapper) > main.page-wrapper { flex: 1 0 auto; width: 100%; box-sizing: border-box; }

/* Site-103: column headings of the data tables were 10.4px capitals on a phone. */
@media (max-width: 767px) {
    body .data-table th { font-size: 0.75rem; }
}

/* Site-114: when a fold's heading is too long for one line, its arrow stays beside the
   first line and no longer drops onto a line of its own. Only for headings that hold
   nothing but their text: a heading with a summary or a count wraps those on purpose. */
body .card-title.home-head-toggle:not(:has(.home-head-summary, .home-head-count)) { flex-wrap: nowrap; align-items: flex-start; }
body .card-title.home-head-toggle:not(:has(.home-head-summary, .home-head-count))::after { align-self: flex-start; margin-top: 0.45em; }

/* Site-50 (part): a finger-sized tap area for the "Why?" links, with no change to the
   layout around them (the padding is taken back by the margin). */
body .field-why { padding: 0.65rem 0.5rem; margin: -0.65rem -0.5rem; }

/* Join1-3: "Step N of 4" in words beside the progress bar (Join1-4) */
body .join-progress {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.75rem;
    max-width: 540px;
    margin: 0 auto 1.25rem;
}
body .join-progress .join-stepper {
    flex: 1;
    margin: 0;
    max-width: none;
}
body .join-step-words {
    flex: none;
    font-size: var(--font-size-sm, 0.875rem);   /* 14px, a step of the text scale (it was 13.6px): Site-176, 2026-10-13 */
    color: var(--color-text-muted);
    white-space: nowrap;
}

/* Join3-2: Month, Day and Year on one row (all widths) */
body .join-birthday-row {
    flex-wrap: nowrap;
    column-gap: 0.5rem;
}
body .join-birthday-row .form-group {
    flex: 1 1 0;
    min-width: 0;
}
body .join-birthday-row .form-group:first-child {
    flex-grow: 1.6;
}

/* Join3-4 / Join3-5: the required star sits right after its heading; the four
   question headings are one size smaller than the page title */
body .join-card .section-header {
    justify-content: flex-start;
    column-gap: 0.25rem;
    font-size: var(--font-size-lg, 1.25rem);
}

/* Join3-7: larger gender radio buttons (and a bigger tap row) */
body .join-gender input[type="radio"] {
    width: 1.5rem;
    height: 1.5rem;
    min-width: 1.5rem;
    margin: 0 0.5rem 0 0;
    vertical-align: middle;
    accent-color: var(--color-primary);
    cursor: pointer;
}
body .join-gender label {
    display: inline-block;
    min-height: 44px;
    line-height: 44px;
    vertical-align: middle;
    cursor: pointer;
}

/* Login-2: Login's field labels use the normal label weight (was 700 in Content\styles.css
   ".login-page .input-label"; that rule can simply be deleted when merging) */
body .login-page .input-label {
    font-weight: var(--font-weight-medium, 500);
}

/* UpdateCreds-7: the password-strength bar (a plain <div> that site.js inserts right after
   .password-wrapper) is as wide as the password box (same 480px cap as .password-wrapper) */
@media (min-width: 768px) {
    body .form-group > .password-wrapper + div {
        max-width: 480px;
    }
}

/* VerifyDevice-2 / -3: short centered code box with large spaced digits; the instruction and the
   other links are upright (only the "expires in 15 minutes" note stays italic) */
body .verify-card .form-group {
    text-align: center;
}
body .verify-card .verify-code {
    width: 100%;
    max-width: 11rem;
    margin-left: auto;
    margin-right: auto;
    text-align: center;
    letter-spacing: 0.4em;
    padding-left: 0.4em;   /* balances the trailing letter-space so the digits look centered */
    font-variant-numeric: tabular-nums;
}
body .verify-card .verify-lead {
    font-style: normal;
}
body .verify-card .form-actions {
    justify-content: center;
}

/* Glossary-4: half the gap between glossary entries. */
body #glossary .about-grid {
    gap: 0.6rem 1.25rem;
}
body #glossary .gloss-term .input-label {
    margin-bottom: 0;
}
body #glossary .gloss-term p {
    margin-top: 0;
    margin-bottom: 0.25rem;
}

/* HelpHub-3: each help tile is one tappable block (stretched link). */
body .hub-tile {
    position: relative;
    padding: 0.9rem 1rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-lg, 0.5rem);
    background: var(--color-bg-card);
}
body .hub-tile:hover,
body .hub-tile:focus-within {
    border-color: var(--color-primary, var(--color-accent));
}
body .hub-tile .input-label {
    font-size: var(--font-size-lg, 1.125rem);
    font-weight: var(--font-weight-bold, 700);
}
body .hub-tile a.link::after {
    content: "";
    position: absolute;
    inset: 0;
}

/* Invite-1: the link box is the same width as the email box (480px cap) on a wide screen. */
@media (min-width: 768px) {
    body .invite-link-row .textbox {
        flex: 1 1 220px;
        max-width: 480px;
    }
}

/* Donate-2: "Suggested Amount" at the size of the other card headings. */
body .donate-amounts-card legend.input-label {
    float: none;
    width: auto;
    padding: 0;
    margin: 0 0 0.75rem;
    font-size: var(--font-size-lg);
    font-weight: var(--font-weight-bold);
    line-height: inherit;
}

/* Donate-5: phone - Venmo and PayPal rows laid out the same way (each button on its own full-width line). */
@media (max-width: 575px) {
    body .donate-method-actions .button,
    body .donate-method-actions .donate-cta {
        flex: 1 1 100%;
        min-width: 0;
        justify-content: center;
    }
}

/* Site-31: the message after a check-off is taken away ("Completion removed" + Undo) is a quiet
   dark note, not the lime success color. Same on both themes, like the other toasts. */
body .site-toast.toast-neutral {
    background: #1f2937;
    color: #fff;
    border: 1px solid rgba(255, 255, 255, 0.35);
}
body .site-toast.toast-neutral .site-toast-close { color: #fff; opacity: 1; }
body .site-toast.toast-neutral .site-toast-close:hover { background: rgba(255, 255, 255, 0.22); }

/* Notifications-2: "Technical diagnostics" summary gets the standard fold arrow.
   The shared .subscribe-details-title sets display:block, which removes the summary's marker. */
body .subscribe-details-card > summary.subscribe-details-title {
    display: list-item;
    list-style-position: inside;
    cursor: pointer;
}

/* Notifications-8: the "all set" / "blocked" lines read as normal text; only the mark is colored. */
body .subscribe-state-headline-ok,
body .subscribe-state-headline-bad {
    color: var(--color-text);
}
body .subscribe-state-headline-ok .subscribe-state-mark {
    color: var(--color-success-text, var(--color-success));
}
body .subscribe-state-headline-bad .subscribe-state-mark {
    color: var(--color-danger);
}

/* Preferences-6: reminder and feedback check boxes at the standard 18px blue box;
   the label text wraps in its own column and never runs back under the box. */
body .reminder-channels .checkbox,
body .pref-check-row {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
}
body .reminder-channels .checkbox > input[type="checkbox"],
body .pref-check-row > input[type="checkbox"] {
    flex: 0 0 auto;
    width: 1.125rem;
    height: 1.125rem;
    min-width: 1.125rem;
    margin: 0.15rem 0 0;
    accent-color: var(--color-primary);
}
body .reminder-channels .checkbox > label {
    flex: 1 1 auto;
    min-width: 0;
}

/* Site-15: on a phone the row of Help tabs still slides sideways, but without the gray scroll
   bar; the right edge fades to show there is more. The spacer lets the last tab clear the fade. */
@media (max-width: 767px) {
    body .page-tabs {
        scrollbar-width: none;
        -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 2.25rem), transparent);
        mask-image: linear-gradient(to right, #000 calc(100% - 2.25rem), transparent);
    }
    body .page-tabs::-webkit-scrollbar { display: none; }
    body .page-tabs::after { content: ""; flex: 0 0 2rem; }
}

/* Site-17: on a phone the footer links wrap as whole items with a gap between them, so no
   separator dot is left hanging at the end of a line. */
@media (max-width: 575px) {
    body .site-footer-links {
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        gap: 0.1rem 1.1rem;
    }
    body .site-footer-links .site-footer-sep { display: none; }
}

/* Site-36: "Press Esc to clear" is left off touch screens, which have no Esc key (as the
   footer's "Press ? for shortcuts" already is). */
@media (hover: none) and (pointer: coarse) {
    body .esc-hint { display: none; }
}

/* Site-74: the round header buttons do not show through an open pop-up. */
body:has(.modal-overlay.open) .tutorial-help-pill,
body:has(.modal-overlay.open) .theme-pill,
body:has(.pwa-info-overlay:not([hidden])) .tutorial-help-pill,
body:has(.pwa-info-overlay:not([hidden])) .theme-pill { display: none; }

/* Site-25: in the pop-up after signing in, both cards lay their buttons out the same way: the
   two buttons side by side, "Don't Ask Again" on a line of its own under them, as a normal
   quiet link. */
body .post-login-card-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.6rem;
}
body .post-login-card-actions .button { flex: 0 0 auto; margin: 0; }
body .post-login-card-actions .post-login-never {
    flex: 0 0 100%;
    text-align: left;
    padding: 0.35rem 0;
    color: var(--color-link);
    text-decoration: none;
    font-size: var(--font-size-sm);
}
body .post-login-card-actions .post-login-never:hover { text-decoration: underline; }

/* Site-130: a longer message under an empty-state heading reads as a left-aligned block (still
   centered as a block); one short line still looks centered. */
body .empty-state-sub {
    width: fit-content;
    max-width: min(100%, 36rem);
    margin-left: auto;
    margin-right: auto;
    text-align: left;
}

/* Site-144: the hand pointer over radio buttons, check boxes and their labels. */
body input[type="radio"],
body input[type="checkbox"],
body label:has(> input[type="radio"]),
body label:has(> input[type="checkbox"]),
body input[type="radio"] + label,
body input[type="checkbox"] + label { cursor: pointer; }
body input[type="radio"]:disabled,
body input[type="checkbox"]:disabled,
body input:disabled + label { cursor: not-allowed; }

/* Site-50 (rest): a finger-sized tap area on two small controls, without changing how they
   look: the feedback bubble beside a title and the x that closes a tip. */
body .pf-bulb,
body .tip-dismiss { position: relative; }
body .pf-bulb::after,
body .tip-dismiss::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 44px;
    height: 44px;
    transform: translate(-50%, -50%);
}

/* The x on a tip floats at the tip's top right corner with the sentence wrapping round it, so its
   tap area grows up and to the right (away from the words) and only a little toward them: a tap
   on a link at the end of the tip's second line must still reach the link. */
body .tip-dismiss::after { top: -8px; right: -6px; bottom: -4px; left: -2px; width: auto; height: auto; transform: none; }

/* Site-62: printing an ordinary page. The shared sheet already drops the menu, footer and
   button rows; this adds: light colors from a dark-theme account, no web address printed after
   each link, and no buttons, search boxes, Back link, help tabs or page chips. Every rule is
   tied to a page that carries the site menu, so the dedicated print pages keep their own look. */
@media print {
    html[data-theme="dark"] {
        --color-text: #1a1f2e;
        --color-text-muted: #4d5157;
        --color-text-light: #9aa0a8;
        --color-link: #00516f;
        --color-bg: #ffffff;
        --color-bg-card: #ffffff;
        --color-bg-input: #ffffff;
        --color-surface-muted: #f8f9fa;
        --color-border: #b6cede;
        --color-primary-light: #e0f6fe;
        --color-success-bg: #e8f5e9;
        --color-success-border: #a5d6a7;
        --color-danger-bg: #ffebee;
        --color-danger-border: #ef9a9a;
        --color-warning-bg: #fff3e0;
        --color-warning-border: #ffcc80;
        --color-info-bg: #e1f5fe;
        --color-info-border: #81d4fa;
        --color-info-text: #01639b;
        --color-success-text: #1b5e20;
        --color-danger-text: #7a1c14;
    }
    body:has(.site-nav),
    body:has(.site-nav) .page-wrapper,
    body:has(.site-nav) .main-card,
    body:has(.site-nav) .card,
    body:has(.site-nav) .tip-card,
    body:has(.site-nav) .stat-tile,
    body:has(.site-nav) .page-header,
    body:has(.site-nav) table,
    body:has(.site-nav) th,
    body:has(.site-nav) td {
        background: #fff !important;
        background-image: none !important;
        color: #000 !important;
    }
    body:has(.site-nav) .page-title,
    body:has(.site-nav) h1, body:has(.site-nav) h2, body:has(.site-nav) h3, body:has(.site-nav) h4,
    body:has(.site-nav) p, body:has(.site-nav) li, body:has(.site-nav) dt, body:has(.site-nav) dd,
    body:has(.site-nav) label, body:has(.site-nav) summary, body:has(.site-nav) .note,
    body:has(.site-nav) .small-dim-text, body:has(.site-nav) .stat-tile-value, body:has(.site-nav) .stat-tile-label {
        color: #000 !important;
    }
    body:has(.site-nav) a, body:has(.site-nav) .link { color: #000 !important; text-decoration: underline; }
    body:has(.site-nav) a[href]::after { content: none !important; }
    body:has(.site-nav) .button,
    body:has(.site-nav) input[type="submit"],
    body:has(.site-nav) input[type="button"],
    body:has(.site-nav) .back-btn,
    body:has(.site-nav) .input-clearable,
    body:has(.site-nav) input[type="search"],
    body:has(.site-nav) .esc-hint,
    body:has(.site-nav) .td-quicknav,
    body:has(.site-nav) .page-tabs,
    body:has(.site-nav) .setup-wizard-bar,
    body:has(.site-nav) .pf-bulb,
    body:has(.site-nav) .tutorial-help-pill,
    body:has(.site-nav) .theme-pill,
    body:has(.site-nav) .tip-dismiss,
    body:has(.site-nav) .offline-set { display: none !important; }
}

/* Site-133 (helper I): soft highlight for the word typed into a filter box, on Glossary and Site Map.
   Glossary.aspx and SiteMap.aspx have no style block of their own, so the lead merges this into Content\styles.css.
   (Fitness Tips already carries the same rule in its own style block.) Fixed light yellow with dark text so it
   reads on both themes. */
body mark.filter-hit {
    background: #fff0a8;
    color: #1a1a1a;
    border-radius: 2px;
    padding: 0 1px;
}

/* Site-25 (phone): "Enable Notifications" and "Maybe Later" do not fit side by side on a phone,
   so there both cards stack their buttons full width. That is what makes the two rows match. */
@media (max-width: 575px) {
    body .post-login-card-actions .button { flex: 1 1 100%; }
}

/* ...and on the light theme the demo notices are a darker orange on their pale orange
   (7 to 1; they were 3.5 to 1). */
html:not([data-theme="dark"]) body .banner-demo,
html:not([data-theme="dark"]) body .banner-demo a,
html:not([data-theme="dark"]) body .banner-demo strong,
html:not([data-theme="dark"]) body .banner-demo span,
html:not([data-theme="dark"]) body .demo-strip,
html:not([data-theme="dark"]) body .demo-strip a,
html:not([data-theme="dark"]) body .demo-strip strong,
html:not([data-theme="dark"]) body .demo-strip span,
html:not([data-theme="dark"]) body .demo-action-badge { color: #8F3B00; }

/* Site-130 (rest): the two longer centered paragraphs left - Catch Up's note under its empty
   list and Message Sent's text - are left-aligned blocks too. */
body .ms-detail-text {
    width: fit-content;
    max-width: min(100%, 36rem);
    margin-left: auto;
    margin-right: auto;
    text-align: left;
}
/* The menu, from the same qFIT review (rows Site-11 and Site-20): shared by all five sites. */
/* Site-11: in the menu only the page you are on is a solid bar. The section it belongs to is
   marked with a blue left edge, and a group you have opened with a lighter background, so two
   solid bars are never lit at once. */
body .site-nav .nav-menu .nav-link-has-dropdown.active,
body .site-nav .nav-menu .nav-link-has-dropdown.active:hover {
    background-color: transparent;
    color: #fff;
    box-shadow: inset 4px 0 0 var(--color-accent);
}
body .site-nav .nav-menu .nav-link-has-dropdown[aria-expanded="true"],
body .site-nav .nav-menu .nav-link-has-dropdown[aria-expanded="true"]:hover,
body .site-nav .nav-menu .nav-link-has-dropdown[aria-expanded="true"]:focus {
    background-color: rgba(255, 255, 255, 0.12);
    color: #fff;
}
body .site-nav .nav-menu .nav-link-has-dropdown.active[aria-expanded="true"] {
    box-shadow: inset 4px 0 0 var(--color-accent);
}

/* Site-20: a clear arrow at the right edge of every row that opens: down when closed, up when
   open. (It was a 12px triangle beside the word.) */
body .site-nav .nav-menu .nav-link-has-dropdown::after {
    content: "\25BE";
    display: block;
    margin-left: auto;
    padding-left: 0.75rem;
    font-size: 1.35rem;
    line-height: 1;
    opacity: 0.9;
}
body .site-nav .nav-menu .nav-link-has-dropdown[aria-expanded="true"]::after { content: "\25B4"; }
/* Join3-2 on the sister sites, whose birthday row is the .join-row grid (qFIT's is a flex row):
   Month, Day and Year stay on ONE row at every width, Month a little wider. Without this the
   grid drops to one column below 540px and the birthday takes three rows on a phone. */
body .join-row.join-birthday-row { grid-template-columns: 1.6fr 1fr 1fr; column-gap: 0.5rem; }
/* Contact List (PacklistPRO, paulmendelson.com; qFIT has the same rule in its own page): the
   row's Remove is a quiet outline button with red words. Only the OUTLINE form is colored here:
   qMEET keeps a solid red Remove inside its row menu, where red words would vanish. */
body .ct-row-actions .button.transparent.ct-remove { color: var(--color-danger, #c0392b); }
/* On the dark theme that red is 2.25 to 1 on the card (measured on paulmendelson.com); the
   theme's own light red is used there. This also reaches qFIT, whose page rule is the same red. */
[data-theme="dark"] body .ct-row-actions .button.transparent.ct-remove { color: var(--color-danger-text, #ef9a9a); }
/* UI REVIEW Site-10 (owner, 2026-10-10: "columns on wide screens only"), all five sites.
   From 992px up the OPEN menu shows every group with its entries at once, side by side, where it
   used to be one list down the left edge with one group open at a time and the rest of a wide
   screen empty. Below 992px nothing changes.
   - The plain links the menu starts with (Home, To-Do, Checklist ...) are one line across the top.
   - Under them every group is a column: its name as a heading, its entries under it, all open.
   - A plain link further down (Contact Us, Join, Login) is a column of its own.
   - The second, gray line of an entry is left out here to keep a column short; the same words are
     the entry's tooltip.
   Markup and script are untouched, and nothing is reordered, so the Tab key reads the menu in the
   order it is drawn. The menu box keeps its own up-and-down scroll for a short window.
   NOT done with CSS columns: the menu box has a fixed height, and a multi-column box of fixed
   height puts what does not fit into more columns off the right edge (measured: 1,899px of
   columns in a 1,280px window).
   Written with body .site-nav in front so it wins over each site's Content/nav-hamburger.css
   whichever of the two sheets loads last. */
@media (min-width: 992px) {
    body .site-nav .nav-menu.open {
        display: flex;
        flex-flow: row wrap;
        align-items: flex-start;
        align-content: flex-start;
        gap: 0.35rem 1.5rem;
        padding: 0.75rem max(1.25rem, calc((100vw - 1500px) / 2)) 3rem;
    }
    /* every top-level entry is a column ... */
    body .site-nav .nav-menu.open > .nav-item { flex: 0 0 13.75rem; min-width: 0; }
    /* ... except the plain links the menu starts with: one line, then a break before the groups */
    body .site-nav .nav-menu.open > .nav-item:not(:has(> .nav-dropdown)):not(.nav-item:has(> .nav-dropdown) ~ .nav-item) {
        flex: 0 0 auto;
        order: -1;
    }
    body .site-nav .nav-menu.open::before {
        content: "";
        flex: 0 0 100%;
        order: 0;
        border-top: 1px solid rgba(255, 255, 255, 0.22);
        margin: 0.25rem 0 0.35rem;
    }
    /* every group is open */
    body .site-nav .nav-menu.open .nav-dropdown,
    body .site-nav .nav-menu.open .nav-item:hover .nav-dropdown,
    body .site-nav .nav-menu.open .nav-item:focus-within .nav-dropdown {
        display: block;
        padding-left: 0;
        background-color: transparent;
    }
    /* a group's name reads as a heading, not as a row that opens */
    body .site-nav .nav-menu.open .nav-link-has-dropdown,
    body .site-nav .nav-menu.open .nav-link-has-dropdown:hover,
    body .site-nav .nav-menu.open .nav-link-has-dropdown:focus,
    body .site-nav .nav-menu.open .nav-link-has-dropdown.active,
    body .site-nav .nav-menu.open .nav-link-has-dropdown[aria-expanded="true"] {
        background-color: transparent;
        box-shadow: none;
        color: #fff;
        font-weight: var(--font-weight-bold);
        cursor: default;
        padding-bottom: 0.3rem;
        margin-bottom: 0.2rem;
        border-bottom: 1px solid rgba(255, 255, 255, 0.28);
    }
    body .site-nav .nav-menu.open .nav-link-has-dropdown::after { content: none; }
    body .site-nav .nav-menu.open .nav-link-has-dropdown .nav-link-sub,
    body .site-nav .nav-menu.open .nav-dropdown .nav-link .nav-link-sub { display: none; }
    body .site-nav .nav-menu.open .nav-dropdown .nav-link { padding: 0.32rem 0.75rem; }
    body .site-nav .nav-menu.open .nav-section-label { padding-left: 0.75rem; padding-right: 0.75rem; }
}
/* ACCOUNT & SECURITY: Deactivate sits behind a fold (owner, 2026-10-10, qFIT UI review UpdateCreds-6;
   all five sites). The card and its heading stay; the explanation, the password box and the red
   button are inside <details class="deactivate-fold">, whose summary reads as a plain link. */
.deactivate-fold > summary { display: inline-block; cursor: pointer; list-style: none; }
.deactivate-fold > summary::-webkit-details-marker { display: none; }
.deactivate-fold[open] > summary { margin-bottom: 0.75rem; }

/* ── The open menu must not cover its own close button (2026-10-10) ──────────────────────────────
   Found on qMEET signed out, at the top of any page, at 390px and at 1280px: the demo strip is
   drawn ABOVE the header there, so the header sits 47px down, while the open menu is a sheet
   fixed 56px from the top of the screen. The sheet covered the header's logo and its X, and the
   visitor had no button left to close the menu with (scrolled down, the header sticks to the top
   and all was well, which is why nobody saw it). While the menu is open the strip is taken out,
   so the header is at the top where the sheet expects it. Nothing shows the difference: the sheet
   covers the page. A site whose strip is under the header (qFIT) is unaffected. */
body:has(.site-nav .nav-menu.open) .banner-demo { display: none; }
/* [qplan-authflow] ONE LAYOUT FOR THE SIX SCREENS OF THE LOGIN FLOW (2026-10-10, all five sites) */
/* Owner, qFIT UI review Login-5 ("Give the two cards the same width and the same header") and
   VerifyDevice-4 ("Give Login, Join, Forgot Login, Reset Password, Verify Email and Verify This
   Device one shared layout"). Measured before, at 1280px: Login 420px centered under the logo;
   Join 540px centered under a question; Forgot Login 480px centered under a left-aligned page title;
   Reset Password and Verify Email full width (1152px); Verify This Device 480px at the LEFT edge.
   Now all six are ONE column: 480px wide, centered, the page title (where the screen has one)
   centered directly above its card in that same column. Login and the first Join step both open
   with the site's logo (Join1.aspx on each site gained the Logo control the same day).
   - Reset Password's panels carry .forgot-card on every site: it is part of the same flow and
     that class is this column.
   - :has() is what lets the title row and the message panel above the card join the column
     without a class of their own on five sites' pages.
   - On a phone nothing changes: every one of these was already the full width there.
   The older rules these replace are still above in this sheet (.login-container 420px,
   .join-card 540px, .verify-card 480px with no centering); this block comes last, so it wins. */
.login-container, .login-tips-area, .join-card, .forgot-card, .verify-card, .verify-email-card {
    width: 100%;
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
}
.page-wrapper:has(.forgot-card, .verify-card, .verify-email-card) .page-header,
.page-wrapper:has(.forgot-card, .verify-card, .verify-email-card) > .alert-panel {
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
}
.page-wrapper:has(.forgot-card, .verify-card, .verify-email-card) .page-header {
    justify-content: center;
    text-align: center;
}
.page-wrapper:has(.forgot-card, .verify-card, .verify-email-card) .page-header .page-title {
    margin-right: 0;
    text-align: center;
}
/* A second or third card of the same screen (a Too Many Attempts card, a help card under the
   form) follows the column too, so one screen never shows two widths. */
.page-wrapper:has(> .forgot-card, > .verify-card, > .verify-email-card) > .main-card {
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
}
/* On a phone the Login card had a narrower column than the other five (its wrapper adds side
   padding of its own); with that padding off, all six use the same width there too. */
@media (max-width: 575px) {
    .login-page { padding-left: 0; padding-right: 0; }
}
/* [qplan-authflow-2] the row under the card (Back to Login) keeps to the same 480px column */
.forgot-card ~ .form-actions, .verify-card ~ .form-actions, .verify-email-card ~ .form-actions {
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
}
/* [qplan-menufind] "Find a Page" at the top of the open menu (owner, 2026-10-10; qFIT UI review Site-147; all five sites) */
/* The box and its results are built by Shared/site-core.js installMenuFindBox as the first <li> of
   #nav-menu. It is part of the OPEN menu only. On a wide screen, where the open menu is drawn in
   columns (Site-10 above), it is a row of its own above the plain links. The menu sheet is dark on
   every theme, so the result text takes the menu's own light color; the box is the theme's
   ordinary .textbox. Written with "body .site-nav" in front for the same reason as Site-10. */
.site-nav .nav-menu > .nav-find { display: none; list-style: none; }
body .site-nav .nav-menu.open > .nav-find {
    display: block;
    padding: 0.6rem 0.75rem 0.4rem;
    margin: 0;
}
.nav-find .nav-find-box { width: 100%; max-width: 26rem; }
.nav-find-results { list-style: none; margin: 0.4rem 0 0; padding: 0; max-width: 26rem; }
.nav-find-results > li { margin: 0; }
.nav-find-results a {
    display: block; padding: 0.45rem 0.6rem; border-radius: 6px;
    color: inherit; text-decoration: none; line-height: 1.3;
}
.nav-find-results a:hover,
.nav-find-results a:focus-visible { background: rgba(255, 255, 255, 0.14); outline: none; }
.nav-find-name { display: block; font-weight: 600; }
.nav-find-desc { display: block; font-size: 0.85em; opacity: 0.82; }
.nav-find-status { margin: 0.3rem 0 0; font-size: 0.85em; opacity: 0.9; }
.nav-find-status:empty { display: none; }
.nav-find-status a { color: inherit; text-decoration: underline; }
@media (min-width: 992px) {
    body .site-nav .nav-menu.open > .nav-find { flex: 0 0 100%; order: -2; padding-left: 0; padding-right: 0; }
}

/* ══════════════════════════════════════════════════════════════════════════════════════
   UI REVIEW, THE OWNER'S SECOND BATCH OF DECISIONS (2026-10-10, night) - rules for parts that
   all five sites share. qFIT's own rules for the same batch are at the end of its
   Content/styles.css ("[qnow-...]" marks there too).
   ══════════════════════════════════════════════════════════════════════════════════════ */

/* [qnow-dropdown] Site-33 (owner: "fix"). The text inside every dropdown lost the tails of
   y, g and p. The box is 2.5rem tall with 0.5rem padding above and below, which leaves 22px
   for a line of text that is 24px tall on four sites and 27px on qFIT (its text is 18px).
   The padding is now 5px: 28px of room, the box the same height, the text still centered.
   Text boxes are not touched - only a list clips its own text. */
.dropdown,
select.textbox {
    padding-top: 0.3125rem;
    padding-bottom: 0.3125rem;
}

/* [qnow-shortscreen] Site-64 (owner: "fix"). A phone held sideways is about 390px tall. The
   header stayed pinned and with a notice strip left about 150px of page; it now scrolls
   away with the page there. Three things follow from that, all inside the same query:
   - nothing is pinned "under the header" any more, so the height other rules pin by is 0
     (sticky table headings, To-Do's group heading, jump targets);
   - the bar itself keeps its 56px, and the open menu still starts under it;
   - while the menu is open the bar is pinned again, so its close button cannot scroll away
     from the menu it closes. Opening the menu needs the bar, so it is at the top of the page. */
@media (max-height: 480px) and (orientation: landscape) {
    :root { --nav-height: 0px; }
    .site-nav { position: static; height: 56px; }
    body .site-nav .nav-menu { top: 56px; }
    body:has(.site-nav .nav-menu.open) .site-nav { position: sticky; top: 0; }
}

/* [qnow-errorhead] Error-1 (owner: "fix"). The error page's heading is plain words and its
   way back is a real "Back" link on a line of its own above the heading. It was a bare arrow
   jammed against the first word of the heading (a flex row with a negative margin). */
.error-head > .back-btn { display: inline-flex; margin: 0 0 0.35rem; }
.error-head > .page-title { display: block; }

/* [qnow-contactlog] ContactUsLog-2 (owner, 2026-10-10: "fix"). The list of a member's own Contact
   Us messages is five columns (Date, Type, Status, Open/Closed, Reply) on qFIT, PacklistPRO,
   NobodyHasTHIS and paulmendelson.com, and on a phone it scrolled sideways. A table marked
   "cuv-2line" (ContactUsLog.aspx.vb on those four) shows each message there as two lines: when it
   was sent, its status and whether it has a reply; then its type and open or closed. The column
   headings are not drawn on a phone (every cell says what it is). qMEET's list has other columns
   and is not marked. The cell ORDER is part of this rule: change the columns in the code and
   change the five nth-child lines with them. */
@media (max-width: 600px) {
    .table-responsive > table.cuv-table.cuv-2line,
    .table-responsive > table.cuv-table.cuv-2line > tbody { display: block; width: 100%; overflow: visible; }
    .table-responsive > table.cuv-table.cuv-2line > thead { display: none; }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row {
        display: grid; grid-template-columns: auto minmax(0, 1fr) auto; column-gap: 0.5rem; row-gap: 0.2rem;
        align-items: center; padding: 0.5rem 0.35rem; border-bottom: 1px solid var(--color-border);
    }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row > td { padding: 0; border: 0; white-space: normal; min-width: 0; background: none; font-weight: inherit; box-shadow: none; }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row:nth-child(even) { background-color: color-mix(in srgb, var(--color-bg) 50%, transparent); }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row:hover,
    table.cuv-table.cuv-2line > tbody > tr.cuv-row.cuv-selected { background-color: var(--color-primary-light); }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row.cuv-selected { box-shadow: inset 3px 0 0 var(--color-accent); font-weight: var(--font-weight-medium); }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row.cuv-unviewed > td:first-child { font-weight: var(--font-weight-bold); }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row > td:nth-child(1) { grid-column: 1; grid-row: 1; }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row > td:nth-child(3) { grid-column: 2; grid-row: 1; }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row > td:nth-child(5) { grid-column: 3; grid-row: 1; text-align: right; }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row > td:nth-child(2) { grid-column: 1 / span 2; grid-row: 2; }
    table.cuv-table.cuv-2line > tbody > tr.cuv-row > td:nth-child(4) { grid-column: 3; grid-row: 2; text-align: right; color: var(--color-text-muted); }
}

/* [qfin-ellipsis] Site-110 (owner, 2026-10-11: "fix"). A dropdown whose chosen text is wider than
   its box, and a text box whose hint is, stopped mid-word on a phone. Both now end in three dots.
   The full text of a dropdown choice is in the list when it is opened; a hint is only a hint.
   :placeholder-shown limits the second rule to the hint: a typed value is drawn as before.
   All five sites. */
.dropdown,
select.textbox { text-overflow: ellipsis; }
input.textbox:placeholder-shown,
input[type="text"]:placeholder-shown,
input[type="search"]:placeholder-shown { text-overflow: ellipsis; }

/* [qfin-authcard] ONE LAYOUT FOR THE SIX SCREENS OF THE LOGIN FLOW, second half (owner, 2026-10-11:
   "fix", qFIT UI review Site-60; all five sites). After [qplan-authflow] above, two looks were left:
   Login and Join were a card that opens with the site's logo, with no title row; Forgot Login, Reset
   Password, Verify Email and Verify This Device were a page title row (a Back link, the title, a rule
   under it) above a tighter card. Those four pages now open their card with the Logo control and
   carry their title inside it (each site's .aspx, the same day), and this block gives their card the
   Login card's padding, corners and shadow. So all six are: one 480 px card, the logo, the title
   where the screen has one, the form, and the way out under it.
   - The Back link of the old title row went with the row (it was added by site.js to any title
     outside a card). Forgot Login and Reset Password keep their own "Back to Login" under the card,
     now centered like the links under the Login form.
   - On a phone the card keeps the Join card's tighter padding. */
.forgot-card, .verify-card, .verify-email-card {
    padding: 1.75rem;
    border-radius: var(--border-radius-lg);
    box-shadow: var(--shadow-lg);
}
@media (max-width: 575px) {
    .forgot-card, .verify-card, .verify-email-card { padding: 1.25rem; border-radius: var(--border-radius); }
}
.forgot-card > .page-title, .verify-card > .page-title, .verify-email-card > .page-title {
    text-align: center;
    margin-right: 0;
}
.forgot-card ~ .form-actions, .verify-card ~ .form-actions, .verify-email-card ~ .form-actions {
    justify-content: center;
    text-align: center;
}

/* [qfin-authcard-2] a little air under the title inside those cards (Forgot Login has its intro line straight after it) */
.forgot-card > .page-title, .verify-card > .page-title, .verify-email-card > .page-title { margin-bottom: 0.75rem; }

/* [qfin-linelength] READING TEXT HOLDS ABOUT 80 CHARACTERS A LINE ON A WIDE SCREEN (owner, 2026-10-11:
   "fix", qFIT UI review Site-63; all five sites). The page is capped at 1,200 px, but a paragraph inside
   a card ran the card's whole width: 140 to 190 characters a line on a laptop, where about 75 is what
   the eye follows without losing its place. Measured on qFIT at 1,366 px before this rule: 560 wrapped
   blocks of text over 100 characters a line on 36 of 55 signed-out pages (and 412 more on the member
   pages); after it, 1.
   WHAT IS CAPPED: plain paragraphs (no class), the site's note / small-text / notice paragraphs, the
   items of a plain list, help steps and definitions. 66ch is about 80 characters of ordinary text (ch
   is the width of a "0", which is wider than the average letter).
   WHAT IS NOT: anything that is a row of controls (a paragraph that directly holds a button, a box or a
   dropdown is left alone, so a row of buttons wraps where it always did), tables, cards, grids, headings,
   and any paragraph that has a class of its own that is not named here. A new kind of prose paragraph
   with its own class needs adding to this list, or to the site's own sheet.
   Centered text keeps its box centered. Below 992 px nothing changes: a line is already short there.
   NAMED OUT, each found by measuring the five sites with the rule on (D:\Claude\build\qfin\t_sis5.js):
   a character counter under a box (.char-counter, right-aligned), a pager's "Showing 1-25 of N" line
   (.pager-count, centered), and two paragraphs that share a ROW with something else and take its free
   space, where a cap lets the neighbor slide (.home-newuser-tip-text, .plp-quick-add-msg). A capped
   paragraph in such a row is the one thing this rule can spoil: name it here.
   A paragraph directly in a .page-header is not affected (its min-width of 100% wins, by an older rule). */
@media screen and (min-width: 992px) {
    main p:not([class]):not(:has(> .button, > button, > input, > select, > textarea)),
    main p:is(.note, .normal-text, .small-text, .small-dim-text, .save-model, .mb-0, .mt-0, .subscribe-intro, .page-sub, .se2-intro, .ms2-intro, .cs-caveat):not(.char-counter, .pager-count, .home-newuser-tip-text, .plp-quick-add-msg):not(:has(> .button, > button, > input, > select, > textarea)),
    main :is(div, p).inline-tip,
    main .tip-card-text:not(.home-newuser-tip-text),
    main :is(ul, ol):not([class]) > li,
    main .help-steps > li,
    main dd { max-width: 66ch; }
    main .text-center > p, main .text-center > :is(ul, ol) > li, main p.text-center, main .empty-state p { margin-left: auto; margin-right: auto; }
}

/* [qfin-authcard-3] on a phone the Login card kept 28px of padding and 14px corners (its rule is marked important) while the other five screens use the Join card's 20px and 10px. One layout there too. */
@media (max-width: 575px) {
    .login-container { padding: 1.25rem !important; border-radius: var(--border-radius) !important; }
}

/* [qfin-authcard-4] on a phone all six cards take the same padding and corners on EVERY site: a site's own phone rule for cards gave the Join and Forgot Login cards 13.6px at the sides on PacklistPRO while Login had 20px. Marked important for that reason. */
@media (max-width: 575px) {
    .login-container, .join-card, .forgot-card, .verify-card, .verify-email-card { padding: 1.25rem !important; border-radius: var(--border-radius) !important; }
}


/* [plpb Site-18] (PacklistPRO UI review, 2026-10-11) The "More options / Show" bar inside a form
   card on the DARK theme: its title was the accent blue on the mid-gray fill (3.0 to 1) and its
   count and marks the muted gray (3.6 to 1). The theme's text color for the title, a light gray
   for the rest (5.0 to 1). The light theme is unchanged. */
[data-theme="dark"] .form-more-summary { color: var(--color-text); }
[data-theme="dark"] .form-more-summary::before,
[data-theme="dark"] .form-more-summary::after,
[data-theme="dark"] .form-more-count { color: #d0d4da; }


/* [plpb Join1-1] (PacklistPRO UI review, 2026-10-11, carried to qMEET, NobodyHasTHIS and paulmendelson.com)
   Join steps 1 to 4: on a phone the green button comes first and Back / Cancel sits under it; on a
   wider screen the usual row (Back or Cancel, then Next). The four pages' button rows carry the class. */
@media (max-width: 575px) {
    .form-actions.join-actions-stack { flex-direction: column-reverse; }
}


/* ── Invite: the link box and the four share buttons (first built on PacklistPRO, UI review Invite-1,
   2026-10-11; here so all five sites share one copy - PacklistPRO's sheet still carries its own, the same
   values). The link box shows the whole link by scrolling sideways. The share buttons are two to a row at
   575px and below ONLY: the grid has no width limit, so on a laptop it made each button 555px wide. The
   long selector is on purpose - it has to outrank this sheet's phone stack,
   .form-actions:not(.form-actions-centered):not(.de-modal-actions). */
.invite-link-box { overflow-x: auto; text-overflow: clip; white-space: nowrap; }
@media (max-width: 575px) {
    .form-actions.invite-share-actions:not(.form-actions-centered):not(.de-modal-actions) {
        display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem;
    }
    .form-actions.invite-share-actions:not(.form-actions-centered):not(.de-modal-actions) > .button { width: 100%; margin: 0; text-align: center; }
}


/* ── The Install button in the footer on the sites whose button stands alone (NobodyHasTHIS,
   paulmendelson.com; as on PacklistPRO, UI review Site-8, 2026-10-11). Their site.js appends the button to
   footer.site-footer and adds .pwa-install-inline; this takes it out of the fixed bottom right corner,
   where it sat over the page and over the footer's own links. PacklistPRO's pill has a wrapper and its own
   rule (.pwa-install-wrap.pwa-install-inline) in its site sheet. */
.pwa-install-btn.pwa-install-inline {
    position: static;
    right: auto;
    bottom: auto;
    z-index: auto;
    margin: 0.75rem auto 0;
    box-shadow: none;
}


/* ── On a wide screen a search or filter box ran the whole card (1,000px and more for a word or two).
   30rem at 992px and up; the box's clear-button wrapper is capped with it (first built on PacklistPRO,
   UI review Site-21, 2026-10-11; here for the same boxes on the other sites - Tips, Glossary, Contact
   List, and qMEET's parks, trails and places pages. PacklistPRO's sheet keeps its own copy, which also
   names boxes only it has). Only boxes named here: an id such as tbSearch means different things on
   different sites and was left out on purpose. */
@media (min-width: 992px) {
    main :is(#tbTipSearch, #ctSearch, #glossSearch, #parkSearch, #trailLoc, #gpsSearchInput, #gpsDestInput),
    main .input-clearable:has(> :is(#tbTipSearch, #ctSearch, #glossSearch, #parkSearch, #trailLoc, #gpsSearchInput, #gpsDestInput)) {
        max-width: 30rem;
    }
}


/* The birthday row where it is a .form-row (qFIT's My Profile): Month, Day and Year stay side by side on a
   phone too. .form-row turns into a column at 767px and below, and the Join3-2 rule above set no direction,
   so the three boxes stacked there (as on PacklistPRO, UI review MyProfile-1, 2026-10-11). */
body .form-row.join-birthday-row { flex-direction: row; }


/* Found with the Large text setting on a 360px phone (2026-10-11), on every site that has the page:
   - Site Map: a row asked for 19rem (342px at Large text) and stuck out 10px past the edge. It now asks for
     19rem or the width there is, whichever is smaller. Same 19rem as each site's own rule; nothing changes
     where 19rem fits.
   - Trail: "See all N trails at <park name>" is one long button; its words may wrap inside the page. */
.sm-rows { grid-template-columns: repeat(auto-fill, minmax(min(19rem, 100%), 1fr)); }
[id$="pnlParkTrailsLink"] > a.button { white-space: normal; max-width: 100%; line-height: 1.25; text-align: center; }


/* Places Near Me (PacklistPRO and qMEET share the page): a check box label may wrap inside its card. On one
   line "Use Google Routes (better, but not free)" is 350px: 15px past the edge of a 360px phone at the normal
   text size, and 32px past a 390px one at Large text (found 2026-10-11). A label that fits is unchanged. */
.gps-check { white-space: normal; max-width: 100%; }
.gps-check > span { min-width: 0; }


/* Two more from the Large text check on a phone (qMEET, 2026-10-11).
   - A .checkbox-nowrap label may wrap in the two cases where one was measured past the edge of the screen:
     with Large text on a phone ("Only upcoming & in-progress events" on qMEET's Similar Events: 5px past a 390px
     phone, 35px past a 360px one), and at any text size on a phone narrower than 375px ("Hide activities already
     on my Checklist" on qFIT's Quick Add: 5px past a 360px phone at the NORMAL size). It is held to the width of
     its container there. At 375px and wider with normal text nothing changes: the first cut of this rule wrapped
     the Quick Add label on a 390px phone, where it had always fit on one line.
   - "Show All Need to Know Popups Again" (Tips, Tutorials, Preferences) is an input button, whose words do not
     wrap by default: its text was cut on Tips and the button ran past the edge on Tutorials. Its words wrap when
     the button is wider than its container; a button that fits is unchanged. */
@media (max-width: 480px) {
    html.font-large .checkbox-nowrap { white-space: normal; flex-shrink: 0; max-width: 100%; }
}
@media (max-width: 374px) {
    .checkbox-nowrap { white-space: normal; flex-shrink: 0; max-width: 100%; }
}
input.button[id$="btnResetNtk"] { white-space: normal; max-width: 100%; height: auto; line-height: 1.25; }


/* The one-row birthday (Month, Day, Year; Join step 3 and My Profile, all five sites) on a small phone.
   Measured 2026-10-11 on My Profile: at 360px the Year box had 28 to 33px for a year that needs 39, and the
   Month box 75 to 83px for "September" (87); with Large text the same on a 390px phone. The text ended in three
   dots ("19..."). Each box spent 48px of its width on padding and the arrow.
   - 480px and below: the three boxes keep less padding (the arrow moves in with it). Proportions unchanged.
   - 374px and below: Day and Year are as wide as their longest choice and Month takes the rest.
   Day and Year are then readable in full at every width and text size measured (390, 360, 320px; normal and
   Large); a long month name is still shortened at 320px with Large text. Wider than 480px nothing changes. */
@media (max-width: 480px) {
    body .join-birthday-row .form-group select {
        padding-left: 0.4rem;
        padding-right: 1.4rem;
        background-position: right 0.35rem center;
        background-size: 0.7rem;
    }
}
@media (max-width: 374px) {
    /* qFIT's row is a flex .form-row whose boxes are each told to be the full width on a phone, so it is made
       the same three-column grid as the other four sites' .join-row here (a flex "auto" width came out as the
       whole row for Day and for Year). */
    body .join-row.join-birthday-row,
    body .form-row.join-birthday-row { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; column-gap: 0.5rem; }
}

/* ══════ [qmb-carry] qMEET'S UI REVIEW OF 2026-10-12: RULES FOR PAGES EVERY SITE HAS ══════
   qMEET's own review put these in qMEET\Content\styles.css. The same pages on the sister sites took the same
   changes the same day, so the rules are here for all five; qMEET keeps its own copies with the same values
   (change both, or the sites drift). Each block names the page and the class it hangs on. */

/* Help (HelpHub.aspx): the small heading "More About <site>" under Contact Us in the "Still Stuck?" card. */
body .hub-more-heading {
    margin: 1rem 0 0.5rem;
    padding-top: 0.75rem;
    border-top: 1px solid var(--color-border);
}

/* Tutorials (Tutorials.aspx): each entry of a group is one whole-row link. The entry's own link is stretched
   over its list item (the groups carry class tut-group); an entry with no link is unchanged. A list item must
   hold at most ONE a.link as a direct child, or the stretched links overlap. */
body .tut-group li {
    position: relative;
    padding: 0.35rem 0.5rem;
    border-radius: var(--border-radius, 8px);
}
body .tut-group li > a.link::after {
    content: "";
    position: absolute;
    inset: 0;
}
body .tut-group li:hover,
body .tut-group li:focus-within {
    background: rgba(127, 127, 127, 0.1);
}

/* What's New (WhatsNew.aspx): on a phone each change shows its date on a line above its text, and the
   "Date / Change" header row is hidden. .wn-results is the class on the results panel (pnlResults); the tables
   inside are built in WhatsNew.aspx.vb as <table class="data-table">. */
@media (max-width: 575px) {
    .wn-results .data-table thead { display: none; }
    .wn-results .data-table,
    .wn-results .data-table tbody,
    .wn-results .data-table tr { display: block; width: 100%; }
    .wn-results .data-table tr { padding: 0.5rem 0; border-bottom: 1px solid var(--color-border); }
    .wn-results .data-table tr:last-child { border-bottom: none; }
    .wn-results .data-table td { display: block; width: 100%; padding: 0.1rem 0.75rem; border-bottom: none; }
    .wn-results .data-table td:first-child { color: var(--color-text-muted); }
}

/* ══ ONE FOLD MARK ON ALL FIVE SITES (2026-10-13) ═══════════════════════════════════
   ONE FOLD MARK ON ALL FIVE SITES (owner, 2026-10-13; qFIT UI review row Site-174, which is
   also qMEET's row Site-24): "yes, make them all the same. Chevron after title, but
   right-align the chevron."

   Every fold is drawn one way: its title at the left and ONE drawn chevron at the right
   edge of the title row, pointing DOWN while shut and UP while open (Site-67, 2026-10-10).
   This replaces two earlier rules: the chevron placed immediately after the title text
   (owner, 2026-08-20) and the boxed "More options" bar with a triangle at its left and the
   word SHOW / HIDE at its right (2026-08-05).

   HOW. The chevron is taken out of the title's flex row and pinned to the row's right edge
   (position: absolute), and the title keeps room for it (padding-right). So it is in the
   same place whether the title also carries a count pill, a summary sentence that drops to
   its own line on a phone, or neither: the three cases that gave three positions in August.
   The rules above this block still decide which way it points; this block only moves it.

   A fold that is not a card title puts the class .fold-line on its <summary> (or on the
   button that opens it, with aria-expanded) and gets the identical mark.

   🛑 Do not give one of these ::after rules an auto margin or an `order` again, and do not
   draw a fold with a text triangle, a plus / minus, or a Show / Hide word.
   ════════════════════════════════════════════════════════════════════════════ */
.home-collapsible > .heading,
.home-head-toggle,
summary.card-title,
.form-more-summary,
.fold-line { position: relative; padding-right: 1.75em; }

.home-collapsible > .heading::after,
.home-head-toggle::after,
summary.card-title::after,
.form-more-summary::after,
.fold-line::after {
    position: absolute;
    right: 0.3em;
    top: 0.5em;
    order: 0;
    margin: 0;
}

/* The "More options" fold of a form, and any other fold line: the same chevron as a card title.
   The bar loses its box, its left triangle and its SHOW / HIDE word; the line under the form
   above it (.form-more's top border) is what still sets it apart. */
.form-more-summary {
    padding: 0.5rem 1.75em 0.5rem 0;
    border: 0;
    border-radius: 0;
    background: none;
}
.form-more-summary:hover { background-image: none; }
/* Open as well as shut: the open rule near the top of this sheet (".form-more[open] > ...::before", the
   old up triangle) outranks a bare ".form-more-summary::before", so an OPEN fold showed both marks,
   the triangle at the left and the chevron at the right (found 2026-10-22 on the To-Do editor's
   qREMIND fold). */
.form-more-summary::before,
.form-more[open] > .form-more-summary::before { content: none; }
.form-more-count { padding-left: 0; }     /* it was indented to clear the triangle that stood before the label */
.fold-line { list-style: none; cursor: pointer; }
.fold-line::-webkit-details-marker { display: none; }
.form-more-summary::after,
.form-more[open] > .form-more-summary::after,
.fold-line::after {
    content: "";
    width: 0.5em;
    height: 0.5em;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    font-size: 1rem;
    letter-spacing: 0;
    transform: rotate(45deg);            /* shut = points DOWN */
    transition: transform 0.15s ease;
    opacity: 0.55;
}
.form-more[open] > .form-more-summary::after,
details[open] > .fold-line::after,
.fold-line[aria-expanded="true"]::after { transform: rotate(225deg); top: 0.75em; }   /* open = points UP */
details[open] > summary.card-title::after,
.home-collapsible:not(.home-collapsed) > .heading::after { top: 0.75em; }
@media (prefers-reduced-motion: reduce) {
    .form-more-summary::after, .fold-line::after { transition: none; }
}

/* The "Options & Filters" line of an options card is a fold too, and it drew a small text triangle.
   Same drawn chevron, same directions. It stays in the line's flex row (it was already at the right
   edge, margin-left: auto), because an open card with a corner x hides it with `visibility`. */
.options-card .options-disclosure::after {
    content: "";
    width: 0.5em;
    height: 0.5em;
    margin: -0.2em 0.3em 0 auto;
    border: 0;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    font-size: 1rem;
    color: inherit;
    opacity: 0.55;
    transform: rotate(45deg);            /* shut = points DOWN */
}
.options-card .options-disclosure[aria-expanded="true"]::after,
details.options-card[open] > .options-disclosure::after { margin-top: 0.2em; transform: rotate(225deg); }   /* open = points UP */

/* The folding tip card (details.tip-card-static, section 6 above) drew a triangle at its left and the
   word SHOW / HIDE at its right. Same chevron, pinned to the right edge of its title line. */
details.tip-card-static > summary.tip-card-summary { position: relative; padding-right: 1.75em; }
details.tip-card-static > summary.tip-card-summary::before,
details.tip-card-static[open] > summary.tip-card-summary::before { content: none; }
details.tip-card-static > summary.tip-card-summary::after,
details.tip-card-static[open] > summary.tip-card-summary::after {
    content: "";
    position: absolute;
    right: 0.3em;
    top: 0.5em;
    width: 0.5em;
    height: 0.5em;
    margin: 0;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    font-size: 1rem;
    letter-spacing: 0;
    text-transform: none;
    color: inherit;
    opacity: 0.55;
    transform: rotate(45deg);            /* shut = points DOWN */
    transition: transform 0.15s ease;
}
details.tip-card-static[open] > summary.tip-card-summary::after { top: 0.75em; transform: rotate(225deg); }   /* open = points UP */

/* ══════════════════════════════════════════════════════════════════════════════════════════
   JUMP CHIPS ONLY ON A LONG PAGE (2026-10-13). qMEET UI review Site-26, owner: "only on long
   pages" (a page that runs past about three screens). OPT-IN per row: a .td-quicknav row
   marked data-jump-long="1" is given this class by Shared/site-core.js (quickNavLongOnly)
   while the page is no taller than three screens, and loses it when the page grows. A row
   without the attribute is never touched. Hidden, not removed: links to its targets and the
   hash scripts that open a card keep working.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
.td-quicknav.td-quicknav-short { display: none; }

/* ══ BUILDING BLOCKS, STAGE 1 (2026-10-13): THE PICK-ONE CONTROL ═══════════════════
   qFIT UI review row Site-176 (owner, 2026-10-13: "yes, as you recommend"): the same small parts
   were drawn several ways from page to page. One of each is defined here, in stages; a page
   uses the block by its class and keeps no look of its own. Stage 1 is this control and the
   filter pill (the filter pill IS `.pill`, section 9 above: 34px tall as a button, 14px text,
   round ends, the brand fill with dark text when pressed).

   THE PICK-ONE CONTROL (.seg-group): a few choices of which EXACTLY ONE is always on (a view,
   a mode, a unit). The choices are joined in one round-ended box and the chosen one is filled.
       <div class="seg-group" role="group" aria-label="Units">
           <button type="button" aria-pressed="true">US</button>
           <button type="button" aria-pressed="false">Metric</button>
       </div>
   A choice is a <button> with aria-pressed (or aria-selected). Do not use it for filters where
   none, one or several may be on: those are .pill buttons, each on its own.

   Before this block qFIT drew it three ways: square on the Checklist (Categories / Targets /
   Exercises, and Essentials / Full), and as two differently padded round boxes on the Workout
   Timer and the Fitness Calculators. Those three now carry .seg-group and their own look rules
   are gone. A page may still set the control's WIDTH (the Checklist stretches it on a phone).
   ════════════════════════════════════════════════════════════════════════════ */
.seg-group {
    display: inline-flex;
    max-width: 100%;
    border: 1px solid var(--color-border, #e0e0e0);
    border-radius: 999px;
    overflow: hidden;
    background: var(--color-bg-card, #ffffff);
    vertical-align: middle;
}
.seg-group > button {
    appearance: none;
    -webkit-appearance: none;
    margin: 0;
    border: 0;
    border-left: 1px solid var(--color-border, #e0e0e0);
    border-radius: 0;
    background: transparent;
    color: var(--color-text, #1a1f2e);
    font: inherit;
    font-size: var(--font-size-sm, 0.875rem);
    font-weight: var(--font-weight-bold, 600);
    line-height: 1.2;
    min-height: 2.125rem;
    padding: 0.35rem 1rem;
    cursor: pointer;
    white-space: nowrap;
    transition: background-color var(--transition-fast, 0.15s) ease, color var(--transition-fast, 0.15s) ease;
}
.seg-group > button:first-child { border-left: 0; }
/* --color-primary-light, not --color-accent-light: only the first has a dark-theme value. */
.seg-group > button:hover { background: var(--color-primary-light); }
.seg-group > button[aria-pressed="true"],
.seg-group > button[aria-selected="true"] {
    background: var(--color-accent, #00B0F0);
    color: #111;                     /* 7.6:1 on the brand blue; white was 2.5:1 */
}
.seg-group > button:focus-visible {
    outline: 2px solid var(--color-border-focus, var(--color-accent, #00B0F0));
    outline-offset: -2px;
}
@media (forced-colors: active) {
    .seg-group > button[aria-pressed="true"],
    .seg-group > button[aria-selected="true"] { background: Highlight; color: HighlightText; forced-color-adjust: none; }
}

/* ══ BUILDING BLOCKS, STAGE 2 (2026-10-13): THE NOTICE AND THE "NOTHING MATCHES" LINE ══════
   qFIT UI review row Site-176, stage 2 (owner, 2026-10-13: "continue with Site-176"). The earlier
   rows it settles: Site-72 (four looks for a notice) and Site-77 (four looks for "nothing to show").

   THREE DIFFERENT THINGS, EACH WITH ONE LOOK:

   1. A MESSAGE AFTER AN ACTION is .alert-panel (section 10 above): the solid lime / red / orange /
      blue block. That is the house alert style and it is NOT changed here. It answers something the
      visitor just did (saved, failed, was sent to the login page).

   2. A STANDING NOTICE is .notice: information that sits on the page for as long as it is true (a
      filter is on, you are reading a saved copy, reminders are muted, what an address is used for).
      One quiet box: a pale background, a thin outline and a 4px edge at the left, in blue; add
      .caution for amber, .danger for red, .good for green. Its text is the page's normal text color.
          <p class="notice">The Equipment filter is on: 12 exercises are left out.</p>
          <div class="notice caution"><strong class="notice-title">Saved copy</strong> ...</div>
      The small side-note .inline-tip (section 5) is the same family at a smaller size and is not
      replaced by this.

   3. "NOTHING MATCHES" is .no-match: the line a search box or a filter shows when it leaves nothing.
      A small round magnifier over a centered, muted line, drawn from the one class, so an element
      whose text a page script writes needs no inner markup. A page or list that has nothing in it
      YET (no messages, no history) is the larger .empty-state block (round icon, title, one sentence,
      one button), which already existed and is unchanged.
          <p class="no-match" id="rtEmpty" hidden>No routines match.</p>

   🛑 Do not give a page a notice or a "no results" look of its own; use these, or .alert-panel for
   the answer to an action. Do not use .alert-panel for something that just sits on the page.
   ════════════════════════════════════════════════════════════════════════════ */
.notice {
    display: block;
    margin: 0.5rem 0 0.75rem;
    padding: 0.55rem 0.8rem;
    border: 1px solid var(--color-info-border, #81d4fa);
    border-left-width: 4px;
    border-radius: var(--border-radius, 10px);
    background: var(--color-info-bg, #e1f5fe);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    font-style: normal;
    line-height: 1.45;
    text-align: left;
    overflow-wrap: break-word;
}
.notice[hidden] { display: none; }
.notice > :first-child { margin-top: 0; }
.notice > :last-child { margin-bottom: 0; }
.notice.caution { border-color: var(--color-warning-border, #ffcc80); background: var(--color-warning-bg, #fff3e0); }
.notice.danger  { border-color: var(--color-danger-border, #ef9a9a);  background: var(--color-danger-bg, #ffebee); }
.notice.good    { border-color: var(--color-success-border, #a5d6a7); background: var(--color-success-bg, #e8f5e9); }
.notice-title { display: block; margin: 0 0 0.15rem; font-weight: var(--font-weight-bold, 600); }
.notice a { text-decoration: underline; text-underline-offset: 2px; }

.no-match {
    display: block;
    margin: 0;
    padding: 1rem 0.5rem;
    color: var(--color-text-muted, #6c757d);
    font-size: var(--font-size-base, 1rem);
    font-style: normal;
    font-weight: var(--font-weight-normal, 400);
    line-height: 1.45;
    text-align: center;
    opacity: 1;
    background: none;
    border: 0;
}
.no-match[hidden] { display: none; }
/* \1F50D is the magnifier, escaped so the byte encoding of this file can never turn it into junk. */
.no-match::before {
    content: "\1F50D";
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    margin: 0 auto 0.4rem;
    border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
    border-radius: 50%;
    background: var(--color-primary-light);
    font-size: 1rem;
    font-style: normal;
    line-height: 1;
}
.no-match .button { margin-top: 0.6rem; }

/* ══ BUILDING BLOCKS, STAGE 2, ADDENDUM (2026-10-13): THE SMALL EMPTY STATE ════════════════
   A "nothing matches" answer that is written with the full round-icon markup (icon, title, one sentence:
   Tips, Glossary, What's New) takes class "inline" beside empty-state, which gives it the size of .no-match:
   a 2.25rem icon and 1rem of padding. qFIT had this rule in its own sheet since August; it is here so the
   other sites' copies of those pages can use it. */
.empty-state.inline { padding: 1rem 0.5rem; }
.empty-state.inline .empty-state-icon {
    width: 2.25rem;
    height: 2.25rem;
    font-size: 1rem;
    margin-bottom: 0.4rem;
}
.empty-state.inline .empty-state-title { font-size: var(--font-size-base, 1rem); }

/* ══ BUILDING BLOCKS, STAGE 4 (2026-10-13): A SHORT DROPDOWN AS A PICK-ONE CONTROL OR A CHECK BOX ══
   qFIT UI review rows Site-176 / Site-141 (owner, 2026-10-13: "yes, as you recommend", then
   "continue with Site-176"). A dropdown with two or three choices is drawn as the pick-one control
   above (.seg-group), or as ONE check box when it is a yes-or-no question. A page opts a dropdown in
   with an attribute and Shared/site-core.js (installSegSelects) draws it:
       <select data-seg="1">      the pick-one control, one button per option
       <select data-check="Y">    one check box, checked while the option with value "Y" is selected
   The dropdown stays in the page, hidden, and stays the one thing that is saved and read.

   Until the script has drawn the control the dropdown keeps its place but is not painted, so no
   dropdown shows first. If the script never runs, the dropdown appears after four seconds. A
   pick-one control that does not fit its place gives way to the dropdown (class seg-fallback). */
select[data-seg]:not(.seg-built):not(.seg-fallback),
select[data-check]:not(.seg-built):not(.seg-fallback) {
    visibility: hidden;
    animation: seg-select-late 0s linear 4s forwards;
}
@keyframes seg-select-late { to { visibility: visible; } }
select.seg-built { display: none !important; }

/* In a form the control stands where a 40px dropdown stood: 34px tall with 3px above and below,
   so a row of fields keeps one height. */
.seg-group.seg-select { display: flex; width: fit-content; margin: 3px 0; }   /* on its own line under the field's label, like the dropdown it stands for (a label is inline-block on some sites) */
.seg-group > button:disabled { opacity: 0.55; cursor: not-allowed; }

/* The check box and its label on one line, as tall as a dropdown so it lines up with its neighbors. */
.seg-check {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    min-height: 2.5rem;
    max-width: 100%;
}
.seg-check > input[type="checkbox"] { flex: none; margin: 0; }
.seg-check > .seg-check-label { margin: 0; cursor: pointer; }
.seg-check > input:disabled + .seg-check-label { opacity: 0.55; cursor: not-allowed; }
.seg-label-hidden { display: none !important; }

/* ══ BUILDING BLOCKS, ADDENDUM (2026-10-13): ONE LONG BUTTON ON A PHONE ════════════════════
   A button's label is 16px on every site since Site-176 (it was 15px). One label was a few pixels
   too long for that on a phone: "Show All Need to Know Pop-ups Again" (Tips, Tutorials, Preferences)
   went onto two lines at 390px. It takes the 14px step there, as a small button does. */
@media (max-width: 480px) {
    .button[id$="btnResetNtk"] { font-size: var(--font-size-sm, 0.875rem); }
}

/* ══ UI REVIEW ROWS CARRIED FROM qFIT TO THE OTHER FOUR SITES (2026-10-13, evening) ══════════
   Owner, 2026-10-13, about the 29 "Ready" rows built on qFIT that evening: "make the same changes
   to the other 4 sites - anything that makes sense". qFIT keeps its own copies of these rules in
   the last block of its Content/styles.css, written body.qfit-page ..., and those win there: a
   change to one of these rules is made in BOTH places, or the sites drift. */

/* ONE RULE FOR LINKS (qFIT row Site-52). A link that is text - in a sentence, or standing alone as
   words - is underlined. A link drawn as something else is not: a button, a chip, a card, a row of
   a list, a menu or footer entry, a fold line. The second rule is the list of .link elements that
   are drawn as something else: add a class to it when a new kind of row or chip is built from
   .link. Classless links are left as each site has them. */
body main a.link,
body main button.link,
body main .linklike-btn {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 2px;
}
body main a.link.button,
body main a.link.pill,
body main a.link.td-quicknav-chip,
body main a.link.fold-line,
body main button.link.fold-line,
body main a.link.hub-row,
body main a.link.sm-name,
/* the NAME that titles a row of a list (PacklistPRO, qMEET): it is the row, not a link in text */
body main a.link.park-nearby-link,
body main a.link.tripdashboard-note-title,
body main a.link.tf-item-name,
body main a.link.itin-file-name,
body main a.link.exp-receipt-name,
body main a.link.mm2-name,
body main a.link.fts-name,
body main a.link.dupcheck-item-name { text-decoration: none; }

/* A TITLE THAT FOLDS ITS CARD ANSWERS THE MOUSE (qFIT row Site-56): the link color and a solid fold
   mark, on a device with a pointer. It only showed a hand cursor. */
@media (hover: hover) {
    .home-collapsible > .heading:hover,
    .home-head-toggle:hover,
    summary.card-title:hover,
    .form-more-summary:hover,
    .fold-line:hover { color: var(--color-link, #006C96); }
    .home-collapsible > .heading:hover::after,
    .home-head-toggle:hover::after,
    summary.card-title:hover::after,
    .form-more-summary:hover::after,
    .fold-line:hover::after { opacity: 1; }
}

/* ONE LOOK FOR A KEYBOARD KEY (qFIT row Troubleshooting-2): the ? in the footer is a key box, like
   the keys named in the help text. It was a see-through monospace box. */
.site-footer kbd.footer-kbd {
    min-width: 0;
    padding: 0.1rem 0.4rem;
    border: 1px solid var(--color-border, #ccc);
    border-bottom-width: 2px;
    border-radius: var(--border-radius-sm, 4px);
    background-color: var(--color-bg, #dbe4ed);
    color: var(--color-text, #1a1f2e);
    font-size: var(--font-size-sm, 0.875rem);
    line-height: 1;
}

/* THE SITE MAP'S "Find a Page" LABEL SITS ABOVE ITS BOX (qFIT row SiteMap-2), like a field's label. */
.sm-search-row > .input-label { flex: 0 0 100%; margin-bottom: 0; text-align: left; }

/* INSIDE THE FOLDS OF THE TIPS PAGE A GROUP OF TIPS IS A PLAIN SUB-HEADING AND A PLAIN LIST (qFIT
   row Tips-5). Each group was a tinted box with an outline, the look of a notice, so an open section
   read as a stack of notices. Only a tip box that is a direct child of a folding card. */
details.main-card > .tip-card-static {
    margin: 0 0 1rem;
    padding: 0;
    border: 0;
    border-radius: 0;
    background: none;
}
details.main-card > .tip-card-static + .tip-card-static {
    padding-top: 0.9rem;
    border-top: 1px solid var(--color-border, #e0e0e0);
}
details.main-card > .tip-card-static:last-child { margin-bottom: 0; }
details.main-card > .tip-card-static > .tip-card-heading { font-size: 1rem; }

/* ON AN ABOUT PAGE A CARD'S TITLE (18px) IS VISIBLY LARGER THAN THE ITEM TITLES INSIDE IT (qFIT row
   About-8). The item titles were 18px too (qMEET, NobodyHasTHIS). By size only: they stay
   paragraphs, so they stay out of the page's "On this page" list. */
body .about-grid p.input-label,
body .about-grid-3 p.input-label { font-size: 1rem; }

/* HOME'S TO-DO ROWS ON A LAPTOP: THE BUTTON SITS RIGHT AFTER ITS TEXT (qMEET row Site-52, 2026-10-14, carried to
   PacklistPRO and qFIT). Across a full-width card the button stood about 1,000px from the words it belongs to. The
   text column is 34rem at most and the spare room is left to the right of the button (justify-content: start, NOT a
   fourth 1fr column: that adds a gap and, in qFIT's half-width card, pushed every row onto an extra line), so the
   buttons still line up with each other and a narrow card is unchanged. A phone keeps its own layout (575px and below). */
@media (min-width: 992px) {
    .home-todo-row { grid-template-columns: 1.5rem minmax(0, 34rem) auto; justify-content: start; }
}

/* MY PLACES' THREE MAP BUTTONS CARRY A WORD (qMEET row Site-37, 2026-10-14; PacklistPRO's twin page too). The pin,
   road and record buttons are drawn by the shared map scripts (map-overlays.js, map-roads.js, map-record.js) as icons
   only; the word is CSS, so those scripts and every other map that uses them are unchanged. Each keeps its title. */
#myPlacesMap .qm-mp-addctl a, #myPlacesMap .plp-mp-addctl a,
#myPlacesMap .mr-ctl a,
#myPlacesMap .rec-ctl a { width: auto; min-width: 26px; padding: 0 8px; white-space: nowrap; text-align: left; }
#myPlacesMap .qm-mp-addctl a::after, #myPlacesMap .plp-mp-addctl a::after,
#myPlacesMap .mr-ctl a::after,
#myPlacesMap .rec-ctl a::after { font-size: 0.75rem; font-weight: 600; margin-left: 0.3rem; }
#myPlacesMap .qm-mp-addctl a::after, #myPlacesMap .plp-mp-addctl a::after { content: "Add Pin"; }
#myPlacesMap .mr-ctl a::after { content: "Mark Road"; }
#myPlacesMap .rec-ctl a::after { content: "Record Road"; }

/* A MESSAGE ABOUT ONE FIELD SITS UNDER THAT FIELD (qFIT UI review Join2-2 / Join3-6, owner 2026-10-14; all five
   sites). Drawn by Shared/site-core.js showFieldMessage: red text with the "!" of .field-validation-error for a
   problem, amber text with an amber "!" for a warning that does not stop you (Join step 3's city check). A line of
   its own (flex, not inline-flex), so it is never beside the box. */
.field-msg { display: flex; margin-top: 0.3rem; line-height: 1.35; }
.field-msg.field-warning {
    color: var(--color-warning-text, #7a4b00);
    font-size: var(--font-size-sm);
    align-items: flex-start;
}
.field-msg.field-validation-error { align-items: flex-start; }
.field-msg.field-validation-error::before { margin-top: 0.15em; }
.field-msg.field-warning::before {
    content: "!";
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.05em;
    height: 1.05em;
    flex-shrink: 0;
    margin: 0.15em 0.35rem 0 0;
    background: var(--color-warning, #e65100);
    color: #ffffff;
    border-radius: 50%;
    font-size: 0.7em;
    font-weight: 700;
    line-height: 1;
}
/* A box that was refused wears the danger color on its edge, so the eye finds it as well as the words. */
[aria-invalid="true"].textbox, select[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--color-danger); }

/* ============================================================
   [sc-row-saved] A LIST ROW FLASHES GREEN WHEN ITS CHECK BOX OR DROPDOWN SAVED ITSELF
   (owner, 2026-10-14: "in PLP Packlist and Tasklist, we made the row turn green
   momentarily to confirm the checkbox saved. let's make sure every list containing
   checkboxes does the same when it autosaves itself ... all 5 sites. let's do the same
   when there's a dropdown as well"). Set by SiteCore.flashSaved (Shared/site-core.js)
   from a save's success callback. Same green and timing as the Packlist's own flash
   (.plp-item.row-saved-quiet, PacklistPRO Content/styles.css), which keeps its own rule.
   🔑 An ANIMATION, not a transition (it replays on every save), and of background-color
   and box-shadow only: opacity would fade the text, filter would make a containing
   block that breaks an open dropdown menu in the row. A table row paints its cells, so
   the cells carry it; the left bar goes on the first cell (a box-shadow on a tr is not
   drawn by every browser).
   ============================================================ */
.sc-row-saved:not(tr),
tr.sc-row-saved > :first-child {
    animation: scRowSavedFlashEdge 650ms ease-out;
}
tr.sc-row-saved > td:not(:first-child),
tr.sc-row-saved > th:not(:first-child) {
    animation: scRowSavedFlash 650ms ease-out;
}
/* 🔑 No 100% keyframe on purpose: the flash then fades back to the row's OWN background
   (a striped row, a colored band) instead of to transparent and a jump at the end. */
@keyframes scRowSavedFlash {
    0%   { background-color: rgba(0, 255, 0, 0.55); }
    60%  { background-color: rgba(0, 255, 0, 0.30); }
}
@keyframes scRowSavedFlashEdge {
    0%   { background-color: rgba(0, 255, 0, 0.55); box-shadow: inset 4px 0 0 #00ff00; }
    60%  { background-color: rgba(0, 255, 0, 0.30); box-shadow: inset 4px 0 0 #00ff00; }
}
/* Reduced motion: no movement, but still a confirmation: the tint holds for the moment.
   The selectors are the animated ones above, word for word: equal specificity, later in
   the sheet, so this wins (a plain "tr > td" lost to ":first-child" and the cells kept
   moving). */
@media (prefers-reduced-motion: reduce) {
    .sc-row-saved:not(tr),
    tr.sc-row-saved > :first-child,
    tr.sc-row-saved > td:not(:first-child),
    tr.sc-row-saved > th:not(:first-child) {
        animation: none;
        background-color: rgba(0, 255, 0, 0.30);
    }
}

/* ── 👥 AND 🗺 AS ICONS IN THE TEXT COLOR (qMEET UI review Site-45, 2026-10-14; all five sites) ──
   An emoji takes no color from the page, so on a dark theme the two-people emoji (groups, members,
   contacts) all but vanished and the map emoji was nearly as faint. Shared/site-core.js wraps each one in
   <span class="emo-icon emo-people|emo-map" aria-hidden="true">; the span keeps the emoji character (so the
   text reads the same to scripts) but pushes it out of its box and paints the icon in the text color.
   Icons: Material Icons "group" and "map" (Apache 2.0). */
.emo-icon {
    display: inline-block;
    width: 1.2em;
    height: 1em;
    vertical-align: -0.14em;
    overflow: hidden;
    white-space: nowrap;
    text-indent: 200%;
    background-color: currentColor;
    -webkit-mask: var(--emo-mask) center / contain no-repeat;
    mask: var(--emo-mask) center / contain no-repeat;
}
.emo-people { --emo-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%3E%3Cpath%20d%3D%27M16%2011c1.66%200%202.99-1.34%202.99-3S17.66%205%2016%205c-1.66%200-3%201.34-3%203s1.34%203%203%203zm-8%200c1.66%200%202.99-1.34%202.99-3S9.66%205%208%205C6.34%205%205%206.34%205%208s1.34%203%203%203zm0%202c-2.33%200-7%201.17-7%203.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8%200c-.29%200-.62.02-.97.05%201.16.84%201.97%201.97%201.97%203.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z%27%2F%3E%3C%2Fsvg%3E"); }
.emo-map { --emo-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%3E%3Cpath%20d%3D%27M20.5%203l-.16.03L15%205.1%209%203%203.36%204.9c-.21.07-.36.25-.36.48V20.5c0%20.28.22.5.5.5l.16-.03L9%2018.9l6%202.1%205.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM15%2019l-6-2.11V5l6%202.11V19z%27%2F%3E%3C%2Fsvg%3E"); }
/* A Windows contrast theme replaces background colors, which would paint the icon in the page color. */
@media (forced-colors: active) { .emo-icon { forced-color-adjust: none; background-color: CanvasText; } }

/* ══ THE ALERTS BAR, shared by qMEET, qFIT and PacklistPRO (moved here from qMEET's
   Content/styles.css on 2026-10-16, owner: "shouldn't all that code be shared?") ══════════
   The HTML is SharedAlertBarView.vb, the script Sharedalert-bar.js. Every rule below starts
   with an .alertbar / .ab- class, so it reaches nothing else on any site. qMEET keeps the
   chat chips' own rules (.banner-chatbar, .chatbar-chip) and the Preferences card (.abp-*) in
   its own sheet; qFIT and PacklistPRO have no chips. */
/* ══ THE ALERT BAR (owner, 2026-10-15) ═══════════════════════════════════════════
   One line of pills in place of the four stacked bars (chat gray, events blue, invites
   purple, to-dos orange) that sat here until 2026-10-15; the long note is above its
   markup in Site.Master. Tapping the row opens .alertbar-panel with every section.
   COLORS. Each section has its own (--ab-own): chat #5f6368, events #1f6feb, invites
   #0f766e (TEAL, not the old bar's purple #8957e5, which sat too close to magenta),
   to-dos #c2410c. ⚠ #fff on each clears 4.5:1 (6.0, 4.6, 5.5, 5.2); re-check before
   lightening any. MAGENTA #ff00ff = needs the member now (the chat chips' own magenta);
   RED #ff0000 = chat whose urgent messages are all ❗ Priority. A magenta pill keeps its
   own color on its round icon (.ab-tile), so several magenta pills can be told apart.
   ONE SECTION ONLY (.is-single, set by the script): a normal full-width bar in that
   section's color, or magenta; Chat alone is the gray chat bar with its chips in the row.
   🔑 Fixed colors, as the old bars had: they read the same on the light and dark themes.
   The row and the panel themselves follow the theme (--color-bg-card). */
.ab-chat, .ab-sec-chat, .alertbar.single-chat { --ab-own: #5f6368; }
.ab-events, .ab-sec-events, .alertbar.single-events { --ab-own: #1f6feb; }
.ab-invites, .ab-sec-invites, .alertbar.single-invites { --ab-own: #0f766e; }
.ab-todos, .ab-sec-todos, .alertbar.single-todos { --ab-own: #c2410c; }
/* 2026-10-15: three sections from the sister sites. Trips green, Shopping gold, Fitness violet;
   ⚠ #fff on each clears 4.5:1 (5.0, 4.9, 7.1). Fitness is a deep violet, well apart from magenta. */
.ab-trips, .ab-sec-trips, .alertbar.single-trips { --ab-own: #15803d; }
.ab-shopping, .ab-sec-shopping, .alertbar.single-shopping { --ab-own: #a16207; }
.ab-fitness, .ab-sec-fitness, .alertbar.single-fitness { --ab-own: #6d28d9; }
.alertbar {
    background: var(--color-bg-card);
    border-bottom: 1px solid var(--color-border);
    color: var(--color-text);
    font-size: var(--font-size-sm);
}
.alertbar-row { display: flex; align-items: center; min-height: 2.75rem; }
/* The whole row (bar the × and the admin pill) is ONE button: a 44px target, however few
   pills. overflow:hidden + min-width:0 so four long pills can never push the × off a phone. */
.alertbar-open {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 0.4rem;
    min-height: 2.75rem;
    padding: 0.35rem 0.25rem 0.35rem 0.5rem;
    border: 0;
    background: transparent;
    color: inherit;
    font: inherit;
    text-align: left;
    cursor: pointer;
    overflow: hidden;
}
.alertbar-caret { margin-left: auto; display: flex; flex: 0 0 auto; color: var(--color-text-muted); transition: transform 0.15s ease; }
.alertbar-caret svg { width: 1rem; height: 1rem; display: block; }
.alertbar-open[aria-expanded="true"] .alertbar-caret { transform: rotate(180deg); }
@media (prefers-reduced-motion: reduce) { .alertbar-caret { transition: none; } }
.alertbar-x {
    flex: 0 0 auto;
    width: 2.75rem;
    height: 2.75rem;
    border: 0;
    background: transparent;
    color: var(--color-text-muted);
    font: inherit;
    font-size: var(--font-size-xl);
    line-height: 1;
    cursor: pointer;
}
.alertbar-x:hover { color: var(--color-text); }

/* A pill. A phone shows the icon and the number; 992px and up show the words instead. */
.ab-pill {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    height: 1.875rem;
    padding: 0 0.7rem 0 0.2rem;
    border-radius: 999px;
    background: var(--ab-own);
    color: #fff;
    font-weight: 700;
    line-height: 1;
    white-space: nowrap;
    flex: 0 1 auto;
    min-width: 0;
}
.ab-pill[hidden] { display: none; }
.ab-pill.is-hot { background: #ff00ff; }
.ab-pill.is-pri { background: #ff0000; }
/* Chat with nothing unread, only contacts active: a quiet outline and a green dot. */
.ab-pill.is-quiet { background: transparent; color: var(--color-text); box-shadow: inset 0 0 0 1.5px var(--ab-own); }
.ab-tile {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    border-radius: 50%;
    background: var(--ab-own);
    color: #fff;
    box-shadow: inset 0 0 0 1.5px rgba(255, 255, 255, 0.65);
    flex: 0 0 auto;
}
.ab-tile svg { width: 1rem; height: 1rem; display: block; }
.ab-dot { display: none; width: 0.5rem; height: 0.5rem; border-radius: 50%; background: #18a957; flex: 0 0 auto; }
.ab-pill.is-quiet .ab-dot { display: inline-block; }
.ab-words, .ab-one { display: none; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
@media (min-width: 992px) {
    .ab-pill .ab-words { display: inline; }
    .ab-pill .ab-n { display: none; }
}
/* Too many pills for one line (2026-10-15, up to seven): the script (fitRow) measures with every
   pill at full width (.ab-measure) and steps down until they fit. fit-1: numbers in place of the
   words; fit-2: tighter pills; fit-3: the round icons alone. One section alone is never stepped. */
.alertbar.ab-measure .ab-pill { flex-shrink: 0; }
/* 🔴 No transitions while measuring. The shared sheet's reduced-motion rule gives EVERY element a
   0.01ms transition of all properties, so a style read straight after a class change still
   returned the old value and the row never stepped down (measured 2026-10-15). */
.alertbar.ab-measure,
.alertbar.ab-measure * { transition: none !important; }
.alertbar.fit-1 .ab-pill .ab-words { display: none; }
.alertbar.fit-1 .ab-pill .ab-n { display: inline; }
.alertbar.fit-2 .alertbar-open { gap: 0.25rem; }
.alertbar.fit-2 .ab-pill { gap: 0.2rem; padding: 0 0.45rem 0 0.15rem; }
.alertbar.fit-2 .ab-tile { width: 1.3rem; height: 1.3rem; }
.alertbar.fit-2 .ab-tile svg { width: 0.85rem; height: 0.85rem; }
.alertbar.fit-3 .ab-pill { padding: 0 0.15rem; }
.alertbar.fit-3 .ab-pill .ab-n,
.alertbar.fit-3 .ab-pill .ab-dot { display: none; }

/* ONE SECTION ONLY: a normal full-width bar. The row takes the section's color (magenta
   when it needs the member now), the pill dissolves into it and says its words at every
   width; one event / one to-do says its own name (.ab-one) and the bar is a link to it. */
.alertbar.is-single { border-bottom-color: transparent; }
.alertbar.is-single .alertbar-row { background: var(--ab-own); color: #fff; }
.alertbar.single-hot .alertbar-row { background: #ff00ff; }
/* Chat alone where it has no chips (qFIT, PacklistPRO), all its urgent messages Priority: red. */
.alertbar.single-pri .alertbar-row { background: #ff0000; }
.alertbar.is-single .alertbar-caret,
.alertbar.is-single .alertbar-x { color: #fff; }
.alertbar.single-link .alertbar-caret { display: none; }
.alertbar.is-single .ab-pill {
    flex: 1 1 auto;
    height: auto;
    min-height: 1.875rem;
    padding: 0.2rem 0 0.2rem 0;
    background: transparent;
    color: #fff;
    box-shadow: none;
    white-space: normal;
    line-height: 1.3;
    gap: 0.5rem;
}
.alertbar.is-single .ab-pill .ab-n { display: none; }
.alertbar.is-single .ab-pill .ab-words { display: inline; }
.alertbar.is-single .ab-pill.has-one .ab-words { display: none; }
.alertbar.is-single .ab-pill.has-one .ab-one { display: inline; }
.alertbar.is-single .ab-head { display: none; }   /* the row already says it */
/* Chat alone: the old gray chat bar, its chips in the row (the script moves #abChips into
   #abChatSlot). The magenta / red chips say which conversation is urgent. */
.alertbar .ab-chatslot { display: none; }
/* (qMEET only: there is a chips slot. On qFIT and PacklistPRO Chat alone is a normal one-section bar.) */
.alertbar.single-chat:has(.ab-chatslot) .alertbar-open { display: none; }
.alertbar.single-chat .ab-chatslot {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex: 1 1 auto;
    min-width: 0;
    padding: 0.3rem 0.25rem 0.3rem 0.5rem;
    background: transparent;
    color: #fff;
}
.alertbar .ab-chatslot > .ab-chips { flex: 1 1 auto; min-width: 0; padding: 0; }
/* The round chat icon names the section here, so the gray strip's own "Chat" word (qmb Site-2,
   .banner-chatbar:has(.chatbar-chip)::before) is not drawn inside the Alert Bar. */
.alertbar .banner-chatbar:has(.chatbar-chip)::before { content: none; }

/* The admin review count, at the end of the row (it was the end of the gray chat bar).
   Keeps the red and the pulse it had as the floating .admin-review-fab, so it still reads
   as an alert rather than as a control. */
.alertbar a.chatbar-chip-admin,
.alertbar a.chatbar-chip-admin:visited {
    display: inline-flex;
    align-items: center;
    flex: 0 0 auto;
    height: 1.875rem;
    padding: 0 0.7rem;
    margin-left: 0.25rem;
    border-radius: 999px;
    background: var(--color-danger, #c62828);
    color: #fff;
    font-weight: 700;
    white-space: nowrap;
    text-decoration: none;
    animation: navBadgePulse 2s var(--ease-in-out, ease-in-out) infinite;
}
.alertbar a.chatbar-chip-admin:hover { filter: brightness(1.1); color: #fff; text-decoration: none; }
@media (prefers-reduced-motion: reduce) { .alertbar a.chatbar-chip-admin { animation: none; } }

/* The panel: every section in full, in pill order. */
.alertbar-panel {
    display: flex;
    flex-direction: column;
    gap: 0.85rem;
    padding: 0.6rem 0.6rem 0.8rem;
    border-top: 1px solid var(--color-border);
}
.alertbar-panel[hidden] { display: none; }
.alertbar.is-single .alertbar-panel { border-top: 0; }
.ab-sec { display: flex; flex-direction: column; gap: 0.3rem; }
.ab-head {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    min-height: 2rem;
    padding: 0.15rem 0.75rem 0.15rem 0.2rem;
    border-radius: 999px;
    background: var(--ab-own);
    color: #fff;
    font-size: var(--font-size-sm);   /* the Chat section's .banner-chatbar is smaller on a phone */
    font-weight: 700;
    line-height: 1.25;
}
.ab-sec.is-hot .ab-head { background: #ff00ff; }
.ab-sec.is-pri .ab-head { background: #ff0000; }
.ab-head-sum { margin-left: auto; font-weight: 600; text-align: right; }
/* The section's name stays whole on a phone ("To-Dos" broke at its hyphen at 390px); the words
   at the right wrap instead. */
.ab-head-name { white-space: nowrap; flex: 0 0 auto; }
.ab-list { list-style: none; margin: 0; padding: 0; }
/* A row: WHEN in a fixed left column, then the name. Drawn as a row of a list, so not
   underlined (the shared rule's exception for rows). */
.ab-item,
.ab-item:link,
.ab-item:visited {
    display: grid;
    grid-template-columns: 8rem minmax(0, 1fr);
    column-gap: 0.6rem;
    padding: 0.35rem 0.45rem;
    border-radius: 6px;
    color: var(--color-text);
    text-decoration: none;
    line-height: 1.35;
}
.ab-item:hover,
.ab-item:focus-visible { background: var(--color-surface-muted); color: var(--color-text); text-decoration: none; }
.ab-when { font-weight: 700; }
.ab-more { padding: 0.35rem 0.45rem; color: var(--color-text-muted); }
/* "Choose What Shows" at the foot of the panel (2026-10-15): a text link to Preferences' Alert
   Bar card, at the right, quiet. */
.alertbar a.ab-settings { align-self: flex-end; font-size: var(--font-size-sm); padding: 0.1rem 0.45rem; }
/* Chat in the panel: the section is still .banner-chatbar (the chip handlers in Site.Master
   select on it), so take back that class's gray box. The chips sit on the card here, so the
   ordinary ones get a solid gray; magenta / red chips keep their own rules. */
.alertbar .ab-sec-chat { background: transparent; color: var(--color-text); padding: 0; }
.alertbar .ab-chips { padding: 0 0.15rem; }
.alertbar .ab-sec-chat .chatbar-chip:not(.chat-urgent):not(.chat-priority) { background: #5f6368; }
.alertbar .ab-sec-chat .chatbar-chip:not(.chat-urgent):not(.chat-priority):hover { background: #4b4f54; }
/* The open 🎯 action items (2026-10-15): a chip to Chat's Action Items view, first among the
   contact chips, drawn like them (white on the gray row; solid gray in the panel). */
.alertbar a.ab-actchip,
.alertbar a.ab-actchip:visited {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 2px 9px;
    margin: 2px 5px 2px 0;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.14);
    color: #fff;
    font-weight: 600;
    line-height: 1.4;
    text-decoration: none;
    vertical-align: middle;
    white-space: nowrap;
}
.alertbar a.ab-actchip[hidden] { display: none; }
.alertbar .ab-sec-chat a.ab-actchip { background: #5f6368; }
.alertbar a.ab-actchip:hover { filter: brightness(1.12); color: #fff; text-decoration: none; }

/* ═══ SEARCH BOXES STAND OUT: a blue border and a light blue tint (owner, 2026-10-19: "it's hard
   to find the search box at a glance on qfit checklist and todo ... maybe we should do the same on
   all search boxes on all of my sites for consistency?", then "do the border plus tint"). ═══
   Every box whose job is to search or filter a page or a list, on all five sites, found by a
   census of every page logged out and as the test account (D:\Claude\build\shid\t_srch.js).
   Left OUT on purpose: the small boxes that filter a dropdown (.select-filter, which site.js adds
   to a dropdown of more than 25 choices, and the Routine dropdown's own boxes #txtRoutineSearch /
   #txtRoutineFilter, class .qf-routine-search), and data fields that only name keywords (#ep_searchKeywords, #ii_Keywords).
   🔑 A NEW search box joins by carrying class "search-box" (or type="search"), not by another id
   here. The border is the darker accent (#0090C8, 3.4 to 1 on white) so it reads on its own; a
   focused box keeps the shared focus ring, a little stronger. */
:root {
    --search-box-border: var(--color-accent-dark, #0090C8);
    --search-box-bg: color-mix(in srgb, var(--color-accent, #00B0F0) 8%, var(--color-bg-input, #ffffff));
}
[data-theme="dark"] {
    --search-box-border: var(--color-accent, #00B0F0);
    --search-box-bg: color-mix(in srgb, var(--color-accent, #00B0F0) 14%, var(--color-bg-input, #1e1e1e));
}
body input.search-box,
body input[type="search"]:not(.select-filter):not(.qf-routine-search),
body input.cnm-filter,
body input.tile-filter,
body :is(#navFind, #txtSearch, #todoSearch, #cpSearch, #injSearch, #rtSearch, #musSearch, #orgSearch,
         #ft2Filter, #glossSearch, #raSearch, #skSearch, #smFilter, #tbSearch, #MainContent_tbSearch,
         #tbTipSearch, #tsnSearch, #cuFilter, #thc2Search, #fxSearch, #cbFind, #changesFilter,
         #tbChangesFilter, #ctFilter, #ctSearch, #txtProblemSearch, #uc2GymSearch, #parkSearch,
         #trailSearch, #tutFilter, #tkSearch, #ms2Filter, #piFilter, #mpFind, #mpSearch, #gpsSearchInput,
         #gpsListFilter, #err404Search, #etTagQuery, #parkVenueQuery, #herePlaceSearch, #txtFindBy,
         #txtInterestSearch, #gesFilter, #gesCity, #gesCountry, #wdSearchInput, #wx-search-input,
         #wxSearchInput, #csSearch, #tbExpenseSearch, #tbItinSearch, #tbNoteSearch, #tbPlaceSearch,
         #iiSearch, #amzWords) {
    border: 2px solid var(--search-box-border);
    background-color: var(--search-box-bg);
}
body input.search-box:focus,
body input[type="search"]:not(.select-filter):not(.qf-routine-search):focus,
body input.cnm-filter:focus,
body input.tile-filter:focus,
body :is(#navFind, #txtSearch, #todoSearch, #cpSearch, #injSearch, #rtSearch, #musSearch, #orgSearch,
         #ft2Filter, #glossSearch, #raSearch, #skSearch, #smFilter, #tbSearch, #MainContent_tbSearch,
         #tbTipSearch, #tsnSearch, #cuFilter, #thc2Search, #fxSearch, #cbFind, #changesFilter,
         #tbChangesFilter, #ctFilter, #ctSearch, #txtProblemSearch, #uc2GymSearch, #parkSearch,
         #trailSearch, #tutFilter, #tkSearch, #ms2Filter, #piFilter, #mpFind, #mpSearch, #gpsSearchInput,
         #gpsListFilter, #err404Search, #etTagQuery, #parkVenueQuery, #herePlaceSearch, #txtFindBy,
         #txtInterestSearch, #gesFilter, #gesCity, #gesCountry, #wdSearchInput, #wx-search-input,
         #wxSearchInput, #csSearch, #tbExpenseSearch, #tbItinSearch, #tbNoteSearch, #tbPlaceSearch,
         #iiSearch, #amzWords):focus {
    outline: none;
    border-color: var(--search-box-border);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent, #00B0F0) 35%, transparent);
}

/* ════════════════════════════════════════════════════════════════════
   HAMBURGER NAV AT EVERY WIDTH (PacklistPRO)
   ────────────────────────────────────────────────────────────────────
   Added 2026-08-26, porting qMEET\Content\nav-hamburger.css (2026-07-18)
   to this site so all five navs behave the same way.

   Shared/styles_shared.css builds a mobile-first nav: the ☰ toggle plus a
   full-screen overlay <ul class="nav-menu">, which a set of
   @media (min-width: 992px) blocks then converts into a horizontal desktop
   bar with hover-open dropdowns. This file re-states the mobile rules
   INSIDE the same 992px breakpoint, canceling each desktop block.

   Why a separate file rather than an edit to styles_shared.css: that
   stylesheet is shared by all five sites (and is five physical copies in
   prod), so a change there is a change everywhere. And why not
   Content/styles.css: the bundle order is bootstrap → styles.css →
   styles_shared.css, so anything in styles.css LOSES the cascade to the
   shared desktop rules. This file is registered LAST in Bundle.config so
   equal-specificity rules win on order and no !important is needed.

   The JS half of the switch is Scripts/site.js initNav() → isMobileNav(),
   which is pinned to true so the accordion/close-on-tap behavior matches.
   🔴 BOTH HALVES MUST AGREE. If the JS still took its desktop branch, a
   click on a dropdown PARENT would navigate straight to that section's
   first sub-item instead of expanding it — leaving every sibling entry
   unreachable inside the overlay, with no hover flyout left to reach them
   by. Do not ship one half of this change without the other.
   ════════════════════════════════════════════════════════════════════ */

@media (min-width: 992px) {

    /* Cancels: @media (min-width: 992px) { .nav-toggle { display: none; } } */
    .nav-toggle { display: block; }

    /* Cancels the horizontal-row .nav-menu block — restore the overlay. */
    .nav-menu {
        display: none;
        flex-direction: column;
        position: fixed;
        top: var(--nav-height);
        left: 0;
        right: 0;
        bottom: 0;
        background-color: var(--color-bg-nav);
        overflow-y: auto;
        z-index: calc(var(--nav-z) - 1);
        padding: 0.5rem 0 2rem;
        align-items: stretch;
        gap: 0;
    }
    .nav-menu.open { display: flex; }

    /* Cancels the desktop hover underline on root links (::after is absolutely
       positioned against a now-stacked row, so it would streak across the panel). */
    .nav-menu > .nav-item > .nav-link::after,
    .nav-menu > .nav-item > .nav-link.active::after,
    .nav-menu > .nav-item:hover > .nav-link::after {
        content: none;
        display: none;
    }

    /* Cancels hover-to-open flyouts: dropdowns become in-flow accordion sections
       toggled by site.js adding .open.
       🔑 max-height / overflow-y / overscroll-behavior are reset too, and qMEET's
       copy does NOT reset them — that is a drift, not a precedent. The shared rule
       caps a FLYOUT at the viewport height and gives it its own scrollbar; left in
       place on an in-flow accordion it makes a long section scroll inside itself
       while the overlay around it stays still, which is not what the phone drawer
       does below 992px. */
    .nav-item:hover .nav-dropdown,
    .nav-item:focus-within .nav-dropdown {
        display: none;
        position: static;
        min-width: 0;
        max-height: none;
        overflow-y: visible;
        overscroll-behavior: auto;
        background-color: var(--color-bg-nav-dropdown);
        backdrop-filter: none;
        -webkit-backdrop-filter: none;
        border: none;
        border-radius: 0;
        box-shadow: none;
        padding: 0;
        margin-top: 0;
        animation: none;
    }
    /* The invisible hover bridge has no purpose without flyouts — and it is not
       merely useless here: it is a transparent 10px strip hanging BELOW the
       trigger link, so in a stacked overlay it covers the top 10px of whatever
       row follows and swallows that row's clicks for as long as the parent stays
       hovered.
       ⚠ MATCH THE SELECTOR THE SHARED SHEET ACTUALLY USES. It moved off
       .nav-dropdown::before and onto the TRIGGER LINK when the flyout became a
       scroll container (a ::before at top:-10px is clipped by overflow in the
       block-start direction). qMEET's copy still cancels the OLD selector and so
       cancels nothing. */
    .nav-item:hover > .nav-link-has-dropdown::before,
    .nav-item:focus-within > .nav-link-has-dropdown::before { content: none; }

    /* Re-state the @media (max-width: 991px) accordion block. */
    .nav-dropdown { padding-left: 1rem; background-color: var(--color-bg-nav-dropdown); }
    .nav-dropdown.open,
    .nav-item:hover .nav-dropdown.open,
    .nav-item:focus-within .nav-dropdown.open { display: block; }
    .nav-dropdown .nav-link {
        padding: 0.5rem 1.25rem;
        border-radius: 0;
        color: rgba(255,255,255,0.7);
    }
    /* #111 on the cyan, NOT #fff — white measures 2.48:1 there against 7.61:1 for
       near-black. Both shared blocks this replaces already say so; qMEET's copy
       predates that fix and still writes #fff. Do not "align with qMEET" here. */
    .nav-dropdown .nav-link:hover {
        background-color: var(--color-accent);
        color: #111;
    }
    .nav-dropdown .nav-link.active {
        background-color: var(--color-accent);
        color: #111;
        font-weight: var(--font-weight-bold);
    }

    /* Re-state the mobile section-label padding. */
    .nav-section-label { padding-left: 1.25rem; padding-right: 1.25rem; }

    /* Cancels the desktop .nav-right row (no site renders one today; kept so a
       future <div class="nav-right"> doesn't reintroduce the bar). */
    .nav-right {
        flex-direction: column;
        align-items: stretch;
        gap: 0;
        margin-left: 0;
    }

    /* ══ PacklistPRO-specific cancels ═════════════════════════════════════
       Everything below this line is NOT in qMEET's copy. It is not optional
       polish: each block is a compensation this site grew for a desktop nav bar
       that it no longer renders, and left in place each one now does harm. ── */

    /* (1) THE NAV-OVERFLOW BAND — Content/styles.css, ToDo QL-20,
       "@media (min-width: 992px) and (max-width: 1279.98px)". It squeezed the
       desktop bar (`body .nav-menu { gap: 0; flex-wrap: wrap }` plus half the
       padding on root links) so the last items stopped clipping off the right
       edge between 992 and 1026px. That block's own comment lists "copying
       qMEET's permanent-hamburger Content/nav-hamburger.css" among the options
       it rejected, as "a design change, not a bug fix" — the design change is
       what shipped, so the squeeze is now obsolete.
       🔴 flex-wrap IS THE ONE THAT MUST GO. .nav-menu as an overlay is a COLUMN
       flex container with a definite height (top: var(--nav-height); bottom: 0),
       so `wrap` makes a long menu break into side-by-side COLUMNS that run off
       the right edge instead of scrolling. Cancelled here rather than deleted
       there, so the band survives as one block if the desktop bar comes back.
       ⚠ The `body ` prefix is load-bearing — the rule being cancelled is (0,1,1)
       and a bare .nav-menu (0,1,0) would lose to it. */
    body .nav-menu { flex-wrap: nowrap; }
    body .nav-menu > .nav-item > .nav-link,
    body .nav-menu > div > .nav-link {
        padding-left: 1.25rem;
        padding-right: 1.25rem;
    }

    /* (2) THE PILL RESERVE ON .nav-inner — Content/styles.css PR-03,
       992-1291.98px. It padded the nav's right edge so the floating ❓ and
       light/dark pills could not land on the LAST NAV ITEM. There are no nav
       items in the bar any more, only the brand and the ☰ — and the reserve
       resolves to `--pill-cluster-right + 2.4rem`, which against the anchor set
       in (3) is ~118px of padding that would shove the ☰ toward the middle of
       the bar. The collision is solved at source instead: the cluster now sits
       LEFT of the toggle at every width.
       🔑 Restores the SAFE-AREA value (Content/styles.css:117), not a bare 1rem —
       that earlier rule is what insets nav content from a display cutout, and a
       flat 1rem here would silently undo it.
       🛑 TWO SEPARATE RULES, NEVER ONE COMMA LIST: a selector list containing an
       unsupported :has() is discarded WHOLE, which would take the plain rule down
       with it on any browser that lacks :has(). */
    body .site-nav .nav-inner {
        padding-right: calc(1rem + env(safe-area-inset-right, 0px));
    }
    body:has(.theme-pill) .site-nav .nav-inner {
        padding-right: calc(1rem + env(safe-area-inset-right, 0px));
    }

    /* (3) THE FLOATING PILL CLUSTER'S ANCHOR. Shared/styles_shared.css puts
       #tutorialHelpPill at `right: var(--pill-cluster-right, 1rem)` and #themePill
       one slot to its left, with a `@media (max-width: 991px)` fallback of 3.75rem
       whose comment says why: "below 992px the shared .nav-toggle (☰) appears in
       the top-right corner, so the pill has to clear it". That is now true at
       EVERY width here, so the var has to be DEFINED — left undefined, both pills
       resolve to the 1rem desktop fallback and land on top of the ☰. qMEET hit
       exactly this on 2026-07-18 when it made the same switch.
       ⚠ The shared sheet's own comment names these four sites as "their
       .nav-toggle is phone-only, so the fallback is all they need". That sentence
       stops being true with this file in the bundle — if you edit the shared rule,
       read this block first.

       🔑 WHY A GUTTER FORMULA AND NOT A NUMBER — the ☰ is not viewport-anchored:
       it is the last flex child of `.site-nav .nav-inner`, which is max-width:
       1200px and centerd. Past 1200px the toggle stops moving right while a
       position:fixed pill at `right: <n>rem` keeps sliding out with the window,
       and the two drift apart. max() floors the gutter at 0 below 1200px, where
       nav-inner is full-bleed and there is no gutter. 5rem is the clearance past
       the toggle itself (1rem of nav padding + its 44px touch target + a gap),
       and is the same number qMEET uses.
       ⚠ SCOPED TO >=992px ON PURPOSE. Below it the shared 3.75rem fallback already
       clears the same toggle; re-anchoring there would shift the phone cluster
       20px left for no reason and change a layout nothing was wrong with.
       ⚠ 100vw counts the scrollbar, so this can over-shift by half a scrollbar
       width. That errs LEFT — away from the toggle — which is the safe direction.
       🔑 --pill-cluster-right is read by .banner-simplemode-inner too (shared
       sheet), which reserves the same corner inside the simple-mode banner. It
       tracks this value on its own; that is what the var+fallback form is for. */
    :root {
        --pill-cluster-gutter: max(0px, (100vw - var(--container-max, 1200px)) / 2);
        --pill-cluster-right: calc(var(--pill-cluster-gutter) + 5rem);
    }
}

