/*!
 * NovaIS
 * Copyright (c) 2026 David Bustamante. Todos los derechos reservados.
 * All rights reserved.
 *
 * Construido por David Bustamante para Insured Solutions.
 * Software propietario. Prohibida la reproduccion, distribucion o uso,
 * total o parcial, sin autorizacion escrita del autor.
 *
 * Hoja de estilos del HUB.
 */
/* ---- bloque 0 (era linea 44 de index.html) ---- */

/* ── Standalone / PWA mode ── */
@media (display-mode: standalone) {
  body{padding-top:env(safe-area-inset-top,0)}
  .topbar{padding-top:max(env(safe-area-inset-top,0px),6px)}
}

/* ---- bloque 1 (era linea 51 de index.html) ---- */

/* ── Tabler Icons 2.44.0 (https://tabler.io · MIT) — subsetted to the 164 glyphs
   this app actually uses and embedded inline. Previously pulled from a jsDelivr
   CDN stylesheet: any machine that was offline or behind a firewall that blocks
   cdn.jsdelivr.net lost every icon in the UI, and because the icons are empty
   <i> elements that left rows of blank, unlabelled buttons. Inlining keeps the
   file genuinely single-file. Full font is 753 KB; this subset is 30 KB.
   Regenerate whenever a release adds an icon — tools/ci/verify.mjs fails the
   build when a referenced name has no glyph here, which is how ti-send-2
   was caught. ── */
@font-face{font-family:"tabler-icons";font-style:normal;font-weight:400;font-display:block;
  src:url("data:font/woff2;base64,d09GMgABAAAAAHa0AAsAAAAA4FAAAHZkAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoGYACIXAqDrmyCxFQBNgIkA4JOC4JMAAQgBQYHIBsnqUVG9TggHkQZoyLYOASIMMOsCDYOAAp5VvH/7UCLIQP02GurHAPhsALCAQKAEwDUqoLSJ7Vjx0ejHh9rwPDRqMfHusLStRs4auMnYDi6j/Das+V97Sv23HVWf/NvIEMskXxAsGUR4DbxIxLeU3N4fm69///2/5oVC8ZgbIxtMNiIUQpsDb0mWkpREKS0ibLBhjMQwVM8A9FGz7i2zzq9FvvuFPM8vTuHSLeaTUgIPSGh9JCEUJUkECLWEBJaFFIpNaEEpBlKE6SJNBuhCVgOBDwpKvU8wALi0b0HC76ncIqlHsUG9sFz0wHDQS56kAzgrjX9fThXmSlQGppkoYDp8gHSI1ggI15Y8VGBAe1Kbho6VOER7Br4eG8ykLv7IPPBYO+t8gS4hLKkqtjbh3+nVk+7f0/bvwcCQ0BkK1AwUJOF0gBLUXpkpzn2EfvH7syRnbY/JhgwykmGAqVhlu1l+jr4vzXzYhO7cMchhg9HVCRjqlGYOlYVts/P7MCjv1y54MoY0wiM/4WtUOYFoXusocg5D3+lan23ZF8akjaRwIQcPZsDGnA4KDhVrWc2nPb/vwldvjXm2N0PQSJlswEwKFgzTEqUk4JDkkHyH9PUWmr3AkAK2EVFqJcJ26jITCzeBZFUJiovTIREur8AlgEUADoyosbWSACWqkZW1mhA3eo6W9nLZbPJ3+Rp5aukKFGa9Le7N5lkb2ltCVW+RJjWHA4HSiMdxmItWoFQCGvRFv//VS1bUM6xi7loYxmL2p2LCrjvI70PUNT/5AwFkLMcgJOAiSA1AZwUN4RU+bhKodKC2gTJCXKUXc1Wa7fuXOXKVeGuddPZhk0zOAhuHI0Sx78vU0VSVtfAi1JMOcwpZHweNRnO9sL2IlrZiuVIDsowtnnYHs5N8LWJExu0A+AvhJwYZImT+wEHEACABAKAHMBs824R0IwvTk0E+gAHAAAff3BSqwuD/wZVAAQn/iQ8brACCYMeAyoE68CX+OGgbXKrjBMJht8gfuTD2z9uBoGa1SASAAAt1fXPEAwhumwmMlSGxQLO4087RIMAwIDmU4dP6cu1OtsuZXDKlqdYhSo15qjXaL5O/QYMGrLTHnuNO2u2Ol2G1+e37muwoCCSSJWUVbVoufV2OstSUiml5S63ac1sTk011972djXSkU50pq2jkX4QNdRQRwNNtKJdplOYD9Z79p9+8Ibjriwjl0XPEpcPLZcsdy7fWv66wni+5TlzJWZlfdVvUj6pnAydjJmMn1y6hn+xee37l+RX/Fc/vUG/7f28c/3qO8I/8f/Yvqy99/tA+kD/L//XRwCeIt4QQ8n4NnRm/Gw1M4fdy/lALX7bnYw4y3GVi9M61/Msn/r/JvO5GcEPH7xxxwWnU8ePHhndu2dk967h/hVdnR3tzUtqq2dW5rvs1gyLQTcFd3EdV3GBM+zQYI091CiRoe/YFhDw8XJzsTBQkONwnGPsZYRh1rGWTpYwlyK0xLGxMGl5ckRKW5qjSk2xZ9mrPNdFZunXp1OqVqhRViUptZi+Dj2TXkafRi+gZ9IddKLHKto72nmanLqYMk5eSiIS3xAuErKxIiwd3Y824zfh1yIWAIH3OFy6Ia9uWN5tkfbbFgbwWwLOMsRBFh7BA4LDLcOEgNQCtmU8FdmAgYh0QUcz+CHyhfG0AB2GyQAPusDGQs9MEo0YBefIIJMYDPMDaoAjySaMgwDaimhBChlkwphiAHckE4KoAMHhAEODF8azLX4Jr4KjJGEgbDUIQFT2iAAz8c3fOSowSsQwQEEQGSJd3lxbKcaZ2Cc8UGPGOSMoGOXjlPLwqlP9c9NXWwmnhxZY88gsZos+lptsudliy54OUIv8R8xC/X08mW6Y7EVEmJTT7VKZaNcxh23J/UkHm+MGCKPjxtpMXyxG+T9Yxdw6mlItovrqOqKtJrN8sSrTuIn1fZQIP8+YnEV+lPSk6/ZyD3x4/+iB304Yp9+Gofv4Kpqzk+PnZlg49qtyd8YoF5xyxuNJwSoyFDAYghbLkKC+vTxal7QtFaunku5UlHJfEsnocdebbK6+SgxI0uh9b8B+L86vno/ZAELPJ16oxanvqb7uU636f5MgCMOrpaRIRlPoSrDed/OtlFBJO/C1KPo5cJSfEpmy3fQ/WW2QUkYI4fOZ2d7ZArDGdgBBEF1sUyH7bHPtjH7VPDLr1XjRT7xVb6CEvTLEB0IKznheAHQVWG9gephD3aexJ5Raf+6FTyMchO+zeRmtOpTc86Uttnyb3tghGK1XmOlUDCpToHq5iAemREbIrYlDOTYQk84ATKC0TuYGKjIqIAEAa5cvk3hxrHvViM7qRKlNLbIb49Vp4stdwcqi99qMj2MdXjBBmdIKhRvULYbjIxgW64QfQJZOwyh3XXPZv3tGDrmdbwxoYPFQ8VCircDwZ665I4qaDz+MegiDHkayBCyLgptHgmJYgx7R1dpIzRptRUGeiT+QWz5Zw/JXOHS0akDAiZ2Vuqckwm/+LBOBqF8TBTkSv0QCh/Lp+PiQlyBkiwiJYhESXi4TrMqMw0xRbY1UGDPMTjIKFG5giWUWCSSuE0WUOeV+slrc4U82dLMly2s067QVtcOtgORfY+sI34HBbIlZcnnjF+a+PqdJK8cbP/JLPy1HVPl6WlRHQOZT7OwOMZqex0f7oRqWuCgHltsozTHYfSQMGzMS3U4zKJDQ7PwbLj69uWbS5zXkuEHUhmP4FAYUmNRE9YmCxB2aUO//s97lpUnD5OKqTcGyhCVr2LkmaiNqAAXdHUZ21i38pbSf5mA9VUUbXhj1KFguu1WD1kLj96R9PTnuCMrvqP7fc5sxWYW6JBXUWAWWluYYBd2+gG1RJLbQ9MM2jvpdzka4tHRLJdZwMxHqxCQuVAhmNuSZ7JCnSGVJAMWfyvwCDnY4SRlW+cXmgvGKxxqSMnQsB8lZsNW/++wu68sSF5OXeFnjkeHj1mduCSIPzb4qPVxvSL5U2p97FDPKaPkNFQasgeMGjT8xNSeAKGZ1xSHCEEggG03P4hf4eeyoMpmCwqiGAsjtXIrKEv4GVKjLYGGvm0NO7Xt5BlijhX0DRxQlDsFOnipp7UriOknbz6quwugxK9aX9bIvjYyPnk3IpxGHNE1gfeuBSVERPrd1Sxa8UD9qSoVnCCeqzrCx4bMg+spas3Uw7ljwjgYfjdEiCy25jwio+08bjC1RbcmGZBOaiTFR5Llr7QU8vsV7WeAoyAuKsFyKjVm/NCoBhpCXb5f/ktsMq+i4USls/XUYFlPDxnJ8PdyRt2VqxZh1IlVOAFCgbUAeq3tUJqv9A1Jt62qx67jPne3ayGjokD3RimVPaa3+vrKJ65RwkpUE4nmYtjt/eWWcUGCTVlPi+aLSVPJhGGFVTzH5Owxwwj+IDPxwrEIUdGrg14f7cmtZ1vAf2wKRxwlUyKEwwUnqr3tMRSJmlHWoFesN39YwygyOBGejPHaiRJAoMTtIUL3wECaIO0vaJorBhykeebEoWRk87h8l1MUTGY4dTcrPSDPlhLqR/BAfcsTLrQo4jF09dvu9xYyWvwjD+OA7n+m+riwKDm4L/fEOFddBQjpF1JfDw2MRGKzKgDwi7bNDluZI8uHg26UcgM+ebOGcvh7/z+MPGmJZh61IIWmfNPx3YIKanwZEVyKaGwnlb2TiKcOPrk5c84mNc3y6cP7M8szUWvCUrxZs6Y2Zv66of848Y6//BArswyQBJzhR5lqMFERGcUxhcKKLGQPUiu9UDMNv8ItgHqDGwakRY/QEUkz+BgMsJ1hWh5CIMlFrTv6p298wL8J3xZGg6hRm1Fn0e1HqDh8fiOf9RtaoE3Psy4xAInHCqaupsos3gPGNj9BkNKDwi2lF3YY8KfBqC6aAXvgHiTXqQljxYwa5/z9zRv7O+fqZyVjAiii/4xbTv29/6U5qvduAXIsTuaWbe21s9th9SHTLEvIpONPPZdirKr3rqb6SRDFhv1QvE9WtivaP+HQTJypQdwgFoLHaCEMCixHJNTf8+h/xRchLCKTcQqAQkOHaMW7WoLyIRHWEZUHBIkLZSNM+JIEG++SeoVQQLhExRAJYQtC5N07YSQeUVb9XJO1WMZalkWb5Pcej23jsDwN8q7K2YLxxzweq+3zrJ8/A8Sg7PLJzJd/BMZCKZagrG9H4kJfVoaJsS1fTFwJkCYLq0fox4XxznBgiLwtSctxGZYSYYKf8Jjbkfw3ZotpZjZ9+WcHwJtI6YTRmIuGr2Nr00l5UcGJTXexKTa3rmp1EV88n8jslCWVnvJZ4z3kRKC6vbsVvDHxqgNwyszVbXplHRSx3Ts5STaCpKPsKDApY8ijA3HQquPGdQ96KLOT35ox40BsZiY3pOag5McHQZRix5Szk/9l/4Jr8dcr8pksLTkC8SdL9Z1Uo0ExveMuvh5TigQqixMrXe9NzeXMO2C0VEVTVOQpw2aaZtLEzv9ikmqnA+nSo2KdHRJETJ23kmCWiNy4Uv7jFAgVraMa2oiD5+gxmisonv57Nev3ZrdQKmHQmnfPOuSCYH2oTc6femy5W1hvxn29kXS3edAZISBrpTx0ZqgWL3xh6iWFCpKSK2q0qMFpZWZpm4BpOLFuWoIqKzqpyWRlrIo7ATALKvYczKMj76x7lwbc2mcQmLd/mPFZVEwlmVBBvRuS+9tRjHvOO9Cuox1dyI4VwJEuWcs2E6DqMRDPby5NR5/jSeGS9+yYc7nHCyPViX5d0GpVnNycnL1zqXmhPPUo8yTt/mdO8A6oXfo6bT2w4obWVy57K7OLuqOhTWG9UNgYn9bc/3A+el5Nw9soz21qrPsmH732wFwvR+7/L9MY7co0Pm1IV8tuC2uL+OsN0UHniD8Ah4K6lURXgq7H+HREY5leKyqfThkcLOVisg7kwZVR1kPZE0zp1oJaDn1LM/pAll+dek71r+efHd1WfWtkrXv40CWo3Hz3iKJAmUkExj2G9qsg0PngrFJr9vzz8vKlcr+aFnfH1du/0gCtnQF+2XIHs/A+Xu85NJmqxNZul1bfL5cz+qtueHMwtiaUNw+4igUiM+za2QjFQWHWHjS0zRYIr/M6CCo33/6KhZtPgUT50nuHzMieu1hhbfhzmwcMwmLEGCcxoh7RX+Kepx2l5y0Y6tJy/MXaXY0ENLaHuRBXpo7YI+mnCCS8brnGq+amr9EzgYsjXghlmYdT5wotFxtzOBzbT85nHzN/WR6FCjYxmnX1F7aQN3Apuj/q4uYxDLJHg8iVbPveA6tOVSFz+xv3KHYU80rU/2VJVC7J8zbcY3YxeGwx5yPBs7nUyIPX2Zt1TmoXXgy1fjQ+5+Uh3aundPTkZ09jOGARizb58hA6ngGoMAprVSMVoW51xEIwKDfsGcAbhKlQZn/NoHvFt6zjLYKK3kL5mA9iT+WQoilUcyu8aTUXPkHAxkWDjfatQn6AIhwSzer6IAfmfkiZtNbjII5x9dqymAPFGk/M87JtMUauG6GVjf6SHLfkLnP5/1W3C86Ooeuk0l7Q2EiChxGPTL49aW7Pz27Okh1vh3UYm+yPsXQUxdsRef2ee+v8CYLT6dxijkdYQpUPsf6d6dRa3RvMLA+pd4MnWKe+d/R31qSN6zY3KpkU8bKDZKTPr8D4hyu8QWxTRiAw7f3zNnHVJJAEd9O8w09d13//bqQ4EyLtItGQse6xBTeTCHXbLH5ZIQcdTHsb+JAxUfyBuIwUridb8bM2WFatMYxAVraKjA1QkLbXJo78nZw5AJbKp4ZbFmMbHI7ubztnv+piVwPx6BI8P/NA23uButXa8PcsFKDiwGTwZLLrOq/K9cq4Uc/UjqQWD8E9c8gaBSvzzEZc9wzbcljQD2OC0iG5i38vhf2EcZt+9K1kRMuxaCZ6ObIptHJ8+/XEnY3rqhOSPePEQn4LCi5L+FOpqeyDLBLvMJtde5F/HKPgwBfURuf28sYFILYmiieHIMwmS2GtAUG91mZm2NVLsjOPWUhzDt0SkkKwEi117TnMCJzPLf00VkEkoyEhiwu3UQaYRvjGaWwOJF+e9hHBQ99zVsmnnmiYtk9dLbUE9TWMRdAwV+rzlB/nXQkVvUHNpsbIKsz8VxeIcvArI0HbZ4l5VybHZ/6lxTlBTkkoaCQeJJr8WAFuefoIe8Xae0SqORqfPqJtSU+8n1T6N1W8kvNxFARuaRUysC+TZKpr9EPTEwyKEqsqfmHKExzMR6FJApTY7poucAMvubksufiMT431FXf97bof53Ia4zLCVpalT1JoBiuzcG1XyGyfRzTUBrgsJXdyAXg31TsiNiejXfbvg1k1pbWHpwny/dUnycAFviJK5HtJcVepCHlubeivrjUE16qcrs/tu9LalS9bmaYITX82dLMJAuxKunHhG9V/Hs7DLtkuxuhPpurAAh5n+4VseiRTCDWb+DKT0XSsw+5be8MYvKGmymez7uHVyl+5i8kdlvbHLgZmuO3z523bVlYKNXWznn/LlDecMsMU+DtlIKCB5DBkz52gB24sYDfvk2oskc1LluRG1nW0OFXXvz3Mg5pX//WePUzPrBtv2yGFzqovZBn5G/1Enurq8CEiIxAvVwJtnqilZ8pRm8XXTDI3kI1bDzLnkr0OOHtW7wEsEZicLZzhsu1YD4aBqQCspUTobrguXrVeD9uU6rNO8SIOWnGi56IzdsDq8ZbWZ6TS+NJsNqIka8aGcCAxny3+emasnkCh/X7Rhk8HGzP4Wa4Qm8rOjTqpMv6l/V5sLdHNydtxX/eYyYPb+HX93MCm679CAgle5HoAT1eSpt9pujwt7TfNZVUoPW7gW7DOM9TE7QlXHH3ectLtyOtq6xQNbOdEOavOgNoLrTAwNbDwyZ6ww+Z8f/fF89efv688fDI3aZw1MppE+D6L1MCbH2LiFq8KwyV1wzukutGuxQu3557RqaPgvfdTBRc0cfoWs2ZsBqJmtgsE8/OtfPXh7nCombdadl/ASI0+rTv31l733CKfqTYU8h8e1RLr8ip9qjzL5VPwU4QXuAsDsSyPVXb/frLPVZz3JzrWqtNcfVBnV8Au6ft6fuEMu0ATmvs3Rvgh6oy+Lrx3pvBZaDXf0QjJR+nrv3uucCljOW3cqrPXJ2c15yc0uHa9TOBPv35a0Vri3siBFm+n++oygDsNTgyO+IiG8b0lOqYe9xJWF/7Zs7Lo+jQicLhGV3uk4jBBn26wTJAWcuqGtj0zpwCHBs9oGQnUVKZFd7ytVJxzuGwfGeYlkV7HKcrRmA1gCejEaxwyiDfEaNb5FzMRYb4Srq1hedXfs0CMNnOoSYpwIDknRMQm/kROe9HFx62GrPKkQ1WOWZSVhML8dv5FABVog/narWaqvkUT+5d8+f5+ULNsAxQ/Wb6KldQqh28WrYd8VqKp1A3t2/uB16zP9fjpP6LS0Wn2Hf592LbSn095AdHMMU2VUCDLJGhcjeoots/vNVvcwlOWxCJ7SyldrvXtvk8ondTYWUOgVva8YDhUzKnQDRO/tb4rqrintCSdAfxW+tjKZTG50rngq07XbpI4yAMri8puaGEIOJs8R4eAl4OtBYfv/gf0Fpe4QbCqZyT97ksgr7djt9T4N6Pxi2dsEMjhUdydj0gR6+J5kA3DCr5jn5mZ3D+yZUmKZEntCqQ7tjAdzs3BTQBOSMgGxLN4WGt9EOoQn2f/dRdLpDIDT4UwtJ/jcx5KXV5r9rdWyyDNsGmIPFUSXOM4vc03bDLPclwYGmj2+MbCGX2dm/iN/RNH4oTD7NZxtDU0DSlhGqVOa1X/bOqw39JedlCjBYapXGN5XLwoSBWqvDHZl6xKUX/g41Na6SwuMQCf5gG/ZFRla/s2fv4qe9DZjkNwr8OxpoDkhvRZZjoluZ6BVYjyyTcCS6ILyZihVTAGzdn+9b9QF02G0sr5l6rsoUF7EKu9nqCwMZjQW1M+JqaCwsvhIrhLMxfW5nS7H1ye+VbcEqxG/OH/OSdy083vXpouVb4A+WqaMulxAsuu8sjcRJmSk0me51sy77IkIPZDAJCaTsQpqbvda/Oxo/tzEzoKL8vgvlYs9krHXyaLr4wR0UkEJp9mgZgyxbdXHAkZpo6wshRTTAuP7AOI8oa2isusUTPHUssPZW6NhKJIb9IgX8aVxcTF84L8pl9ohFt+U+p2H+H5HIDYLv9I5H5jyTHqO1XsTO+7jeXHRHdrYjpkg1ANR0iFpBji20KhgAhd72hcny4TN3fIonVt+2kdilwbgoBAKqhYxAUJ9IxsOK4GKcIR+a2/D8J+LSZ8aefXdqgyJupGhLjagv5OyMlWIs/j5MMrLKZni6QWlfTVtT4NKZjOIZfDhrzhlDs8T5qgtvk6PaZOwC5rFvX4HIb8YlCzfwtEtPBhC3qvnSJ+f3XcHW9FbqRUnscFzQ9frve3ySmkaaDqC4zjc+cKgMnRRE5CjplZNrZB+bSUTy/rybCtDfM0y5EP+Qf5kn/5DFkKdZ8XW0vdxqeryXpPPZuxX1u/TviKHiIbKmjVIs0v5fei6gEgMB4X8vDe5cEGVPj+9G/Ca3Op/8uJmRTn71dWdGRRDKBE2um03qfCnM6EkRP7eBimkkJ/7eybLdFb3NDln5M2akenQgK4XXWVjpOqvGkzOBdysS6DCj37CPKWpoSPdREGgABgbe8uiy8Afi4bLSOSv+9dCqp+ad4duwxywRZlgMkgKucvDRY81fMaKrXMur4k81qh4Ig+Z8nDoq/lqQdljzGgqmIRLxpw75MMCjTO69+Pf/1l0dingkKdm6rq+vmqRSTXixlz94sLKxzaiatmTz83lzTMqIQl1Z6oXldNfTS8MoKIBz8SbxswWGD2CyDvdSlHDRQOVZlCJODeI1lokOCIqDde643c0RP6S9BZtFBFIjv72E1F8HPKk4vWnwYntDhbkKmL1mCSlLmKrDzut2JYCUPZoLmhlBoYt1g8Rzkn9Nwd+XSdq1TNQoa/9nSZkHe11hdEZ//Lgr2oKAb6XlInTyy8kB/flaDIp6hU0VZggYuroWakYuWR8IJS/gYb0YANsMV7T1onqnFYMRN6cncktXw3gBJqh9srSTF8OgzmmcpSqsaLS1Qj6lv9bP7jAN5IV9OrGoPTiZw0KFZMxyGdtrIBIP4vGHzB++cUj8jLnkv/r3RogM53Uh1LWyZJsfNjS6g8pxoVrf593pLhbY/MnIt3c82M4fzrbycTHWECRJQYV2TEmon/CnCUvE1szu8tgIAdqekWHdcRKfF1vRTHHz/Pltwo9USIzIdnk5RsJGdodkL8twYLQVD6hTrLFZv0vGT7dVR7oK7tpZgoaQjgv3kTv6WIgqJznh+p+7BJ1b7OYPHFJdCFHLEVVge42tmYL59f2KZChoHKWGboF4EyhAS2H+ki8bO9jwdbuiIBs+CETD64S+aXmstGBUJ70r7HJaA/cm0MJxs+QOhM1KIzbKMCLhYiAmlxtRePjUWt4YFvx8S2ZR/XrP3TBpxDfolpvEJ65XCoYlxOpyBv+e3sAjpJUbTAIxYlrIaIhWWCWURBI+v5+R3sjPgvSxbyptxyHY5byYbUqV2Dqsf64YSskSqMHrLRLNylaY7BtPjgJpJD4ASQRp27KfPQ+mvDhcIlwwO2H6FM6VQSG35SQc9hRb6QiFsp2OpsDz2771IdD+J1IQPvN3RinroXSlNmCEuJUxWsTg4yoSuLNu9JVscXZzfO+SRO5BuCqAZv3Cb4Iev8julV+zrfJGt0CJduMcpc+D6lQem+zOTFWLdfv4W6L3k8MGkLJ3+PjssjOwA3KFc/LJ1JHXycGf+tgHG+YBA0i5C6xjbJobKz8xWtFflbQUTKN9j6h/NiYG8pi0NLTLGWw4U/ln/RQ0NSqUmbBP3DN4/ZPiN5TDM6SIKpeZ54C+ZjmvhDUYfuLhDpFL1SLaXU2XBClXiqLnUFrSmtIJN5yIeMvWOu49zduNgJCUdswcmhkTPc2xrjop2V6esvu+D8E0g0gpDo/rerY7+yzGNyZuolbvOQ9EMhQYpgGUp9Uul9qJmMVtuLxYXbB9FsmybOMZGaU6YC8GnVUy1B0vnw4UTq+DGhItGoZSYtvyu2EXkqsQY34zjb7YcmmqkzALwdjsmBzsuN2+txWChv14pwuFg8RXsngUfkYk8EJZNL02cl7WxPvizwZesKUIf6FtXkA4cvheEkiT+1qKyaxh7NkeTYr8Aq8fUFpa3nREQa3ExSuWi0w1lYUMdvTBYUg9nkca7laE9wIw089emyNHpu0qZ2tqN9FTPCIZuNUESQBhAzWDTZqhmUVocwP3TmC8abclhvykDW648HY3+H3RgVEJ12PCy6HproKKwpnjuFUiJ4d9H9Ddg7jJttwfkwyXHAaArkYX4eq93F7xY9w0hoqamPwccGCCplL9pM/hBPTBWknKtjoxY2BrWlhJxWijjnyjdEpF6MLtk2M2Xh8yFQLPED4nwrzVSBbELBRho/bIfq17r5RHJFkXSd4unF+J+GCUoyye4J9VUg9iLaLgldxffUKQ4eMgRWEf3M3hYIDkop8IjovWY34dc5uSvn4WUGtHXJYWRm6sd8F+uiKGzxK28+yvlzz1dyLc/OJhUh3Bk9TO6uNmX/JoAAvB1BUi0aCt0u30GBwe75CqU6ilxWXx4WJQafxAdAoVsoJrrmLT8L2TeZIaWXJX1fS32UUZBlNCvGP8UdwpEqqIu1XDNMtJfA27YxlWZKfxXGFwmCEpSso3fOspL9kpCo3ZiTS4sOMYkziphRU1tsWkJA+QL/qFWYVoURh3MOyxKPnvxXqW8qFSKFY4+WctbrFn3cjaDX6CwaGa7Nh2RFWZE54WXlOYakWlDcuT6GNpkkJp0ZeJuYDnma3QJYV85D3DUlqdyioH+Nfp3mnyM8J5eW6gJ/RRchtTKizSj1a5wP06OxDSV381Edr5ExPl/Xw4qm+HJExvh6v5vaJzLc4cfdV5ee22pfp/GLlzPL6lv71IpgL5bjECxchT608wFvbVYllhnkiIYKFi9mr8/pqw1s5PemzHZZKaf6AJLqQVE19jc1GekytziAllKQokOyqrP4S6i9tT2IIgpxO+7LdwTZcq6y88zUjZQVgcDxWeXf9tRhmw6VJ1mgTZ4rAuCXN4QDyfZEbqYquzoeuWW0hULAvi0TBruHmko1v4O3a4mRp4Vwz1n6dYePj9nmcLNWMghhzqig49u/ZlJ3pJ9AyavaelMSR3e53q/zKJNyxVa0sXTAdnoxZv1ee0YqxbpHVnwDJiIfbuWyQq74gTxoxWV5s/Tb9kx5YvX2pSTTvBqJqQ7/8UjhiNKaM0ne4rEX+376pWOyenynA621lcg4pAy+PVBiZeRN7NrkK/FHYj3z97imMymfbLQTF0ogxetSGQQ/87MzbHfOjP2Ng+eLh2d8Hx6NkCaZtqt5PDzdb990YdOTWZHnRNevKm6ztisL8VxciuuvbRETMwsalZkD3bXL+zLBhmRtSMUpLaBJfv2gdT6VmoBvZOLlQRaIrva8RQ+zLLd/q2UupoqQWjhTZTSK5J26dWfaWBWUbyyMoAuoW72M5Pv+yobWLTmQ4VaYTzamX+/18Os6ABm2jLjQ9Fh8fEmR8J6wipqxOWO7yl8Qm/DTsxoMefxi4sHj0q2+uAHQq0Sd0LhREClX00z1tTZcoeN1DPaKuM3XfXjbz90B6htuVlc4FAJrRrBeVop6QruMKfA4KGkKOC+KfmagK5+PaYbVLTNsOlgpCq5aVTK393t7ICwPCbdRTWnd/3yOq3NBS91rrqutG/NyG6B37BfqyO/xquc7fGQWmbJ5uy0n0Vmvx1JwbXoABpUU4h5t1Xbh/41I3oJdkECxHcMrA+IMlT+R0CHKNvLFY9i6vbsXX45mascbJAe1bkC/vQqv07skLpDr3GXKppcXKLLw7Wl1ezC4tRLrTKeu7TT689c4rz+wraRJDyv+/VSZoqecUIi6d1/cpWb9SsYBhNp2Fd0cNWcRgVKDBCzE9DSoV2li1mL/u78Vu99M+5Dn0mLTeMKpaKKZ6dRJshTM1o721bghlfFPROtTLX8EKx77rrUrK3+pGfWVAA7YOHVJla/Y6YuSECJLMOzdvz7SiseTSEc77i/O1KeQBbUtnduePuN2LR6QeanoMS/e45bBVReLKwgt6/px9aPKf2/3D5XkTaaU99ZRWe2s0xKHsl8nvzzAW2CLtf+dHqgeCg9/5AM1XUeHC/XuCBuPbaVPVN7BzPTHFnoW1TP7D7I8KP8n9eNNzzpflWrDF+uFhArAVsW0TZxKqofwZRlI/RWkEVBD8Ndww0qno5vvfmPwbjz0+wzNWQdzHJIev556b7ztz0dy4vxtpSjolsvLt9j6N0nrxWN4eDJGjm8McSP5UP2vBhmckMti4Xrebr05CtFfR7jqPnSXhhNGHzXHymjs2h7BFmhdMdWdCJBlHivoKtr3BRjHQBW1j+yFUZ43L1uO5teNaM/YzuXUttugsFfqGWaJi9bzWRQJaqctMZK4Gmb/+tlR1Bc+/p2bjcN3VV9hI8YcqvALNCrIsMJgsPAgxCZowYQP+3o6bQijGSOgg/Ht56lWRyxhqibfJAy8LiplRQm/kL+jhiwIx5HjnDffL/Z3UBfJwQReT8ATQyEmbUz+/d8tvGz1bNJLtYJkSapQtcqU2wkzhCRxn2FpUq7GkL40RwtdE4JCHIO6Lfi4qYWyAiGKLSSaooFHTUee6e8W/CpYd8LJiJhKjHZotKN2iAyOBytFPIEykL02Jqrt3nDUYTEcTogT2FcdLHXkrZ3RlekmPkstmpJsdypwoRT90XWyEFTQIXKwXkyY2Nyg1XDZNMVC5u+fcoe+O+5+97iz8BSo6/gPbW36VURC5puytLKjyHwonixM5kZXXiD8PFfLSIcLPlZe+2ceVlKEKXe16jKUe6x1QnxNzrMOr8LHpl+rlrVQgkUX0/DdepIBgpsWYBl1/hKFsDEQhmq6jRJYB50MYsTwlqp5Tp+c/PKZr+NQaEPl7XBlAF/QI7k4FEr1tVDicGAkFAWwHQRW8AK/JlZSY7dc96su4PHO7BqpB24TsUkv4sUNML1G/CVPSdRUuszPLs/MBYgamXLHfjq2tLFnjqqoc76FqE52818j5NjMTqZ9DsnD7tituBnZtgSVJbGPM8vqpx7myrPJAknv6Dv9Y7UvMplHgan9g2VgRzBNluna+j+8m+B5Z/4Au32YummzzQD7UN7NyLXgNk6B/cTjhuUpKPXSdVP6P0AUe9QoiCJ79yA/i375914j1KSrGjaUe1Jsg4VODvxzN+Zth58piPdw5bIGDqqbUTVyEXM5uofYbLS/GJVjJWj3Eedw7PbgLnR6ahPD4dNfG+/BL8jsyoKvJ6wK0s9Mpd2MJHjeuAphfA+KvifcMm/QnsRkbtR3qc6kLD3bkHM8luLJJ1VeYVRdAy8ePceOvTM4X1PzfJMrjL0giJpyf25EylOy7HjFtcxxLSGLVUE7uiFZGG7NpecKkoQR1DQjeakiSL1GdO3KPsJITB8TUEps27cFnK/RhVwQUUtuNuftw2hbRBlG4DBDe4drCMa9m13xMSMKgsbFN7xgbYeGi7KlJNtoOWwtR0yX/+3FBQwX9bsY0z39zAIdf5vsv6o2ZnLyGZ7OqJhLPSrRqLpJLzFKuPLSlNxiwj36Tulbemu1zRfczs8MWJwzbeFdStXS6azt35Y8id/Z6afK7uweToHWoHgv0ulWZSEgB+y2IrpPH0pcFHIsHAZ+t5ZM8KpxRNXCMRBKqpPbmMq4Lu4ZqkQOpsp6p9bECJbjGo+CuRJ5Aq76R479ps7R85W86xzqWqa8COt8jmwemeO9hqRUWaENfv2gRzpVXl4vW8OGVwe7omuyBKYDXILfSN7Wqb+6NaiZGm1qKBqBJdILbd6IFMMtBp6Fq+e4h6wf92u2zm/PeVXBfuggFm4fSnQOFh9jjTFk8VqWHnHoYRR6vu8nRcdRcBxGfZUeCnYMs7pyLVFGXe96oQmcy2Z9dgrXc9vKqnO01zytgabDVQWHJw4AOaDK/+kuIVqgWPzxROmNchVOTMBPmPFS/RsTRJgSz8czUHEp4KYtPo0MeBQHE5mYSCuVxs4KJrb310uryLNj66Hnn1f/+9ucWHzZHhTHDyuWyIYY4lClqB6uF7XjZnNm0ES/+ZZcb3vAl1gDG8FwveJZ1bIVHrC0gXDdugLcnoIIQEDVp2KhsuyToA/wCfjZAq1E4jQ7kKDRSgO9q2zuhMP2VzyzYodMYQwWzuxci6rJwCJIWix8PGy5ioKkXoZgDEWh/HbeVel7TTV4iO725+5Sv9tYrYiwQZrnG8xYN9m6xvp49I5juy7dpPPOCopTxxSFhFzS2tWNhNMI2FLzYHQCGY9iL7dMwe+81fZNugCCLT0CbBV1LlKG7VRvp7uN7Xi5PM1RU7Km6e0+ACaYTyUamBlevAbSAXoWPW2A0I07PHJ1htFa9PlO/2lfjxbVc4GHXN92X7sNHlYitpzZxeTPfgfa6/LYwFiLFIacmDf2HZlz7UgB+QnnhxzGo0q3usQvqtZ8FFrfLqxmBmWNGdLITk9azWGPKSQ3cgSEAIJAsMKzq6Nb+GouiKTh/C1kAf2vdr6cfH5a8llO/ROEBUHXQr5iMGBwuiy1hRnYOruhL0rBwMLNiWEBA7wzlzKxhXHTOQ5/aVrijZnRALo/Vp174DsQcxu9wlhwZLfmalE16BLFUdaZ7G+rvat3kVbEvvgkYHaqfDRs1c+vu8B+1OvodZitLsTTEdwwYD0YA1h9xYogIYpWVmVpGY2pMpxR6qALdSQ75rSldiGhJw4I3wfJ4LAJRC5Hw0N/BWCAEgL2J2lGHS0OOnyHR0U1OgJ+Y3oScUv/t+v4wmJHUynuPqL2CoD2tavSrvi6lHcwR9eCvDwp+iyrSB5BoAthfHfmjNidlH9iYgcqgQhzC6wdNFRL/fALH8Pd/jAUg5UdD71DWByWFQCA8FcyO3DzmNkVfqqd9KhDKb1ko1eKHSL8vqG+vRGIscg8T1AITKlWYsZfrLKNdkXTSRXNK5QQnB9qQzo3r1Pp61X0urV8RP8x+q7QN386nRZE7MA2xX/nfXsP7H6iMOOQFRyyyWn/ie/FYs8VINYC6lMoBtVw5BYdZQxsEtAYzTgS9XGcTTzzg2Vc3nAs7L84XNcovd9RMZzn6tfdkKiTgc/KCQ3HKsd7pAUU03hARWnuAu9+BpLWAC4JIFgzxgAo8t7wSzfQtqx3su2l4/BsW7YWMu7Dm33W7FE7LjHscXLy9XC/9k7DQCUYl9IWgujreScG6siqJFJNwBb/coHHvevjJXbBIF5bty+8hOy70mQmOB9+06e/nv5WE0QL3dEHe5TH7nwygGn5rhtl9a0AAK8WQCxi02bJwfmXJ34sNsLl5CWaMYji9V6gCfE4E/8YfOexdX337IGiPkSD0q514Oq6yXTPSuuZxEthv1G3Uf/2VmaWvGptwUd/otVuve4ZKTzBKGA7hCachDAKzYa/xd5ATm+AXHa0LC9ZGy3FQv/Ce06p5JRUiAd7U+DZT0dHN5uh4vC2GteBh3rbhX3jZUasNubSbsW9xUuQdHeOUB2aR+GvGpGWaaTZXL/HKkivJ8EOlvPve1H80uVybLC0EBDYv+CMrOhoGKJCBEqP5IUf+80tvID5M82krK9D8ssJM7lBHSpDt7OqLwK4PgL3E7szE/BCeYZX7GMAmR89F3FAXBlXHbpeBdjIUWY6B7UyuqrhRxQUHTWk/yhGYNSiOT73sxE91UdBZqn53vzTFNCF+R3vPab/pK9wPVoOkj2Sq0aaEIJYn1KLov2z7vp1bWr6vOyHs/IC8TZ5F3q4kVEn0fdwN+hwhxset16wUAm9J+jYLvlgKrA32dZHOZgdjie9CZ0F2nvtnsQzyTqOSQiqaO5LdhTRDInOlSehFf7a6RVEZtfn1/2j69r4YW64z2I3EkE7zcLJyio6b/YIA4J5vwF2R31OuHiXGtjyJUajJy6MXRtXOCqA4giMzNGk+pwxzvIvWVkqMcwTjZmkaa6TSoc521KgUBTilGT2Rfsq52G6nvTU4FToSlKp2ZNtlBNiRNKQzzT8/fHPVncl4yF/AAlo/uEGdYEQyTfoBXhHsP/c1uSo961Guw0iAXwL9vWXN72bkKj0r3V76M8p9/ulSCmP/1sFgJP0bXIbqzFFGWFyONC1E3K/F+oSQpoxOVuqiVIOOCRlGeCZgYgX+kP/uImUK1n4cF2Xvmv378oOtSjSK0GS/A52FOn8ckvDqefK0b7YfGuS8uteOaX6CuxtVyeMBXmHaW6s/0p7ynvLaQjvBvvOe7fKBz37/1Mn/5EMfLHGeHpIiduBrO74q33ckIbajtQ1fTY9JDr11aObGvIiHkhjn8++c9w1JSjvc6tq9miG3+2fe8Wf0Fm58D9eBJXfw5nbVrA38YjInwN9f+PL/BiEwap4+FBLKYWcMnhBJ0Ge8snNkMl8/RxT2If7wSOjvHxiwuor4ScBX7QDiOYunQ0JyclrUIbx5XkcGmx0aOlQcKYFe9BzNpWdlBQSurFFa1BNZGAVjJVJa1C+eZwf6+9OXbL0EDEYcPHsdCqyuqnu/8/2roExODuPFKyuewCSGtCiZjM3O6MhyQ0CUw4tzc7KpDhaYvAFBRc7iodFRX186HlbxY9j6yhqcd6aIilGw0PZhfeTF88xdhVDkq0Vw11/LEViQ0qddzkSw7Ett7buz+T52eHpeLrib6ag4Ub24XM1tb3tUI+kXVdWbMbOzdzcvLlaBQDZOIAE5qcClCWfMAdk87+837dy29lsBSByz0YMMRHVCal8TyCscX6WskbVrU6JM5z7Mn+aD/IK/AEZ93IQSk35BbvXUXtsKZWW/zEjs+Nv4meJV+tAFBnUyCNMqTKKrvZRd9eVbWahXSOA1cXoanNJCQYquv8bPaR62/SBhlJWlQ+6azn7r5VuqBKTkxf+QRBkB1hge5x1HuMM5B3g/vtVyJ4PjBbhc3SWRnajD5H1J/lzAjZdtuBfPmJVmnG7UZWWJRV8Br9C6e7736kOA125oDktZyCuB25FmyXx/CDDGLNW/nHk8qxYeuqutHC6jIkZg5skTOSaUHLR/MoXPlGgiLicOTOHP5Nyhp7l9laKjnjPC+couUcs98CcQ7scLmeci0GQSueGF/plTDglVv0I8mdUvvl3PfsYQrxv7SGVYzjdDyCSJM2jx620xb1YivPvxX5gJeK4flcKLrvLc5taGfrPXmWQuXvf653YGNEjvYZe0mRDvwh8/DrwdDb/1kRPF49F/zRrigRBBNQlaIyIEz7McsDvgro8PwaqZmZ7kJx/PUJhNTMoTj+PeMfpstwIA5m2j4w9x5G0f//lzq6o24cnrovvp9x7I9jRcRJmr7DIEcxbs9PLF58jj4tU+351ACHzi59e5bmHkC6lPVxJmF5gWXL7dm+5QcfqIrv6E78nC45zilEvVFFxRc+F+SsjLejUlub4FEYI3vloaJXC6rp8a55z4EMdPeC31aokfjGLKR7TJ674Kc7IC7Ql0zq93dDaq8N/xicdZ516kOlTodNlsiXu5VFytCyvIC/2jAdkKZuvN6F4lmvoh/69+mJwMov0XkhVwhQkb/faGgM1m4YjcLqN1/cmAxWayASvlU5U+x5PL8eqW9dzpe1Gk4vXOi7grAnngi3A9rStADXCWRJYAGjYg2geI6hsxjgqwvoaZJCgsHjDF2/GCCuOXvYafqGEBHikySos1ILk+4a9uihBmZ0nKiaW5z716cYpCew8qMv7d1yXNOkdknVmeVxms7rYbeTtY+OB3wXiWM5nANDB24ntQYaDESRKzGepvBY433rtK7JSwMT7BCJsNeY+apDgfUPUdQi1gVxcofN2b7UWV5R0Wzm6+5pvWmXJJRo/EMMwd6dnHua89NK5XRw8p6cbXp4/D9+KbaQdtySziOyKLHHSQ1mxuqS9N9/X1TQ/M1tVsCyYU7OspfNnIyNE/27hA16vk6Y+UXyjYATjDp8UIUzfp1Quw6juEigLNYLbKPKqFhCVi7hXrj+nMGcozKiz6+QREZ5YK0xM4rsI3aLV2AHsfMooCt2npqMDP1o+rqBdK0nR7wTb9Jy2nWk6dNFs4/HkYFJ1NP3hO2NnJyM1x0UJqhh/V06wZpR2vCewF8bat7rGchbR8P2QiMvIfo1TaojT+JYeYmMvxu49y/22VPEL+5dK6QygCDtNaXNIH67leZ07TGgzK4NrRICxGImiyKsBKSLCWvo1ZRNh2mnN6ZxmNCP4OeSlQIXj39I7BwcGSSAmsuBhmDSsFbXV1YncOAvY+mnMDzitNK7l+ffh6SZqIhx8Ace0QKBbVDg0MdGS6IWEOB0bNcwMhXBzFg4f96YjgzZmZ168mmf4jCqL84QhIaX9qG3JKY8qi9HMj+HX2CIxnEKL76urF/Trs249zvMbtGh0dKhbzKM1gg15byMjTaPKiCmtFzIa2ab6x27cULSXZNKlhqgxVmudhY4eXtTZvD9EqfSpXLZA6/DNWR/ui8giZQSvd2VzNYkpO0gUvekZMKWyHexM369SGbzekP2TBQZ0ZDxQjOeN2WFY/4aRQJSr0Jzc3DodmiUAh1aN2EHTPcOXopmYlUYzsQP4oxZNyc7uZ96hO/H64jAKiP7FEsx9e/trbq6H+Kol7HCkbt8E3uqK7jU8CqxcdD7xVXxX78x1+H7FQF11MAmA12xfLEe4h7o5m6ut52vYQ5N9eJIDrgYKQf8EhJxqJBVnqaW1dLaI6O+TjwXQprfT//VkiMRX99ukmgHpK+q7U/XDOuyygu39JzBEoHPKuP5mQHBc8So+memfokXxkwOlQ5MVn1Xr9moF8h0I/veys4/ppkG7VjnGLd6Dp/WU9STZqUW/+YZlI5Tcw9/9giIXbMeR4N/ls/L5C7bOE01vZPx2YAKlrBGmz+rQvr55Zt+OVGFgavqvmnnAWFohexwNO5bOIiP9+l0Dhf9IhdMalSFlYOMy7nkoCz6vQ3ToeURnIhc1H7/N4XSTiVSJS6EdByuBf9yaqeZp+PZa5XZpYLzgrwXJbnf8Y13cGFdjnLvqhhVk7JHc3/7WlMIC39pifi4dECnpv6z0O/oCogdXFyJNxq70X3supPSUBbkrywL92PY23GZxzc38VtsOnW1wRfaOuq6CSXrZDO0KdocFl4km7T5qfrDfEZw4mh797k+dUoVny/j/7NWpkOR5kIgMr9mA5+/2VYZUPkbbtiAALSPdTnlz3jN9M6WEurLR10sBulqtdp6KLL4ThjKIp1yMdnunCF3gtwwidXuy8zc77CNTGwFMumus+z3NOn+If9ehsY+GrlRmM1SuVkGIAs4XPE7UxVJg1JgHNpv/GFEbKhy0+bPg5P+0DAk7x1jeLvJXwRZSmlqv9uZU2WUxUXHP/rJnwaM0mhbJpF3G3r22WwslWx8EikfDYOTV+4Doc+D+sPGt3EuErN1SH+EY3nXjGKNgpnbbzvGBPWZLl/Sur2vfMb2+Pkeru/vezDj1/w3s8/NwV+TftadT9amnPp+MOzERW4ol3k5WYNRnoPzaJHt+Ms7FZjfhDenIiunbr0QhHQKmS1YzkszYuOrJhIo90JytXZ6lgVjA7rEKjH5WAe0Nq+AC3hBqRSaIu3755bl+aEjj+EOl16dVvQCkChN0ACqsvbrTDqVghPAUe7grAH+TVDmqoHzN3nrIFtSZoTarAxYt9NfNEtIGnfhPJyh8GV8G5kf18cBW0GuD1S0k6/qfXwaMb+UvbyH5ee+Y65lSpT53prdmyA5nVoJOud0IlckOLvvbLZL1ZRVFZL5TvWXb+tZ3G9nUEzbQoQfFpcHwaBG1w1iX2s/D5jP2zE9SkCItje1VMGwwqi1sYPmdlXGHppM2/tfK9kTkXkTu92LHRN8g42du/zyzuvL7yJwp0lpPc4YfyGnNFK/ZWH+/9WXq1Wuscjm/grW+usBqU+sbyv49m0pOvG7U/3AoURc4PsPk8gS72vyK7ow+uPNKv+FyXWi9AvvmKx3v0X4syjt1fqkmuvXE3VZ9Xf+NugRFt7ggOhw39/I7HG5uwe9W6aM0mhqgFtdc28LUHMDVz5UC9UPT0utxIrSKwFeX9xE6RwomAItMyYZnTsBghcrWoXosCvMYgrHaz01XJcf7+tSIjC5qCt6TmvHSxthE6eMsMt0ltII4OM2cpglSsOklXIhWUnfBOW5Pq6n6dEgam2y5kItfCS6DqnsBJ27IBYDeBSZcc1IcM8XkFA+6ri+1FcXFam8okkK7VpRsj8GzBQah76erMuPKyEnRuNOvWwdWPzz5OL7DQQctmZ6zjfDkt7yFpn/jerNEORiQ6By8UX5MnyuF/enN51NlUOouuIvJFCTPmdcikCul4VyzLoN3QtMErO5vpkp2zP4vJBLHfAa5CM3v98Ful9yeJyC06EhnB5zXpUNSrzbgmHj9COqA11NBmQpyRVnTe3+z6GXsaSQYbruUFoucMPKZsu70mFhQDPSY5qwsuhqbMYbL+WS2b7x2N4ViNJcg21kXqqINoiRYG99pNwAHknmo3y3hzbCPYkMVOkf0dbHHwd4cZuXkuSq1Hse2rMMpxXdXefsOt9CpZXLrqdU+ewdUsg/vIu/x595wPrNZ3e0BakcV/SvL4W4Tg14iUXEwzxSx57ixTmDLkM4bZkVWVbhVxXsGIsAGWDs4BDan8LwLMmCWE2QCnQGc7FYgi1tcuxiAh3B/gtcHGqRNINXU3TS3bNZ2OVBKUaBX3llPKmwMwCQWKB9fwfOVGUUvXQVq9BSYhUoIrdGxKSbxL5kENi/uTYo/RalebTnfRguDgILkf6fcfJozDtjzeHCQi+qwYg1G1qMcxFzHKVxoU8ptAedXpm4JGFbE8SMQIyF0Yt1o3VadKHg6itev35eQbCs7iPqGnFaRPVGeCXLuyHXjmKTqqTf/xo4FH0UZMPMUM4DsPnaMyL2gxfpd8lFDFX+pvIYa06ttpZ5SMi5eh8qcEUWSZT1o/QYWHqbn8psFo1HnY2TAh4nS0f59HOPVD6FHwNkwQ/koTeIiFWA3GvPXqKt7/C2qcaJOodn6/YtR+DgBhX/idLQOlhR4miR5aaojLG6TcX0URxsoQ/qNX1Ub998ITnPs2lxUKkswuDXwCogPyQtjTA3KIQwEaBxL2IraOmwH48bKNh4Cdz4Lo3SHBPt7geVnIA65j5pg51+ef8k5zEGTeYq7dlADMD8gL8U9HJHDaVRq8rHHfK3oJDgN2O5m46S9LEqjXliiBFYWzp2E0sFJuByjKF3eN34wxUVZgJ/GzgOw6UPnq6/h27am6/ZGStW/gybWYP4sz+KVoEy64qH3fySY47XsqfKyQ9IW/o+KOFyfzhoKpuJHJ8QqLl23cAW7MLnM6fU/daTD7Q6uRhudK+/iAr5NddHwvbI1zHoN5hdzEZjTbiZoREi2hZOmUYagEGqixHvTk4pEUVCjVpVnkctwFNZzQGtMLj/hb2PTAYAjkogwM8e+xFfV8V4V5pgyDCMBgNeiRApFhUKFOwnlZsGG8H8Sysq02HrAe5AuA6SuZbruStazk54yY/j9KT2YiYdWUVyKeJ7hnQsTk8N4Pj0Z7NdSHw178BbPCiJQJDleEBKlgvHver6joxjIRE+o9PI++nrjdagXGPDi5kdXf1c9K38rkOWKteyU9WRwvEAC8NZH0nWh9y2yxuWjNsjVCzQABXvR52gxruz0uEJ/BlIQ2sT8IVdOU062VeKn3rZvKgJKouPE+Vmuox057c9CANztJn4aCBldfqVzq69ABcWi8pNn6/La7ydr8gNMjZexgEB/fEg/ig9llT5jCud/rTtlbx5+qW2AsNsoou1fxj5JCgqIelpVFu0IojEzTl11803QM12s9CtFq4UGMg7xV4DsGL+GfPQ0NO4sdVhxedDsPRaWZsrLYx/mUee3Z2VlZl/Ow56yEV6ucTrMRVFLcFzkEMCI62GjI8f52tFKfG5HTnwH9YjkB93xnzMpynLHU35QtFHDPCtArjmZm0ErtSDVtvaN+pdey5H1kRiZ9zO4gfcuZ1B0D8tfC9DT3ix7J2/7rp2dTSTH9soZSMr76D4Ucy+F4YvwLG5IGh9evHPLKnoxy81eNoKnzOQiTlpzNSNoHPokYnZhtOZRDBeQz+cnUT8vKvbF5rPTtOQ7NonzXcbXDbLJaQSYGQa2rVb+PBduDS1zhmB3DyZ4VUrl63C90oqQVH844b2EbrAvn8zHW9eC/LcwqIWmGafpEJV4V1hXpTc6Cs4nsT1yLu+bmLXpJ7q7BaOypx433XO1ub3tHu7Xy8/kV/7eD8ZpMl7tHeRnaqefBzi0ct0Pw5rkdA4ODtWJJutD9zEeKpVs15WZPnq2WYqTElyUzWDADYyZteDCn/YC8hRAcsy/evODznqoUHPVkRR8aBDU0uAUKq39WCQR/7SIRgOXsszr6slQE97HuegsefY5gBAfc1VDFeBA0XImFSpVmZF/s3w6gbLMX6JFpweZ3bptoJGwR1pE9vzcOKHXDQXAzCDEm4KXfMHtMOy7tRoiptDz8hrxJ6peUcBTcugupfgLKv4MQa8DGyRKDcYMqzsFXvREFdQS988IPa+v1GDZscFZTnKltFxpmmnuH5wFIYrAHDFAooOPCA0XYzjn0OZ3aftoASd/xpOYm5/rYpil10WTO537KyOAyBGITUm0s5iyjMtjBiw43iC86056uK+MDbTTf6tTi/kEJdZ3DReJOjHVBdsZ2979C44U40kh4TK7b5rIrvnoNz+pk+eIFgdUvWSAClC++3dkm726eZBg3R99H1z1SR2pD6W0Cj8WPiXHmjqCp4WlvLXDSB5cU7779HS0Lqlpkga/hwX4ZnZn6nozH4CjEKjZ47tC7zZy+NnIl2ablbk86qlZEKdP6nJqaSHsKKsqQG/8IDuZyHeEbW43X1htj5mXRmSxXWCKkEz0vFugvEi6ozbw2zKrWRDBHvcjDw9cXW40JLVO/MYgbTtabpY2KTfZFJIVEVdNKjVwbdjrrw9tAn4kuBsbwK+sk+3r+VuKWa0jW1xPKblrsgkzb5l2cxpiGKYViX25wMkeRx+zsvZ1Mh+BWz308o58jgIVR6PFDOwGVBttNDRjWiYyzPA8AinZr5EQc2G6MM7sJ+dKZWB052yja5foStZdYlZA91e62S5Nl4TMQMzeR21DELbodioIg9hs4KVKVRWmgD5smi6wrE/xVncRt8RH6aNPuXlG/Q26Q/dMniMjhPQictDXaEHLxhwcr3HT14lvr/od3usDPP9LBd7Axoh+s/QtwB0GhMugdc3nVYMDkZ72pHGzS7q0J0//MkOmV63md72nQdjdCxctmE37eeOvg8w2J8ogZ1ytQO+x8wZkH013DKuIAfmd/WgVc1D3FWrZUePU8a9QJ4I9TQXB5pLUjIN3I0EUM2qcRiwhWVbqyeLWKIy6ujO1O7oRv15iBx63OiXxDfsuNinj4sSrHnMiCRQMBKEu4QZ3UB7fjskKTn/mzos3VbN9PD+Rm21kvP1vFyyPv1VVU6lIpesKNSOmZ9HDMb6xj5hr/TTnXLunCHgEbIl1ARHGLL0GDVMq+y8OJzJLdBy5e0sGtLHIQPLTz4cxUiP+w8MV9fwWQkVA9FttpJJgOGlfa3SW05BDTZo5QJYtoijWcRJtm75P50fFwsNfjDS739uxE8xTBrUX9PWY1a+5hH18dTqcP2JwUs83NIp64cOWRslKaYKF0Lck0EhScmkbQROBhVeDbx4bSkiNHYsOA585J8RBpKMpI4Fas11VZnFrdZtCsH9kxRPZ/Fhml9d/uFvOd4RraadX2XGWr3+Li48dF4Q3aS01XJHVH1dMdfTNxtRcvxcZdunThoogN3tyWDtEhf5QgAHceAKNmpB6ymxoI/RwBpEebBXcAuGNEQP0hqXM3YbfIwvm9FbvshCYFcCYsISwR7Ky3MjPpbt+pRqGglxHSasPySJkKU7mg3SIqycuLww7cv8PTujyIZnVuK//Rxp/jxefoBt8MS4EeFY4rRMNzXsaPS5qf6Poao/hTRw9Ypg1GOy7q9CjJlc0XgeK2L60LVnhKBgiMl2048H21izIW2U2q28W5ny5aszj8iHfl8SAQeGvgZc8KXcg4+UDrs8uDx2VjmvPluUO5pf2HSsGFO5hOkcKMTgX9HrwYoxL+twxzMpeHnZP779Wki45ctrLpZzPzn1NV2kavJO8wLYPJtAqbZ18H4SASh8r1F4a08brLxFwQ6KPB5pePoJKuZ13z0nCqTSp9j1CAyESdIqs418gGGma9omJiv8yaTc0AgUGcsm78fnxNwze79w1yvMIqvURuta5mRCb99rdPoprBm5M/Dua+CFErMzeZgs0kJ8mg6H1H05qJabI8wz2haby5iSoiYSxo9rNvh0BiKJal3ChsiQcJlHDWhIgSNzX0P4OtK4tjp1WYV8JTcTa1XpNsN04XDJP6V7SCAwVPttZUhcuc50TvP/B+t/K1MLCmkpZqJaf5f6ZqCU4NlTsDrB5jEUnZo6MZMXQUkv7EQhc5ijNGRw8tHvU3zmLZmNqoh4aJghT6FutWx4pDoqA3O6kEbqLi9cztC/ELxgMtEqaE1bzR0xKtZ4CTQVbTeyOzHkvoaiqSb1k9h6F9tsw8KGvaX3+F+9syd01panu/C63rTCupOQ5QQ9WM6qj1NbU1gbO1NTGzCdA4CZBMeIHrte9cO98ErlplSCzUtK27gnfH0ReNSXm3W1P2GE1MhbdE/vj0iZMbqFYwIl1KKIm8abWT+RaO4Jjp4AgUyhmJmHfjUleOwYzOYr9cmp5QTyNwm0TVvtM3nYohSsuOC7pdhL/KDeyZ0rSXL61VxPFfxGz8uicQb+fysWPLsQjI5/EgMH4V1vJHmibepkM7IjLvxNwFh7HzGdaxz7wcKCszLsbq0XYiGgBmf3sxd1fd1DO9ITzsE20Cp1mn/efAaYwkHaXcr2jVy6dAFdf0u+2LosLmvqrW4QKDi8DbG0kMEI6t7/SjQMUHkvsjDrKNd/GQRKkFzCzU1bOHjf36ZJd9zlKaDjLlZ11F1EallpZWLjYtHxzPWv22W76ZbnD4Si9lwSNe2LEQKfWTC7/33fHLWpaSkVxkXswmjrP6f8ZjoxMPsdFgnmJrLd+nR+4oWflNzQH2Px+3XbGNLMep8Kb4BK+P92Ix8MDKmpfkpDHX06fOnDnpvyXksOPz1XT76VNdSDZ9uHjaNStzOVqbiWXxQX0mMu94KSOtXtviPcupguHYgJWUFPGX4b7Xr3MmB52SkqhAj6hpFu/LPWi2gewXMEMmLu2wFL6+dwAU3rmvi7NCjxSn4UKgnfj0R3gWZeYkLWGq73/hpVFT7Vse2OIoBNlcHG8gRgVJiHfGJyCqkmhjeq74kPv8XZ3U3+VUrWwSqahW+iR+g0MZx/8TESgeSrD/b0hpA6jZBNbEj1nXHtoj2fqAL+Uz+YptP9hYPTZwaq0p+JhiDvElcUvlXEAo2Hi1LHMwgNISAkxqMD24z9Vlc1JuA5ZyjXc+KKCYJpZEez63fD5vh3AGsCPd86pC6jutyXhp3eDNMTxO9qkNvogvkdvbgY/ufvb9CvhtltpcwZrrRgrYyvRXDQB1pvn3ZH2m5Dg8ZvkJSaRE5XweAZEcw/Lm7HRnqg8AW7kwJlyeam8RcM6pM+9qnNOa8CWMZWcp3CCeerAcCucLtdSdzLvq0ON5CRHbmP5IS74xF41grnhxzUcJ3IfGRKNsdRgvho+AN2MzJrC4tNUgK//u/pN4av391JXOjpliAdVKwIZ+LshNTk5KjowA85wG/LIy15q6fpozEvLHiB5Vq9yiO7DkdbepgtzCoiKRqC2K0j4Hk4SV/u/K4SQmxsYeug92Nh9Mbyf0c+YjQGRyapK8IHehRZlgDbV3Tnd2XolxQ8Iq+aP7h2JjExM5HNefEQ5F8LV2StlukaioKCzIKDwkxCBYlaBFxPyhSGfYEWPABffW+9WJJR0lhEWLQLQ/nYAwlsbcKJSjrTt/zZ8H/GwpBBYU6dxlukvkBLEIlCCQuT/r104ruqb1Rkw9BodJzRFOV3zcTsacX6zQj3lnvxl7QqGdMBd2BZ7W5zoWosIsqTCnWgwop27eWr+4m6P6t6w+199g7sgCS23j/1bxVWfdJsQ9vc20Nawd2SaSiaHf4KS9/m9FN6Wm45vyfYccn2dfi25Lj91BpASEIsaEBA2iCYqeWVDHo/yT3mspxaPSbxTWSnMs2Zg2Qb94a111o1sCqGd5dKzqKFNCuvyw5oI7Kc2/6fj4PoT/ov/x5STfK/9Kuo7qyup5mePXhMGMkZAQtTLPqkXjkWtkpVKuUB47ZzoiDoLy8qDDrnYt3xNMZTuwC/A1V2YCW+185znV3Ym46znqW5x4ZvucOoKRTp4SopP5L/zfrDzAO27C4Atvu4iURRCPSPGLRDQJCUYkVOmX/Pr23EjeGI9hb1cSo5GshlhYjGgCmKEn/h1acFWDW2jWhKAiYLLWcg78+jDP9GfClGblpAVoEyN5v73FbGcNKydPrOUhDeJLGLfQJErNTHTIU7uHE4JVXkgyoebD7U9/x3niJidJj26YmctUhlxT8I7P3NchPWDTf3zwaEoNQGY6D7OXSQ9gZ85BMWtR8W0Wg6+aUZSlW4xQE2oS/G1jaGCYsg4hpM9U5r221k2BYU3GQirEjIOhjHQXY/f6OrxyFMpsW1e1lUIxx/UtiwyN0qsLt9av9RfAV6+tmcmagK/6H7itckrVXQnBAZmLYbtVc5ndYH3kg4BWKW34+jCAd0Uk4Zvx69dL0iP48LCfSIhnZAU5M0cM3ROhk4JhNScQbinbwZUxDicEm8XYuzXWGJ9InlYgV0+9ONX3T43vjspUFn78xgEHca78NPHznKzMUP40U0PLGfGvVrZTWYecTOQkcv0zctr71+ezOF4aISFXAyShC/dYoSIkEli+m9joVISEGJgqiP2ys5QiZ2hF2iQg3WjsdY10+N/oturkj+Hoy2LEciA/NOjn+98aXMJMLoX7gfNANHgoCYxkjxtDqMYsmfyo09IaHM1NQhNk8lmm72CNBCpyxZRhEAI7Esz1919w0ZeH/YnuXiFHIumZOqQ1g37im+as+NXAdIJsC3U4Rbt3X/FEIZTsNYbEQydLlrWMPZ51DfWpcPft10IIOb9AAVmEegMPVlQEFRlSCcvKFwO90JOGeFpUufuzbrJJ49nZvuj6MPD8O0CTQPQD0F+bm7s3CNz/B8HhZY3iuovbTgElFD77hPtu/dZ7KUiXC9lqqN0BLky7cdgcfW0EKxJUpgJqr3bcMaDMcWtT1XEOWyvf8W3bQ+Oc1XayEG1qwtGLIheEbUvjBAVz9GYMYjn3PRQ4Mo/0GDBfaw5ewBJTLtUTQFcRvIe8Y1OUbOg6Svl1/Iji3C+xuy/9fEuSDP+VYvAahSWrMcrpcusDchZwLm/0g9ujuw1PAhsZr1xTEXaj4vefYhdlWzPR15qcW2rRtAwAYhfS4wBkIAYL33xs51d4rxigl3dZL4tHtwyCS4W6DwLWri6+KsAi58J0F/kOupU/7eIIv9pvyL3v//7qwssCHHwuXHuRdy6DN810RF7uNwggWsQrOEJ3IZCpewbYsDx65e+sPpjuq54oKiwvr0+bOsSDrq0IxmIYUd5kIlxaegI4f+Yl6JDJGfujJmG3l3K4wG0nY9pvF4N7JI8XbhFMTVZEAtqXeTaDHeetRvacmXBX9gQswTsOYo2UjBQwIev6wbQ03y0wiQxHu491DdbwIG3LSEk7Fopq1C08ltQI+QGIFOAWUvIOpLQDYBNEEZaVL2BTKBA+wixJ0Ib/zEqNUGX0FdsqMID672F3+ILLt5Yi//KAMcPETznQDp2eUMRdNyaZtIG7n0blVZuGZhwSMeuJP8S+HQF63t8cAVoRMoArAAVK4O+ggDswSyqsu2vh68qMpni89VBzvPdDzpOHXGBUGcxPdvwTHeUbWnfvJ4DQ57PYW91l0Wm7UCIq/ts/AL7/D9Gm3kexlf7apabO3nekyzhD/k6e9Bb3x3m1a4vr94iydYc0xTH4AyW7lcZ2EEsrdbgenJvHBt0yNedlVkcgrzp8b+Mixr5gNtkHpp08elfXg7ULzTr8o9kBZHLnP9GYF/8hlr6Ldo7uPK6B2Hv6Hg1qpk3o1I/jUNX8vTjahjsMSgvpFv3T46gdODj1p3bS2E3dO4Y0nM3DFLKFzkMRu+OWDUSPVPEYONBZiP1ORqxtohjuf3BQN5ZhtrOAkBP7t5N67gcGGii55GJSaYqA9NsxZY2UcGRiX5uYX2CsTp4PjtBCqwAzXWzQgjD4vQ+4qqeeN2OV+fFhwf8xBrSW70rROaCQRtdtf9xwhrfEMw+p49nng1iA1kYeop6HIK2W7vaqsbqi74Q+/MhEV4L94IhDQvX56Xg5RkzAPxpCcaMENL252PXRd3AtCFYGcbwOInzj3ZrYKYX/KZtBPlRKG5bxBtVm5ADuSDPQ+yw6L5CUOW396zPt628vU3WClPCSHfbeyd7WiFSdUeGL+9/sv5Gfv8W55o+3jBvrY7UKy3A1ROUu4Rr755uPmXqCIj62iqzyymMPzyNzsXmfFuXvzi+qKYUzzAxkGflraXrrohVCGbj8d9MwAJdTwG8aiPxZIaUodyLndbRRt4GUv/HHB7YCrrqYpkC4ILYOXCpL92UMyRxz4EBfC4id+utzNVzqw72HcR1Ft8q7iPXr1riqfDzeeiCNnVsBHfSiAu6Bt/Pk8FH89Zv9jehAaNZI1RZNl1PeSyMV8bOmjrEJSgTy0kT5Zqwjo1NF+XXODZhk44/pMR0BCAhFITRrT0zMjxMS9ADoykHfQGm50k9jnpWXRaWJeOizOePGEN7fzHS50F2LKti3HBKS+HP0kaOzs8JW/WHW7bvExUsUS2h058fhHbu5pVMlPIeaS0lpqhwcpokyGNiJiVr6v9+txlFwBH8NtGx5vfkPYPo7wK0Guq8JTVxyxMMSDyjWzLS+u+ZrNUC8hS5q5SzRhVkgNNHn+xvv8Gt6W8ke/spg357h8fmtku/xysB86RqnCTSilMt9mod7ZSuZ1o58a+V5u6GWlgueUFGoTAc0q0Q36/doKygg3uKByJ0+jpXKSDn/7lcsCN2jEQu1xx6GgDpUMYV5hgeeTuxoAM6UNBB65seJ86FAwtvyI2ggsHNbs3xaFo51m6AlY9yDXRrg3tVQDnbAeSDpvAPyhoqHAznrQQ073QbdRZJvVgaO4lkevdic145ahsLN9V4aXTdVrlQGDMIXzfIijuKDFfmaXka++Fj5kny3ffCP1MDFI+QAvdamnrAYJF2gTA4kU1ZGMOHWVU2TPYbej5bMtDe+UuY0DzeSr0KN5/HPtydrURE4TeQhA/alQCCvFt1DnOpvq6jCj26ewiTmR1bfnUp0CgZKfgIAUNDfxrZ/v+ZZCJkcDk/EVF0niXLSgAbFfMhcjw5iYeIv9bfyWpmRxw/8dhnS9862G5mX473FJ7xwY+u7oTarrGg7l8T3SgZ6Bpn2fx77I1xfNMZf8nmwQ19a34m211Sgu1et4hFdCA1Mh1YvH+utlOOqUltFrZIvnjOeM7UQnHTBa4rpNPBiThlCoEhcOzgw2JG5EIVbTxyeXoTuq6sT4zphvrrJ0gyRtRRQfOeXcC0vuuJbndbsRKzicV7lUuOpRNKyFPKiWjPRogXglIN64e9MMDDQWylXilBPqiNeI3brABhoUcg/yLkpzJR3iXwNoY1NaiKxnzsD4efyh/G/WzaT2TPZURLXMVP6fCJ2pOEb4oB9oG0KavFkkMdD0lcBk7U2ASUu2wxFdS82k53DymIXJqQVuBBTFLnYb5PDFtSSBOYVAqQUEWmbv6TSib59cJCXCPcWjzLvcK6fR3R5fOCYI7hB9ubEIV4AshhLj1t897RqstCDSsjXJIabtrmJlbOx5Ojp+iSUQQiX9r0zCSIk+ZuV7mR6lu7I2KcEQOaZMuGKq+CW+Ydc2Fq4TAPaMV5SkDsD3o4RCIZF2+qqGznro2E/5K8nzY9qeByu73l59eS/LzUjOg1HUyGuetqt4gtJYWBPovTWoQuMiFT/roHxfWT/qtXb3gOUmMFOulU+cyM2GdGSaAEaRAzHNrAiKXDqsvbfmyWUgMwXfgOy/d909wiLx2Tt396Cs47KLW7+/32vbbXFR7Lqg6AwXA45oUn9bu1kGSjdRFt+hTeXbYzr6pQWf7l1GEIoa9/0gRkMb/sfNQazXDPaTfSaw/FH1UCGrGMuaaeXnCCpzkOXSLrC/vACb4nZ9KLBP/rVRbHaqRI/WESngOGxsxIQAN6hY4+EVRyF0pRiHs8rvuZMe1QYjLxyVr9EZ7r4pMPxonNNWOEpP2EELxz9qVnTBumJDLNP0Tff/AizGvnz3MEPHX+SqxZKVpUT0JG85HsVFD6PJ05TQvaQwuer/wTaiimlibFWdd/YeCwMJnM+99AbHSiHj2hUwAvAeBk8Pj+BigcxotgV90Av+X4l38iusPuKqR7d4Q66TaUGrighaJ0wo37qQSFtvuWvr0+IFMKAlHtVcgS0DfMtBzZVrFJPjFk7y3bMQY241pgjb9S82geaG89gmuJ+yzCJruaOIVj9SWpaiqHy+FPjGm0wffx/zvzezIEaqEKbvTnpfYShscEbzN2FEFpvA2hJ5VyMRDm0jCnkUM15jAbBalFGeskWR/dGeae5Ulx5Af/0ueKjb4G99Dl4yeQTvkxQ6j5nyLOqNYfNQ4sCrJNbRP8cYc7zOB/gYbYbLuwPS11KWoXW+PSDg/rpwXvpwgQvSbKWSzH0l56iJVQFwNeivN+e62VuI4d6Xq54PsrLAWk1mCX/khlfO88Fh804c7p+9ZWHIqZU74gtKG6YfaAYAucMdN/gaX2uV4M9QBWv2bZxUVvWWLvlNa78m7dHfs/3eWvMaAAzhNwl0Vdx55VwJ5d1oaqjY3xboVltfLU0dRv9z2OX0XqrvMIvi3nnSt+Befz9lz/+eSYEYofX/ka38vQ733IUuaAQLLw5a0hMWQ3XJPB6Dj4XYKlWEFDUX2TM9fAUSECkc6fJTpETkAg8Pbjeye0ggKfBsj84WKGfoEE+EAYFxClmiIXHBCBbr6fyXrgSFaSDgEN9RSYcLj96KqajkwTtgYZcjjCpAwT4qOPsDyor9HJIGCp5yRROH9AjtvOj9YWnZYDAxCEim7vEB0NB3Sjms4TLlpxMBIE+mjqm3cEX7lpg5wtazQJZHnrLvI2Me8NAkiwpu1P3EFwxiBco1uXvsIxUBb4aBkfZq5cRdB6XQkOEfRltwrM+VS37d3zciANTN9ZON+6ptJu7xzrR7w3lwlDocdSF7Xs8g3a7EqdDpNkffoZU2c4bsU4UeZe+1qwh6K3KDH3qn50gWsfP3PbtR0700apIV4okKi7wZ53EY84p2bZ2m4vRftcark/fQTXaphMWogTepoHe04/ldx18lu1k68czFM8gwZ4yTVLiWsY5959lI9nN8AmX9+2Q0TnaFZIFA9vr3GxvU+i4eT6v9yr35IVAy03cIzxbP86U8nDOj7YRz2SHEkO8WvL6J09jitrV0n0ZhgOjBpL/TSs/l4QKnT+JdPbHcp7x5Q4Ej5oBg8DfuoXFZn3iBFCUgvHkuPdi6Q3O7hZVo4+yEEII1GCTSM09N775Le6sMQ3N2uur68moA0VV/y62vEP3SV1wQ1GExCWXw9GjRaJSz2CLMCNBW6lOwonuK+Hn58TG4nH3RTgSpRLTRoRJZ2996cKPwezM1etqdapokzrUw5KRBQszBQtMx8O3Y4fcDxLewfj0WALFLP25jgOrM0gP+ru1JsYBRjZwuqlZvk8Pb9Unv37LqLn86Bm/sMAkfb+hPOv/6OIB2k2X+mnxkEzm0PeoVQ5ndGEQQs6lemJF+RC7YcXbYt/0yqHCpm/pxi2FNjCh55d37S6J6bYjz583mKQJUmLNZg7nQC4wfsXmx2TESfxgPheZ7/6aIZWsM59EuCnDXMGXHk6JXxpxYULV5tVfhA1JgrI/1BCuIK/dqT3YiAuTbv3xx/UmRh2uMxHlhcnfKeuXacw87cmuW4a/ejS+fe6AwpYM1UyNdupGhzS6jX5RjEtlp3FSuHbL9t+9VZKJK6OebiY6vOWHAvdV5XM8v3i53yyThcrKRpP9kBZV9eep2ttO1H8tK47MizsCgj9v+nDn7/B3/7nJL5x5Akk3vFuWSps55mm4PNQpniaz5ZMve1RhCob3DZSVN3joxrsrn9yY9cYZQu1T40oeWSbHcL+4t68E6WfDGMeK7RSqrLlnHuTAeYXjfvWUSlavXnC7VJKivGV879GU6/5Wb/H3+dm/qxx3mk8IIkdLLfz8JGeztqyIU7P8gtvdAI/VvfPO5bRUF5dMjdobVb9HfZ8sCJVIrh1wlqRC6XBlXLHlp7jDcwG2U5m/AXkoA2VSJAYGm9RJpLzM4mSCXU8LJwYGVO8MLdsk9TbHe2v7EwJMVUEK06nA/LUHBPc87XksQmD5X66EZpd+8oN7jBtBakVznXYPlfVkp0aPvQnPvHrNtcZwPYu1vGYWdZWyfmiXds81rb/+au/kdzzhwJhuAP66A2ASXM8VwYSPV7MmbfIjCA8/ll8JwykAaA6t1U0iphGrBmhQjAew7XU3Orq+y1pK9JinmcbY2oq2wfImSNGIBDbCgY2XPalUppcErIzv8v9ni/xTseZXwJFL3VRMLpTyzuwGJZd3fPPFYtprovgC6QLtpaSV9PiyN1YOy9fBrT4U+2uTLGWhd+FUmBpL0wb+AMlvmz8EhCVcWttVNNq3EH2exCzaDqrbsbD2tEaKsejjFsLyO5qvXGpdCjW636xQ9UmUZiOFiM3T4c7nd/8q4deRICccUBBYiqPzFkhqRBXpe3Zzo8zx10vxqck+ewjT/efwFtKn4wqVAddwpz2sabp7wAuFWL29rQgBJGfaC958fxWM3OFRfmICPG2a+v1BCZwWNAOvgLfdoWwAWDxKi5S8j6jIA/fun4qkSEW9N/jQ1N/Ns9vM85eYCSFAi+l55dJ8eBJI5T0rOJqJvHsMhpuFHiprcPnEFy19YPM+MNnv77AbtIU89oclF7OAyf5w5wdV5dUzUaWvHPdpsHXCt2rFGtiaGPVDExubum/ddtTk3nPM5SLJbeg7rpAENzsdVbpVxEDxlzTqHCuRd9Pz/JiuH+5UPNBDnEKh0IlwOYiDwbYehH/5tQ7TLUlarCzfBh2hH1woNMn+4uv8fbsAuG07GhgGRA998kDoHvUYYB3ArUF7iRnaAVnY4sSVLYvuxi4Tz9WeMsRQPRIsdEhhl7bmFKLGudx7hqvA8zrz6q+9jDGZbpZjFvjsh61vFfvBAYrEdwejtmk/YLgNJ4eCp7bkQeNALIwkBR76TewakZ4G46sEePHYS+/CzFImc/VU/JKRD3Fz00w/0GSe/2R8/ybF4zCYjj6louL/MF5TWEBOEkKcymdQ3civEp028GbJAIaWGdQHhIBaOTM+3sIT9KUSyZgCLByaqKR6eglARqzvSf8mlWhrx74jCqRfkxif8/bct14jH1+Ob8pADjGdpjN0vcfBfHD6K8aXV6xBcyFn8xn8UMTAOTg1yDS/Yn5rgvZ5I7fysQ1yHZzYRCGKnWxKevI6I26W/Yk4Ih3CEN+yTQZewkEDnWzd/H+7zFSGJWIfYZ+FWZMSHegOK0er0IrZl/xp+RFDj9dbaO87PD9UHsOcnfVxNrsyZ9TTPJArofdU4nLWq2qHXlBH4D0zDN0C1wn6CFDEufoDmM2S2e6frtt+uXIVwr0WFvoU5hFaAJSc+Kxr2wnYgzdg00wX8sLL0sHDtshOFtB6wW4rKp5+OJTycS7nM829DVkeJhocpxCqTsv1fPfu4SMej8kq91WCvb/OGZGeK2lT0ddX4lvVQc2fWmpO/EqYDKNIF4Mom4W//1t/Srvys2347Q4TvAzPnGC0Wnz9izrGPjdfRazQz7kC7qiTts0GfHnRiBW/bbQhGiFj0yLt+43Mn+C9w65RnDY2YCU8apRiOWyibyld0ME14G3UlcKhxl6Oe9QvpAHUhNTf21Cn6wZbGhtfADSLONrFcfvposd+y+HF1pUs3cDDXI6AN+obnWbiyFXy7mK/SsPhEEivJNhPgFmPxAWMcckkP0y0MaGR2cw0/MYVifsFVTLdiDh6llbkpRg26ggy4HG8c9uAi6uLqx2VgEAt9w/q8rlcXVd9t9xHj819yyaqSh+f3PH7QjituGXlin12RGIHP9Nq216DVEvg2XOI26S/mU2bw2SDdR4a5LgMTSu8ST1KECBNdmJAgD+SXNW5mlytBLpqx71JZr9Z5ApyOWUm1SBOCZiH6wAHT+jc+DeIlJIKa3/NzeZMB/4CdCItvA62mLdKrL5LLUc/2v8+MqOcupZUYwb/cNVn2PkAKoPlH76Mt7Aq4SJ5diSN875BkSx0gZ9KRj8tuAijvqOmJHjWm1Di7+Kw6WseFXgj6PT4ijTVrJh1KNKS7Y8kHMQZu8OXFdo5i7AXh85EzA/mTABWE2bARgTmEZkpyXxtQp3a1ZA25IGEBLk4vX6X1o8s5rDagWFXbuGA21rp0WN1dR6eFAkHEWmRlA0li2fMmeU6rh2TAZqJx5n86Ydlu9Zf921Oxi3LrtE/gjJi2tB5UZUW5VTcqRzz/zY6fTf5tC2DZUov0rpt1+11dLNyPQ2mk2VW+TcXDrP8lBLlALAGK1i78l/y2XwaNMbd/CGVolvhf4qmrvpdygZT3wFcDU4+cMGfCafeuSQHehxQ3QonVAzo8g4DHB7zytQqAVrTrAiWi6SrDz+DchC01SCRUo3a2lJLMb6CRWjlPS23uMgfwT2D2kzsMoanbTTd1R0Aw33YXa+ImwpZFqtqgWbyKyMV4bOmTq/dFOfEezYlNfld2yjl1zkjMOmGn9NjOvyREIpHI165P2ulsO1ycZMnaFw6ul8NBjpF6vJ4qGUSr9irdpq2gYRKur0B8VokmEh8+5GKV6ZGEwwR3F1vmjEWHy39ZpWJ57Q2Dczcua8CH7WOEqrmsBKJHSxQ9vR/hwiKmdUMUdt0Jn3IPIvR7JVfdK5Yifp/iA9u+SZj+kgZ+8sva+uxyTE46pA/CZVAEtcxk2NRWODvxXya7aQHqLVIv35ZMxMso4BRpsiDENa9LS1kSlx1Uc/jyXiIxbYVVFa5e5SarcQOd+atU4zISHBi4lHGYJ8qrVQAtxQYE/DcZ1uH3ebHxbgoNC6ly4w5GU0nwdFGLp8IlpVfyFvj9e2Y8RRhV5u7+h/fVYQpMbm/0C61DJusfSasCB/cUpVrp5hf9QL/Aa+s9P8lypItwclcJzeDiIn3bKYPjxY1KPmA9v3GVp9zFf5icUAAWT3PwfMmqN1a3KhrUYyFgK3NhIvvOdcGIAHZ11ib1q0VUAz9lHfxxGL/xtub+B2uRSG7NLiHDMQ1xgWarA7WCFYnDQE7+vpZQdf8Z+H9vUGhwJKw2X3NwLaMFH3aDE1EDT6teg6zXqhpyDw7YKi1paVZ65Olwuh4ifkxIJqVv6qgQXrTyZMPi5dUQI2DNJZ1QAIZ/6JWnQ4kDhc4atvRC8ZiWSe70P1lopYOvID94dqR4wZnaUDndtJTY2i4ZSRH56cDE2jDWb00wMELWqXvvNpfRMwCLd7Uq8Fzv0TiUjUTJfHUHZhjTNFW2ci1EeyzlnnfLCfzeSpjdR4n6nIFrqZt3EWD2rLXjo/MvK5T8IVDeYBIw+7OvnitXne778hxm6unlFO2fF151pG03K8UZs+4YrgaNjAIcOEyQAgDwkymfguIZUxP1XxIc9YHJXtsPwBymV1zXzicS5YWvUP80cKoCkqT3C7ARpJA9NxoQHJitbwk1mTJkb6T0y8EF2heJwmi2VjfyRT8C9KC9CnL79ILpJ1ShWyKWMoIkilN6XkCQ5VJIfiNeOLba5NzKn3XpM1Xbs1YhOj5bV3KAfZTmKPuP/6QMxva/gfxH67dWQCK9LBciRLurpRMkMH2e6PriktAUbXvcI8BX8j3XKvjKPzxUacUbOfy20blJJgkiD5syLUH43Tsq8O6uh4tvtCn9IhllTSlvIQ2pMh7hrMhiN20gxJnssOprvTDp1NoG5zGxGIkm+2pyvsgW63K5eKJj8KT8imGA30f3cVpkbgsqFzcyCLHXGqu+vujZqGtLBfkMyENgxS9GBfKmtCWMVrqtqQWv3GCWGSQAL4Hfkum6IGPyNNiIEyKOg9FoOriGRJONtMI9Sfqx87c/i3Uc0476BeVmiC75luQUClg9dGYT828x1mrhhZUb3GQg8/aWYstsFD2NeNmHhW0BwCSgN2GE/hDOe2Aam02KQ4mDH4YT36Rw3iV6J2thX//M76NP0uvyK9VfJmuL2CCxFZAK2o2Lo7YF4q8uy3DtWWjMElIgDGE3aL+IiA1yTwuIDUQmqb1TtbirgbFEL8FOLQWVlEvR8JjjJEGL1Gx07HsY4I11qp6LtKF+g7efHVAyBY3ry2MjIXg1Kzd/loi0fTpXM0F3r42398E+jVdmn4loTuTr/SjSYBx3hLCrJWQeNreOG/vaD+O8jzcIRddJ/i9Nkq4FchgXDAaMfbSuwCfIQgX1sQGlfSLrPm5pnqqLLHq22+tJKooBsgizM/v3KUH0kvXuZGCAYEcmsRi7L1QWhtVZZYCMH4fw4v1+cXFEglWtuqxsgbn7tyUNggF4c344E2ivmZh28zfap4ruJ3mefJmHb0xHzxQmpe/1/FcYAvMdgCPR8nOWKvd2u4Q5AjWW6wVCjubvVCxEATNw7ZULZtVCR7Dx8jPVPSi38/AiUZaRTea/CjU3WLNyuA+IetClCKoxiGxrNkIP80q9WXqGUE7ruvbXE46E/AcJ5464gGe9PI6cxv9C2Jo0WvJkxx8+OYiUIyPGAWKt/+Jw8CmqxUF6CddObAggQ/HWzs044WCCKK0jexSDjiMFqjV9d0SRNDp7XSuD9dWb0xzlQHOsG/I/GSbKtwGErVxJZpQZk0rftTiHKmhC69LYHspCnki1nsQtFQt5MmlGIPFtRDiwK/hcS1qX95vhBGWI/gmo692PRJ7gVEko/iB0/UNv8ykRaN949ucLhkssQhD0H8P2dmZDq23b5sG5UNDhTZ2VRZ5Otml0s1YKL04YarnfPu0tdUXlSxR6Z/rbjNM22OBf61Gebggu1LDjxs6G8yuGxwdnWNiyYX6M4yEuPAadqSBYKxAnFpW33mhox0MGSo5N0wNEszg2jHrv9O57p4onAvw9uE5LRD6Fx63X91Ad4ZijODiAneTNNK3Q52F4TH/o6VXy5TSpj5zNhYos7ak2S2TxTnQw3qxM4EU8Ebxyd+qwi3RG/mu/8KRwVPqKQ2TpZoIQl9O9A4/g0RKbYVkfN2Ww3s4XUi2TWDK1CJFVePVzQI5pbbsIdajQhO0Na076vorR6IImlWLfoIZY1l5+17y4jKAj0OWh8tQpMgqO+2GDffaJ4WmptjbwkuI0KTa4NRYlR96TNMZ4YeZ0qkSmAknJRY//MlVs1Mc3sfvMHfSqDZKqmci25Afe2CbkdNuyn9V9NOBrkRmVzlyKn6gGYJFOjIr028PmyUMDTOPLUcU+a0oi1AYpISNCfEmWBkkiFq6tHOgceHW26Kld6B5hOv9uNBK3FdaRhLUnh1g7fju1t/6qysIZn8uhFnzW7/w0/EsT/IPIpgyyFObmLCn1Gdh5m31k0dQ9YCbP76m4xtHkHXI0DNI2cjSP6ufbwGZpWDyO1wNs94ue4C78A634sr5kAi7Vmmxw9fa4+Oo84musxf6IshLivHFq9T7XwrZBK0NcJZFurvzogbA4wZxEPRJ+AKbbUHA1zE6HzrkSzOMsriQLERVo66/8bJ17MGmpAU7VLOx6S/8KA9gSdC3DyHCYjD1Cg6EH1plI+3HRKWPVXu9U42DpBNs49TiXmA65lN1JWj7wvAKaI7HRk815+su4uryGYJnu26zMusHGEzU9mZ/yva5CQ+/JUJSlBAt/wt2YD6HDeWQaW/GNGTTbzzwc3TQdTYEmd1z9T+0MmYsdDIY7GcH7/7nv5UtBo7Lo4hGEF9CJT0Nb3Wdimzrxqw3FPhWJXFFp5Iw/osODOB1OBcud+2ITVEBJQJ+ZcSHi1+ssZ7JfZ1sruTJ3AEc9Dg+HVMB0RGvGczhF21xiWqO5zEhNDGE/C+nAiJ1UU/hn+2HKfSdXdQChRF6JHXgNybnKcxVtPNII2WnrewbAyVm/Luv7bzqWbGW8THx/9CRg83lwse9qTKT6FyEzd9yOaLJUAu8N/JVGGXwdy4b7VZsboIeKwkVWMEe2zj955klUm8rvT4x8JoBmH8AHpERH4Gkp0qw2V8AHRLAKKI1xuZleCBwrwwUt/oK03pY4nnJYEwwbm42WeVz7fNKQOd5eCgprFR3w+1j3nByE0lw2024K7/V77OOB64LzE8zTAw33aYYctRGGjLMXdIytJCUGp4Y6twMy/IRFYaG6hEPz0DrLPhm6e09ljYsBV2cizf6JTK3Oegrhkdo6zSJbZtkvxo3Vakx9MlBZJs1QloNQTzjBw3SZ9aSlzJnRpZiaIMlG6ouL8GIFiBk0DaSIe6xaAy9U1k6jWE/9FXgYBJ7JGNEMUsaXKHRqgP5VOgf2yY/tTUN3JQNalPf0qrY30WRNrCj28i7o9lcHRDyT4oAh3kvnkHsM9mtV/+FIt8cOjIeIonxBs3tADAR2ai2I3blxga1nP/sw0Iod5jW+8pFt13t5vs+bpzjXDr6+aEli8Q0Sg3tvwyT5GlK+vSfZTtLg1/5rDo+0nYFqmBq+7G+Ki9+zJjHVzIZ7uEqmylrZO3ECpNBZAtKFFlGhXJWm8wHgG+qII1EFVKa7UNHlT/s3eaDwXwvla/UJ4THoTYEqLGWuphsESFRbD7SdQZp14muNq9RxfsPKN/sYzanPiTxM/frMvRTujqxxp8SnUWitYv/VWvyY22a3vMKui2WT1v312IV3l9bVaIdco25Q0lfrmxK/fx9UgDfEEXzlHlmdjeXJzh1Yix7pc81jQvjAuFq2ZQ2OJg6qY3rA9UGldiTFcXbz9H/ZNSRog/60138cq+ygMyDRjW/p5yj+8ehb1CBjRtWsQmjKUB70ZDm/h014sBj6ck61IRYLAUqo/9shSJhTd0YU7p93EwRteNdgC+PH4Bbggvg83y9s/brCgL5ba3koIu/pji04GgqS1HBfLYF+6IGgBRO+RNkK3pvKYf78CDVzV2CVPcolxlIpAYSHPk6lSSRzDXluVqLrVQHf+0L+HrfLdcS2Y1yQnq7DVaF/mbOzJ+pbWcs1fmib1AQp1kwQQn0PSO1/jSBrdcr78U/7WWqlJO0Y2+aw++49iXZ4d/gQ3+5nf8OUIyRujo2ufab7wOSUsHhrfm4JJkoFvE5Po98ZFExrOjfXh9rKqk2zMVyhdWSntqEyO+XirnRXHH5HBIc+/7SLfjVfmJ+Nynp+YpnBNV7qWE3xV3r5kZTtlFXd1hH27VTzWtyX4/Ty+SygJr2KklnJDU5RjrblsDcrcJlqLUdIO/XjuoAYT5SpAYJw+7IKMI4yB0Pf8ZsDN9lZsH7mTnwXkdT+DYZfDT5iJqokSDbGkRe1VGCNDRLM+WMBGj5Y6iutiaH96V9cJt6JawfbuqGf0MR/Q0JqS02IveuznyMkEX4QdF78P9LGoMfklheaqkIsh8P/WoKXaQN8TRXO4nIXHysC8OrPUaQRZa/5yHX63l3ykIg9mEdomiFWSxai0SQJYmV4hG8moSK8S03fM1kSpH02aValXXoiPmXpxFVN3ZPIOo0mSB1SGQSwI+7yDebqcVSkyPkkQT437EdqUeCez62VhFw5CAVvYbYEHVT1i53GHwZsS4mEcWdPNXCnehhW8hah6hdhesJRo0RmtZTSGBLJvA+MxTOXj18u2zCE2omoXArTxHvV5eE9HHqqKU+FUWq4l7Vt/AXRBmCnBCtXYe7RhIROAXIDbI5geg+vnswmp3sCGQ7EuhGat3VyhG3kMS1Hr7VpN4lhWFJGWRuHYHTrYuIUjPyIiR2h8P1ZsoEoVm56X7prhimL9bMepUlP6U+DD2FhIpmdcHIHKjGw1dT6Joo9eoOY2QIx1fs0sPgq0LkV1FsaJRC3wozV4xiKI+3XU2+etddyAxjGu+f6AIUVy9t4iMJCJA9rRojI12R0HXHR2rhW0gS3Rg5ioTaJlDRZEReYzzCu8ApABD48p74p9cXwrSmviGQkSvp1UKLLcNt5aNy1U1LbAMCgImH/4WzBJznkFcvWHH2S+AdQp4chlKAztOQXAMFyDxIAA==") format("woff2")}
.ti{font-family:"tabler-icons" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
.ti-address-book:before{content:"\f021"}.ti-adjustments-alt:before{content:"\ec37"}.ti-alert-circle:before{content:"\ea05"}.ti-alert-triangle:before{content:"\ea06"}.ti-align-center:before{content:"\ea07"}.ti-align-left:before{content:"\ea09"}.ti-align-right:before{content:"\ea0a"}.ti-apps:before{content:"\ebb6"}.ti-arrow-back-up:before{content:"\eb77"}.ti-arrow-down:before{content:"\ea16"}.ti-arrow-left:before{content:"\ea19"}.ti-arrow-right:before{content:"\ea1f"}.ti-arrow-up:before{content:"\ea25"}.ti-arrows-diagonal:before{content:"\ea27"}.ti-arrows-diagonal-minimize-2:before{content:"\ef38"}.ti-arrows-sort:before{content:"\eb5a"}.ti-arrows-vertical:before{content:"\eb5b"}.ti-ball-football:before{content:"\ee06"}.ti-baseline-density-medium:before{content:"\f9f1"}.ti-bolt:before{content:"\ea38"}.ti-briefcase:before{content:"\ea46"}.ti-building:before{content:"\ea4f"}.ti-building-bank:before{content:"\ebe2"}.ti-building-skyscraper:before{content:"\ec39"}.ti-bulb:before{content:"\ea51"}.ti-calculator:before{content:"\eb80"}.ti-calendar:before{content:"\ea53"}.ti-calendar-bolt:before{content:"\f822"}.ti-calendar-event:before{content:"\ea52"}.ti-calendar-off:before{content:"\ee1f"}.ti-calendar-plus:before{content:"\ebba"}.ti-calendar-stats:before{content:"\ee20"}.ti-camera:before{content:"\ea54"}.ti-cards:before{content:"\f510"}.ti-cash-off:before{content:"\f105"}.ti-certificate:before{content:"\ed76"}.ti-chart-bar:before{content:"\ea59"}.ti-chart-line:before{content:"\ea5c"}.ti-check:before{content:"\ea5e"}.ti-checks:before{content:"\ebaa"}.ti-chevron-down:before{content:"\ea5f"}.ti-chevron-left:before{content:"\ea60"}.ti-chevron-right:before{content:"\ea61"}.ti-circle-check:before{content:"\ea67"}.ti-clipboard-check:before{content:"\ea6c"}.ti-clipboard-list:before{content:"\ea6d"}.ti-clipboard-text:before{content:"\f089"}.ti-clock:before{content:"\ea70"}.ti-clock-hour-4:before{content:"\f319"}.ti-cloud:before{content:"\ea76"}.ti-cloud-rain:before{content:"\ea72"}.ti-cloud-storm:before{content:"\ea74"}.ti-coin:before{content:"\eb82"}.ti-columns:before{content:"\eb83"}.ti-copy:before{content:"\ea7a"}.ti-currency-dollar:before{content:"\eb84"}.ti-currency-dollar-off:before{content:"\f3dc"}.ti-current-location:before{content:"\ecef"}.ti-cut:before{content:"\ea86"}.ti-database-export:before{content:"\ee6e"}.ti-device-floppy:before{content:"\eb62"}.ti-device-gamepad-2:before{content:"\f1d2"}.ti-dots:before{content:"\ea95"}.ti-download:before{content:"\ea96"}.ti-droplet:before{content:"\ea97"}.ti-edit:before{content:"\ea98"}.ti-edit-circle:before{content:"\ee85"}.ti-equal:before{content:"\ee87"}.ti-external-link:before{content:"\ea99"}.ti-eye:before{content:"\ea9a"}.ti-eye-off:before{content:"\ecf0"}.ti-file:before{content:"\eaa4"}.ti-file-description:before{content:"\f028"}.ti-file-import:before{content:"\edea"}.ti-file-pencil:before{content:"\f039"}.ti-file-plus:before{content:"\eaa0"}.ti-file-spreadsheet:before{content:"\f03e"}.ti-file-text:before{content:"\eaa2"}.ti-file-type-doc:before{content:"\fb0a"}.ti-file-type-pdf:before{content:"\fb10"}.ti-files:before{content:"\edef"}.ti-flag:before{content:"\eaa6"}.ti-flame:before{content:"\ec2c"}.ti-flask:before{content:"\ebd2"}.ti-folder:before{content:"\eaad"}.ti-folder-plus:before{content:"\eaab"}.ti-forbid-2:before{content:"\ebd4"}.ti-hash:before{content:"\eabc"}.ti-history:before{content:"\ebea"}.ti-home:before{content:"\eac1"}.ti-home-2:before{content:"\eac0"}.ti-id-badge:before{content:"\eff7"}.ti-info-circle:before{content:"\eac5"}.ti-key:before{content:"\eac7"}.ti-layout-dashboard:before{content:"\f02c"}.ti-layout-distribute-horizontal:before{content:"\ead5"}.ti-layout-grid:before{content:"\edba"}.ti-license:before{content:"\ebc0"}.ti-link:before{content:"\eade"}.ti-list:before{content:"\eb6b"}.ti-list-check:before{content:"\eb6a"}.ti-list-details:before{content:"\ef40"}.ti-list-numbers:before{content:"\ef11"}.ti-loader-2:before{content:"\f226"}.ti-lock:before{content:"\eae2"}.ti-logout:before{content:"\eba8"}.ti-mail:before{content:"\eae5"}.ti-mail-exclamation:before{content:"\f93e"}.ti-mail-forward:before{content:"\eeac"}.ti-map:before{content:"\eae9"}.ti-map-2:before{content:"\eae7"}.ti-map-pin:before{content:"\eae8"}.ti-map-pin-exclamation:before{content:"\f951"}.ti-map-pin-off:before{content:"\ecf3"}.ti-medal:before{content:"\ec78"}.ti-minus:before{content:"\eaf2"}.ti-mist:before{content:"\ec30"}.ti-mood-smile:before{content:"\eaf7"}.ti-movie:before{content:"\eafa"}.ti-palette:before{content:"\eb01"}.ti-paperclip:before{content:"\eb02"}.ti-pencil:before{content:"\eb04"}.ti-pin:before{content:"\ec9c"}.ti-player-play-filled:before{content:"\f691"}.ti-player-skip-forward:before{content:"\ed49"}.ti-plus:before{content:"\eb0b"}.ti-printer:before{content:"\eb0e"}.ti-refresh:before{content:"\eb13"}.ti-repeat:before{content:"\eb72"}.ti-report-money:before{content:"\eecd"}.ti-rocket:before{content:"\ec45"}.ti-rotate:before{content:"\eb16"}.ti-school:before{content:"\ecf7"}.ti-search:before{content:"\eb1c"}.ti-search-off:before{content:"\f19c"}.ti-send:before{content:"\eb1e"}.ti-send-2:before{content:"\fd5d"}.ti-shield-check:before{content:"\eb22"}.ti-shield-lock:before{content:"\ed58"}.ti-snowflake:before{content:"\ec0b"}.ti-star:before{content:"\eb2e"}.ti-star-filled:before{content:"\f6a6"}.ti-sun:before{content:"\eb30"}.ti-table:before{content:"\eba1"}.ti-table-off:before{content:"\eefa"}.ti-tag:before{content:"\eb34"}.ti-temperature:before{content:"\eb38"}.ti-template:before{content:"\eb39"}.ti-timeline:before{content:"\f031"}.ti-trash:before{content:"\eb41"}.ti-trending-down:before{content:"\eb42"}.ti-trending-up:before{content:"\eb43"}.ti-upload:before{content:"\eb47"}.ti-user:before{content:"\eb4d"}.ti-user-check:before{content:"\eb49"}.ti-user-circle:before{content:"\ef68"}.ti-user-plus:before{content:"\eb4b"}.ti-user-shield:before{content:"\f7d0"}.ti-users:before{content:"\ebf2"}.ti-users-group:before{content:"\fa21"}.ti-wind:before{content:"\ec34"}.ti-world:before{content:"\eb54"}.ti-x:before{content:"\eb55"}.ti-zoom-in:before{content:"\eb56"}

/* ---- bloque 2 (era linea 67 de index.html) ---- */

/* Google Fonts @import removed: --font-sans is a system-font stack that lists
   'Inter' 10th (so it only ever applied on machines with no system UI font),
   and --font-mono is defined as var(--font-sans), so JetBrains Mono was never
   used at all. The import cost a render-blocking cross-origin request for up
   to 11 font files that the design does not depend on. A locally installed
   Inter is still picked up by the stack. */
*{box-sizing:border-box;margin:0;padding:0}

/* ══════════════════════════════════════
   macOS TAHOE — LIQUID GLASS (default: light)
══════════════════════════════════════ */
:root{
  /* The inset that makes the sidebar float rather than sit against the edge.
     It is taken out of --nav-w, not added to it, so the space every screen
     reserves is the whole of what the sidebar occupies. */
  --nav-gap:10px;
  --nav-glass:linear-gradient(165deg,rgba(14,19,33,0.82) 0%,rgba(10,14,26,0.88) 100%);
  /* The pinned sidebar's width. Named because it is also the offset every
     screen has to leave for it — those were six separate 234s before, which is
     six chances to move one and not the others. Narrowed from 234 to 196:
     nothing in it needed the extra 38px, and every screen gets them back. */
  --nav-w:196px;
  /* ── Identity & category palette — shared by Weekly Meeting, Documents, Directory ── */
  --pal-red:#e85d5d;--pal-pink:#e8618c;--pal-orange:#eb9447;--pal-amber:#e0b34c;--pal-green:#48bd78;--pal-teal:#3cb2c4;--pal-cyan:#4fc3e8;--pal-blue:#4a90e0;--pal-indigo:#6f6de0;--pal-purple:#a05fd0;--pal-slate:#8a8f99;
  /* The actual brand blue — matches <meta name="theme-color"> in index.html.
     Same in both themes (unlike --accent, which shifts per theme), and used
     for effects like the login mark's glow rather than for text/borders. */
  --brand-blue:#0066FF;--brand-blue-rgb:0,102,255;
  /* The Marketing workspace's own accent — unrelated to --role-marketing
     (that one colours the "Marketing" role badge/avatar everywhere else in
     the app). This is the exact colour asked for the lobby card, its
     landing page and everything built inside that section. Same in both
     themes, like --brand-blue, since it identifies the section rather than
     reading as body text. */
  --marketing-accent:#9DC6D8;--marketing-accent-deep:#398AAC;

  color-scheme: light;
  /* ── LIGHT THEME: Apple-neutral · Rivian Forest ── */
  --bg:#f3efe7;
  --bg-mesh:
    url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%201600%20520%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22xMidYMax%20slice%22%3E%0A%3Cpath%20d%3D%22M0%2C520%20L0%2C300%20L180%2C200%20L320%2C270%20L470%2C150%20L640%2C265%20L790%2C185%20L950%2C280%20L1100%2C200%20L1280%2C290%20L1440%2C225%20L1600%2C285%20L1600%2C520%20Z%22%20fill%3D%22rgba%28139%2C132%2C142%2C0.26%29%22/%3E%0A%3Cpath%20d%3D%22M0%2C520%20L0%2C360%20L200%2C265%20L360%2C330%20L540%2C235%20L720%2C340%20L900%2C265%20L1090%2C355%20L1270%2C285%20L1450%2C360%20L1600%2C320%20L1600%2C520%20Z%22%20fill%3D%22rgba%2896%2C96%2C114%2C0.40%29%22/%3E%0A%3Cpath%20d%3D%22M0%2C360%20L200%2C265%20L360%2C330%20L540%2C235%20L720%2C340%20L900%2C265%20L1090%2C355%20L1270%2C285%20L1450%2C360%20L1600%2C320%22%20fill%3D%22none%22%20stroke%3D%22rgba%28255%2C246%2C230%2C0.60%29%22%20stroke-width%3D%221.5%22%20stroke-linejoin%3D%22round%22/%3E%0A%3Cpath%20d%3D%22M0%2C520%20L0%2C420%20L240%2C330%20L430%2C400%20L640%2C315%20L860%2C415%20L1060%2C345%20L1280%2C425%20L1480%2C370%20L1600%2C405%20L1600%2C520%20Z%22%20fill%3D%22rgba%2856%2C60%2C82%2C0.56%29%22/%3E%0A%3Cpath%20d%3D%22M0%2C420%20L240%2C330%20L430%2C400%20L640%2C315%20L860%2C415%20L1060%2C345%20L1280%2C425%20L1480%2C370%20L1600%2C405%22%20fill%3D%22none%22%20stroke%3D%22rgba%28255%2C248%2C235%2C0.92%29%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22/%3E%0A%3C/svg%3E"),
    radial-gradient(ellipse 90% 60% at 78% 100%, rgba(214,164,94,0.30) 0%, transparent 62%),
    radial-gradient(ellipse 70% 50% at 15% 10%, rgba(96,126,178,0.13) 0%, transparent 60%),
    linear-gradient(160deg,#faf7f1 0%,#f3efe7 45%,#ebe3d4 75%,#e0d5c2 100%);
  /* Liquid Glass — crisp white */
  --glass:rgba(255,255,255,0.26);
  --glass2:rgba(255,255,255,0.40);
  --glass3:rgba(255,255,255,0.14);
  /* This token started at 0.90, which let a tenth of the backdrop through —
     not glass, a white card with a blur computed underneath it and then
     covered up. Eight surfaces sit on it (panels, KPI tiles, modals, the
     meeting entries, the account card, directory and document groups).
     0.66 made the two themes the same material; 0.34 is where the 44px blur
     and the page behind it are actually the thing you see, which is what the
     specular edge below is sized against — a thin fill needs a bright lip or
     the pane stops having an edge at all. */
  --glass-card:rgba(255,255,255,0.34);
  /* Borders — neutral graphite */
  --border:rgba(30,30,26,0.12);
  --border2:rgba(22,58,102,0.36);
  --border3:rgba(30,30,26,0.08);
  /* Blur */
  /* One glass recipe, not four. --blur and --blur2 were two, .avp-card set its
     own blur(12px), and .tut-slide had none at all — so the analyzer card, the
     one people look at most, was visibly a different material from everything
     around it without anything saying why. --blur2 is kept as a name because
     it is spelled at forty-odd call sites; it is the same recipe now. */
  --blur:saturate(200%) blur(44px);
  /* Specular. Glass reads as glass because of its EDGE — the bright line
     where light catches the lip, and the darker one underneath where it does
     not. Both are inset: an outward spread on an element that also has
     backdrop-filter paints as a rectangle in Chromium and squares off the
     corner (see .avp-card.incomplete, which learned this the hard way). */
  --spec-top:rgba(255,255,255,0.98);
  --spec-bottom:rgba(12,14,22,0.10);
  --spec-sheen:rgba(255,255,255,0.52);
  --blur2:var(--blur);
  /* Text — high contrast near-black */
  --text:#111110;
  --text2:#33332f;
  --text3:#6e6e68;
  /* Accent — deep navy blue */
  --accent:#163a66;
  --accent2:#2f6faa;
  --accent-soft:rgba(22,58,102,0.10);
  /* The tile the NovaIS mark sits on. The artwork carries its own alpha now,
     so this is no longer standing in for a background baked into the file —
     it is glass, and it is meant to be seen through. Opaque, it read as a
     black sticker somebody had pressed onto the page. */
  --brand-plate:rgba(8,14,30,0.26);
  --blue-glow:rgba(22,58,102,0.18);
  --blue-glow2:rgba(22,58,102,0.09);
  /* Semantic */
  --success:#1a8f3a;
  --success-soft:rgba(26,143,58,0.10);
  --success-border:rgba(26,143,58,0.28);
  --warn:#c06800;
  --warn-soft:rgba(192,104,0,0.10);
  --warn-border:rgba(192,104,0,0.28);
  --danger:#c42535;
  --danger-soft:rgba(196,37,53,0.08);
  --danger-border:rgba(196,37,53,0.26);
  /* Role colours — single source of truth. Consumed by the .role-* badges,
     the profile avatar, and the directory, so a role reads the same colour
     everywhere in the app. */
  --role-admin:#2196f3;
  --role-underwriter:#34d98d;
  --role-salesrep:#f2a93b;
  --role-marketing:#e05d9c;
  --role-manager:#3ba3c9;
  --role-vpso:#c9a83b;
  --role-acctmgmt:#a066f0;
  --role-readonly:#888888;
  /* Shape */
  --r:16px;--r-sm:10px;--r-lg:20px;--r-xl:26px;
  /* Content column. Fifteen screens were setting nine different max-widths
     between them — 760, 800, 860, 980, 1080, 1100, 1180, 1280, 1400 — so the
     content shrank and stretched as you moved around, for no reason a reader
     could see. Three widths, chosen by what the screen holds:
       narrow — a single column of form fields or prose, where a longer line
                is harder to read rather than easier
       std    — the default; cards, lists, anything mixed
       wide   — tables and dashboards, which are the only things that genuinely
                need the room */
  --col-narrow:760px;--col-std:1080px;--col-wide:1280px;
  /* Motion. Durations were 0.1, 0.12, 0.15, 0.18, 0.2, 0.22, 0.26 and 0.55s
     across thirty button classes, and most of those were written as a bare
     `transition: 0.15s`, which animates every property including layout. Two
     speeds: one for a control answering a pointer, one for something moving
     on the page. */
  --dur-fast:.15s;--dur:.22s;
  /* Typography */
  --font-mono:var(--font-sans);
  /* Shadows */
  --shadow:0 4px 24px rgba(10,20,35,0.07),0 1px 6px rgba(0,0,0,0.05),inset 0 1px 0 rgba(255,255,255,1.00);
  --shadow-lg:0 12px 48px rgba(10,20,35,0.10),0 4px 14px rgba(0,0,0,0.07),inset 0 1px 0 rgba(255,255,255,1.00);
  /* Same recipe as --shadow/--shadow-lg above in this (light) theme — .avp-card
     only needs its own token where the two diverge, in dark theme below. */
  --avp-shadow:var(--shadow);
  --avp-shadow-lg:var(--shadow-lg);
  --inner:inset 0 1px 0 rgba(255,255,255,1.00),inset 0 0 0 0.5px rgba(255,255,255,0.40);
  /* The floating-panel recipe #widget-dropdown and #calc-widget each hand-
     wrote separately (same blur radius family, same inset highlight, just
     independently retyped) — one name for the two of them. */
  --shadow-float:0 12px 40px rgba(0,0,0,0.14),inset 0 1px 0 rgba(255,255,255,0.65);
  --select-opt-bg:#f7f6f2;
  --scroll-thumb:rgba(22,58,102,0.22);
  --input-bg:rgba(255,255,255,0.95);
  --bg-mesh-size:100% auto,auto,auto,auto;
  --bg-mesh-pos:bottom center,0% 0%,0% 0%,0% 0%;
  --bg-mesh-repeat:no-repeat,no-repeat,no-repeat,no-repeat;
}

/* ══════════════════════════════════════
   macOS TAHOE — DARK MODE
══════════════════════════════════════ */
[data-theme="dark"]{
  color-scheme: dark;
  /* ── DARK THEME: Apple Near-Black · Electric Blue Glow ── */
  --bg:#050810;
  --bg-mesh:
    url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%201600%20520%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22xMidYMax%20slice%22%3E%0A%3Cpath%20d%3D%22M0%2C520%20L0%2C300%20L180%2C200%20L320%2C270%20L470%2C150%20L640%2C265%20L790%2C185%20L950%2C280%20L1100%2C200%20L1280%2C290%20L1440%2C225%20L1600%2C285%20L1600%2C520%20Z%22%20fill%3D%22rgba%2826%2C38%2C60%2C0.55%29%22/%3E%0A%3Cpath%20d%3D%22M0%2C520%20L0%2C360%20L200%2C265%20L360%2C330%20L540%2C235%20L720%2C340%20L900%2C265%20L1090%2C355%20L1270%2C285%20L1450%2C360%20L1600%2C320%20L1600%2C520%20Z%22%20fill%3D%22rgba%2813%2C21%2C38%2C0.82%29%22/%3E%0A%3Cpath%20d%3D%22M0%2C360%20L200%2C265%20L360%2C330%20L540%2C235%20L720%2C340%20L900%2C265%20L1090%2C355%20L1270%2C285%20L1450%2C360%20L1600%2C320%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.22%29%22%20stroke-width%3D%221.5%22%20stroke-linejoin%3D%22round%22/%3E%0A%3Cpath%20d%3D%22M0%2C520%20L0%2C420%20L240%2C330%20L430%2C400%20L640%2C315%20L860%2C415%20L1060%2C345%20L1280%2C425%20L1480%2C370%20L1600%2C405%20L1600%2C520%20Z%22%20fill%3D%22rgba%285%2C9%2C18%2C0.95%29%22/%3E%0A%3Cpath%20d%3D%22M0%2C420%20L240%2C330%20L430%2C400%20L640%2C315%20L860%2C415%20L1060%2C345%20L1280%2C425%20L1480%2C370%20L1600%2C405%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.38%29%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22/%3E%0A%3C/svg%3E"),
    radial-gradient(ellipse 90% 60% at 78% 100%, rgba(255,170,90,0.20) 0%, transparent 60%),
    radial-gradient(ellipse 70% 50% at 15% 10%, rgba(77,143,230,0.24) 0%, transparent 60%),
    linear-gradient(160deg,#050810 0%,#0c1626 45%,#182338 75%,#26364f 100%);
  --bg-mesh-size:100% auto,auto,auto,auto;
  --bg-mesh-pos:bottom center,0% 0%,0% 0%,0% 0%;
  --bg-mesh-repeat:no-repeat,no-repeat,no-repeat,no-repeat;
  /* Liquid Glass dark.
     Thinner fills and a brighter edge. What makes a pane read as glass on a
     dark page is not more white in the fill — that just fogs it — but the
     page showing through it and a lip catching light at the rim. So the
     fills come down, the blur goes up (more of the background is gathered
     and smeared behind the pane, which is what depth looks like), and the
     specular lip below carries the edge. */
  --glass:rgba(255,255,255,0.028);
  --glass2:rgba(255,255,255,0.055);
  --glass3:rgba(255,255,255,0.020);
  --glass-card:rgba(13,20,34,0.22);
  /* Lighter than the page rather than darker, like every other glass surface
     in dark theme — a darker tile on a dark page is a hole, not a pane. */
  --brand-plate:rgba(150,190,255,0.07);
  /* Borders — blue glow. Lifted alongside the thinner fills: a 0.20 rim
     around a pane you can now see straight through left the pane with no
     edge at all. */
  --border:rgba(120,175,245,0.26);
  --border2:rgba(120,175,245,0.42);
  --border3:rgba(120,175,245,0.15);
  /* Blur */
  /* One glass recipe, not four. --blur and --blur2 were two, .avp-card set its
     own blur(12px), and .tut-slide had none at all — so the analyzer card, the
     one people look at most, was visibly a different material from everything
     around it without anything saying why. --blur2 is kept as a name because
     it is spelled at forty-odd call sites; it is the same recipe now. */
  --blur:saturate(235%) blur(56px);
  /* Dimmer than light mode's: a white lip at 0.9 on a dark card reads as a
     drawn outline rather than as light catching an edge. Raised with the
     thinner fill above, which took contrast out of the rim along with the
     body — the lip is now doing most of the work of saying where the pane
     ends. */
  --spec-top:rgba(255,255,255,0.46);
  --spec-bottom:rgba(0,0,0,0.46);
  --spec-sheen:rgba(255,255,255,0.24);
  --blur2:var(--blur);
  /* Text */
  --text:#f5f5f2;
  --text2:rgba(245,245,242,0.90);
  --text3:rgba(245,245,242,0.60);
  /* Accent — electric blue */
  --accent:#4d8fe6;
  --accent2:#82b6f2;
  --accent-soft:rgba(77,143,230,0.14);
  --blue-glow:rgba(77,143,230,0.22);
  --blue-glow2:rgba(77,143,230,0.11);
  /* Semantic */
  --success:#32d74b;
  --success-soft:rgba(50,215,75,0.12);
  --success-border:rgba(50,215,75,0.28);
  --warn:#ff9f0a;
  --warn-soft:rgba(255,159,10,0.12);
  --warn-border:rgba(255,159,10,0.28);
  --danger:#ff453a;
  --danger-soft:rgba(255,69,58,0.12);
  --danger-border:rgba(255,69,58,0.28);
  /* Shape */
  --r:16px;--r-sm:10px;--r-lg:20px;--r-xl:26px;
  /* Content column. Fifteen screens were setting nine different max-widths
     between them — 760, 800, 860, 980, 1080, 1100, 1180, 1280, 1400 — so the
     content shrank and stretched as you moved around, for no reason a reader
     could see. Three widths, chosen by what the screen holds:
       narrow — a single column of form fields or prose, where a longer line
                is harder to read rather than easier
       std    — the default; cards, lists, anything mixed
       wide   — tables and dashboards, which are the only things that genuinely
                need the room */
  --col-narrow:760px;--col-std:1080px;--col-wide:1280px;
  /* Motion. Durations were 0.1, 0.12, 0.15, 0.18, 0.2, 0.22, 0.26 and 0.55s
     across thirty button classes, and most of those were written as a bare
     `transition: 0.15s`, which animates every property including layout. Two
     speeds: one for a control answering a pointer, one for something moving
     on the page. */
  --dur-fast:.15s;--dur:.22s;
  /* Shadows */
  --shadow:0 4px 24px rgba(0,0,0,0.50),0 1px 6px rgba(0,0,0,0.30),inset 0 1px 0 rgba(77,143,230,0.09);
  --shadow-lg:0 12px 48px rgba(0,0,0,0.65),0 4px 14px rgba(0,0,0,0.38),inset 0 1px 0 rgba(77,143,230,0.13);
  /* --shadow/--shadow-lg above read as a heavy black halo under a card this
     size in this theme — fine on the smaller floating surfaces (dropdowns,
     the calculator) that also use them, glaring under the Analyzer's own
     section cards, most visible on the four that start with an added
     .incomplete ring (Risk description, Experience mod & estimated premium,
     Yes/No questions, Loss history — see .avp-card.incomplete below). A
     softer pair scoped to .avp-card only, rather than dimming --shadow
     itself and rippling into every other surface that shares it. */
  --avp-shadow:0 4px 16px rgba(0,0,0,0.20),0 1px 4px rgba(0,0,0,0.14),inset 0 1px 0 rgba(77,143,230,0.09);
  --avp-shadow-lg:0 10px 32px rgba(0,0,0,0.28),0 3px 10px rgba(0,0,0,0.18),inset 0 1px 0 rgba(77,143,230,0.13);
  --inner:inset 0 1px 0 rgba(77,143,230,0.13),inset 0 0 0 0.5px rgba(77,143,230,0.07);
  --shadow-float:0 12px 40px rgba(0,0,0,0.52),inset 0 1px 0 rgba(255,255,255,0.10);
  --select-opt-bg:#0d1421;
  --scroll-thumb:rgba(77,143,230,0.24);
  --input-bg:rgba(255,255,255,0.08);
}

/* ══ THEME TRANSITION ══ */
*,*::before,*::after{
  transition:background-color .35s var(--ease-out),
             border-color .35s var(--ease-out),
             color .35s var(--ease-out),
             box-shadow .35s var(--ease-out),
             backdrop-filter .35s;
}
/* Exclude transitions that break animations */
.amb,.prog-fill{
  transition:none!important;
}

html{
  background:var(--bg);
  background-image:var(--bg-mesh);
  background-attachment:fixed;
  background-repeat:var(--bg-mesh-repeat);
  background-position:var(--bg-mesh-pos);
  background-size:var(--bg-mesh-size);
  min-height:100vh;
  /* iPad safe area */
  padding-left:env(safe-area-inset-left);
  padding-right:env(safe-area-inset-right);
  /* No transition declared here on purpose: html still matches the
     *,*::before,*::after rule above, which is where the page's one theme
     timing lives. A 3s override used to sit here — ten times slower than
     everything else the toggle touches — so the page's own background kept
     fading for two and a half seconds after every card, border and line of
     text had already finished, reading as unfinished rather than smooth. */
}
body{
  font-family:var(--font-sans);
  color:var(--text);
  min-height:100vh;
  /* iOS momentum scroll */
  -webkit-overflow-scrolling:touch;
}
::-webkit-scrollbar{width:5px}
::-webkit-scrollbar-track{background:rgba(0,0,0,0.04)}
::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:3px}

/* ══ THEME TOGGLE SLIDER ══ */
.theme-toggle{
  position:relative;
  width:50px;height:28px;border-radius:14px;
  background:rgba(130,182,242,0.30);
  border:0.5px solid var(--border);
  cursor:pointer;flex-shrink:0;min-width:50px;
  box-shadow:inset 0 1px 3px rgba(0,0,0,0.12),0 1px 0 rgba(255,255,255,0.50);
  /* No text content — icon handled by ::after */
  font-size:0;color:transparent;
  padding:0;
  /* Smooth background transition. transform is named too so the press every
     <button> gets (button:active, further up) eases in like everywhere else
     rather than snapping — the knob's own slide is on ::before and is not
     affected by this. */
  transition:background 0.32s var(--ease-out), border-color 0.32s, box-shadow 0.32s,
             transform var(--dur-fast) var(--ease-out);
}
/* Knob */
.theme-toggle::before{
  content:'';
  position:absolute;top:3px;left:3px;
  width:22px;height:22px;border-radius:50%;
  background:#ffffff;
  box-shadow:0 1px 5px rgba(0,0,0,0.28);
  transition:transform 0.32s var(--ease-out) !important;
}
/* Icon */
.theme-toggle::after{
  content:'🌙';
  position:absolute;right:6px;top:50%;
  transform:translateY(-50%);
  font-size:12px;line-height:1;
  pointer-events:none;
  transition:opacity 0.2s;
}
/* Dark state */
[data-theme="dark"] .theme-toggle{
  background:var(--accent);
  box-shadow:inset 0 1px 3px rgba(0,0,0,0.25),0 0 0 1px var(--accent);
}
[data-theme="dark"] .theme-toggle::before{transform:translateX(22px)}
[data-theme="dark"] .theme-toggle::after{content:'☀️';right:auto;left:6px}
.theme-toggle:active::before{width:26px}

/* ── AMBIENT — Tahoe wallpaper orbs ── */
.amb{position:fixed;pointer-events:none;border-radius:50%;z-index:0;will-change:transform}
.amb1{width:900px;height:900px;background:radial-gradient(circle,rgba(1577,143,230,0.45) 0%,transparent 65%);top:-20%;left:-15%;animation:drift1 20s ease-in-out infinite alternate}
.amb2{width:700px;height:700px;background:radial-gradient(circle,rgba(255,160,120,0.30) 0%,transparent 65%);bottom:-15%;right:-10%;animation:drift2 25s ease-in-out infinite alternate}
.amb3{width:500px;height:500px;background:radial-gradient(circle,rgba(200,160,255,0.28) 0%,transparent 65%);top:40%;left:50%;animation:drift3 18s ease-in-out infinite alternate}
[data-theme="dark"] .amb1{background:radial-gradient(circle,rgba(40,60,100,0.50) 0%,transparent 65%)}
[data-theme="dark"] .amb2{background:radial-gradient(circle,rgba(60,40,90,0.35) 0%,transparent 65%)}
[data-theme="dark"] .amb3{background:radial-gradient(circle,rgba(30,30,60,0.28) 0%,transparent 65%)}
@keyframes drift1{to{transform:translate(60px,40px) scale(1.1)}}
@keyframes drift2{to{transform:translate(-50px,-30px) scale(1.08)}}
@keyframes drift3{to{transform:translate(30px,60px) scale(0.95)}}

/* ══════════════════════════════════════════
   LANDING
══════════════════════════════════════════ */
#landing{
  min-height:100vh;display:none;align-items:center;justify-content:center;
  padding:2rem;position:relative;overflow:hidden;z-index:1;
}

/* ── ANIMATIONS ── */
@keyframes fadeDown{from{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}

/* ══════════════════════════════════════════
   APP SHELL
══════════════════════════════════════════ */
#app{display:none;position:relative;z-index:1}
.page{max-width:var(--col-std);margin:0 auto;padding:0 0 5rem}

/* ── TOPBAR ── */
.topbar{
  position:sticky;
  top:10px;
  z-index:100;
  /* Floating: detached from edges, safe-area in margin */
  margin:calc(10px + env(safe-area-inset-top)) 14px 0;
  border-radius:var(--r-lg);
  background:var(--glass-card);
  backdrop-filter:saturate(220%) blur(48px);
  -webkit-backdrop-filter:saturate(220%) blur(48px);
  border:0.5px solid var(--border);
  padding:.60rem 1.25rem;
  display:flex;align-items:center;justify-content:space-between;
  box-shadow:
    0 8px 40px rgba(0,0,0,0.30),
    0 2px 8px  rgba(0,0,0,0.22),
    inset 0 1px 0 rgba(77,143,230,0.12),
    inset 0 0 0 0.5px rgba(0,180,255,0.14);
}
.topbar::after{content:none}
.tbar-logo{display:flex;align-items:center;gap:10px}
.tbar-mark{width:28px;height:28px;border-radius:7px;background:var(--brand-plate);border:0.5px solid var(--border2);display:flex;align-items:center;justify-content:center;box-shadow:var(--inner);backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur)}
.tbar-name{font-size:13px;font-weight:500;color:var(--text);letter-spacing:-.02em}.tbar-badges{display:flex;align-items:center;gap:8px}

/* ── MAIN ── */
.main{padding:1.5rem}

/* Same glass as .avp-card. It already had the tint, the blur and the border,
   but not the two things that actually make the material read: the light
   falling across the top, and the lift under the cursor. Beside a column of
   cards that have both, it looked like a flat panel someone forgot. */
.prog-wrap{
  background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-lg);
  padding:16px 20px;margin-bottom:1.5rem;
  backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  box-shadow:var(--shadow);
  animation:fadeDown .5s ease both;
  transition:border-color .25s var(--ease-out),box-shadow .25s var(--ease-out),transform .25s var(--ease-out);
  position:relative;overflow:hidden;
}
.prog-wrap::before{content:'';position:absolute;top:0;left:0;right:0;height:40%;background:linear-gradient(180deg,rgba(77,143,230,0.08) 0%,rgba(0,100,200,0.03) 40%,transparent 80%);pointer-events:none}
.prog-wrap:hover{border-color:rgba(77,143,230,0.45);box-shadow:var(--shadow-lg);transform:translateY(-1px)}
@media(prefers-reduced-motion:reduce){.prog-wrap{transition:border-color .15s,box-shadow .15s}.prog-wrap:hover{transform:none}}
/* The bar and the rows sit above the sheen, not under it. */
.prog-wrap > *{position:relative}
.prog-row{display:flex;align-items:center;gap:12px;margin-bottom:10px}
.prog-bar{flex:1;height:4px;background:var(--accent-soft);border-radius:99px;overflow:hidden}
.prog-fill{height:100%;background:linear-gradient(90deg,var(--accent),#7b61ff);border-radius:99px;transition:width .4s var(--ease-out);box-shadow:0 0 8px var(--blue-glow)}
.prog-pct{font-size:12px;font-weight:700;color:var(--accent);min-width:44px;text-align:right}
.prog-stats{display:flex;gap:6px;flex-wrap:wrap}
.pstat{font-size:11px;font-weight:600;padding:3px 11px;border-radius:99px;letter-spacing:.02em}
.pstat.tot{background:rgba(140,170,220,0.08);color:var(--text3);border:1px solid var(--border3)}
.pstat.done{background:var(--success-soft);color:var(--success);border:1px solid var(--success-border)}
.pstat.rem{background:var(--warn-soft);color:var(--warn);border:1px solid var(--warn-border)}

/* ── WEEKLY MEETING SCREEN ── */
#meeting-screen{display:none;min-height:100vh;background:var(--bg);background-image:var(--bg-mesh);background-attachment:fixed;background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);padding:0 0 60px}
/* The floating, detached bar — rounded, inset from the edges, sitting above the
   content rather than welded to the top of the window. It used to be scoped to
   #sales-admin-screen, so UWing Assistance floated and the other twelve screens
   wearing the same bar were square and edge-to-edge. One design, one rule. */
.wm-topbar{
  position:sticky;
  /* top and padding match .topbar (the Analyzer's own bar) exactly, so the
     two read as the same bar rather than two similar ones — the one visual
     difference a side-by-side made obvious. margin-bottom stays: that is the
     gap to the screen's content, not the bar's own size. */
  top:10px;
  z-index:50;
  display:flex;
  align-items:center;
  gap:12px;
  padding:.60rem 1.25rem;
  margin:14px 16px 30px;
  background:var(--glass-card);
  border:0.5px solid var(--border);
  border-radius:var(--r-lg);
  backdrop-filter:saturate(220%) blur(40px);
  -webkit-backdrop-filter:saturate(220%) blur(40px);
  box-shadow:
    0 10px 36px rgba(0,0,0,0.20),
    0 2px 10px rgba(0,0,0,0.14),
    inset 0 1px 0 rgba(255,255,255,0.10);
}

.wm-back{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;
  color:#fff;background:var(--accent);border:none;
  border-radius:var(--r-lg);padding:6px 14px;cursor:pointer;font-family:inherit;
  transition:background .15s,box-shadow .15s;letter-spacing:.01em;
  box-shadow:0 2px 8px rgba(var(--brand-blue-rgb),0.22)}
.wm-back:hover{background:#0052d9;box-shadow:0 4px 14px rgba(var(--brand-blue-rgb),0.34)}
.wm-back:active{transform:scale(.97)}

/* An action placed in a top bar takes the bar's proportions. .avp-btn is built
   for a card, where it sits alone and can be tall; in the bar it was 10px
   taller than Home, which is why David Tracker and Calendar measured 74px while
   every other screen measured 64. */
.wm-topbar .avp-btn{
  padding:6px 14px; font-size:11px; border-radius:var(--r-lg); line-height:1.35;
}
/* The 44px floor on buttons is the minimum comfortable tap target, and it holds
   everywhere a finger might be the input. Past 1100px — wider than any tablet
   held upright — it is 16px of nothing, and in a top bar that is the difference
   between a 64px bar and a 74px one, which is why David Tracker and Calendar,
   the two screens that put actions up there, stood taller than every other
   screen.
   Keyed on width rather than (pointer: fine), which reads truer but which
   headless Chromium reports as `none`, so the rule could not be verified. A
   width query is what the rest of this file already uses and what the check can
   actually measure. */
@media (min-width:1100px){
  .wm-topbar .avp-btn{ min-height:30px; }
}

/* ── Live summary bar ── */
#mkt-summary-bar{
  display:none;align-items:center;gap:12px;flex-wrap:wrap;
  padding:9px 16px;margin-bottom:10px;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:12px;backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
}
.msb-chip{display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;
  padding:3px 10px;border-radius:var(--r-lg)}
.msb-chip.fit{background:rgba(52,199,89,0.12);color:var(--success)}
.msb-chip.warn{background:rgba(255,149,0,0.12);color:var(--warn)}
.msb-chip.bad{background:rgba(255,59,48,0.10);color:var(--danger)}
.msb-chip.blocked{background:var(--glass3);color:var(--text3)}

/* ══════════════════════════════════════════════════════════════════════
   MOTION & RENDERING  (v5.0.9)
══════════════════════════════════════════════════════════════════════ */

/* A single shared easing curve. Most transitions in the file were written with
   the browser default (ease), which starts slow and finishes abruptly; this
   curve decelerates into place and makes the whole UI feel consistent. */
:root{ --ease-out:cubic-bezier(.22,.61,.36,1); --ease-spring:cubic-bezier(.34,1.4,.64,1); --ease-fluid:cubic-bezier(.16,1,.3,1); }

/* Promote only the handful of elements that actually animate transform/opacity.
   Blanket will-change hurts more than it helps, so this list is deliberately
   short and limited to things that move on nearly every interaction. */
.fit-panel,.lobby-card,.desk-card,.eml-tab,.msb-chip,.wm-entry{
  transition-timing-function:var(--ease-out)}
.lobby-card,.desk-card{transform:translateZ(0)}

/* Icons that rotate/flip on toggle — transform only, so no layout pass. */
.wm-entry .wm-expand-btn .ti,#wm-expand-btn .ti{transition:transform .22s var(--ease-out)}

/* Respect the OS "reduce motion" setting everywhere. Most of the file's
   keyframe animations still rely on this blanket rule rather than an
   individual opt-in; this covers all of them, including anything added
   later, without having to remember to annotate each one. Where a component
   does carry its own override instead (search for the next
   prefers-reduced-motion blocks), make sure its selector's specificity
   actually matches the rule it means to silence — see the two blocks under
   #welcome-overlay for a case where it didn't. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.001ms!important;
    animation-iteration-count:1!important;
    transition-duration:.001ms!important;
    scroll-behavior:auto!important}
  /* Keep the spinner legible rather than freezing it mid-rotation */
  .zip-spin,.spinner{animation-duration:1.2s!important;animation-iteration-count:infinite!important}
}
.msb-chip.total{background:var(--glass3);color:var(--text2)}
.msb-est{margin-left:auto;font-size:11px;color:var(--text3)}
.msb-est strong{color:var(--accent);font-size:12px}

/* ── (v5.0.8) Sticky, filterable summary bar ───────────────────────────── */
#mkt-summary-bar{position:sticky;top:0;z-index:30}
.msb-chip{cursor:pointer;border:0.5px solid transparent;transition:all .15s;user-select:none}
.msb-chip:hover{filter:brightness(1.12)}
.msb-chip.active{box-shadow:0 0 0 1.5px currentColor inset;font-weight:700}
.msb-chip.dimmed{opacity:.4}
.msb-chip.total{cursor:pointer}
/* Density toggle + filter-clear live at the right of the bar */
.msb-tools{margin-left:auto;display:flex;align-items:center;gap:6px}
.msb-est+.msb-tools{margin-left:10px}
.msb-tool-btn{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:700;
  padding:4px 9px;border-radius:var(--r-lg);cursor:pointer;font-family:inherit;
  background:var(--glass3);color:var(--text2);border:0.5px solid var(--border2);transition:all .15s}
.msb-tool-btn:hover{border-color:var(--accent);color:var(--accent)}
.msb-tool-btn.on{background:var(--accent);color:#fff;border-color:var(--accent)}
/* A panel hidden by the summary-bar status filter */
.fit-panel.filtered-out{display:none!important}

/* ── (v5.0.8) Compact density mode for the results list ────────────────── */
#fit-panel-wrap.compact .fit-panel{margin-bottom:4px;border-radius:var(--r-sm)}
#fit-panel-wrap.compact .fit-panel-head{padding:7px 12px}

#fit-panel-wrap.compact .mkt-note{display:none}
#fit-panel-wrap.compact .fit-panel:not(.open) .fl-detail{display:none}
#fit-panel-wrap.compact .fit-item{padding:4px 0}

/* ── (v5.0.8) Richer "coming soon" empty states ────────────────────────── */
.eml-soon-card{position:relative;overflow:hidden}
.eml-soon-card .eml-soon-sub{max-width:340px;margin:0 auto;line-height:1.55}
.eml-soon-steps{display:flex;flex-direction:column;gap:6px;margin:14px auto 0;max-width:300px;text-align:left}
.eml-soon-step{display:flex;align-items:flex-start;gap:8px;font-size:11px;color:var(--text3)}
.eml-soon-step i{font-size:12px;color:var(--accent);margin-top:1px;flex:0 0 auto}
.eml-soon-tag{display:inline-block;margin-top:12px;font-size:10px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;padding:3px 10px;border-radius:var(--r-lg);
  background:rgba(255,149,0,0.12);color:var(--warn);border:0.5px solid rgba(255,149,0,0.3)}

/* ── (v5.0.8) Market note typography — scannable label/value lines ─────── */
.mkt-note-row{display:flex;gap:7px;align-items:flex-start;padding:2px 0;font-size:11px;line-height:1.5}
.mkt-note-row .mnr-label{flex:0 0 auto;font-weight:700;color:var(--text2)}
.mkt-note-row .mnr-val{color:var(--text3)}

/* ── Autosave indicator ── */
#autosave-indicator{
  position:fixed;bottom:8px;left:50%;transform:translateX(-50%);
  font-size:10px;font-weight:600;color:var(--text3);letter-spacing:.05em;
  opacity:0;transition:opacity .4s;pointer-events:none;z-index:500;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:var(--r-lg);padding:3px 12px;
}
.feat-dd-btn{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:none;
  background:transparent;color:var(--text);font-size:12px;font-weight:500;cursor:pointer;
  border-radius:8px;font-family:inherit;text-align:left;transition:background .12s}
.feat-dd-btn:hover{background:var(--accent-soft)}
.feat-dd-div{height:1px;background:var(--border);margin:4px 0}
/* 9px is the smallest type this app allows, so these two badges are where
   contrast matters most, not least. Sampled off the rendered pixels rather
   than computed from the CSS — the computed walk goes wrong through stacked
   translucent panels and claimed 1.36:1 for a badge that actually renders at
   5.1:1. What the pixels did show: "Live" at 4.1:1 in light, just under the
   4.5 this app holds itself to, because --success (#1a8f3a) sits on a nearly
   white chip there. A deeper green for this badge only, in light only —
   --success is right where it is used on darker ground. */
.feat-dd-live{font-size:9px;font-weight:700;color:var(--success);background:rgba(52,199,89,0.12);
  border-radius:var(--r-sm);padding:1px 6px;margin-left:auto}
:root:not([data-theme="dark"]) .feat-dd-live{color:#11662a}
.feat-dd-soon{font-size:9px;font-weight:700;color:var(--text3);background:var(--glass3);
  border-radius:var(--r-sm);padding:1px 6px;margin-left:auto}
.cp-link{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;
  font-size:12px;font-weight:500;color:var(--text);text-decoration:none;
  transition:background .12s}
.cp-link:hover{background:var(--accent-soft);color:var(--accent)}
.cp-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
#card-acord{transition:border-color .15s,background .15s}
#card-acord.acord-drag-over{border-color:var(--accent);background:rgba(79,195,247,0.08);border-style:dashed}

/* ── ACORD 130 reader ──────────────────────────────────────────────────────
   The reader used to be one <div> of prose. It said which of four routes it
   had taken, how many fields it found and what to do next, all in a sentence,
   and when it hit the one failure a person can actually fix — a PDF whose
   field names it does not recognise — it printed the names to the browser
   console and asked them to press F12. So the useful part of the output was
   not on the page at all, and the rest was a paragraph to re-read every time.
   What follows is that same information as things on screen: which stage the
   read is at, what came out of the file, and what did not. */
.acord-progress{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.acord-step{
  display:flex;align-items:center;gap:6px;padding:5px 11px;border-radius:99px;
  border:0.5px solid var(--border2);background:var(--glass-card);
  font-size:10px;font-weight:600;color:var(--text3);white-space:nowrap;
}
.acord-step i{font-size:12px}
.acord-step.active{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
.acord-step.done{color:var(--success);border-color:var(--success)}
.acord-step.skipped{opacity:.45}
/* The spinner only ever rides on the active step, so it is scoped to it —
   a stopped page with a spinning icon reads as still working. */
.acord-step.active i.ti-loader-2{animation:acord-spin 1s linear infinite}
@keyframes acord-spin{to{transform:rotate(360deg)}}

.acord-result{margin-top:12px;display:flex;flex-direction:column;gap:10px}
.acord-res-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.acord-badge{
  display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:99px;
  font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  background:var(--accent-soft);color:var(--accent);border:0.5px solid var(--border2);
}
.acord-badge.ai{background:rgba(160,95,208,0.14);color:var(--pal-purple);border-color:rgba(160,95,208,0.3)}
.acord-badge.warn{background:rgba(235,148,71,0.14);color:var(--pal-orange);border-color:rgba(235,148,71,0.3)}
.acord-res-file{font-size:11px;color:var(--text3);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acord-res-count{margin-left:auto;font-size:11px;color:var(--text2);font-weight:600;white-space:nowrap}

.acord-group{border:0.5px solid var(--border2);border-radius:12px;overflow:hidden;background:var(--glass-card)}
.acord-group-t{
  padding:7px 12px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  color:var(--text3);border-bottom:0.5px solid var(--border3);
}
/* Two columns where there is room, one where there is not. A label and its
   value must never be split across a wrap, which is why the pair is the grid
   item rather than each of them being one. */
.acord-kv{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1px;background:var(--border3)}
.acord-kv > div{background:var(--glass-card);padding:8px 12px;min-width:0}
.acord-k{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text3)}
.acord-v{font-size:12px;color:var(--text);margin-top:2px;word-break:break-word}
.acord-v.empty{color:var(--text3);font-style:italic}

.acord-tbl{width:100%;border-collapse:collapse;font-size:11px}
.acord-tbl th{
  text-align:left;padding:6px 10px;font-size:9px;font-weight:700;text-transform:uppercase;
  letter-spacing:.05em;color:var(--text3);border-bottom:0.5px solid var(--border3);white-space:nowrap;
}
.acord-tbl td{padding:6px 10px;border-bottom:0.5px solid var(--border3);color:var(--text2)}
.acord-tbl tr:last-child td{border-bottom:none}
.acord-tbl-wrap{overflow-x:auto}

/* The list of field names this app did not recognise. It is the one failure a
   person can act on without AI — send the names and the matcher gets taught —
   so it belongs on the page with a button that copies it, not in the console
   behind a keyboard shortcut most people do not know. */
.acord-unknown{border:0.5px solid rgba(235,148,71,0.35);border-radius:12px;overflow:hidden;background:rgba(235,148,71,0.06)}

/* The teaching table. The value column is what makes this answerable: the
   field name is meaningless by design, and the value beside it is the whole
   reason a person can say what the box is without opening the PDF. It gets
   the room, and it truncates rather than wrapping so a long nature-of-business
   cannot push the picker off the edge — the full text is on the title. */
.acord-map-wrap{max-height:340px;overflow:auto}
.acord-map-tbl{width:100%;border-collapse:collapse;font-size:11px}
.acord-map-tbl th{
  position:sticky;top:0;z-index:1;background:var(--glass-solid,var(--bg));
  text-align:left;padding:6px 10px;font-size:9px;font-weight:700;text-transform:uppercase;
  letter-spacing:.05em;color:var(--text3);border-bottom:0.5px solid var(--border3);white-space:nowrap;
}
.acord-map-tbl td{padding:5px 10px;border-bottom:0.5px solid var(--border3);vertical-align:middle}
.acord-map-tbl tr:last-child td{border-bottom:none}
.acord-map-tbl code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;color:var(--text2);white-space:nowrap}
.acord-map-val{
  color:var(--text);max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.acord-map-pick{
  font-size:11px;padding:4px 7px;border-radius:6px;border:0.5px solid var(--border);
  background:var(--input-bg);color:var(--text);font-family:inherit;outline:none;min-width:150px;max-width:100%;
}
.acord-map-pick:focus{border-color:var(--accent)}
.acord-res-actions{display:flex;gap:8px;flex-wrap:wrap}
/* Full-size lightbox: the manual's screenshots, and the rules / backup panels */
.tut-zoom-overlay{position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,0.82);display:none;align-items:center;justify-content:center;padding:40px;cursor:zoom-out;backdrop-filter:blur(4px)}
.tut-zoom-overlay.open{display:flex}
.tut-zoom-overlay img{max-width:100%;max-height:100%;border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,0.5)}
.tut-zoom-close{position:absolute;top:20px;right:24px;width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.2);color:#fff;display:flex;align-items:center;justify-content:center;font-size:18px;cursor:pointer}
.wm-topbar-title{font-size:14px;font-weight:600;color:var(--text);letter-spacing:-.02em;flex:1}
.wm-action-btn{display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:var(--accent);background:var(--accent-soft);border:0.5px solid var(--border2);border-radius:var(--r-lg);padding:5px 12px;cursor:pointer;font-family:inherit;transition:all .15s}
.wm-action-btn:hover{background:var(--accent);color:#fff;border-color:var(--accent)}
.wm-action-btn.primary{color:#fff;background:var(--accent);border-color:transparent}
.wm-action-btn.primary:hover{filter:brightness(1.12)}
.wm-search{display:flex;align-items:center;gap:8px;background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-lg);padding:6px 12px;font-size:12px;color:var(--text);min-width:200px}
.wm-search input{background:none;border:none;outline:none;font-size:12px;color:var(--text);font-family:inherit;width:100%}
.wm-search input::placeholder{color:var(--text3)}
/* ── (v5.0.9.4) Weekly Notes toolbar: expand-all + language switch ── */
.wm-tools{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.wm-tool-btn{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:700;
  padding:5px 10px;border-radius:var(--r-lg);cursor:pointer;font-family:inherit;white-space:nowrap;
  background:var(--glass3);color:var(--text2);border:0.5px solid var(--border2);transition:all .15s}
.wm-tool-btn:hover{border-color:var(--accent);color:var(--accent)}
.wm-lang{display:inline-flex;background:var(--glass3);border:0.5px solid var(--border2);border-radius:var(--r-lg);overflow:hidden}
.wm-lang-btn{font-size:10px;font-weight:700;padding:5px 10px;border:none;cursor:pointer;
  font-family:inherit;background:transparent;color:var(--text3);transition:all .15s}
.wm-lang-btn:hover{color:var(--accent)}
.wm-lang-btn.active{background:var(--accent);color:#fff}
@media (max-width:760px){
  .wm-tools{width:100%;justify-content:flex-end}
}
.wm-search-count{flex:0 0 auto;font-size:10px;font-weight:700;color:var(--accent);white-space:nowrap;padding-left:2px}
mark.wm-hl{background:rgba(255,204,0,0.45);color:inherit;border-radius:3px;padding:0 1px;box-decoration-break:clone;-webkit-box-decoration-break:clone}
.wm-filters{display:flex;flex-direction:column;gap:0;border-bottom:0.5px solid var(--border3);background:rgba(130,182,242,0.04)}
.wm-filter-row{display:flex;align-items:center;gap:10px;padding:9px 20px;flex-wrap:wrap;border-bottom:0.5px solid var(--border3)}
.wm-filter-row:last-child{border-bottom:none}
.wm-filter-row+.wm-filter-row{border-top:0.5px solid var(--border3)}
.wm-filter-trigger{display:flex;align-items:center;gap:8px;padding:10px 20px;cursor:pointer;user-select:none;transition:background .12s}
.wm-filter-trigger:hover{background:rgba(130,182,242,0.07)}
.wm-filter-label{font-size:9px;font-weight:700;color:var(--text3);letter-spacing:.09em;text-transform:uppercase;white-space:nowrap;min-width:76px;display:flex;align-items:center;gap:4px}
.wm-filter-summary{font-size:10px;font-weight:600;color:var(--accent);background:rgba(var(--brand-blue-rgb),0.08);border:0.5px solid rgba(var(--brand-blue-rgb),0.20);border-radius:var(--r-lg);padding:2px 9px;margin-left:4px;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wm-filter-summary.neutral{color:var(--text3);background:rgba(130,182,242,0.09);border-color:var(--border)}
.wm-filter-spacer{flex:1}
.wm-filter-caret{width:20px;height:20px;display:flex;align-items:center;justify-content:center;color:var(--text3);flex-shrink:0}
.wm-filter-caret .ti{font-size:11px;transition:transform .28s var(--ease-out);display:block}
.wm-filter-caret.open .ti{transform:rotate(-180deg)}
.wm-filter-body{overflow:hidden;transition:max-height .32s var(--ease-out),opacity .22s ease}
.wm-filter-chips{display:flex;align-items:center;gap:5px;flex-wrap:wrap;padding:4px 20px 12px}
.wm-chip{font-size:10px;font-weight:700;padding:4px 10px;border-radius:var(--r-lg);cursor:pointer;border:0.5px solid var(--border);background:rgba(130,182,242,0.08);color:var(--text3);transition:all .15s;letter-spacing:.02em;text-transform:uppercase}
.wm-chip:hover{background:rgba(130,182,242,0.18);color:var(--text)}
.wm-chip.active{background:var(--accent);color:#fff;border-color:var(--accent)}
.wm-body{max-width:var(--col-std);margin:0 auto;padding:22px 20px 40px;display:flex;flex-direction:column;gap:14px}
.wm-entry{background:var(--glass-card);backdrop-filter:saturate(180%) blur(24px);-webkit-backdrop-filter:saturate(180%) blur(24px);border:0.5px solid var(--border);border-radius:18px;padding:0;overflow:hidden;transition:opacity .2s}
.wm-entry.hidden{display:none}
.wm-entry-head{display:flex;align-items:center;gap:13px;padding:16px 20px;cursor:pointer;user-select:none}
.wm-avatar{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;color:#fff;flex-shrink:0;letter-spacing:-.3px;box-shadow:0 0 0 3px var(--glass2)}
.wm-person-info{flex:1;min-width:0}
.wm-person-name{font-size:13px;font-weight:700;color:var(--text);letter-spacing:-.01em}
.wm-date{font-size:11px;color:var(--text3);margin-top:2px;font-weight:500}
.wm-expand-btn{width:26px;height:26px;border-radius:50%;background:var(--accent-soft);border:0.5px solid var(--border2);display:flex;align-items:center;justify-content:center;color:var(--accent);transition:transform .26s,background .12s;flex-shrink:0}
.wm-entry-head:hover .wm-expand-btn{background:rgba(130,182,242,0.24)}
.wm-expand-btn .ti{font-size:12px;transition:transform .26s var(--ease-out)}
.wm-entry.open .wm-expand-btn .ti{transform:rotate(-180deg)}
.wm-body-inner{display:none;padding:2px 20px 18px;flex-direction:column;gap:10px}
.wm-entry.open .wm-body-inner{display:flex}
.wm-entry.open .wm-entry-head{border-bottom:0.5px solid var(--border3);padding-bottom:14px}
.wm-section{
  border-radius:14px; overflow:hidden; position:relative;
  background:var(--glass-card);
  backdrop-filter:var(--blur2); -webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);
  box-shadow:var(--shadow);
  transition:border-color .25s var(--ease-out),box-shadow .25s var(--ease-out);
}
.wm-section::before{content:'';position:absolute;top:0;left:0;right:0;height:40%;background:linear-gradient(180deg,rgba(77,143,230,0.08) 0%,rgba(0,100,200,0.03) 40%,transparent 80%);pointer-events:none}
.wm-section > *{position:relative}
.wm-section:hover{border-color:rgba(77,143,230,0.35);box-shadow:var(--shadow-lg)}
.wm-section-head{display:flex;align-items:center;gap:9px;padding:10px 13px}
.wm-tag{font-size:9px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:3px 9px;border-radius:var(--r-lg);color:#fff;flex-shrink:0;box-shadow:0 1px 3px rgba(0,0,0,0.18)}
.wm-tag[style*="--tag"]{background:color-mix(in srgb,var(--tag) 16%,transparent);color:var(--tag);border:0.5px solid color-mix(in srgb,var(--tag) 42%,transparent);box-shadow:none}
.wm-section-title{font-size:12px;font-weight:700;color:var(--text);flex:1}
.wm-section-body{padding:0 13px 12px}
.wm-section-body p{font-size:12px;color:var(--text2);line-height:1.7;margin-bottom:6px}
.wm-section-body p:last-child{margin-bottom:0}
.wm-section-body ul{margin:2px 0 4px 16px}
.wm-section-body li{font-size:12px;color:var(--text2);line-height:1.7;margin-bottom:4px}
.wm-section-body strong{color:var(--text);font-weight:700}
.wm-section-body code{font-size:11px;background:rgba(130,182,242,0.16);color:var(--accent);padding:1px 6px;border-radius:5px;font-family:var(--font-mono)}
.wm-tag-chips{display:flex;gap:6px;flex-wrap:wrap;padding:0 20px 14px}
.wm-tag-chips .wm-tag{opacity:.9;transition:opacity .15s}
.wm-entry:hover .wm-tag-chips .wm-tag{opacity:1}

.sec-head{display:flex;align-items:center;gap:8px;margin:28px 0 12px;font-size:11px;font-weight:500;letter-spacing:.06em;color:var(--text2);text-transform:uppercase;cursor:pointer;user-select:none}
.sec-head > i{font-size:14px;color:var(--accent);flex-shrink:0}
.sec-head-txt{white-space:nowrap}
.sec-head-line{flex:1;height:0.5px;background:linear-gradient(90deg,var(--border),transparent);align-self:center;min-width:12px}
.sec-caret{width:22px;height:22px;border-radius:50%;background:rgba(130,182,242,0.10);border:0.5px solid var(--border);display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--text3);transition:background .15s,color .15s,transform var(--dur-fast) var(--ease-out);flex-shrink:0;padding:0;font-family:inherit;outline:none}
.sec-caret:hover{background:rgba(130,182,242,0.22);color:var(--text)}
.sec-caret .ti{font-size:12px;transition:transform .32s var(--ease-out);display:block;line-height:1}
.sec-caret.open .ti{transform:rotate(-180deg)}
.sec-body{overflow:hidden;transition:max-height .38s var(--ease-out),opacity .26s ease}

/* ── CARD ── */
.avp-card{
  background:var(--glass-card);
  backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);
  box-shadow:var(--avp-shadow);
  padding:16px 18px;margin-bottom:8px;
  transition:border-color .25s var(--ease-out),box-shadow .25s var(--ease-out),transform .25s var(--ease-out);
  position:relative;overflow:hidden;
}
.avp-card::before{content:'';position:absolute;top:0;left:0;right:0;height:40%;background:linear-gradient(180deg,rgba(77,143,230,0.08) 0%,rgba(0,100,200,0.03) 40%,transparent 80%);pointer-events:none}
.avp-card:hover,.avp-card:focus-within{border-color:rgba(77,143,230,0.45);box-shadow:var(--avp-shadow-lg);transform:translateY(-1px)}
@media(prefers-reduced-motion:reduce){.avp-card{transition:border-color .15s,box-shadow .15s}.avp-card:hover,.avp-card:focus-within{transform:none}}
/* The "needs attention" ring is drawn inside the card, not spread outside it.
   An outward spread on an element that also has backdrop-filter paints as a
   rectangle in Chromium: the amber ran straight across the corner instead of
   following it, so Risk Description, Experience Mod, Yes/No and Loss History —
   the four sections that start incomplete — each showed a square edge cutting
   their rounded corner. An inset shadow is clipped to the padding box and
   cannot escape the radius. */
.avp-card.incomplete{
  border-color:var(--warn-border)!important;
  box-shadow:inset 0 0 0 2px var(--warn-soft),var(--avp-shadow)!important;
}
.avp-card.joes-active{background:var(--warn-soft)!important;border-color:var(--warn-border)!important}

/* ── FIELD ── */
.avp-field{display:flex;flex-direction:column;gap:6px}
/* Real spacing between top-level questions in a card, not the accidental
   8-18px a note or sub-field happening to be open used to leave behind (and
   the ~0px a plain field without one got). Scoped to direct children only —
   a nested .avp-field like #amandaikari-field already gets its own margin
   from .avp-sub-field and must not double up on this one too. */
.avp-card>.avp-field:not(:last-child){margin-bottom:16px}
.avp-field label{font-size:10px;font-weight:700;color:var(--text3);letter-spacing:.08em;text-transform:uppercase;display:flex;align-items:center;gap:5px}
.req-dot{width:4px;height:4px;border-radius:50%;background:var(--danger);flex-shrink:0}
.avp-field input,.avp-field select,.avp-field textarea{
  font-size:13px;padding:9px 12px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);
  color:var(--text);
  width:100%;outline:none;font-family:inherit;
  transition:border-color .2s var(--ease-out),background .2s var(--ease-out),box-shadow .2s var(--ease-out);
  min-height:44px;
  box-shadow:inset 0 1px 3px rgba(0,0,0,0.08);
}
.avp-field input::placeholder,.avp-field textarea::placeholder{color:var(--text3)}
.avp-field input:focus,.avp-field select:focus,.avp-field textarea:focus{
  border-color:var(--accent);
  box-shadow:0 0 0 3px var(--accent-soft),inset 0 1px 3px rgba(0,0,0,0.08);
}
/* Rounded to match .contact-toggle (the Yes/No pill used throughout this
   same form) rather than the sharper 10px every other input/textarea uses —
   selects sat visibly more square than the toggle buttons next to them. */
.avp-field select{cursor:pointer;appearance:none;border-radius:14px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23163a66' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:28px;background-color:var(--input-bg)}
[data-theme="dark"] .avp-field select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%234d8fe6' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}
.avp-field select option{background:var(--select-opt-bg);color:var(--text)}
select option{background:var(--select-opt-bg);color:var(--text)}
.avp-field textarea{resize:vertical;min-height:72px}

/* ── GRID (mobile-first: 1 col; ≥640px: multi-col) ── */
.g2{display:grid;grid-template-columns:1fr;gap:12px}
.g3{display:grid;grid-template-columns:1fr;gap:10px}
.g4{display:grid;grid-template-columns:1fr;gap:10px}
@media(min-width:640px){
  .g2{grid-template-columns:1fr 1fr}
  .g3{grid-template-columns:1fr 1fr 1fr}
  .g4{grid-template-columns:2fr 1fr 1fr 1fr}
}

/* ── The address row ──────────────────────────────────────────────────────
   ZIP, City, State used to share .g3's three equal thirds, and a box sized
   for five digits took the same width as a box holding "Fort Lauderdale".
   The empty space read as a field somebody had forgotten to finish.

   Sized to what each one holds instead: ZIP is exactly five characters and
   State is two, so both are given a fixed track and City takes what is left.
   Not .g3's business — that grid is shared with the contact row, where Name,
   Phone and Email really are three comparable things. */
/* Flex, not grid, because the city is the one box here that should be as wide
   as what is in it — and a grid track cannot be sized by an input's value.
   cityFit() measures the text in the face actually rendering it and writes
   --city-w; the track is whatever that says. Stacked below 640px, where every
   box is full width and none of this applies. */
.addr-grid{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-start}
.addr-grid > *{flex:1 1 100%;min-width:0}
.addr-grid .city-box{width:100%}
@media(min-width:640px){
  .addr-grid > *{flex:0 0 auto}
  /* A ZIP is five digits and a spinner. It had 120px once — wider than the
     state select beside it and wide enough for a sentence. */
  .addr-zip-wrap{width:96px}
  /* Fits "State", which is the widest thing it ever shows: the two-letter
     codes it holds afterwards are narrower than its own placeholder. */
  .addr-grid select{width:96px}
  .addr-grid .city-box{
    width:var(--city-w,150px);
    transition:width .16s var(--ease-out);
  }
}
@media(prefers-reduced-motion:reduce){.addr-grid .city-box{transition:none}}

/* Grows with the address rather than scrolling it out of sight.
   A street address is the one field here with no predictable length — a
   suite, a building name and a road can run past any single line — and the
   old input scrolled horizontally, so the beginning of what you had just
   typed disappeared as you typed the end of it. Capped so one pasted block
   cannot push the rest of the form off the screen.

   Empty, it is exactly as tall as the ZIP, city and state boxes under it:
   min-height is the same 44px every control in this form stands at, and the
   padding is opened from 9px to 11px so the single line sits on their centre
   line. It was 37px before — auto-grown from a min-height of 0 — which left
   the row below it visibly taller than the box above it. Equalised upward,
   not down: 44px is the app's control height everywhere and the floor of a
   comfortable touch target, so the three boxes were not the ones to change.

   11 and not 12, because the 0.5px border is used as 1px a side: at 12 the
   grown height came to 45 and overshot the row by the pixel it was supposed
   to match. */
.avp-field textarea.addr-street{
  resize:none;min-height:44px;line-height:1.45;
  padding-top:11px;padding-bottom:11px;
  max-height:132px;overflow-y:auto}

/* ── TOGGLE ── */
.avp-toggle{display:flex;border:0.5px solid var(--border);border-radius:var(--r-sm);overflow:hidden;width:fit-content;background:rgba(130,182,242,0.12)}
.avp-tog{padding:5px 14px;font-size:11px;font-weight:500;cursor:pointer;background:transparent;color:var(--text2);border:none;font-family:inherit;letter-spacing:.01em;min-height:32px}
.avp-tog:not(:last-child){border-right:0.5px solid var(--border)}
@keyframes togSettle{0%{transform:scale(.92)}60%{transform:scale(1.03)}100%{transform:scale(1)}}
@media(prefers-reduced-motion:reduce){.avp-tog.yes.active,.avp-tog.no.active{animation:none}}

/* ── Contact section: enhanced Yes/No toggle ── */
.contact-toggle{
  border-radius:14px;
  box-shadow:0 2px 12px rgba(0,0,0,0.10);
}
.contact-tog{
  position:relative;overflow:hidden;
  padding:8px 22px;font-size:12px;font-weight:600;
  display:inline-flex;align-items:center;gap:6px;
}

/* Ripple element */
.contact-ripple{
  position:absolute;border-radius:50%;pointer-events:none;
  transform:scale(0);animation:contact-ripple-anim .5s ease-out forwards;
}
@keyframes contact-ripple-anim{
  to{transform:scale(4);opacity:0}
}

/* ── NOTE ── */
.avp-note{
  font-size:12px;color:#7a4700;
  background:rgba(200,110,0,0.12);
  border-radius:var(--r-sm);padding:8px 12px;margin-top:8px;
  border-left:2.5px solid #c97800;display:none;
}
[data-theme="dark"] .avp-note{
  color:var(--warn);
  background:var(--warn-soft);
  border-left-color:var(--warn);
}
/* Visual-only: these still get their text filled in and their state
   tracked exactly as before (Joe's submission/Amanda Ikari still block
   Jencap and the rest, Taylor Mensik still blocks Insurate, New venture's
   own rules are untouched) — they just never render, overriding the inline
   display:block tog()/sh() still sets on them. */
#joes-note,#amandaikari-note,#taylormensik-note,#newventure-note{display:none!important}
.avp-note.danger{color:var(--danger);background:var(--danger-soft);border-color:var(--danger)}
.avp-note.info{color:var(--accent);background:var(--accent-soft);border-color:var(--accent)}
.avp-note.incomplete-msg{
  color:#7a4700;background:rgba(200,110,0,0.12);
  border-left:2.5px solid #c97800;font-size:12px;padding:8px 12px;
  border-radius:var(--r-sm);margin-top:6px;display:none;
}
[data-theme="dark"] .avp-note.incomplete-msg{
  color:var(--warn);background:var(--warn-soft);border-left-color:var(--warn);
}
.avp-sub-field{margin-top:12px}
/* Account detail sections expand */
#acct-expanded{animation:acctSlideIn .28s var(--ease-out)}
@keyframes acctSlideIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}

/* ── Quick Analysis mode — hides paperwork/identity fields that no market
   rule ever reads (account name, FEIN, corporation type, street address,
   years in business & effective date, contact info, owners, additional
   named insured, and the ACORD 130 upload — which has nothing to fill in
   once those fields are gone). States/payroll, risk description, mod &
   premium, the Yes/No questions (including Joe's submission and New
   Venture) and loss history/runs stay on screen and are read for real —
   every one of them can change which markets fit, same as full mode, so
   hiding them made Quick Analysis less accurate, not just shorter.

   Value Loss Runs Date is the one exception inside that section: no market
   rule reads it (it only drives its own note), so unlike the policy-period
   table it sits in, it hides in Quick mode — nobody is filling per-period
   valuation dates in for a quick pass, and notes() swaps in a single
   generic reminder to check the LR reports directly instead of the
   per-period "missing date" note that field would otherwise produce. */
body.quick-mode #sec-head-acord, body.quick-mode #card-acord,
body.quick-mode #sec-head-acct, body.quick-mode #card-acct,
body.quick-mode #sec-head-fein, body.quick-mode #card-fein,
body.quick-mode #addr-field-label,
body.quick-mode #addr-yn-row,
body.quick-mode #addr-note,
body.quick-mode #addr1-caption,
body.quick-mode #addr-street,
body.quick-mode #additional-addresses,
body.quick-mode #addr-add-btn,
body.quick-mode #card-vlr,
body.quick-mode #sec-head-dates, body.quick-mode #card-dates,
body.quick-mode #sec-head-contact, body.quick-mode #card-contact,
body.quick-mode #sec-head-owners, body.quick-mode #card-owners,
body.quick-mode #sec-head-ani, body.quick-mode #sb-ani,
body.quick-mode #card-vlr,
body.quick-mode #corptype-field{display:none !important}
.quick-toggle-row{display:flex;align-items:center;gap:10px;margin:10px 0 4px;flex-wrap:wrap}
.quick-toggle-btn{
  display:inline-flex;align-items:center;gap:7px;padding:6px 13px;border-radius:var(--r-lg);
  border:0.5px solid var(--border2);background:var(--glass-card);color:var(--text2);
  font-size:12px;font-weight:600;cursor:pointer;transition:all .15s;
}
.quick-toggle-btn:hover{border-color:var(--accent)}
.quick-toggle-btn.active{background:var(--accent);border-color:var(--accent);color:#fff}
.quick-toggle-btn .qt-dot{width:7px;height:7px;border-radius:50%;background:var(--text3);flex-shrink:0}
.quick-toggle-btn.active .qt-dot{background:#fff}

/* ── BUTTONS ── */
.avp-btn{
  padding:7px 15px;font-size:12px;font-weight:600;
  border:1px solid var(--border);border-radius:var(--r-sm);
  cursor:pointer;background:var(--glass);
  backdrop-filter:blur(8px);color:var(--text2);
  display:inline-flex;align-items:center;gap:6px;
  font-family:inherit;transition:all .15s;
  box-shadow:var(--shadow);
  min-height:44px;/* iPad tap target */
}
.avp-btn:hover{background:var(--glass2);border-color:var(--border2);color:var(--text)}
.avp-btn.add{color:var(--accent);border-color:var(--border2);background:var(--accent-soft);margin-top:8px;transition:all .18s var(--ease-out)}
.avp-btn.add .ti{transition:transform .18s var(--ease-out)}
.avp-btn.add:hover{background:rgba(77,143,230,0.18);transform:translateY(-1px);box-shadow:0 4px 14px rgba(77,143,230,0.22)}
.avp-btn.add:hover .ti{transform:rotate(90deg)}
.avp-btn.add:active{transform:translateY(0)}
@media(prefers-reduced-motion:reduce){.avp-btn.add,.avp-btn.add .ti{transition:background .15s}.avp-btn.add:hover{transform:none}.avp-btn.add:hover .ti{transform:none}}
.avp-btn.danger{color:var(--danger);border-color:var(--danger-border);background:transparent;padding:5px 9px}
.avp-btn.danger:hover{background:var(--danger-soft)}
.avp-btn.primary{
  background:linear-gradient(135deg,rgba(77,143,230,0.18),rgba(33,150,243,0.22));
  color:var(--text);border-color:var(--border2);font-size:13px;padding:10px 28px;
  box-shadow:0 6px 20px var(--blue-glow2);
}
.avp-btn.primary:hover{box-shadow:0 8px 28px var(--blue-glow);transform:translateY(-1px)}
.avp-btn.warn{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}
.avp-btn-row{display:flex;gap:8px;margin-top:1.5rem;flex-wrap:wrap}

/* ── DIVIDER ── */
.avp-divider{height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent);margin:1.5rem 0;opacity:.6}

/* ── DYNAMIC ROWS ── */
.col-hdr{font-size:10px;color:var(--text3);font-weight:700;letter-spacing:.04em}
.hdr-grid{display:grid;gap:6px;padding:0 10px;margin-bottom:6px}
.avp-drow{
  display:grid;gap:6px;align-items:center;padding:8px 10px;
  background:var(--glass3);
  border-radius:var(--r-sm);margin-bottom:5px;
  border:1px solid var(--border3);transition:background .15s,border-color .15s;
}
.avp-drow:hover{background:var(--accent-soft);border-color:var(--border2)}
.avp-drow input,.avp-drow select{
  font-size:12px;padding:6px 8px;
  border:0.5px solid var(--border);border-radius:6px;
  background:var(--input-bg);
  color:var(--text);
  width:100%;outline:none;font-family:inherit;transition:border-color .15s;
  min-height:36px;
}
.avp-drow input::placeholder{color:var(--text3)}
.avp-drow input:focus,.avp-drow select:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.avp-drow select option{background:var(--select-opt-bg);color:var(--text)}

/* ── TOTALS ── */
.avp-totals{background:var(--accent-soft);border:1px solid var(--border2);border-radius:var(--r-sm);padding:10px 16px;margin-top:10px;display:flex;gap:28px;flex-wrap:wrap}
.avp-totals span{color:var(--text3);font-size:10px;text-transform:uppercase;letter-spacing:.07em;display:block;margin-bottom:2px;font-weight:700}
.avp-totals strong{color:var(--accent);font-size:16px;font-variant-numeric:tabular-nums;font-family:inherit;font-weight:600}

/* ── MINI TOGGLE ── */
/* Matched to .contact-toggle/.contact-tog (the toggle every main Yes/No
   question uses) rather than kept as its own flatter skin — radius, padding,
   hover and active glow all follow the same values, and the label above it
   gets the same 6px gap .avp-field label already uses instead of its own
   hardcoded 4/10px margins. */
.mini-label{font-size:10px;color:var(--text3);margin-top:16px;margin-bottom:6px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}
.mini-toggle{display:flex;border:1px solid var(--border);border-radius:14px;overflow:hidden;width:fit-content;background:var(--glass3);box-shadow:0 2px 12px rgba(0,0,0,0.10)}
.mini-btn{position:relative;overflow:hidden;padding:8px 22px;font-size:11px;font-weight:600;cursor:pointer;background:transparent;color:var(--text2);border:none;font-family:inherit;min-height:36px}
.mini-btn:not(:last-child){border-right:1px solid var(--border)}

/* ── Every Yes/No behaves the same ──
   Two families had grown apart while asking the identical question. .avp-tog
   settled with a spring when picked but did nothing under the pointer and
   rounded to 8px; .mini-btn lifted on hover, appeared with no animation at
   all and rounded to 12px. Which one a question wore was a matter of where in
   the form it happened to sit.

   One rule for both, and it is the union rather than a compromise: the hover
   .mini-btn had, the settle .avp-tog had, the same 12px on the chosen answer
   and the same 14px shell around the pair. Sizes stay as they are — a
   question in a dense row is still smaller than one in a card; it is the
   behaviour and the corners that had to agree. */
/* .contact-tog is listed too, and not for tidiness: it carried its own
   `transition:all .2s`, which beat the four properties named here and
   animated the corner radius along with them — the chosen answer's corners
   eased in on Contact and snapped everywhere else. Naming the properties in
   one place is what makes "identical animation" true rather than nearly. */
.avp-tog,.mini-btn,.contact-tog{
  transition:background var(--dur) var(--ease-out),color var(--dur) var(--ease-out),
             transform var(--dur) var(--ease-out),box-shadow var(--dur) var(--ease-out);
}
/* Hover, press, the settle and the corners live below the app-wide control
   recipe (search ".avp-btn, .avp-tog, .mini-btn"), because that recipe gives
   every control a 1px lift and a Yes/No answer is meant to pop instead —
   equal specificity, so the one that comes later is the one that holds. */

/* ── The answer's own colour: green for Yes, red for No, once ──
   Three families each declared this for themselves, and they had drifted:
   .avp-tog painted a flat --success-soft while the other two used a gradient
   with a glow, so the same answer looked like two different controls
   depending on which screen asked the question. One pair of rules for all
   three, so a Yes cannot be green in one place and a paler green in
   another. */
.avp-tog.yes.active,.mini-btn.yes.active,.contact-tog.yes.active{
  background:linear-gradient(135deg,rgba(52,199,89,0.28),rgba(52,199,89,0.14));
  color:var(--success);
  box-shadow:0 0 16px rgba(52,199,89,0.30),0 2px 6px rgba(0,0,0,0.10);
}
.avp-tog.no.active,.mini-btn.no.active,.contact-tog.no.active{
  background:linear-gradient(135deg,rgba(255,59,48,0.24),rgba(255,59,48,0.12));
  color:var(--danger);
  box-shadow:0 0 16px rgba(255,59,48,0.28),0 2px 6px rgba(0,0,0,0.10);
}

/* "Missing info?" on the Additional ACORD 130 questions sits beside the
   answer instead of under it, at a smaller size — it is a footnote on the
   paperwork, not a second question of equal weight, and it is asked of every
   one of those three questions rather than only the ones answered Yes. */
.avp-q-row{display:flex;align-items:center;gap:10px;margin-top:4px;flex-wrap:wrap}
.acord-miss{display:flex;align-items:center;gap:7px;margin-left:auto}
.acord-miss-label{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text3);white-space:nowrap}
/* The footnote-sized pair keeps the same 14px as every other Yes/No — its
   buttons are shorter, so that reads as a fuller round, which is what a
   smaller control of the same design should look like. */
.acord-miss-toggle{border-radius:14px}
.acord-miss-toggle .mini-btn{padding:4px 11px;font-size:10px;min-height:26px}
.acord-miss-toggle .mini-btn i{font-size:10px;margin-right:3px}
.acord-miss-toggle .mini-btn.yes.active,.acord-miss-toggle .mini-btn.no.active{border-radius:9px}
@media(max-width:560px){.acord-miss{margin-left:0}}

/* ── LOSS RUN TABLE ── */
.avp-lr-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12px;border-radius:var(--r-sm);overflow:hidden;border:1px solid var(--border)}
.avp-lr-table th{background:var(--accent-soft);font-size:10px;font-weight:700;color:var(--text3);text-align:left;padding:8px 10px;border-bottom:1px solid var(--border);text-transform:uppercase;letter-spacing:.08em}
.avp-lr-table th.ctr,.avp-lr-table td.ctr{text-align:center}
.avp-lr-table td{padding:6px 9px;border-bottom:1px solid var(--border3);vertical-align:middle;color:var(--text);background:var(--glass3)}
.avp-lr-table tr:last-child td{border-bottom:none}
.lr-have{display:flex;gap:3px;justify-content:center}
.lr-have button{padding:3px 10px;font-size:11px;font-weight:600;border:1px solid var(--border);border-radius:5px;cursor:pointer;background:var(--glass3);color:var(--text2);font-family:inherit;transition:all .15s;min-height:36px}
.lr-have button.yes.active{background:var(--success-soft);border-color:var(--success-border);color:var(--success)}
.lr-have button.no.active{background:var(--danger-soft);border-color:var(--danger-border);color:var(--danger)}
.lr-miss{font-size:11px;color:#7a4700;background:rgba(200,110,0,0.14);border-radius:6px;padding:5px 9px;border-left:2px solid #c97800;display:none;margin-top:3px}
[data-theme="dark"] .lr-miss{color:var(--warn);background:var(--warn-soft);border-left-color:var(--warn)}
.stat-pill{display:inline-block;padding:5px 12px;font-size:11px;border-radius:8px;border:1px solid var(--border);font-variant-numeric:tabular-nums;background:var(--glass3);font-family:var(--font-mono)}

/* ── FILTER BAR ── */
.filter-bar{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.filter-bar select,.filter-bar input{font-size:12px;padding:6px 10px;border:0.5px solid var(--border);border-radius:8px;background:var(--input-bg);color:var(--text);outline:none;font-family:inherit;min-height:36px}
.filter-bar select:focus,.filter-bar input:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.filter-bar select option{background:var(--select-opt-bg);color:var(--text)}
.filter-label{font-size:11px;color:var(--text3);font-weight:600}

/* ── SUMMARY PANEL ── */
.avp-summary{background:var(--glass);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:1px solid var(--border);border-radius:var(--r);box-shadow:var(--shadow),var(--inner);padding:14px 16px;margin-bottom:8px}
.avp-summary.has-alerts{background:var(--warn-soft)!important;border-color:var(--warn-border)!important}
.avp-summary-empty{font-size:12px;color:var(--text3);font-style:italic}
.avp-alert-item{display:flex;align-items:flex-start;gap:9px;padding:7px 0;border-bottom:1px solid var(--warn-soft)}
.avp-alert-item:last-child{border-bottom:none}
.avp-alert-dot{width:5px;height:5px;border-radius:50%;background:var(--warn);flex-shrink:0;margin-top:4px}
.avp-alert-item span{font-size:12px;color:var(--warn);line-height:1.5}

/* ── FEIN ERROR ── */
.avp-fein-err{font-size:11px;color:var(--danger);display:none;margin-top:3px}

/* ── ZIP SPINNER ── *//* ── MARKET FIT ── */
/* ── Segmented market-fit progress bar (donut replacement) ── */
#mkt-progress-bar{display:none;height:8px;border-radius:99px;overflow:hidden;
  background:var(--glass3);margin:10px 0 4px;box-shadow:inset 0 0 0 0.5px var(--border)}
#mkt-progress-bar .seg{height:100%;float:left;transition:width .5s var(--ease-out)}
#mkt-progress-bar .seg.fit{background:var(--success)}
#mkt-progress-bar .seg.warn{background:var(--warn)}
#mkt-progress-bar .seg.bad{background:var(--danger)}
#mkt-progress-bar .seg.blocked{background:var(--text3)}

/* ── Compact result rows: flag-count chip shown when a panel is collapsed ── */
.fit-flag-count{display:inline-flex;align-items:center;margin-left:8px;font-size:9px;font-weight:700;
  letter-spacing:.03em;border-radius:99px;padding:1px 8px;text-transform:none}
.fit-flag-count.red{background:var(--danger-soft);color:var(--danger);border:0.5px solid var(--danger-border)}
.fit-flag-count.gray{background:var(--glass3);color:var(--text3);border:0.5px solid var(--border)}
.fit-panel.open .fit-flag-count{display:none!important} /* chip only matters while collapsed */

/* ── Market notes: clamp long ones to 2 lines, expandable ── */
.mkt-note{margin-top:4px;color:var(--accent);font-size:10px;line-height:1.55;overflow-wrap:anywhere;
  border-top:1px solid rgba(79,195,247,0.15);padding-top:4px}
/* Clamped by whole rows, not by height. A 3.4em cap over 15.5px line boxes cut
   the third line 19% of the way through it, and the fade that was there to
   hide the stump smeared the second line as well — every card showed a band of
   half-legible text under its notes. Two rows, each itself capped at two lines
   so one long sentence cannot take the card over: both cuts land on a line
   boundary, and "See more" says there is more rather than a blur implying it. */
.mkt-note.clamped .mkt-note-row:nth-child(n+3){display:none}
/* The line cap goes on the value, not on the row. Putting -webkit-box on the
   row replaced its flex layout and took the gap between the label and the
   value with it — "NY:no 5 boroughs" instead of "NY: no 5 boroughs". */
.mkt-note.clamped .mnr-val{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.mkt-note-toggle{background:none;border:none;color:var(--accent);font-size:10px;font-weight:700;
  padding:3px 0 0;font-family:inherit;letter-spacing:.02em;text-decoration:underline;text-underline-offset:2px}

/* ── Preferred-fit badge: a positive signal, kept visually distinct from the
   informational (accent-blue) market notes above via the success-green token ── */
.mkt-preferred{margin-top:4px;display:flex;align-items:center;gap:5px;color:var(--success);
  font-size:10px;font-weight:700;letter-spacing:.02em;background:var(--success-soft);
  border:0.5px solid var(--success-border);border-radius:6px;padding:3px 7px}
.mkt-preferred i{font-size:12px}

/* ── PEO/PayGo low-premium notice — glass card, warn accent ── */
#peo-low-prem-notice{
  display:flex;align-items:flex-start;gap:11px;
  background:var(--glass);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:1px solid var(--warn-border);border-radius:12px;
  box-shadow:var(--shadow),var(--inner);
  padding:12px 14px;margin-bottom:10px;
  animation:riseIn .5s cubic-bezier(.22,.68,.26,1) backwards;
}
#peo-low-prem-notice>i{color:var(--warn);font-size:16px;flex-shrink:0;margin-top:1px}
#peo-low-prem-notice .plpn-title{
  font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;
  color:var(--warn);margin-bottom:2px;
}
#peo-low-prem-notice .plpn-msg{font-size:12px;color:var(--text2);line-height:1.5}

/* ── Count-up number animation cue ── */
/* ── Unified empty-state pattern (Calendar, Directory, Tracker, etc.) ── */
@keyframes emptyFadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
.empty-state{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:10px;padding:36px 20px;color:var(--text3);
  animation:emptyFadeIn .35s var(--ease-out);
}
.empty-state-icon{
  width:52px;height:52px;border-radius:var(--r);display:flex;align-items:center;justify-content:center;
  background:var(--glass3);border:0.5px solid var(--border);font-size:22px;color:var(--text3);
}
.empty-state-title{font-size:13px;font-weight:600;color:var(--text2)}
.empty-state-sub{font-size:11px;color:var(--text3);text-align:center;max-width:280px;line-height:1.5}

.count-up{transition:color .3s}

/* One market per row, stacked top to bottom. Two columns split the results
   into two parallel sequences, and the order the markets are sorted into —
   fits first, blocked last — only reads as an order down a single list. So
   the grid stays one column at every width; the card heights that the old
   two-column layout had to reconcile (hence align-items:stretch and the
   note pushed to the foot of the card) are each their own row now, and a
   card is as tall as its own content. */
.fit-panel-wrap{display:grid;grid-template-columns:1fr;gap:10px;margin-bottom:8px;align-items:stretch}
.fit-panel[data-status="fit"].fit-hidden{display:none!important}

/* ── Consolidated markets accordion (Market Fit Results) ── */
.mkt-accordion{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow),var(--inner);
  overflow:hidden;margin-bottom:14px;position:relative;
  transition:transform var(--dur) var(--ease-out),box-shadow var(--dur) var(--ease-out)}
/* The same sheen the analyzer's own cards carry — a light source above the
   card rather than a flat panel. One pixel tall, so it reads as an edge
   catching the light instead of a border. */
.mkt-accordion::before,.gt-sent-card::before{
  content:'';position:absolute;top:0;left:0;right:0;height:1px;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,0.16),transparent);
}
.mkt-accordion:not(.open):hover{transform:translateY(-1px);box-shadow:var(--shadow-lg),var(--inner)}
/* Not while open: lifting a panel somebody is reading moves the text under
   their eyes. */
.gt-sent-card{
  position:relative;
  transition:transform var(--dur) var(--ease-out),box-shadow var(--dur) var(--ease-out);
  box-shadow:var(--shadow),var(--inner);
}
.gt-sent-card:hover{transform:translateY(-1px);box-shadow:var(--shadow-lg),var(--inner)}
.mkt-accordion-head{width:100%;display:flex;align-items:center;gap:10px;padding:14px 16px;
  background:transparent;border:none;cursor:pointer;font-family:inherit;text-align:left;
  font-size:12px;font-weight:700;color:var(--text2);transition:background .15s,transform var(--dur-fast) var(--ease-out)}
.mkt-accordion-head:hover{background:var(--glass3)}
.mkt-accordion-head i.ti-list-details{font-size:14px;color:var(--text3);flex-shrink:0}
.mkt-accordion-title{flex:1;min-width:0}
.mkt-accordion-count{font-size:10px;font-weight:700;background:var(--glass3);border:0.5px solid var(--border);
  border-radius:99px;padding:2px 10px;color:var(--text3);flex-shrink:0}
.mkt-accordion-caret{color:var(--text3);font-size:14px;transition:transform .22s;flex-shrink:0}
.mkt-accordion.open .mkt-accordion-caret{transform:rotate(180deg)}
.mkt-accordion-body{max-height:0;opacity:0;overflow:hidden;padding:0 16px;
  transition:max-height .3s var(--ease-out),opacity .22s,padding .3s}
.mkt-accordion.open .mkt-accordion-body{max-height:20000px;opacity:1;padding:0 16px 16px}
.mkt-show-fit-toggle{display:none;align-items:center;gap:6px;margin:2px 0 4px;padding:8px 14px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:99px;cursor:pointer;
  font-family:inherit;font-size:11px;font-weight:600;color:var(--text2);transition:all .15s}
.mkt-show-fit-toggle:hover{background:var(--accent-soft);color:var(--accent)}
.fit-panel{background:var(--glass);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:1px solid var(--border);border-radius:12px;box-shadow:var(--shadow),var(--inner);padding:0;display:flex;flex-direction:column;overflow:hidden;min-width:0}
/* Whole-card color coding by result status. The order of #fit-panel-wrap is set in
   JS by _mktSortByStatus() (fit → referral → notfit → blocked, confidence within
   each), not here; the color is what tells one status from another once a reader
   is looking at a single card rather than at the run of them. */
.fit-panel[data-status="fit"]{border-color:var(--success-border);background:var(--success-soft)}
.fit-panel[data-status="referral"]{border-color:var(--warn-border);background:var(--warn-soft)}
.fit-panel[data-status="notfit"]{border-color:var(--danger-border);background:var(--danger-soft)}
.fit-panel.open>div[id^="fit-"]{max-height:420px;padding:0 11px 11px;opacity:1;
  flex:1;display:flex;flex-direction:column}
/* The notes sit at the foot of the card, so the flags of two cards side by
   side line up at the top and the extra height of the taller one does not
   push its notes out of step with its neighbour's. */
.fit-panel .mkt-note-wrap{margin-top:auto;padding:6px 0 0}
.fit-panel:not(.open)>div[id^="fit-"]{max-height:0;padding:0 11px;opacity:0;pointer-events:none}
.fit-panel>div[id^="fit-"]{transition:max-height .28s var(--ease-out),opacity .2s,padding .28s}
.fit-panel-caret{margin-left:auto;transition:transform .22s;color:var(--text3);font-size:13px}
.fit-panel.open .fit-panel-caret{transform:rotate(180deg)}
.fit-panel-head{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text3);padding:10px 11px;display:flex;align-items:center;gap:8px;flex-shrink:0;cursor:pointer;user-select:none;min-height:40px}
.fit-panel-head .fit-name{flex:1;min-width:0;line-height:1.3;overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.fit-panel-head .fit-panel-caret{margin-left:auto;flex-shrink:0}
.fit-panel-head .dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;background:var(--text3)}
/* Scrollable item list — prevents a market with many flags from stretching the whole page */
.fit-panel>div[id^="fit-"]{overflow-y:auto;overflow-x:hidden;flex:1;min-height:0;min-width:0;padding-right:4px;margin-right:-4px}
.fit-panel>div[id^="fit-"]::-webkit-scrollbar{width:4px}
.fit-panel>div[id^="fit-"]::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:3px}
.fit-item{font-size:11px;line-height:1.45;padding:5px 7px;border-radius:8px;margin-bottom:4px;display:flex;align-items:flex-start;gap:6px;min-width:0}
.fit-item:last-child{margin-bottom:0}
.fit-item.notfit{background:var(--danger-soft);border:1px solid var(--danger-border)}
.fit-item.possible{background:var(--success-soft);border:1px solid var(--success-border)}
.fit-item.blocked{background:var(--glass3);border:1px solid var(--border3)}
.fit-item i{font-size:13px;flex-shrink:0;margin-top:1px}
.fit-item.notfit i{color:var(--danger)}.fit-item.possible i{color:var(--success)}.fit-item.blocked i{color:var(--text3)}
.fit-label{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
.fl-title{font-size:11px;font-weight:600;color:var(--text);overflow-wrap:anywhere}
.fl-type{font-size:10px;font-weight:700;color:var(--danger);letter-spacing:.04em}
.fl-type.green{color:var(--success)}.fl-type.gray{color:var(--text3)}
.fl-detail{font-size:11px;color:var(--text2);margin-top:2px;line-height:1.5;overflow-wrap:anywhere}
/* ── MARKET FEEDBACK BAR ── */

.fit-empty{font-size:12px;color:var(--text3);font-style:italic}

/* ── ANALYZE WRAP ── */
.analyze-wrap{
  display:flex;align-items:center;gap:14px;margin-top:1.5rem;
  padding:18px 20px;
  background:var(--accent-soft);border:1px solid var(--border2);
  border-radius:var(--r-lg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  box-shadow:var(--inner);
}
.analyze-wrap p{font-size:12px;color:var(--text2);line-height:1.5}
.analyze-wrap .avp-btn.primary{white-space:nowrap;flex-shrink:0}

/* ── CHARTS ── */
.chart-wrap{background:var(--glass);border:1px solid var(--border);border-radius:var(--r);padding:18px 20px;box-shadow:var(--shadow),var(--inner);position:relative;overflow:hidden}
.chart-wrap::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)}
.chart-title{font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.1em;margin-bottom:14px}
/* ── Payroll chart ── */
.pchart-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:18px}
.pchart-title{font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.1em}
.pchart-total{font-size:26px;font-weight:200;color:var(--text);letter-spacing:-.03em;line-height:1;margin-top:3px}
.pchart-filters{display:flex;flex-direction:column;gap:8px;padding:10px 0 12px;border-bottom:0.5px solid var(--border3);margin-bottom:12px}
.pchart-filter-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pchart-filter-label{font-size:9px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.07em;white-space:nowrap;min-width:72px}
.pchart-filter-select{font-size:10px;border:0.5px solid var(--border);border-radius:7px;background:rgba(130,182,242,0.08);color:var(--text);padding:3px 8px;font-family:inherit;outline:none;cursor:pointer;max-width:180px}
.pchart-filter-select:focus{border-color:var(--accent)}
.pchart-state-pills{display:flex;flex-wrap:wrap;gap:4px;flex:1}
.psp{font-size:9px;font-weight:700;padding:2px 7px;border-radius:8px;border:0.5px solid var(--border);background:rgba(130,182,242,0.08);cursor:pointer;color:var(--text3);transition:background .14s,color .14s,border-color .14s;letter-spacing:.02em}
.psp:hover{background:rgba(130,182,242,0.18);color:var(--text)}
.psp.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.pchart-clear{font-size:9px;color:var(--accent);cursor:pointer;font-weight:600;background:none;border:none;font-family:inherit;padding:0;text-decoration:underline;white-space:nowrap}
.pchart-pay-inp{font-size:10px;border:0.5px solid var(--border);border-radius:7px;background:rgba(130,182,242,0.08);color:var(--text);padding:3px 8px;font-family:inherit;outline:none;width:120px}
.pchart-pay-inp:focus{border-color:var(--accent)}
.pchart-meta{font-size:10px;color:var(--text3);margin-top:2px}
.pchart-rows{display:flex;flex-direction:column;gap:13px}
.pchart-row{display:flex;flex-direction:column;gap:5px}
.pchart-row-header{display:flex;justify-content:space-between;align-items:center}
.pchart-badge{font-size:10px;font-weight:700;color:#fff;border-radius:5px;padding:2px 8px;letter-spacing:.04em}
.pchart-pct{font-size:10px;color:var(--text3);margin-left:6px}
.pchart-amt{font-size:12px;font-weight:700;color:var(--accent);font-variant-numeric:tabular-nums;font-family:var(--font-mono)}
.pchart-track{height:8px;background:rgba(130,182,242,.12);border-radius:4px;overflow:hidden}
.pchart-fill{height:100%;border-radius:4px;transition:width .75s var(--ease-out)}
/* ── Claims per Period — trend line ── */
.cchart-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:18px}
.cchart-legend{display:flex;flex-direction:column;gap:4px;align-items:flex-end}
.cchart-legend-item{display:flex;align-items:center;gap:5px;font-size:9px;color:var(--text3)}
.cchart-legend-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0}
/* SVG keeps its own width/height equal to the viewBox units (not just a
   viewBox) so max-width:100% scales it down uniformly on narrow screens —
   the circular point markers stay circular instead of stretching into
   ellipses the way a non-uniform preserveAspectRatio="none" scale would. */
.lchart-svg{width:100%;max-width:100%;height:auto;display:block;overflow:visible}
.lchart-pt{cursor:pointer}
.lchart-dot{transition:r .15s var(--ease-out)}
.lchart-pt:hover .lchart-dot{r:7}
/* donut chart removed */

/* ── David Tracker screen ── */
.dt-stat-chip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;
  padding:5px 14px;border-radius:var(--r-lg);background:var(--glass3);color:var(--text2);
  border:0.5px solid var(--border)}
.dt-stat-chip span{font-size:13px;font-weight:700;color:var(--text)}
.dt-stat-completed span{color:var(--success)}
.dt-stat-hold span{color:var(--warn)}
.dt-stat-pending span{color:#5856D6}
.dt-stat-declined span{color:var(--danger)}
.dt-filter-select{padding:6px 12px;border:0.5px solid var(--border2);border-radius:var(--r-lg);
  background:var(--glass3);color:var(--text2);font-size:11px;font-family:inherit;
  outline:none;cursor:pointer}

/* ── Custom select popup ──────────────────────────────────────────────────
   Every <select> on the site opens the browser's own square, OS-styled list —
   no CSS lets a page round the corners of that popup. 14-custom-select.js
   intercepts the mouse click that would open it and draws this rounded panel
   in its place instead, styled like every other floating card in the app
   (see .dt-filter-select just above for the same rounding on the closed box,
   and .gt-panel for the same glass/blur/shadow language on an open one) — the
   same look "Market" in CRM's filter row was asked to spread everywhere.
   Keyboard-only activation (Tab then Space/Enter/Arrow) still opens the
   native popup: only the mouse path is intercepted, so nothing about
   keyboard accessibility changes from before this existed. */
select.cs-active{border-color:var(--accent)!important}
.cs-panel{
  position:fixed;z-index:20000;min-width:120px;
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);
  padding:6px;overflow-y:auto;overflow-x:hidden;
  opacity:0;transform:translateY(-4px);pointer-events:none;
  transition:opacity .12s var(--ease-out),transform .12s var(--ease-out);
}
.cs-panel.open{opacity:1;transform:translateY(0);pointer-events:auto}
.cs-opt{padding:8px 12px;border-radius:var(--r-sm);font-size:13px;line-height:1.3;color:var(--text);
  cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cs-opt:hover{background:var(--glass3)}
.cs-opt.sel{background:var(--accent-soft);color:var(--accent);font-weight:600}
.cs-opt.disabled{opacity:.4;cursor:default;pointer-events:none}
.cs-optgroup-label{padding:8px 12px 4px;font-size:10px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--text3)}
.dt-th{padding:9px 12px;text-align:left;font-size:9px;font-weight:700;color:var(--text3);
  letter-spacing:.05em;text-transform:uppercase;cursor:pointer;white-space:nowrap;
  border-bottom:0.5px solid var(--border);user-select:none}
.dt-th:hover{color:var(--accent)}
#dt-table td{padding:8px 12px;border-bottom:0.5px solid var(--border3);color:var(--text);
  vertical-align:middle;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  transition:background var(--dur) var(--ease-out)}
#dt-table tr:hover td{background:var(--glass3)}
.dt-status-badge{display:inline-flex;align-items:center;font-size:10px;font-weight:700;
  padding:2px 9px;border-radius:var(--r-lg)}
.dt-status-badge.completed{background:rgba(52,199,89,0.12);color:var(--success)}
.dt-status-badge.hold{background:rgba(255,149,0,0.13);color:var(--warn)}
.dt-status-badge.pending{background:rgba(88,86,214,0.13);color:#5856D6}
.dt-status-badge.declined{background:rgba(255,59,48,0.12);color:var(--danger)}
.dt-status-badge.processing{background:rgba(var(--brand-blue-rgb),0.12);color:var(--accent)}
.dt-row-btn{background:none;border:none;color:var(--text3);cursor:pointer;font-size:13px;padding:2px 4px}
.dt-row-btn:hover{color:var(--accent)}

/* ── Calendar screen ── */
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;margin-bottom:4px}
.cal-dow{text-align:center;font-size:10px;font-weight:700;color:var(--text3);
  letter-spacing:.06em;padding:6px 0;text-transform:uppercase}
.cal-cell{min-height:80px;border-radius:var(--r-sm);padding:5px 7px;
  background:var(--glass-card);border:0.5px solid var(--border);
  backdrop-filter:saturate(180%) blur(18px);-webkit-backdrop-filter:saturate(180%) blur(18px);
  transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),
    box-shadow var(--dur-fast) var(--ease-out);position:relative;cursor:pointer}
.cal-cell:hover{background:var(--glass3);border-color:var(--border2)}
.cal-cell.today{border-color:var(--accent);background:rgba(var(--brand-blue-rgb),0.06)}
.cal-cell.other-month{opacity:.38}
.cal-cell.has-events{border-color:var(--accent)}
.cal-day-num{font-size:12px;font-weight:600;color:var(--text2);line-height:1}
.cal-cell.today .cal-day-num{
  width:22px;height:22px;border-radius:50%;background:var(--accent);
  color:#fff;display:flex;align-items:center;justify-content:center;font-size:11px}
.cal-evt-pill{
  margin-top:3px;padding:2px 7px;border-radius:99px;
  font-size:9px;font-weight:600;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;cursor:pointer;transition:opacity var(--dur-fast) var(--ease-out);
  background:rgba(var(--brand-blue-rgb),0.14);color:var(--accent);
  border:0.5px solid rgba(var(--brand-blue-rgb),0.24)}
.cal-evt-pill:hover{opacity:.8}
.cal-evt-pill.cat-renewal{background:rgba(52,199,89,0.16);color:var(--success);
  border-color:rgba(52,199,89,0.28)}
.cal-evt-pill.cat-deadline{background:rgba(255,59,48,0.16);color:var(--danger);
  border-color:rgba(255,59,48,0.28)}
.cal-evt-pill.cat-reminder{background:rgba(255,159,10,0.16);color:var(--warn);
  border-color:rgba(255,159,10,0.28)}
.cal-evt-pill.cat-other{background:var(--glass3);color:var(--text2);
  border-color:var(--border2)}
/* The two things on the calendar that are not meetings. A holiday is the
   country's, time off is the desk's record — neither is edited here, so both
   read as a statement rather than as something with a pencil on it. */
.cal-evt-pill.kind-holiday{background:rgba(175,82,222,0.16);color:#c07de8;
  border-color:rgba(175,82,222,0.30);cursor:default}
.cal-evt-pill.kind-timeoff{background:rgba(255,159,10,0.18);color:var(--warn);
  border-color:rgba(255,159,10,0.32);cursor:default}
/* Somebody else's week. Quieter than your own, and solid — dashed means one
   thing on this calendar and one only: nobody has approved it yet. */
.cal-evt-pill.kind-team{background:rgba(var(--brand-blue-rgb),0.10);color:var(--text2);
  border-color:rgba(var(--brand-blue-rgb),0.22);cursor:default}
.cal-evt-pill.kind-team.pending{border-style:dashed;color:var(--text3)}
.cal-evt-pill.kind-timeoff.pending{background:var(--glass3);color:var(--text3);
  border-style:dashed;border-color:var(--border2)}
.cal-evt-pill.kind-holiday:hover,.cal-evt-pill.kind-timeoff:hover{opacity:1}
/* A day nobody is working reads as one before anything is on it. */
.cal-cell.holiday{background:rgba(175,82,222,0.06)}
.cal-cell.holiday .cal-day-num{color:#c07de8}
/* Find and replace, and the count under the template being written. */
#tpl-find-bar{display:none;align-items:center;gap:8px;padding:9px 20px;
  border-bottom:0.5px solid var(--border);background:var(--glass3)}
#tpl-find-bar input{
  box-sizing:border-box;height:30px;padding:6px 10px;
  border:0.5px solid var(--border2);border-radius:8px;
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;outline:none;
  transition:border-color var(--dur-fast) var(--ease-out)}
#tpl-find-bar input:focus{border-color:var(--accent)}
#tpl-find-count{font-size:11px;color:var(--text3);min-width:82px}
#tpl-editor-count{padding:8px 40px 12px;font-size:11px;color:var(--text3);
  border-top:0.5px solid var(--border)}

/* Carriers: what the app knows about every market, laid out to be read. */
/* ── The Carriers filter bar ──────────────────────────────────────────────
   Four questions, side by side, each labelled with what it asks rather than
   left as a bare dropdown. Wraps to as many rows as it needs: these sit above
   a grid that is already responsive, and a filter bar that scrolls sideways
   on a laptop is a filter nobody finds. */
.car-filters{
  display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;margin-bottom:14px;
  padding:12px 14px;border-radius:var(--r-sm);
  background:var(--glass-card);border:0.5px solid var(--border);
  backdrop-filter:saturate(180%) blur(18px);-webkit-backdrop-filter:saturate(180%) blur(18px)}
.car-filter{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1 1 150px}
.car-filter > label{
  font-size:10px;font-weight:700;color:var(--text3);
  letter-spacing:.06em;text-transform:uppercase}
.car-filter select,.car-filter input{
  box-sizing:border-box;width:100%;height:32px;padding:5px 9px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;
  outline:none;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
.car-filter select:focus,.car-filter input:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
/* Lit while it is narrowing something, so "why am I seeing six carriers"
   is answered by looking at the bar rather than by opening each dropdown. */
.car-filter.on select,.car-filter.on input{border-color:var(--accent);color:var(--accent)}
.car-clear{
  display:inline-flex;align-items:center;gap:5px;height:32px;padding:0 12px;
  border-radius:var(--r-sm);cursor:pointer;font-family:inherit;
  font-size:11px;font-weight:600;color:var(--text2);
  background:var(--glass3);border:0.5px solid var(--border2);
  transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out)}
.car-clear:hover{background:var(--glass-card);color:var(--text)}
/* What a filter could not answer outright. A market whose new-venture rule
   is conditional — a business plan, a payroll floor, one trade — is neither
   a Yes nor a No, and dropping it would hide a carrier that may well write
   the account. It stays, and says what the condition is. */
.car-cond{
  display:flex;align-items:flex-start;gap:6px;margin-top:8px;
  padding:7px 10px;border-radius:var(--r-sm);
  font-size:11px;line-height:1.45;color:var(--warn);
  background:var(--warn-soft);border:0.5px solid var(--warn-border)}
.car-cond > i{font-size:12px;flex:0 0 auto;margin-top:1px}

.car-count{font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.06em;
  text-transform:uppercase;margin-bottom:12px}
/* align-items:start, so a card is as tall as its own content. Stretched to
   the tallest in the row, a carrier with two lines of notes sat in a box the
   height of biBERK's fourteen. */
.car-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:14px;align-items:start}
.car-why{display:flex;align-items:center;gap:5px;font-size:10px;font-weight:600;
  color:var(--warn);background:rgba(255,159,10,0.10);border:0.5px solid rgba(255,159,10,0.24);
  border-radius:7px;padding:4px 9px;margin-bottom:9px}
.car-card{
  background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-sm);
  padding:16px 18px;
  backdrop-filter:saturate(180%) blur(18px);-webkit-backdrop-filter:saturate(180%) blur(18px);
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
.car-card:hover{border-color:var(--border2)}
.car-head{display:flex;align-items:flex-start;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.car-name{font-size:14px;font-weight:700;color:var(--text);flex:1;min-width:0}
.car-people{display:flex;flex-wrap:wrap;gap:5px}
.car-person{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:600;
  color:var(--accent);background:rgba(var(--brand-blue-rgb),0.10);
  border:0.5px solid rgba(var(--brand-blue-rgb),0.22);border-radius:99px;padding:3px 9px;
  text-decoration:none;transition:background var(--dur-fast) var(--ease-out)}
.car-person:hover{background:rgba(var(--brand-blue-rgb),0.18)}
.car-nobody{font-size:10px;color:var(--text3);font-style:italic}
.car-states{font-size:11px;color:var(--text2);margin-bottom:9px;line-height:1.5}
.car-k{font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text3);margin-right:5px}
.car-lims{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:9px}
.car-lim{display:inline-flex;align-items:baseline;gap:3px;font-size:11px;font-weight:600;
  color:var(--text);background:var(--glass3);border:0.5px solid var(--border);
  border-radius:7px;padding:4px 9px;font-variant-numeric:tabular-nums}
.car-notes{font-size:11px;color:var(--text2);line-height:1.55;margin-bottom:9px}
.car-no summary{font-size:11px;font-weight:600;color:var(--danger);cursor:pointer;
  list-style:none;padding:4px 0;transition:opacity var(--dur-fast) var(--ease-out)}
.car-no summary::-webkit-details-marker{display:none}
.car-no summary::before{content:'\25B8';display:inline-block;margin-right:6px;
  transition:transform var(--dur-fast) var(--ease-out)}
.car-no[open] summary::before{transform:rotate(90deg)}
.car-no summary:hover{opacity:.8}
.car-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
.car-chip{font-size:10px;color:var(--text2);background:rgba(255,59,48,0.08);
  border:0.5px solid rgba(255,59,48,0.20);border-radius:99px;padding:2px 8px}
.car-chip.car-code{font-variant-numeric:tabular-nums;background:var(--glass3);
  border-color:var(--border2);color:var(--text3)}
.car-chip.car-more{background:none;border-style:dashed;color:var(--text3)}

/* Desk content, in the Admin panel: the three things one person decides. */
.admws-sec-head{display:flex;align-items:center;gap:11px;margin:30px 0 14px}
.admws-sec-head > i{font-size:20px;color:var(--accent)}
.admws-sec-title{font-size:14px;font-weight:700;color:var(--text)}
.admws-sec-sub{font-size:11px;color:var(--text3);margin-top:2px}
.admws-content-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
.admws-content-card{
  display:flex;flex-direction:column;align-items:flex-start;gap:3px;
  padding:16px 18px;text-align:left;cursor:pointer;font-family:inherit;
  background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-sm);
  backdrop-filter:saturate(180%) blur(18px);-webkit-backdrop-filter:saturate(180%) blur(18px);
  transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),
    box-shadow var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out)}
.admws-content-card:hover{background:var(--glass3);border-color:var(--border2);transform:translateY(-1px)}
.admws-content-card:active{transform:translateY(0) scale(.995)}
.admws-content-card > i{font-size:20px;color:var(--accent);margin-bottom:4px}
.admws-content-title{font-size:13px;font-weight:700;color:var(--text)}
.admws-content-sub{font-size:11px;color:var(--text3)}
#dcm-card{
  width:100%;max-width:720px;max-height:88vh;overflow-y:auto;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:18px;padding:22px 24px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg)}
.dcm-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:0 12px}

/* The links editor. One row per link: dot, what it is called, where it goes,
   and the three buttons that move or remove it. The name box is narrower than
   the address box because the names are short ("SOS AK") and the addresses are
   not — sized the other way round, every address scrolls inside its box. */
#dcl-card{
  width:100%;max-width:760px;max-height:88vh;overflow-y:auto;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:18px;padding:22px 24px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg)}
#dcl-rows{display:flex;flex-direction:column;gap:6px;max-height:44vh;overflow-y:auto;padding-right:2px}
/* The crane picker — a checkbox grid, same card chrome as Links' above, sized
   for a list rather than for two-box rows. */
#crane-card{
  width:100%;max-width:480px;max-height:88vh;overflow-y:auto;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:18px;padding:22px 24px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg)}
/* Fixed, decorative, out of the way of anything clickable — the owner's own
   corner easter egg on whichever screens the picker checks. Top right rather
   than either bottom corner: bottom-right is the clock/weather column and
   bottom-left is Back-to-top, both always on screen, and a third fixed thing
   in either would be a pile. Low z-index on purpose — the calculator and the
   vacation dock (both far higher) are allowed to sit over it when opened;
   this never needs to win that fight, only to be there otherwise. */
.crane-float{
  position:fixed;top:74px;right:18px;z-index:45;
  pointer-events:none;display:none;opacity:.9;
  filter:drop-shadow(0 6px 16px rgba(0,0,0,.18))}
.crane-float .kpi-crane{width:92px;height:62px}
@media(max-width:900px){ .crane-float{display:none!important} }
.dcl-row{display:flex;align-items:center;gap:8px}
.dcl-row .cp-dot{flex:0 0 auto}
.dcl-row input{
  box-sizing:border-box;min-width:0;padding:7px 10px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;outline:none;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
.dcl-row input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.dcl-row .dcl-label{flex:2 1 0}
.dcl-row .dcl-url{flex:3 1 0}
.dcl-mini{
  flex:0 0 auto;width:28px;height:28px;display:flex;align-items:center;justify-content:center;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--glass3);color:var(--text2);font-size:13px;cursor:pointer;
  transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out)}
.dcl-mini:hover:not(:disabled){background:var(--glass2);color:var(--text)}
.dcl-mini:disabled{opacity:.35;cursor:default}
.dcl-mini.dcl-del:hover{color:#e94d4d}
@media (max-width:560px){
  .dcl-row{flex-wrap:wrap}
  .dcl-row .dcl-label{flex:1 1 100%}
  .dcl-row .dcl-url{flex:1 1 100%}
}

/* The class-code rates editor. Each row is one state+code and the rate that
   replaces the published one, with what the NCCI table says for that pair
   printed underneath — so the desk can see what it is overriding, and see
   when it is adding a pair the table has no row for at all. The description
   box is the widest because descriptions are long and the other three are a
   two-letter state, a four-digit code and a small number. */
#ccr-card{
  width:100%;max-width:820px;max-height:88vh;overflow-y:auto;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:18px;padding:22px 24px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg)}
#ccr-rows{display:flex;flex-direction:column;gap:10px;max-height:46vh;overflow-y:auto;padding-right:2px}
.ccr-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ccr-row .eml-input,.ccr-row .eml-select{
  box-sizing:border-box;min-width:0;padding:7px 10px;font-size:12px;margin:0}
.ccr-row .ccr-state{flex:0 0 84px}
.ccr-row .ccr-code{flex:0 0 84px}
.ccr-row .ccr-rate{flex:0 0 96px}
.ccr-row .ccr-desc{flex:1 1 200px}
.ccr-row .ccr-del{flex:0 0 auto;padding:6px 9px;font-size:11px}
/* Full width on its own line under the row's boxes, not squeezed between
   them: it is a sentence, and a sentence in a 90px column is unreadable. */
.ccr-row .ccr-base{flex:1 1 100%;font-size:10px;color:var(--text3);padding-left:2px;min-height:13px}
.ccr-row .ccr-base-new{color:var(--warn)}
.ccr-empty{font-size:12px;color:var(--text3);padding:14px 2px}
.ccr-status{
  margin-top:10px;padding:9px 11px;border-radius:var(--r-sm);
  font-size:11px;line-height:1.45}
/* Saved here but not shared is neither success nor failure, and colouring it
   as either is how somebody reads past it. */
.ccr-status-partial{
  background:var(--warn-soft,rgba(230,126,34,0.12));
  border:0.5px solid var(--warn);color:var(--text)}
@media (max-width:560px){
  .ccr-row .ccr-state,.ccr-row .ccr-code,.ccr-row .ccr-rate{flex:1 1 30%}
  .ccr-row .ccr-desc{flex:1 1 100%}
}

/* The System users filter bar, and the password generator beside it. Wraps
   rather than scrolls: at phone width the search box takes the row and the
   role select and the buttons fall under it, which is the only arrangement
   where the search box is still wide enough to read what you typed. */
.admws-filter-bar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px}
.admws-filter-search{position:relative;flex:1 1 220px;min-width:0}
.admws-filter-search i{
  position:absolute;left:10px;top:50%;transform:translateY(-50%);
  font-size:13px;color:var(--text3);pointer-events:none}
.admws-filter-search input{
  box-sizing:border-box;height:34px;width:100%;padding:8px 10px 8px 30px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;outline:none;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
.admws-filter-search input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
/* box-sizing and an explicit height, so this lines up with the search box
   beside it: a select and an input with the same padding still come out two
   pixels apart, which is exactly what the control-height check catches. */
#admws-filter-role{
  box-sizing:border-box;height:34px;
  flex:0 0 auto;padding:8px 10px;border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;outline:none}
.admws-filter-count{font-size:11px;color:var(--text3);margin-left:auto;white-space:nowrap}
.admws-filter-empty{font-size:12px;color:var(--text3);padding:14px 2px}
.admws-gen-out{
  margin:0 0 12px;padding:12px;border-radius:var(--r-sm);
  border:0.5px solid var(--border2);background:var(--glass3)}
.admws-gen-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.admws-gen-row label{flex:0 0 68px;font-size:11px;color:var(--text3)}
.admws-gen-row input{
  flex:1 1 0;min-width:0;padding:7px 10px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);
  font-family:var(--font-mono);font-size:12px;outline:none}
.admws-gen-note{font-size:11px;color:var(--text3);line-height:1.45}
@media (max-width:560px){
  .admws-filter-count{margin-left:0}
  .admws-gen-row{flex-wrap:wrap}
  .admws-gen-row input{flex:1 1 100%}
}

#dcm-fields textarea{
  box-sizing:border-box;width:100%;padding:8px 11px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;
  outline:none;resize:vertical;line-height:1.5;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
#dcm-fields input,#dcm-fields textarea:focus,#dcm-fields input:focus{outline:none}
#dcm-fields input{
  box-sizing:border-box;width:100%;height:34px;padding:8px 11px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
#dcm-fields input:focus,#dcm-fields textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}

/* The Analyzer's email template, beside what it sends. */
#aem-card,#dem-card{
  width:100%;max-width:980px;max-height:88vh;overflow-y:auto;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:18px;padding:22px 24px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg)}
.aem-split{display:grid;grid-template-columns:1fr 1fr;gap:14px}
@media(max-width:820px){.aem-split{grid-template-columns:1fr}}
#aem-body,#aem-preview,#dem-body,#dem-preview{
  box-sizing:border-box;width:100%;height:320px;margin:0;
  padding:10px 12px;border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55;
  outline:none;resize:vertical;white-space:pre-wrap;overflow:auto}
#aem-body:focus,#dem-body:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
#aem-preview,#dem-preview{background:var(--glass3);color:var(--text2);resize:none}

/* The market-contacts editor: the app's own modal, the app's own fields. */
#eml-contacts-card{
  width:100%;max-width:620px;max-height:86vh;overflow-y:auto;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:18px;padding:22px 24px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg)}
.eml-contact-row{display:grid;grid-template-columns:1fr 1.3fr 0.7fr auto;gap:7px;align-items:center;margin-bottom:7px}
.eml-contact-row input{
  box-sizing:border-box;width:100%;height:34px;padding:8px 11px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;font-family:inherit;outline:none;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
.eml-contact-row input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
@media(max-width:560px){.eml-contact-row{grid-template-columns:1fr auto}}
.cal-evt-card.read-only{cursor:default}
.cal-evt-card.read-only:hover{background:var(--glass-card);border-color:var(--border)}

/* One card for a meeting, wherever it is read: the Upcoming list under the
   month and the day panel on the right both built this inline, twice, with
   a 12px radius and no frost, so the two lists of the same thing did not
   match each other and neither matched the panel they sat in. */
.cal-evt-card{
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:var(--r-sm);
  backdrop-filter:saturate(180%) blur(18px);-webkit-backdrop-filter:saturate(180%) blur(18px);
  transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),
    box-shadow var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out)}
.cal-evt-card.row{padding:10px 14px;display:flex;align-items:flex-start;gap:12px;cursor:pointer}
.cal-evt-card.row:hover{background:var(--glass3);border-color:var(--border2)}
.cal-evt-card.stack{padding:11px 13px}
/* The two square close buttons and the pencil/trash pair in a card were
   written inline and so answered the pointer differently from every other
   button on the site. Both are named in the control recipe further down. */
.cal-x-btn{width:28px;height:28px;border-radius:var(--r-sm);
  border:0.5px solid var(--border);background:var(--glass3);color:var(--text3);
  cursor:pointer;display:flex;align-items:center;justify-content:center;font-family:inherit;padding:0}
.cal-x-btn:hover{background:rgba(var(--brand-blue-rgb),0.16);color:var(--text)}
.cal-icon-btn{background:none;border:none;color:var(--text3);cursor:pointer;
  font-size:13px;padding:2px 4px;border-radius:7px;font-family:inherit}
.cal-icon-btn:hover{color:var(--accent);background:rgba(var(--brand-blue-rgb),0.12)}
.cal-icon-btn.danger{color:var(--danger)}
.cal-icon-btn.danger:hover{color:var(--danger);background:rgba(255,59,48,0.12)}
.cal-icon-btn.accent{color:var(--accent)}
/* Modal */
#cal-modal{
  position:fixed;inset:0;z-index:9100;display:none;
  align-items:center;justify-content:center;
  background:rgba(0,0,0,0.45);backdrop-filter:blur(6px)
}
#cal-modal.open{display:flex}
#cal-modal-card{
  width:100%;max-width:440px;
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:18px;padding:24px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg);
}
.cal-modal-title{font-size:16px;font-weight:700;color:var(--text);margin-bottom:18px}
.cal-field{display:flex;flex-direction:column;gap:5px;margin-bottom:14px}
.cal-field label{font-size:10px;font-weight:700;color:var(--text3);letter-spacing:.04em}
/* Every control in the meeting form is the dropdown's design, height
   included. They already shared a padding, a radius and a border and still
   came out three different sizes — measured, a text field was 32px, the
   select and the date 34px, and a time input 36.6px, because each renders
   its own furniture inside identical padding. So the select's 34px is
   stated rather than left to each control to arrive at, the same fix the
   Time Off form already carries. */
.cal-field input,.cal-field select,.cal-field textarea{
  box-sizing:border-box;
  padding:8px 11px;border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);font-size:12px;
  font-family:inherit;outline:none;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}
.cal-field input,.cal-field select{height:34px}
.cal-field input:focus,.cal-field select:focus,.cal-field textarea:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.cal-field select{cursor:pointer;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23163a66' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;
  background-position:right 10px center;padding-right:28px;
  background-color:var(--input-bg)}
[data-theme="dark"] .cal-field select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%234d8fe6' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}
.cal-field textarea{resize:vertical;height:auto;min-height:72px}
.cal-field-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}
/* Day detail panel */
#cal-day-panel{
  position:fixed;top:0;right:0;bottom:0;width:310px;z-index:9050;
  background:var(--glass-card);border-left:0.5px solid var(--border);
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:-8px 0 32px rgba(0,0,0,0.12);
  transform:translateX(100%);transition:transform .3s var(--ease-out);
  display:flex;flex-direction:column;
}
#cal-day-panel.open{transform:translateX(0)}

/* ── Directory screen ── */
.dir-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:10px}
.dir-card{
  display:flex;align-items:center;gap:13px;
  background:var(--glass-card);border:0.5px solid var(--border);
  backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  /* No drop shadow. --shadow's dark half is two layers of black — 24px at
     half opacity and a tight 6px at a third — which against this screen's
     near-black background did not read as a card lifted off the page but as
     a black ring drawn around every contact, eighteen of them in a grid. The
     pane is defined by its hairline and its own lip (.lg-spec) instead,
     which is how the rest of the glass in this app says where it ends. */
  border-radius:18px;padding:13px 15px;
  position:relative;overflow:hidden;
  transition:box-shadow .15s,border-color .15s,transform .15s;
}
.dir-card::before{content:'';position:absolute;top:0;left:0;right:0;height:40%;background:linear-gradient(180deg,rgba(77,143,230,0.08) 0%,rgba(0,100,200,0.03) 40%,transparent 80%);pointer-events:none}
.dir-card > *{position:relative}
.dir-card:hover{border-color:rgba(130,182,242,0.30);transform:translateY(-1px)}
.dir-card[style*="display:none"]{display:none!important}
.dir-avatar{
  width:40px;height:40px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:13px;font-weight:700;color:#fff;flex-shrink:0;
  box-shadow:0 2px 8px rgba(0,0,0,0.20),0 0 0 3px var(--glass2);
  position:relative;
}
/* Covers the initials once a photo loads; the status dot (z-index 2) still
   sits on top of it, which is why this stops at 1 rather than going higher. */
.dir-avatar-img{
  position:absolute;inset:0;width:100%;height:100%;
  border-radius:50%;object-fit:cover;z-index:1;
}
.dir-info{flex:1;min-width:0}
.dir-name{font-size:13px;font-weight:700;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dir-email{
  font-size:11px;color:var(--text3);
  text-decoration:none;display:block;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  margin-top:2px;transition:color .12s;
}
.dir-email:hover{color:var(--accent)}
.dir-purpose{font-size:10px;color:var(--text3);font-style:italic;margin-top:3px;white-space:normal}
.dir-mail-btn{
  width:32px;height:32px;border-radius:var(--r-sm);border:0.5px solid var(--border2);
  background:var(--accent-soft);color:var(--accent);
  cursor:pointer;display:flex;align-items:center;justify-content:center;
  flex-shrink:0;font-size:14px;transition:background .15s,color .15s,transform var(--dur-fast) var(--ease-out);
}
.dir-mail-btn:hover{background:var(--accent);color:#fff;border-color:var(--accent)}
.dir-sec-header{
  display:flex;align-items:center;gap:8px;margin-bottom:12px;
  cursor:pointer;user-select:none;padding:4px 0;
}
.dir-sec-header:hover .dir-sec-label{opacity:.8}
.dir-sec-caret{
  width:20px;height:20px;border-radius:6px;
  display:flex;align-items:center;justify-content:center;
  background:var(--accent-soft);border:0.5px solid var(--border2);
  font-size:10px;color:var(--accent);flex-shrink:0;
  transition:transform .25s var(--ease-out);
}
.dir-sec-caret.open{transform:rotate(0deg)}
.dir-sec-caret.closed{transform:rotate(-90deg)}
.dir-grid-wrap{
  overflow:hidden;
  transition:max-height .35s var(--ease-out),opacity .25s ease;
  max-height:2000px;opacity:1;
}
.dir-grid-wrap.collapsed{max-height:0;opacity:0}
/* Market Contacts' own filter — built from the data-market values actually
   present (dirBuildMarketFilter()), so a market added later gets a chip
   without a second place to remember to add it. */
.dir-market-filter{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
.dir-market-chip{
  font-size:11px;font-weight:600;padding:5px 12px;border-radius:99px;
  border:0.5px solid var(--border2);background:var(--glass3);color:var(--text2);
  cursor:pointer;font-family:inherit;transition:background .15s,color .15s,border-color .15s,transform var(--dur-fast) var(--ease-out);
}
.dir-market-chip:hover{border-color:var(--pal-purple);color:var(--text)}
.dir-market-chip.active{background:var(--pal-purple);color:#fff;border-color:var(--pal-purple)}

/* ── HEIGHT/DEPTH CARD ── */
.exp-type-toggle{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.exp-type-btn{padding:6px 16px;font-size:11px;font-weight:600;border:1px solid var(--border);border-radius:99px;cursor:pointer;background:transparent;color:var(--text2);font-family:inherit;transition:all .15s;min-height:36px}
.exp-type-btn.active{background:var(--accent-soft);color:var(--accent);border-color:var(--border2)}

/* ── EMAIL CARD ── */
.em-greeting{font-size:14px;color:var(--text2);margin-bottom:14px}
.em-prem{color:var(--accent)}.em-wrap{font-size:13px;line-height:1.9;color:var(--text);font-family:inherit}
.em-line{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px;padding:3px 0}
.em-label{font-weight:600;color:var(--text);white-space:nowrap;flex-shrink:0}
.em-label-green{color:var(--success)}

.em-dash{color:var(--text3);flex-shrink:0}

.em-possible{margin-top:6px}
.em-blocked{margin-top:4px}

.em-note{margin-top:12px;font-size:12px;color:var(--text3);font-style:italic;border-top:1px solid var(--border);padding-top:10px}
.em-greeting{font-weight:600;margin-bottom:2px}
.em-premium-line{margin:4px 0 10px}
/* The email as it will be pasted (see _analyzerEmailHtml): one line per line
   of the text, a blank line where the text has one — the spacing is the
   text's, so these undo the card's own margins, rules and flex rows. */
.em-doc .em-line{display:block;padding:0;margin:0}
.em-doc .em-greeting{font-weight:400;font-size:inherit;color:var(--text)}
.em-doc .em-gap{line-height:1.7}
.em-doc .em-notes-list{font-size:inherit;color:var(--accent);line-height:1.7}
.em-doc .em-label-green{color:var(--success)}
.em-doc .em-blocked b{color:var(--text3)}

.doc-card{display:flex;align-items:center;gap:16px;padding:16px 18px;border-radius:18px;background:var(--glass-card);backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);border:0.5px solid var(--border);box-shadow:var(--shadow);transition:opacity .2s,transform .15s,border-color .15s}
.doc-card:hover{transform:translateY(-1px);border-color:rgba(130,182,242,0.28)}
.doc-card.hidden{display:none}
.doc-card-nested{border-radius:12px;box-shadow:none;border-color:var(--border2);background:var(--accent-soft)}
/* A folder is an .avp-card that happens to open. It carried its own slightly
   different glass — a smaller blur, a flat surface, a radius of its own and no
   hover — so the Documents screen read as a cousin of the Analyzer rather than
   the same room: same colours, different material. These are the Analyzer's
   own values, down to the light falling across the top of the card, so the two
   screens change together from now on. */
.doc-group{
  border-radius:var(--r-lg);
  background:var(--glass-card);
  backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);box-shadow:var(--shadow);
  overflow:hidden;position:relative;
  transition:border-color .25s var(--ease-out),box-shadow .25s var(--ease-out),transform .25s var(--ease-out),opacity .2s;
}
.doc-group::before{content:'';position:absolute;top:0;left:0;right:0;height:40%;background:linear-gradient(180deg,rgba(77,143,230,0.08) 0%,rgba(0,100,200,0.03) 40%,transparent 80%);pointer-events:none}
.doc-group:hover{border-color:rgba(77,143,230,0.45);box-shadow:var(--shadow-lg);transform:translateY(-1px)}
/* An open folder does not lift: it is a container you are reading inside, and
   a card that rises under the pointer while you move down a list of documents
   makes the list itself feel unsteady. */
.doc-group.open:hover{transform:none;box-shadow:var(--shadow)}
@media(prefers-reduced-motion:reduce){.doc-group{transition:border-color .15s,box-shadow .15s}.doc-group:hover{transform:none}}
/* A nested folder sits inside that glass, so it must not paint its own sheet of
   it — two panels of frosted glass one behind the other read as a card that
   failed to load. */
.doc-group-nested::before{content:none}
.doc-group.hidden{display:none}
.doc-group-head{display:flex;align-items:center;gap:16px;padding:16px 18px;cursor:pointer;user-select:none}
.doc-group-head:hover{background:var(--accent-soft)}
.doc-group-caret{flex-shrink:0;width:28px;height:28px;border-radius:50%;background:var(--accent-soft);border:0.5px solid var(--border2);display:flex;align-items:center;justify-content:center;color:var(--accent);font-size:14px;transition:transform .25s ease}
/* Direct child, not descendant. A folder can now hold folders, and written as
   a descendant selector these two said "open" about every caret and every body
   underneath an open folder — so opening Agency Agreements opened all seven
   carrier folders with it, and their carets pointed up while their own state
   said closed. */
.doc-group.open > .doc-group-head > .doc-group-caret{transform:rotate(180deg)}
.doc-group-body{display:none;flex-direction:column;gap:8px;padding:0 14px 14px}
.doc-group.open > .doc-group-body{display:flex}
/* A folder sitting inside a folder. It takes the tint and the 12px radius of a
   document row rather than the card treatment of the folder above it: nested,
   a second glass panel inside the first reads as a card that failed to load,
   and its own shadow adds an edge the eye follows instead of the nesting. The
   proportions inside it (36px tile, 13px name) are set where the row is built,
   for the same reason the top-level ones are — one place, both grades. */
.doc-group-nested{border-radius:12px;background:var(--accent-soft);border-color:var(--border2);box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}
.doc-group-nested>.doc-group-head{gap:12px;padding:10px 12px}
.doc-group-nested>.doc-group-head:hover{background:var(--glass2)}
.doc-group-nested>.doc-group-body{padding:0 10px 10px}
.doc-group-nested .doc-group-caret{width:24px;height:24px;font-size:12px}
/* The grip that starts a drag — reordering only, the folder's own siblings
   trade places, nothing moves between folders. Invisible until the row is
   hovered or the folder is mid-drag, so it never competes with the name for
   attention on a screen somebody is just reading. */
.doc-drag-handle{
  flex-shrink:0;width:20px;height:28px;border:none;background:none;padding:0;
  display:flex;align-items:center;justify-content:center;color:var(--text3);
  cursor:grab;opacity:0;transition:opacity var(--dur-fast),transform var(--dur-fast) var(--ease-out);
}
.doc-group-head:hover .doc-drag-handle{opacity:.6}
.doc-drag-handle:hover{opacity:1 !important;color:var(--text2)}
.doc-drag-handle:active{cursor:grabbing}
.doc-group.doc-dragging{opacity:.4}
/* Where the dragged folder would land — a line on whichever edge of the
   folder under the pointer is nearer, top for "before it", bottom for
   "after it", the same idea as every file manager's insertion marker. */
.doc-group.doc-drop-before{box-shadow:inset 0 2px 0 var(--accent)}
.doc-group.doc-drop-after{box-shadow:inset 0 -2px 0 var(--accent)}
/* Upload, in the folder's header beside the caret. It used to be a full-width
   bar at the bottom of every folder body, which was one bar per folder — nine
   of them down the screen, each as loud as the documents it sat under, and the
   two that mattered lost among the seven under empty carrier folders. As a
   header action it is in the same place for every folder and costs a row
   nowhere. Sized and shaped to the caret so the header keeps its rhythm. */
.doc-group-act{
  flex-shrink:0;width:28px;height:28px;border-radius:50%;
  background:var(--glass);border:0.5px solid var(--border2);
  display:flex;align-items:center;justify-content:center;
  color:var(--text3);font-size:13px;cursor:pointer;padding:0;
  transition:background var(--dur-fast),color var(--dur-fast),border-color var(--dur-fast),
             transform var(--dur-fast) var(--ease-out);
}
.doc-group-act:hover{background:var(--accent-soft);color:var(--accent);border-color:var(--border2)}
.doc-group-nested .doc-group-act{width:24px;height:24px;font-size:12px}
/* ── Documents: one column, one toolbar, the Analyzer's own furniture ──
   The screen used to carry three different systems of its own: an inline
   uppercase caption where the Analyzer uses .sec-head, a tab bar halfway down
   that filtered only the half below it, and column geometry written inline on
   four separate wrappers. These classes put it on the same rails as every
   other screen, so a change to the column or to a section heading happens once. */
.docs-zone{max-width:var(--col-std);margin:8px auto 0;padding:0 20px;display:flex;flex-direction:column;gap:12px}
.docs-sec{max-width:var(--col-std);margin-left:auto;margin-right:auto;padding:0 20px}
.docs-toolbar-wrap{max-width:var(--col-std);margin:14px auto 0;padding:0 20px}
.docs-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.docs-toolbar-right{display:flex;align-items:center;gap:8px;margin-left:auto;flex-wrap:wrap}
.docs-chiprow{display:flex;gap:6px;flex-wrap:wrap}
.docs-chip{
  display:inline-flex;align-items:center;gap:5px;
  padding:6px 12px;border-radius:99px;font-size:11px;font-weight:600;
  font-family:inherit;cursor:pointer;white-space:nowrap;
  background:var(--glass);border:0.5px solid var(--border);color:var(--text2);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  box-shadow:var(--shadow);
  transition:background var(--dur-fast),color var(--dur-fast),border-color var(--dur-fast);
}
.docs-chip i{font-size:12px}
.docs-chip:hover{background:var(--glass2);color:var(--text)}
.docs-chip.active{background:var(--accent-soft);border-color:var(--border2);color:var(--accent)}
.docs-result-line{font-size:11px;color:var(--text3);margin-top:8px;min-height:14px}

/* Search, in the top bar. It shrinks before the buttons do, and disappears
   below them on a narrow screen rather than pushing them off the edge. */
.docs-search{
  display:flex;align-items:center;gap:6px;flex:1 1 200px;min-width:0;max-width:340px;
  margin-left:14px;padding:0 10px;height:32px;border-radius:99px;
  background:var(--glass);border:0.5px solid var(--border);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
}
.docs-search > i{font-size:13px;color:var(--text3);flex-shrink:0}
.docs-search input{
  flex:1;min-width:0;border:0;background:transparent;outline:none;
  font-family:inherit;font-size:12px;color:var(--text);
}
.docs-search input::placeholder{color:var(--text3)}
.docs-search input::-webkit-search-cancel-button{display:none}
.docs-search button{
  display:none;border:0;background:transparent;cursor:pointer;padding:0;
  color:var(--text3);font-size:13px;line-height:1;flex-shrink:0;
}
.docs-search.has-text button{display:block}
.docs-search:focus-within{border-color:var(--border2);background:var(--glass2)}
@media(max-width:820px){
  .docs-search{order:3;flex-basis:100%;max-width:none;margin:8px 0 0}
}

/* Grid. The same cards, laid out across instead of down — worth having for
   folders, which are the thing you scan for by name, and deliberately not
   applied to an open folder's contents, where a document row's name has to be
   readable at full width. */
.docs-zone.docs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));align-items:start}
.docs-zone.docs-grid .doc-card{grid-column:auto}
.docs-zone.docs-grid .doc-group.open{grid-column:1/-1}
/* A line of prose is not a card. Left to take a cell of its own it sat in the
   first column with the folders flowing around it, and the gap it left read as
   a folder that had failed to render. */
.docs-zone.docs-grid .docs-zone-note{grid-column:1/-1}
.docs-hidden{display:none!important}

/* The colour of a folder is the one thing on this screen people asked to be
   able to change, so it is a control rather than a constant: the tile is a
   button, and the swatch row it opens writes the choice to localStorage. */
.doc-tile-btn{border:0;padding:0;background:transparent;cursor:pointer;display:block;flex-shrink:0}
.doc-swatches{display:flex;gap:6px;flex-wrap:wrap;padding:8px 2px 2px}
.doc-swatch{width:20px;height:20px;border-radius:50%;border:2px solid transparent;cursor:pointer;padding:0}
.doc-swatch.on{border-color:var(--text)}

/* ── Documents: preview ──
   A document you can look at without leaving the screen you found it on, and
   without handing it to whatever the machine opens PDFs with. Built as one
   overlay because the document being looked at is the only thing here there is
   ever exactly one of. */
.doc-prev{
  position:fixed;inset:0;z-index:9500;
  background:rgba(6,10,20,0.72);
  backdrop-filter:blur(18px) saturate(140%);-webkit-backdrop-filter:blur(18px) saturate(140%);
  display:flex;align-items:center;justify-content:center;padding:24px;
}
.doc-prev-panel{
  display:flex;flex-direction:column;
  width:min(1000px,100%);height:min(88vh,100%);
  background:var(--glass-card);
  backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);
  box-shadow:var(--shadow-lg);overflow:hidden;
}
.doc-prev-head{display:flex;align-items:center;gap:10px;padding:12px 14px;border-bottom:0.5px solid var(--border);flex-wrap:wrap}
.doc-prev-head > i{font-size:20px;color:var(--accent);flex-shrink:0}
.doc-prev-name{font-size:13px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.doc-prev-meta{font-size:11px;color:var(--text3);margin-top:2px}
.doc-prev-pager{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text2);flex-shrink:0}
/* The document itself scrolls; the panel around it does not, so the header
   stays put while a twelve-page scan goes by. */
.doc-prev-body{flex:1;overflow:auto;padding:14px;display:flex;flex-direction:column;align-items:center;gap:12px}
.doc-prev-body canvas,.doc-prev-body img{max-width:100%;height:auto;border-radius:var(--r-sm);box-shadow:var(--shadow)}
.doc-prev-msg{font-size:12px;color:var(--text3);text-align:center;padding:24px;line-height:1.6}
/* A spreadsheet preview is a table, and a wide one scrolls inside its own box
   rather than making the panel scroll sideways. */
.doc-prev-sheet{width:100%;overflow:auto}
.doc-prev-sheet table{border-collapse:collapse;font-size:11px;color:var(--text2)}
.doc-prev-sheet td,.doc-prev-sheet th{border:0.5px solid var(--border);padding:4px 8px;white-space:nowrap;text-align:left}
.doc-prev-sheet tr:first-child td{font-weight:600;color:var(--text);background:var(--accent-soft)}
/* Word — text and tables read out of word/document.xml, styled to look like
   a page rather than a code dump. No embedded images, no page breaks: this
   is "recognise the document", the same modesty the sheet preview above
   already keeps to (200 rows, no formulas, no charts). */
/* A fixed off-white, not var(--input-bg) or another theme token: in dark
   theme those are near-transparent tints meant to sit on the dark card
   behind them, which left this dark (#1a1a1a) text almost unreadable on
   top of them. A page is paper regardless of which theme is looking at it
   — the same reasoning the image preview above already follows by just
   showing the image as-is. */
.doc-prev-docx{width:min(680px,100%);background:#f4f3ef;color:#1a1a1a;border-radius:var(--r-sm);
  padding:36px 44px;box-shadow:var(--shadow);font-size:13px;line-height:1.6}
.doc-prev-docx h1,.doc-prev-docx h2,.doc-prev-docx h3,.doc-prev-docx h4{margin:0.8em 0 0.4em;line-height:1.3;color:#111}
.doc-prev-docx h1{font-size:22px}.doc-prev-docx h2{font-size:18px}.doc-prev-docx h3{font-size:16px}.doc-prev-docx h4{font-size:13px}
.doc-prev-docx p{margin:0 0 10px}
.doc-prev-docx ul{margin:0 0 10px;padding-left:22px}
.doc-prev-docx table{border-collapse:collapse;width:100%;margin:0 0 14px;font-size:12px}
.doc-prev-docx table td{border:0.5px solid rgba(0,0,0,0.15);padding:5px 8px;vertical-align:top}
/* PowerPoint — one shape's text per box, first shape (almost always the
   title placeholder) set apart from the rest, paged the same way the PDF
   pager above already pages — one slide is one page. No layouts, no
   images, no speaker notes: same "recognise it, download for the real
   thing" modesty as the other two. */
.doc-prev-slide{width:min(720px,100%);aspect-ratio:16/9;background:#f4f3ef;color:#1a1a1a;
  border-radius:var(--r-sm);box-shadow:var(--shadow);padding:32px 40px;overflow:auto;
  display:flex;flex-direction:column;gap:14px}
.doc-prev-slide-title{font-size:20px;font-weight:700;color:#111;line-height:1.3}
.doc-prev-slide-body{font-size:13px;line-height:1.6;color:#333}
.doc-prev-slide-body > div{margin-bottom:4px}
/* The row itself is the way in, so it has to look like one — including the
   rows written into the markup, which carry a download link instead of the
   attribute the renderer writes. */
.doc-card[data-doc-openable],.doc-card:has(a[download]){cursor:pointer}

/* The one notice for the zone. Sits with the folders rather than inside one,
   which is why it takes the row shape of a document rather than the card
   treatment of a folder — it is a line to read, not a thing to open. */
.docs-zone-note{
  display:flex;align-items:center;gap:8px;
  padding:10px 14px;border-radius:var(--r-sm);
  background:var(--warn-soft);border:0.5px solid var(--warn-border);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  box-shadow:var(--shadow);
  color:var(--text2);font-size:11px;line-height:1.45;
}
/* ── Documents: a folder that opens ──────────────────────────────────────
   Every folder on this screen was a static coloured square with a folder glyph
   on it, and the only thing that moved when you opened one was the caret at the
   far right of the row — 700px away from the thing you clicked. People clicked
   folders twice, because nothing where they were looking had answered the first
   click, and the second click closed it again.

   So the tile is the answer now. It tilts under the pointer and a flap lifts
   out of it, further when the folder is actually open, and the contents wait
   for the flap before they appear. All of it is transform and opacity — the
   two properties the compositor can animate without laying the page out again,
   which matters here because opening a folder in the grid can reflow the whole
   zone underneath it.

   The flap is white at low alpha rather than a colour of its own: the tile is
   always a saturated --pal-* with a white glyph on it in both themes, so white
   over the folder's own colour is the one fill that cannot be wrong in one of
   them. There is no ti-folder-open in the icon subset, which is the other
   reason this is drawn rather than swapped. */
.doc-group-head > :first-child{
  position:relative;perspective:420px;
  transform:scale(var(--doc-tile-scale,1));
  transition:transform var(--dur) cubic-bezier(.34,1.1,.5,1),box-shadow var(--dur);
}
.doc-group-head > :first-child > i{transition:transform var(--dur) cubic-bezier(.34,1.1,.5,1)}
/* The front flap. Hidden flat against the tile at rest — a closed folder has no
   inside showing — and rotated out from its bottom edge as it opens, which is
   the hinge a real folder turns on. */
.doc-group-head > :first-child::after{
  content:'';position:absolute;left:14%;right:8%;bottom:16%;height:40%;
  border-radius:2px 2px 5px 5px;
  background:rgba(255,255,255,0.34);
  box-shadow:0 1px 3px rgba(0,0,0,0.22);
  transform-origin:50% 100%;transform:rotateX(0deg);opacity:0;
  transition:transform var(--dur) cubic-bezier(.34,1.1,.5,1),opacity var(--dur-fast) ease;
  pointer-events:none;
}
.doc-group-head:hover > :first-child{transform:perspective(420px) rotateX(9deg) scale(var(--doc-tile-scale,1))}
.doc-group-head:hover > :first-child::after{transform:rotateX(-34deg);opacity:.85}
.doc-group-head:hover > :first-child > i{transform:translateY(-1px)}
/* Open beats hover on specificity, so a folder you are pointing at while it is
   open does not drop back to the half-open shape. */
.doc-group.open > .doc-group-head > :first-child{transform:perspective(420px) rotateX(14deg) scale(var(--doc-tile-scale,1))}
.doc-group.open > .doc-group-head > :first-child::after{transform:rotateX(-58deg) translateY(1px);opacity:1}
.doc-group.open > .doc-group-head > :first-child > i{transform:translateY(-2px)}

/* The contents wait for the flap. The delay is the point: without it the rows
   appear at the same instant the folder starts to open, and the animation
   reads as the list pushing the folder aside rather than the folder letting
   the list out. `backwards` holds the first frame during the delay, so nothing
   is on screen until the flap has lifted. */
@keyframes doc-folder-reveal{
  from{opacity:0;transform:translateY(-8px)}
  to{opacity:1;transform:none}
}
.doc-group.open > .doc-group-body{animation:doc-folder-reveal .26s cubic-bezier(.32,.72,.35,1) .14s backwards}
/* Closing. display:none cannot be transitioned, so the class that carries the
   fade is added by docsSetGroupOpen() and removed when it has run — which is
   also why the body is still display:flex here. Without it a folder shut the
   way a light goes out, and on a screen where the thing above the fold moves
   when a folder below it closes, that instant jump is what makes people lose
   their place. */
.doc-group.doc-closing > .doc-group-body{display:flex;pointer-events:none;animation:doc-folder-fade .18s ease forwards}
@keyframes doc-folder-fade{
  from{opacity:1;transform:none}
  to{opacity:0;transform:translateY(-5px)}
}
/* Nobody who has asked for less movement gets any of it. The flap does not
   appear at all — a folder that opens without animating should not be showing
   half of an animation's end state — and the body simply is or is not there. */
@media(prefers-reduced-motion:reduce){
  .doc-group-head > :first-child,
  .doc-group-head > :first-child > i,
  .doc-group-head > :first-child::after{transition:none}
  .doc-group-head:hover > :first-child,
  .doc-group.open > .doc-group-head > :first-child{transform:scale(var(--doc-tile-scale,1))}
  .doc-group-head:hover > :first-child > i,
  .doc-group.open > .doc-group-head > :first-child > i{transform:none}
  .doc-group-head:hover > :first-child::after,
  .doc-group.open > .doc-group-head > :first-child::after{opacity:0;transform:none}
  .doc-group.open > .doc-group-body{animation:none}
  .doc-group.doc-closing > .doc-group-body{display:none;animation:none}
}

/* ── Documents: where you are ──
   The crumbs are the open path, not a history: each one closes the folders
   below its own level, so pressing "Documents" puts the whole library back the
   way the screen opens. Rendered even when it is only the root, because a line
   that appears and disappears moves the toolbar under the pointer. */
.docs-crumbs{display:flex;align-items:center;gap:2px;flex-wrap:wrap;margin-bottom:10px;min-height:20px}
.docs-crumb{
  border:0;background:transparent;font-family:inherit;font-size:11px;font-weight:600;
  color:var(--text3);cursor:pointer;padding:3px 7px;border-radius:8px;
  transition:color var(--dur-fast),background var(--dur-fast),transform var(--dur-fast) var(--ease-out);
  max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.docs-crumb:hover{color:var(--accent);background:var(--accent-soft)}
.docs-crumb[aria-current="page"]{color:var(--text);cursor:default}
.docs-crumb[aria-current="page"]:hover{background:transparent;color:var(--text)}
.docs-crumb-sep{font-size:11px;color:var(--text3);opacity:.55;user-select:none}

/* ── Documents: pinning ──
   A star on the folder head and on every document row. It sits after the text
   stack rather than before it so the two grades of folder still read as one
   shape: the first two children of a head are the tile and the lines, and
   everything on this screen that compares one folder against another compares
   those. */
.doc-fav{
  flex-shrink:0;width:26px;height:26px;border-radius:50%;
  background:transparent;border:0;padding:0;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  color:var(--text3);font-size:14px;
  transition:color var(--dur-fast),background var(--dur-fast),transform var(--dur-fast) var(--ease-out);
}
.doc-fav:hover{color:var(--pal-amber);background:var(--accent-soft)}
.doc-fav.on{color:var(--pal-amber)}

/* ── Documents: grid ──
   Large folder cards, which is a different card and not the row seen through a
   narrower column: the tile is the biggest thing on it, the name is under the
   tile with the full width of the card to wrap into, and the controls go to
   the corner so they stop competing with the name for the same line.
   Scoped to a direct child of the zone. Written as a descendant it also caught
   the carrier folders nested inside an open card, which turned every one of
   them into a card of its own inside a card. */
.docs-zone.docs-grid > .doc-group > .doc-group-head{flex-direction:column;align-items:flex-start;gap:12px;padding:20px 18px 18px}
.docs-zone.docs-grid > .doc-group > .doc-group-head > :first-child{--doc-tile-scale:1.35;transform-origin:left center;margin:6px 0 6px 8px}
.docs-zone.docs-grid > .doc-group > .doc-group-head > :nth-child(2){align-self:stretch}
.docs-zone.docs-grid > .doc-group > .doc-group-head > .doc-group-caret,
.docs-zone.docs-grid > .doc-group > .doc-group-head > .doc-fav,
.docs-zone.docs-grid > .doc-group > .doc-group-head > .doc-group-act,
.docs-zone.docs-grid > .doc-group > .doc-group-head > .avp-btn{position:absolute;top:14px}
.docs-zone.docs-grid > .doc-group > .doc-group-head > .doc-group-caret{right:14px}
.docs-zone.docs-grid > .doc-group > .doc-group-head > .doc-fav{right:46px}
.docs-zone.docs-grid > .doc-group > .doc-group-head > .doc-group-act{right:76px}
.docs-zone.docs-grid > .doc-group > .doc-group-head > .avp-btn{right:110px}
/* A loose document in the library list is a card in this layout too, and it was
   the one thing the grid never accounted for: kept as a row, its Download pill
   held its own width while the title wrapped behind it, so in a 260px column
   the name of the form was printed underneath the button that downloads it. */
.docs-zone.docs-grid > .doc-card{position:relative;flex-direction:column;align-items:flex-start;gap:10px;padding:18px}
.docs-zone.docs-grid > .doc-card > :nth-child(2){align-self:stretch}
.docs-zone.docs-grid > .doc-card > .doc-fav{position:absolute;top:14px;right:14px}

/* ── Documents: details ──
   The six things people ask about a document, in columns. The tracks are
   written in fr and fixed pixels and never in `auto`, because every row is its
   own grid: an `auto` track is measured from that row's own contents, so the
   Owner column would sit in a different place on every line and the header
   above them would point at none of them.
   The header is a sibling inside the same body and takes the same tracks from
   the same declaration, which is the only way the two stay in step. */
/* The cells exist in every layout and are only shown in Details, so their type
   is set here and not inside the .docs-details block: a rule that only applies
   in one layout leaves the same text inheriting the body size in the other two,
   which is how a size nobody chose gets into the scale. */
.doc-cols{display:none}
.doc-colhead{display:none}
.doc-col{font-size:11px;color:var(--text2)}
.doc-colhead span{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3)}
.docs-zone.docs-details .doc-card{
  --doc-tile-w:40px;
  display:grid;
  grid-template-columns:var(--doc-tile-w) minmax(0,2.2fr) minmax(0,1.4fr) minmax(0,1.1fr) minmax(0,1.2fr) 54px 76px 112px 26px;
  align-items:center;gap:10px;padding:9px 12px;
}
.docs-zone.docs-details .doc-card-nested{--doc-tile-w:36px}
/* display:contents so the five cells are laid out by the row's own grid rather
   than by a box of their own — a wrapper here would be one track holding five
   things, and the header could not line up with any of them. */
.docs-zone.docs-details .doc-cols{display:contents}
/* One line per row, and it stays inside its own track. min-width:0 is the load-
   bearing half: a grid item's minimum size is its content, so without it a long
   filename widened the File name column and pushed Category, Modified and Owner
   out from under their own headings — on one row, which is worse than on all of
   them, because the table looked right until you read across it. */
.docs-zone.docs-details .doc-card > :nth-child(2){min-width:0;overflow:hidden}
.docs-zone.docs-details .doc-card > :nth-child(2) > *{display:none}
.docs-zone.docs-details .doc-card > :nth-child(2) > .doc-row-name{
  display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0;
}
.docs-zone.docs-details .doc-col{font-size:11px;color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.docs-zone.docs-details .doc-col-num{text-align:right}
.docs-zone.docs-details .doc-card > .doc-fav{justify-self:end}
.docs-zone.docs-details .doc-colhead{
  --doc-tile-w:36px;
  display:grid;
  grid-template-columns:var(--doc-tile-w) minmax(0,2.2fr) minmax(0,1.4fr) minmax(0,1.1fr) minmax(0,1.2fr) 54px 76px 112px 26px;
  align-items:center;gap:10px;padding:2px 12px 4px;
}
.docs-zone.docs-details > .doc-colhead{--doc-tile-w:40px}
.docs-zone.docs-details .doc-colhead span{
  font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  color:var(--text3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.docs-zone.docs-details .doc-colhead span.doc-col-num{text-align:right}
@media(max-width:900px){
  /* Below this the tracks are narrower than the words in them. The columns
     stack back into the row they came from rather than being truncated to
     three characters each, which is a table that has stopped being one. */
  .docs-zone.docs-details .doc-card{display:flex;grid-template-columns:none}
  .docs-zone.docs-details .doc-cols{display:flex;gap:10px;flex-wrap:wrap;flex:1 1 100%;order:9}
  .docs-zone.docs-details .doc-colhead{display:none}
}

.em-notes-list{margin:6px 0 0;padding-left:18px;font-size:12px;color:var(--text2);line-height:1.7}
.em-notes-list li{margin-bottom:2px}
/* legacy (keep for possible old references) */

/* ── LOSS RATIO PILL ── */
.lr-ratio-pill{
  min-width:110px;
  padding:7px 14px;
  border-radius:var(--r-sm);
  cursor:default;
  position:relative;
  transition:transform .15s,box-shadow .15s;
}
.lr-ratio-pill:hover{
  transform:translateY(-1px);
  box-shadow:var(--shadow);
}
/* Tahoe default (light): subtle glass on pill */
.lr-ratio-pill{
  backdrop-filter:blur(8px);
  -webkit-backdrop-filter:blur(8px);
}

/* Every control in a loss-run row on one height. The row mixes three kinds of
   box — two date pickers, two premium fields and a claim count — and a date
   input carries a taller intrinsic content box than a text or number one from
   identical padding, so the row read as a 2px staircase across its own tds.
   Pinned to the tallest, the same way .to-input/.to-select and .avp-drow are.
   The autofill row above the table mixes the same two kinds for the same
   reason, at its own larger size. */
#lr-body input{min-height:26px}
#lr-autofill-end,#lr-autofill-count{min-height:30px}

/* ── HISTORIAL PREMIUM INPUT ── */
.lr-prem-input{
  font-size:12px;padding:4px 7px;
  border:0.5px solid rgba(0,0,0,0.12);border-radius:5px;
  background:rgba(130,182,242,0.10);
  color:var(--text);outline:none;width:100%;
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;
  transition:border-color .15s,background .15s,box-shadow .15s;
}
.lr-prem-input:focus{
  border-color:var(--accent);
  background:rgba(255,255,255,0.75);
  box-shadow:0 0 0 3px rgba(var(--brand-blue-rgb),0.12);
}
.lr-prem-input::placeholder{color:var(--text3)}
[data-theme="dark"] .lr-prem-input{
  background:rgba(255,255,255,0.08);
  border-color:rgba(255,255,255,0.14);
  color:#f2f2f7;
}
[data-theme="dark"] .lr-prem-input:focus{
  background:rgba(255,255,255,0.12);
  border-color:#4d8fe6;
  box-shadow:0 0 0 3px rgba(10,132,255,0.18);
}
[data-theme="dark"] .lr-prem-input::placeholder{color:rgba(235,235,245,0.40)}
@media print{

  /* ─── Page setup ─── */
  @page{
    size:letter portrait;
    margin:18mm 16mm 20mm 16mm;
  }
  @page:first{ margin-top:12mm; }

  /* ─── Global resets ─── */
  :root,[data-theme="dark"]{
    --bg:#ffffff!important;
    --bg-mesh:none!important;
    --glass:#ffffff!important;
    --glass2:#ffffff!important;
    --glass3:#f2f3f6!important;
    --glass-card:#ffffff!important;
    --border:#c4c8d0!important;
    --border2:#9aaac2!important;
    --border3:#dadde3!important;
    --text:#0d0d12!important;
    --text2:#2a2a33!important;
    --text3:#52525e!important;
    --input-bg:#ffffff!important;
    --accent:#163a66!important;
    --success:#1a7a3a!important;
    --danger:#b71c1c!important;
    --warn:#8a5000!important;
    --shadow:none!important;
    --shadow-lg:none!important;
    --inner:none!important;
  }
  html,body{ background:#fff!important; font-size:11pt!important; color:#0d0d12!important; }
  *,*::before,*::after{
    backdrop-filter:none!important;
    -webkit-backdrop-filter:none!important;
    box-shadow:none!important;
    text-shadow:none!important;
    -webkit-print-color-adjust:exact!important;
    print-color-adjust:exact!important;
  }

  /* ─── Hide UI chrome ─── */
  .amb,
  #slide-nav,#nav-edge-hint,
  .topbar,
  #clock-widget,#weather-widget,#widgets-column,
  #calc-widget,
  #mkt-summary-bar,
  .avp-btn-row,
  .avp-btn,
  .analyze-wrap,.start-btn,
  #autosave-indicator,
  #tutorial-overlay,
  #pwa-toast,
  .sec-caret,
  .cal-modal,#cal-day-panel,
  #landing,#meeting-screen,#docs-screen,
  #templates-screen,#calendar-screen,
  #directory-screen,#auth-screen,
  .prog-wrap,
  .payroll-chart-wrap,
  .avp-tog,
  input[type="file"],
  button
  { display:none!important; }

  /* ─── Show only the WC Analyzer ─── */
  #app{ display:block!important; padding:0!important; margin:0!important; }

  /* ─── Print-only header ─── */
  #print-header{
    display:flex!important;
    align-items:center;
    justify-content:space-between;
    padding-bottom:10pt;
    margin-bottom:14pt;
    border-bottom:2pt solid #163a66;
  }
  #print-header-left{ display:flex!important; align-items:center!important; gap:10pt!important; }
  #print-header-left > div{ display:flex!important; flex-direction:column!important; gap:2pt!important; }
  #print-header-right{ display:flex!important; flex-direction:column; align-items:flex-end; gap:2pt; font-size:8pt; color:#52525e; }

  /* ─── Section headings ─── */
  .sec-head{
    background:#163a66!important;
    color:#fff!important;
    -webkit-print-color-adjust:exact!important;
    border-radius:0!important;
    padding:5pt 10pt!important;
    font-size:9pt!important;
    font-weight:700!important;
    margin:10pt 0 4pt!important;
    page-break-after:avoid!important;
  }
  .sec-head i{ color:#fff!important; }

  /* ─── Cards & rows ─── */
  .avp-card{
    border:0.5pt solid #c4c8d0!important;
    border-radius:4pt!important;
    background:#fff!important;
    padding:8pt 10pt!important;
    margin-bottom:6pt!important;
    page-break-inside:avoid!important;
  }
  .avp-drow{
    border-bottom:0.5pt solid #dadde3!important;
    background:#fff!important;
    padding:5pt 8pt!important;
    page-break-inside:avoid!important;
  }
  .avp-field label{ font-size:8pt!important; color:#52525e!important; }
  .avp-field input,.avp-field select,.avp-field textarea{
    border:none!important;
    background:transparent!important;
    font-size:10pt!important;
    color:#0d0d12!important;
    padding:0!important;
  }

  /* ─── Market result cards ─── */
  .fit-panel-wrap{
    page-break-before:always!important;
    display:grid!important;
    grid-template-columns:1fr 1fr!important;
    gap:6pt!important;
  }
  /* Accordion: always fully expanded in print; hide interactive chrome */
  .mkt-accordion{border:none!important;box-shadow:none!important;background:transparent!important;overflow:visible!important}
  .mkt-accordion-head,.mkt-show-fit-toggle{display:none!important}
  .mkt-accordion-body{max-height:none!important;opacity:1!important;overflow:visible!important;padding:0!important}
  /* Hidden "Fit" flash cards still appear in the printed report */
  .fit-panel[data-status="fit"].fit-hidden{display:block!important}
  .fit-panel{
    border:0.5pt solid #c4c8d0!important;
    border-radius:4pt!important;
    background:#fff!important;
    padding:7pt 9pt!important;
    page-break-inside:avoid!important;
    max-height:none!important;
    display:block!important;
  }
  .fit-panel>div[id^="fit-"]{ overflow:visible!important; max-height:none!important; opacity:1!important; padding:0 11px 11px!important; pointer-events:auto!important; }
  .mkt-note{ display:block!important; -webkit-line-clamp:unset!important; overflow:visible!important;
    max-height:none!important; -webkit-mask-image:none!important; mask-image:none!important;
    color:#163a66!important; }
  .mkt-note-toggle{ display:none!important; }
  .fit-flag-count{ display:none!important; }
  .fit-panel-head{
    font-size:10pt!important;
    font-weight:700!important;
    color:#0d0d12!important;
    margin-bottom:3pt!important;
  }
  .fit-item{ padding:3pt 0!important; }
  .fl-type{ font-size:8pt!important; font-weight:700!important; }
  .fl-type.green{ color:#1a7a3a!important; }
  .fl-title{ font-size:9pt!important; color:#0d0d12!important; }
  .fl-detail{ font-size:8pt!important; color:#52525e!important; }
  .fit-item.possible .fl-type{ color:#1a7a3a!important; }
  .fit-item.notfit  .fl-type{ color:#b71c1c!important; }
  .fit-item.blocked .fl-type{ color:#52525e!important; }
  .dot{ display:none!important; }
  #mkt-progress-bar{ display:none!important; }

  /* ─── State / payroll table ─── */
  .col-hdr{ font-size:7.5pt!important; font-weight:700!important; color:#52525e!important; }
  .ep,.cc-code{ font-size:9pt!important; }

  /* ─── Premium & mod section ─── */  /* ─── Action required (summary panel) ─── */
  #summary-panel{ page-break-inside:avoid!important; }
  .avp-alert-item{ padding:3pt 0!important; }
  .avp-alert-item span{ font-size:9pt!important; }

  /* ─── Misc cleanups ─── */
  .wdrop-row,.widget-dropdown{ display:none!important; }
  .avp-summary{ border:0.5pt solid #c4c8d0!important; border-radius:4pt!important; padding:8pt!important; }
  .sec-head-line{ display:none!important; }
  a{ color:#163a66!important; text-decoration:none!important; }
  
}

/* ══════════════════════════════════════
   iPadOS OPTIMIZATIONS
══════════════════════════════════════ */
@media (min-width:768px) and (max-width:1366px) and (pointer:coarse){
  .page{max-width:100%;padding:0 0 6rem}
  .main{padding:1.25rem 1.5rem}
  .avp-card{padding:18px 20px}
  .avp-field input,.avp-field select,.avp-field textarea{
    font-size:14px;padding:11px 14px;min-height:48px;
  }
  .avp-drow input,.avp-drow select{font-size:14px;min-height:42px}
  .avp-btn{font-size:14px;min-height:48px;padding:10px 18px}
  .avp-tog{min-height:38px;padding:7px 16px;font-size:12px}
  .mini-btn{min-height:42px;padding:8px 16px}
  .exp-type-btn{min-height:42px;padding:9px 20px;font-size:12px}
  .topbar{margin:calc(8px + env(safe-area-inset-top)) 10px 0;border-radius:18px}
  .theme-toggle{width:50px;height:28px}
  /* Bigger row targets */
  .avp-drow{padding:10px 12px}
  .lr-have button{min-height:42px;padding:8px 14px}
}

/* Landscape iPad */
@media (min-width:1024px) and (max-width:1366px) and (pointer:coarse){
  .page{max-width:960px}
}

/* ══ TAHOE: default (light) input text is dark ══ */
input,textarea,select{color:var(--text)!important}
input::placeholder,textarea::placeholder{color:var(--text3)!important}

/* ══ TAHOE DARK MODE overrides ══ */
/* .avp-card dark styling now comes from the unified navy hero recipe (below) */
[data-theme="dark"] .topbar{
  background:linear-gradient(135deg,rgba(255,255,255,0.10) 0%,rgba(255,255,255,0.05) 100%);
  border-color:rgba(255,255,255,0.18);
  box-shadow:
    0 8px 40px rgba(0,0,0,0.50),
    0 2px 8px  rgba(0,0,0,0.30),
    inset 0 1px 0 rgba(255,255,255,0.12),
    inset 0 0 0 0.5px rgba(255,255,255,0.07);
}
[data-theme="dark"] .prog-wrap{
  background:var(--accent-soft);
}
[data-theme="dark"] .start-btn{
  background:linear-gradient(135deg,#4d8fe6,#409cff);
  color:#fff;
}
/* .fit-panel dark styling now comes from the unified navy hero recipe (below) */
[data-theme="dark"] .avp-btn.primary{
  background:linear-gradient(135deg,rgba(10,132,255,0.2),rgba(64,156,255,0.28));
  color:#409cff;
}
[data-theme="dark"] .avp-btn.primary:hover{color:#fff;background:linear-gradient(135deg,#4d8fe6,#409cff)}
[data-theme="dark"] .avp-drow{background:rgba(255,255,255,0.06)}
[data-theme="dark"] .avp-drow:hover{background:rgba(255,255,255,0.10)}

/* ── DARK: force light text on all inputs ── */
[data-theme="dark"] input,
[data-theme="dark"] textarea,
[data-theme="dark"] select{color:#f2f2f7!important}
[data-theme="dark"] .avp-field input,
[data-theme="dark"] .avp-field select,
[data-theme="dark"] .avp-field textarea,
[data-theme="dark"] .avp-drow input,
[data-theme="dark"] .avp-drow select,
[data-theme="dark"] .filter-bar input,
/* background-COLOR, not the background shorthand. The shorthand also resets
   background-image, and with !important behind it that reset beat the
   calendar icon on every date field inside .avp-field / .avp-drow /
   .filter-bar — 7 of the 20 date fields in the page had no icon at all,
   which since the native indicator is hidden left them with no way to
   open any calendar. A colour is all this rule ever wanted to set. */
[data-theme="dark"] .filter-bar select{background-color:rgba(255,255,255,0.08)!important;color:#f2f2f7!important;border-color:rgba(255,255,255,0.18)!important}
[data-theme="dark"] .avp-field select option,
[data-theme="dark"] .avp-drow select option,
[data-theme="dark"] .filter-bar select option,
[data-theme="dark"] select option{background:#1c1c2e!important;color:#f2f2f7!important}
[data-theme="dark"] input::placeholder,
[data-theme="dark"] textarea::placeholder{color:rgba(235,235,245,0.40)!important}
[data-theme="dark"] input::-webkit-input-placeholder,
[data-theme="dark"] textarea::-webkit-input-placeholder{color:rgba(235,235,245,0.40)!important}
[data-theme="dark"] input::-moz-placeholder,
[data-theme="dark"] textarea::-moz-placeholder{color:rgba(235,235,245,0.40)!important}
[data-theme="dark"] input:-ms-input-placeholder,
[data-theme="dark"] textarea:-ms-input-placeholder{color:rgba(235,235,245,0.40)!important}

/* ── CONTACT SLIDE SWITCHES (macOS Tahoe style) ── */
.csw-wrap{display:flex;align-items:center;gap:6px;margin-top:8px}
.csw-label{font-size:10px;color:var(--text3);font-weight:500;white-space:nowrap;margin-right:2px}
.csw-side{font-size:10px;font-weight:600;color:var(--text3);transition:color .22s;min-width:18px;text-align:center}
/* Pill shell */
.csw{
  position:relative;width:48px;height:28px;
  background:rgba(130,182,242,0.36);
  border-radius:14px;cursor:pointer;
  transition:background .28s var(--ease-out);
  user-select:none;flex-shrink:0;
  box-shadow:inset 0 0 0 0.5px rgba(0,0,0,0.10);
}
/* Thumb */
.csw-thumb{
  position:absolute;top:2px;left:2px;
  width:24px;height:24px;
  background:#ffffff;border-radius:50%;
  box-shadow:0 2px 6px rgba(0,0,0,0.25),0 0.5px 2px rgba(0,0,0,0.12);
  transition:transform .28s var(--ease-out);
  pointer-events:none;
}
/* YES — blue pill, thumb right */
.csw.yes{background:var(--accent)}
.csw.yes .csw-thumb{transform:translateX(20px)}
/* NO — red pill, thumb left */
.csw.no{background:rgba(255,59,48,0.80)}
/* Side-label highlights via :has() */
/* Green for Yes, red for No — the same pair every Yes/No button uses. This
   one answered in blue, which on a screen where blue means "the accent
   colour" says nothing about the answer; and its No was a literal #ff3b30
   rather than the token, so it did not follow the theme. */
.csw-wrap:has(.csw.yes) .yes-lbl{color:var(--success);font-weight:700}
.csw-wrap:has(.csw.no)  .no-lbl {color:var(--danger);font-weight:700}
[data-theme="dark"] .csw-thumb{background:#ffffff}
[data-theme="dark"] .csw:not(.yes):not(.no){background:rgba(130,182,242,0.45)}

/* ── ALARM: full-window border blink ── */
@keyframes alarm-border-pulse{
  0%,100%{box-shadow:inset 0 0 0 3px rgba(255,59,48,0),inset 0 0 0 0 rgba(255,59,48,0)}
  50%{box-shadow:inset 0 0 0 4px rgba(255,59,48,0.85),inset 0 0 40px rgba(255,59,48,0.18)}
}
body.alarm-firing{animation:alarm-border-pulse .55s ease infinite}

/* ── WIDGET PANEL BUTTON ── */
.widget-panel-btn{display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:var(--text3);background:rgba(130,182,242,0.10);border:0.5px solid var(--border);border-radius:var(--r-lg);padding:4px 10px;cursor:pointer;font-family:inherit;transition:background .15s,color .15s;position:relative}
#features-panel-btn,#widget-panel-btn{display:flex!important}
.widget-panel-btn:hover{background:rgba(130,182,242,0.18);color:var(--text)}
.widget-panel-btn.open{background:rgba(var(--brand-blue-rgb),0.12);color:var(--accent);border-color:rgba(var(--brand-blue-rgb),0.3)}
/* ── Features and Widgets turn like DocuHub's folders ─────────────────────
   Same caret as .doc-group-caret and the CRM's note toggle: a round chip in
   the accent, turned 180° while the menu is open, on the same .25s ease.
   Smaller than the folder's 28px because it rides inside a top-bar button,
   not a folder tile — the shape and the turn are what make it the same
   gesture, not the size.
   It stays when the label is dropped on a phone: the caret IS the "there is
   more here" mark, so hiding it there would take the affordance away exactly
   where the word already went. */
.wpb-caret{
  flex-shrink:0;width:17px;height:17px;border-radius:50%;
  background:var(--accent-soft);border:0.5px solid var(--border2);
  display:flex;align-items:center;justify-content:center;
  color:var(--accent);font-size:10px;line-height:1;
  transition:transform .25s ease;
}
.widget-panel-btn.open .wpb-caret{transform:rotate(180deg)}
.widget-panel-btn{gap:6px}

/* ── Both menus wear the app's rounded-menu material ──────────────────────
   Measured against .cs-panel, the rounded list the custom select draws, and
   they did not match it. Features was the further off: 14px corners against
   20, a border at .36 alpha against .2, a single-layer shadow against two,
   and 8px rows against 10. Widgets had the shape right and the blur wrong —
   28px against 40, which reads as a different depth of glass beside it.
   Its visual styling was inline on the element, which is why it drifted and
   why no stylesheet could correct it; only display stays inline now, because
   that is what the toggle writes. */
.wpb-menu{
  position:absolute;top:calc(100% + 8px);right:0;min-width:220px;z-index:2000;
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);
  padding:6px;
}
/* The rows are the same shape as .cs-opt, which is what makes a menu read as
   one family rather than three that happen to be rounded. */
.feat-dd-btn,.wdrop-row{border-radius:var(--r-sm)}

/* And they open the way a folder opens: the same reveal curve and distance,
   so two menus a few pixels apart do not animate differently. display cannot
   be transitioned, so the keyframe runs on the element the click reveals. */
@keyframes wpb-reveal{
  from{opacity:0;transform:translateY(-8px)}
  to{opacity:1;transform:none}
}
#widget-dropdown[style*="flex"],
#features-dropdown[style*="block"]{
  animation:wpb-reveal .26s cubic-bezier(.32,.72,.35,1) backwards;
}
@media (prefers-reduced-motion:reduce){
  .wpb-caret{transition:none}
  #widget-dropdown[style*="flex"],#features-dropdown[style*="block"]{animation:none}
}
/* ── WIDGET DROPDOWN ── */
#widget-dropdown{
  position:absolute;top:calc(100% + 8px);right:0;width:230px;z-index:1200;
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);
  box-shadow:var(--shadow);
  padding:6px;display:none;flex-direction:column;gap:6px;
}
.wdrop-row{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:var(--r-sm);transition:background .12s;cursor:pointer}
.wdrop-row:hover{background:rgba(130,182,242,0.10)}
.wdrop-label{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:500;color:var(--text)}
.wdrop-label i{font-size:14px;color:var(--accent)}
.wdrop-toggle{width:34px;height:20px;border-radius:var(--r-sm);background:rgba(130,182,242,0.22);position:relative;transition:background .2s;flex-shrink:0;border:0.5px solid var(--border)}
.wdrop-toggle.on{background:var(--accent);border-color:transparent}
.wdrop-toggle::after{content:'';position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#fff;transition:transform .2s;box-shadow:0 1px 3px rgba(0,0,0,0.18)}
.wdrop-toggle.on::after{transform:translateX(14px)}

/* ── CALCULATOR WIDGET ── */
/* A small floating card now, not a full-height rail off the left edge — that
   panel sat at the same edge as the sidebar and behind it (z-index 1100
   against the nav's 3100), so opening both left the calculator partly
   covered. This sits above the nav (3200), defaults to the opposite side of
   the screen so the two never fight for the same pixels regardless of
   pinned/collapsed state, and can be dragged anywhere from its header (see
   the drag handler near toggleCalcWidget in 03-hub.js) — position is then
   pixel-exact via inline left/top, which always outranks this rule
   regardless of specificity. */
#calc-widget{
  position:fixed;top:90px;right:24px;width:216px;
  z-index:3200;
  transform:scale(.92);transform-origin:top right;
  transition:transform .22s var(--ease-spring),opacity .18s;
  opacity:0;pointer-events:none;
  display:flex;flex-direction:column;
  background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);
  border:0.5px solid var(--border);
  border-radius:var(--r-lg);
  box-shadow:var(--shadow-float);
  padding:12px 11px 13px;user-select:none;
}
#calc-widget.open{transform:scale(1);opacity:1;pointer-events:all}
.calc-header{cursor:grab}
.calc-header:active{cursor:grabbing}
@media(prefers-reduced-motion:reduce){#calc-widget{transition:opacity .18s}}

/* ── Presence status dot ── */
.status-dot{
  width:9px;height:9px;border-radius:50%;flex-shrink:0;
  border:1.5px solid var(--glass-card);
  transition:background .2s;
}
.status-dot.online{background:#34C759;box-shadow:0 0 5px rgba(52,199,89,0.6)}
.status-dot.away{background:#FF9500}
.status-dot.offline{background:#8E8E93}
.avatar-status-dot{
  position:absolute;bottom:-1px;right:-1px;
  width:10px;height:10px;border-radius:50%;
  border:2px solid var(--bg);z-index:2;
}
.avatar-status-dot.online{background:#34C759}
.avatar-status-dot.away{background:#FF9500}
.avatar-status-dot.offline{background:#8E8E93}

.calc-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}
.calc-title{font-size:9px;font-weight:500;color:var(--text3);letter-spacing:.08em;text-transform:uppercase}
.calc-close{width:20px;height:20px;border-radius:50%;background:rgba(130,182,242,0.15);border:none;color:var(--text3);font-size:12px;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;font-family:inherit;transition:background .12s}
.calc-close:hover{background:rgba(130,182,242,0.28);color:var(--text)}
.calc-display{background:rgba(0,0,0,0.06);border-radius:var(--r-sm);padding:10px 12px;margin-bottom:8px;min-height:56px;display:flex;flex-direction:column;align-items:flex-end;justify-content:flex-end;gap:3px;overflow:hidden}
[data-theme="dark"] .calc-display{background:rgba(255,255,255,0.06)}
.calc-expr{font-size:9px;color:var(--text3);min-height:11px;word-break:break-all;text-align:right}
.calc-value{font-size:20px;font-weight:300;color:var(--text);letter-spacing:-.02em;line-height:1;word-break:break-all;text-align:right;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:color .15s}
/* The pulse on "=" — the one moment a calculator should visibly react. */
@keyframes calcPop{0%{transform:scale(1.14);color:var(--accent)}100%{transform:scale(1)}}
.calc-value.calc-pop{animation:calcPop .26s var(--ease-spring)}
@media(prefers-reduced-motion:reduce){.calc-value.calc-pop{animation:none}}
.calc-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:4px}
.cbtn{height:34px;border-radius:9px;border:0.5px solid var(--border);background:rgba(255,255,255,0.5);font-size:12px;font-weight:500;color:var(--text);cursor:pointer;font-family:inherit;transition:background .1s,transform .08s;display:flex;align-items:center;justify-content:center}
[data-theme="dark"] .cbtn{background:rgba(255,255,255,0.10);border-color:rgba(255,255,255,0.12)}
.cbtn:hover{background:rgba(130,182,242,0.18)}
.cbtn:active{transform:scale(.93)}
.cbtn.op{background:rgba(var(--brand-blue-rgb),0.10);color:var(--accent);border-color:rgba(var(--brand-blue-rgb),0.22);font-size:16px}
.cbtn.op:hover{background:rgba(var(--brand-blue-rgb),0.18)}
.cbtn.eq{background:var(--accent);color:#fff;border-color:transparent;font-size:16px}
.cbtn.eq:hover{background:#004fd4}
.cbtn.fn{background:rgba(130,182,242,0.14);color:var(--text2);font-size:11px;font-weight:600}
.cbtn.fn:hover{background:rgba(130,182,242,0.22)}
.cbtn.zero{grid-column:span 2}

/* ══════════════════════════════════════════════
   RESPONSIVE — mobile / narrow viewport (≤760px)
══════════════════════════════════════════════ */
@media (max-width:760px){
  /* Sales Admin bento grid → single column, main card no longer spans 2 rows */
  .desk-grid{grid-template-columns:1fr!important;grid-template-rows:none!important}
  .desk-card.desk-main{grid-row:auto!important}
  .desk-inner{padding:0 12px}

  /* Sidebar pin: on mobile, pinning shouldn't shrink the page — nav overlays instead */
  body.nav-pinned #landing,
  body.nav-pinned #sales-admin-screen,
  body.nav-pinned #app,
  body.nav-pinned #meeting-screen,
  body.nav-pinned #docs-screen,
  body.nav-pinned #templates-screen,
  body.nav-pinned #calendar-screen,
  body.nav-pinned #directory-screen,
  body.nav-pinned #david-tracker-screen,
  /* Screens added after this rule was first written — without these the pinned
     sidebar pushed them off-canvas on phones. */
  body.nav-pinned #submission-screen,
  body.nav-pinned #emails-screen,
  body.nav-pinned #admin-workspace-screen,
  body.nav-pinned #games-screen,
  body.nav-pinned #trivia-screen,
  body.nav-pinned #solitaire-screen{ margin-left:0!important }

  /* ── (v5.0.8) Mobile density ──────────────────────────────────────────
     Reclaim vertical space so more of the list is visible per screen. */
  .lobby-grid{gap:10px}
  .lobby-card{padding:16px 14px}
  .lobby-card-icon{width:44px;height:44px}
  .lobby-card-icon i{font-size:20px!important}
  .lobby-card-title{font-size:14px}
  .lobby-card-sub{font-size:11px;line-height:1.45}

  /* Summary bar: let the chips wrap and keep the tools on their own row */
  #mkt-summary-bar{gap:7px;padding:8px 12px;top:0}
  .msb-tools{margin-left:0;width:100%;justify-content:flex-end}
  .msb-est{margin-left:0}

  /* Email composer + admin workspace breathe better with less side padding */
  .eml-body,.admws-body{padding:16px 14px 48px}
  .eml-card{padding:16px 14px}
  .eml-tabs{padding:12px 14px 0}

  /* Results list is the longest scroll in the app — tighten it up */
  .fit-panel-head{padding:9px 12px}
  .mkt-note{font-size:10px}

  /* Tables scroll rather than squeeze into unreadable columns */
  .user-table,#admws-user-table{display:block;overflow-x:auto;white-space:nowrap}

  /* Topbars: wrap and shrink padding */
  .wm-topbar{padding:10px 14px;margin:10px 10px 18px;border-radius:var(--r);flex-wrap:wrap;gap:8px}
  .wm-topbar-title{font-size:13px}

  /* Any 2-column field row (contact modal, VLR, claims org, David Tracker entry) stacks */
  .cal-field-row{grid-template-columns:1fr!important}

  /* David Tracker table: allow horizontal scroll instead of squeezing columns */
  #dt-table{font-size:11px}
  #dt-table td,.dt-th{padding:6px 8px!important}

  /* Calendar: shrink cell min-height so a month fits without excess scroll */
  .cal-cell{min-height:58px!important}
  #cal-day-panel{width:100%!important}

  /* Filter bars / button rows: allow wrapping instead of overflowing */
  .avp-btn-row{flex-wrap:wrap}
  #mkt-summary-bar{flex-wrap:wrap;row-gap:6px}

  /* Contact-style toggle buttons: slightly smaller tap targets still ≥40px tall */
  .contact-tog{padding:8px 16px;font-size:12px}

  /* Directory / stat chip strips wrap instead of overflowing off-screen */
  .dt-stat-chip{font-size:10px;padding:4px 11px}
}

/* ---- bloque 3 (era linea 1791 de index.html) ---- */

/* ══════════════════════════════════════
   AUTH SYSTEM
══════════════════════════════════════ */
#auth-screen{
  position:fixed;inset:0;z-index:9999;
  display:flex;align-items:center;justify-content:center;
  background:var(--bg);
  background-image:var(--bg-mesh);
  background-attachment:fixed;
  background-repeat:var(--bg-mesh-repeat);
  background-position:var(--bg-mesh-pos);
  background-size:var(--bg-mesh-size);
  min-height:100vh;
}
.auth-card{
  width:100%;max-width:380px;
  background:linear-gradient(145deg,rgba(255,255,255,0.28) 0%,rgba(255,255,255,0.16) 100%);
  backdrop-filter:saturate(220%) blur(52px);-webkit-backdrop-filter:saturate(220%) blur(52px);
  border:0.5px solid rgba(255,255,255,0.68);
  border-radius:var(--r-xl);
  box-shadow:0 20px 60px rgba(0,0,0,0.08),0 4px 16px rgba(0,0,0,0.05),inset 0 1px 0 rgba(255,255,255,1.00),inset 0 0 0 0.5px rgba(255,255,255,0.30);
  padding:36px 32px 32px;
  position:relative;overflow:hidden;
}
[data-theme="dark"] .auth-card{
  background:linear-gradient(145deg,rgba(255,255,255,0.12) 0%,rgba(255,255,255,0.06) 100%);
  border-color:rgba(255,255,255,0.20);
  box-shadow:0 20px 60px rgba(0,0,0,0.50),0 4px 16px rgba(0,0,0,0.30),inset 0 1px 0 rgba(255,255,255,0.14),inset 0 0 0 0.5px rgba(255,255,255,0.08);
}
.auth-card::before{
  content:'';position:absolute;top:0;left:0;right:0;height:1px;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,0.85),transparent);
}
.auth-logo-wrap{display:flex;flex-direction:column;align-items:center;margin-bottom:24px}
/* A pane the mark sits on, not a plate it is printed on: the artwork is
   transparent, so what shows around the letter is the sign-in card and the
   backdrop behind it, blurred. */
.auth-logo-ring{
  width:64px;height:64px;border-radius:17px;
  background:var(--brand-plate);
  border:0.5px solid var(--border2);
  display:flex;align-items:center;justify-content:center;
  margin-bottom:14px;
  padding:7px;
  box-shadow:var(--inner);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
}
.auth-field{margin-bottom:14px}
.auth-field label{
  display:block;font-size:11px;font-weight:700;
  color:#1a1d2e;letter-spacing:.04em;text-transform:uppercase;
  margin-bottom:6px;
}
.auth-field input{
  width:100%;padding:10px 13px;
  background:#ffffff;
  border:1.5px solid rgba(22,58,102,0.25);
  border-radius:var(--r-sm);
  color:#0a0c14 !important;
  font-size:14px;
  font-family:inherit;outline:none;
  transition:border-color .15s,box-shadow .15s;
  box-shadow:inset 0 1px 3px rgba(0,0,0,0.06);
  -webkit-text-fill-color:#0a0c14;
}
.auth-field input::placeholder{color:rgba(10,12,20,0.38) !important;-webkit-text-fill-color:rgba(10,12,20,0.38)}
.auth-field input:focus{
  border-color:#163a66;
  box-shadow:0 0 0 3px rgba(22,58,102,0.16),inset 0 1px 2px rgba(0,0,0,0.04);
  background:#ffffff;
}
[data-theme="dark"] .auth-field label{color:rgba(255,255,255,0.90)}
[data-theme="dark"] .auth-field input{
  background:#0e1a2e;
  border-color:rgba(77,143,230,0.28);
  color:#ffffff !important;
  -webkit-text-fill-color:#ffffff;
}
[data-theme="dark"] .auth-field input::placeholder{color:rgba(255,255,255,0.38) !important;-webkit-text-fill-color:rgba(255,255,255,0.38)}
[data-theme="dark"] .auth-field input:focus{
  background:#102040;
  border-color:var(--accent);
  box-shadow:0 0 0 3px rgba(77,143,230,0.18);
}
.auth-btn{
  width:100%;padding:11px;margin-top:8px;
  background:var(--accent);
  border:none;
  border-radius:var(--r-sm);
  color:#fff;font-size:14px;font-weight:700;
  font-family:inherit;cursor:pointer;
  box-shadow:0 4px 14px rgba(22,58,102,0.35),inset 0 1px 0 rgba(255,255,255,0.18);
  transition:all .2s;
  letter-spacing:.01em;
}
.auth-btn:hover{background:var(--accent2);box-shadow:0 6px 22px rgba(22,58,102,0.45);transform:translateY(-1px)}
.auth-btn:active{transform:translateY(0);box-shadow:0 2px 8px rgba(22,58,102,0.28)}
.auth-error{
  font-size:12px;color:var(--danger);
  background:var(--danger-soft);border:0.5px solid var(--danger-border);
  border-radius:var(--r-sm);padding:9px 12px;
  margin-top:12px;display:none;text-align:center;
}
/* Turnstile draws its own iframe; this only gives it room. Hidden until the
   Worker asks for the challenge, so a sign-in screen without one keeps its
   old spacing exactly. */
.auth-turnstile{display:none;margin-top:12px;min-height:65px}
.auth-turnstile.on{display:block}
.auth-turnstile-note{font-size:12px;color:var(--text3);text-align:center;padding:8px 4px}
.auth-version{font-size:10px;color:var(--text3);text-align:center;margin-top:18px;opacity:.6}
.auth-links{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:14px;flex-wrap:wrap}
.auth-link-btn{
  font-size:12px;font-weight:700;
  color:var(--accent);background:none;border:none;
  cursor:pointer;font-family:inherit;
  padding:3px 4px;display:inline-flex;align-items:center;gap:4px;
  text-decoration:none;opacity:1;
}
.auth-link-btn:hover{text-decoration:underline;opacity:.75}
[data-theme="dark"] .auth-link-btn{color:#40d4ff}
.auth-link-sep{color:var(--text3);font-size:13px;font-weight:400}
.auth-title{font-size:18px;font-weight:700;color:var(--text);letter-spacing:-.02em;text-align:center}
.auth-sub{font-size:12px;color:var(--text2);margin-top:4px;text-align:center;font-weight:500}
.auth-success{
  font-size:12px;color:var(--success);
  background:var(--success-soft);border:0.5px solid var(--success-border);
  border-radius:var(--r-sm);padding:9px 12px;
  margin-top:12px;display:none;text-align:center;line-height:1.5;
}
#signup-success.show,#reset-sent-msg.show,#reset-done-msg.show{display:block}

/* ══ ADMIN: PENDING ACCOUNT REQUESTS ══ */
.pending-wrap{margin-bottom:22px}
.pending-row{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:10px 12px;border-radius:var(--r-sm);
  background:var(--warn-soft);border:0.5px solid var(--warn-border);
  margin-bottom:8px;font-size:12px;
}
.pending-row .pending-info{flex:1;min-width:160px}
.pending-row .pending-name{font-weight:600;color:var(--text)}
.pending-row .pending-meta{font-size:11px;color:var(--text3);margin-top:2px}
.pending-row select{
  font-size:11px;padding:5px 8px;border-radius:var(--r-sm);
  background:var(--input-bg);border:1px solid var(--border);color:var(--text);
  font-family:inherit;outline:none;
}
.pending-approve,.pending-deny{
  font-size:11px;font-weight:600;padding:6px 12px;border-radius:99px;
  border:none;cursor:pointer;font-family:inherit;
}
.pending-approve{background:var(--success);color:#fff}
.pending-deny{background:var(--danger-soft);color:var(--danger);border:0.5px solid var(--danger-border)}
.admin-badge{
  font-size:10px;font-weight:700;color:#fff;background:var(--danger);
  border-radius:99px;padding:2px 8px;margin-left:6px;letter-spacing:.02em;
}

/* ══ TOPBAR USER BADGE ══ */
.tbar-user{
  display:flex;align-items:center;gap:7px;
  background:rgba(130,182,242,0.12);border:0.5px solid var(--border);
  border-radius:40px;padding:4px 12px 4px 6px;
  font-size:12px;color:var(--text2);
  backdrop-filter:blur(8px);cursor:default;
}
.tbar-user-avatar{
  width:24px;height:24px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:10px;font-weight:600;color:#fff;
  flex-shrink:0;
}
/* One rule drives every role badge; the colour comes from the --role-* var. */

.role-admin{--rc:var(--role-admin)}
.role-underwriter{--rc:var(--role-underwriter)}
.role-salesrep{--rc:var(--role-salesrep)}
.role-marketing{--rc:var(--role-marketing)}
.role-manager{--rc:var(--role-manager)}
.role-vpso{--rc:var(--role-vpso)}
.role-acctmgmt{--rc:var(--role-acctmgmt)}
.role-readonly{--rc:var(--role-readonly)}
.role-admin,.role-underwriter,.role-salesrep,.role-marketing,
.role-manager,.role-vpso,.role-acctmgmt,.role-readonly{
  color:var(--rc);
  background:color-mix(in srgb,var(--rc) 12%,transparent);
  border:0.5px solid color-mix(in srgb,var(--rc) 30%,transparent)}

/* ══ ADMIN PANEL ══ */
#admin-panel{display:none}
.admin-panel-title{
  font-size:13px;font-weight:600;color:var(--text);
  letter-spacing:-.01em;
  display:flex;align-items:center;gap:8px;margin-bottom:18px;
}
.admin-panel-title::before{
  content:'';width:3px;height:16px;border-radius:2px;
  background:var(--accent);
}
.user-table{width:100%;border-collapse:separate;border-spacing:0;font-size:12px}
.user-table th{
  font-size:10px;font-weight:500;color:var(--text3);
  letter-spacing:.04em;
  padding:6px 10px;border-bottom:0.5px solid var(--border);
  background:rgba(130,182,242,0.06);
}
.user-table th:first-child{border-radius:8px 0 0 0}
.user-table th:last-child{border-radius:0 8px 0 0}
.user-table td{
  padding:9px 10px;border-bottom:0.5px solid var(--border);
  color:var(--text2);vertical-align:middle;
  background:transparent;
  transition:background var(--dur) var(--ease-out);
}
.user-table tr:last-child td{border-bottom:none}
.user-table tr:hover td{background:rgba(var(--brand-blue-rgb),0.05)}

/* ══ READ-ONLY OVERLAY ══ */
body.readonly-mode .avp-btn,
body.readonly-mode select,
body.readonly-mode input:not([data-safe]),
body.readonly-mode textarea,
body.readonly-mode .avp-tog,
body.readonly-mode .mini-btn,
body.readonly-mode .lr-have button,
body.readonly-mode .start-btn{
  pointer-events:none;opacity:.65;
}
body.readonly-mode .avp-card{
  position:relative;
}
.readonly-banner{
  display:none;
  background:var(--warn-soft);border:1px solid var(--warn-border);
  border-radius:var(--r-sm);padding:8px 14px;
  font-size:11px;color:var(--warn);font-weight:600;
  text-align:center;margin-bottom:12px;
}
body.readonly-mode .readonly-banner{display:block}
body.restricted-lobby-mode #lobby-card-salesadmin{display:none}
body.restricted-uwing-mode #lobby-card-admin{display:none}
/* Account Management, for the accounts whose work is not in it.
   The card is hidden and the two functions refuse, but a screen is shown by
   setting a style, and anything holding an old reference can set one. !important
   in a stylesheet beats an inline style, so this is the statement that does not
   depend on every route having remembered to ask. */
body.restricted-uwing-mode #lobby-card-submission,
body.restricted-uwing-mode #submission-screen,
body.restricted-uwing-mode #emails-screen{display:none !important}

/* auth input color handled by main input rule above */

/* ── CLOCK WIDGET ── */
/* ── WIDGETS COLUMN (clock + weather stacked) ── */
#widgets-column{
  position:fixed;bottom:16px;right:16px;z-index:199;
  display:none; /* shown after login */
  flex-direction:column;gap:10px;align-items:stretch;
  width:220px;
}

#clock-widget{
  position:static;
  background:linear-gradient(160deg,#0a0e1a 0%,#0d1220 100%);
  border:0.5px solid rgba(255,255,255,0.10);
  border-radius:18px;
  box-shadow:0 12px 40px rgba(0,0,0,0.40);
  padding:16px 20px;
  min-width:190px;
  display:none; /* shown after login */
  flex-direction:column;gap:0;
}
[data-theme="dark"] #clock-widget{
  background:linear-gradient(160deg,#0a0e1a 0%,#0d1220 100%);
  border-color:rgba(255,255,255,0.10);
  box-shadow:0 12px 40px rgba(0,0,0,0.55);}.cw-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.cw-title{font-size:9px;font-weight:600;color:rgba(255,255,255,0.55);letter-spacing:.08em;text-transform:uppercase}
.cw-toggle-btn{
  font-size:9px;font-weight:600;color:rgba(255,255,255,0.75);
  background:rgba(255,255,255,0.10);border:0.5px solid rgba(255,255,255,0.14);
  border-radius:var(--r-lg);padding:3px 9px;cursor:pointer;
  font-family:inherit;transition:background .15s;
}
.cw-toggle-btn:hover{background:rgba(255,255,255,0.18)}
.cw-toggle-btn.active{background:#fff;color:#0a0e1a;border-color:#fff}

/* Clock face */
#clock-face{display:flex;flex-direction:column;align-items:flex-start}
/* The analog face — hands are rotated by updateClock() in 03-hub.js via the
   SVG transform attribute, not by anything here; this only draws the dial. */
.clock-analog{width:58px;height:58px;align-self:center;margin-bottom:10px;display:block}
.ca-face{fill:rgba(255,255,255,0.05);stroke:rgba(255,255,255,0.22);stroke-width:1.5}
.ca-tick{stroke:rgba(255,255,255,0.30);stroke-width:1.4;stroke-linecap:round}
.ca-tick-major{stroke:rgba(255,255,255,0.55);stroke-width:2}
.ca-hand{stroke-linecap:round}
.ca-hour{stroke:#fff;stroke-width:3.4}
.ca-min{stroke:#fff;stroke-width:2.4}
.ca-sec{stroke:var(--brand-blue);stroke-width:1.3}
.ca-center{fill:var(--brand-blue)}
.clock-time{
  font-size:40px;font-weight:700;color:#fff;
  letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums;
  font-family:var(--font-mono);
}
.clock-ampm{font-size:12px;font-weight:500;color:rgba(255,255,255,0.5);margin-left:4px;vertical-align:super}
.clock-date{font-size:12px;color:rgba(255,255,255,0.60);margin-top:8px;text-align:left}
.clock-tz{font-size:11px;color:rgba(255,255,255,0.42);margin-top:2px;text-align:left}

/* Stopwatch face */
#stopwatch-face{display:none;flex-direction:column;align-items:center}
.sw-display{
  font-size:28px;font-weight:300;color:#fff;
  letter-spacing:.02em;font-variant-numeric:tabular-nums;line-height:1;font-family:var(--font-mono);
}
.sw-ms{font-size:16px;color:rgba(255,255,255,0.5);font-variant-numeric:tabular-nums;font-family:var(--font-mono)}
.sw-btn-row{display:flex;gap:8px;margin-top:10px;justify-content:center}
.sw-btn{
  padding:5px 14px;border-radius:var(--r-lg);font-size:11px;font-weight:500;
  font-family:inherit;cursor:pointer;border:0.5px solid rgba(255,255,255,0.15);
  background:rgba(255,255,255,0.10);color:rgba(255,255,255,0.85);transition:all .15s;
}
.sw-btn:hover{background:rgba(130,182,242,0.20)}
.sw-btn.start{background:var(--success-soft);border-color:var(--success-border);color:var(--success)}
.sw-btn.stop{background:var(--danger-soft);border-color:var(--danger-border);color:var(--danger)}
.sw-btn.start:hover{background:rgba(40,167,69,0.20)}
.sw-btn.stop:hover{background:rgba(220,53,69,0.20)}
.sw-laps{max-height:80px;overflow-y:auto;margin-top:8px;width:100%;scrollbar-width:thin}
.sw-lap{
  display:flex;justify-content:space-between;
  font-size:9px;color:rgba(255,255,255,0.55);padding:2px 0;
  border-bottom:0.5px solid rgba(255,255,255,0.10);font-variant-numeric:tabular-nums;font-family:var(--font-mono);
}
.sw-lap:last-child{border-bottom:none}

/* ── ALARM ── */
/* Frosted glass over the widget's own dark card, the same visual language
   as the rest of the app's glass surfaces (blur + a soft inner highlight
   along the top edge) — kept on fixed, dark-scoped colors rather than the
   light/dark theme vars the rest of this section used to borrow, since
   #clock-widget itself is deliberately dark regardless of app theme and a
   light-theme accent color read as a mismatch sitting on top of it. */
#alarm-face{display:none;flex-direction:column;align-items:stretch;gap:10px}
.alarm-add-row{display:flex;flex-direction:column;gap:6px}
.alarm-time-inp{
  width:100%;font-size:20px;font-weight:300;color:#fff;
  background:rgba(255,255,255,0.09);
  backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);
  border:0.5px solid rgba(255,255,255,0.16);
  border-radius:var(--r-sm);padding:8px 10px;font-family:inherit;text-align:center;outline:none;
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.12);
  transition:border-color .15s,background .15s;
}
.alarm-time-inp:focus{border-color:rgba(var(--brand-blue-rgb),0.55);background:rgba(255,255,255,0.14)}
.alarm-set-btn{
  width:100%;font-size:12px;font-weight:700;color:#eaf1ff;
  background:rgba(var(--brand-blue-rgb),0.30);
  backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);
  border:0.5px solid rgba(var(--brand-blue-rgb),0.45);
  border-radius:var(--r-sm);padding:9px 0;cursor:pointer;font-family:inherit;
  letter-spacing:.02em;
  box-shadow:0 4px 14px rgba(0,0,0,0.22),inset 0 1px 0 rgba(255,255,255,0.16);
  transition:background .15s;
}
.alarm-set-btn:hover{background:rgba(var(--brand-blue-rgb),0.42)}
.alarm-list{display:flex;flex-direction:column;gap:5px;max-height:110px;overflow-y:auto;scrollbar-width:thin}
.alarm-empty{font-size:11px;color:rgba(255,255,255,0.5);text-align:center;padding:6px 0}
.alarm-item{
  display:flex;align-items:center;justify-content:space-between;
  background:rgba(255,255,255,0.08);
  backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);
  border:0.5px solid rgba(255,255,255,0.14);
  border-radius:var(--r-sm);padding:7px 10px;gap:8px;
  box-shadow:0 3px 10px rgba(0,0,0,0.18),inset 0 1px 0 rgba(255,255,255,0.10);
  transition:opacity .25s;
}
.alarm-item.inactive{opacity:.38}
.alarm-item-left{display:flex;align-items:center;gap:9px;flex:1}
.alarm-item-time{font-size:14px;font-weight:500;color:#fff;font-variant-numeric:tabular-nums;font-family:var(--font-mono)}
.alarm-item-tog{
  width:34px;height:19px;border-radius:var(--r-sm);position:relative;cursor:pointer;flex-shrink:0;
  background:rgba(130,182,242,0.28);border:0.5px solid rgba(130,182,242,0.20);
  transition:background .25s var(--ease-out);
}
.alarm-item-tog::before{
  content:'';position:absolute;top:1.5px;left:1.5px;
  width:15px;height:15px;border-radius:50%;background:#fff;
  box-shadow:0 1px 4px rgba(0,0,0,0.22);
  transition:transform .25s var(--ease-out);
}
.alarm-item.active .alarm-item-tog{background:var(--accent)}
.alarm-item.active .alarm-item-tog::before{transform:translateX(15px)}
.alarm-item-del{
  font-size:10px;font-weight:700;color:var(--danger);
  background:var(--danger-soft);border:0.5px solid var(--danger-border);
  border-radius:6px;padding:3px 8px;cursor:pointer;font-family:inherit;flex-shrink:0;
}
/* Ringing state */
/* An alarm going off. The ring was drawn as a spreading box-shadow on the
   widget, which worked while it sat in a column with space around it — in a
   panel hanging off the bar the shadow is clipped by nothing and reads as the
   panel itself flashing. It rings on the panel and on the button in the bar,
   so it is visible whether the panel is open or shut. */
@keyframes alm-ring{0%,100%{box-shadow:0 8px 32px rgba(0,0,0,0.12),0 0 0 0 rgba(var(--brand-blue-rgb),0.55)}60%{box-shadow:0 8px 32px rgba(0,0,0,0.12),0 0 0 10px rgba(var(--brand-blue-rgb),0)}}
#clock-widget.ringing{animation:alm-ring .7s ease infinite}
@keyframes tbar-alm{0%,100%{background:var(--danger);color:#fff}50%{background:var(--warn);color:#fff}}
.tbar-clock.ringing{animation:tbar-alm .7s ease infinite;border-color:transparent}
.tbar-clock.ringing > .ti{color:#fff}
@media(prefers-reduced-motion:reduce){
  #clock-widget.ringing,.tbar-clock.ringing{animation:none}
  .tbar-clock.ringing{background:var(--danger);color:#fff}
}
/* Alarm notification banner */
#alarm-notif{
  position:fixed;top:72px;left:50%;
  transform:translateX(-50%) translateY(-14px);
  background:rgba(var(--brand-blue-rgb),0.52);
  backdrop-filter:saturate(180%) blur(36px);-webkit-backdrop-filter:saturate(180%) blur(36px);
  color:#fff;
  padding:11px 18px;border-radius:var(--r);font-family:inherit;
  font-size:14px;font-weight:600;
  border:0.5px solid rgba(100,168,255,0.50);
  z-index:9500;display:none;gap:12px;align-items:center;
  box-shadow:0 8px 36px rgba(var(--brand-blue-rgb),0.28),inset 0 1px 0 rgba(255,255,255,0.38),inset 0 0 0 0.5px rgba(255,255,255,0.18);
  opacity:0;transition:opacity .28s,transform .28s;white-space:nowrap;
}
#alarm-notif.show{display:flex;opacity:1;transform:translateX(-50%) translateY(0)}
.alarm-notif-snz,.alarm-notif-dim{
  font-size:11px;font-weight:700;border-radius:8px;
  padding:4px 10px;cursor:pointer;font-family:inherit;border:1px solid rgba(255,255,255,0.30);
}
.alarm-notif-snz{background:rgba(255,255,255,0.22);color:#fff}
.alarm-notif-dim{background:rgba(255,255,255,0.10);color:rgba(255,255,255,.78)}

/* Page padding so content isn't hidden behind nav */

/* ══════════════════════════════════════
   WEATHER WIDGET
══════════════════════════════════════ */
#weather-widget{
  position:static;
  border-radius:var(--r-lg);
  background:var(--glass-card);
  backdrop-filter:var(--blur);
  -webkit-backdrop-filter:var(--blur);
  border:0.5px solid var(--border);
  box-shadow:var(--shadow-lg);
  padding:16px 18px;
  width:max-content;min-width:200px;max-width:230px;
  display:none;
  flex-direction:column;gap:0;
}
[data-theme="dark"] #weather-widget{
  background:linear-gradient(145deg,rgba(255,255,255,0.10) 0%,rgba(255,255,255,0.05) 100%);
  border-color:rgba(255,255,255,0.14);
  box-shadow:0 8px 36px rgba(0,0,0,0.44),inset 0 1px 0 rgba(255,255,255,0.12),inset 0 0 0 0.5px rgba(255,255,255,0.07);
}
.ww-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}
.ww-title{font-size:9px;font-weight:500;color:var(--text3);letter-spacing:.08em;text-transform:uppercase}
.ww-refresh{
  display:inline-flex;align-items:center;gap:4px;
  font-size:9px;font-weight:600;color:var(--accent);background:var(--accent-soft);
  border:none;border-radius:var(--r-lg);
  padding:3px 9px;cursor:pointer;font-family:inherit;transition:background .15s;
}
.ww-refresh:hover{background:rgba(22,58,102,0.20)}
.ww-loading{font-size:11px;color:var(--text3);text-align:center;padding:14px 0}
.ww-error{font-size:10px;color:var(--danger);text-align:center;padding:8px 0;line-height:1.4}
.ww-error-why{font-size:9px;opacity:.85}

/* Location row */
.ww-location{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.ww-location-city{display:flex;align-items:center;gap:4px;font-size:11px;font-weight:600;color:var(--text2)}
.ww-location-city .ti{font-size:11px;color:var(--accent)}

/* Main temp row */
.ww-main{display:flex;align-items:center;gap:12px;margin-bottom:12px}
.ww-icon{font-size:26px;line-height:1;flex-shrink:0;color:var(--accent);display:flex}
.ww-temps{min-width:0}
.ww-temp{font-size:32px;font-weight:200;color:var(--text);letter-spacing:-.02em;line-height:1;font-family:var(--font-mono)}
.ww-temp-unit{font-size:16px;font-weight:400;color:var(--text3);margin-left:1px}
.ww-desc-inline{font-size:11px;font-weight:500;color:var(--text3);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ww-desc{font-size:12px;font-weight:500;color:var(--text2);margin-bottom:8px}/* Stats — flat rows, fit to content, no boxes */
.ww-stats{display:flex;flex-direction:column;border-top:0.5px solid var(--border);padding-top:8px;gap:7px}
.ww-stat{display:flex;align-items:center;gap:6px;font-size:11px}
.ww-stat .ti{font-size:12px;color:var(--text3);flex-shrink:0}
.ww-stat-label{color:var(--text3);font-weight:500;flex:1}
.ww-stat-val{color:var(--text);font-weight:600}

.ww-updated{font-size:8.5px;color:var(--text3);text-align:center;margin-top:10px;opacity:.65}

/* ══════════════════════════════════════
   AUTH SCREEN — Floating Clock & Weather
══════════════════════════════════════ */
.auth-widgets-row{
  position:absolute;
  top:max(20px, calc(env(safe-area-inset-top) + 12px));
  left:18px;right:18px;
  display:flex;justify-content:space-between;align-items:flex-start;
  gap:12px;z-index:1;pointer-events:none;
}
.auth-wgt{
  background:linear-gradient(145deg,rgba(255,255,255,0.26) 0%,rgba(255,255,255,0.14) 100%);
  backdrop-filter:saturate(220%) blur(48px);
  -webkit-backdrop-filter:saturate(220%) blur(48px);
  border:0.5px solid rgba(255,255,255,0.68);
  border-radius:18px;
  box-shadow:0 8px 36px rgba(0,0,0,0.07),0 2px 8px rgba(0,0,0,0.04),inset 0 1px 0 rgba(255,255,255,1.00),inset 0 0 0 0.5px rgba(255,255,255,0.28);
  padding:14px 18px;
  pointer-events:all;
}
[data-theme="dark"] .auth-wgt{
  background:linear-gradient(145deg,rgba(255,255,255,0.10) 0%,rgba(255,255,255,0.05) 100%);
  border-color:rgba(255,255,255,0.18);
  box-shadow:0 8px 36px rgba(0,0,0,0.44),inset 0 1px 0 rgba(255,255,255,0.12),inset 0 0 0 0.5px rgba(255,255,255,0.07);
}
/* Clock pill */
.auth-clock-time{
  display:flex;align-items:baseline;gap:0;
  font-size:30px;font-weight:200;letter-spacing:-.03em;
  color:var(--text);line-height:1;
}
.auth-clock-ampm{font-size:13px;font-weight:500;color:var(--text3);margin-left:5px;align-self:center}
.auth-clock-date{font-size:11px;color:var(--text3);margin-top:5px}
.auth-clock-tz{font-size:9px;color:var(--text3);margin-top:1px;opacity:.65}
/* Weather pill */
.auth-wgt-weather{min-width:148px}
.auth-weather-main{display:flex;align-items:center;gap:10px}
.auth-weather-icon{font-size:32px;line-height:1;flex-shrink:0}
.auth-weather-temp{font-size:26px;font-weight:300;color:var(--text);letter-spacing:-.02em;line-height:1}
.auth-weather-desc{font-size:11px;font-weight:500;color:var(--text2);margin-top:5px}
.auth-weather-loc{font-size:9px;color:var(--text3);margin-top:2px;display:flex;align-items:center;gap:3px}

/* ══════════════════════════════════════
   DESKTOP LANDING
══════════════════════════════════════ */
#landing{display:none;flex-direction:column;min-height:100vh;padding:calc(90px + env(safe-area-inset-top)) 20px 48px;box-sizing:border-box}
.desk-inner{max-width:var(--col-std);margin:0 auto;width:100%;display:flex;flex-direction:column}
.desk-greeting{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:28px}
.desk-hi{font-size:13px;font-weight:500;color:var(--text3);letter-spacing:-.01em;margin-bottom:2px}
.desk-name{font-size:38px;font-weight:200;color:var(--text);letter-spacing:-.03em;line-height:1.05}
.desk-date-pill{font-size:12px;color:var(--text3);white-space:nowrap;background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:0.5px solid var(--border);border-radius:99px;padding:5px 14px}
/* ── Top lobby: 3-category chooser ── */
.lobby-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
@media (max-width:760px){.lobby-grid{grid-template-columns:1fr}}
.lobby-card{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:24px;transition:transform .15s,box-shadow .15s}
.lobby-card:hover{transform:translateY(-2px);box-shadow:0 10px 30px rgba(0,0,0,0.10)}
.lobby-card-icon{width:54px;height:54px;border-radius:14px;display:flex;align-items:center;justify-content:center;margin-bottom:6px;box-shadow:0 4px 14px rgba(0,0,0,0.14)}
.lobby-card-title{font-size:16px;font-weight:700;color:var(--text);letter-spacing:-.02em}
.lobby-card-sub{font-size:12px;color:var(--text3);line-height:1.5;margin-bottom:6px}
.lobby-card-badge{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:600;
  color:var(--text3);background:var(--glass3);border:0.5px solid var(--border);
  border-radius:var(--r-lg);padding:3px 11px;margin-top:auto}
.lobby-card-badge-live{background:rgba(var(--brand-blue-rgb),0.10);color:var(--accent);border-color:rgba(var(--brand-blue-rgb),0.22)}

.desk-grid{display:grid;grid-template-columns:1.3fr 1fr 1fr;grid-template-rows:auto auto;gap:16px}
/* A hero card spans two rows to match the footprint of the mini cards that
   used to share its grid. Where it now sits alone (Analyze, Track), there is
   nothing left to size that second row, and letting it span an empty one
   made its height a function of its own subtitle length instead of a fixed
   shape. Alone, it just sits in the one row it needs. */
.desk-grid:has(>.desk-card.desk-main:only-child){grid-template-rows:auto}
.desk-grid:has(>.desk-card.desk-main:only-child)>.desk-main{grid-row:auto}
.desk-card{
  background:var(--glass-card);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  border:0.5px solid var(--border2);border-radius:22px;
  box-shadow:var(--shadow-lg);
  cursor:pointer;position:relative;overflow:hidden;
  transition:transform .22s var(--ease-fluid),box-shadow .22s;
}
.desk-card::before{content:'';position:absolute;top:0;left:0;right:0;height:42%;background:linear-gradient(180deg,rgba(0,180,255,0.10) 0%,rgba(0,100,200,0.04) 40%,transparent 80%);pointer-events:none}
.desk-card:hover{transform:translateY(-3px) scale(1.008);box-shadow:0 14px 48px rgba(0,0,0,0.50),0 4px 14px rgba(0,0,0,0.35),inset 0 1px 0 rgba(77,143,230,0.18)}
.desk-card:active{transform:translateY(-1px)}
[data-theme="dark"] .desk-card{background:linear-gradient(145deg,rgba(255,255,255,0.10) 0%,rgba(255,255,255,0.05) 100%);border-color:rgba(255,255,255,0.18);box-shadow:0 8px 36px rgba(0,0,0,0.44),inset 0 1px 0 rgba(255,255,255,0.12),inset 0 0 0 0.5px rgba(255,255,255,0.07)}
.desk-main{
  grid-row:1/3;grid-column:1;display:flex;flex-direction:column;padding:18px 22px;gap:0;
  /* Both hero cards now sit alone in their own two-row grid — nothing else
     shares those rows to drive their height, so each card's own subtitle
     length would otherwise decide it. A shared floor keeps them the same
     size regardless of what either card's content happens to say. Sized
     down from the original 244px tower — still the flagship entry point,
     no longer taking up two thirds of the screen before anything else. */
  min-height:150px;
  position:relative;overflow:hidden;
  background:
    radial-gradient(ellipse 90% 60% at 78% 100%, rgba(255,170,90,0.30) 0%, transparent 60%),
    radial-gradient(ellipse 70% 50% at 15% 10%, rgba(77,143,230,0.28) 0%, transparent 60%),
    linear-gradient(160deg,#050810 0%,#0c1626 45%,#182338 75%,#26364f 100%);
  border-color:rgba(255,255,255,0.14)!important;
}
.desk-main::before{content:none}
.desk-main-mountains{position:absolute;left:0;right:0;bottom:0;width:100%;height:38%;pointer-events:none}
.desk-main-top{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px;position:relative;z-index:1}
.desk-main-icon{width:32px;height:32px;flex-shrink:0;filter:drop-shadow(0 4px 14px rgba(0,0,0,0.35))}

/* CRM HUB's own flash-card mark: same 40px box and drop shadow every other
   desk-main-icon uses, "IS" in place of a glyph. The card behind it is
   always the dark desk-main gradient regardless of site theme (its title is
   a hardcoded #fff for the same reason), so this reuses .land-title's own
   dark-mode gradient-text treatment unconditionally rather than switching on
   [data-theme] — the one place that gradient already means "this app's
   logotype," not "we're in dark mode right now." */
.desk-main-icon-is{width:32px;height:32px;border-radius:9px;flex-shrink:0;
  background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.16);
  display:flex;align-items:center;justify-content:center;
  filter:drop-shadow(0 4px 14px rgba(0,0,0,0.35))}
.desk-main-icon-is span{font-size:13px;font-weight:700;letter-spacing:-.02em;
  background:linear-gradient(135deg,#f2f2f7 30%,#409cff);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}
.desk-main-body{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1;justify-content:center}
.desk-main-title{font-size:18px;font-weight:600;color:#fff;letter-spacing:-.02em}
/* min-height reserves 2 lines whether the copy needs them or not — the
   Analyzer and CRM HUB flash cards must stay the exact same size (see the
   CI check on it), and their subtitles are not the same length. A shared
   floor on this one element does that without inflating the whole card back
   toward its old height, the way a bigger .desk-main min-height would. */
.desk-main-sub{font-size:12px;color:rgba(255,255,255,0.68);line-height:1.5;min-height:calc(12px*1.5*2)}
.desk-launch-btn{
  margin-top:14px;width:100%;background:rgba(255,255,255,0.94);color:#0a0c14;border:none;border-radius:14px;
  padding:5px 5px 5px 18px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;
  display:flex;align-items:center;justify-content:space-between;gap:8px;letter-spacing:-.01em;
  box-shadow:0 4px 18px rgba(0,0,0,0.30);transition:background .15s,box-shadow .15s,transform .1s;
  position:relative;z-index:1;
}
.desk-launch-arrow{width:30px;height:30px;border-radius:50%;background:#0a0c14;color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden}
.desk-launch-btn:hover{background:#fff;box-shadow:0 6px 24px rgba(0,0,0,0.38)}
.desk-launch-btn:hover .desk-launch-arrow i{animation:arrowSweep .85s cubic-bezier(.45,.05,.55,.95) infinite}
@keyframes arrowSweep{
  0%{transform:translateX(-18px);opacity:0}
  35%{transform:translateX(0);opacity:1}
  65%{transform:translateX(0);opacity:1}
  100%{transform:translateX(18px);opacity:0}
}
@media(prefers-reduced-motion:reduce){.desk-launch-btn:hover .desk-launch-arrow i{animation:none}}
.desk-launch-btn:active{transform:scale(.98)}
.desk-mini{display:flex;flex-direction:column;padding:24px;gap:5px;padding-bottom:46px;min-height:150px}
.desk-mini-icon{font-size:30px;line-height:1;margin-bottom:6px}
/* ── Linear icon tiles — flat, single-color, consistent across the home grid ── */
.desk-mini-icon.tile{
  width:46px;height:46px;border-radius:13px;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  background:linear-gradient(150deg,var(--accent-soft) 0%,var(--glass2) 100%);
  border:0.5px solid var(--border2);
  color:var(--accent);font-size:20px;
  box-shadow:var(--inner);margin-bottom:8px;
}
.tile-lg{
  width:52px;height:52px;border-radius:15px;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  background:linear-gradient(150deg,var(--accent-soft) 0%,var(--glass2) 100%);
  border:0.5px solid var(--border2);
  color:var(--accent);font-size:24px;
  box-shadow:var(--inner);
}
.cal-tile{
  width:46px;height:46px;border-radius:13px;flex-shrink:0;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:linear-gradient(150deg,var(--accent-soft) 0%,var(--glass2) 100%);
  border:0.5px solid var(--border2);box-shadow:var(--inner);
  margin-bottom:8px;line-height:1;gap:1px;
}
/* 8px was the smallest type anywhere in the app outside the tutorial's
   miniature illustrations, and this is a real label somebody reads to know
   which day a tile is. 9px is the floor the rest of the interface uses for an
   uppercase eyebrow, and it is used a hundred and fifty times over — there was
   no reason for this one to sit below it. */
.cal-tile .cal-tile-wday{font-size:9px;font-weight:700;letter-spacing:.06em;color:var(--accent2);text-transform:uppercase}
.cal-tile .cal-tile-day{font-size:18px;font-weight:700;color:var(--accent);letter-spacing:-.02em}
.desk-mini-title{font-size:14px;font-weight:600;color:var(--text);letter-spacing:-.01em}
.desk-mini-sub{font-size:11px;color:var(--text3)}
.desk-mini::after{
  content:'\2192';
  position:absolute;right:16px;bottom:16px;
  width:28px;height:28px;border-radius:50%;
  background:var(--glass2);border:0.5px solid var(--border);
  display:flex;align-items:center;justify-content:center;
  font-size:13px;color:var(--text2);
  transition:background .15s,transform .15s;
}
.desk-mini:hover::after{background:var(--accent);color:#fff;transform:translateX(1px)}
/* tbar-home-btn: see v4.5.3 styles below */

/* ══ TOPBAR ENHANCEMENTS v4.5.3 ══ */
/* Dynamic Home Button */
.tbar-home-btn {
  display:none;align-items:center;gap:7px;
  font-size:12px;font-weight:700;letter-spacing:-.01em;
  color:#fff;
  background:var(--accent);
  border:0.5px solid rgba(255,255,255,0.25);
  border-radius:14px;
  padding:6px 14px;
  cursor:pointer;font-family:inherit;
  transition:all .2s;
  position:relative;overflow:hidden;
  box-shadow:0 3px 14px var(--blue-glow);
  flex-shrink:0;
}
.tbar-home-btn:hover {
  background:var(--accent2);
  transform:translateY(-1px);
  box-shadow:0 5px 20px var(--blue-glow);
}
.tbar-home-btn:active { transform:scale(.97) }
.home-btn-pulse {
  position:absolute;inset:0;border-radius:14px;
  border:1.5px solid var(--accent);
  animation:homePulse 2s ease-out infinite;
  pointer-events:none;
  transition:none!important;
}
@keyframes homePulse {
  0%{opacity:.7;transform:scale(1)}
  100%{opacity:0;transform:scale(1.18)}
}

/* User Avatar Circle */
/* The avatar carries the unread count, so this wrap is what the badge is
   positioned against; pointer-events pass through to the circle underneath so
   clicking the number still opens the menu. */
.tbar-user-avatar-wrap {
  position:relative;
  display:inline-flex;
}
.tbar-avatar-circle {
  width:34px;height:34px;border-radius:50%;
  background:var(--accent);
  border:2px solid rgba(255,255,255,0.25);
  display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:700;color:#fff;
  cursor:pointer;overflow:hidden;flex-shrink:0;
  transition:transform .2s, box-shadow .2s;
  box-shadow:0 2px 10px var(--blue-glow);
  position:relative;
}
.tbar-avatar-circle:hover {
  transform:scale(1.08);
  box-shadow:0 4px 18px var(--blue-glow);
}
/* Dark theme: the light-theme recipe above is a fully-saturated accent fill
   plus a matching glow, which in light mode sits on a pale background and
   reads as a normal brand-colored button. On the near-black dark background
   the same fill turns into a glaring, glowing disc — the button people open
   the profile/notifications menu from — that is harder to read than legible.
   A translucent tint over the dark backdrop, a soft border instead of a
   glow, keeps it identifiable without the glare. */
[data-theme="dark"] .tbar-avatar-circle {
  background:linear-gradient(135deg, rgba(77,143,230,0.55), rgba(47,111,170,0.55));
  border-color:rgba(255,255,255,0.20);
  box-shadow:0 2px 8px rgba(0,0,0,0.35);
}
[data-theme="dark"] .tbar-avatar-circle:hover {
  box-shadow:0 3px 12px rgba(0,0,0,0.45);
}

/* ══ LEFT SLIDE-IN NAV v4.5.3 ══ */
/* Edge hint line */
#nav-edge-hint {
  position:fixed;left:0;top:0;bottom:0;width:3px;z-index:3000;
  background:linear-gradient(180deg,transparent 0%,var(--accent) 30%,var(--accent2) 70%,transparent 100%);
  opacity:0;pointer-events:none;
  transition:opacity .4s;
  animation:hintPulse 3s ease-in-out infinite;
}
body.nav-open #nav-edge-hint { opacity:0 }

/* ── Pinned nav ── */
body.nav-pinned #slide-nav{
  transform:translateX(0)!important;
  box-shadow:none;
  border-right:0.5px solid var(--border2);
}
body.nav-pinned #nav-edge-hint{ display:none }

/* ── Screen transition (fade + slight rise) — applied automatically via observer ── */
@keyframes screenEnter{
  from{opacity:0;transform:translateY(10px)}
  to{opacity:1;transform:translateY(0)}
}
.screen-anim{animation:screenEnter .32s var(--ease-out)}

/* ─── Pinned nav: push content over so nothing sits under the sidebar ─── */
#landing,#sales-admin-screen,#app,#meeting-screen,#docs-screen,
#templates-screen,#calendar-screen,#directory-screen,#david-tracker-screen{
  margin-left:0;
  transition:margin-left .35s var(--ease-out);
}
/* The pinned sidebar used to overlay the left gutter, on the reasoning that a
   centred max-width column leaves enough room either side. That holds until a
   screen is wide — the General Tracker's table, the Power BI frame, a market
   panel on a large monitor — and then the sidebar is sitting on top of the
   content. Every screen now leaves the room instead of hoping it is there;
   centred columns simply centre in what is left. */
/* The condition is "the panel is on screen", not "the panel is pinned". Those
   are not the same thing and the difference was the bug: pressing the three
   lines twice — once to put the bar away, once to bring it back — leaves it
   nav-open but no longer nav-pinned, so nothing reserved the room and the bar
   sat on top of the top bar and the first column of cards. body.nav-open is
   set by both routes; body.nav-pinned only by one.

   Between 761 and 1100 the bar is a drawer that opens on request, drawn as
   the 74px rail (see "The narrow panel"), and the page moves over by that
   much instead of letting the drawer sit on the top bar and hide Home and the
   screen's title. Below 1000 the full panel was allowed to cover the page;
   that was the bug on every screen at laptop widths with zoom. Only a phone
   (760 and below) still gets the overlay, where there is no width to give. */
@media(min-width:761px){
  body.nav-open #landing,
  body.nav-open #sales-admin-screen,
  body.nav-open #submission-screen,
  body.nav-open #emails-screen,
  body.nav-open #app,
  body.nav-open #meeting-screen,
  body.nav-open #docs-screen,
  body.nav-open #templates-screen,
  body.nav-open #calendar-screen,
  body.nav-open #directory-screen,
  body.nav-open #david-tracker-screen,
  body.nav-open #admin-workspace-screen,
  body.nav-open #marketing-workspace-screen,
  body.nav-open #marketing-crm-screen,
  body.nav-open #novastudio-screen,
  body.nav-open #timeoff-screen,
  body.nav-open #profile-screen,
  body.nav-open #games-screen,
  body.nav-open #powerbi-screen,
  body.nav-open #general-tracker-screen,
  body.nav-open #kpi-screen,
  body.nav-open #invoice-screen,
  body.nav-open #indications-screen,
  body.nav-open #indications-paygo-screen,
  body.nav-open #indications-peo-screen,
  body.nav-open #carriers-screen,
  body.nav-open #trivia-screen,
  body.nav-open #solitaire-screen,
  body.nav-open #perf-screen{
    padding-left:var(--nav-w);
    transition:padding-left .35s var(--ease-out);
  }
}
/* Floating/fixed widgets also need to shift so they don't sit under the pinned nav */
body.nav-pinned #cal-day-panel{ right:0 }
/* ── Pinned nav: top bars slide right so Home/back stays visible past the sidebar ── */
.topbar,.wm-topbar{transition:margin-left .35s var(--ease-out)}
@media(max-width:760px){
  body.nav-pinned .topbar,body.nav-pinned .wm-topbar{margin-left:10px!important}
}

@keyframes hintPulse {
  0%,100%{opacity:0}
  50%{opacity:0.55}
}
/* ── The sidebar ──
   A floating panel rather than a wall against the edge: inset on all four
   sides, rounded, and translucent over whatever is behind it. The screens
   already reserve --nav-w, and the inset lives inside that, so the panel can
   float without anything moving to accommodate it. */
#slide-nav {
  position:fixed;
  left:var(--nav-gap);top:var(--nav-gap);bottom:var(--nav-gap);
  width:calc(var(--nav-w) - var(--nav-gap) * 2);
  z-index:3100;
  background:var(--nav-glass);
  backdrop-filter:blur(22px) saturate(150%);
  -webkit-backdrop-filter:blur(22px) saturate(150%);
  border:0.5px solid rgba(255,255,255,0.10);
  border-radius:var(--r-lg);
  box-shadow:0 18px 50px rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.06);
  display:flex;flex-direction:column;overflow:hidden;
  /* Slid fully off, gap included, so no sliver is left showing. */
  transform:translateX(calc(-100% - var(--nav-gap) - 8px));
  transition:transform .4s var(--ease-out),width .3s var(--ease-out);
}
#slide-nav.nav-visible { transform:translateX(0) }
/* The sheen along the top edge, as on every other card in the app. */
#slide-nav::before{
  content:'';position:absolute;top:0;left:0;right:0;height:1px;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,0.20),transparent);
}

/* ── The narrow panel ──
   The same sidebar at a third of the width. Everything that is words gets out
   of the way and the icons centre themselves; --nav-w changes, and every
   screen's offset follows it without knowing why.

   Two things ask for it. A person can choose it (body.nav-icons, remembered),
   and a window between 761 and 1100 gets it whether or not they chose —
   there, the full 196px panel leaves the Calendar and the tracker less room
   than they need, so the panel gives way instead of the page.

   The width band is a media query rather than a class the script adds on
   resize, because --nav-w decides how much room every screen reserves and a
   class applied from a resize listener arrives a frame late. That frame was
   long enough: a check that resized to 1024 and measured immediately caught
   the full 196px still reserved and the Time Off table overflowing its panel
   by 191px. A media query has no such gap. */
/* 85 = a 65px rail plus the 10px it floats off the edge on either side. */
body.nav-icons{ --nav-w:85px }
/* Everything that is words, listed once. Split across two lists it was easy to
   add one and forget the other — the copyright line stayed in the rail and
   wrapped into a nine-line column down the side. */
body.nav-icons .nav-brand-name,
body.nav-icons .nav-brand-ver,
body.nav-icons .nav-brand-txt,
body.nav-icons .nav-group-label,
body.nav-icons .nav-sub-n,
body.nav-icons .hub-watermark{ display:none }
/* In the rail the header is just the mark and the close, stacked. The
   three-lines button is not on screen while the panel is up, so nothing has to
   be left clear for it any more. */
body.nav-icons .nav-header{
  flex-direction:column;gap:8px;
  padding:14px 0 12px;justify-content:center;align-items:center;
}
body.nav-icons .nav-items{ padding:6px }
body.nav-icons .nav-item{ justify-content:center;padding:11px 0;gap:0 }
body.nav-icons .nav-item > i{ margin:0 }
/* The label is what a nav item is made of, so it is hidden by shrinking the
   text away rather than by display:none on the button's own text nodes. */
body.nav-icons .nav-item{ font-size:0 }
body.nav-icons .nav-item i{ font-size:18px }
/* .nav-sub's own font-size:12px!important (below, for the indented CRM HUB
   entries) outranks the font-size:0 above — the same specificity, but only
   one side carries !important. Icons only means only icons everywhere,
   including here; the icon itself keeps showing through .nav-item i above,
   .nav-sub is still a .nav-item. */
body.nav-icons .nav-sub{ padding-left:0!important;font-size:0!important }
body.nav-icons .nav-badge{ position:absolute;top:4px;right:8px;margin:0 }

/* The same panel, asked for by the window rather than by the person. */
@media(min-width:761px) and (max-width:1099.98px){
  body{ --nav-w:85px }
  body .nav-brand-name,
  body .nav-brand-ver,
  body .nav-brand-txt,
  body .nav-group-label,
  body .nav-sub-n,
  body .hub-watermark{ display:none }
  body .nav-header{
    flex-direction:column;gap:8px;
    padding:14px 0 12px;justify-content:center;align-items:center;
  }
  body .nav-items{ padding:6px }
  body .nav-item{ justify-content:center;padding:11px 0;gap:0;font-size:0 }
  body .nav-item > i{ margin:0 }
  body .nav-item i{ font-size:18px }
  body .nav-sub{ padding-left:0!important;font-size:0!important }
  body .nav-badge{ position:absolute;top:4px;right:8px;margin:0 }
}
/* Nav header */
.nav-header {
  display:flex;align-items:center;gap:10px;
  padding:14px 20px 18px;
  border-bottom:0.5px solid rgba(255,255,255,0.08);
  margin-bottom:6px;
}
.nav-brand-mark {
  width:32px;height:32px;border-radius:9px;
  background:var(--brand-plate);
  display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:800;color:#fff;flex-shrink:0;
  padding:3px;
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
}
.nav-brand-txt{ flex:1;min-width:0 }
.nav-brand-name { font-size:13px;font-weight:700;color:#fff;letter-spacing:-.02em }
.nav-brand-ver  { font-size:9px;color:rgba(255,255,255,0.45);font-weight:400;margin-top:1px }
/* Nav items */
.nav-items { flex:1;overflow-y:auto;padding:4px 10px;display:flex;flex-direction:column;gap:2px }
.nav-item {
  display:flex;align-items:center;gap:11px;
  padding:10px 12px;border-radius:12px;
  color:rgba(255,255,255,0.62);font-size:13px;font-weight:500;
  cursor:pointer;border:none;background:none;font-family:inherit;
  /* font-size/padding/gap included so switching icon-only mode settles into
     place rather than snapping — the label visibly shrinks away instead of
     vanishing on the spot. */
  transition:background .15s,color .15s,font-size .18s ease,padding .18s ease,gap .18s ease,
       transform .15s var(--ease-out);
  text-align:left;width:100%;
  position:relative;
}
.nav-item i { font-size:16px;flex-shrink:0;color:rgba(255,255,255,0.45);transition:color .15s,transform .15s var(--ease-out) }
/* Icon-name pill, shown only where the item's own label is hidden (icons-only
   mode, or the narrow-window rail below) — with the label already on screen,
   a second copy of it next to the icon would be noise, not help.
   One shared element, appended to <body> and repositioned on hover/focus by
   _navShowTip()/_navHideTip() in 03-hub.js — not nested inside #slide-nav.
   #slide-nav carries its own `transform` (for the slide-in animation), and
   any transformed ancestor becomes the containing block for a `position:
   fixed` descendant, same as it would for `absolute` — nesting the tip
   inside would still get trapped by #slide-nav's own overflow:hidden (there
   for the rounded corners and the width transition) right along with
   .nav-items' overflow-y:auto, which forces overflow-x to auto too and was
   the sidebar's unwanted horizontal scrollbar. Living outside that subtree
   entirely is the only way to escape both. */
.nav-tip{
  position:fixed;top:0;left:0;
  background:#0a0c14;color:#fff;font-size:11px;font-weight:600;white-space:nowrap;
  padding:6px 10px;border-radius:8px;pointer-events:none;opacity:0;z-index:6000;
  transition:opacity .15s ease;box-shadow:0 4px 14px rgba(0,0,0,0.32);
}
.nav-tip.show{opacity:1}
@media(prefers-reduced-motion:reduce){ .nav-tip{ transition:opacity .15s } }
.nav-item:hover { background:rgba(255,255,255,0.07);color:#fff }
.nav-item:hover i { color:#fff;transform:scale(1.1) }
.nav-item:active { transform:scale(.97) }
.nav-item:active i { transform:scale(1.02) }
.nav-item.active {
  background:rgba(255,255,255,0.92);
  color:#0a0e1a;
  font-weight:600;
}
.nav-item.active i { color:#0a0e1a }
/* Active bar indicator */
.nav-item.active::before { content:none }
/* Nav divider */
.nav-divider { height:0.5px;background:rgba(255,255,255,0.08);margin:8px 10px }
/* Nav footer */
.nav-footer {
  padding:10px 10px max(env(safe-area-inset-bottom,0px),14px);
  border-top:0.5px solid rgba(255,255,255,0.08);
  display:flex;flex-direction:column;gap:2px;
}
.nav-footer,.nav-footer *{color:rgba(255,255,255,0.75)}

/* ══════════════════════════════════════════════════════════
   REFINEMENT LAYER — typography, homogeneous visuals, motion
   Single source of truth for the app's interaction language.
══════════════════════════════════════════════════════════ */

/* ── 1 · Typography: one family, one rendering, one rhythm ── */
:root{--font-sans:-apple-system,BlinkMacSystemFont,'SF Pro Text','SF Pro Display','SF Pro',system-ui,'Segoe UI','Helvetica Neue','Inter',sans-serif}
html{scroll-behavior:smooth}
body{
  font-family:var(--font-sans);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
  font-feature-settings:'cv02','cv03','cv04','cv11';
}
button,input,select,textarea{font-family:inherit}
h1,h2,h3,h4,.desk-name,.wm-topbar-title,.lobby-card-title,.desk-main-title{
  letter-spacing:-.025em;
}
::selection{background:rgba(77,143,230,0.30);color:inherit}

/* ── 2 · Homogeneous interactive surfaces ──
   Every clickable card in the app shares one motion language:
   subtle lift + deepened shadow + accent hairline on hover,
   gentle press on click. */
.lobby-card,.fit-panel,.wm-entry,.doc-group,
.dir-card,.dt-row{
  transition:transform .28s cubic-bezier(.32,.72,.22,1),
             box-shadow .28s cubic-bezier(.32,.72,.22,1),
             border-color .28s ease;
  will-change:transform;
}
.lobby-card:hover{
  transform:translateY(-3px);
  box-shadow:0 16px 44px rgba(0,0,0,0.34),0 3px 12px rgba(0,0,0,0.22);
  border-color:rgba(130,182,242,0.34);
}
.wm-entry:hover,.doc-group:hover{
  transform:translateY(-2px);
  box-shadow:0 10px 32px rgba(0,0,0,0.26);
  border-color:rgba(130,182,242,0.26);
}
/* Directory is out of that group. Its cards carry no black at rest (see
   .dir-card), and a hover that hands the black straight back would have put
   the ring on whichever card the pointer was over — the one card you are
   looking at. It lifts and its hairline brightens; the light comes from the
   accent, not from a shadow. */
.dir-card:hover{
  transform:translateY(-2px);
  box-shadow:0 8px 26px rgba(77,143,230,0.14);
  border-color:rgba(130,182,242,0.34);
}
.lobby-card:active,
.desk-card:active{transform:translateY(0) scale(.988)}

/* Icon tiles nudge with their card — feels alive, not static */
.desk-card:hover .tile,.desk-card:hover .cal-tile,.desk-card:hover .tile-lg,
.lobby-card:hover .lobby-card-icon{
  transform:translateY(-2px) scale(1.04);
}
.tile,.cal-tile,.tile-lg,.lobby-card-icon{
  transition:transform .3s cubic-bezier(.32,.72,.22,1),box-shadow .3s ease;
}

/* Launch arrow glides on hover (already on desk-launch; extend the language) */

/* ── 3 · Buttons: unified press + sheen dynamics ── */
button{transition:transform .16s var(--ease-out),background .18s ease,
       box-shadow .18s ease,border-color .18s ease,color .18s ease}
button:active{transform:scale(.965)}
.desk-launch-btn,.start-btn,.auth-btn{position:relative;overflow:hidden}
.desk-launch-btn::after,.auth-btn::after{
  content:'';position:absolute;top:0;left:-80%;width:60%;height:100%;
  background:linear-gradient(105deg,transparent 0%,rgba(255,255,255,0.22) 50%,transparent 100%);
  transform:skewX(-18deg);transition:left .55s var(--ease-out);
  pointer-events:none;
}
.desk-launch-btn:hover::after,.auth-btn:hover::after{left:120%}

/* ── 4 · Inputs: focus glow, consistent everywhere ── */
input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:none;
  border-color:rgba(130,182,242,0.55)!important;
  box-shadow:0 0 0 3px rgba(77,143,230,0.18);
}
button:focus-visible,a:focus-visible,[tabindex]:focus-visible{
  outline:2px solid rgba(130,182,242,0.65);outline-offset:2px;
}

/* ── 5 · Entrance choreography ──
   Cards rise into place with a soft stagger when a screen appears. */
@keyframes riseIn{
  from{opacity:0;transform:translateY(14px) scale(.985)}
  to{opacity:1;transform:translateY(0) scale(1)}
}
/* Trivia's own entrance/pop pair — the rules that reference these carried a
   duration and an easing curve for a while with no @keyframes body to match,
   so the screen and the result card/stars appeared with no animation at all. */
@keyframes fadeUp{
  from{opacity:0;transform:translateY(14px)}
  to{opacity:1;transform:translateY(0)}
}
@keyframes popIn{
  from{opacity:0;transform:scale(.85)}
  to{opacity:1;transform:scale(1)}
}
.desk-grid>.desk-card,.lobby-grid>.lobby-card,.fit-panel-wrap>.fit-panel{
  animation:riseIn .55s cubic-bezier(.22,.68,.26,1) backwards;
}
.desk-grid>.desk-card:nth-child(1),.lobby-grid>.lobby-card:nth-child(1),.fit-panel-wrap>.fit-panel:nth-child(1){animation-delay:.04s}
.desk-grid>.desk-card:nth-child(2),.lobby-grid>.lobby-card:nth-child(2),.fit-panel-wrap>.fit-panel:nth-child(2){animation-delay:.10s}
.desk-grid>.desk-card:nth-child(3),.lobby-grid>.lobby-card:nth-child(3),.fit-panel-wrap>.fit-panel:nth-child(3){animation-delay:.16s}
.desk-grid>.desk-card:nth-child(4){animation-delay:.22s}
.desk-grid>.desk-card:nth-child(5){animation-delay:.28s}
.desk-grid>.desk-card:nth-child(6){animation-delay:.34s}
.desk-grid>.desk-card:nth-child(7){animation-delay:.40s}
.desk-grid>.desk-card:nth-child(8){animation-delay:.46s}
.desk-greeting{animation:riseIn .5s cubic-bezier(.22,.68,.26,1) backwards}

/* ── 7 · Cursor — the system's own. No custom pointer, no per-state glyphs. ── */
[disabled],.disabled{cursor:not-allowed}

/* ── 8 · Welcome greeting (post-login) ── */
#welcome-overlay{
  position:fixed;inset:0;z-index:10050;
  display:flex;align-items:center;justify-content:center;
  background:var(--bg);background-image:var(--bg-mesh);
  background-attachment:fixed;
  background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);
  opacity:0;pointer-events:none;
  transition:opacity .5s ease;
}
#welcome-overlay.show{opacity:1;pointer-events:auto}
.welcome-inner{display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center;
  animation:welcomeRise .8s cubic-bezier(.22,.68,.26,1) backwards .15s}
@keyframes welcomeRise{from{opacity:0;transform:translateY(22px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}
.welcome-mark{width:68px;height:68px;border-radius:19px;padding:7px;
  background:var(--brand-plate);border:0.5px solid var(--border2);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  display:flex;align-items:center;justify-content:center;box-shadow:var(--inner);
  animation:welcomePulse 1.8s ease-in-out infinite}
@keyframes welcomePulse{0%,100%{box-shadow:0 0 0 0 rgba(130,182,242,0.28)}50%{box-shadow:0 0 0 14px rgba(130,182,242,0)}}

#welcome-overlay.show .welcome-mark{animation:welcomePulse 1.8s ease-in-out infinite,corePop .5s cubic-bezier(.34,1.56,.64,1) 1.95s}
@keyframes corePop{0%{transform:scale(1)}45%{transform:scale(1.22)}100%{transform:scale(1)}}
.welcome-mark::after{content:'';position:absolute;inset:-4px;border-radius:inherit;border:2px solid rgba(130,182,242,0.75);opacity:0;pointer-events:none}
#welcome-overlay.show .welcome-mark::after{animation:coreFlash .8s cubic-bezier(.22,.68,.26,1) 1.95s}
@keyframes coreFlash{0%{opacity:.9;transform:scale(1)}100%{opacity:0;transform:scale(2.3)}}
.welcome-mark{position:relative}
.welcome-greet{font-size:14px;font-weight:500;color:var(--text3);letter-spacing:.01em}
.welcome-name{font-size:42px;font-weight:200;color:var(--text);letter-spacing:-.03em;line-height:1.05}
.welcome-role{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:var(--accent2);
  border:0.5px solid var(--border2);background:var(--accent-soft);border-radius:99px;padding:5px 15px}
/* Phase 1 (0–1.5s): loading only — rings, data particles, sysline. Greeting waits. */
.welcome-greet,.welcome-name,.welcome-role{opacity:0}
#welcome-overlay.show .welcome-greet{animation:welcomeRise .6s cubic-bezier(.22,.68,.26,1) forwards 2.05s}
#welcome-overlay.show .welcome-name{animation:welcomeRise .6s cubic-bezier(.22,.68,.26,1) forwards 2.17s}
#welcome-overlay.show .welcome-role{animation:welcomeRise .6s cubic-bezier(.22,.68,.26,1) forwards 2.29s}
.welcome-sysline{font-size:10px;font-family:var(--font-mono);color:var(--text3);letter-spacing:.03em;min-height:14px;margin-top:4px;transition:opacity .2s}
.welcome-sysline.swap{opacity:0}
.welcome-ring-stage{position:relative;width:min(520px,92vw);height:min(520px,92vw);display:flex;align-items:center;justify-content:center}
#welcome-overlay.show .welcome-ring-stage{animation:stageZoom 2s cubic-bezier(.22,.68,.26,1) forwards}
@keyframes stageZoom{from{transform:scale(.92)}to{transform:scale(1)}}
/* Progress arc — a full revolution in 2s, then holds */
.wr-progress{filter:drop-shadow(0 0 6px rgba(130,182,242,0.65))}
#welcome-overlay.show .wr-progress{animation:wrDraw 2s cubic-bezier(.45,.05,.35,1) forwards}
@keyframes wrDraw{to{stroke-dashoffset:0}}
/* Radar beam sweeping the field */

.welcome-ring{position:absolute;inset:0;width:100%;height:100%}

#welcome-datafield{position:absolute;inset:0;pointer-events:none}
.wd-item{
  position:absolute;left:50%;top:50%;
  font-family:var(--font-mono);font-size:10px;letter-spacing:.02em;
  color:rgba(130,182,242,0.85);white-space:nowrap;
  opacity:0;
  animation:wdAbsorb var(--dur,2.2s) cubic-bezier(.3,.6,.35,1) forwards;
  animation-delay:var(--delay,0s);
}
.wd-item.warm{color:rgba(255,217,168,0.85)}
.wd-item.dim{color:rgba(245,245,242,0.45)}
.wd-item i{font-size:11px;margin-right:4px;vertical-align:-1px}
@keyframes wdAbsorb{
  0%{opacity:0;transform:translate(calc(-50% + var(--x)),calc(-50% + var(--y))) scale(1)}
  12%{opacity:1}
  70%{opacity:.9}
  100%{opacity:0;transform:translate(-50%,-50%) scale(.25)}
}
@media(prefers-reduced-motion:reduce){
  /* .wr-progress/.welcome-ring-stage/.welcome-mark::after animate under
     #welcome-overlay.show — an ID beats a bare class on specificity, so
     without repeating that prefix here these three never actually stopped
     animating for anyone with the OS setting on. */
  #welcome-overlay.show .wr-progress,
  #welcome-overlay.show .welcome-ring-stage,#welcome-overlay.show .welcome-mark::after{animation:none}
  
  .wd-item{animation:none;opacity:0}
}

/* ── 9 · Analyzer boot sequence (cinematic launch) ── */
#analyzer-boot{
  position:fixed;inset:0;z-index:10060;
  display:flex;align-items:center;justify-content:center;
  background:
    radial-gradient(ellipse 90% 60% at 78% 100%, rgba(255,170,90,0.16) 0%, transparent 60%),
    radial-gradient(ellipse 70% 50% at 15% 10%, rgba(77,143,230,0.20) 0%, transparent 60%),
    linear-gradient(160deg,#050810 0%,#0c1626 45%,#182338 75%,#26364f 100%);
  opacity:0;pointer-events:none;transition:opacity .4s ease;
}
#analyzer-boot.show{opacity:1;pointer-events:auto}
.boot-inner{display:flex;flex-direction:column;align-items:center;gap:22px;width:min(400px,86vw)}
.boot-mark{width:72px;height:72px;position:relative;display:flex;align-items:center;justify-content:center}
.boot-mark .nv-mark{width:56px;height:56px;animation:bootDiamond 1.6s ease-in-out infinite}
@keyframes bootDiamond{0%,100%{transform:scale(1);filter:drop-shadow(0 0 6px rgba(130,182,242,0.35))}
  50%{transform:scale(1.08);filter:drop-shadow(0 0 18px rgba(130,182,242,0.75))}}
.boot-mark::before,.boot-mark::after{
  content:'';position:absolute;inset:0;border-radius:50%;
  border:1.5px solid rgba(130,182,242,0.35);
  animation:bootRing 1.9s cubic-bezier(.22,.68,.26,1) infinite}
.boot-mark::after{animation-delay:.65s}
@keyframes bootRing{from{transform:scale(.55);opacity:.9}to{transform:scale(1.9);opacity:0}}
.boot-title{font-size:20px;font-weight:600;color:#f5f5f2;letter-spacing:-.02em}
.boot-status{font-size:12px;color:rgba(245,245,242,0.62);font-family:var(--font-mono);
  min-height:16px;letter-spacing:.02em;transition:opacity .18s}
.boot-status.swap{opacity:0}
.boot-track{width:100%;height:3px;border-radius:99px;background:rgba(255,255,255,0.10);overflow:hidden}
.boot-fill{height:100%;width:0%;border-radius:99px;
  background:linear-gradient(90deg,#4d8fe6,#82b6f2 60%,#ffd9a8);
  box-shadow:0 0 12px rgba(130,182,242,0.55);
  transition:width .5s var(--ease-out)}
.boot-pct{font-size:11px;color:rgba(245,245,242,0.45);font-family:var(--font-mono);font-variant-numeric:tabular-nums}
@media(prefers-reduced-motion:reduce){
  /* Same specificity gap as above — .welcome-mark and the greet/name/role
     trio all animate under #welcome-overlay.show, so the override has to
     carry that prefix too or it silently loses to the ID-anchored rule. */
  #welcome-overlay.show .welcome-mark,.boot-mark .nv-mark{animation:none}
  #welcome-overlay.show .welcome-greet,#welcome-overlay.show .welcome-name,
  #welcome-overlay.show .welcome-role{opacity:1;animation:none}
  .boot-mark::before,.boot-mark::after{display:none}
  .welcome-inner{animation:none}
}

/* ── 10 · HERO RECIPE ON EVERY CARD (homogeneous flash cards) ──
   Every card on landing + sales admin adopts the NovaIS hero look:
   navy gradient, warm/cool glows, mountain silhouettes, light-on-dark text.
   Scoped variable overrides let all inner content adapt automatically. */
.desk-card{
  --text:#f5f5f2;--text2:rgba(255,255,255,0.80);--text3:rgba(255,255,255,0.55);
  --accent:#82b6f2;--accent2:#a9cbf7;--accent-soft:rgba(130,182,242,0.15);
  --glass2:rgba(255,255,255,0.10);--glass3:rgba(255,255,255,0.08);
  --border:rgba(255,255,255,0.14);--border2:rgba(255,255,255,0.20);
  --inner:inset 0 1px 0 rgba(255,255,255,0.10);
  --card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%0A%3Cpath%20d%3D%22M0%2C160%20L0%2C95%20L55%2C55%20L100%2C90%20L150%2C40%20L210%2C100%20L250%2C65%20L310%2C110%20L360%2C70%20L400%2C95%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.55%29%22/%3E%0A%3Cpath%20d%3D%22M0%2C160%20L0%2C120%20L70%2C80%20L130%2C115%20L190%2C75%20L260%2C125%20L320%2C90%20L400%2C120%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%0A%3C/svg%3E");
  background:
    var(--card-scape) bottom center/100% 44% no-repeat,
    radial-gradient(ellipse 90% 60% at 78% 100%, rgba(255,170,90,0.30) 0%, transparent 60%),
    radial-gradient(ellipse 70% 50% at 15% 10%, rgba(77,143,230,0.28) 0%, transparent 60%),
    linear-gradient(160deg,#050810 0%,#0c1626 45%,#182338 75%,#26364f 100%);
  border-color:rgba(255,255,255,0.14);
}
/* Hairline gradient edge on every card (replaces old blue top-wash ::before) */
.desk-card::before{
  content:'';position:absolute;inset:0;border-radius:inherit;padding:1px;
  background:linear-gradient(160deg,rgba(255,255,255,0.22) 0%,rgba(255,255,255,0.03) 35%,transparent 60%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  pointer-events:none;height:auto;
}
/* Mini-card arrow chip → white pill with dark arrow, like the hero launch button */
.desk-mini::after{
  background:rgba(255,255,255,0.92);color:#0a0c14;border-color:transparent;
  transition:background .2s,color .2s,transform .28s cubic-bezier(.32,.72,.22,1);
}
.desk-mini:hover::after{background:#fff;color:#0a0c14;transform:translateX(4px)}
/* Landing lobby icons → linear tiles, congruent with the hero mark */
.lobby-card-icon{
  background:linear-gradient(150deg,var(--accent-soft) 0%,var(--glass2) 100%)!important;
  border:0.5px solid var(--border2);box-shadow:var(--inner);
}
.lobby-card-icon i{color:var(--accent)!important}
.lobby-card-title{color:var(--text)}
.lobby-card-sub{color:var(--text3)}

/* ── 11 · ANALYZER GLASS — the "Run market fit analysis" recipe, everywhere ── */
/* The tint stays: two materials on purpose, one for the analyzer's working
   surfaces and one for everything else, and the colour is what carries that.
   The blur does not — it was 12px against 40px everywhere else, so the two
   read as different qualities of glass rather than as the same glass in two
   colours, and that difference says nothing. */
.avp-card,.avp-summary,.chart-wrap,.fit-panel{
  background:var(--accent-soft);
  border:1px solid var(--border2);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  box-shadow:var(--inner);
}
[data-theme="dark"] .avp-card,[data-theme="dark"] .avp-summary,
[data-theme="dark"] .chart-wrap,[data-theme="dark"] .fit-panel{
  background:var(--accent-soft);
  border:1px solid var(--border2);
  box-shadow:var(--inner);
}
.avp-card::before,[data-theme="dark"] .avp-card::before{content:none}

/* ── 12 · LANDSCAPE VARIETY — each card gets its own linear scenery.
   The Analyzer hero keeps its mountains; the rest share the same linear
   language (navy silhouettes + thin ice-blue accent strokes). ── */
#desk-meeting{--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C92%20Q100%2C52%20200%2C88%20Q300%2C120%20400%2C80%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C122%20Q120%2C86%20240%2C118%20Q330%2C140%20400%2C112%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M0%2C122%20Q120%2C86%20240%2C118%20Q330%2C140%20400%2C112%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3C/svg%3E")}
#desk-docs{--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C94%20L400%2C82%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C116%20L400%2C106%20L400%2C160%20Z%22%20fill%3D%22rgba%286%2C11%2C21%2C0.62%29%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C138%20L400%2C132%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M0%2C138%20L400%2C132%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3C/svg%3E")}
#desk-dir{--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C92%20L400%2C84%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C102%20Q100%2C97%20200%2C102%20Q300%2C107%20400%2C99%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3Cpath%20d%3D%22M0%2C114%20Q120%2C109%20240%2C114%20Q330%2C118%20400%2C111%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.18%29%22%20stroke-width%3D%221.2%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C126%20Q200%2C108%20400%2C132%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3C/svg%3E")}
#desk-david-tracker{--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C88%20L70%2C44%20L130%2C80%20L190%2C30%20L260%2C86%20L320%2C52%20L400%2C92%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C88%20L70%2C44%20L130%2C80%20L190%2C30%20L260%2C86%20L320%2C52%20L400%2C92%22%20fill%3D%22none%22%20stroke%3D%22rgba%28215%2C232%2C255%2C0.50%29%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C118%20L90%2C80%20L170%2C116%20L250%2C72%20L330%2C120%20L400%2C96%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M0%2C118%20L90%2C80%20L170%2C116%20L250%2C72%20L330%2C120%20L400%2C96%22%20fill%3D%22none%22%20stroke%3D%22rgba%28215%2C232%2C255%2C0.65%29%22%20stroke-width%3D%222%22%20stroke-linejoin%3D%22round%22/%3E%3C/svg%3E")}
#desk-cal{--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C98%20Q140%2C58%20250%2C108%20Q330%2C138%20400%2C110%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C134%20Q110%2C152%20210%2C118%20Q310%2C90%20400%2C136%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M0%2C134%20Q110%2C152%20210%2C118%20Q310%2C90%20400%2C136%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3C/svg%3E")}
#desk-carriers{--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C98%20L400%2C90%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C110%20Q80%2C106%20160%2C110%20Q220%2C113%20260%2C109%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3Cpath%20d%3D%22M400%2C160%20L400%2C52%20L338%2C68%20L300%2C112%20L258%2C138%20L0%2C148%20L0%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M400%2C52%20L338%2C68%20L300%2C112%20L258%2C138%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3C/svg%3E")}
#desk-templates{--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C64%20L172%2C136%20L228%2C136%20L400%2C58%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C64%20L172%2C136%20M228%2C136%20L400%2C58%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C142%20L400%2C142%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M40%2C148%20L160%2C148%20M240%2C152%20L360%2C152%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.25%29%22%20stroke-width%3D%221.2%22/%3E%3C/svg%3E")}
.lobby-grid>.lobby-card:nth-child(1){--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C92%20Q100%2C52%20200%2C88%20Q300%2C120%20400%2C80%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C122%20Q120%2C86%20240%2C118%20Q330%2C140%20400%2C112%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M0%2C122%20Q120%2C86%20240%2C118%20Q330%2C140%20400%2C112%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3C/svg%3E")}
.lobby-grid>.lobby-card:nth-child(2){--card-scape:url("data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20400%20160%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20preserveAspectRatio%3D%22none%22%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C98%20Q140%2C58%20250%2C108%20Q330%2C138%20400%2C110%20L400%2C160%20Z%22%20fill%3D%22rgba%288%2C14%2C26%2C0.50%29%22/%3E%3Cpath%20d%3D%22M0%2C160%20L0%2C134%20Q110%2C152%20210%2C118%20Q310%2C90%20400%2C136%20L400%2C160%20Z%22%20fill%3D%22rgba%284%2C8%2C16%2C0.75%29%22/%3E%3Cpath%20d%3D%22M0%2C134%20Q110%2C152%20210%2C118%20Q310%2C90%20400%2C136%22%20fill%3D%22none%22%20stroke%3D%22rgba%28130%2C182%2C242%2C0.32%29%22%20stroke-width%3D%221.5%22/%3E%3C/svg%3E")}

/* ── 13 · LIGHT-THEME CONTRAST in the Analyzer ── */
:root:not([data-theme="dark"]) #app{
  --text2:#23262e;
  --text3:#454b58;
}
:root:not([data-theme="dark"]) #app input::placeholder,
:root:not([data-theme="dark"]) #app textarea::placeholder{color:#6b7280}

/* ── 14 · WEATHER WIDGET = CLOCK DESIGN (same dark card, both themes) ── */
#weather-widget,[data-theme="dark"] #weather-widget{
  --text:#ffffff;--text2:rgba(255,255,255,0.85);--text3:rgba(255,255,255,0.55);
  --accent:#82b6f2;--accent-soft:rgba(255,255,255,0.10);
  --border:rgba(255,255,255,0.12);--danger:#ff8f8a;
  background:linear-gradient(160deg,#0a0e1a 0%,#0d1220 100%);
  border:0.5px solid rgba(255,255,255,0.10);
  border-radius:18px;
  box-shadow:0 12px 40px rgba(0,0,0,0.40);
  backdrop-filter:none;-webkit-backdrop-filter:none;
}
.ww-refresh:hover{background:rgba(255,255,255,0.18)}

/* ── 15 · NUMERIC TYPE — every number speaks in the clock's voice ── */
input[type="number"],input[inputmode="numeric"],input[inputmode="decimal"],
.lr-prem-input,.desk-date-pill,[id^="tz-time-"],
.ww-temp,.ww-stat-val,.cal-tile-day,.lobby-card-badge,
.cal-day-num,.boot-pct{
  font-family:var(--font-mono);
  font-variant-numeric:tabular-nums;
}

/* ── 16 · Motion accessibility ── */
@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .desk-grid>.desk-card,.lobby-grid>.lobby-card,.fit-panel-wrap>.fit-panel,.desk-greeting{animation:none}
  .lobby-card:hover,.wm-entry:hover,.doc-group:hover,.dir-card:hover{transform:none}
  .desk-card:hover .tile,.desk-card:hover .cal-tile,.desk-card:hover .tile-lg{transform:none}
  .desk-launch-btn::after,.auth-btn::after{display:none}
}

/* ── Risk taxonomy bar (v5.0.0.57) ── */
#risk-taxonomy-bar{display:none;flex-wrap:wrap;gap:6px;padding:10px 14px 2px;margin-bottom:4px}
.rtax-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:99px;font-size:11px;font-weight:600;background:rgba(255,255,255,0.06);border:1px solid var(--border2);color:var(--text2);letter-spacing:.01em}
.rtax-chip.rtax-danger{background:rgba(255,59,48,0.10);border-color:rgba(255,59,48,0.30);color:var(--danger)}
.rtax-chip.rtax-warn{background:rgba(255,149,0,0.10);border-color:rgba(255,149,0,0.30);color:var(--warn)}
.rtax-chip.rtax-info{background:rgba(var(--brand-blue-rgb),0.08);border-color:rgba(var(--brand-blue-rgb),0.25);color:var(--accent)}
/* The reading row: same chip, plus the words it was read out of. */
#risk-reading{display:none;flex-wrap:wrap;align-items:center;gap:6px;padding:2px 14px 8px;margin-bottom:4px}
.rtax-lead{font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  color:var(--text3);margin-right:2px;width:100%}
.rtax-lead:not(:first-child){margin-top:6px}
.rtax-chip .rtax-why{color:var(--text3);font-weight:500;max-width:220px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.rtax-chip.rtax-code{font-variant-numeric:tabular-nums;
  background:rgba(52,199,89,0.10);border-color:rgba(52,199,89,0.28);color:var(--success)}
/* ── Market confidence badge ── */
.fl-conf{margin-left:auto;font-size:10px;font-weight:700;padding:2px 7px;border-radius:99px;letter-spacing:.02em;flex-shrink:0}
.fl-conf.conf-hi{background:rgba(52,199,89,0.15);color:var(--success)}
.fl-conf.conf-mid{background:rgba(255,149,0,0.15);color:var(--warn)}
.fl-conf.conf-lo{background:rgba(255,59,48,0.12);color:var(--danger)}
/* ── Fast-fill active question highlight (v5.0.0.57) ── */
.ff-active-q{
  position:relative;
  background:rgba(var(--brand-blue-rgb),0.055)!important;
  border-radius:12px;
  outline:1.5px solid rgba(var(--brand-blue-rgb),0.35);
  outline-offset:4px;
  transition:outline-color .25s,background .25s;
  animation:ffQuestionPulse 1.6s ease-in-out infinite;
}
@keyframes ffQuestionPulse{
  0%,100%{outline-color:rgba(var(--brand-blue-rgb),0.35)}
  50%{outline-color:rgba(var(--brand-blue-rgb),0.65)}
}
.ff-active-q>label{color:var(--accent)!important}
.ff-kbd-hint{
  display:inline-flex;align-items:center;gap:5px;
  margin-left:10px;font-size:10px;font-weight:600;color:var(--text3);
  animation:ffHintIn .3s ease-out;white-space:nowrap;
}
.ff-kbd-hint kbd{
  font-family:var(--font-mono,monospace);font-size:10px;font-weight:700;
  padding:2px 6px;border-radius:5px;
  border:1px solid var(--border2);background:var(--glass3);
  color:var(--text2);box-shadow:0 1px 0 var(--border);
}
.ff-kbd-hint kbd.ff-y{color:var(--success);border-color:rgba(52,199,89,0.4)}
.ff-kbd-hint kbd.ff-n{color:var(--danger);border-color:rgba(255,59,48,0.4)}
@keyframes ffHintIn{from{opacity:0;transform:translateX(-4px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.ff-active-q{animation:none}.ff-kbd-hint{animation:none}}

/* ---- bloque 4 (era linea 3515 de index.html) ---- */

#timeoff-screen{display:none;min-height:100vh;background:var(--bg);background-image:var(--bg-mesh);background-attachment:fixed;background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);padding:0 0 80px}
/* The column was 760px, which is a good width for the request form and far too
   narrow for the ten-column table under it: the table needed ~1210px, so it
   sat permanently inside a horizontal scrollbar and half the row — status and
   the review buttons — was off-screen until you dragged it. Reviewers approve
   from that row, so the part that was hidden was the part being used.
   The column is as wide as the table needs now, and .to-form keeps the form at
   the width it was. */
.to-body{max-width:var(--col-wide);margin:0 auto;padding:14px 20px 60px}
/* DocuHub, opened from inside a CRM HUB account (gtOpenDocuHubKind() in
   08-general-tracker.js): the exact same PayGo/Invoice screens every other
   DocuHub entry point opens, shown as a floating card over the account
   instead of a full-screen replacement of it — the account stays visible,
   dimmed, behind the backdrop, and closing the card (its own Back button —
   see closeIndicationsPayGo()/closeInvoice()'s contained-mode branch) needs
   to touch nothing else because nothing else was ever hidden. */
body.gt-docuhub-contained{overflow:hidden}
body.gt-docuhub-contained::after{
  content:'';position:fixed;inset:0;z-index:2000;background:rgba(3,8,18,0.62);
}
body.gt-docuhub-contained #invoice-screen,
body.gt-docuhub-contained #indications-paygo-screen{
  position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);
  z-index:2001;width:min(640px,92vw);max-height:88vh;overflow-y:auto;
  border-radius:var(--r-lg);box-shadow:var(--shadow-lg);
  background:var(--glass-card);backdrop-filter:saturate(180%) blur(40px);-webkit-backdrop-filter:saturate(180%) blur(40px);
  border:0.5px solid var(--border2);
  /* Both screens also carry padding-left:var(--nav-w) (see the body.nav-open
     rule above, ~40 lines up) that reserves room for the pinned sidebar in
     their normal full-screen life — needed there, wrong here: it ate into
     this card's own fixed 640px width (border-box) and shoved every field
     over, reading as the whole form crammed against the card's right edge.
     A floating dialog has no sidebar to leave room for. */
  padding-left:0!important;
}
/* Centred on the viewport is centred behind the sidebar's own reserved gutter
   when the sidebar is pinned open — the same shift every full screen already
   gets via padding-left above, just expressed as a repositioning instead of
   an inset, since this box isn't full width. Left half of --nav-w put back
   above what left:50% already gives it recentres the dialog in the space
   actually left of the sidebar rather than in the page as a whole, which
   read as the dialog sitting hard against the sidebar (visually "way over on
   the left") rather than centred in the room it had. Same 761px floor as
   that rule: below it the sidebar is a temporary overlay, not a reserved
   gutter, so nothing here should shift for it either. */
@media(min-width:761px){
  body.nav-open.gt-docuhub-contained #invoice-screen,
  body.nav-open.gt-docuhub-contained #indications-paygo-screen{
    left:calc(50% + var(--nav-w) / 2);
  }
}
body.gt-docuhub-contained #invoice-screen .wm-topbar,
body.gt-docuhub-contained #indications-paygo-screen .wm-topbar{margin:14px 14px 20px;top:0}
body.gt-docuhub-contained #invoice-screen .to-body,
body.gt-docuhub-contained #indications-paygo-screen .to-body{padding:0 20px 20px;max-width:none}
body.gt-docuhub-contained #invoice-screen .to-card.to-form,
body.gt-docuhub-contained #indications-paygo-screen .to-card.to-form{max-width:none}
/* #global-actions (Features/Widgets/avatar) and #tbar-clock ride along onto
   whichever screen's own .wm-topbar is visible — two separate moves,
   both driven by placeGlobalActions() in 03-hub.js — right for a full
   screen, but this card is 640px wide at most and the cluster crowded the
   Back button and the title into a truncated sliver. The card only ever
   needs Back and a title. */
/* !important: both carry their own inline display style (flex/absolute
   centering), which otherwise outranks any stylesheet rule regardless of
   selector specificity. */
body.gt-docuhub-contained #invoice-screen #global-actions,
body.gt-docuhub-contained #indications-paygo-screen #global-actions,
body.gt-docuhub-contained #invoice-screen #tbar-clock,
body.gt-docuhub-contained #indications-paygo-screen #tbar-clock{display:none!important}
/* The close "X": hidden everywhere the screen is full-screen (Home/the
   sidebar already close it there) and shown only in the CRM HUB card, where
   #global-actions — the only other thing that ever sat at the far right of
   this bar — is itself hidden per the rule above, so margin-left:auto still
   lands it in the one open spot. */
.gt-docuhub-close{display:none}
body.gt-docuhub-contained .gt-docuhub-close{
  display:flex;align-items:center;justify-content:center;
  margin-left:auto;width:28px;height:28px;flex-shrink:0;border-radius:50%;
  background:var(--glass3);border:0.5px solid var(--border);color:var(--text2);
  cursor:pointer;font-family:inherit;font-size:13px;padding:0;
  transition:background .15s,color .15s;
}
body.gt-docuhub-contained .gt-docuhub-close:hover{background:var(--danger-soft);color:var(--danger)}
.to-form{max-width:var(--col-narrow);margin-left:auto;margin-right:auto}
.to-card{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:20px 22px;margin-bottom:16px}
.to-field{margin-bottom:18px}
.to-label{display:block;font-size:11px;font-weight:700;color:var(--text2);margin-bottom:7px}
/* min-height, not padding alone: with the same padding and font-size a text
   input renders 37px while a <select> and an <input type="date"> render 39px,
   because the browser gives those two a taller intrinsic content box. Same
   rule, three different boxes — most visible on Invoice, where City / State /
   ZIP sit side by side in one grid row and the middle one stood 2px proud of
   its neighbours. Pinned to the tallest of the three so nothing shrinks or
   clips; .avp-drow's own controls already solve this the same way. */
.to-input,.to-select{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:var(--r-sm);border:0.5px solid var(--border2);
  background:var(--input-bg);color:var(--text);font-size:13px;font-family:inherit;min-height:39px}
.to-input:focus,.to-select:focus{outline:none;border-color:var(--accent)}
.to-input[readonly]{background:var(--glass3);color:var(--text2);cursor:default}
/* The free-text detail field is a textarea wearing .to-input; it inherits the
   box but not the two things a textarea brings of its own. */
textarea.to-input{resize:vertical;min-height:56px;line-height:1.45}
.to-hint{font-size:10px;color:var(--text3);margin-top:5px}
.to-sub-field{margin-top:10px;padding:10px 12px;border-radius:var(--r-sm);background:var(--glass3);border:0.5px solid var(--border2)}
.to-err{font-size:11px;color:var(--danger);display:none;margin-top:6px}
/* Held Time Off requests, on the screen they were written on — a queue
   nobody can see is a queue nobody trusts. */
.to-outbox{margin-top:12px;font-size:12px;color:var(--text2);
  background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-sm);
  padding:10px 12px;
  backdrop-filter:saturate(180%) blur(18px);-webkit-backdrop-filter:saturate(180%) blur(18px)}
.to-outbox-head{display:flex;align-items:center;gap:7px;font-weight:600;color:var(--text);
  margin-bottom:6px}
.to-outbox-head .to-export-btn{margin-left:auto}
.to-outbox-row{display:flex;align-items:center;gap:6px;color:var(--text3);font-size:11px;padding:2px 0}
/* The one line that says the connection is gone. Fixed, above every screen,
   and only on screen while it is true. */
#offline-banner{position:fixed;left:50%;top:0;transform:translate(-50%,-120%);
  z-index:9600;display:flex;align-items:center;gap:8px;max-width:min(680px,94vw);
  padding:8px 16px;border-radius:0 0 var(--r-sm) var(--r-sm);
  background:var(--warn-soft,rgba(255,159,10,0.16));border:0.5px solid rgba(255,159,10,0.34);
  border-top:none;color:var(--warn);font-size:11px;font-weight:600;line-height:1.4;
  backdrop-filter:saturate(180%) blur(24px);-webkit-backdrop-filter:saturate(180%) blur(24px);
  box-shadow:0 6px 24px rgba(0,0,0,0.18);
  transition:transform var(--dur) var(--ease-out)}
#offline-banner.show{transform:translate(-50%,0)}
.to-submit-btn{width:100%;padding:12px;border-radius:12px;border:none;background:var(--accent);color:#fff;
  font-size:13px;font-weight:700;cursor:pointer;font-family:inherit;transition:opacity .15s}
.to-submit-btn:hover{opacity:.9}
.to-success{display:none;font-size:12px;color:var(--success);background:var(--success-soft);border:0.5px solid var(--success-border);
  border-radius:var(--r-sm);padding:9px 12px;margin-top:12px}
/* flex, matching what the DocuHub forms set inline when they show theirs:
   every one of these banners is an icon followed by a line of text, and the
   two conventions rendered that pair differently — the icon sat on the text
   baseline here and centred there. */
.to-success.show{display:flex;align-items:center}
.to-list-head{display:flex;align-items:center;justify-content:space-between;margin:22px 0 10px}
.to-list-title{font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.06em;text-transform:uppercase}
.to-export-btn{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;padding:6px 13px;border-radius:var(--r-lg);
  cursor:pointer;font-family:inherit;background:var(--glass3);color:var(--text2);border:0.5px solid var(--border2);transition:all .15s}
.to-export-btn:hover{border-color:var(--accent);color:var(--accent)}
.to-table{width:100%;border-collapse:collapse;font-size:11px}
.to-table th{text-align:left;padding:7px 9px;color:var(--text3);font-weight:700;border-bottom:0.5px solid var(--border2);font-size:10px;text-transform:uppercase;letter-spacing:.04em}
.to-table td{padding:8px 9px;border-bottom:0.5px solid var(--border3);color:var(--text2)}
.to-table tr:last-child td{border-bottom:none}
.to-empty{font-size:11px;color:var(--text3);font-style:italic;padding:10px 0}
.to-del-btn{background:none;border:none;color:var(--danger);cursor:pointer;font-size:13px;padding:2px}
/* Where the delete button is on every other row. A gap would read as a row
   that failed to render; a padlock says the row is settled and the control is
   gone on purpose. */
.to-del-locked{display:inline-flex;align-items:center;color:var(--text3);font-size:12px;padding:2px;cursor:help}
.to-filter-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;margin-bottom:12px}
.to-filter{display:flex;flex-direction:column;gap:4px}
.to-filter label{font-size:9px;font-weight:700;color:var(--text3);letter-spacing:.05em;text-transform:uppercase}
.to-filter input,.to-filter select{font-family:inherit;font-size:11px;padding:6px 9px;border-radius:8px;
  border:0.5px solid var(--border2);background:var(--input-bg);color:var(--text);min-width:120px}
.to-filter input:focus,.to-filter select:focus{outline:none;border-color:var(--accent)}
.to-sum-grid{display:flex;flex-wrap:wrap;gap:8px}
.to-sum-card{flex:1 1 130px;background:var(--glass3);border:0.5px solid var(--border2);border-radius:var(--r-sm);padding:9px 12px}
.to-sum-k{font-size:9px;font-weight:700;color:var(--text3);letter-spacing:.04em;text-transform:uppercase}
.to-sum-v{font-size:14px;font-weight:700;color:var(--text);margin-top:2px}
.to-sum-sub{font-size:10px;color:var(--text3);margin-top:1px}
/* Status reads at a glance in a long list, which is the only way a reviewer
   spots the pending ones among a hundred decided rows. */
.to-badge{display:inline-block;font-size:9px;font-weight:700;padding:2px 8px;border-radius:99px;letter-spacing:.03em;text-transform:uppercase}
.to-badge.pending{background:var(--warn-soft,rgba(245,180,60,.16));color:#e0a63a}
.to-badge.approved{background:var(--success-soft);color:var(--success)}
.to-badge.declined{background:var(--danger-soft,rgba(242,65,91,.14));color:var(--danger)}
/* 'info' is a question, not a verdict — it reads like the waiting states, not
   like approved or declined, because the request is still open. */
.to-badge.info{background:rgba(79,195,247,0.14);color:var(--accent)}
/* Dark theme: the light-theme pair above (a near-opaque tint plus the raw
   Apple system color as text) turns into neon-on-black once the tint is the
   12% dark-mode alpha — the pill itself all but disappears and the status
   reads as glaring bare text instead of a badge. A denser fill plus a
   slightly lifted (less saturated) text tone keeps every status legible as a
   pill without the glare. */
[data-theme="dark"] .to-badge.pending{background:rgba(255,159,10,0.22);color:#ffc670}
[data-theme="dark"] .to-badge.approved{background:rgba(50,215,75,0.20);color:#6be08a}
[data-theme="dark"] .to-badge.declined{background:rgba(255,69,58,0.20);color:#ff8f87}
[data-theme="dark"] .to-badge.info{background:rgba(79,195,247,0.20);color:#8ad6ff}
.to-act-btn{background:none;border:0.5px solid var(--border2);border-radius:99px;cursor:pointer;font-family:inherit;
  font-size:10px;font-weight:700;padding:3px 9px;margin-right:4px;color:var(--text2);transition:all .15s}
.to-act-btn.ok:hover{border-color:var(--success);color:var(--success)}
.to-act-btn.no:hover{border-color:var(--danger);color:var(--danger)}
/* Asking for more information is not a verdict, so it takes the accent rather
   than the green or the red. */
.to-act-btn.info:hover{border-color:var(--accent);color:var(--accent)}
/* The last button in the row has nothing to its right. */
.to-act-btn:last-of-type{margin-right:0}

/* Ten columns and four actions do not fit a 760px panel: the actions cell ran
   past the container, and with overflow visible that put Ask and the delete
   button outside it — rendered, unreachable, and clipped by an ancestor with
   no scrollbar to say so. Making the table scroll sideways fixed the clipping
   and replaced it with a scrollbar that was always there, on every screen: the
   table asked for ~1210px inside a 686px column, so status and the review
   buttons sat off-screen until you dragged, and reviewers approve from exactly
   that part of the row.
   The column is wide enough for the table now (.to-body above), so the table
   fills it instead of setting its own width. min-width:max-content is gone —
   that is what forbade wrapping and pinned the width to the longest name and
   the longest detail on the screen. overflow-x stays as a floor for a window
   too narrow for any layout; it is no longer the normal case. */
#to-list-wrap{ overflow-x:auto; }
#to-list-wrap > table{ width:100%; }
/* Dates, IDs, durations, the status pill and the review buttons read as one
   token each and look broken wrapped; the three free-text columns are the ones
   with slack, so they are the ones that give.
   Headers wrap even where their column does not: "Time off/out" is wider than
   any duration under it, so it — not the data — was setting that column's
   width, and 30px of header was the difference between fitting a 1024px window
   and not. */
.to-table td{ white-space:nowrap; }
.to-table th{ white-space:normal; }
.to-table td:nth-child(4),
.to-table td:nth-child(7),
.to-table td:nth-child(8){ white-space:normal; }
/* The row a notification was about. Arriving from "Time Off waiting for
   review" onto a list of forty rows and being left to find it by eye is the
   thing this removes, so the mark has to be plainly visible: a tinted row and
   a bar down the left edge, held until the next click or keypress rather than
   faded on a timer that expires while you are still scrolling. */
.to-table tr.to-row-focus > td{ background:var(--accent-soft); }
.to-table tr.to-row-focus > td:first-child{ box-shadow:inset 3px 0 0 var(--accent); }
/* The reason a request was turned down, on the row rather than in a tooltip:
   the person it happened to is the one who needs it, and they are not going
   to hover over a badge to look. */
.to-declined-why{font-size:10px;color:var(--danger);opacity:.9;margin-top:2px;max-width:220px;line-height:1.35}

/* ---- bloque 5 (era linea 3733 de index.html) ---- */

/* Scoped to this screen — prefixed "pbi-" so nothing collides with the rest of
   the app. Mirrors the Time Off screen's chrome so the module does not look
   bolted on. */
#powerbi-screen{display:none;min-height:100vh;background:var(--bg);background-image:var(--bg-mesh);background-attachment:fixed;
  background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);padding:0 0 40px}
.pbi-body{max-width:var(--col-wide);margin:0 auto;padding:14px 20px 20px}
.pbi-card{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);overflow:hidden}
.pbi-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 18px;border-bottom:0.5px solid var(--border2)}
.pbi-title{font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.06em;text-transform:uppercase}
.pbi-status{flex:1;font-size:11px;color:var(--text3);text-align:right;padding-right:12px}
.pbi-open-btn{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;padding:6px 13px;border-radius:var(--r-lg);
  cursor:pointer;font-family:inherit;background:var(--glass3);color:var(--text2);border:0.5px solid var(--border2);transition:all .15s;text-decoration:none}
.pbi-open-btn:hover{border-color:var(--accent);color:var(--accent)}

@media(min-width:761px){body.nav-pinned #powerbi-screen .pbi-body{margin-left:var(--nav-w)}}

/* ---- bloque 6 (era linea 3799 de index.html) ---- */

/* Scoped to the Emails screen — prefixed "eml-" so nothing collides with the rest of the app */
#emails-screen{display:none;min-height:100vh;background:var(--bg);background-image:var(--bg-mesh);background-attachment:fixed;background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);padding:0 0 80px}
.eml-body{max-width:var(--col-narrow);margin:0 auto;padding:14px 20px 60px}
.eml-card{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:20px 22px;margin-bottom:16px}
.eml-field{margin-bottom:18px}
.eml-field:last-child{margin-bottom:0}
.eml-label{display:block;font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.06em;text-transform:uppercase;margin-bottom:8px}
.eml-input,.eml-select,.eml-textarea{
  width:100%;box-sizing:border-box;padding:10px 13px;border-radius:var(--r-sm);
  border:0.5px solid var(--border2);background:var(--input-bg);color:var(--text);
  font-size:13px;font-family:inherit;outline:none;transition:border-color .15s,box-shadow .15s;
}
.eml-input:focus,.eml-select:focus,.eml-textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.eml-textarea{resize:vertical;min-height:76px;line-height:1.5}
.eml-chip-grid{display:flex;flex-wrap:wrap;gap:6px}
/* Names only — the address is on hover and in the CC line of the preview. */
.eml-chip{padding:6px 13px;border-radius:99px;border:0.5px solid var(--border2);background:var(--glass2);color:var(--text2);font-size:12px;font-weight:600;cursor:pointer;user-select:none;transition:all .15s;font-family:inherit}
.eml-chip:hover{border-color:var(--accent)}
.eml-chip.sel{background:var(--accent);color:#fff;border-color:var(--accent)}
.eml-chip-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.eml-mini-link{font-size:11px;font-weight:700;color:var(--accent);cursor:pointer;background:none;border:none;font-family:inherit;padding:0}
.eml-target-row{display:flex;gap:8px;flex-wrap:wrap}
.eml-target-btn{flex:1;min-width:90px;padding:9px 10px;border-radius:var(--r-sm);border:0.5px solid var(--border2);background:var(--glass2);color:var(--text2);font-size:12px;font-weight:700;cursor:pointer;text-align:center;transition:all .15s;font-family:inherit}
.eml-target-btn.sel{background:var(--accent);color:#fff;border-color:var(--accent)}

/* Audits tab — one row per account: name, Audit/Final Audit, policy number,
   remove. Wraps on narrow widths rather than the fields shrinking to
   unreadable widths side by side. */
.aud-row{display:flex;gap:8px;align-items:center;margin-bottom:8px;flex-wrap:wrap}
.aud-row .eml-input,.aud-row .eml-select{width:auto}
.aud-row .aud-acct{flex:2 1 180px}
.aud-row .aud-type{flex:1 1 130px}
.aud-row .aud-policy{flex:1 1 140px}
.aud-row-del{flex:0 0 auto;background:none;border:0.5px solid var(--border2);border-radius:var(--r-sm);color:var(--text3);cursor:pointer;padding:10px 11px;font-family:inherit;transition:all .15s}
.aud-row-del:hover{border-color:var(--danger);color:var(--danger)}
.eml-states-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(48px,1fr));gap:5px;max-height:170px;overflow-y:auto;padding:8px;border:0.5px solid var(--border);border-radius:var(--r-sm);background:var(--glass3)}
.eml-state-chip{padding:6px 2px;text-align:center;border-radius:7px;background:var(--glass2);color:var(--text2);font-size:11px;font-weight:700;cursor:pointer;user-select:none;transition:all .12s;border:none;font-family:inherit}
.eml-state-chip.sel{background:var(--accent);color:#fff}
.eml-gen-btn{width:100%;padding:12px;margin-top:4px;background:var(--accent);border:none;border-radius:var(--r-sm);color:#fff;font-size:14px;font-weight:700;font-family:inherit;cursor:pointer;transition:all .2s}
.eml-gen-btn:hover{filter:brightness(1.08)}
.eml-preview-block{background:var(--glass2);border:0.5px solid var(--border);border-radius:var(--r-sm);padding:14px 16px;margin-bottom:12px}
.eml-preview-market{font-size:11px;font-weight:700;color:var(--accent);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px}
.eml-preview-body{white-space:pre-wrap;font-size:12px;line-height:1.65;color:var(--text);font-family:inherit;margin-bottom:10px}
.eml-preview-actions{display:flex;gap:8px}
.eml-preview-btn{display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:var(--text2);background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-lg);padding:6px 12px;cursor:pointer;font-family:inherit;transition:all .15s}
.eml-preview-btn:hover{border-color:var(--accent);color:var(--accent)}
.eml-preview-btn.copied{background:var(--pal-green);color:#fff;border-color:var(--pal-green)}
.eml-empty-hint{font-size:12px;color:var(--text3);text-align:center;padding:20px 0}
/* transform is named so the press every <button> takes (button:active,
   further up) eases in rather than snapping. The knob's slide lives on
   .eml-switch-knob, a child with its own transition, so it is untouched —
   the same shape as .theme-toggle. */
.eml-switch{position:relative;width:38px;height:20px;border-radius:99px;background:var(--glass2);border:0.5px solid var(--border2);cursor:pointer;transition:background .2s,border-color .2s,transform var(--dur-fast) var(--ease-out);flex-shrink:0;padding:0}
.eml-switch.on{background:var(--success);border-color:var(--success)}
.eml-switch-knob{position:absolute;top:1px;left:1px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.3);transition:transform .2s}
.eml-switch.on .eml-switch-knob{transform:translateX(18px)}
.eml-switch-txt{font-size:11px;font-weight:700;color:var(--text3);transition:color .15s}
/* The live side of the pair, coloured by which side it is: this used to be
   the accent on both, so "No" lit up in the same blue as "Yes". */
.eml-switch-txt.active{color:var(--success)}
#eml-notes-txt-no.active{color:var(--danger)}
.eml-preview-to{font-size:11px;color:var(--text3);margin-bottom:6px}
.eml-preview-pick{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.eml-preview-pick label{font-size:10px;font-weight:700;color:var(--text3);letter-spacing:.05em;text-transform:uppercase}
.eml-preview-select{font-family:inherit;font-size:11px;padding:5px 9px;border-radius:8px;
  border:0.5px solid var(--border2);background:var(--input-bg);color:var(--text)}
.eml-preview-select:focus{outline:none;border-color:var(--accent)}
.eml-preview-to.missing{color:var(--pal-amber)}
/* ── (v5.0.9.4) "Send from" reminder banner in the Quotes tab ────────────
   mailto: links cannot set the From header — the account used is whatever the
   OS mail client is signed into. This banner is the visible substitute: it
   tells the sender which mailbox Quotes are expected to go out from. */
.eml-from-banner{display:flex;align-items:center;gap:8px;margin-bottom:14px;
  padding:9px 12px;border-radius:var(--r-sm);
  background:rgba(var(--brand-blue-rgb),0.07);border:0.5px solid rgba(var(--brand-blue-rgb),0.25);
  font-size:12px;color:var(--text2)}
.eml-from-banner i{font-size:14px;color:var(--accent);flex:0 0 auto}
.eml-from-banner strong{color:var(--text)}
.eml-from-copy{margin-left:auto;flex:0 0 auto;display:inline-flex;align-items:center;gap:4px;
  font-size:10px;font-weight:700;padding:4px 10px;border-radius:var(--r-lg);cursor:pointer;
  font-family:inherit;background:var(--glass3);color:var(--text2);border:0.5px solid var(--border2);transition:all .15s}
.eml-from-copy:hover{border-color:var(--accent);color:var(--accent)}
.eml-from-copy.copied{background:var(--success);color:#fff;border-color:var(--success)}
.eml-cc-empty{font-size:11px;color:var(--text3);font-style:italic}

/* ── (v5.0.9.4) PEO / PayGo program picker in the Emails composer ── */
.eml-prog-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:8px;
  padding:7px 10px;border-radius:var(--r-sm);background:var(--glass3);border:0.5px solid var(--border2)}
.eml-prog-label{font-size:11px;font-weight:700;color:var(--text2)}
.eml-prog-btn{font-size:10px;font-weight:700;padding:4px 11px;border-radius:var(--r-lg);cursor:pointer;
  font-family:inherit;background:transparent;color:var(--text3);border:0.5px solid var(--border2);transition:all .15s}
.eml-prog-btn:hover{border-color:var(--accent);color:var(--accent)}
.eml-prog-btn.sel{background:var(--accent);color:#fff;border-color:var(--accent)}
.eml-prog-warn{font-size:10px;color:var(--warn);margin-left:auto}

/* ── Emails category switcher — one segmented control (v5.0.9.4) ──────────
   Was five separate pills that scrolled sideways; now a single enclosed track
   with equal-width segments, so the five categories read as one control. */
.eml-tabs-shell{max-width:var(--col-narrow);margin:0 auto;padding:16px 20px 4px;box-sizing:border-box}
.eml-tabs{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:2px;
  padding:3px;border-radius:13px;
  background:var(--glass3);border:0.5px solid var(--border2);
  box-sizing:border-box}
.eml-tab{display:flex;align-items:center;justify-content:center;gap:5px;
  min-width:0;padding:8px 6px;border-radius:var(--r-sm);border:none;background:transparent;
  color:var(--text3);font-size:12px;font-weight:700;font-family:inherit;
  cursor:pointer;user-select:none;white-space:nowrap;
  transition:background .18s,color .18s}
.eml-tab i{font-size:13px;flex:0 0 auto}
.eml-tab span{overflow:hidden;text-overflow:ellipsis}
.eml-tab:hover:not(.active){color:var(--text);background:var(--glass2)}
.eml-tab.active{background:var(--accent);color:#fff;box-shadow:var(--shadow)}
.eml-tab:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* Below ~620px the five labels stop fitting side by side, so wrap to two rows
   instead of forcing a horizontal scroll. */
@media (max-width:620px){
  .eml-tabs-shell{padding:12px 14px 4px}
  .eml-tabs{grid-auto-flow:row;grid-template-columns:repeat(3,1fr);gap:3px}
  .eml-tab{padding:9px 4px;font-size:11px}
}
@media (max-width:380px){
  .eml-tabs{grid-template-columns:repeat(2,1fr)}
}
.eml-tab-panel{display:none}
.eml-tab-panel.active{display:block;animation:emlTabIn .22s ease}
@keyframes emlTabIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.eml-tab-panel.active{animation:none}}
.eml-soon-card{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:40px 22px;text-align:center;color:var(--text3)}
.eml-soon-card i{font-size:26px;color:var(--accent);margin-bottom:10px;display:block}
.eml-soon-card .eml-soon-title{font-size:14px;font-weight:700;color:var(--text);margin-bottom:4px}
.eml-soon-card .eml-soon-sub{font-size:12px}

/* ---- bloque 7 (era linea 4034 de index.html) ---- */

#admin-workspace-screen{display:none;min-height:100vh;background:var(--bg);background-image:var(--bg-mesh);background-attachment:fixed;background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);padding:0 0 80px}
/* Marketing on the app's own ground, the same as UWing Assistance and every
   other workspace. It carried a solid #9DC6D8 of its own, and with it a
   second rule keeping html in step so an overscroll bounce did not reveal
   the mesh underneath — both gone: matching the rest is what was asked for,
   and it takes the workaround with it. --marketing-accent stays for the
   lobby card, which still names the section. */
/* No background of its own, which is exactly what UWing Assistance does: that
   screen shows the body's ground through it. Painting the same mesh here
   instead looks identical today and diverges the moment the body's changes —
   the measured check compares the two screens rather than a colour written
   down twice, and caught precisely that. */
#marketing-workspace-screen{display:none;min-height:100vh;padding:0 0 80px}
.admws-body{max-width:var(--col-narrow);margin:0 auto;padding:22px 20px 60px}
.admws-section-title{font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.06em;text-transform:uppercase;margin:26px 0 10px}
.admws-section-title:first-child{margin-top:0}
.admws-role-select{padding:4px 6px;border-radius:6px;border:0.5px solid var(--border2);background:var(--input-bg);color:var(--text);font-size:11px;font-family:inherit}
.admws-remove-btn{background:none;border:none;color:var(--danger);cursor:pointer;font-size:14px;padding:2px 4px;line-height:1}
.admws-remove-btn:hover{opacity:.7}
.admws-hardcoded-note{font-size:10px;color:var(--text3)}
.admws-success{display:none;font-size:12px;color:var(--success);background:var(--success-soft);border:0.5px solid var(--success-border);border-radius:var(--r-sm);padding:8px 12px;margin-top:10px}
.admws-success.show{display:block}

/* ── Scheduled maintenance ────────────────────────────────────────────────
   The wall, and the panel that raises it.

   Above every other overlay in the app (the tallest is the tutorial zoom at
   10060) because it is the one that must not be paintable over — but below
   the toast layer at 20000, so a toast explaining a refused click is still
   legible when a section is shut and this is not up. */
#maint-overlay{
  position:fixed;inset:0;z-index:19000;
  display:none;align-items:center;justify-content:center;padding:24px;
  background:rgba(6,10,20,0.78);
  backdrop-filter:blur(20px) saturate(140%);-webkit-backdrop-filter:blur(20px) saturate(140%)}
/* Whatever is behind this must not scroll under it. The body keeps its
   scrollbar gutter so the page does not jump sideways as the wall goes up. */
body.maint-open{overflow:hidden}
.maint-card{
  width:min(440px,92vw);text-align:center;
  background:var(--glass-card);border:0.5px solid var(--border2);border-radius:20px;
  padding:34px 30px 26px;
  backdrop-filter:saturate(180%) blur(32px);-webkit-backdrop-filter:saturate(180%) blur(32px);
  box-shadow:var(--shadow-lg);
  animation:maintRise .28s var(--ease-out) both}
@keyframes maintRise{from{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:none}}
.maint-logo{
  width:60px;height:60px;margin:0 auto 14px;border-radius:17px;
  display:flex;align-items:center;justify-content:center;padding:7px;
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  background:var(--brand-plate);border:0.5px solid var(--border2)}
/* Not uppercased: "NovaIS" carries its own capitals, and NOVAIS throws away
   the break between the two halves of the name. */
.maint-brand{font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.08em}
.maint-title{font-size:18px;font-weight:700;color:var(--text);margin:6px 0 10px}
.maint-message{font-size:13px;line-height:1.6;color:var(--text2);margin:0}
.maint-until{
  display:flex;align-items:center;justify-content:center;gap:6px;
  margin-top:14px;padding:7px 12px;border-radius:999px;
  font-size:11px;font-weight:600;color:var(--accent);
  background:var(--accent-soft);border:0.5px solid var(--border2)}
.maint-actions{display:flex;justify-content:center;margin-top:20px}
.maint-btn{
  display:inline-flex;align-items:center;gap:7px;
  padding:9px 18px;border-radius:var(--r-sm);cursor:pointer;font-family:inherit;
  font-size:12px;font-weight:600;color:var(--text2);
  background:var(--glass3);border:0.5px solid var(--border2);
  transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out)}
.maint-btn:hover{background:var(--glass-card);color:var(--text)}

/* A shut workspace keeps its card. Hiding it would read as "your account lost
   access", which is a different and far more alarming thing than "this is
   closed until six" — so the card stays, dimmed, and says which it is. */
.lobby-card-maint{opacity:.62;filter:saturate(.55)}
.lobby-card-maint:hover{transform:none}
.lobby-card-badge-maint{
  color:var(--warn);background:var(--warn-soft);
  border-color:var(--warn-border)}

/* The panel, in Admin. */
.maint-state{
  font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  padding:4px 10px;border-radius:999px;white-space:nowrap}
.maint-state.off{color:var(--success);background:var(--success-soft);border:0.5px solid var(--success-border)}
.maint-state.on{color:var(--danger);background:var(--danger-soft);border:0.5px solid var(--danger-border)}
.maint-status{margin-bottom:14px}
.maint-status-who{font-size:13px;font-weight:600;color:var(--text)}
.maint-status-since{font-size:11px;color:var(--text3);margin-top:3px}
.maint-pick-group{margin-bottom:14px}
.maint-pick-title{
  display:flex;align-items:center;gap:6px;
  font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.04em;margin-bottom:8px}
.maint-pick-title > i{font-size:13px;color:var(--accent)}
.maint-pick-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:6px}
.maint-pick{
  display:flex;align-items:center;gap:8px;cursor:pointer;
  padding:7px 10px;border-radius:var(--r-sm);
  font-size:12px;color:var(--text2);
  background:var(--glass3);border:0.5px solid var(--border);
  transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out)}
.maint-pick:hover{background:var(--glass-card);border-color:var(--border2)}
.maint-pick input{accent-color:var(--accent);margin:0;cursor:pointer}
.maint-pick-note{font-size:10px;color:var(--text3);margin-top:6px}
/* Dimmed rather than hidden under "everybody": hiding the lists would lose
   the ticks somebody spent a minute setting, and they are what the scope
   goes back to. */
#maint-picker.disabled{opacity:.45;pointer-events:none}
.maint-textarea{
  box-sizing:border-box;width:100%;resize:vertical;line-height:1.5;
  min-height:70px;font-family:inherit}
.maint-panel-msg{display:none;font-size:12px;border-radius:var(--r-sm);padding:8px 12px;margin:10px 0 0}
.maint-panel-msg.show{display:block}
.maint-panel-msg.good{color:var(--success);background:var(--success-soft);border:0.5px solid var(--success-border)}
.maint-panel-msg.bad{color:var(--danger);background:var(--danger-soft);border:0.5px solid var(--danger-border)}
.maint-panel-actions{display:flex;align-items:center;gap:8px;margin-top:12px}
.maint-toggle-btn{flex:1;background:var(--danger)}
/* Lifting a suspension is the reassuring direction, so it stops being the red
   button the moment it is the one that gives access back. */
.maint-toggle-btn.restoring{background:var(--success)}
.maint-save-btn{padding:12px 16px;white-space:nowrap}
@media(max-width:560px){
  .maint-panel-actions{flex-direction:column;align-items:stretch}
  .maint-save-btn{width:100%;justify-content:center}
}

/* ---- bloque 8 (era linea 4113 de index.html) ---- */

/* Scoped to the Trivia screen — prefixed "triv-" so nothing collides with the rest of the app */
#trivia-screen{display:none;min-height:100vh;background:var(--bg);background-image:var(--bg-mesh);background-attachment:fixed;background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);padding:0 0 80px}
.triv-topbar{position:sticky;top:0;z-index:50;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 20px;background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);border-bottom:0.5px solid var(--border)}
.triv-topbar-controls{display:flex;align-items:center;gap:8px}
.triv-lang-toggle{display:flex;background:var(--glass2);border:0.5px solid var(--border);border-radius:99px;padding:3px}
.triv-lang-opt{font-size:11px;font-weight:700;padding:5px 11px;border-radius:99px;cursor:pointer;color:var(--text3);letter-spacing:.03em;user-select:none}
.triv-lang-opt.active{background:var(--accent);color:#fff}
.triv-page{max-width:900px;margin:0 auto;padding:1.5rem}
.triv-screen-inner{display:none;animation:fadeUp .4s ease both}
.triv-screen-inner.active{display:block}
.triv-sec-eyebrow{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin-bottom:6px}
.triv-sec-title{font-size:22px;font-weight:700;color:var(--text);margin-bottom:4px}
.triv-sec-sub{font-size:13px;color:var(--text3);margin-bottom:1.2rem}
.triv-back{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--text3);cursor:pointer;margin-bottom:14px;user-select:none}
.triv-back:hover{color:var(--accent)}
.triv-cat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px}
.triv-cat-card{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:20px;cursor:pointer;display:flex;flex-direction:column;align-items:flex-start;gap:5px;transition:transform .15s,box-shadow .15s}
.triv-cat-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)}
.triv-cat-icon{width:48px;height:48px;border-radius:13px;display:flex;align-items:center;justify-content:center;margin-bottom:4px;box-shadow:0 4px 14px rgba(0,0,0,0.14)}
.triv-cat-icon i{font-size:22px;color:#fff}
.triv-cat-title{font-size:14px;font-weight:700;color:var(--text)}
.triv-cat-sub{font-size:11px;color:var(--text3);line-height:1.5}
.triv-cat-stars{display:flex;gap:3px;margin-top:6px}
.triv-star{font-size:12px;color:var(--border2)}
.triv-star.on{color:#c48a1f}
.triv-level-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px}
.triv-lvl-card{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:20px;cursor:pointer;position:relative;transition:transform .15s,box-shadow .15s}
.triv-lvl-card:hover:not(.locked){transform:translateY(-3px);box-shadow:var(--shadow-lg)}
.triv-lvl-card.locked{opacity:.5;cursor:not-allowed}
.triv-lvl-dot{width:34px;height:34px;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;margin-bottom:10px;font-size:16px}
.triv-lvl-dot.easy{background:var(--success-soft);color:var(--success)}
.triv-lvl-dot.medium{background:var(--warn-soft);color:var(--warn)}
.triv-lvl-dot.hard{background:var(--danger-soft);color:var(--danger)}
.triv-lvl-title{font-size:14px;font-weight:700;color:var(--text);margin-bottom:2px}
.triv-lvl-sub{font-size:11px;color:var(--text3);margin-bottom:8px}
.triv-lvl-best{font-size:10px;font-weight:600;color:var(--accent)}
.triv-lvl-lock{position:absolute;top:12px;right:12px;font-size:13px;color:var(--text3)}
.triv-prog-wrap{background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-lg);padding:14px 18px;margin-bottom:1rem;backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);box-shadow:var(--shadow)}
.triv-prog-row{display:flex;align-items:center;gap:12px;margin-bottom:8px}
.triv-prog-bar{flex:1;height:5px;background:var(--accent-soft);border-radius:99px;overflow:hidden}
.triv-prog-fill{height:100%;background:linear-gradient(90deg,var(--accent),#7b61ff);border-radius:99px;transition:width .4s var(--ease-out)}
.triv-prog-label{font-size:12px;font-weight:700;color:var(--accent);white-space:nowrap}
.triv-prog-stats{display:flex;gap:6px;flex-wrap:wrap}
.triv-pstat{font-size:10px;font-weight:600;padding:3px 10px;border-radius:99px}
.triv-pstat.score{background:rgba(196,138,31,0.12);color:#c48a1f;border:1px solid rgba(196,138,31,0.25)}
.triv-pstat.streak{background:var(--danger-soft);color:var(--danger);border:1px solid var(--danger-border)}
.triv-pstat.timer{background:var(--accent-soft);color:var(--accent);border:1px solid var(--border2)}
.triv-q-card{background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);border:0.5px solid var(--border2);border-radius:var(--r-xl);box-shadow:var(--shadow-lg);padding:1.8rem 1.6rem}
.triv-q-chip{display:inline-flex;align-items:center;gap:6px;font-size:10px;font-weight:600;padding:4px 11px;border-radius:99px;background:var(--accent-soft);color:var(--accent);border:0.5px solid var(--border2);margin-bottom:12px}
.triv-q-text{font-size:18px;font-weight:700;line-height:1.45;color:var(--text);margin-bottom:1.4rem}
.triv-opt-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:1.2rem}
@media(max-width:560px){.triv-opt-grid{grid-template-columns:1fr}}
.triv-opt-btn{text-align:left;background:var(--glass2);border:0.5px solid var(--border);border-radius:var(--r);padding:12px 14px;font-size:13px;font-weight:500;color:var(--text2);cursor:pointer;display:flex;align-items:center;gap:9px}
.triv-opt-btn:hover:not(:disabled){border-color:var(--border2);background:var(--accent-soft)}
.triv-opt-letter{width:22px;height:22px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.triv-opt-btn.correct{background:var(--success-soft);border-color:var(--success-border);color:var(--success)}
.triv-opt-btn.correct .triv-opt-letter{background:var(--success);color:#fff}
.triv-opt-btn.wrong{background:var(--danger-soft);border-color:var(--danger-border);color:var(--danger)}
.triv-opt-btn.wrong .triv-opt-letter{background:var(--danger);color:#fff}
.triv-opt-btn.disabled-fifty{opacity:.25;pointer-events:none}
.triv-life-row{display:flex;gap:10px}
.triv-life-btn{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:8px 14px;border-radius:99px;background:var(--glass2);border:0.5px solid var(--border);color:var(--text2);cursor:pointer}
.triv-life-btn:hover:not(:disabled){border-color:var(--border2);color:var(--accent)}
.triv-life-btn:disabled{opacity:.35;cursor:not-allowed}
.triv-res-card{background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);border:0.5px solid var(--border2);border-radius:var(--r-xl);box-shadow:var(--shadow-lg);padding:2.2rem 1.8rem;text-align:center;position:relative;overflow:hidden;animation:popIn .5s cubic-bezier(.34,1.56,.64,1) both}
.triv-res-stars{display:flex;justify-content:center;gap:10px;margin-bottom:1rem}
.triv-star-pop{font-size:36px;color:var(--border2);animation:popIn .5s cubic-bezier(.34,1.56,.64,1) both}
.triv-star-pop.on{color:#c48a1f;text-shadow:0 0 18px rgba(196,138,31,0.5)}
.triv-res-title{font-size:20px;font-weight:700;color:var(--text);margin-bottom:6px}
.triv-res-sub{font-size:12px;color:var(--text3);margin-bottom:1.4rem}
.triv-res-score-row{display:flex;justify-content:center;gap:22px;margin-bottom:1.5rem;flex-wrap:wrap}
.triv-res-metric-val{font-size:22px;font-weight:800;color:var(--accent);font-family:var(--font-mono)}
.triv-res-metric-lbl{font-size:10px;color:var(--text3);text-transform:uppercase;letter-spacing:.06em;margin-top:2px}
.triv-res-badges{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin-bottom:1.5rem}
.triv-res-badge{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:6px 12px;border-radius:99px;background:rgba(196,138,31,0.12);color:#c48a1f;border:0.5px solid rgba(196,138,31,0.28)}
.triv-res-actions{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
.triv-btn{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:600;padding:10px 18px;border-radius:11px;cursor:pointer;border:0.5px solid var(--border2)}
.triv-btn-primary{background:var(--accent);color:#fff}
.triv-btn-primary:hover{background:var(--accent2)}
.triv-btn-ghost{background:var(--glass2);color:var(--text2)}
.triv-btn-ghost:hover{border-color:var(--border2);color:var(--accent)}
.triv-confetti{position:absolute;width:7px;height:11px;top:-16px;opacity:0;z-index:5}
@keyframes trivConfettiFall{0%{opacity:1;transform:translateY(0) rotate(0)}100%{opacity:0;transform:translateY(380px) rotate(540deg)}}

/* Special modes (blitz/survival) — menu cards, and the game-screen tweaks
   that apply while one of them is running. */
.triv-mode-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px}
.triv-mode-card{background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:20px;cursor:pointer;position:relative;overflow:hidden;transition:transform .15s,box-shadow .15s}
.triv-mode-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)}
.triv-mode-icon{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;margin-bottom:10px;font-size:20px;color:#fff;box-shadow:0 4px 14px rgba(0,0,0,0.14)}
.triv-mode-card.blitz .triv-mode-icon{background:linear-gradient(135deg,#eb9447,#e0b34c)}
.triv-mode-card.survival .triv-mode-icon{background:linear-gradient(135deg,#e8618c,#a05fd0)}
.triv-mode-title{font-size:14px;font-weight:700;color:var(--text);margin-bottom:2px}
.triv-mode-sub{font-size:11px;color:var(--text3);line-height:1.5}
.triv-mode-best{font-size:10px;font-weight:600;color:var(--accent);margin-top:8px;min-height:14px}

.hidden-mode{display:none!important}

/* Question-card entrance — renderQuestion() toggles this class off then
   back on (with a reflow in between) so it replays on every question, not
   only the first time the card mounts. */
@keyframes trivQIn{from{opacity:0;transform:translateY(14px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}
.triv-q-card.q-enter{animation:trivQIn .32s var(--ease-out) both}

@keyframes trivShake{0%,100%{transform:translateX(0)}20%{transform:translateX(-6px)}40%{transform:translateX(5px)}60%{transform:translateX(-4px)}80%{transform:translateX(3px)}}
.triv-opt-btn.wrong{animation:trivShake .4s ease}

.triv-pstat.timer.low-time{background:var(--danger-soft);color:var(--danger);border-color:var(--danger-border);animation:trivTimerPulse .6s ease-in-out infinite}
@keyframes trivTimerPulse{0%,100%{opacity:1}50%{opacity:.45}}

/* Blitz's progress fill is repurposed as a draining 60s clock (see
   renderQuestion()'s width = timeLeft/60), so it gets a slower, linear
   transition instead of the snappy question-to-question one; survival's is
   a streak meter and keeps the default easing. */
.triv-prog-wrap.mode-blitz .triv-prog-fill{background:linear-gradient(90deg,#eb9447,#e0b34c);transition:width 1s linear}
.triv-prog-wrap.mode-blitz .triv-prog-label{color:#c4791f}
.triv-prog-wrap.mode-survival .triv-prog-fill{background:linear-gradient(90deg,#e8618c,#a05fd0)}
.triv-prog-wrap.mode-survival .triv-prog-label{color:#a05fd0}

/* ---- bloque 9 (era linea 4313 de index.html) ---- */

#solitaire-screen{display:none;min-height:100vh;background:var(--bg);background-image:var(--bg-mesh);background-attachment:fixed;background-repeat:var(--bg-mesh-repeat);background-position:var(--bg-mesh-pos);background-size:var(--bg-mesh-size);padding:0 0 80px}
.sol-topbar{position:sticky;top:0;z-index:50;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 20px;background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);border-bottom:0.5px solid var(--border);flex-wrap:wrap}
.sol-topbar-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.sol-stat{font-size:11px;font-weight:600;color:var(--text3);background:var(--glass2);border:0.5px solid var(--border);border-radius:99px;padding:5px 11px}
.sol-stat b{color:var(--accent);font-family:var(--font-mono)}
.sol-page{max-width:820px;margin:0 auto;padding:1.6rem 1rem}
.sol-board{display:flex;flex-direction:column;gap:22px}
.sol-top-row{display:flex;gap:10px;align-items:flex-start}
.sol-spacer{flex:1}
.sol-pile{width:64px;height:90px;border-radius:8px;border:1.5px dashed var(--border2);background:var(--glass2);position:relative;flex-shrink:0;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text3);font-size:20px}
.sol-pile.sol-foundation[data-suit="♥"],.sol-pile.sol-foundation[data-suit="♦"]{color:rgba(196,37,53,0.35)}
.sol-tableau{display:flex;gap:10px}
.sol-column{width:64px;min-height:110px;position:relative;flex-shrink:0;cursor:pointer}
.sol-card{position:absolute;left:0;width:64px;height:90px;border-radius:7px;background:#fbfaf7;border:1px solid rgba(0,0,0,0.20);box-shadow:0 2px 6px rgba(0,0,0,0.18);display:flex;flex-direction:column;justify-content:space-between;padding:3px 5px;font-weight:700;font-family:var(--font-sans);cursor:pointer;user-select:none;touch-action:none;transition:transform .12s,box-shadow .12s}
.sol-drag-ghost{position:fixed;width:64px;pointer-events:none;z-index:5000;transform:rotate(-2deg)}
.sol-drag-ghost .sol-card{position:absolute;cursor:grabbing;box-shadow:0 14px 28px rgba(0,0,0,0.38);opacity:.96}
.sol-column.drop-hover{outline:2px dashed var(--accent);outline-offset:4px;border-radius:8px}
.sol-foundation.drop-hover{outline:2px dashed var(--accent);outline-offset:2px}
.sol-card.red{color:#c42535}
.sol-card.black{color:#161616}
.sol-card.facedown{background:linear-gradient(135deg,#163a66,#4d8fe6);border-color:rgba(255,255,255,0.30)}
.sol-card.facedown::after{content:'';position:absolute;inset:5px;border:1px solid rgba(255,255,255,0.35);border-radius:4px}
.sol-card.selected{outline:3px solid #ffd54a;outline-offset:1px;transform:translateY(-5px);box-shadow:0 8px 16px rgba(0,0,0,0.3);z-index:200 !important}
.sol-card:hover:not(.facedown){transform:translateY(-2px)}
.sol-rank-top{font-size:12px;line-height:1}
.sol-suit-mid{font-size:20px;text-align:center;align-self:center}
.sol-rank-bot{font-size:12px;line-height:1;align-self:flex-end;transform:rotate(180deg)}.sol-win-overlay{position:fixed;inset:0;background:rgba(0,0,0,0.62);display:none;align-items:center;justify-content:center;z-index:500;padding:1rem}
.sol-win-overlay.show{display:flex}
.sol-win-card{background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);border:0.5px solid var(--border2);border-radius:var(--r-xl);box-shadow:var(--shadow-lg);padding:2.4rem 2rem;text-align:center;max-width:360px}
.sol-win-title{font-size:24px;font-weight:800;color:var(--text);margin-bottom:8px}
.sol-win-stats{font-size:13px;color:var(--text3);margin-bottom:1.4rem;line-height:1.7}

.sol-draw-toggle{display:flex;background:var(--glass2);border:0.5px solid var(--border);border-radius:99px;padding:3px}
.sol-draw-opt{font-size:11px;font-weight:700;padding:5px 11px;border-radius:99px;cursor:pointer;color:var(--text3);letter-spacing:.02em;user-select:none;background:none;border:0}
.sol-draw-opt.active{background:var(--accent);color:#fff}

/* Deal-out — newGame() marks each tableau card with its deal order (via
   dealOrder) and gives it an animation-delay proportional to that order, so
   the whole 28-card deal reads as one dealer's sweep instead of the board
   just appearing. */
@keyframes solDealIn{from{opacity:0;transform:translate(-40px,-70px) rotate(-10deg)}to{opacity:1;transform:translate(0,0) rotate(0)}}
.sol-card.deal-in{animation:solDealIn .35s ease-out both}

/* Pop-in — the render() right after any move marks the card(s) that just
   landed (justMoved), so a placed card reads as having arrived rather than
   teleporting in with the rest of a fully-rebuilt board. */
@keyframes solPopIn{0%{transform:scale(.7) translateY(-10px);opacity:.3}60%{transform:scale(1.08) translateY(0);opacity:1}100%{transform:scale(1) translateY(0)}}
.sol-card.pop-in{animation:solPopIn .28s var(--ease-spring) both}

@keyframes solFoundationPulse{0%{transform:scale(1)}40%{transform:scale(1.22)}100%{transform:scale(1)}}
.sol-foundation.pulse{animation:solFoundationPulse .35s var(--ease-spring)}

/* Win cascade — a burst of small card sprites falling the full height of
   the viewport when checkWin() fires, replacing what used to be nothing
   more than the static win dialog. */
.sol-cascade-card{position:fixed;top:-60px;width:34px;height:48px;border-radius:5px;background:#fbfaf7;border:1px solid rgba(0,0,0,.2);box-shadow:0 4px 10px rgba(0,0,0,.25);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;font-family:var(--font-sans);z-index:600;pointer-events:none;animation:solCascadeFall linear both}
.sol-cascade-card.red{color:#c42535}
.sol-cascade-card.black{color:#161616}
@keyframes solCascadeFall{0%{transform:translateY(0) rotate(0deg);opacity:1}100%{transform:translateY(112vh) rotate(360deg);opacity:.85}}

/* ---- bloque 10 (era linea 44157 de index.html) ---- */

.tpl-tb-btn {
  min-width:30px;height:28px;border-radius:7px;border:none;background:none;
  color:var(--text2);font-size:12px;cursor:pointer;font-family:inherit;
  display:flex;align-items:center;justify-content:center;padding:0 6px;
  transition:background .12s,color .12s;
}
.tpl-tb-btn:hover { background:rgba(130,182,242,0.15);color:var(--text) }
.tpl-tb-btn:active { background:var(--accent-soft);color:var(--accent) }
.tpl-tb-sep { width:1px;height:20px;background:var(--border3);margin:0 4px;flex-shrink:0 }
.tpl-tb-select {
  font-size:10px;border:0.5px solid var(--border);border-radius:7px;
  background:rgba(130,182,242,0.08);color:var(--text);padding:3px 6px;
  font-family:inherit;outline:none;cursor:pointer;height:28px;
}
#tpl-editor-body:focus { outline:none }
#tpl-editor-body h1 { font-size:22px;font-weight:700;margin:12px 0 6px;color:var(--text) }
#tpl-editor-body h2 { font-size:18px;font-weight:700;margin:10px 0 5px;color:var(--text) }
#tpl-editor-body h3 { font-size:14px;font-weight:700;margin:8px 0 4px;color:var(--text) }
#tpl-editor-body ul,#tpl-editor-body ol { padding-left:22px;margin:6px 0 }
#tpl-editor-body li { margin-bottom:3px }
#tpl-editor-body table { border-collapse:collapse;width:100%;margin:10px 0 }
#tpl-editor-body td,#tpl-editor-body th {
  border:1px solid var(--border);padding:7px 10px;font-size:12px;
}
#tpl-editor-body th { background:var(--accent-soft);font-weight:700 }

/* ---- bloque 11 (era linea 45609 de index.html) ---- */
/* Removed: `body{font-family:Arial,sans-serif;max-width:800px;margin:40px auto}`
   and the h1/h2/h3/table rules under it.
   They were never this site's styles. That block is the <style> inside the HTML
   file tplEditorDownload() builds — a template literal in 05-features.js — and
   the extraction that split the inline <style> tags out matched it inside that
   JavaScript string and hoisted it into the global sheet.
   The body cap is what it cost: the whole application was held to 800px on
   every screen, so top bars measured 534px wide on a 1512px display, the David
   Tracker table was squeezed, and the bars carrying extra actions wrapped onto
   a second row. The download still has its own copy, in the JavaScript, where
   it belongs and where it applies to the downloaded file only. */

/* ---- marca de autoria ----
   One class for every place the build is attributed, so the wording stays the
   same wherever it appears and none of it can be nudged out of the layout by a
   later change to a neighbour. */
.hub-watermark{
  font-size:9px;
  line-height:1.45;
  color:var(--text3);
  text-align:center;
  opacity:.5;
  letter-spacing:.03em;
  user-select:none;
}

/* ---- ayudas del login ----
   The eye sits inside the field rather than beside it so the field keeps its
   full width on a phone, where the login screen is mostly used. tabindex="-1"
   on the button keeps Tab going email -> password -> Sign In. */
.auth-pass-wrap{ position:relative; display:block; }
.auth-pass-wrap #auth-pass{ padding-right:40px; }
.auth-peek{
  position:absolute; right:4px; top:50%; transform:translateY(-50%);
  width:32px; height:32px; display:flex; align-items:center; justify-content:center;
  background:none; border:0; cursor:pointer; padding:0;
  color:var(--text3); font-size:14px; border-radius:8px;
}
.auth-peek:hover{ color:var(--text1); background:var(--fill2); }
/* Toggled by a class, not by an inline style. The first version keyed the
   visible state off [style*="block"], which is a string match on an attribute
   the app writes — it would have gone on matching "none" the moment anything
   else set display on this element. */
.auth-caps{ display:none; }
.auth-caps.on{
  display:flex; align-items:center; gap:5px;
  margin-top:6px; font-size:11px; font-weight:600;
  color:var(--pal-orange);
}

/* ── Notifications ──
   The bell lives in the same cluster as Features and Widgets, so it inherits
   .widget-panel-btn; only the count and the panel are new. */
.notif-dot{
  position:absolute; top:-3px; right:-3px; min-width:16px; height:16px; padding:0 4px;
  border-radius:99px; background:var(--danger); color:#fff;
  font-size:9px; font-weight:800; line-height:15px; text-align:center;
  border:1.5px solid var(--glass-card); pointer-events:none;
}
#notif-dropdown{
  position:absolute; top:calc(100% + 8px); right:0; width:320px; max-height:420px;
  overflow-y:auto; z-index:3100;
  background:var(--glass-card); border:0.5px solid var(--border); border-radius:var(--r);
  box-shadow:0 16px 44px rgba(0,0,0,0.30);
  backdrop-filter:saturate(180%) blur(28px); -webkit-backdrop-filter:saturate(180%) blur(28px);
}
.notif-head{
  display:flex; align-items:center; justify-content:space-between;
  padding:11px 14px; border-bottom:0.5px solid var(--border);
  font-size:11px; font-weight:700; color:var(--text); letter-spacing:.03em;
  position:sticky; top:0; background:inherit; border-radius:16px 16px 0 0;
}
.notif-clear{
  background:none; border:none; cursor:pointer; font-family:inherit;
  font-size:10px; font-weight:600; color:var(--accent); padding:0;
}
/* The three rows under the notifications in the avatar popup — My profile,
   Change photo, Sign out. One class rather than the same inline style written
   out three times, which is how their transition came to name background and
   nothing else: they still took the press every <button> gets and snapped
   there instead of easing. */
.tbar-menu-btn{
  width:100%; text-align:left; display:flex; align-items:center; gap:8px;
  padding:8px 12px; border:none; background:none; border-radius:8px;
  color:var(--text2); font-size:12px; font-weight:500; cursor:pointer;
  font-family:inherit;
  transition:background .12s,transform var(--dur-fast) var(--ease-out);
}
.tbar-menu-btn.danger{color:var(--danger)}
/* Each notification is a button now — it opens the request it is about. The
   reset is explicit because a <button> brings its own font, colour, centred
   text and border, none of which belong on a list row. */
.notif-item{
  display:flex; gap:10px; padding:10px 14px; border:0; border-bottom:0.5px solid var(--border3);
  width:100%; text-align:left; align-items:flex-start; background:transparent;
  font:inherit; color:inherit; cursor:pointer; transition:background .15s;
}
.notif-item:last-child{ border-bottom:none; }
.notif-item.unread{ background:var(--accent-soft); }
.notif-item:hover{ background:rgba(130,182,242,0.16); }
.notif-item:focus-visible{ outline:2px solid var(--accent); outline-offset:-2px; }
/* Points at the request the row opens. Kept quiet until the row is under the
   pointer, so forty of them do not read as forty arrows. */
.notif-go{ margin-left:auto; align-self:center; font-size:13px; color:var(--text3); opacity:.45; flex-shrink:0; }
.notif-item:hover .notif-go, .notif-item:focus-visible .notif-go{ opacity:1; color:var(--accent); }
.notif-icon{ font-size:14px; flex-shrink:0; margin-top:1px; }
.notif-icon.ok{ color:var(--success); }
.notif-icon.no{ color:var(--danger); }
.notif-icon.warn{ color:var(--pal-orange); }
.notif-text{ min-width:0; }
.notif-title{ font-size:11px; font-weight:700; color:var(--text); }
.notif-body{ font-size:11px; color:var(--text2); line-height:1.45; margin-top:1px; word-break:break-word; }
.notif-when{ font-size:9px; color:var(--text3); margin-top:3px; }
.notif-empty{ padding:22px 14px; text-align:center; font-size:11px; color:var(--text3); }

/* ── Profile ──
   Three cards side by side where there is room, stacked where there is not.
   Nothing here sets a font size: the labels and values reuse .avp-field and the
   card scale, so the screen stays in step with the rest of the app. */
.prof-grid{
  display:grid; gap:12px;
  grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  align-items:start;
}
.prof-sec-title{
  display:flex; align-items:center; gap:7px;
  font-size:11px; font-weight:700; letter-spacing:.06em; text-transform:uppercase;
  color:var(--text2); margin-bottom:4px;
}
.prof-sec-title i{ font-size:14px; color:var(--accent); }
.prof-readonly-note{ font-size:10px; color:var(--text3); line-height:1.5; margin-bottom:12px; }
.prof-row{
  display:flex; justify-content:space-between; align-items:baseline; gap:12px;
  padding:7px 0; border-bottom:0.5px solid var(--border3);
}
.prof-row:last-child{ border-bottom:none; }
.prof-label{
  font-size:10px; font-weight:700; color:var(--text3);
  letter-spacing:.06em; text-transform:uppercase; flex-shrink:0;
}
.prof-value{ font-size:12px; color:var(--text); text-align:right; word-break:break-word; }
.prof-actions{ display:flex; align-items:center; gap:12px; margin-top:14px; }
.prof-save{ width:auto; padding:9px 22px; }
.prof-status{ font-size:11px; color:var(--text3); }

/* ── Tracker charts ──
   The picker sits above both panels because it changes both at once: two
   pictures of the same data, drawn the same way. */
.dt-chart-picker{
  display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-bottom:10px;
}
.dt-chart-picker-label{
  font-size:10px; font-weight:700; color:var(--text3);
  text-transform:uppercase; letter-spacing:.08em; margin-right:2px;
}
.dt-chart-type{
  display:inline-flex; align-items:center; gap:5px;
  font-family:inherit; font-size:11px; font-weight:600;
  padding:5px 11px; border-radius:var(--r-lg); cursor:pointer;
  color:var(--text3); background:var(--glass); border:0.5px solid var(--border);
  transition:color .15s, background .15s, border-color .15s;
}
.dt-chart-type i{ font-size:12px; }
.dt-chart-type:hover{ color:var(--text); border-color:var(--accent); }
.dt-chart-type.active{ background:var(--accent); border-color:var(--accent); color:#fff; }

/* Disc beside its legend, stacking when the panel is too narrow to hold both. */
.dt-chart-flex{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
.dt-chart-flex svg{ flex-shrink:0; }
.dt-legend{ display:flex; flex-direction:column; gap:5px; min-width:0; flex:1; }
.dt-legend-row{ display:flex; align-items:center; gap:7px; font-size:11px; }
.dt-legend-dot{ width:9px; height:9px; border-radius:3px; flex-shrink:0; }
.dt-legend-label{ color:var(--text2); flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.dt-legend-val{ color:var(--text); font-weight:700; }
.dt-legend-pct{ color:var(--text3); min-width:32px; text-align:right; }

/* ── Sidebar grouping ──
   Eleven destinations in one flat column meant reading the whole list to find
   one. The labels are quiet on purpose: they are signposts between groups, not
   items you can click. */
.nav-group-label{
  font-size:9px; font-weight:700; letter-spacing:.10em; text-transform:uppercase;
  color:rgba(255,255,255,0.32);
  padding:14px 14px 5px; user-select:none;
}
.nav-items > .nav-group-label:first-child{ padding-top:6px; }

/* Anything waiting shows on the item it is waiting on, so the sidebar answers
   "is there anything for me" without opening anything. */
.nav-badge{
  margin-left:auto; min-width:17px; height:17px; padding:0 5px;
  border-radius:99px; background:var(--danger); color:#fff;
  font-size:9px; font-weight:800; line-height:17px; text-align:center;
  flex-shrink:0;
}

/* ── 13 · ONE INTERACTION RECIPE FOR EVERY BUTTON ─────────────────────────
   Thirty button classes, and eight of them answered a press. Four lifted
   under the pointer. The rest changed colour and nothing else, so most of the
   interface felt inert next to the few places somebody had bothered — the
   lobby cards and the sign-in button felt like software, and the thirty
   controls people actually work in all day did not.

   Most of them also carried a bare `transition:.15s`, which is shorthand for
   "animate every property". That includes width, height and padding, so a
   button that changed its label mid-interaction animated its own geometry.
   The list below names the properties on purpose.

   Two things are deliberately left out.

   .desk-main and its launch button — the Workers' Comp Analyzer flash card —
   keep the treatment they already have. It is the one control on the lobby
   that is meant to feel like an event rather than a button, it has its own
   shimmer and its own timing, and flattening it into this recipe would take
   away the thing that marks it as the way in.

   And every rule here is scoped :not(:disabled). A disabled control that
   still lifts and presses is telling somebody it will work. */
/* .mini-btn and .contact-tog joined .avp-tog here, and that is the whole of
   why the Yes/No pairs animated differently: this recipe lists .avp-tog and
   runs at --dur-fast, the Yes/No block near the top of this file runs at
   --dur, and this one is further down, so the same answer eased at 0.15s in
   the Analyzer and 0.22s in Time Off. One control language, one speed. */
.avp-btn, .avp-tog, .mini-btn, .contact-tog,
.wm-action-btn, .wm-tool-btn, .wm-lang-btn, .wm-back,
.to-export-btn, .to-act-btn, .to-submit-btn, .to-del-btn,
.eml-target-btn, .eml-gen-btn, .eml-preview-btn, .eml-prog-btn, .eml-tab, .tpl-tb-btn, .dt-chart-type, .msb-tool-btn, .feat-dd-btn,
.quick-toggle-btn, .cw-toggle-btn, .sw-btn, .cbtn,
.pbi-open-btn, .auth-btn, .start-btn, .tbar-home-btn,
.docs-chip, .nav-hdr-btn, .widget-panel-btn, .calc-close,
.cal-x-btn, .cal-icon-btn,
.notif-item, .acord-step {
  transition:
    background-color var(--dur-fast) var(--ease-out),
    border-color     var(--dur-fast) var(--ease-out),
    color            var(--dur-fast) var(--ease-out),
    box-shadow       var(--dur-fast) var(--ease-out),
    opacity          var(--dur-fast) var(--ease-out),
    transform        var(--dur-fast) var(--ease-out);
}

/* One pixel. Enough that a pointer is answered, small enough that a row of
   filter chips does not ripple as the cursor crosses it. */
.avp-btn:hover:not(:disabled), .avp-tog:hover:not(:disabled), .mini-btn:hover:not(:disabled), .contact-tog:hover:not(:disabled),
.wm-action-btn:hover:not(:disabled), .wm-tool-btn:hover:not(:disabled),
.wm-lang-btn:hover:not(:disabled), .wm-back:hover:not(:disabled),
.to-export-btn:hover:not(:disabled), .to-act-btn:hover:not(:disabled),
.to-submit-btn:hover:not(:disabled), .to-del-btn:hover:not(:disabled),
.eml-target-btn:hover:not(:disabled), .eml-gen-btn:hover:not(:disabled),
.eml-preview-btn:hover:not(:disabled), .eml-prog-btn:hover:not(:disabled),
.eml-tab:hover:not(:disabled),
.tpl-tb-btn:hover:not(:disabled), .dt-chart-type:hover:not(:disabled),
.msb-tool-btn:hover:not(:disabled), .feat-dd-btn:hover:not(:disabled),
.quick-toggle-btn:hover:not(:disabled),
.cw-toggle-btn:hover:not(:disabled), .sw-btn:hover:not(:disabled),
.cbtn:hover:not(:disabled), .pbi-open-btn:hover:not(:disabled),
.start-btn:hover:not(:disabled), .tbar-home-btn:hover:not(:disabled),
.docs-chip:hover:not(:disabled), .nav-hdr-btn:hover:not(:disabled),
.widget-panel-btn:hover:not(:disabled), .calc-close:hover:not(:disabled),
.cal-x-btn:hover:not(:disabled), .cal-icon-btn:hover:not(:disabled) {
  transform: translateY(-1px);
}

/* The press. Settling back to zero and shrinking a hair is what makes a
   control feel like it took the click, rather than like the page changed on
   its own a moment later. */
.avp-btn:active:not(:disabled), .avp-tog:active:not(:disabled), .mini-btn:active:not(:disabled), .contact-tog:active:not(:disabled),
.wm-action-btn:active:not(:disabled), .wm-tool-btn:active:not(:disabled),
.wm-lang-btn:active:not(:disabled), .wm-back:active:not(:disabled),
.to-export-btn:active:not(:disabled), .to-act-btn:active:not(:disabled),
.to-submit-btn:active:not(:disabled), .to-del-btn:active:not(:disabled),
.eml-target-btn:active:not(:disabled), .eml-gen-btn:active:not(:disabled),
.eml-preview-btn:active:not(:disabled), .eml-prog-btn:active:not(:disabled),
.eml-tab:active:not(:disabled),
.tpl-tb-btn:active:not(:disabled), .dt-chart-type:active:not(:disabled),
.msb-tool-btn:active:not(:disabled), .feat-dd-btn:active:not(:disabled),
.quick-toggle-btn:active:not(:disabled),
.cw-toggle-btn:active:not(:disabled), .sw-btn:active:not(:disabled),
.cbtn:active:not(:disabled), .pbi-open-btn:active:not(:disabled), .auth-btn:active:not(:disabled),
.start-btn:active:not(:disabled), .tbar-home-btn:active:not(:disabled),
.docs-chip:active:not(:disabled), .nav-hdr-btn:active:not(:disabled),
.widget-panel-btn:active:not(:disabled), .calc-close:active:not(:disabled),
.cal-x-btn:active:not(:disabled), .cal-icon-btn:active:not(:disabled),
.notif-item:active, .acord-step:active {
  transform: translateY(0) scale(.97);
}

/* ── The Yes/No pair: the hover tint, the corners and the settle ──
   The MOVEMENT is deliberately not here. Every button in the app lifts 1px
   on hover and sinks on press (the recipe above), and a Yes/No pair that
   scaled instead was the one control that answered a pointer differently —
   which is the opposite of "the same animation everywhere". What belongs to
   this control alone is the tint under the pointer, the rounder corner on
   the chosen answer and the settle that plays when it is chosen; the rest it
   shares with every other button. */
.avp-tog:hover:not(.active),.mini-btn:hover:not(.active),.contact-tog:hover:not(.active){
  background:rgba(130,182,242,0.16);
}
.avp-tog.active,.mini-btn.active,.contact-tog.active{
  border-radius:12px;
  animation:togSettle .28s cubic-bezier(.34,1.56,.64,1);
}
.avp-toggle,.mini-toggle,.contact-toggle{border-radius:14px}
@media(prefers-reduced-motion:reduce){
  .avp-tog.active,.mini-btn.active,.contact-tog.active{animation:none}
}

/* Somebody who asked their system for less movement gets the colour change
   and none of the travel. The eleven blocks above this one already honour
   that; this recipe has to as well or it undoes them. */
@media (prefers-reduced-motion: reduce) {
  .avp-btn, .avp-tog, .wm-action-btn, .wm-tool-btn, .wm-lang-btn, .wm-back,
  .to-export-btn, .to-act-btn, .to-submit-btn, .to-del-btn,
  .eml-target-btn, .eml-gen-btn, .eml-preview-btn, .eml-prog-btn, .eml-tab, .tpl-tb-btn, .dt-chart-type, .msb-tool-btn, .feat-dd-btn,
  .quick-toggle-btn, .cw-toggle-btn, .sw-btn, .cbtn,
  .pbi-open-btn, .auth-btn, .start-btn, .tbar-home-btn {
    transform: none !important;
  }
}

/* ── 14 · WORKBOOK ANALYSIS on the Power BI screen ────────────────────────
   Same card treatment as the report above it, because they are two answers to
   one question and looking like two different features would make somebody
   choose between them rather than use whichever fits. */
#pbi-wb-card.pbi-wb-drag{border-color:var(--accent);border-style:dashed;background:rgba(79,195,247,0.08)}
.pbi-wb-empty{
  display:flex;flex-direction:column;align-items:center;gap:6px;
  padding:38px 20px;text-align:center;color:var(--text3);font-size:12px;
}
.pbi-wb-empty i{font-size:30px;color:var(--accent);opacity:.55}
.pbi-wb-empty-sub{font-size:10px;color:var(--text3);opacity:.8}

.pbi-wb-controls{display:flex;flex-wrap:wrap;gap:10px;padding:12px 0 4px}
.pbi-wb-ctl{display:flex;flex-direction:column;gap:3px;min-width:0}
.pbi-wb-ctl > span{
  font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3);
}
.pbi-wb-ctl select{
  font-size:11px;padding:5px 8px;border-radius:7px;border:0.5px solid var(--border);
  background:var(--input-bg);color:var(--text);font-family:inherit;outline:none;max-width:220px;
}
.pbi-wb-ctl select:focus{border-color:var(--accent)}

.pbi-wb-types{display:flex;flex-wrap:wrap;gap:6px;padding:8px 0 2px}

/* Chart beside the numbers on a wide screen, chart above them on a narrow
   one. A chart is how a shape is read and a table is how a value is checked,
   and the two get used in the same minute. */
.pbi-wb-out{display:grid;grid-template-columns:minmax(280px,1fr) minmax(260px,1fr);gap:16px;padding:12px 0 4px;align-items:start}
@media (max-width:820px){.pbi-wb-out{grid-template-columns:1fr}}
.pbi-wb-chart{display:flex;align-items:center;justify-content:center;min-height:230px}
.pbi-wb-chart svg{max-width:100%;height:auto}
.pbi-wb-table-wrap{overflow-x:auto;max-height:320px;overflow-y:auto}
.pbi-wb-table{width:100%;border-collapse:collapse;font-size:11px}
.pbi-wb-table th{
  position:sticky;top:0;background:var(--glass-card);text-align:left;padding:6px 9px;
  font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text3);
  border-bottom:0.5px solid var(--border3);white-space:nowrap;
}
.pbi-wb-table td{padding:5px 9px;border-bottom:0.5px solid var(--border3);color:var(--text2)}
.pbi-wb-table td:last-child,.pbi-wb-table th:last-child{text-align:right;white-space:nowrap}
.pbi-wb-table tr:last-child td{border-bottom:none}
.pbi-wb-swatch{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:7px;flex-shrink:0;vertical-align:-1px}

/* ── Activ & Bonus ── same card language as Power BI/Workbook analysis
   right above (.pbi-card/.pbi-head are shared as-is). The cards sat flush
   against each other and read as one long panel; the body spaces them
   itself so no card has to carry its own margin. */
@media(min-width:761px){body.nav-pinned #kpi-screen .pbi-body{margin-left:var(--nav-w)}}
.kpi-body{display:flex;flex-direction:column;gap:22px}
.kpi-body .pbi-card{margin:0}
/* Activity and Bonus are two sections of one page, built the same way; each
   spaces its own cards the way the body spaces the sections. */
.kpi-section{display:flex;flex-direction:column;gap:22px}
.kpi-section + .kpi-section{padding-top:10px}
.kpi-section-title{
  display:flex;align-items:center;gap:9px;margin:0;font-size:18px;font-weight:800;
  letter-spacing:-.01em;color:var(--text);
}
.kpi-section-title .ti{font-size:18px;color:var(--accent)}
.kpi-viewbar{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap}

/* Import docs — the builders' panel: two buttons, then a draft per file. */
.kpi-docs-actions{padding:14px 18px 6px}
.kpi-docs > .kpi-import-status{padding:0 18px 12px;min-height:14px}
.kpi-draft{border-top:0.5px solid var(--border2);padding:14px 18px 16px;display:flex;flex-direction:column;gap:10px}
.kpi-draft-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.kpi-draft-title{font-size:13px;font-weight:800;color:var(--text)}
.kpi-draft-meta{font-size:11px;color:var(--text3)}
.kpi-draft-head .kpi-draft-gap{flex:1}
.kpi-draft-toggle{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text2);cursor:pointer}
.kpi-draft-wrap{max-height:420px;overflow:auto;border:0.5px solid var(--border2);border-radius:10px}
.kpi-draft-table{width:100%;border-collapse:collapse;font-size:11px}
.kpi-draft-table th{
  position:sticky;top:0;z-index:1;background:var(--glass-card);text-align:left;font-size:9px;font-weight:700;
  text-transform:uppercase;letter-spacing:.06em;color:var(--text3);padding:7px 6px;border-bottom:0.5px solid var(--border2);white-space:nowrap;
}
.kpi-draft-table td{padding:3px 4px;border-bottom:0.5px solid var(--border3);vertical-align:middle;white-space:nowrap}
.kpi-draft-table input{
  width:100%;min-width:64px;box-sizing:border-box;font-size:11px;padding:4px 6px;border-radius:6px;
  border:0.5px solid transparent;background:transparent;color:var(--text);font-family:inherit;outline:none;
}
.kpi-draft-table input:hover{border-color:var(--border)}
.kpi-draft-table input:focus{border-color:var(--accent);background:var(--input-bg)}
.kpi-draft-table input.kpi-draft-bad{border-color:var(--danger);background:rgba(239,68,68,0.08)}
.kpi-draft-table tr.kpi-draft-row-bad td:first-child{box-shadow:inset 3px 0 0 var(--danger)}
.kpi-draft-table .kpi-draft-num{text-align:right;color:var(--text3);font-variant-numeric:tabular-nums}
.kpi-draft-why{font-size:10px;color:var(--danger);white-space:normal;min-width:160px}
.kpi-draft-ok{font-size:10px;color:var(--success);font-weight:700}
.kpi-draft-del{
  display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;
  border:0.5px solid transparent;background:transparent;color:var(--text3);cursor:pointer;font-size:12px;
}
.kpi-draft-del:hover{border-color:var(--danger);color:var(--danger)}
.kpi-draft-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/* Import is one button, not a card — a one-line-a-day chore should not
   out-weigh the filters and charts under it. */
.kpi-import-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.kpi-import-btn{
  display:inline-flex;align-items:center;gap:8px;font-size:12px;font-weight:700;
  padding:10px 20px;border-radius:22px;border:0.5px solid var(--border);
  background:var(--glass-card);color:var(--text);font-family:inherit;cursor:pointer;
  transition:border-color .2s,color .2s,background .2s,transform .12s,box-shadow .3s;
}
.kpi-import-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent);transform:translateY(-1px)}
.kpi-import-btn:active:not(:disabled){transform:translateY(0)}
.kpi-import-btn:disabled{opacity:.7;cursor:default}
.kpi-import-btn i{font-size:14px}
/* Spinning while a file is being read, so the button says it is working. */
.kpi-import-btn.kpi-import-busy i{animation:kpi-spin .9s linear infinite}
@keyframes kpi-spin{to{transform:rotate(360deg)}}
/* Today's export has not landed — the button asks for it rather than
   waiting to be noticed. */
.kpi-import-btn.kpi-import-due{border-color:var(--accent);color:var(--accent);animation:kpi-pulse 2s ease-in-out infinite}
@keyframes kpi-pulse{
  0%,100%{box-shadow:0 0 0 0 rgba(79,195,247,0.42)}
  50%{box-shadow:0 0 0 9px rgba(79,195,247,0)}
}
.kpi-import-btn.kpi-import-ok{border-color:var(--success);color:var(--success)}
.kpi-import-status{font-size:11px;color:var(--text3)}
.kpi-alert{
  display:flex;align-items:center;gap:9px;padding:11px 16px;border-radius:12px;
  border:0.5px solid var(--warn);background:rgba(245,158,11,0.10);
  font-size:12px;font-weight:600;color:var(--text);
}
.kpi-alert i{font-size:14px;color:var(--warn);flex-shrink:0}

.docs-exp-alert{
  display:flex;align-items:center;gap:9px;padding:11px 16px;border-radius:12px;
  border:0.5px solid var(--warn);background:rgba(245,158,11,0.10);
  font-size:12px;font-weight:600;color:var(--text);margin:0 0 10px;
}
.docs-exp-alert i{font-size:14px;color:var(--warn);flex-shrink:0}
.docs-exp-alert.docs-exp-alert-danger{border-color:var(--danger);background:rgba(239,68,68,0.10)}
.docs-exp-alert.docs-exp-alert-danger i{color:var(--danger)}

.doc-exp-badge{
  display:inline-block;margin-left:7px;padding:2px 7px;border-radius:99px;
  font-size:9px;font-weight:700;vertical-align:middle;white-space:nowrap;
  background:var(--input-bg);color:var(--text3);border:0.5px solid var(--border2);
}
.doc-exp-badge.doc-exp-warn{color:var(--warn);border-color:var(--warn);background:rgba(245,158,11,0.12)}
.doc-exp-badge.doc-exp-expired{color:var(--danger);border-color:var(--danger);background:rgba(239,68,68,0.12)}

.doc-exp-btn{
  display:flex;align-items:center;justify-content:center;width:30px;height:30px;flex-shrink:0;
  border-radius:8px;border:0.5px solid var(--border);background:var(--input-bg);color:var(--text3);
  cursor:pointer;font-size:13px;
}
.doc-exp-btn:hover{border-color:var(--accent);color:var(--accent)}

.kpi-filters{display:flex;flex-wrap:wrap;gap:10px 14px;padding:12px 18px 16px}
.kpi-filter-ctl{display:flex;flex-direction:column;gap:3px;min-width:0}
.kpi-filter-ctl > span{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3)}
.kpi-filter-ctl select,.kpi-filter-ctl input{
  font-size:11px;padding:6px 9px;border-radius:8px;border:0.5px solid var(--border);
  background:var(--input-bg);color:var(--text);font-family:inherit;outline:none;min-width:140px;
}
.kpi-filter-ctl select:focus,.kpi-filter-ctl input:focus{border-color:var(--accent)}
.kpi-filter-narrow input{min-width:82px;width:82px}
.kpi-mini-cal{display:flex;flex-direction:column;gap:4px;min-width:184px}
.kpi-mini-cal-head{display:flex;align-items:center;justify-content:space-between;gap:6px}
.kpi-mini-cal-head span{font-size:10px;font-weight:700;color:var(--text2)}
.kpi-mini-cal-nav{
  display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;
  border-radius:6px;border:0.5px solid var(--border);background:var(--input-bg);color:var(--text2);
  cursor:pointer;font-size:11px;transition:border-color .15s var(--ease-out,ease),color .15s var(--ease-out,ease),transform var(--dur-fast) var(--ease-out);
}
.kpi-mini-cal-nav:hover{border-color:var(--accent);color:var(--text)}
.kpi-mini-cal-dow{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.kpi-mini-cal-dow span{font-size:9px;font-weight:700;text-align:center;color:var(--text3)}
.kpi-mini-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.kpi-cal-day{
  display:flex;align-items:center;justify-content:center;aspect-ratio:1;padding:0;
  border-radius:6px;border:0.5px solid transparent;background:transparent;color:var(--text2);
  font-size:10px;font-family:inherit;cursor:pointer;transition:background .15s var(--ease-out,ease),border-color .15s var(--ease-out,ease),transform var(--dur-fast) var(--ease-out);
}
.kpi-cal-day:hover:not(:disabled){border-color:var(--accent);color:var(--text)}
.kpi-cal-day.today{font-weight:700;color:var(--accent)}
.kpi-cal-day.selected{background:var(--accent);color:#fff;font-weight:700}
.kpi-cal-day.no-data,.kpi-cal-day:disabled{color:var(--text3);opacity:.35;cursor:default}
/* Each chart asks its own question — the picker sits in the card head so
   the choice is read together with the title it changes. */
.kpi-chart-pick{
  font-size:10px;font-weight:600;padding:4px 8px;border-radius:7px;border:0.5px solid var(--border);
  background:var(--input-bg);color:var(--text2);font-family:inherit;outline:none;max-width:60%;
}
.kpi-chart-pick:focus{border-color:var(--accent)}

.kpi-summary-body{padding:18px;text-align:center}
.kpi-summary-value{font-size:44px;font-weight:800;display:flex;align-items:center;justify-content:center;gap:10px;letter-spacing:-.01em}
.kpi-summary-value .ti{font-size:26px}
.kpi-summary-label{font-size:11px;color:var(--text3);margin-top:4px;font-weight:600}
.kpi-summary-delta{font-size:12px;font-weight:700;margin-top:5px}
.kpi-summary-sub{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 22px;margin-top:12px;padding-top:12px;border-top:0.5px solid var(--border2)}
.kpi-summary-stat{text-align:center}
.kpi-summary-stat span{display:block;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3)}
.kpi-summary-stat strong{font-size:16px;font-weight:700;color:var(--text)}
.kpi-summary-missing{font-size:10px;color:var(--text3);margin-top:9px;opacity:.85}
.kpi-empty{display:flex;flex-direction:column;align-items:center;gap:6px;padding:24px 20px;text-align:center;color:var(--text3);font-size:12px}
.kpi-empty i{font-size:26px;color:var(--accent);opacity:.5}

/* Three across when three fit, two when they do not, one on a phone —
   rather than three-or-one with nothing in between. At 1200px the fixed
   three-column grid gave each chart a 206px-wide canvas, which is where the
   axis labels started landing on top of each other; a minimum width lets the
   row break instead of squeezing. */
/* Flex, not grid. Each section has four chart cards in the markup and three
   on screen: "By person" is the team's chart and "Against the team" is one
   person's, so each view hides the other's. Flex items that can grow fill
   whatever row they land on, so a card shown or hidden is simply one more or
   one fewer item, with no column count to keep in step. */
.kpi-chart-grid{display:flex;flex-wrap:wrap;gap:18px}
.kpi-chart-grid > .pbi-card{flex:1 1 300px;min-width:0}
/* Every card's chart starts at the same height, so a title that wraps to two
   lines ("Breakdown by day" at the narrow end) cannot push its own chart down
   past the one beside it. */
.kpi-chart-grid > .pbi-card > .pbi-head{min-height:52px;box-sizing:border-box}
@media(max-width:720px){.kpi-chart-grid > .pbi-card{flex:1 1 100%}}
/* The card decides the height and the canvas fills it — see kpiFrame() in
   11-kpi.js, which had to set maintainAspectRatio:false before this box
   meant anything. 280 rather than 260: the legend and the hour axis both sit
   inside it now. */
.kpi-chart-wrap{position:relative;height:280px;padding:16px 18px 6px}
.kpi-chart-values{display:flex;flex-wrap:wrap;justify-content:center;gap:18px;padding:0 18px 14px;font-size:11px;font-weight:600;color:var(--text3)}
.kpi-chart-values strong{color:var(--text);font-weight:800}
.kpi-chart-note{font-size:10px;color:var(--text3);text-align:center;padding:0 18px 14px;opacity:.8}

/* The numbers behind the charts, for anyone who would rather read them. */
.kpi-table-wrap{overflow-x:auto;padding:4px 18px 16px}
.kpi-table{width:100%;border-collapse:collapse;font-size:12px}
.kpi-table th{
  text-align:left;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  color:var(--text3);padding:8px 10px;border-bottom:0.5px solid var(--border2);white-space:nowrap;
}
.kpi-table td{padding:8px 10px;border-bottom:0.5px solid var(--border2);color:var(--text);white-space:nowrap}
.kpi-table tbody tr:last-child td{border-bottom:none}
.kpi-table-empty{color:var(--text3);font-size:12px;padding:16px 10px!important;text-align:center}
.kpi-pill{display:inline-block;font-size:9px;font-weight:800;padding:2px 8px;border-radius:var(--r-lg);letter-spacing:.04em}
.kpi-pill.ok{background:rgba(34,197,94,0.16);color:#22C55E}
.kpi-pill.bad{background:rgba(239,68,68,0.16);color:#EF4444}

/* The email section is the one thing on the analyzer that follows a row of
   buttons rather than a card. Every other section sits 32px below the card
   above it, and 32px below a dense strip of controls does not read the same:
   the heading looks like a label belonging to the buttons rather than the
   start of something new. It gets its own separation for that reason, not
   because 32px was wrong everywhere else. */
/* The written email sits well clear of the toolbar that produced it. 56px with
   nothing between them still read as one block, because a row of buttons is
   visually heavy and the email card is heavier — two slabs with a gap look
   stacked, not separated. The rule above carries its own margin, so this is
   the space under that rule. */
.email-section{margin-top:34px}
#email-divider{margin:44px 0 0}

/* ── 15 · LOBBY GROUPS ────────────────────────────────────────────────────
   The sidebar has always grouped these — Underwriting, Reporting, Team — and
   the lobby laid the same eleven destinations out flat. Somebody who learned
   one map could not use it on the other. Same three names, same order, so
   there is one taxonomy to learn.
   The label is styled like the sidebar's group label, deliberately: it is the
   same idea and should not need recognising twice. */
.desk-group-title{
  font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;
  color:var(--text3);margin:26px 2px 10px;
  display:flex;align-items:center;gap:8px;
}
.desk-group-title:first-of-type{margin-top:6px}

/* One colored logo chip per group, pulled straight from the app's own
   --pal-* identity palette — the same colors already used to tell people
   apart, reused here to tell sections apart. Purely decorative (::before),
   so it never touches the text every CI check reads. */
.desk-group-title::before{
  content:'';width:18px;height:18px;border-radius:6px;flex-shrink:0;
  background-repeat:no-repeat;background-position:center;background-size:10px 10px;
  box-shadow:0 2px 6px rgba(0,0,0,.18);
}
.desk-group-title.gg-analyze::before{background-color:var(--pal-blue);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 3v18h18M7 15l4-5 3 3 5-7'/%3E%3C/svg%3E")}
.desk-group-title.gg-track::before{background-color:var(--pal-teal);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='7' height='7' rx='1.2'/%3E%3Crect x='13' y='4' width='7' height='7' rx='1.2'/%3E%3Crect x='4' y='13' width='7' height='7' rx='1.2'/%3E%3Crect x='13' y='13' width='7' height='7' rx='1.2'/%3E%3C/svg%3E")}
.desk-group-title.gg-document::before{background-color:var(--pal-amber);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 4h13l3 3v13H4z'/%3E%3Cpath d='M8 8h8M8 12h8M8 16h5'/%3E%3C/svg%3E")}
.desk-group-title.gg-coordinate::before{background-color:var(--pal-indigo);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='8' cy='8' r='3.2'/%3E%3Ccircle cx='16' cy='16' r='3.2'/%3E%3Cpath d='M11 8h4M8 11v4'/%3E%3C/svg%3E")}
.desk-group-title.gg-administer::before{background-color:var(--pal-green);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 2v20M6 8l6-6 6 6M6 16l6 6 6-6'/%3E%3C/svg%3E")}
.desk-group-title.gg-breaks::before{background-color:var(--pal-slate);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8'/%3E%3Cpath d='M9 10h.01M15 13h.01'/%3E%3Cpath d='M8.5 15c1 1 2 1.4 3.5 1.4s2.5-.4 3.5-1.4'/%3E%3C/svg%3E")}
.desk-group-title.gg-submit::before{background-color:var(--pal-blue);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 2 11 13'/%3E%3Cpath d='M22 2 15 22 11 13 2 9 22 2Z'/%3E%3C/svg%3E")}
.desk-group-title.gg-finalize::before{background-color:var(--pal-green);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E")}
.desk-group-title.gg-features::before{background-color:var(--pal-indigo);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13 2 3 14h7l-1 8 10-12h-7l1-8Z'/%3E%3C/svg%3E")}

/* Everything outside the first group sits on the same three columns the grid
   uses, so a card is the same size wherever it lands. */
/* Carries .desk-grid as well, rather than redeclaring its columns. Written
   out separately the two drifted by six pixels — the same card came out 407
   wide in one and 413 in the other — and a card that changes size depending
   on which group it landed in is the problem this was meant to fix. */
.desk-row{grid-template-rows:auto}

/* Games. Not hidden — it just stops competing with the tools people are
   measured on: quieter heading, and the card at the width of one column
   rather than stretched across the row. */
.desk-group-title-quiet{opacity:.55}
.desk-row-quiet{opacity:.78;transition:opacity var(--dur) var(--ease-out)}
.desk-row-quiet:hover{opacity:1}

/* ══════════════════════════════════════════════════════════════════════════
   GENERAL TRACKER
   Built from the tokens the rest of the app already defines — --glass-card,
   --border, --accent, --r-lg — so it reads as the same application rather
   than as a dashboard bolted onto it. No new colour scale is introduced;
   status colours reuse the semantic ones (--ok/--warn/--danger) that the
   market fit panels already use for the same meanings.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Sent to market, on the Analyzer ── */
.gt-sent-card{
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);
  padding:16px 18px;margin:18px 0 4px;
}
.gt-sent-head{display:flex;align-items:flex-start;gap:11px;margin-bottom:12px}
.gt-sent-head > .ti{font-size:16px;color:var(--accent);margin-top:1px}
.gt-sent-title{font-size:13px;font-weight:700;color:var(--text)}
.gt-sent-sub{font-size:11px;color:var(--text3);line-height:1.5;margin-top:2px;max-width:62ch}
.gt-sent-count{
  margin-left:auto;font-size:10px;font-weight:700;color:var(--text3);
  background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-lg);
  padding:4px 11px;white-space:nowrap;
}
.gt-sent-body{display:flex;flex-direction:column;gap:6px}
.gt-sent-row{
  display:flex;align-items:center;gap:11px;padding:8px 12px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-sm);
}
.gt-sent-dot{width:6px;height:6px;border-radius:50%;background:var(--success);flex-shrink:0}
.gt-sent-name{font-size:12px;font-weight:600;color:var(--text);flex:1;min-width:0}
.gt-sent-toggle{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text2);cursor:pointer;user-select:none}
.gt-sent-toggle input{accent-color:var(--accent);cursor:pointer}
/* Program, Status and Premium share one row; the two dropdowns come out 2px
   taller than the text box from this same padding, so all three are pinned. */
.gt-sent-prog{
  font-size:11px;padding:4px 8px;border:0.5px solid var(--border);border-radius:6px;
  background:var(--input-bg);color:var(--text);outline:none;font-family:inherit;min-width:132px;
  min-height:25px;
}
.gt-sent-foot{display:flex;align-items:center;gap:12px;margin-top:12px}
.gt-sent-note{font-size:11px;color:var(--text3);flex:1}

/* ── The screen ── */
/* CRM and Data are how the whole screen is chosen, not one filter among
   many — centered and sized up so they read as the screen's two modes, not
   another control on the toolbar. */
/* The three circular actions on the account review panel — Open in the
   Analyzer, Pricing Console, Library. One shape shared by all three, sized
   and styled the same on purpose (per the desk's spec: the other two match
   the first, not the other way around). The label only shows on hover/focus
   — three names sitting under the icons all the time crowded a header that
   already carries the panel title, the saved-on note and the icons
   themselves. */
.gt-circle-actions{display:flex;gap:10px;margin-left:auto}
.gt-circle-btn{
  position:relative;width:36px;height:36px;border-radius:50%;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;padding:0;
  background:var(--glass3);border:0.5px solid var(--border);color:var(--text2);
  cursor:pointer;font-family:inherit;
  transition:transform .18s var(--ease-out),background .18s var(--ease-out),
    box-shadow .18s var(--ease-out),color .18s var(--ease-out);
}
.gt-circle-btn svg{width:16px;height:16px;display:block}
.gt-circle-btn i{font-size:14px;line-height:1}
.gt-circle-btn:hover,.gt-circle-btn:focus-visible{background:var(--accent);color:#fff;
  transform:scale(1.08);box-shadow:0 6px 18px rgba(77,143,230,0.35)}
.gt-circle-btn:active{transform:scale(.94)}
/* Below the button, not above it: .gt-panel (this button's container) is
   overflow:hidden — a tooltip placed above sat right where the panel's own
   top padding starts, so it was clipped the moment it grew past ~8px, which
   for three-word labels was every time. There is a whole panel body below
   the header these buttons sit in, so downward has the room upward never
   did. */
.gt-circle-tip{
  position:absolute;top:calc(100% + 8px);left:50%;
  transform:translateX(-50%) translateY(-4px);
  background:#0a0c14;color:#fff;font-size:10px;font-weight:600;white-space:nowrap;
  padding:5px 9px;border-radius:8px;pointer-events:none;opacity:0;
  transition:opacity .15s ease,transform .15s ease;box-shadow:0 4px 14px rgba(0,0,0,0.3);
}
.gt-circle-btn:hover .gt-circle-tip,.gt-circle-btn:focus-visible .gt-circle-tip{
  opacity:1;transform:translateX(-50%) translateY(0)}
@media(prefers-reduced-motion:reduce){
  .gt-circle-btn{transition:background .18s,color .18s}
  .gt-circle-btn:hover,.gt-circle-btn:focus-visible,.gt-circle-btn:active{transform:none}
}

.gt-tabs{display:flex;justify-content:center;gap:12px;margin-bottom:20px}
.gt-tab{
  display:flex;align-items:center;gap:8px;font-size:14px;font-weight:700;font-family:inherit;
  padding:12px 30px;border-radius:24px;cursor:pointer;color:var(--text3);
  background:var(--glass3);border:0.5px solid var(--border);
  transition:color var(--dur) var(--ease-out),background var(--dur) var(--ease-out),
    transform .18s var(--ease-out),box-shadow .18s var(--ease-out);
}
.gt-tab:hover{color:var(--text2);transform:scale(1.045)}
.gt-tab:active{transform:scale(.97)}
.gt-tab.active{color:#fff;background:var(--accent);border-color:transparent;
  box-shadow:0 6px 20px rgba(77,143,230,0.38)}
.gt-tab.active:hover{transform:scale(1.03)}
@media(prefers-reduced-motion:reduce){.gt-tab{transition:color var(--dur) var(--ease-out),background var(--dur) var(--ease-out)}
  .gt-tab:hover,.gt-tab:active,.gt-tab.active:hover{transform:none}}

.gt-kpi-row{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-bottom:16px}
.gt-kpi{
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:14px;padding:14px 16px;
}
.gt-kpi-label{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text3)}
.gt-kpi-val{font-size:24px;font-weight:700;color:var(--text);line-height:1.15;margin:5px 0 3px;letter-spacing:-.02em}
.gt-kpi-note{font-size:10px;color:var(--text3)}

.gt-filter-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.gt-search{
  display:flex;align-items:center;gap:6px;flex:1;min-width:230px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-lg);padding:6px 14px;
}
.gt-search input{border:none;background:transparent;font-size:12px;color:var(--text);outline:none;font-family:inherit;width:100%}

/* ── The filter builder ──
   Built out of the pieces already on this screen — .dt-filter-select for the
   operator pickers, .docs-chip for the toggle, .avp-btn for Add filter — so a
   panel that only opens sometimes does not read as part of a different app.
   Nothing here is inside .gt-table-wrap: the table is fitted to the panel by
   column priority and must stay free of a sideways scroll, and a control row
   that widened it would undo that at exactly the widths it was measured for. */
.gt-adv{
  background:var(--glass-card);border:0.5px solid var(--border);border-radius:14px;
  padding:12px 14px;margin:-4px 0 12px;
}
.gt-adv[hidden]{display:none}
.gt-adv-rules{display:flex;flex-direction:column;gap:8px}
.gt-adv-none{font-size:11px;color:var(--text3);line-height:1.5;max-width:62ch}
.gt-rule{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* The field name is fixed width so a column of rules lines its operators up.
   Ragged, the eye has to find the operator on every row. */
.gt-rule-field{
  font-size:11px;font-weight:700;color:var(--text2);min-width:132px;
  text-transform:uppercase;letter-spacing:.05em;
}
.gt-rule-op{min-width:150px}
.gt-rule-op:disabled{opacity:.75;cursor:default}
.gt-rule-val{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.gt-rule-and{font-size:11px;color:var(--text3)}
.gt-rule-in{
  padding:6px 12px;border:0.5px solid var(--border2);border-radius:var(--r-lg);
  background:var(--glass3);color:var(--text);font-size:11px;font-family:inherit;
  outline:none;min-width:132px;
}
.gt-rule-in:focus{border-color:var(--accent)}
.gt-rule-x{
  background:none;border:none;color:var(--text3);cursor:pointer;padding:3px 5px;
  border-radius:5px;font-size:13px;line-height:1;
}
.gt-rule-x:hover{color:var(--danger);background:var(--glass3)}
.gt-adv-add{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:11px;
  padding-top:11px;border-top:0.5px solid var(--border)}
.gt-adv-addbtn{font-size:11px;padding:6px 12px;min-height:32px}
.gt-adv-hint{font-size:10px;color:var(--text3)}

/* Multi-select: the values a column actually holds, ticked. Anchored to its
   own button rather than to the panel, so two of them open side by side do not
   land on top of one another. */
.gt-ms{position:relative}
.gt-ms-btn{
  display:inline-flex;align-items:center;gap:6px;
  padding:6px 12px;border:0.5px solid var(--border2);border-radius:var(--r-lg);
  background:var(--glass3);color:var(--text2);font-size:11px;font-family:inherit;
  cursor:pointer;min-width:132px;
}
.gt-ms.open .gt-ms-btn{border-color:var(--accent);color:var(--text)}
.gt-ms-btn i{font-size:11px;margin-left:auto}
.gt-ms-pop{
  position:absolute;top:calc(100% + 5px);left:0;z-index:40;width:246px;
  background:var(--glass-card);border:0.5px solid var(--border2);border-radius:12px;
  backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  box-shadow:0 14px 38px rgba(0,0,0,.28);padding:8px;
}
.gt-ms-find{
  display:flex;align-items:center;gap:6px;padding:5px 10px;margin-bottom:6px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-lg);
}
.gt-ms-find i{font-size:11px;color:var(--text3)}
.gt-ms-find input{
  border:none;background:transparent;outline:none;width:100%;
  font-size:11px;font-family:inherit;color:var(--text);
}
.gt-ms-acts{display:flex;gap:6px;margin-bottom:6px}
.gt-ms-acts button{
  flex:1;padding:4px 8px;border:0.5px solid var(--border);border-radius:var(--r-lg);
  background:var(--glass3);color:var(--text2);font-size:10px;font-family:inherit;
  font-weight:600;cursor:pointer;
}
.gt-ms-acts button:hover{background:var(--glass2);color:var(--text)}
.gt-ms-list{max-height:212px;overflow-y:auto;display:flex;flex-direction:column;gap:1px}
.gt-ms-opt{
  display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;
  font-size:11px;color:var(--text2);cursor:pointer;
}
.gt-ms-opt:hover{background:var(--glass3);color:var(--text)}
.gt-ms-opt input{accent-color:var(--accent);cursor:pointer;margin:0}
.gt-ms-opt span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gt-ms-none{font-size:11px;color:var(--text3);padding:8px}

/* What is narrowing the table, in the reader's line of sight above it. The
   colour is the accent rather than a neutral: a filter left on by mistake is
   the difference between "we wrote 40 accounts this month" and the truth. */
.gt-active-filters{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 12px}
.gt-active-filters[hidden]{display:none}
.gt-chip-lead{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--text3)}
.gt-chip-filter{
  display:inline-flex;align-items:center;gap:6px;
  padding:5px 11px;border-radius:99px;font-size:11px;font-weight:600;
  font-family:inherit;cursor:pointer;white-space:nowrap;
  background:var(--accent-soft);border:0.5px solid var(--border2);color:var(--accent);
}
.gt-chip-filter i{font-size:11px;opacity:.7}
.gt-chip-filter:hover{background:var(--glass2);color:var(--text)}
.gt-chip-clear{
  display:inline-flex;align-items:center;gap:5px;
  padding:5px 11px;border-radius:99px;font-size:11px;font-weight:600;
  font-family:inherit;cursor:pointer;white-space:nowrap;
  background:var(--glass3);border:0.5px solid var(--border);color:var(--text3);
}
.gt-chip-clear i{font-size:11px}
.gt-chip-clear:hover{background:var(--glass2);color:var(--text)}
/* The count on the collapsed toggle: the panel can be shut and still be doing
   something, and a shut panel that says nothing is the invisible filter. */
.gt-adv-n{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:16px;height:16px;padding:0 4px;margin-left:2px;
  border-radius:99px;background:var(--accent);color:#fff;
  font-size:9px;font-weight:700;line-height:1;
}
.gt-adv-n[hidden]{display:none}

/* ── Radial menus ──────────────────────────────────────────────────────────
   One circular trigger per group (Filters/Clear; Import, Export, All
   columns, Charts) instead of every action sitting as its own box in the
   toolbar. .gt-radial-items is positioned so each child fans out from the
   trigger along a quarter-circle arc opening down-and-left — the trigger
   sits at the row's right edge in both places this is used, so that is the
   one direction with clear room in every layout this appears in. The arc
   itself is per-item nth-child transforms rather than computed in JS: the
   groups this serves each have a fixed, known item count (2, 3 or 4), so
   there is nothing dynamic to compute. */
.gt-radial{position:relative;display:inline-flex}
.gt-radial-trigger{
  position:relative;z-index:2;width:34px;height:34px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:var(--glass);border:0.5px solid var(--border);color:var(--text2);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  box-shadow:var(--shadow);cursor:pointer;font-size:14px;
  transition:transform var(--dur-fast) var(--ease-spring),background var(--dur-fast),color var(--dur-fast),border-color var(--dur-fast);
}
.gt-radial-trigger:hover{background:var(--glass2);color:var(--text)}
.gt-radial.open .gt-radial-trigger{background:var(--accent-soft);border-color:var(--border2);color:var(--accent);transform:rotate(90deg)}
.gt-radial-badge{
  position:absolute;top:-3px;right:-3px;
  display:inline-flex;align-items:center;justify-content:center;
  min-width:15px;height:15px;padding:0 3px;border-radius:99px;
  background:var(--accent);color:#fff;font-size:9px;font-weight:700;line-height:1;
}
.gt-radial-badge[hidden]{display:none}
.gt-radial-items{position:absolute;top:0;right:0;width:34px;height:34px;pointer-events:none}
.gt-radial-items>*{
  position:absolute;top:0;right:0;margin:0!important;
  opacity:0;transform:translate(0,0) scale(.4);
  transition:transform .32s cubic-bezier(.34,1.4,.64,1),opacity .2s var(--ease-out);
  pointer-events:none;
}
.gt-radial.open .gt-radial-items>*{opacity:1;pointer-events:auto}
/* Filters/Clear and Import·Export·All columns·Charts fan out labelled pills
   (docs-chip/avp-btn), not the circular icon-only buttons the arc transforms
   below them were sized for — arced along a diagonal, each pill's own width
   carried it straight into the next one's box, landing text-on-text (Export
   to Excel over Import Excel, Clear over Filters). A straight vertical
   drop-down avoids that by construction: every pill only ever displaces the
   ones after it along one axis, the same way an ordinary menu list does, and
   gap does the spacing instead of a hand-placed offset per item. Right-
   aligned under the trigger — both triggers sit at the right edge of their
   row, and right-aligning keeps the menu from overflowing past the panel's
   own right edge the way left-aligning a wide "Export to Excel" pill would. */
.gt-radial-2 .gt-radial-items,.gt-radial-3 .gt-radial-items,.gt-radial-4 .gt-radial-items{
  top:100%;bottom:auto;right:0;left:auto;width:auto;height:auto;
  display:flex;flex-direction:column;align-items:flex-end;gap:10px;
  padding-top:12px;
}
.gt-radial-2 .gt-radial-items>*,.gt-radial-3 .gt-radial-items>*,.gt-radial-4 .gt-radial-items>*{
  position:static;top:auto;right:auto;
  transform:translateY(-8px) scale(.7);
}
.gt-radial.open.gt-radial-2 .gt-radial-items>*,.gt-radial.open.gt-radial-3 .gt-radial-items>*,.gt-radial.open.gt-radial-4 .gt-radial-items>*{transform:translateY(0) scale(1)}
/* The DocuHub trigger keeps .gt-circle-btn (see its own comment above) so it
   is still hovered — and still showing its own "DocuHub" tooltip — the
   instant the fan opens under it, both landing in the same top:100% strip
   below the button and overlapping. Every other .gt-circle-btn never opens
   anything on top of its own tooltip, so this only ever shows up here. */
.gt-radial.open .gt-circle-tip{opacity:0!important}
.gt-radial-2 .gt-radial-items>*:nth-child(1){transition-delay:.02s}
.gt-radial-2 .gt-radial-items>*:nth-child(2){transition-delay:.06s}
.gt-radial-3 .gt-radial-items>*:nth-child(1){transition-delay:.02s}
.gt-radial-3 .gt-radial-items>*:nth-child(2){transition-delay:.06s}
.gt-radial-3 .gt-radial-items>*:nth-child(3){transition-delay:.1s}
.gt-radial-4 .gt-radial-items>*:nth-child(1){transition-delay:.02s}
.gt-radial-4 .gt-radial-items>*:nth-child(2){transition-delay:.06s}
.gt-radial-4 .gt-radial-items>*:nth-child(3){transition-delay:.1s}
.gt-radial-4 .gt-radial-items>*:nth-child(4){transition-delay:.14s}

/* Sidebar utility radial — a straight vertical stack rather than the arcs
   above. Those arcs (nth-child transforms) assume a fixed, always-fully-
   visible item count; three of these six items hide themselves entirely
   while CRM HUB is open (body.gt-context, see #nav-tutorial-btn etc.
   above), which would leave a gap in a fixed arc where a hidden item's own
   slot used to be. A flex column only ever stacks whatever is actually
   visible, however many that is, and closes the gap on its own. It also
   only ever moves straight up — this sidebar is 74px wide in icons-only
   mode, and any sideways drift (the toolbar arcs above both use some) would
   push an item straight out of it. */
.gt-radial-side{display:flex;justify-content:center;transition:margin-top .2s var(--ease-out)}
/* The fan's own 254px (6×34 + 5×8 gap + 10 padding) climbs straight up from
   here via .gt-radial-items' position:absolute — nothing in normal flow
   reserved that room, so it used to open directly on top of whatever
   nav-item icons already sat above the trigger. margin-top here grows
   .nav-footer's own auto height by exactly that much, which — since
   .nav-items is the sibling flex:1 filling whatever .nav-footer does not —
   shrinks .nav-items by the same 254px from the bottom (nothing shown is
   actually removed, just scrolled a little further down), clearing the
   fan's own landing spot without moving .gt-radial-side itself: the
   trigger's own row grew by the same 254 nav-footer just gained, so its
   screen position — and the fan's — is unchanged. Deliberately margin-top,
   not margin-bottom on .nav-items: margin-bottom failed to compute at all
   on that flex:1/overflow-y:auto item in testing (confirmed even with an
   inline !important — a genuine layout quirk, not a specificity miss),
   where margin-top/padding-bottom/border-bottom all applied normally. The
   element itself carries its own inline style="margin:0 auto 6px" (see
   index.html) for its default centering/spacing — an inline style always
   wins over a stylesheet rule with no !important of its own, whatever its
   specificity, so this needs one too. */
.gt-radial-side.open{margin-top:254px!important}
.gt-radial-side .gt-radial-items{
  position:absolute;bottom:100%;top:auto;left:50%;right:auto;width:auto;height:auto;
  transform:translateX(-50%);
  display:flex;flex-direction:column-reverse;align-items:center;gap:8px;
  padding-bottom:10px;pointer-events:none;
}
/* A sibling class rather than a second .gt-radial-trigger on each of these:
   that class also carries ".gt-radial.open .gt-radial-trigger{transform:
   rotate(90deg);background:...;color:var(--accent)}", meant for the one
   circular button that opens the fan — reusing it here would rotate every
   fanned item 90° once open (fought back to upright by the transform below,
   at equal specificity only because this rule is later in the file — a
   fight not worth leaving in place) and force Sign out's red to the same
   accent blue as the rest while open. */
.gt-radial-side-btn{
  position:static;z-index:2;width:34px;height:34px;border-radius:50%;margin:0!important;
  display:flex;align-items:center;justify-content:center;
  background:var(--glass);border:0.5px solid var(--border);color:var(--text2);
  backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  box-shadow:var(--shadow);cursor:pointer;font-size:14px;
  opacity:0;transform:translateY(10px) scale(.5);
  transition:transform .28s cubic-bezier(.34,1.4,.64,1),opacity .18s var(--ease-out),background var(--dur-fast),color var(--dur-fast);
  pointer-events:none;
}
.gt-radial-side-btn:hover{background:var(--glass2);color:var(--text)}
/* Sign out's own red only ever reached the button — the nav footer's blanket
   .nav-footer,.nav-footer *{color:rgba(255,255,255,0.75)} rule (it keeps the
   sidebar's icons one consistent, quiet tone against the dark rail) matches
   the <i> glyph directly and beats plain inheritance, so an icon-only button
   with no text of its own to actually show the inline red stayed the same
   grey as the other five. Specific enough here to outrank that rule. */
.gt-radial-side-btn.gt-radial-side-danger,
.gt-radial-side-btn.gt-radial-side-danger i{color:var(--danger)}
.gt-radial-side-btn.gt-radial-side-danger:hover{background:var(--danger-soft);color:var(--danger)}
.gt-radial-side.open .gt-radial-items>*{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}
.gt-radial-side .gt-radial-items>*:nth-child(1){transition-delay:.02s}
.gt-radial-side .gt-radial-items>*:nth-child(2){transition-delay:.05s}
.gt-radial-side .gt-radial-items>*:nth-child(3){transition-delay:.08s}
.gt-radial-side .gt-radial-items>*:nth-child(4){transition-delay:.11s}
.gt-radial-side .gt-radial-items>*:nth-child(5){transition-delay:.14s}
.gt-radial-side .gt-radial-items>*:nth-child(6){transition-delay:.17s}

.gt-table-wrap{background:var(--glass-card);border:0.5px solid var(--border);border-radius:14px;overflow:hidden}
.gt-table{width:100%;border-collapse:collapse;font-size:12px;white-space:nowrap}
/* Sixteen columns want 1,792px and a laptop panel gives about 1,280, so a third
   of the table hung off the right edge — and reading a status meant scrolling
   away from the account name it belonged to.

   Columns are drawn by how far down the queue they are, widest screen first.
   Prio 1 is what a record is read for and is always there; prio 2 is context;
   prio 3 is reference data somebody goes looking for on purpose. The widths are
   the measured ones: prio 1 needs ~1,000px, and each tier is admitted at the
   point the panel can actually hold it rather than at a round number.

   body.gt-all-cols is the toolbar's All columns — the full sixteen and the
   sideways scroll back, for the times you do want the FEIN beside the SOLVOID.
   The export never reads any of this. */
/* The numbers are the measured ones, not round ones. All sixteen come to
   1,686px and the panel is the window less about 234px of sidebar and padding,
   so they need a 1,920 window; prio 1 and 2 come to 1,300 and need 1,560. Set
   any lower and the tier is admitted to a panel that cannot hold it, which is
   the sideways scroll again with fewer columns in it. */
@media(max-width:1919.98px){
  body:not(.gt-all-cols) .gt-table th.gt-p3,
  body:not(.gt-all-cols) .gt-table td.gt-p3{display:none}
}
@media(max-width:1559.98px){
  body:not(.gt-all-cols) .gt-table th.gt-p2,
  body:not(.gt-all-cols) .gt-table td.gt-p2{display:none}
}
/* The one column that can afford to be long, and the only one that must not
   push the rest off: a name is elided rather than allowed to set the width. */
body:not(.gt-all-cols) .gt-table td.gt-strong{
  max-width:260px;overflow:hidden;text-overflow:ellipsis
}
.gt-table th{
  text-align:left;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  color:var(--text3);padding:10px 12px;border-bottom:0.5px solid var(--border);
  cursor:pointer;user-select:none;background:var(--glass3);
}
.gt-table th:hover{color:var(--text2)}
.gt-table th.gt-sorted{color:var(--accent)}
.gt-table td{padding:9px 12px;border-bottom:0.5px solid var(--border);color:var(--text2)}
.gt-table tbody tr{cursor:pointer;transition:background var(--dur) var(--ease-out)}
.gt-table tbody tr:hover{background:var(--glass3)}
.gt-table tbody tr:last-child td{border-bottom:none}
.gt-strong{color:var(--text);font-weight:600}
.gt-dim{color:var(--text3)}
.gt-num{text-align:right;font-variant-numeric:tabular-nums}
.gt-actions{white-space:nowrap;text-align:right}
.gt-actions button{
  background:none;border:none;color:var(--text3);cursor:pointer;padding:3px 5px;
  border-radius:5px;font-size:13px;
  transition:color var(--dur) var(--ease-out),transform var(--dur-fast) var(--ease-out);
}
.gt-actions button:hover{color:var(--accent);background:var(--glass3)}

.gt-tag{
  font-size:10px;font-weight:600;padding:2px 8px;border-radius:var(--r-lg);
  background:var(--glass3);border:0.5px solid var(--border);color:var(--text2);
}
.gt-pill{font-size:10px;font-weight:700;padding:2px 9px;border-radius:var(--r-lg);border:0.5px solid transparent}
/* The one column the records table folds every market an account went to
   into — a pill per market, wrapping onto a second line rather than forcing
   the row (and every other cell in it) wider the way .gt-table's default
   white-space:nowrap would. */
.gt-table td.gt-markets-cell{white-space:normal}
.gt-markets-cell .gt-pill{display:inline-block;margin:2px 3px 2px 0}
.gt-st-none{color:var(--text3);border-color:var(--border)}
.gt-q-yes,.gt-st-quoted,.gt-st-client{background:rgba(72,189,120,0.13);color:#48bd78;border-color:rgba(72,189,120,0.28)}
.gt-q-no,.gt-st-declined,.gt-st-blocked{background:rgba(232,93,93,0.12);color:#e85d5d;border-color:rgba(232,93,93,0.26)}
.gt-st-questions,.gt-st-missing-information,.gt-st-referral,.gt-st-price-indication{
  background:rgba(224,166,58,0.13);color:#e0a63a;border-color:rgba(224,166,58,0.28)}
.gt-st-closed,.gt-st-duplicate,.gt-st-no-markets{background:var(--glass3);color:var(--text3);border-color:var(--border)}
/* A submission the Add Record wizard saved before the 5 required fields were
   complete — not yet a real state like the others above, so it gets its own
   warning color rather than borrowing green/red/grey meaning that isn't true
   of it yet. */
.gt-st-draft{background:rgba(255,159,10,0.14);color:var(--warn);border-color:rgba(255,159,10,0.3)}

.gt-empty{padding:44px 20px;text-align:center;color:var(--text3);font-size:12px;line-height:1.6}
.gt-empty .ti{font-size:26px;display:block;margin-bottom:10px;opacity:.5}
.gt-pager{display:flex;align-items:center;justify-content:center;gap:12px;padding:11px;border-top:0.5px solid var(--border)}

/* ── Dashboard: one account at a time ──
   The reference layout is a stack of full-width cards — overview, review
   summary, markets in progress — rather than a grid of tiles, because each
   section is read top to bottom about the same submission. */
.gt-acct-bar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:14px}
.gt-acct-count{font-size:10px;color:var(--text3);margin-left:auto;white-space:nowrap}
/* The account picker chooses which account the whole dashboard shows below
   it — the one control on this bar everything else follows — so it carries
   the same "floating glass panel" recipe as #widget-dropdown and
   #calc-widget (--shadow-float, a real blur) rather than the flatter
   --glass3 the plain filter selects use. A native <select>'s own open list
   is outside CSS's reach in every browser, so this styles the closed
   control, the part actually on screen alongside the rest of the bar. */
#gt-acct-pick{
  background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);
  border:0.5px solid var(--border2);border-radius:var(--r-lg);
  box-shadow:var(--shadow-float);color:var(--text);font-weight:600;
  transition:box-shadow var(--dur-fast),border-color var(--dur-fast);
}
#gt-acct-pick:hover{border-color:var(--accent)}
#gt-acct-pick:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-float),0 0 0 3px var(--accent-soft)}
.gt-panel{
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:14px;padding:16px 18px;overflow:hidden;
  margin-bottom:12px;
}
.gt-panel-head{display:flex;align-items:center;gap:9px;margin-bottom:12px}
.gt-panel-head > span:first-of-type{font-size:13px;font-weight:700;color:var(--text)}
.gt-panel-note{font-size:10px;color:var(--text3);margin-left:auto}
.gt-panel-sub{font-size:11px;color:var(--text3);margin:-6px 0 12px}
.gt-panel-empty{font-size:12px;color:var(--text3);padding:16px 0}
.gt-panel-link{
  margin-left:auto;display:flex;align-items:center;gap:5px;font-family:inherit;
  font-size:11px;font-weight:600;color:var(--text2);cursor:pointer;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:8px;padding:5px 11px;
  transition:color var(--dur) var(--ease-out),transform var(--dur-fast) var(--ease-out);
}
.gt-panel-link:hover{color:var(--accent)}
.gt-panel-link-danger{margin-left:6px}
.gt-panel-link-danger:hover{color:var(--danger);border-color:var(--danger)}

/* Submission Overview: label above value, four to a row, separated by rules
   rather than by boxes so the eight facts read as one block. */
/* minmax(0,1fr), not 1fr: a plain 1fr floors at the content's min width, so
   at phone width the four columns refused to shrink and the whole page
   scrolled sideways — measured 507px of content in a 390px viewport. And
   four columns of an account's details are unreadable on a phone whatever
   the overflow does, so the count comes down with the width. */
.gt-ov-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;background:var(--border);border-radius:var(--r-sm);overflow:hidden}
@media (max-width:900px){ .gt-ov-grid{grid-template-columns:repeat(2,minmax(0,1fr))} }
@media (max-width:560px){ .gt-ov-grid{grid-template-columns:minmax(0,1fr)} }
.gt-ov-field{display:flex;flex-direction:column;gap:5px;padding:13px 15px;background:var(--glass-card)}
.gt-ov-field > span{font-size:10px;font-weight:600;color:var(--text3)}
.gt-ov-field > strong{display:flex;align-items:center;gap:6px;font-size:14px;font-weight:600;color:var(--text)}
.gt-ov-field > strong > .ti{font-size:13px;color:var(--text3)}
.gt-ov-money{color:var(--success)!important}

/* Agent/Agency: a corner pencil that swaps the value for an inline input,
   rounded to match the rest of the Analyzer/CRM controls rather than
   spawning a modal for a one-field correction. */

.gt-ov-edit-btn{position:absolute;top:8px;right:8px;width:20px;height:20px;display:flex;align-items:center;justify-content:center;padding:0;border:none;background:transparent;color:var(--text3);cursor:pointer;border-radius:6px;transition:background .15s var(--ease-out),color .15s var(--ease-out),transform var(--dur-fast) var(--ease-out)}
.gt-ov-edit-btn:hover{background:var(--glass3);color:var(--text)}
.gt-ov-edit-btn .ti{font-size:12px}

/* Mailing address edits four fields at once — street/city/state/zip need
   room to wrap onto a second line rather than being squeezed into one flush
   row the way a single-value field is. */
/* The overview as a form. One pencil opens every cell at once, so the cells
   need to read as a form rather than as eleven separate little editors. */
.gt-ov-input{width:100%;min-width:0;font-size:13px;padding:7px 10px;border:0.5px solid var(--border2);border-radius:var(--r-sm);background:var(--input-bg);color:var(--text);outline:none;font-family:inherit;transition:border-color .15s var(--ease-out),box-shadow .15s var(--ease-out)}
.gt-ov-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 18%,transparent)}
.gt-ov-editing{background:var(--glass2)}

/* The address takes half a row — two of the four columns — with Date
   received and Effective date beside it on the same line. A whole row was
   far longer than any address. On the two-column layout that is the whole
   row, and on the one-column phone layout it must not ask for a second
   column the grid does not have (span 2 there would invent one and scroll
   the page sideways). */
.gt-ov-field-addr{grid-column:span 2}
@media (max-width:560px){ .gt-ov-field-addr{grid-column:1 / -1} }
/* Three columns under a full-width street: ZIP, City, State — in the DOM
   order the row is typed in, and in the widths each is actually typed at.
   The ZIP used to be as wide as the street. */
.gt-ov-address-grid{display:grid;grid-template-columns:minmax(0,0.6fr) minmax(0,3fr) minmax(0,0.45fr);gap:8px;align-items:center}
.gt-ov-address-grid > input{min-width:0;font-size:13px;padding:7px 10px;border:0.5px solid var(--border2);border-radius:var(--r-sm);background:var(--input-bg);color:var(--text);outline:none;font-family:inherit;transition:border-color .15s var(--ease-out),box-shadow .15s var(--ease-out)}
.gt-ov-address-grid > input:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 18%,transparent)}
.gt-ov-a-street{grid-column:1 / -1}
.gt-ov-a-state{text-transform:uppercase}
.gt-ov-zip-note{grid-column:1 / -1;font-size:10px;color:var(--text3);min-height:13px}
@media (max-width:760px){
  .gt-ov-address-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .gt-ov-a-city{grid-column:1 / -1;order:3}
}
.gt-ov-save-link{color:var(--success)}

/* UW Review Summary: fit and not fit side by side, tinted with the semantic
   colours the market panels already use for the same two meanings. */
.gt-uw-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.gt-uw-box{border:0.5px solid var(--border);border-radius:12px;padding:14px 16px}
.gt-uw-fit{background:var(--success-soft);border-color:var(--success-border)}
.gt-uw-notfit,.gt-uw-blocked{background:rgba(232,93,93,0.07);border-color:rgba(232,93,93,0.22)}
.gt-uw-ref{background:rgba(224,166,58,0.08);border-color:rgba(224,166,58,0.24)}
.gt-uw-head{display:flex;align-items:center;gap:8px}
.gt-uw-head > .ti{font-size:16px}
.gt-uw-fit .gt-uw-head > .ti,.gt-uw-fit .gt-uw-title,.gt-uw-fit .gt-uw-n{color:var(--success)}
.gt-uw-notfit .gt-uw-head > .ti,.gt-uw-notfit .gt-uw-title,.gt-uw-notfit .gt-uw-n,
.gt-uw-blocked .gt-uw-head > .ti,.gt-uw-blocked .gt-uw-title,.gt-uw-blocked .gt-uw-n{color:var(--danger)}
.gt-uw-ref .gt-uw-head > .ti,.gt-uw-ref .gt-uw-title,.gt-uw-ref .gt-uw-n{color:var(--warn)}
.gt-uw-title{font-size:13px;font-weight:700}
.gt-uw-n{margin-left:auto;font-size:24px;font-weight:600;line-height:1;letter-spacing:-.02em}
.gt-uw-blurb{font-size:11px;color:var(--text3);margin:7px 0 6px}
.gt-uw-names{font-size:12px;color:var(--text);line-height:1.6}
.gt-uw-foot{
  display:flex;align-items:center;gap:6px;margin-top:11px;padding-top:10px;
  border-top:0.5px solid var(--border);font-size:11px;color:var(--text2);
}
.gt-uw-foot > .ti{font-size:12px;color:var(--text3)}

/* The saved Analyzer review. Its own look rather than the market boxes above:
   those are four counts, this is a record to read, so it is set as figures,
   then notes, then the reasoning per market. */
.gt-rv-figures{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;
  margin-bottom:14px;
}
.gt-rv-fig{
  border:0.5px solid var(--border);border-radius:12px;padding:10px 13px;background:var(--glass3);
}
.gt-rv-fig span{display:block;font-size:10px;font-weight:600;letter-spacing:.04em;
  text-transform:uppercase;color:var(--text3);margin-bottom:4px}
.gt-rv-fig strong{font-size:16px;font-weight:700;letter-spacing:-.02em;color:var(--text);
  font-variant-numeric:tabular-nums}
.gt-rv-sec{margin-top:14px}
.gt-rv-sec-head{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:700;
  color:var(--text);margin-bottom:8px}
.gt-rv-sec-head > .ti{font-size:14px;color:var(--accent)}
/* "What the analysis decided, and why" as a collapsible. The summary keeps the
   section-head look; the counts sit on the right, before the chevron. */
.gt-rv-collapse > summary{cursor:pointer;list-style:none;user-select:none}
.gt-rv-collapse > summary::-webkit-details-marker{display:none}
.gt-rv-sec-counts{margin-left:auto;font-size:11px;font-weight:600;color:var(--text3)}
.gt-rv-collapse > summary > .gt-rv-chev{font-size:13px;color:var(--text3);transition:transform var(--dur) var(--ease-out)}
.gt-rv-collapse:not([open]) > summary > .gt-rv-chev{transform:rotate(-90deg)}
.gt-rv-collapse > summary:hover > span:first-of-type{color:var(--accent)}
.gt-rv-n{margin-left:auto;font-size:11px;font-weight:700;color:var(--text3);
  background:var(--glass3);border-radius:var(--r-sm);padding:2px 9px}
.gt-rv-notes{margin:0;padding-left:18px;font-size:12px;line-height:1.65;color:var(--text2)}
.gt-rv-notes li{margin-bottom:4px}
.gt-rv-none{font-size:12px;color:var(--text3)}
.gt-rv-mkts{border:0.5px solid var(--border);border-radius:12px;padding:11px 13px;margin-bottom:9px}
.gt-rv-mkts.is-fit{background:var(--success-soft);border-color:var(--success-border)}
.gt-rv-mkts.is-notfit,.gt-rv-mkts.is-blocked{
  background:rgba(232,93,93,0.07);border-color:rgba(232,93,93,0.22)}
.gt-rv-mkts-head{display:flex;align-items:center;font-size:11px;font-weight:700;
  letter-spacing:.04em;text-transform:uppercase;color:var(--text3);margin-bottom:7px}
.gt-rv-mkt{display:flex;flex-wrap:wrap;align-items:center;gap:10px;font-size:12px;line-height:1.55;padding:3px 0}
.gt-rv-mkt-name{flex:0 0 132px;font-weight:700;color:var(--text)}
.gt-rv-mkt-why{flex:1;min-width:0;color:var(--text3)}
/* A person's own word on a market, kept apart from the engine's — the engine
   said what the rules found, this is what somebody is saying instead or in
   addition, and the two must not blur into one another. Its own line, so it
   never fights the auto reason for room on the row. */
.gt-rv-mkt-note{flex:1 1 100%;display:flex;align-items:center;gap:5px;color:var(--accent);font-size:11px;font-weight:600}
.gt-rv-mkt-edit{flex:0 0 auto;width:22px;height:22px;border-radius:50%;border:0.5px solid var(--border);
  background:transparent;color:var(--text3);display:flex;align-items:center;justify-content:center;
  cursor:pointer;font-size:11px;padding:0;font-family:inherit;margin-left:auto}
.gt-rv-mkt-edit:hover{background:var(--glass3);color:var(--text)}

/* Markets in Progress: the row somebody updates each morning, so status,
   next step and notes are edited where they are read. */
.gt-mip-table{width:100%;border-collapse:collapse;font-size:12px}
.gt-mip-table th{
  text-align:left;font-size:10px;font-weight:600;color:var(--text3);
  padding:0 10px 9px;border-bottom:0.5px solid var(--border);white-space:nowrap;
}
.gt-mip-table td{padding:7px 10px;border-bottom:0.5px solid var(--border);color:var(--text2);vertical-align:middle}
.gt-mip-table tr:last-child td{border-bottom:none}
/* One height for both: these two sit next to each other in a single editable
   row, and a <select> is 2px taller than an <input> from this same padding. */
.gt-cell-sel,.gt-cell-txt{
  font-size:12px;font-family:inherit;color:var(--text);outline:none;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:7px;padding:4px 8px;
  transition:border-color var(--dur) var(--ease-out);
  min-height:26px;
}
.gt-cell-sel{min-width:132px}
.gt-cell-txt{min-width:150px;width:100%}
.gt-cell-sel:hover,.gt-cell-txt:hover{border-color:var(--text3)}
.gt-cell-sel:focus,.gt-cell-txt:focus{border-color:var(--accent)}
/* Nothing chosen yet reads as a prompt, not as a value. */
.gt-cell-blank{color:var(--text3)}

/* ── Modals ── */
.gt-modal-back{
  position:fixed;inset:0;z-index:9500;background:rgba(0,0,0,0.45);
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  display:flex;align-items:center;justify-content:center;padding:24px;
  /* Toggled by style.display rather than a class, so a transition (which
     needs the element still rendered to animate from) would never fire —
     an animation restarts on its own every time display:none lifts. */
  animation:gtModalBackIn .18s var(--ease-out);
}
@keyframes gtModalBackIn{from{opacity:0}to{opacity:1}}
.gt-modal{
  width:100%;max-width:620px;max-height:86vh;display:flex;flex-direction:column;
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r);overflow:hidden;
  box-shadow:0 24px 60px rgba(0,0,0,0.35);
  /* One of four different "something appears over the app" treatments this
     app had — welcome-overlay only faded, clock-pop got a bespoke curve, and
     every one of these GT modals had no entrance at all. .gt-dup-modal's own
     shake (below) still wins here: same specificity, later in the file. */
  animation:gtModalIn .22s var(--ease-out);
}
@keyframes gtModalIn{from{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:scale(1) translateY(0)}}
@media(prefers-reduced-motion:reduce){.gt-modal-back,.gt-modal{animation:none}}
.gt-modal-lg{max-width:820px}
.gt-modal-xl{max-width:980px}
.gt-modal-sm{max-width:380px}
.gt-modal-head{
  display:flex;align-items:center;gap:12px;padding:15px 18px;
  border-bottom:0.5px solid var(--border);font-size:13px;font-weight:700;color:var(--text);
}
.gt-modal-x{margin-left:auto;background:none;border:none;color:var(--text3);cursor:pointer;font-size:14px;padding:2px 5px;border-radius:5px}
.gt-modal-x:hover{color:var(--text);background:var(--glass3)}
.gt-modal-body{padding:18px;overflow-y:auto}
/* "Account already in NOVA" — the facts first, then the two questions. */
.gt-dupinfo-modal{max-width:520px}
.gt-dupinfo-lead{margin:0 0 12px;font-size:13px;font-weight:600;color:var(--text)}
.gt-dupinfo-dates{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
.gt-dupinfo-date{font-size:12px;font-weight:600;padding:4px 10px;border-radius:999px;background:var(--glass3);border:0.5px solid var(--border);color:var(--text);font-variant-numeric:tabular-nums}
.gt-dupinfo-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;background:var(--border);border-radius:var(--r-sm);overflow:hidden;margin-bottom:16px}
@media (max-width:560px){ .gt-dupinfo-facts{grid-template-columns:minmax(0,1fr)} }
.gt-dupinfo-facts > div{display:flex;flex-direction:column;gap:4px;padding:10px 12px;background:var(--glass-card)}
.gt-dupinfo-facts span{font-size:10px;font-weight:600;color:var(--text3)}
.gt-dupinfo-facts strong{font-size:13px;font-weight:600;color:var(--text)}
.gt-dupinfo-q{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-top:0.5px solid var(--border);font-size:13px;color:var(--text)}
.gt-dupinfo-yn{display:flex;gap:6px;flex:none}
.gt-dupinfo-yn button{min-width:52px;font:inherit;font-size:12px;font-weight:700;padding:6px 12px;border-radius:var(--r-sm);border:0.5px solid var(--border2);background:var(--glass3);color:var(--text2);cursor:pointer;transition:background .15s var(--ease-out),color .15s var(--ease-out),border-color .15s var(--ease-out),transform var(--dur-fast) var(--ease-out)}
.gt-dupinfo-yn button:hover{color:var(--text)}
.gt-dupinfo-yn button.on[data-v="yes"]{background:var(--success);border-color:var(--success);color:#fff}
.gt-dupinfo-yn button.on[data-v="no"]{background:var(--danger);border-color:var(--danger);color:#fff}
.gt-modal-foot{display:flex;align-items:center;gap:9px;padding:13px 18px;border-top:0.5px solid var(--border)}
.gt-modal-err{flex:1;font-size:11px;color:var(--danger)}

/* ── Duplicate-account alert ── Above every other modal (fires while the Add
   Record form is still open behind it), red, and closed only by hand — see
   gtShowDuplicateAlert()/gtCloseDuplicateAlert() in 08-general-tracker.js. */
.gt-dup-back{z-index:9700;background:rgba(40,0,0,0.55)}
.gt-dup-modal{
  max-width:400px;padding:28px 26px 24px;text-align:center;
  border-color:rgba(255,59,48,0.55);
  box-shadow:0 24px 60px rgba(0,0,0,0.4),0 0 0 1px rgba(255,59,48,0.35);
  animation:gtDupShake .5s ease;
}
.gt-dup-icon{font-size:40px;color:var(--danger);line-height:1}
.gt-dup-title{font-size:20px;font-weight:700;color:var(--danger);margin-top:12px;letter-spacing:.01em}
.gt-dup-msg{font-size:14px;font-weight:500;color:var(--text2);margin-top:8px;line-height:1.5}
.gt-dup-close{margin:18px auto 0;background:var(--danger);border-color:var(--danger)}
.gt-dup-close:hover{filter:brightness(1.08)}
@keyframes gtDupShake{
  0%,100%{transform:translateX(0)}
  15%{transform:translateX(-8px)} 30%{transform:translateX(7px)}
  45%{transform:translateX(-5px)} 60%{transform:translateX(4px)}
  75%{transform:translateX(-2px)} 90%{transform:translateX(1px)}
}
@keyframes gtDupPulse{
  0%,100%{box-shadow:inset 0 0 0 3px rgba(255,59,48,0),inset 0 0 0 0 rgba(255,59,48,0)}
  50%{box-shadow:inset 0 0 0 5px rgba(255,59,48,0.9),inset 0 0 50px rgba(255,59,48,0.22)}
}
body.gt-dup-firing{animation:gtDupPulse .6s ease infinite}
@media(prefers-reduced-motion:reduce){
  .gt-dup-modal{animation:none}
  body.gt-dup-firing{animation:none;box-shadow:inset 0 0 0 4px rgba(255,59,48,0.85)}
}

/* ── Library: 14 fixed document slots, two columns ──────────────────────
   Built by _renderLibrary() in 08-general-tracker.js from DOC_TYPES, not
   written out by hand here — 14 near-identical blocks in markup is exactly
   the kind of duplication that drifts the moment one of them changes. */
.gt-lib-err{display:block;font-size:11px;color:var(--danger);margin-bottom:10px;min-height:1px}
.gt-doc-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@media(max-width:640px){ .gt-doc-grid{grid-template-columns:1fr} }
.gt-doc-slot{
  background:var(--glass3);border:0.5px solid var(--border);border-radius:12px;
  padding:12px;display:flex;flex-direction:column;gap:8px;
  transition:transform .18s var(--ease-out),border-color .18s,box-shadow .18s;
  opacity:0;transform:translateY(6px);animation:gtDocSlotIn .32s var(--ease-out) forwards;
}
@keyframes gtDocSlotIn{ to{ opacity:1;transform:translateY(0) } }
.gt-doc-grid .gt-doc-slot:nth-child(1){animation-delay:.02s}
.gt-doc-grid .gt-doc-slot:nth-child(2){animation-delay:.05s}
.gt-doc-grid .gt-doc-slot:nth-child(3){animation-delay:.08s}
.gt-doc-grid .gt-doc-slot:nth-child(4){animation-delay:.11s}
.gt-doc-grid .gt-doc-slot:nth-child(5){animation-delay:.14s}
.gt-doc-grid .gt-doc-slot:nth-child(6){animation-delay:.17s}
.gt-doc-grid .gt-doc-slot:nth-child(7){animation-delay:.20s}
.gt-doc-grid .gt-doc-slot:nth-child(8){animation-delay:.23s}
.gt-doc-grid .gt-doc-slot:nth-child(9){animation-delay:.26s}
.gt-doc-grid .gt-doc-slot:nth-child(10){animation-delay:.29s}
.gt-doc-grid .gt-doc-slot:nth-child(11){animation-delay:.32s}
.gt-doc-grid .gt-doc-slot:nth-child(12){animation-delay:.35s}
.gt-doc-grid .gt-doc-slot:nth-child(13){animation-delay:.38s}
.gt-doc-grid .gt-doc-slot:nth-child(14){animation-delay:.41s}
.gt-doc-slot:hover{transform:translateY(-2px);border-color:var(--text3)}
/* Dragging a file over a slot — the drop target says so before the drop. */
.gt-doc-slot.gt-doc-drag{border-color:var(--accent);box-shadow:0 0 0 2px rgba(77,143,230,0.25);background:var(--glass2)}
/* A file just landed — brief confirmation, not a state that lingers. */
.gt-doc-slot.gt-doc-pulse{animation:gtDocPulse .5s ease}
@keyframes gtDocPulse{ 0%{box-shadow:0 0 0 0 rgba(90,200,140,0.45)} 100%{box-shadow:0 0 0 10px rgba(90,200,140,0)} }
.gt-doc-slot-head{display:flex;align-items:center;gap:9px}
/* Same mark-on-a-tile mechanism as CRM HUB's own "IS" flash-card icon
   (.desk-main-icon-is) — short monogram, gradient text, dark rounded tile.
   Seven hues cycle across the 14 slots so the grid reads at a glance
   without needing 14 hand-drawn icons. */
.gt-doc-mono{
  width:32px;height:32px;border-radius:9px;flex-shrink:0;
  background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);
  display:flex;align-items:center;justify-content:center;
}
.gt-doc-mono span{
  font-size:11px;font-weight:700;letter-spacing:-.02em;
  background:linear-gradient(135deg,var(--mono-a),var(--mono-b));
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;
}
.gt-doc-mono-0{--mono-a:#f2f2f7;--mono-b:#409cff}
.gt-doc-mono-1{--mono-a:#ffe3c2;--mono-b:#ffaa5a}
.gt-doc-mono-2{--mono-a:#d8f5e3;--mono-b:#4fd18b}
.gt-doc-mono-3{--mono-a:#f0dcff;--mono-b:#b184f2}
.gt-doc-mono-4{--mono-a:#ffd9e0;--mono-b:#f2718f}
.gt-doc-mono-5{--mono-a:#d7f3f7;--mono-b:#4fc7dd}
.gt-doc-mono-6{--mono-a:#fff3c2;--mono-b:#e6c14d}
.gt-doc-slot-titles{flex:1;min-width:0}
.gt-doc-slot-title{font-size:12px;font-weight:700;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.gt-doc-slot-count{font-size:10px;color:var(--text3)}
.gt-doc-file-list{display:flex;flex-direction:column;gap:1px;border-radius:8px;overflow:hidden}
.gt-doc-file-row{display:flex;align-items:center;gap:8px;padding:6px 8px;background:var(--glass2);border-radius:6px}
.gt-doc-file-row i.ti-file{color:var(--text3);font-size:12px;flex-shrink:0}
.gt-doc-file-name{flex:1;min-width:0;font-size:11px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gt-doc-file-size{font-size:9px;color:var(--text3);flex-shrink:0}
.gt-doc-file-row .avp-btn{padding:3px 6px;font-size:10px}
.gt-doc-slot-empty{font-size:10px;color:var(--text3);padding:2px 1px}
.gt-doc-slot-upload{
  display:flex;align-items:center;justify-content:center;gap:6px;
  border:1px dashed var(--border2);border-radius:8px;padding:6px;
  font-size:10px;color:var(--text3);cursor:pointer;
  transition:border-color .15s,color .15s,background .15s;
}
.gt-doc-slot-upload:hover{border-color:var(--accent);color:var(--accent);background:var(--glass2)}

/* ── Pricing Console ── one row-card per state/class-code, the same
   entrance animation and hover-lift the Library's own slot cards use
   (gtDocSlotIn, defined above), so the two feel like one design language
   rather than two different screens bolted together. */
.gt-pc-row{
  position:relative;display:grid;
  grid-template-columns:70px 76px 1fr 56px 52px 52px 110px;
  gap:10px;align-items:start;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:12px;
  padding:12px 34px 12px 12px;margin-bottom:10px;
  transition:transform .18s var(--ease-out),border-color .18s;
  opacity:0;transform:translateY(6px);animation:gtDocSlotIn .28s var(--ease-out) forwards;
}
.gt-pc-row:hover{transform:translateY(-1px);border-color:var(--text3)}
.gt-pc-field{display:flex;flex-direction:column;gap:4px;min-width:0}
.gt-pc-field label{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3)}
.gt-pc-field-wide{min-width:0}
.gt-pc-field-narrow input{text-align:center}
.gt-pc-row input{
  font-size:12px;padding:6px 8px;border:0.5px solid var(--border);border-radius:7px;
  background:var(--input-bg);color:var(--text);outline:none;font-family:inherit;width:100%;
  transition:border-color .15s,box-shadow .15s;
}
.gt-pc-row input:focus{border-color:var(--accent);box-shadow:0 0 0 2px rgba(77,143,230,0.18)}
.gt-pc-row input.gt-pc-invalid{border-color:var(--danger)}
.gt-pc-err{font-size:9px;color:var(--danger)}
.gt-pc-desc{
  font-size:11px;color:var(--text);padding:6px 2px;line-height:1.35;
  overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
}
.gt-pc-desc.gt-pc-notfound{color:var(--warn)}
.gt-pc-rate{font-size:12px;font-weight:600;color:var(--text);padding:6px 2px;text-align:center}
.gt-pc-payroll-wrap{
  position:relative;display:flex;align-items:center;font-size:11px;color:var(--text3);
}
.gt-pc-payroll-wrap input{padding-left:16px}
.gt-pc-payroll-wrap::before{content:'$';position:absolute;left:8px;font-size:12px;color:var(--text3);pointer-events:none;z-index:1}
.gt-pc-remove{
  position:absolute;top:8px;right:8px;width:20px;height:20px;border-radius:6px;
  display:flex;align-items:center;justify-content:center;
  background:none;border:none;color:var(--text3);cursor:pointer;font-size:11px;
  transition:background .15s,color .15s;
}
.gt-pc-remove:hover{background:rgba(240,90,90,0.14);color:var(--danger)}
.gt-pc-add{
  display:flex;align-items:center;justify-content:center;gap:6px;width:100%;
  border:1px dashed var(--border2);border-radius:var(--r-sm);padding:10px;margin-top:4px;
  font-size:12px;font-weight:600;color:var(--accent);background:none;cursor:pointer;
  transition:border-color .15s,background .15s,transform var(--dur-fast) var(--ease-out);
}
.gt-pc-add:hover{border-color:var(--accent);background:var(--glass2)}
.gt-pc-foot{gap:12px}
.gt-pc-total-label{font-size:11px;font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.06em}
.gt-pc-total-value{font-size:20px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}
.gt-pc-total-value.gt-pc-pulse{animation:gtPcPulse .5s ease}
.gt-pc-confirm{margin-left:auto}
@keyframes gtPcPulse{ 0%{color:var(--accent);transform:scale(1.08)} 100%{color:var(--text);transform:scale(1)} }
@media(max-width:720px){
  .gt-pc-row{grid-template-columns:1fr 1fr;padding:14px 34px 14px 14px}
  .gt-pc-field-wide{grid-column:1/-1}
}
@media(prefers-reduced-motion:reduce){
  .gt-pc-row{animation:none;opacity:1;transform:none}
  .gt-pc-total-value.gt-pc-pulse{animation:none}
}

.gt-mf-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px 16px}
.gt-mf-wide{grid-column:1/-1}
/* A heading per group in the Add market / Edit record form, across the grid. */
.gt-mf-sec{grid-column:1/-1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  color:var(--accent);padding-top:10px;margin-top:2px;border-top:0.5px solid var(--border)}
.gt-mf-sec:first-child{padding-top:0;margin-top:0;border-top:0}
.gt-mf{display:flex;flex-direction:column;gap:5px}
.gt-mf label{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3)}
/* The same controls as every other form in the app (.cal-field above): one
   height for text, dates and dropdowns, the app's radius and border, the
   focus ring, and the dropdown's own chevron in the accent colour instead of
   the browser's arrow — which is what made these read as a different form. */
.gt-mf input,.gt-mf select{
  box-sizing:border-box;height:34px;
  font-size:12px;padding:8px 11px;border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);outline:none;font-family:inherit;width:100%;
  transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);
}
.gt-mf input:focus,.gt-mf select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.gt-mf input[readonly]{color:var(--text3);cursor:default}
.gt-mf input[readonly]:focus{border-color:var(--border2);box-shadow:none}
.gt-mf select{cursor:pointer;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23163a66' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;
  background-position:right 10px center;padding-right:28px;
  background-color:var(--input-bg)}
[data-theme="dark"] .gt-mf select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%234d8fe6' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E")}
.gt-mf select option{background:var(--select-opt-bg);color:var(--text)}
.gt-mf select:disabled,.gt-mf input:disabled{opacity:.6;cursor:not-allowed}

.gt-det-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:18px}
.gt-det-field{display:flex;flex-direction:column;gap:3px}
.gt-det-field span{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3)}
.gt-det-field strong{font-size:12px;font-weight:600;color:var(--text)}
.gt-det-sub{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text3);margin-bottom:8px}

/* Tablet and narrow laptops: the KPI strip wraps to a grid rather than
   squeezing five cards into a row too narrow to read, and the dashboard
   becomes one column. The tables keep their own horizontal scroll. */
@media (max-width:1100px){
  .gt-kpi-row{grid-template-columns:repeat(3,1fr)}
}
@media (max-width:720px){
  .gt-kpi-row{grid-template-columns:repeat(2,1fr)}
  .gt-mf-grid,.gt-det-grid{grid-template-columns:1fr}
  .gt-sent-row{flex-wrap:wrap}
}

/* A market waiting on a follow-up is marked where the work happens, not only
   in the notification — the bell is read once, this table every morning. */
.gt-mip-due > td{background:rgba(224,166,58,0.06)}
.gt-due-flag{font-size:12px;color:var(--warn);margin-left:5px;vertical-align:middle}

/* ── General Tracker charts ──
   Hand-rolled SVG in the app's own palette. `currentColor` on the text means
   the labels follow the theme without a second set of colour rules.

   ── The series colours ──
   The eight slots a category can be given, in a fixed order: the fourth market
   on the list is always the fourth colour, so filtering the list down does not
   repaint the ones that survive. Stepped twice, once per theme, because a
   colour that reads on near-black does not read on parchment.

   These replaced a hand-picked set that failed on the two things a chart
   palette has to get right. Its light blue and its lavender came out 1.0 apart
   under deuteranopia — the most common colour blindness — which is to say
   identical; its mint and light blue were 11.8 apart for full colour vision,
   under the 15 that two adjacent series need. Two more were so weak they read
   as grey. Checked with a validator rather than by eye, in both themes, at
   every adjacent pair.

   Light mode: four of the eight sit under 3:1 against parchment. That is
   allowed only where the value is also written down — every chart here prints
   its own numbers and the table underneath carries all of them. */
:root{
  --gtv-1:#2a78d6; --gtv-2:#eb6834; --gtv-3:#1baf7a; --gtv-4:#eda100;
  --gtv-5:#e87ba4; --gtv-6:#008300; --gtv-7:#4a3aa7; --gtv-8:#e34948;
  --gtv-other:#8a8f99;
  /* The two faces an extruded shape shows besides its front. Light from the
     top-left, so the top is lit and the right side falls away. */
  --gtv-lit:rgba(255,255,255,0.34);
  --gtv-shade:rgba(0,0,0,0.24);
  --gtv-floor:rgba(20,30,50,0.10);
}
[data-theme="dark"]{
  --gtv-1:#3987e5; --gtv-2:#d95926; --gtv-3:#199e70; --gtv-4:#c98500;
  --gtv-5:#d55181; --gtv-6:#008300; --gtv-7:#9085e9; --gtv-8:#e66767;
  --gtv-other:#7c8492;
  --gtv-lit:rgba(255,255,255,0.26);
  --gtv-shade:rgba(0,0,0,0.36);
  --gtv-floor:rgba(130,182,242,0.16);
}
.gt-chart-controls{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.gt-chart-ctl-label{
  font-size:10px;font-weight:600;color:var(--text3);
  margin-right:3px;white-space:nowrap;
}
#gt-chart-body,#gt-chart-trend{color:var(--text)}

/* ── The drawing surface ──
   A chart wider than its card scrolls sideways inside the card. The page
   itself must never scroll sideways, and dropping months to make one fit is
   how a chart quietly stops showing what it says it shows. */
.gt-chart-scroll{
  overflow-x:auto;overflow-y:hidden;max-width:100%;
  /* Kept visible. A chart clipped at the card's edge with no scrollbar in
     sight does not read as "there is more" — it reads as broken. */
  scrollbar-width:thin;scrollbar-color:var(--border) transparent;
  padding-bottom:2px;
}
.gt-chart-scroll::-webkit-scrollbar{height:7px}
.gt-chart-scroll::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}
.gt-viz{display:block;color:var(--text)}

/* ── Charts arriving ────────────────────────────────────────────────────
   Every render replaces the SVG, so the shapes are new elements each time and
   a CSS animation on them runs by itself — on the first draw, on a change of
   chart type, and on a change of filter. Nothing has to notice which of the
   three happened, which is why none of them can be the one that was forgotten.

   Each shape grows from the edge it is measured from: a bar from its left, a
   column from its floor, a ring from its centre. Growing a bar from the middle
   would animate it through lengths it never had, which is a chart briefly
   telling the truth about nothing.

   transform-box:fill-box is what makes a percentage transform-origin mean the
   shape's own box rather than the whole SVG canvas — without it every bar
   pivots around the top-left of the chart. */
.gt-viz .gt-anim{
  animation:gt-grow-x .42s cubic-bezier(.22,1,.36,1) backwards;
  transform-box:fill-box;transform-origin:left center;
}
.gt-viz .gt-anim-y{
  animation-name:gt-grow-y;transform-origin:bottom center;
}
.gt-viz .gt-anim-c{
  animation:gt-grow-c .5s cubic-bezier(.22,1,.36,1) backwards;
  transform-box:fill-box;transform-origin:center;
}
/* Labels do not stretch — a number scaled from nothing is unreadable for the
   length of the animation and reads as a rendering fault. They fade. */
.gt-viz .gt-anim-t{ animation:gt-fade .42s ease backwards }
@keyframes gt-grow-x{ from{transform:scaleX(0)} to{transform:scaleX(1)} }
@keyframes gt-grow-y{ from{transform:scaleY(0)} to{transform:scaleY(1)} }
@keyframes gt-grow-c{ from{transform:scale(.82);opacity:0} to{transform:scale(1);opacity:1} }
@keyframes gt-fade{ from{opacity:0} to{opacity:1} }
@media(prefers-reduced-motion:reduce){
  .gt-viz .gt-anim,.gt-viz .gt-anim-y,.gt-viz .gt-anim-c,.gt-viz .gt-anim-t{
    animation:none
  }
}
/* Scales to its card instead of scrolling: for a fixed layout, shrinking is
   what keeps the far column inside the card. */
.gt-viz-fit{width:100%;height:auto;max-width:520px}
/* The floor. A hairline one shade off the surface — a grid that competes with
   the marks is a grid that gets read instead of them. Solid, never dashed:
   dashing on a grid reads as "projection" when it is only a ruler. */
.gt-viz .gt-floor{stroke:var(--gtv-floor);stroke-width:1;fill:none}
/* The percentage sits on its own slice, so it wears ink rather than the
   slice's colour and carries a soft outline to survive any of the eight. */
.gt-slice-pct{fill:#fff;paint-order:stroke;stroke:rgba(0,0,0,0.45);stroke-width:2.5px}
/* Recorded is solid and lit; projected is dashed and quieter. One line in one
   style would present a forecast as a fact. */
.gt-proj-line{fill:none;stroke:var(--gtv-1);stroke-width:2;stroke-linejoin:round;stroke-linecap:round}
.gt-proj-line-fc{stroke:var(--gtv-7);stroke-dasharray:5 4}
.gt-proj-band{fill:var(--gtv-7);fill-opacity:0.15;stroke:none}
.gt-proj-dot{fill:var(--gtv-1);stroke:none}
.gt-proj-dot.fc{fill:var(--glass-card);stroke:var(--gtv-7);stroke-width:2}
[data-theme="dark"] .gt-viz-3d .gt-proj-line{filter:drop-shadow(0 0 5px rgba(57,135,229,0.55))}
[data-theme="dark"] .gt-viz-3d .gt-proj-line-fc{filter:drop-shadow(0 0 5px rgba(144,133,233,0.45))}
/* Said out loud under the one chart where the depth changes what the shape
   claims, rather than left for the reader to catch. */
.gt-chart-caveat{
  margin-top:8px;font-size:10px;line-height:1.5;color:var(--text3);
  border-top:0.5px solid var(--border);padding-top:7px;
}

.gt-chart-pie-wrap{display:flex;align-items:center;gap:22px;flex-wrap:wrap;padding:4px 0}
/* Capped, so the count sits beside the name instead of being pushed to the
   far edge of a wide card with a corridor of empty space between them. */
.gt-chart-legend{display:flex;flex-direction:column;gap:6px;flex:1;min-width:190px;max-width:340px}
.gt-legend-row{display:flex;align-items:center;gap:8px;font-size:12px}
.gt-legend-dot{width:9px;height:9px;border-radius:3px;flex-shrink:0}
.gt-legend-name{color:var(--text2);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gt-legend-n{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
/* Narrower than the general .gt-cell-txt it pairs with (min-width:150px,
   width:100%) — a premium is at most "$999,999.99", nine digits and a
   dollar sign, so the box does not need to claim as much of the row as a
   free-text cell does. */
/* Narrower than the general .gt-cell-txt it pairs with (min-width:150px,
   width:100%) — a premium is at most "$999,999.99", nine digits and a
   dollar sign, so the box does not need to claim as much of the row as a
   free-text cell does. */
.gt-cell-money{min-width:76px;max-width:96px;text-align:right;font-variant-numeric:tabular-nums}

/* ── Notes that open under their market ──
   A note is a sentence, and a sentence in a table cell is three words and a
   scrollbar. The row below opens full width instead of widening the column. */
.gt-note-toggle{
  display:flex;align-items:center;gap:6px;width:100%;min-width:150px;
  background:none;border:none;padding:4px 6px;border-radius:7px;cursor:pointer;
  font-family:inherit;font-size:12px;color:var(--text2);text-align:left;
  transition:background var(--dur) var(--ease-out),transform var(--dur-fast) var(--ease-out);
}
.gt-note-toggle:hover{background:var(--glass3)}
.gt-note-caret{font-size:12px;color:var(--text3);flex-shrink:0;transition:transform var(--dur) var(--ease-out)}
.gt-note-toggle.open .gt-note-caret{transform:rotate(180deg)}
.gt-note-preview{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:210px}
.gt-note-row > td{padding:0 10px 12px!important;border-bottom:0.5px solid var(--border)}
.gt-note-box{
  width:100%;min-height:66px;resize:vertical;font-family:inherit;font-size:12px;
  line-height:1.6;color:var(--text);background:var(--glass3);outline:none;
  border:0.5px solid var(--border);border-radius:9px;padding:9px 11px;
}
.gt-note-box:focus{border-color:var(--accent)}
.gt-note-read{
  font-size:12px;line-height:1.6;color:var(--text2);
  background:var(--glass3);border:0.5px solid var(--border);border-radius:9px;padding:9px 11px;
}

/* Read-only: the values still read as values, not as empty inputs. */
.gt-cell-ro{font-size:12px;color:var(--text2)}
.gt-readonly-note{
  display:flex;align-items:center;gap:8px;margin-bottom:12px;padding:9px 13px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-sm);
  font-size:12px;color:var(--text3);
}
.gt-readonly-note > .ti{font-size:14px;color:var(--text3)}

/* ── Several charts at once ──
   Two or three side by side while there is room; one column below that, where
   two half-width donuts are two unreadable donuts. */
.gt-chart-grid{display:grid;gap:12px}
.gt-chart-grid-1{grid-template-columns:1fr}
.gt-chart-grid-2{grid-template-columns:1fr 1fr}
.gt-chart-grid-3{grid-template-columns:repeat(3,1fr)}
.gt-chart-card{
  background:var(--glass3);border:0.5px solid var(--border);
  border-radius:12px;padding:14px 16px;min-width:0;overflow:hidden;
}
.gt-chart-card-head{
  font-size:10px;font-weight:600;color:var(--text3);margin-bottom:10px;
}
.gt-chart-hint{font-size:10px;color:var(--text3);margin-left:4px}
@media(max-width:1100px){
  .gt-chart-grid-2,.gt-chart-grid-3{grid-template-columns:1fr}
}

/* Recorded and projected must not look alike — a dashed forecast presented in
   the same stroke as a fact is a number somebody will quote. */
.gt-proj-key{display:flex;gap:16px;margin-top:8px;font-size:10px;color:var(--text3)}
.gt-proj-key > span{display:flex;align-items:center;gap:6px}
.gt-proj-swatch{display:block;width:16px;height:0;border-top:2px solid var(--gtv-1)}
.gt-proj-swatch.dash{border-top-style:dashed;border-color:var(--gtv-7)}
.gt-proj-swatch.band{height:9px;border:none;border-radius:2px;background:var(--gtv-7);opacity:0.28}

/* ── Dashboard before an account is chosen ──
   The outline of what is coming, in grey. It mirrors the real panels so that
   choosing an account fills in the shape already on screen rather than
   swapping one layout for another. */
.gt-sk{opacity:.5}
.gt-sk-panel{
  background:var(--glass-card);border:0.5px solid var(--border);
  border-radius:14px;padding:16px 18px;margin-bottom:12px;
}
.gt-sk-head{margin-bottom:14px}
.gt-sk-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.gt-sk-two{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.gt-sk-box{
  border:0.5px solid var(--border);border-radius:12px;padding:14px 16px;
  display:flex;flex-direction:column;gap:9px;
}
.gt-sk-field{display:flex;flex-direction:column;gap:8px}
.gt-sk-row{display:flex;align-items:center;gap:18px;padding:11px 0;border-bottom:0.5px solid var(--border)}
.gt-sk-row:last-child{border-bottom:none}
.gt-sk-bar{
  display:block;height:9px;border-radius:5px;background:var(--glass3);
  /* A slow sweep, so it reads as "waiting" rather than as content that failed
     to arrive — and slow enough not to pull the eye away from the picker,
     which is where the next action is. */
  background-image:linear-gradient(90deg,transparent 0%,var(--border) 45%,transparent 90%);
  background-repeat:no-repeat;background-size:220px 100%;
  animation:gtSkSweep 2.1s ease-in-out infinite;
}
@keyframes gtSkSweep{
  0%{background-position:-220px 0}
  100%{background-position:calc(100% + 220px) 0}
}
@media(prefers-reduced-motion:reduce){ .gt-sk-bar{animation:none} }

.gt-sk-hint{
  display:flex;align-items:flex-start;gap:11px;justify-content:center;
  padding:18px;margin-top:-4px;
}
.gt-sk-hint > .ti{font-size:16px;color:var(--accent);margin-top:2px}
.gt-sk-hint strong{display:block;font-size:13px;font-weight:700;color:var(--text);margin-bottom:3px}
.gt-sk-hint span{display:block;font-size:12px;color:var(--text3);line-height:1.6;max-width:52ch}
@media(max-width:900px){
  .gt-sk-grid{grid-template-columns:repeat(2,1fr)}
  .gt-sk-two{grid-template-columns:1fr}
}
/* An account worked and never sent. Named rather than left blank — an empty
   cell reads as a value somebody forgot to fill in. */
.gt-unsent{font-size:11px;color:var(--text3);font-style:italic}
/* No market fitted. Said plainly, with the save still available — an account
   that fits nowhere is a finding worth recording, not an empty screen. */
.gt-sent-none{
  display:flex;align-items:flex-start;gap:9px;padding:11px 13px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:var(--r-sm);
  font-size:12px;color:var(--text2);line-height:1.6;
}
.gt-sent-none > .ti{font-size:14px;color:var(--text3);margin-top:1px;flex-shrink:0}

/* ── The General Tracker with the sidebar pinned ──
   Every other screen keeps a centred column narrow enough that the pinned
   sidebar overlays only empty gutter. This one does not: its table runs the
   full column width and its charts fill it, so the sidebar sat on top of a
   chart. Here the space is reserved rather than floated over. */
@media(min-width:761px){
  /* The screen already leaves room for the sidebar. What is different here is
     that the tracker wants the whole of what is left rather than a centred
     column inside it — sixteen columns and a chart. */
  body.nav-pinned #general-tracker-screen .gt-page{ max-width:none }
}
/* Declared here rather than inline on the element: an inline style beats the
   stylesheet, so the pinned-sidebar rule above silently did nothing.

   Not scoped to the tracker any more. Account info wears the same shell, and
   a shared class that only lays out on one screen is not shared — it left
   that screen's table running into the window edge with no padding, which is
   what a measurement of the two bars side by side showed. */
.gt-page{
  max-width:var(--col-wide);
  margin:18px auto 0;
  padding:0 18px;
  transition:margin-left .35s var(--ease-out);
}

/* The tracker's own entries, indented under it and only while it is open. */
.nav-sub{
  padding-left:34px!important;font-size:12px!important;opacity:.82;
}
.nav-sub.active{opacity:1}

/* Carrier rules only means anything on a screen that is actually about a
   market/carrier decision — set by the screen-transition observer in
   03-hub.js (CARRIER_SCREENS), toggling body.carrier-context alongside the
   sidebar highlight every time a new screen becomes visible. Hidden by
   default, shown back on the Analyzer, Indications, PayGo and Account
   Management Emails — everywhere else (Directory, Documents, Calendar,
   games, Power BI, KPI, the two card-grid launchers, etc.) a market's
   underwriting rules have nothing on screen to apply to. */
#nav-rules-btn{ display:none }
body.carrier-context #nav-rules-btn{ display:flex }

/* CRM HUB's own active context — set by openGeneralTracker()/
   backFromGeneralTracker() alongside #nav-gt-section's own show/hide.
   General app housekeeping (How to use, Carrier rules, Backup & restore)
   steps aside while its own Data/CRM/Follow ups routes are the ones on
   screen — the same "this screen's own entries, not another way back to a
   screen already open" reasoning #nav-gt-section is built on. */
body.gt-context #nav-tutorial-btn,
body.gt-context #nav-rules-btn,
body.gt-context #nav-backup-btn{ display:none }
.nav-sub-n{
  margin-left:auto;font-size:10px;color:rgba(255,255,255,0.4);
  font-variant-numeric:tabular-nums;
}
.nav-badge{
  margin-left:auto;display:flex;align-items:center;justify-content:center;
  min-width:17px;height:17px;padding:0 5px;border-radius:9px;
  background:var(--warn);color:#1a1a1a;font-size:10px;font-weight:700;
}
/* Status beside the program in Sent to market — the two are decided together. */
.gt-sent-status{
  font-size:11px;padding:4px 8px;border:0.5px solid var(--border);border-radius:6px;
  background:var(--input-bg);color:var(--text);outline:none;font-family:inherit;min-width:132px;
  min-height:25px;
}
.gt-sent-status.gt-cell-blank{color:var(--text3)}

/* ── Change in Check-in Time: the arrangement, not one day ── */
.to-ci-forrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.to-ci-days{display:flex;flex-direction:column;gap:6px}
.to-ci-day{
  display:flex;align-items:center;gap:9px;padding:6px 10px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:9px;
}
.to-ci-day > label{
  display:flex;align-items:center;gap:7px;font-size:12px;color:var(--text2);
  cursor:pointer;user-select:none;min-width:104px;
}
.to-ci-day input[type=checkbox]{accent-color:var(--accent);cursor:pointer}
.to-ci-day select{
  margin-left:auto;font-size:12px;padding:4px 8px;border-radius:6px;
  border:0.5px solid var(--border);background:var(--input-bg);color:var(--text);
  outline:none;font-family:inherit;
}
/* Off until the day is ticked, so the row reads as "same as the new time". */
.to-ci-day select:disabled{opacity:.4;cursor:not-allowed}
.to-ci-daterow{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.to-ci-daterow input[type=date]{flex:1;min-width:0}
.to-ci-daterow button{
  background:none;border:none;color:var(--text3);cursor:pointer;font-size:14px;
  padding:3px 6px;border-radius:6px;
}
.to-ci-daterow button:hover{color:var(--danger);background:var(--glass3)}
/* The span and the per-day times, under the new time they qualify. */
.to-sched-why{font-size:10px;color:var(--text3);line-height:1.5;margin-top:3px}

/* The full-page screens. Seven of them repeated the same inline style, and an
   inline padding beats every rule the stylesheet has — which is why the offset
   for the pinned sidebar silently did nothing on the one screen that needed it
   most. The bottom padding each screen wanted survives as a variable. */
.hub-screen{
  min-height:100vh;
  background:var(--bg);
  background-image:var(--bg-mesh);
  background-attachment:fixed;
  background-repeat:var(--bg-mesh-repeat);
  background-position:var(--bg-mesh-pos);
  background-size:var(--bg-mesh-size);
  padding:0 0 var(--screen-pad-bottom, 80px);
}
/* biBERK quotes while the submission is being made, so its figure is asked for
   on the row rather than in the tracker afterwards. */
.gt-sent-prem{
  width:112px;font-size:11px;padding:4px 8px;border-radius:6px;text-align:right;
  border:0.5px solid var(--border);background:var(--input-bg);color:var(--text);
  outline:none;font-family:inherit;font-variant-numeric:tabular-nums;
  min-height:25px;
}
.gt-sent-prem:focus{border-color:var(--accent)}

/* ── Back to the top ──
   Bottom-left, because bottom-right is where the clock and weather live and a
   third floating thing in the same corner is a pile. Above the sidebar's
   z-index is not needed — it sits inside the reserved gutter. */
#to-top-btn{
  position:fixed;left:16px;bottom:16px;z-index:200;
  display:none;align-items:center;justify-content:center;
  width:38px;height:38px;border-radius:50%;cursor:pointer;
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);color:var(--text2);font-size:16px;
  box-shadow:var(--shadow);
  transition:transform var(--dur) var(--ease-out),color var(--dur) var(--ease-out),opacity var(--dur) var(--ease-out);
}
#to-top-btn.on{display:flex}
#to-top-btn:hover{transform:translateY(-2px);color:var(--accent)}
/* Out of the sidebar's way whenever the sidebar is on screen — the same
   nav-open test, and the same 761px floor, as the screens above. */
@media(min-width:761px){
  body.nav-open #to-top-btn{left:calc(var(--nav-w) + 16px)}
}

/* ── The three lines ──
   They open the panel, and they sit at the left end of whichever top bar is
   showing rather than floating over it.

   Floating was the bug. The button was fixed at the sidebar's own top-left
   corner, which is also where every screen's top bar begins when the sidebar
   is not reserving room — so on UWing Assistance and the tracker it sat on the
   bar at every width, directly on top of the Home button. The bar leaves the
   room instead, and the button drops into it.

   It goes away while the panel is up: closing is done from inside the panel,
   because on a narrow screen the panel covers this corner and a close button
   underneath it is a close button nobody can press. */
#nav-burger{
  position:fixed;top:calc(var(--nav-gap) + 12px);left:calc(var(--nav-gap) + 12px);
  z-index:3200;width:34px;height:34px;border-radius:11px;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);box-shadow:var(--shadow);
  transition:opacity .2s var(--ease-out),visibility .2s;
}
#nav-burger span{
  display:block;width:15px;height:1.5px;border-radius:2px;background:var(--text2);
  transition:background var(--dur) var(--ease-out);
}
#nav-burger:hover span{background:var(--accent)}
/* The panel is up, so the thing that opens it has nothing to say. Driven from
   _syncBurger() as well, which knows for certain whether the panel is showing;
   this class is not set on every route that opens it. */
body.nav-open #nav-burger{ opacity:0;visibility:hidden;pointer-events:none }

/* The room the bar leaves for it. Every top bar in the app, and the analyzer's
   own, so a screen cannot forget. Given up the moment the panel is showing,
   because then the button is not there to make room for. */
body:not(.nav-open) .wm-topbar,
body:not(.nav-open) #app .topbar{
  padding-left:56px;
}
.wm-topbar,#app .topbar{ transition:padding-left .2s var(--ease-out) }

/* The header's own small control. */
/* No transition of its own: this rule sits below the shared interaction block
   (the one that names every control answering a pointer with a lift and a
   press), so a local `transition` here would win on order alone and leave the
   press snapping instead of easing. */
.nav-hdr-btn{
  width:28px;height:28px;border-radius:8px;flex-shrink:0;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  background:transparent;border:0.5px solid rgba(255,255,255,0.15);
  color:rgba(255,255,255,0.5);font-size:14px;
}
.nav-hdr-btn:hover{background:rgba(255,255,255,0.08);color:#fff}

/* ══ VOICE ═══════════════════════════════════════════════════════════════
   The switch, and the panel that shows what was heard.

   The panel is only up while the microphone is open. A transcript sitting on
   the page when nothing is listening is a panel that says the room is being
   recorded when it is not. */
.voice-btn{
  display:inline-flex;align-items:center;gap:6px;
  font-size:11px;font-weight:600;font-family:inherit;
  color:var(--text2);background:var(--glass3);
  border:0.5px solid var(--border);border-radius:var(--r-lg);
  padding:4px 11px 4px 9px;cursor:pointer;
  transition:background var(--dur) var(--ease-out),color var(--dur) var(--ease-out),
             border-color var(--dur) var(--ease-out),transform var(--dur-fast) var(--ease-out);
}
.voice-btn:hover{color:var(--text);background:var(--glass2)}
.voice-btn:disabled{opacity:.45;cursor:not-allowed}
.voice-mic{width:14px;height:14px;flex:0 0 auto}
/* Listening is a state somebody has to be able to see across the room, so it
   is a colour change and a live dot rather than a pressed-looking border. */
.voice-btn.on{
  color:#fff;background:var(--danger);border-color:transparent;
}
.voice-dot{
  width:6px;height:6px;border-radius:50%;background:transparent;flex:0 0 auto;
  transition:background var(--dur) var(--ease-out);
}
.voice-btn.on .voice-dot{background:#fff;animation:voice-pulse 1.4s ease-in-out infinite}
@keyframes voice-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.7)}}

.voice-panel{
  display:none;margin:0 0 1.5rem;padding:13px 16px;
  background:var(--glass3);border:0.5px solid var(--border);border-radius:14px;
}
.voice-panel.on{display:block}
.voice-panel-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:9px}
.voice-panel-title{font-size:11px;font-weight:700;color:var(--text2);letter-spacing:.03em}
.voice-panel-hint{font-size:10px;color:var(--text3)}
/* Five bars that move while it is listening. Not a level meter — it is not
   reading the microphone — so it does not pretend to be one: it says "open",
   which is the only thing it actually knows. */
.voice-wave{display:inline-flex;align-items:flex-end;gap:2px;height:13px}
.voice-wave i{display:block;width:2px;border-radius:1px;background:var(--danger);height:4px}
.voice-panel.on .voice-wave i{animation:voice-bar .9s ease-in-out infinite}
.voice-wave i:nth-child(2){animation-delay:.12s}
.voice-wave i:nth-child(3){animation-delay:.24s}
.voice-wave i:nth-child(4){animation-delay:.36s}
.voice-wave i:nth-child(5){animation-delay:.48s}
@keyframes voice-bar{0%,100%{height:4px}50%{height:13px}}
@media(prefers-reduced-motion:reduce){
  .voice-panel.on .voice-wave i,.voice-btn.on .voice-dot{animation:none}
}

.voice-log{display:flex;flex-direction:column;gap:5px;min-height:22px}
.voice-line{
  font-size:12px;line-height:1.5;color:var(--text2);
  display:flex;gap:8px;align-items:baseline;
}
.voice-line > span{
  flex:0 0 46px;font-size:9px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--text3);
}
.voice-line.say{color:var(--accent)}
.voice-line.say > span{color:var(--accent);opacity:.75}
.voice-privacy{
  display:flex;gap:7px;align-items:flex-start;margin-top:10px;padding-top:9px;
  border-top:0.5px solid var(--border);
  font-size:10px;line-height:1.55;color:var(--text3);
}
.voice-privacy > .ti{font-size:12px;color:var(--warn);flex:0 0 auto;margin-top:1px}

/* ── Years in business & effective date ──
   Six tracks so the row can be split three ways or two, which .g2 and .g3
   between them could not do: the section holds five fields and any two-column
   grid leaves the fifth alone on a row with half the card empty next to it.
   Each field fills its cell — the count no longer wears an inline 130px cap
   that made it a quarter of the box beside it. */
.date-grid{display:grid;grid-template-columns:1fr;gap:12px}
@media(min-width:640px){
  .date-grid{grid-template-columns:repeat(6,1fr)}
  .date-grid > .avp-field{grid-column:span 2}
  .date-grid > .avp-field.wide{grid-column:span 3}
}
.date-grid > .avp-field > input,
.date-grid > .avp-field > select{width:100%}

/* ══ CLOCK IN THE BAR ══════════════════════════════════════════════════════
   The clock used to be the lower half of the floating column on the right,
   which meant it sat over whatever the screen kept in that corner — the
   Calendar's day panel among them. It is part of the bar now.

   Centred by position, not by the flow: a flex child sits in the middle of
   whatever happens to be either side of it, and that is a different place on
   every screen. Absolute and translated, it is in the middle of the bar. */
.tbar-clock{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  display:inline-flex;align-items:center;gap:9px;
  font-family:inherit;font-size:14px;font-weight:700;letter-spacing:-.01em;
  color:var(--text);background:var(--glass3);
  border:0;border-radius:17px;
  padding:9px 17px;cursor:pointer;white-space:nowrap;
  font-variant-numeric:tabular-nums;
  transition:background var(--dur) var(--ease-out),color var(--dur) var(--ease-out),
             transform .2s var(--ease-out);
}
.tbar-clock:hover{background:var(--glass2)}
/* The press. The centring lives in the transform, so the squeeze has to carry
   it — a bare scale() would drop the translate and throw the clock off centre
   for the length of the click, which is the jump it was doing before. */
.tbar-clock:active{transform:translate(-50%,-50%) scale(.955)}
.tbar-clock.tbar-clock-right:active{transform:scale(.955)}
.tbar-clock > .ti{font-size:16px;color:var(--accent)}
.tbar-clock[aria-expanded="true"]{background:var(--accent);color:#fff}
.tbar-clock[aria-expanded="true"] > .ti{color:#fff}
/* What it is counting, when that is not the time of day: a stopwatch running
   behind a shut panel is a thing you should be able to see is running. */
.tbar-clock-mode{
  font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--accent);
}
.tbar-clock[aria-expanded="true"] .tbar-clock-mode{color:rgba(255,255,255,0.85)}
.tbar-clock-mode:empty{display:none}
/* Both bars are already position:sticky, which is a containing block for an
   absolutely positioned child, so the analyzer's needs nothing. The others get
   a class when the clock moves into them rather than a blanket rule, so
   nothing else that leans on them stays where it is. */
.tbar-clock-host{position:sticky}
/* Room in the middle. The clock is centred on the bar, so anything that
   stretches to fill the bar runs under it — the screen title did, because it
   carries flex:1 to push the actions cluster to the right. The cluster is
   pushed right by its own margin now, so the title can be its own width. */
.wm-topbar-title{ flex:0 1 auto;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap }
.tbar-logo{ min-width:0;overflow:hidden }
/* When the bar is short of room (a laptop with the sidebar open) the title is
   what gives way, never the Home button: the name truncates, the buttons
   keep their full width. */
.tbar-logo .tbar-home-btn,.tbar-logo .tbar-mark{ flex:0 0 auto }
.tbar-logo > div:has(> .tbar-name){ min-width:0;flex:0 1 auto }
.tbar-logo .tbar-name{ display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap }
@media(max-width:1100px){ .tbar-logo > div:has(> .tbar-name){ display:none } .tbar-logo{ flex-shrink:0 } }
/* The cluster hugs the right edge and stops short of the clock. A max-width
   cannot express "stop before the middle" on its own — a right-aligned box's
   left edge is the bar's width minus its own — so the figure is the half-bar
   less the clock's half-width and a gap. */
/* Every group that comes after the title, not just the shared one: the
   Calendar and the tracker each keep their own buttons in a plain <div>, and
   those were sitting in the middle of the bar by flow. */
.wm-topbar > .wm-topbar-title ~ div{ max-width:calc(50% - 74px);min-width:0 }
.wm-topbar > .wm-topbar-title ~ div:first-of-type{ margin-left:auto }
@media(max-width:620px){
  .wm-topbar > .wm-topbar-title ~ div{ max-width:calc(50% - 56px) }
}

/* Hidden by visibility rather than by display. With display:none the class that
   opens it also set its final opacity and transform in the same style change,
   so there was no rendered "before" for the browser to move from and the panel
   simply appeared. Kept rendered, the transition has two ends and runs. It is
   position:fixed, so staying laid out costs no space. */
.clock-pop{
  position:fixed;left:50%;
  transform:translateX(-50%) translateY(-8px) scale(.95);
  transform-origin:top center;
  z-index:1200;opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .16s var(--ease-out),
             transform .3s cubic-bezier(.22,1.1,.36,1),
             visibility 0s linear .3s;
}
.clock-pop.open{
  opacity:1;visibility:visible;pointer-events:auto;
  transform:translateX(-50%) translateY(0) scale(1);
  transition:opacity .18s var(--ease-out),
             transform .34s cubic-bezier(.22,1.1,.36,1),
             visibility 0s;
}
@media(prefers-reduced-motion:reduce){
  .clock-pop,.clock-pop.open{transition:opacity .12s linear;transform:translateX(-50%)}
}
/* The widget inside it keeps its own look; it simply is not in a column any
   more. */
.clock-pop #clock-widget{display:flex}
@media(max-width:620px){
  .tbar-clock-mode{display:none}
  .tbar-clock > span:not(.tbar-clock-mode){font-size:11px}
}

/* Where the bar's middle is already taken, the clock steps out of it and sits
   with the actions on the right instead. Which bars those are is measured, not
   listed — see _fitClock. */
.tbar-clock.tbar-clock-right{
  position:static;transform:none;margin-left:10px;flex:0 0 auto;
}

/* Which mod the estimate was struck at, beside the figure rather than only in
   a tooltip nobody hovers. */
.msb-est-mod{font-size:9px;font-weight:600;color:var(--text3);margin-left:5px}

/* ══════════════════════════════════════════════
   UPLOAD PROGRESS — see 13-upload-progress.js
══════════════════════════════════════════════ */
.upl-modal{
  position:fixed;inset:0;z-index:9600;
  display:flex;align-items:center;justify-content:center;
  background:rgba(6,10,20,0.55);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .2s var(--ease-out),visibility 0s linear .2s;
}
.upl-modal.show{
  opacity:1;visibility:visible;pointer-events:auto;
  transition:opacity .2s var(--ease-out);
}
.upl-card{
  width:min(360px,88vw);
  background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-lg);
  padding:28px 26px 22px;box-shadow:var(--shadow-lg);
  backdrop-filter:saturate(220%) blur(40px);-webkit-backdrop-filter:saturate(220%) blur(40px);
  text-align:center;position:relative;overflow:hidden;
}
.upl-icon{font-size:26px;color:#2ecc71;margin-bottom:10px}
.upl-title{font-size:14px;font-weight:700;color:var(--text);margin-bottom:18px;letter-spacing:-.01em}
.upl-track{position:relative;height:10px;border-radius:99px;background:var(--glass3);overflow:hidden;margin-bottom:8px}
.upl-fill{
  height:100%;width:0%;border-radius:99px;
  background:linear-gradient(90deg,#1fa153,#34d399);
  box-shadow:0 0 10px rgba(52,211,153,0.55);
  transition:width .18s linear;
}
.upl-meta{display:flex;justify-content:space-between;font-size:11px;font-weight:800;color:#2ecc71;font-family:var(--font-mono)}
.upl-label{color:var(--text3);font-weight:600;font-family:var(--font-sans)}
/* The decorative "data flowing into the bar" strip — bytes and JSON-shaped
   noise drifting upward and fading, purely cosmetic (see FRAGMENTS in the
   JS). Never drives .upl-fill's width; only setProgress() does that. */
.upl-stream{position:relative;height:22px;margin-top:6px;overflow:hidden}

@media(prefers-reduced-motion:reduce){
  .upl-modal,.upl-modal.show{transition:opacity .12s linear,visibility 0s linear}
  .upl-fill{transition:none}
  
}
.msb-est-mod:empty{display:none}

/* ── Marketing → Account info ──────────────────────────────────────────────
   The outreach list and its account card. Liquid glass throughout, taking
   the app's own surfaces, rounding and entrance from .gt-modal and the theme
   variables — no colour of its own anywhere.

   It had one for a while: the account card was painted the programme's
   Pantone (13-1520 TCX on an Appointment, 14-5714 TCX on a Presentation) and
   the list pill was filled with the same, which meant this screen carried the
   only literal colours in the file and the card printed in its own dark ink
   to survive them. All of that is gone. The programme is said in a word — on
   the pill in the list, and under the company name on the card. */
/* The screen wears CRM HUB's own shell — .gt-page, .gt-kpi-row, .gt-filter-bar,
   .gt-table-wrap, .gt-table, .gt-pager — so what is left here is only what is
   particular to this list. The .mkt-body/.mkt-toolbar/.mkt-table rules that
   used to draw a second, similar table are gone with it: two tables styled
   separately is two tables that stop agreeing. */
/* Says whether this is the desk's list or this computer's last copy of it.
   In the top bar now, beside the screen's name, rather than above the table. */
/* Bounded, and never at the screen name's expense: unbounded it squeezed
   "Account info" down to "Account i…" — measured, 112px of title into 111px
   of room. It is the line that can be cut short, not the name of the screen. */
.mkt-sync{font-size:10px;color:var(--text3);margin-left:14px;display:inline-flex;align-items:center;gap:6px;
  min-width:0;max-width:min(38vw,420px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#marketing-crm-screen .wm-topbar-title{flex-shrink:0}
.mkt-sync::before{content:'';width:6px;height:6px;border-radius:99px;background:var(--success);flex-shrink:0}
.mkt-sync.mkt-sync-off{color:var(--warn);font-weight:600}
.mkt-sync.mkt-sync-off::before{background:var(--warn)}
.mkt-file-btn{position:relative;cursor:pointer}
.mkt-row{cursor:pointer;transition:background var(--dur-fast) var(--ease-out)}
.mkt-row:hover,.mkt-row:focus-visible{background:var(--accent-soft);outline:none}
.mkt-row:focus-visible td:first-child{box-shadow:inset 2px 0 0 var(--accent)}
/* Glass, like everything else on this screen. It used to be filled with the
   programme's Pantone — that colour is gone, and the word is what says which
   programme it is. */
.mkt-pill{display:inline-block;padding:2px 9px;border-radius:99px;font-weight:700;font-size:10px;
  letter-spacing:.03em;color:var(--text2);background:var(--glass3);
  border:0.5px solid var(--border2);backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur)}

/* The card is the app's own liquid glass — .gt-modal's frosted panel, nothing
   painted on top. It carried the programme's Pantone for a while (13-1520 on
   an Appointment, 14-5714 on a Presentation); that colour is gone and the
   programme is said in words under the company name instead. What is left is
   the glass, and the movement. */
.mkt-card{max-width:560px;position:relative;
  /* Its own entrance rather than .gt-modal's 220ms fade-up: this card is the
     screen's whole point and it earns a moment of arriving. Later in the file
     than .gt-modal, same specificity, so it wins. */
  animation:mktCardIn .34s cubic-bezier(.22,.68,.26,1)}
@keyframes mktCardIn{
  from{opacity:0;transform:scale(.94) translateY(14px)}
  60%{opacity:1;transform:scale(1.008) translateY(-2px)}
  to{opacity:1;transform:scale(1) translateY(0)}
}
/* The same one-pixel light edge the analyzer's cards carry. */
.mkt-card::before{
  content:'';position:absolute;top:0;left:0;right:0;height:1px;pointer-events:none;z-index:1;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,0.30),transparent);
}
/* The company name and its programme follow the card in, a beat behind it. */
.mkt-card-title,.mkt-card-sub{animation:mktFieldIn .32s var(--ease-out) backwards;animation-delay:.10s}
.mkt-card-sub{animation-delay:.16s}
.mkt-card-head{border-bottom-color:rgba(20,32,46,0.18)}
.mkt-card-head{
  display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding:16px 18px 13px;border-bottom:0.5px solid var(--border);
}
.mkt-card-title{font-size:16px;font-weight:700;color:var(--text);line-height:1.3}
.mkt-card-sub{font-size:11px;font-weight:600;color:var(--text3);margin-top:3px}
.mkt-card-close{
  flex-shrink:0;width:26px;height:26px;border-radius:8px;border:none;background:none;
  color:var(--text3);cursor:pointer;font-size:14px;padding:0;font-family:inherit;
  display:flex;align-items:center;justify-content:center;
  transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out),
             transform var(--dur-fast) var(--ease-out);
}
.mkt-card-close:hover{background:var(--glass3);color:var(--text);transform:rotate(90deg)}
.mkt-card-close:active{transform:rotate(90deg) scale(.9)}
.mkt-card-body{padding:6px 18px 18px;overflow:auto}
/* The fields run in from the top rather than all landing together, so the eye
   reads the company first and then follows the account down. --i is set per
   row in mktOpenCard(); the arithmetic lives here. 26ms apart is under the
   threshold where a list starts to feel slow to arrive — the last of eleven
   is in place well inside a third of a second. */
.mkt-cf{display:grid;grid-template-columns:132px 1fr;gap:12px;align-items:baseline;
  padding:9px 0;border-bottom:0.5px solid var(--border3);
  animation:mktFieldIn .30s var(--ease-out) backwards;
  animation-delay:calc(60ms + var(--i, 0) * 26ms);
  border-radius:7px;transition:background var(--dur-fast) var(--ease-out)}
@keyframes mktFieldIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
/* A field lights up under the pointer — worth having on a card whose whole
   job is being read across, where losing your line between the label and the
   value two columns away is the actual failure. */
.mkt-cf:hover{background:var(--glass3)}
.mkt-cf:last-child{border-bottom:none}
.mkt-cf-label{font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3)}
.mkt-cf-value{font-size:13px;color:var(--text);word-break:break-word}
/* Destructive, and it is destructive for everyone — so it is at the foot of
   the card, out of the reading path, and says what it removes rather than
   sitting as a bare icon next to Close. */
.mkt-card-foot{
  display:flex;justify-content:flex-end;padding:10px 18px 14px;
  border-top:0.5px solid var(--border);
}
/* Physically a key, not a link: it sits on a base, is lifted off it, and
   travels down onto it when pressed. The depth is the point — this is the one
   control on the card that takes an account off the whole desk's list, and a
   key you have to push down is harder to hit by accident than a flat label.
   The base is what shows through as the edge, so the shadow that lifts it and
   the travel that takes it back down are the same distance (3px). Glass at
   rest like the card it sits on; the red is kept for the hover, where it
   belongs — as the answer to "what does this do", not as decoration. */
.mkt-card-remove{
  display:inline-flex;align-items:center;font-family:inherit;font-size:11px;font-weight:700;
  padding:7px 14px;border-radius:10px;cursor:pointer;min-height:32px;letter-spacing:-.01em;
  border:0.5px solid var(--border2);color:var(--text2);
  background:var(--glass2);backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  box-shadow:0 3px 0 var(--glass3),0 5px 10px rgba(0,0,0,0.22),
             inset 0 1px 0 rgba(255,255,255,0.22);
  transform:translateY(0);
  transition:transform .12s var(--ease-out),box-shadow .12s var(--ease-out),
             background .18s var(--ease-out),color .18s var(--ease-out),
             border-color .18s var(--ease-out);
}
.mkt-card-remove:hover{
  color:var(--danger);border-color:var(--danger);
  background:var(--danger-soft);
  transform:translateY(-1px);
  box-shadow:0 4px 0 var(--danger-soft),0 8px 16px rgba(0,0,0,0.26),
             inset 0 1px 0 rgba(255,255,255,0.22);
}
/* All the way down onto its base — no shadow left under it, because there is
   no gap left to cast one. */
.mkt-card-remove:active{
  transform:translateY(3px);
  box-shadow:0 0 0 transparent,0 1px 3px rgba(0,0,0,0.20),
             inset 0 1px 2px rgba(0,0,0,0.18);
}
.mkt-card-remove:focus-visible{outline:2px solid var(--danger);outline-offset:3px}
/* The icon leans back as the key goes down, so the whole thing reads as one
   object being pushed rather than a label that shrank. */
.mkt-card-remove i{transition:transform .18s var(--ease-out)}
.mkt-card-remove:hover i{transform:rotate(-9deg) scale(1.06)}
.mkt-card-remove:active i{transform:rotate(0) scale(.96)}
.mkt-dim{color:var(--text3)}
.mkt-link{color:var(--accent);text-decoration:none}
.mkt-link:hover{text-decoration:underline}
@media(max-width:560px){.mkt-cf{grid-template-columns:1fr;gap:2px}}

/* ── Time Off → who else is on vacation ───────────────────────────────────
   The same picture in two places: over the form the first time a request
   crosses somebody else's vacation, and docked to the side afterwards. One
   set of rules for the calendar itself, a size modifier for the docked copy —
   two calendars drawn twice is two calendars that stop agreeing. */
.vac-modal{max-width:600px}
.vac-cal{display:flex;flex-wrap:wrap;gap:18px}
.vac-month{flex:1;min-width:210px}
.vac-month-name{font-size:11px;font-weight:700;color:var(--text2);letter-spacing:.02em;margin-bottom:7px}
.vac-dow,.vac-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.vac-dow{margin-bottom:3px}
.vac-dow div{font-size:9px;font-weight:700;color:var(--text3);text-align:center;letter-spacing:.04em}
.vac-day{
  position:relative;aspect-ratio:1;border-radius:7px;
  display:flex;align-items:center;justify-content:center;
  font-size:11px;color:var(--text2);
  border:0.5px solid transparent;
  transition:background var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out);
}
.vac-day-pad{visibility:hidden}
/* The days being asked for. */
.vac-mine{background:var(--accent-soft);color:var(--accent);font-weight:700;border-color:var(--accent)}
/* Days somebody else already has. */
.vac-taken{background:var(--warn-soft);color:var(--warn)}
/* Both — the day the request is actually about. */
.vac-clash{background:var(--danger-soft);color:var(--danger);border-color:var(--danger);font-weight:700}
.vac-clash,.vac-taken{cursor:help}
.vac-day:hover{transform:scale(1.06)}
.vac-day-dot{
  position:absolute;top:2px;right:3px;min-width:11px;height:11px;border-radius:99px;
  background:currentColor;opacity:.55;font-size:8px;font-weight:700;line-height:11px;text-align:center;
}
.vac-who{flex:1 0 100%;border-top:0.5px solid var(--border);padding-top:10px;margin-top:2px}
.vac-who-title{font-size:9px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text3);margin-bottom:6px}
.vac-who-row{display:flex;justify-content:space-between;gap:12px;font-size:11px;padding:3px 0}
.vac-who-name{color:var(--text);font-weight:600}
.vac-who-when{color:var(--text3)}
.vac-pending{color:var(--warn);font-weight:600}
.vac-clear,.vac-empty{flex:1 0 100%;font-size:11px;color:var(--text3);padding:4px 0}
.vac-foot-note{flex:1;font-size:11px;color:var(--text3)}

/* The docked copy. Fixed, glass and draggable by its header — the calculator
   widget's own recipe, because it is the same kind of object: something the
   person keeps beside the work and moves out of the way when it is in it. */
#vac-dock{
  position:fixed;top:110px;right:24px;width:250px;z-index:3150;
  transform:scale(.92);transform-origin:top right;opacity:0;pointer-events:none;
  transition:transform .22s var(--ease-spring),opacity .18s;
  display:flex;flex-direction:column;
  background:var(--glass-card);backdrop-filter:saturate(180%) blur(28px);-webkit-backdrop-filter:saturate(180%) blur(28px);
  border:0.5px solid var(--border);border-radius:var(--r-lg);
  box-shadow:var(--shadow-float);padding:11px 11px 12px;
}
#vac-dock.open{transform:scale(1);opacity:1;pointer-events:all}
@media(prefers-reduced-motion:reduce){#vac-dock{transition:opacity .18s}}
.vac-dock-head{display:flex;justify-content:space-between;align-items:center;gap:8px;cursor:grab;user-select:none}
.vac-dock-head:active{cursor:grabbing}
.vac-dock-title{font-size:9px;font-weight:700;color:var(--text3);letter-spacing:.06em;text-transform:uppercase;display:flex;align-items:center}
.vac-dock-count{
  margin-left:6px;min-width:15px;height:15px;padding:0 4px;border-radius:99px;
  background:var(--danger);color:#fff;font-size:9px;font-weight:700;
  display:flex;align-items:center;justify-content:center;letter-spacing:0;
}
.vac-dock-btns{display:flex;gap:5px;flex-shrink:0}
.vac-dock-body{margin-top:9px;max-height:420px;overflow:auto}
/* Folded: the header alone, so it can sit in a corner and still say how many
   days are taken. A max-height rather than display:none, so it folds instead
   of vanishing. */
#vac-dock.vac-folded .vac-dock-body{max-height:0;margin-top:0;overflow:hidden}
#vac-dock .vac-dock-body{transition:max-height .22s var(--ease-out),margin-top .22s var(--ease-out)}
/* What the colours mean, said once under the calendar. Three swatches wearing
   the day classes themselves, so a colour cannot be changed in one place and
   explained wrongly in the other. */
.vac-legend{flex:1 0 100%;display:flex;flex-wrap:wrap;gap:12px;font-size:10px;color:var(--text3);padding-top:4px}
.vac-legend-item{display:flex;align-items:center;gap:5px}
.vac-key{width:11px;height:11px;border-radius:4px;flex-shrink:0;border:0.5px solid transparent}
.vac-fold-icon{transition:transform var(--dur) var(--ease-out)}
#vac-dock.vac-folded .vac-fold-icon{transform:rotate(180deg)}
.vac-cal-sm .vac-month{min-width:0}
/* The per-day count sits over the number at this size and is unreadable —
   the tooltip and the list of names below say the same thing with room. */
.vac-cal-sm .vac-day-dot{display:none}
.vac-cal-sm .vac-legend{gap:8px;font-size:9px}
.vac-cal-sm .vac-day{font-size:10px;border-radius:5px}
.vac-cal-sm .vac-month-name{font-size:10px}

/* ── Marketing Questions, and the call they came from ──
   Both panels are .gt-panel like the two above them, so an account reads as
   one column of boxes rather than as a form bolted under a card. */
.mkt-q-grid{display:grid;grid-template-columns:1fr;gap:14px}
@media(min-width:1000px){
  /* The two short answers sit side by side; the three that take a paragraph
     keep the full width, because wrapping a paragraph into half a column is
     how a form starts looking like a spreadsheet. */
  .mkt-q-grid{grid-template-columns:1fr 1fr}
  .mkt-q-grid > .avp-field:nth-child(n+3){grid-column:1 / -1}
}
.mkt-q-grid .avp-field label{text-transform:none;letter-spacing:0;font-size:11px;line-height:1.5;color:var(--text2)}
.mkt-q-sub{
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  margin-top:10px;padding:9px 12px;
  border:0.5px solid var(--border);border-radius:var(--r-sm);background:var(--glass2);
}
.mkt-q-sub-label{font-size:11px;color:var(--text2);line-height:1.5}
.mkt-q-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px}
/* Says when it was saved and by whom, or that it has not been. Same size and
   colour as every other quiet note on this screen — it is a receipt, not a
   status somebody has to read before they can work. */
.mkt-q-note{font-size:11px;color:var(--text3)}
.mkt-q-note.saved{color:var(--success)}
.mkt-q-note.failed{color:var(--danger)}

.mkt-voice-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.mkt-voice-list{display:flex;flex-direction:column;gap:10px}
.mkt-voice-row{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  border:0.5px solid var(--border);border-radius:12px;padding:11px 13px;background:var(--glass2);
}
.mkt-voice-name{font-size:12px;font-weight:600;color:var(--text)}
.mkt-voice-meta{font-size:10px;color:var(--text3)}
/* The player takes the room that is left, so a long file name never squeezes
   it to a scrubber nobody can hit. */
.mkt-voice-row audio{flex:1 1 260px;min-width:200px;height:34px}
.mkt-voice-empty{font-size:12px;color:var(--text3);padding:6px 0}

/* ── Custom date picker ───────────────────────────────────────────────────
   The native calendar on <input type="date"> is browser chrome: square, in
   the system's own colours, and unreachable from this stylesheet. The rule
   below removes the only thing that opens it on the mouse path and paints
   our own icon in its place; 18-custom-date.js draws the panel. Measured
   first: preventDefault on the mousedown does NOT suppress the native
   calendar, hiding the indicator does, and typing a date straight into the
   field still works with it hidden. */
input[type="date"]::-webkit-calendar-picker-indicator{display:none;-webkit-appearance:none}
input[type="date"]{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a94a6' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='5' width='16' height='16' rx='3'/%3E%3Cpath d='M16 3v4M8 3v4M4 11h16'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;background-size:14px 14px;
  padding-right:30px;
}
input[type="date"].cd-active{border-color:var(--accent)}
/* enhanceable() in 18-custom-date.js refuses these, so the icon would be
   an affordance for something that never happens. */
input[type="date"]:disabled,input[type="date"][readonly]{background-image:none;padding-right:10px}

.cd-panel{
  position:fixed;z-index:20000;width:264px;padding:10px;font-size:13px;
  background:var(--glass-card);backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  border:0.5px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);
  opacity:0;transform:translateY(-6px) scale(.97);transform-origin:top center;pointer-events:none;
  transition:opacity .14s var(--ease-out),transform .14s var(--ease-out);
}
.cd-panel.open{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}

.cd-head{display:flex;align-items:center;gap:4px;margin-bottom:8px}
.cd-nav{flex:none;width:26px;height:26px;display:flex;align-items:center;justify-content:center;
  padding:0;border:none;background:transparent;color:var(--text3);cursor:pointer;font-size:14px;
  border-radius:var(--r-sm);transition:background .15s var(--ease-out),color .15s var(--ease-out)}
.cd-nav:hover{background:var(--glass3);color:var(--text)}
.cd-nav .ti{font-size:14px}
.cd-title{flex:1;min-width:0;padding:5px 8px;border:none;background:transparent;cursor:pointer;
  font-family:inherit;font-size:13px;font-weight:600;color:var(--text);border-radius:var(--r-sm);
  transition:background .15s var(--ease-out)}
.cd-title:hover{background:var(--glass3)}

.cd-body{position:relative}
.cd-dow{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}
.cd-dow span{text-align:center;font-size:10px;font-weight:700;letter-spacing:.04em;color:var(--text2)}
.cd-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.cd-day{height:30px;display:flex;align-items:center;justify-content:center;padding:0;border:none;
  background:transparent;font-family:inherit;font-size:12px;font-weight:500;color:var(--text);
  cursor:pointer;border-radius:var(--r-sm);
  transition:background .12s var(--ease-out),color .12s var(--ease-out),transform var(--dur-fast) var(--ease-out)}
.cd-day:hover{background:var(--glass3)}
.cd-day:active{transform:scale(.92)}
.cd-day.cd-out{color:var(--text3);opacity:.55}
.cd-day.cd-today{box-shadow:inset 0 0 0 1px var(--accent);color:var(--accent)}
.cd-day.cd-sel{background:var(--accent);color:#fff;font-weight:700;box-shadow:none}
/* The chosen day is the one cell that must be readable, and in dark
   --accent is #4d8fe6: white on it measures 3.29:1, under the 4.5 this app
   holds itself to. Light's --accent is already dark enough (11.47:1). The
   panel is appended to <body>, so it only ever sees the theme root — no
   scoped --accent override (.desk-card, #weather-widget) can reach it.
   Measured after: 5.67:1. */
[data-theme="dark"] .cd-day.cd-sel,
[data-theme="dark"] .cd-month.cd-sel{background:#2563c9}
.cd-day.cd-disabled{opacity:.25;cursor:default;pointer-events:none}

/* The month change is animated in the direction of travel, so a new month
   reads as a new month instead of the numbers quietly becoming different
   numbers under the pointer. */
@keyframes cdSlideR{from{opacity:0;transform:translateX(7px)}to{opacity:1;transform:translateX(0)}}
@keyframes cdSlideL{from{opacity:0;transform:translateX(-7px)}to{opacity:1;transform:translateX(0)}}
.cd-grid.cd-slide-r{animation:cdSlideR .16s var(--ease-out)}
.cd-grid.cd-slide-l{animation:cdSlideL .16s var(--ease-out)}

.cd-months{position:absolute;inset:0;padding:6px;display:flex;flex-direction:column;gap:8px;
  background:var(--glass-card);backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);
  border-radius:var(--r-sm);opacity:0;transform:scale(.97);
  transition:opacity .14s var(--ease-out),transform .14s var(--ease-out)}
.cd-months.open{opacity:1;transform:scale(1)}
.cd-year-row{display:flex;align-items:center;justify-content:space-between;gap:4px}
.cd-year{font-size:13px;font-weight:700;color:var(--text)}
.cd-month-grid{flex:1;display:grid;grid-template-columns:repeat(3,1fr);gap:4px}
.cd-month{display:flex;align-items:center;justify-content:center;padding:0;border:none;
  background:transparent;font-family:inherit;font-size:12px;font-weight:500;color:var(--text);
  cursor:pointer;border-radius:var(--r-sm);transition:background .12s var(--ease-out)}
.cd-month:hover{background:var(--glass3)}
.cd-month.cd-sel{background:var(--accent);color:#fff;font-weight:700}

.cd-foot{display:flex;align-items:center;justify-content:space-between;gap:6px;
  margin-top:8px;padding-top:8px;border-top:0.5px solid var(--border)}
.cd-link{padding:4px 9px;border:none;background:transparent;font-family:inherit;font-size:11px;
  font-weight:600;color:var(--accent);cursor:pointer;border-radius:var(--r-sm);
  transition:background .15s var(--ease-out)}
.cd-link:hover{background:var(--accent-soft)}
/* An actionable control at 11px, not de-emphasised content: --text3 measures
   4.09:1 in light. (.cd-day.cd-out stays on --text3 — a day outside the month
   on show is meant to recede.) */
.cd-link-quiet{color:var(--text2)}
.cd-link-quiet:hover{background:var(--glass3);color:var(--text)}

#cal-month-label{min-width:120px}

/* ── Phone: the shared top bar has to fit ─────────────────────────────────
   It never shrank, so on a phone the whole app scrolled sideways on every
   one of the screens that use it — 507px of content in a 390px viewport,
   the avatar sitting 117px past the right edge. It is the controls on the
   right that do not fit, not the title: letting the title ellipsise was
   tried first and moved the number not at all, so that CSS was taken back
   out rather than left behind claiming a fix.
   Features and Widgets go icon-only here. Nothing is hidden and nothing
   moves behind an extra tap — both keep their place, their title attribute
   and their panels; they just stop spelling themselves out on a screen with
   no room for it. Desktop and tablet are untouched. */
/* The same squeeze, one band up: between a tablet and 960 with the sidebar
   open, the rail takes 74px and the right-hand cluster no longer fits beside
   Home and the clock — the bar ran 40-70px off the right edge. The buttons
   keep their place, their title and their panels; they only stop spelling
   themselves out. */
@media (min-width:761px) and (max-width:960px){
  body.nav-open .wpb-label,
  body.nav-open .voice-btn-txt{display:none}
  body.nav-open .widget-panel-btn{padding:4px 8px;gap:4px}
  body.nav-open #pwa-install-btn{font-size:0!important;gap:0!important;padding:5px 8px!important}
  body.nav-open #pwa-install-btn .ti{font-size:13px!important}
}
@media (max-width:560px){
  .wpb-label{display:none}
  /* gap only between what is left: the icon and the caret. */
  .widget-panel-btn{padding:4px 8px;gap:4px}
  .topbar{padding:.60rem .75rem}
  .tbar-logo{min-width:0}
  .tbar-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

  /* The other bar, the one the screens outside the Analyzer use, had the
     same problem from the other direction: its controls sat in one row that
     would not wrap, so Templates ran to 567px and Docs to 563px in a 390px
     viewport. One rule here rather than a patch on each screen — Carriers
     had one of those and it is gone now. */
  .wm-topbar{flex-wrap:wrap;padding:.60rem .75rem;gap:8px}
  /* The month label reserves 120px so the row does not jump between a short
     month and a long one. On a phone that reservation is the last 15px the
     Calendar's bar cannot give up, so it stands down here — the row is
     already wrapping, which is the jump it was guarding against. */
  #cal-month-label{min-width:0}
  /* Every screen keeps its actions in a plain div inside that bar, named or
     not, and a div that will not wrap is what ran Templates to 568px and
     Docs to 447px.
     The div takes the whole second line rather than being squeezed by the
     margin-left:auto that pushes it right on a wide screen: shrunk to 94px
     it simply overflowed itself, because a button cannot give up the width
     of its own label. */
  /* !important because every one of these divs carries margin-left:auto in
     an inline style, and an inline style beats a stylesheet. The auto margin
     is what pushes the actions right on a wide screen; on a wrapped line it
     is what squeezed the div to 94px around a 132px button. */
  /* flex-shrink 0, not 1: with shrink on, a 100% basis still collapses to
     share the line instead of taking one, which is how the CRM's bar kept a
     94px box around a 120px button. */
  .wm-topbar > div{flex:1 0 100%;margin-left:0!important;flex-wrap:wrap;min-width:0}
  .wm-topbar-actions{justify-content:flex-end}
  .wm-topbar .wm-search{min-width:0;flex:1 1 150px}
  .wm-topbar .wm-search input{min-width:0}
}

/* A closed day panel is translated off the right edge, and a fixed element
   still counts toward the document's width there: the Calendar measured
   688px of page in a 390px viewport with the panel shut. Hidden when it is
   shut — which also stops a panel nobody can see from catching clicks —
   and the visibility change is delayed by the length of the slide so the
   panel does not vanish on its way out. */
#cal-day-panel{visibility:hidden;transition:transform .3s var(--ease-out),visibility 0s linear .3s}
#cal-day-panel.open{visibility:visible;transition:transform .3s var(--ease-out),visibility 0s linear 0s}

/* ══ LIQUID GLASS — the edge ═══════════════════════════════════════════════
   The fills above were thinned so the 44px blur behind them is visible; what
   makes glass read as glass rather than a tinted rectangle is the EDGE — a lip
   that catches light along its top and loses it underneath. All of it is
   inset: an outward spread on a backdrop-filter element paints as a rectangle
   in Chromium and squares off the corner. Nothing here follows the pointer.

   .lg-spec is applied by 22-liquid-glass.js to the surfaces that already
   carry the app's glass, so a surface added later gets it without anyone
   remembering to. */
.lg-spec{position:relative}
.lg-spec::after{
  content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  /* The lip: bright along the top edge, dark along the bottom. */
  box-shadow:inset 0 1px 0 0 var(--spec-top), inset 0 -1px 0 0 var(--spec-bottom);
  /* A fixed sheen from the top-left corner. It does not follow the pointer
     and does not brighten on hover: nothing here reacts to the cursor. */
  background:radial-gradient(120% 90% at 22% 0%, var(--spec-sheen) 0%, transparent 58%);
  opacity:.9;
  z-index:0}
/* Every child sits above the sheen — ::after is painted last among siblings,
   so without this it would wash over the card's own text. */
.lg-spec > *{position:relative;z-index:1}

/* ── THE MARK ─────────────────────────────────────────────────────────────
 *
 * The artwork is a transparent PNG of a glass letter and its glow (see
 * tools/img/make-icons.mjs for how the black field came off it), so the light
 * in it belongs to the letter and not to a box. Everything here follows that
 * alpha rather than the element's rectangle:
 *
 *   · the glow is a drop-shadow, which traces the letter. A box-shadow would
 *     have drawn a halo around a square nobody can see.
 *   · the specular sweep is a gradient MASKED BY THE SAME FILE, so the streak
 *     travels across the N itself and stops at its edges.
 *
 * One <span> per mark rather than styling the <img>: an <img> has no
 * pseudo-elements to put a sweep in, and the tiles that hold these already
 * spend theirs on the boot rings and the welcome flash.
 */
.nv-mark{
  position:relative;display:block;width:100%;height:100%;
  /* Contains the sweep's blend mode, so it lights the letter and not the
     card behind the tile. */
  isolation:isolate;
}
.nv-mark img{
  display:block;width:100%;height:100%;object-fit:contain;
  animation:nvBreathe 5.2s ease-in-out infinite;
}
/* Slow enough to read as the material settling rather than as a blinking
   indicator — this sits on the sign-in screen, which people look at while
   typing a password. */
@keyframes nvBreathe{
  0%,100%{filter:drop-shadow(0 0 4px rgba(77,143,230,0.30))}
  50%{filter:drop-shadow(0 0 13px rgba(125,185,255,0.62))}
}
.nv-mark::after{
  content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(112deg,
    transparent 40%, rgba(255,255,255,0.90) 50%, transparent 60%);
  background-size:280% 100%;background-repeat:no-repeat;
  -webkit-mask-image:url("../img/novais-mark-192.png");
          mask-image:url("../img/novais-mark-192.png");
  -webkit-mask-size:contain;mask-size:contain;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center;
  mix-blend-mode:screen;opacity:0;
  animation:nvSweep 7s ease-in-out infinite;
}
/* Mostly waiting. The streak is the punctuation, so it crosses once every
   seven seconds and the rest of the cycle is the glow on its own; run
   continuously it would be a barber's pole. */
@keyframes nvSweep{
  0%,70%{background-position:135% 0;opacity:0}
  74%{opacity:0.85}
  96%,100%{background-position:-45% 0;opacity:0}
}
@media(prefers-reduced-motion:reduce){
  .nv-mark img{animation:none;filter:drop-shadow(0 0 7px rgba(77,143,230,0.42))}
  .nv-mark::after{display:none}
}

/* ── PERFORMANCE ──────────────────────────────────────────────────────────
 *
 * Only what the app did not already have. The screen is built from .pbi-card,
 * .eml-tab, .kpi-import-btn and .avp-btn — the same furniture every other
 * screen uses — so what is left is the table, the tiles and the bars.
 */
/* Card contents sit in from the edge, the way every other card's do. The
   heads were right — .pbi-head brings its own 14/18 — and everything below
   them was flush: the import button, the hint under it, the filters, the
   tables and the configuration form all started 1px from the border, which
   is the kind of thing that reads as "unfinished" without anybody being able
   to say why. Applied to the card's children rather than to each of the nine
   things inside them, so a panel added later is inset without anybody
   remembering to. */
#perf-screen .pbi-card > *:not(.pbi-head){padding-left:18px;padding-right:18px}
#perf-screen .pbi-card > .pbi-head + *{padding-top:14px}
#perf-screen .pbi-card > *:not(.pbi-head):last-child{padding-bottom:16px}
/* The tables carry their own cell padding on top of that, same as the Activ
   & Bonus table does, so their first column lines up with the head above. */
#perf-screen .perf-table-wrap{padding-left:18px;padding-right:18px}
#perf-screen .perf-table th:first-child,#perf-screen .perf-table td:first-child{padding-left:0}
#perf-screen .perf-table th:last-child,#perf-screen .perf-table td:last-child{padding-right:0}

.perf-hint{font-size:11px;color:var(--text3);margin:8px 0 0;line-height:1.5}

.perf-table-wrap{overflow-x:auto}
.perf-table{width:100%;border-collapse:collapse;font-size:12px}
.perf-table th{
  text-align:left;font-size:10px;font-weight:700;color:var(--text3);
  letter-spacing:.06em;text-transform:uppercase;
  padding:8px 10px;border-bottom:0.5px solid var(--border2);white-space:nowrap}
.perf-table td{padding:8px 10px;border-bottom:0.5px solid var(--border3);color:var(--text2)}
.perf-table tr:last-child td{border-bottom:none}
.perf-table tbody tr:hover{background:var(--glass3)}
.perf-table .num{text-align:right;font-variant-numeric:tabular-nums}
.perf-table .perf-name{color:var(--text);font-weight:600}
/* A scorecard opens under the row it belongs to, so the person and their
   lines are never on screen without each other. */
.perf-row-open{cursor:pointer}
.perf-detail td{background:var(--glass3);padding:0}
.perf-detail-inner{padding:10px 14px}

/* The rating, wherever it appears, is the one element on this screen that
   carries a colour of its own — every band's colour is configuration. */
.perf-badge{
  display:inline-block;padding:2px 9px;border-radius:99px;
  font-size:10px;font-weight:700;letter-spacing:.02em;white-space:nowrap;
  border:0.5px solid currentColor}

/* A score as a bar, because a column of numbers does not show a spread and
   this screen's whole job is comparison. */
.perf-bar{height:6px;border-radius:99px;background:var(--glass3);overflow:hidden;min-width:60px}
.perf-bar > span{display:block;height:100%;border-radius:99px;background:var(--accent)}
.perf-bar-row{display:flex;align-items:center;gap:10px}
.perf-bar-row .perf-bar{flex:1}
.perf-bar-label{font-size:11px;color:var(--text2);min-width:0;flex:0 0 auto}
.perf-bar-val{font-size:11px;font-weight:700;color:var(--text);
  font-variant-numeric:tabular-nums;flex:0 0 auto;min-width:42px;text-align:right}
.perf-bar-list{display:flex;flex-direction:column;gap:9px;padding:4px 0}

.perf-kpi-row{display:grid;grid-template-columns:1fr;gap:12px;margin-bottom:12px}
@media(min-width:640px){.perf-kpi-row{grid-template-columns:repeat(4,1fr)}}
.perf-tile{
  background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-lg);
  backdrop-filter:var(--blur2);-webkit-backdrop-filter:var(--blur2);
  padding:14px 16px}
.perf-tile-label{font-size:10px;font-weight:700;color:var(--text3);
  letter-spacing:.06em;text-transform:uppercase}
.perf-tile-value{font-size:24px;font-weight:600;color:var(--text);
  letter-spacing:-.02em;margin-top:4px;font-variant-numeric:tabular-nums}
.perf-tile-sub{font-size:11px;color:var(--text3);margin-top:2px}

.perf-dash-grid{display:grid;grid-template-columns:1fr;gap:12px}
@media(min-width:900px){.perf-dash-grid{grid-template-columns:1fr 1fr}}

.perf-filters{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
/* Every control on this row is the same height as every other control in the
   app — the address row learned this the hard way. */
.perf-filters select,.perf-filters input{
  font-size:13px;padding:9px 12px;box-sizing:border-box;min-height:44px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);outline:none;font-family:inherit}
.perf-filters input{flex:1;min-width:160px}

.perf-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:14px;flex-wrap:wrap}

/* What the import refused, and why, before anything is saved. */
.perf-problem{
  display:flex;gap:8px;align-items:flex-start;
  font-size:11px;line-height:1.5;padding:8px 10px;border-radius:var(--r-sm);
  background:rgba(239,68,68,0.10);border:0.5px solid rgba(239,68,68,0.28);
  color:var(--text2);margin-bottom:6px}
.perf-problem.warn{background:rgba(245,158,11,0.10);border-color:rgba(245,158,11,0.30)}
.perf-problem i{color:var(--danger);font-size:13px;flex:0 0 auto;margin-top:1px}
.perf-problem.warn i{color:var(--warning,#F59E0B)}
.perf-problem-row{font-weight:700;color:var(--text)}

.perf-empty{
  display:flex;flex-direction:column;align-items:center;gap:6px;
  padding:28px 16px;color:var(--text3);font-size:12px;text-align:center}
.perf-empty i{font-size:22px;opacity:.5}

/* Configuration is a form per KPI, not a JSON box: the point of the module is
   that HR can change a threshold without knowing what JSON is. */
.perf-cfg-group{margin-bottom:18px}
.perf-cfg-group > h4{
  font-size:11px;font-weight:700;color:var(--accent);margin:0 0 8px;
  letter-spacing:.06em;text-transform:uppercase}
.perf-cfg-kpi{
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  padding:10px 12px;margin-bottom:8px;background:var(--glass3)}
.perf-cfg-head{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.perf-cfg-head input,.perf-cfg-head select{
  font-size:12px;padding:6px 8px;box-sizing:border-box;min-height:34px;
  border:0.5px solid var(--border2);border-radius:var(--r-sm);
  background:var(--input-bg);color:var(--text);outline:none;font-family:inherit}
.perf-cfg-name{flex:1;min-width:120px}
.perf-cfg-num{width:82px;text-align:right;font-variant-numeric:tabular-nums}
.perf-cfg-rules{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;align-items:center}
.perf-cfg-rule{
  display:flex;gap:4px;align-items:center;
  background:var(--glass2);border:0.5px solid var(--border3);
  border-radius:99px;padding:3px 8px}
.perf-cfg-rule select,.perf-cfg-rule input{
  font-size:11px;padding:2px 4px;min-height:24px;border:none;background:transparent;
  color:var(--text);outline:none;font-family:inherit}
.perf-cfg-rule input{width:52px;text-align:right;font-variant-numeric:tabular-nums}
.perf-cfg-total{font-size:11px;font-weight:700;margin-top:4px}
.perf-cfg-total.ok{color:var(--success)}
.perf-cfg-total.bad{color:var(--danger)}
/* The spellings a team answers to. Wider than a name because it holds several
   of them, and monospaced because what matters is the exact characters —
   "acct mgmt" and "acctmgmt" are two different lines on the sheet. */
.perf-cfg-match{
  flex:2;min-width:180px;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px!important}
/* One leader row: who, their ID, then the field. The first two are read, not
   typed, so they are labels rather than disabled inputs — a greyed-out box
   reads as something broken. */
.perf-cfg-who{font-size:12px;font-weight:600;color:var(--text);flex:1;min-width:120px}
.perf-cfg-sol{
  font-size:11px;color:var(--text3);font-variant-numeric:tabular-nums;
  min-width:64px}
/* ══════════════════════════════════════════════════════════════════════════
   NovaStudio
   ═════════════════════════════════════════════════════════════════════════

   The analytics workspace. Built on the app's own tokens — --glass-card,
   --border, --text/2/3, --accent, --r/--r-sm, the --pal-* series and the
   --ease-* curves — so a theme change moves it with everything else and the
   two themes never have to be hand-synced here.

   Three things carry their own rules rather than borrowing:

     · The report canvas is an absolutely-positioned surface, because visuals
       are placed and resized by hand. Everything else in the app is flow.
     · Marks animate on transform and opacity only. Nothing here animates a
       property that re-runs layout, because a slicer click redraws a dozen
       charts at once and that is where the frames go.
     · The presentation stage is fixed, above everything, and paints its own
       ground. It is the only surface in the app that is not the body's.     */

#novastudio-screen{display:none;min-height:100vh;padding:0 0 0}
#novastudio-screen.ns-file-over::after{
  content:'Drop to import';position:fixed;inset:12px;z-index:60;pointer-events:none;
  border:2px dashed var(--accent);border-radius:var(--r-lg);background:var(--accent-soft);
  display:flex;align-items:center;justify-content:center;
  font-size:18px;font-weight:700;color:var(--accent);letter-spacing:.01em}

.ns-report-name{
  flex:0 1 240px;min-width:0;margin-left:10px;padding:5px 9px;border-radius:var(--r-sm);
  border:0.5px solid var(--border);background:var(--input-bg);color:var(--text);
  font-family:inherit;font-size:12px;font-weight:600}
.ns-report-name:focus{outline:none;border-color:var(--accent2);box-shadow:0 0 0 3px var(--accent-soft)}
.ns-topbar-right{margin-left:auto;display:flex;align-items:center;gap:8px;min-width:0}

/* ── Buttons ───────────────────────────────────────────────────────────── */
.ns-btn{
  display:inline-flex;align-items:center;gap:5px;padding:6px 11px;border-radius:var(--r-sm);
  border:0.5px solid var(--border);background:var(--glass-card);color:var(--text);
  font-family:inherit;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap;
  transition:background .18s var(--ease-out),transform .18s var(--ease-out),border-color .18s var(--ease-out)}
.ns-btn:hover{background:var(--glass2);transform:translateY(-1px)}
.ns-btn:active{transform:translateY(0)}
.ns-btn:focus-visible{outline:2px solid var(--accent2);outline-offset:2px}
.ns-btn i{font-size:13px}
.ns-btn-primary{background:var(--accent);border-color:transparent;color:#fff}
.ns-btn-primary:hover{background:var(--accent2)}
.ns-btn-small{padding:4px 8px;font-size:11px}
.ns-btn-danger{color:var(--danger)}
.ns-btn-shared{color:var(--success);border-color:var(--border2)}
.ns-btn-icon{padding:6px 8px}
.ns-btn:disabled{opacity:.4;cursor:default;transform:none;background:var(--glass-card)}
.ns-btn-group{display:inline-flex}
.ns-btn-group .ns-btn:first-child{border-top-right-radius:0;border-bottom-right-radius:0}
.ns-btn-group .ns-btn:last-child{border-top-left-radius:0;border-bottom-left-radius:0;border-left:none}
.ns-mirror{display:inline-block;transform:scaleX(-1)}
.ns-menu{
  position:fixed;z-index:60;min-width:190px;padding:5px;border-radius:var(--r-sm);
  border:0.5px solid var(--border);background:var(--glass-card);backdrop-filter:var(--blur);
  box-shadow:0 12px 32px rgba(0,0,0,.18);animation:nsFadeIn .14s var(--ease-out)}
.ns-menu button{
  display:flex;align-items:center;gap:8px;width:100%;padding:7px 9px;border:none;border-radius:6px;
  background:none;color:var(--text);font-family:inherit;font-size:12px;font-weight:500;text-align:left;cursor:pointer}
.ns-menu button:hover,.ns-menu button:focus-visible{background:var(--glass2);outline:none}
.ns-menu button:disabled{opacity:.4;cursor:default;background:none}
.ns-menu button i{font-size:14px;color:var(--text3)}
.ns-menu hr{border:none;border-top:0.5px solid var(--border3);margin:4px 2px}
.ns-drill{
  position:absolute;right:8px;bottom:6px;z-index:2;display:inline-flex;align-items:center;gap:3px;
  padding:1px 3px;border-radius:999px;border:0.5px solid var(--border);background:var(--glass-card);
  backdrop-filter:var(--blur);color:var(--text3);font-size:10px;font-weight:600}
.ns-drill span{padding:0 4px}
.ns-drill-btn{
  display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;
  border:none;background:none;color:var(--text3);cursor:pointer;padding:0}
.ns-drill-btn:hover,.ns-drill-btn:focus-visible{background:var(--glass2);color:var(--accent);outline:none}
.ns-drill-btn i{font-size:12px}
.ns-icon-btn{
  display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;
  border:none;border-radius:7px;background:none;color:var(--text3);cursor:pointer;
  font-family:inherit;transition:background .15s var(--ease-out),color .15s var(--ease-out)}
.ns-icon-btn:hover{background:var(--glass3);color:var(--text)}
.ns-icon-btn:focus-visible{outline:2px solid var(--accent2);outline-offset:1px}
.ns-icon-btn i{font-size:14px}
.ns-spacer{flex:1}

/* ── Presence ──────────────────────────────────────────────────────────── */
.ns-presence{display:flex;align-items:center;gap:5px;flex-wrap:nowrap;overflow:hidden;max-width:46vw}
.ns-peer{
  display:inline-flex;align-items:center;gap:5px;padding:3px 8px 3px 5px;border-radius:999px;
  background:var(--glass3);border:0.5px solid var(--border3);white-space:nowrap;
  font-size:11px;font-weight:600;color:var(--text2)}
.ns-peer.me{background:var(--accent-soft);border-color:var(--border2)}
.ns-peer-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
.ns-peer-act{color:var(--text3);font-weight:400;max-width:180px;overflow:hidden;text-overflow:ellipsis}
.ns-peer-note{
  font-size:10px;color:var(--text3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:240px}

/* ── Shell ─────────────────────────────────────────────────────────────── */
.ns-shell{display:flex;align-items:stretch;height:calc(100vh - 52px);min-height:420px;position:relative}
.ns-rail{
  flex:0 0 74px;display:flex;flex-direction:column;gap:3px;padding:10px 7px;
  border-right:0.5px solid var(--border);background:var(--glass3)}
.ns-rail button{
  display:flex;flex-direction:column;align-items:center;gap:3px;padding:9px 4px;
  border:none;border-radius:var(--r-sm);background:none;color:var(--text3);
  font-family:inherit;font-size:10px;font-weight:600;cursor:pointer;
  transition:background .18s var(--ease-out),color .18s var(--ease-out)}
.ns-rail button i{font-size:18px}
.ns-rail button:hover{background:var(--glass2);color:var(--text2)}
.ns-rail button.on{background:var(--accent-soft);color:var(--accent)}
.ns-rail button:focus-visible{outline:2px solid var(--accent2);outline-offset:-2px}
.ns-main{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}
.ns-view{flex:1;min-height:0;display:flex;flex-direction:column;overflow:auto;padding:14px 16px 20px}
.ns-view-report{overflow:hidden;padding:0}
.ns-view-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:12px}
.ns-view-title{margin:0;font-size:18px;font-weight:700;color:var(--text)}
.ns-view-sub{font-size:12px;color:var(--text3)}
.ns-import-status{margin-left:auto;font-size:11px;font-weight:600;color:var(--text3)}
.ns-import-status.bad{color:var(--danger)}
.ns-storage-note{
  display:flex;align-items:flex-start;gap:8px;margin:10px 16px 0;padding:9px 12px;
  border-radius:var(--r-sm);background:var(--warn-soft);border:0.5px solid var(--warn-border);
  font-size:11px;line-height:1.55;color:var(--text2)}
.ns-storage-note i{color:var(--warn);font-size:14px;flex:0 0 auto}
.ns-side-head{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:4px 0 8px;font-size:11px;font-weight:700;color:var(--text3);
  letter-spacing:.06em;text-transform:uppercase}
.ns-empty-note{padding:16px;font-size:12px;line-height:1.6;color:var(--text3);text-align:center}
.ns-detail-sub{font-size:11px;color:var(--text3)}
.ns-table-note{padding:7px 2px;font-size:10px;color:var(--text3)}

/* ── Data view ─────────────────────────────────────────────────────────── */
.ns-dropzone{
  margin:auto;max-width:460px;padding:36px 28px;text-align:center;
  border:2px dashed var(--border2);border-radius:var(--r-lg);background:var(--glass3)}
.ns-dropzone i{font-size:40px;color:var(--accent2)}
.ns-dropzone-title{margin-top:10px;font-size:16px;font-weight:700;color:var(--text)}
.ns-dropzone-sub{margin:6px 0 16px;font-size:12px;line-height:1.6;color:var(--text3)}
.ns-dropzone-actions{display:flex;gap:8px;justify-content:center;flex-wrap:wrap}
.ns-dropzone-note{margin-top:12px;font-size:10px;color:var(--text3)}
.ns-data-body{flex:1;min-height:0;display:flex;gap:14px}
.ns-data-side{flex:0 0 212px;display:flex;flex-direction:column;gap:4px;overflow:auto}
.ns-data-main{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}
.ns-table-chip{
  display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:8px 10px;
  border:0.5px solid var(--border3);border-radius:var(--r-sm);background:var(--glass3);
  color:var(--text2);font-family:inherit;font-size:12px;font-weight:600;cursor:pointer;text-align:left;
  transition:background .18s var(--ease-out),border-color .18s var(--ease-out)}
.ns-table-chip:hover{background:var(--glass2)}
.ns-table-chip.on{background:var(--accent-soft);border-color:var(--border2);color:var(--accent)}
.ns-table-chip i{font-size:13px;margin-right:5px}
.ns-table-chip-name{overflow:hidden;text-overflow:ellipsis;max-width:100%}
.ns-table-chip-rows{font-size:10px;font-weight:400;color:var(--text3)}
.ns-detail-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.ns-table-name{
  padding:5px 9px;border-radius:var(--r-sm);border:0.5px solid var(--border);
  background:var(--input-bg);color:var(--text);font-family:inherit;font-size:14px;font-weight:700}
.ns-measure-strip{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:9px}
.ns-measure-chip{
  display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:999px;
  border:0.5px solid var(--border2);background:var(--accent-soft);color:var(--accent);
  font-family:inherit;font-size:11px;font-weight:600;cursor:pointer}
.ns-measure-chip:hover{background:var(--glass2)}
.ns-grid-wrap{flex:1;min-height:0;overflow:auto;border:0.5px solid var(--border);border-radius:var(--r-sm);background:var(--glass-card)}

/* ── "As in Excel": the sheet drawn the way Excel draws it ──────────────
   Deliberately not themed. The point of this view is that it looks like the
   file on the PC — white paper, black text, Excel's grey headers and green
   selection — in dark mode too, the way Excel itself does. */
.ns-grid-wrap.ns-grid-wrap-xl{overflow:hidden;display:flex;background:#fff}
.ns-xl{flex:1;min-width:0;display:flex;flex-direction:column;background:#fff;color:#000}
.ns-xl-bar{
  display:flex;align-items:center;gap:8px;padding:4px 8px;border-bottom:1px solid #d4d4d4;background:#fff;
  font-family:"Segoe UI",system-ui,sans-serif;font-size:12px;color:#222}
.ns-xl-addr{min-width:64px;padding:2px 6px;border:1px solid #d4d4d4;border-radius:2px;text-align:center;font-weight:600}
.ns-xl-fx{font-style:italic;color:#7a7a7a;font-family:Georgia,serif;padding:0 4px;border-left:1px solid #e1e1e1;border-right:1px solid #e1e1e1}
.ns-xl-formula{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ns-xl-zoom{display:inline-flex;align-items:center;gap:2px;color:#444}
.ns-xl-zoom .ns-icon-btn{color:#444}
.ns-xl-zoom-val{min-width:40px;text-align:center;font-size:11px}
.ns-xl-scroll{flex:1;min-height:0;overflow:auto;background:#fff;outline:none;position:relative}
.ns-xl-grid{table-layout:fixed;border-collapse:separate;border-spacing:0;color:#000;background:#fff;line-height:1.25}
.ns-xl-grid td{
  padding:0 3px;border-right:1px solid #e1e1e1;border-bottom:1px solid #e1e1e1;white-space:nowrap;
  overflow:visible;vertical-align:bottom;text-align:left;cursor:cell}
.ns-xl-grid td.num{text-align:right}
.ns-xl-grid td.mid{text-align:center}
.ns-xl-grid.nogrid td{border-color:transparent}
.ns-xl-grid th{
  position:sticky;top:0;z-index:3;background:#f3f3f3;color:#444;font:400 11px "Segoe UI",system-ui,sans-serif;
  text-align:center;border-right:1px solid #d4d4d4;border-bottom:1px solid #d4d4d4;height:20px;padding:0;user-select:none}
.ns-xl-grid th.ns-xl-rowh{left:0;z-index:2;top:auto}
.ns-xl-grid th.ns-xl-rowh.fzr{z-index:4}
.ns-xl-grid th.ns-xl-corner{left:0;z-index:5}
.ns-xl-grid th.fz{z-index:4}
.ns-xl-grid th.on{background:#d2d2d2;color:#217346;font-weight:700;border-bottom-color:#217346}
.ns-xl-grid th.ns-xl-rowh.on{border-right:2px solid #217346}
.ns-xl-grid td.fz{position:sticky;z-index:1;background:#fff}
.ns-xl-grid td.fzr{position:sticky;z-index:1;background:#fff}
.ns-xl-grid td.fz.fzr{z-index:3}
.ns-xl-grid td.fz.tx,.ns-xl-grid td.fzr.tx{z-index:2}
.ns-xl-grid td.fz.fzr.tx{z-index:4}
.ns-xl-grid td.clip{overflow:hidden;text-overflow:clip}
.ns-xl-grid td.fz-edge,.ns-xl-grid th.fz-edge{border-right:1px solid #9b9b9b}
.ns-xl-grid tr.fz-edge td,.ns-xl-grid tr.fz-edge th{border-bottom:1px solid #9b9b9b}
.ns-xl-grid td.sel{outline:2px solid #217346;outline-offset:-2px}
.ns-xl-grid td.rng:not(.fz):not(.fzr){position:relative}
.ns-xl-grid td.rng::after{content:"";position:absolute;inset:-1px 0 0 -1px;pointer-events:none}
.ns-xl-grid td.rng-t::after{border-top:2px dashed #217346}
.ns-xl-grid td.rng-b::after{border-bottom:2px dashed #217346}
.ns-xl-grid td.rng-l::after{border-left:2px dashed #217346}
.ns-xl-grid td.rng-r::after{border-right:2px dashed #217346}
.ns-xl-truncated{padding:8px 10px !important;color:#555;font:400 12px "Segoe UI",system-ui,sans-serif;white-space:normal !important;background:#fafafa}
.ns-xl-tabs{
  display:flex;align-items:flex-end;gap:1px;padding:0 8px;min-height:28px;overflow-x:auto;
  background:#f3f3f3;border-top:1px solid #d4d4d4}
.ns-xl-tab{
  border:none;border-bottom:3px solid var(--tab,transparent);background:transparent;color:#444;padding:5px 14px 3px;
  font:400 12px "Segoe UI",system-ui,sans-serif;cursor:pointer;white-space:nowrap;border-radius:0}
.ns-xl-tab:hover{background:#e6e6e6}
.ns-xl-tab.on{background:#fff;color:#217346;font-weight:700;box-shadow:0 1px 0 #fff,1px 0 0 #d4d4d4,-1px 0 0 #d4d4d4}
.ns-xl-tab.on:not([style]){border-bottom-color:#217346}

/* Segmented switch: "As in Excel" | "Data" */
.ns-seg{display:inline-flex;border:0.5px solid var(--border);border-radius:var(--r-sm);overflow:hidden;background:var(--glass-card)}
.ns-seg button{
  display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border:none;background:none;color:var(--text2);
  font-family:inherit;font-size:12px;font-weight:600;cursor:pointer}
.ns-seg button+button{border-left:0.5px solid var(--border)}
.ns-seg button.on{background:var(--accent-soft);color:var(--accent)}
.ns-seg button i{font-size:13px}
.ns-grid{border-collapse:separate;border-spacing:0;width:100%;font-size:11px}
.ns-grid th{
  position:sticky;top:0;z-index:1;padding:6px 9px;text-align:left;vertical-align:bottom;
  background:var(--glass2);backdrop-filter:var(--blur);border-bottom:0.5px solid var(--border);
  font-weight:700;color:var(--text2);white-space:nowrap}
.ns-col-name{display:block}
.ns-col-type{
  margin-top:3px;padding:1px 3px;border-radius:5px;border:0.5px solid var(--border3);
  background:var(--input-bg);color:var(--text3);font-family:inherit;font-size:10px}
.ns-col-calc{margin-left:5px;color:var(--accent2);font-style:italic;font-weight:700}
/* A column the workbook itself calculated (its formula is in the title). */
.ns-col-xl{color:var(--success)}
.ns-grid td{padding:5px 9px;border-bottom:0.5px solid var(--border3);color:var(--text2);white-space:nowrap}
.ns-grid td.num{text-align:right;font-variant-numeric:tabular-nums}
.ns-grid tr:hover td{background:var(--glass3)}

/* ── Model view ────────────────────────────────────────────────────────── */
.ns-model-body{flex:1;min-height:0;display:flex;flex-direction:column;gap:10px}
.ns-model-hint{font-size:11px;color:var(--text3)}
.ns-model-canvas{
  position:relative;flex:1;min-height:320px;overflow:auto;
  border:0.5px solid var(--border);border-radius:var(--r);background:var(--glass3)}
.ns-model-lines{position:absolute;inset:0;pointer-events:none;overflow:visible}
.ns-rel-line{fill:none;stroke:var(--accent2);stroke-width:1.8;opacity:.75}
.ns-rel-line.suggested{stroke-dasharray:5 4;opacity:.5}
.ns-tcard{
  position:absolute;width:196px;max-height:290px;display:flex;flex-direction:column;
  border:0.5px solid var(--border);border-radius:var(--r-sm);background:var(--glass-card);
  backdrop-filter:var(--blur);box-shadow:var(--shadow);overflow:hidden}
.ns-tcard-head{
  display:flex;align-items:center;gap:6px;padding:7px 10px;cursor:grab;
  background:var(--accent-soft);border-bottom:0.5px solid var(--border3);
  font-size:12px;font-weight:700;color:var(--text)}
.ns-tcard-head:active{cursor:grabbing}
.ns-tcard-cols{overflow:auto;padding:3px}
.ns-tcol{
  display:flex;align-items:center;gap:6px;padding:4px 7px;border-radius:6px;
  font-size:11px;color:var(--text2);cursor:grab}
.ns-tcol i{font-size:12px;color:var(--text3)}
.ns-tcol:hover{background:var(--glass3)}
.ns-tcol.drop{background:var(--accent-soft);outline:1px dashed var(--accent2)}
.ns-rel-list{flex:0 0 auto;max-height:230px;overflow:auto}
.ns-rel-row{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:7px 10px;
  border:0.5px solid var(--border3);border-radius:var(--r-sm);background:var(--glass3);margin-bottom:5px}
.ns-rel-row.warn{border-color:var(--warn-border);background:var(--warn-soft)}
.ns-rel-name{font-size:11px;font-weight:600;color:var(--text2)}
.ns-rel-name i{font-size:11px;color:var(--text3)}
.ns-rel-meta{font-size:10px;color:var(--text3);flex:1 1 140px}
.ns-rel-card,.ns-slicer-select,.ns-fmt-row select,.ns-well-agg,.ns-well-bin,.ns-col-type,.ns-field select{
  font-family:inherit;color:var(--text)}
.ns-rel-card{padding:2px 5px;border-radius:6px;border:0.5px solid var(--border3);background:var(--input-bg);font-size:11px}
.ns-rel-both{display:inline-flex;align-items:center;gap:4px;font-size:10px;color:var(--text3)}

/* ── Report view ───────────────────────────────────────────────────────── */
.ns-report-panes{display:flex;align-items:stretch;height:100%;min-height:0}
.ns-pane{
  flex:0 0 218px;display:flex;flex-direction:column;min-height:0;overflow:auto;
  padding:10px 11px;background:var(--glass3)}
.ns-pane-left{border-right:0.5px solid var(--border)}
.ns-pane-right{flex-basis:248px;border-left:0.5px solid var(--border)}
.ns-report-middle{flex:1;min-width:0;display:flex;flex-direction:column;min-height:0}
.ns-canvas-scroll{flex:1;min-height:0;overflow:auto}
.ns-canvas{
  position:relative;min-width:100%;min-height:100%;width:1600px;height:1100px;
  background-image:radial-gradient(circle at 1px 1px,var(--border3) 1px,transparent 0);
  background-size:24px 24px}
.ns-canvas-empty{
  position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:10px;font-size:13px;color:var(--text3);pointer-events:none;text-align:center;padding:0 24px}
.ns-canvas-empty i{font-size:40px;opacity:.5}
/* Centred in the part of the canvas that is on screen, not in the whole
   1600px sheet behind it. */
.ns-canvas .ns-canvas-empty{position:sticky;left:0;top:0;inset:auto}
.ns-canvas-empty .ns-empty-title{font-size:16px;font-weight:700;color:var(--text)}
.ns-empty-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:6px;pointer-events:auto}
.ns-empty-steps{display:flex;flex-wrap:wrap;justify-content:center;gap:14px;margin-top:10px;font-size:12px;color:var(--text3)}
.ns-empty-steps b{
  display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;margin-right:5px;border-radius:50%;
  background:var(--accent-soft);color:var(--accent);font-size:11px}
.ns-help{max-width:560px}
.ns-help-steps{margin:0 0 12px;padding-left:20px;display:flex;flex-direction:column;gap:8px;font-size:13px;color:var(--text2);line-height:1.45}
.ns-help-keys{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;align-items:center;font-size:12px;color:var(--text2)}
.ns-help kbd{
  display:inline-block;min-width:18px;padding:1px 5px;margin:0 1px;border-radius:4px;border:0.5px solid var(--border);
  background:var(--glass2);font-family:inherit;font-size:11px;font-weight:600;text-align:center;color:var(--text)}
/* The field list's rows. Scoped to the list: .ns-field is also the label
   class the formula and link dialogs use, whose column layout was winning
   here and stacking every field's icon above its name. */
#ns-fields .ns-field{flex-direction:row;align-items:center;gap:6px;color:var(--text2);cursor:pointer;text-align:left}
#ns-fields .ns-field span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#ns-fields .ns-field:focus-visible{outline:2px solid var(--accent2);outline-offset:-2px}
.ns-canvas-empty .ns-btn i{font-size:14px;opacity:1}
.ns-empty-steps em{font-style:normal;font-weight:700;color:var(--text2)}

.ns-field-search,.ns-slicer-search{
  width:100%;margin-bottom:8px;padding:5px 9px;border-radius:var(--r-sm);
  border:0.5px solid var(--border);background:var(--input-bg);color:var(--text);
  font-family:inherit;font-size:11px}
.ns-fields{display:flex;flex-direction:column;gap:9px}
.ns-field-table-head{
  display:flex;align-items:center;gap:5px;padding:3px 2px;
  font-size:11px;font-weight:700;color:var(--text2)}
.ns-field-table-head i{font-size:12px;color:var(--text3)}
.ns-field{
  display:flex;align-items:center;gap:6px;padding:4px 8px;border-radius:7px;
  font-size:11px;color:var(--text2);cursor:grab;
  transition:background .15s var(--ease-out)}
.ns-field i{font-size:12px;color:var(--text3)}
.ns-field:hover{background:var(--glass2)}
.ns-field:active{cursor:grabbing}

.ns-filter-bar{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:7px 12px;
  border-bottom:0.5px solid var(--border);background:var(--glass3)}
.ns-filter-label{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:700;color:var(--text3);letter-spacing:.05em;text-transform:uppercase}
.ns-filter-chip{
  display:inline-flex;align-items:center;gap:3px;padding:2px 3px 2px 9px;border-radius:999px;
  background:var(--accent-soft);border:0.5px solid var(--border2);
  font-size:11px;font-weight:600;color:var(--accent)}
.ns-filter-chip.cross{background:var(--success-soft);border-color:var(--success-border);color:var(--success)}
.ns-filter-chip button{border:none;background:none;color:inherit;cursor:pointer;padding:1px 3px;line-height:1;font-family:inherit}
.ns-filter-chip button i{font-size:12px}

/* ── Visual cards ──────────────────────────────────────────────────────── */
.ns-card{
  position:absolute;display:flex;flex-direction:column;overflow:hidden;
  border:0.5px solid var(--border);border-radius:var(--r-sm);background:var(--glass-card);
  backdrop-filter:var(--blur);box-shadow:var(--shadow);
  transition:box-shadow .2s var(--ease-out),border-color .2s var(--ease-out)}
.ns-card.on{border-color:var(--accent2);box-shadow:var(--shadow-lg)}
.ns-card.dragging{box-shadow:var(--shadow-float);transition:none;z-index:5;cursor:grabbing}
.ns-card.drop{border-color:var(--accent);background:var(--accent-soft)}
.ns-card-head{
  display:flex;align-items:center;gap:6px;padding:5px 6px 5px 10px;cursor:grab;
  border-bottom:0.5px solid var(--border3)}
.ns-card-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:11px;font-weight:700;color:var(--text2)}
.ns-card-tools{display:flex;align-items:center;gap:1px;opacity:0;transition:opacity .18s var(--ease-out)}
.ns-card:hover .ns-card-tools,.ns-card.on .ns-card-tools{opacity:1}
.ns-card-body{flex:1;min-height:0;position:relative;overflow:hidden}
.ns-card-grip{
  position:absolute;right:0;bottom:0;width:15px;height:15px;cursor:nwse-resize;
  background:linear-gradient(135deg,transparent 46%,var(--border2) 46%,var(--border2) 58%,transparent 58%)}

.ns-svg{display:block;width:100%;height:100%;overflow:visible}
.ns-grid line,.ns-gridline{stroke:var(--border3);stroke-width:1}
.ns-zero{stroke:var(--border2);stroke-width:1.2}
.ns-axis text,.ns-axis-text{font-size:10px;fill:var(--text3);font-family:inherit}
.ns-legend-text{font-size:10px;fill:var(--text2);font-family:inherit}
.ns-legend-item{cursor:default}
.ns-datalabel{font-size:10px;fill:var(--text2);font-weight:600;font-family:inherit}
.ns-slicelabel{font-size:10px;font-weight:700;font-family:inherit}
.ns-tm-name{font-size:12px;font-weight:700;font-family:inherit}
.ns-tm-value{font-size:11px;font-weight:600;font-family:inherit;opacity:.85}
.ns-donut-total{font-size:20px;font-weight:700;fill:var(--text);font-family:inherit}
.ns-donut-sub{font-size:10px;fill:var(--text3);font-family:inherit}
.ns-gauge-value{font-size:22px;font-weight:700;fill:var(--text);font-family:inherit}
.ns-empty-text{font-size:11px;fill:var(--text3);font-family:inherit}
.ns-map-note{font-size:9px;fill:var(--text3);font-family:inherit;opacity:.8}
.ns-graticule line{stroke:var(--border3);stroke-width:.8}
.ns-land path{fill:var(--glass2);stroke:var(--border2);stroke-width:.7}
.ns-mark{transition:opacity .2s var(--ease-out),filter .2s var(--ease-out)}
.ns-mark:hover{filter:brightness(1.12)}
.ns-mark:focus-visible{outline:2px solid var(--accent2);outline-offset:1px}
/* Not display:none and not a colour swap: a dimmed mark has to stay
   readable, because the point of a cross-filter is comparing what was
   selected against what was not. */
.ns-mark-dim{opacity:.26}
.ns-viz-error{
  display:flex;align-items:center;gap:7px;height:100%;padding:14px;
  font-size:11px;line-height:1.55;color:var(--danger)}
.ns-viz-error i{font-size:16px;flex:0 0 auto}
.ns-viz-empty{padding:14px;font-size:11px;color:var(--text3);text-align:center}

.ns-kpi{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:3px;height:100%;padding:12px 16px}
.ns-kpi-value{font-size:24px;font-weight:800;color:var(--text);line-height:1.1;font-variant-numeric:tabular-nums}
.ns-kpi-label{font-size:11px;color:var(--text3)}
.ns-kpi-delta{display:inline-flex;align-items:center;gap:4px;margin-top:3px;font-size:11px;font-weight:600;color:var(--text3)}
.ns-kpi-delta.good{color:var(--success)}
.ns-kpi-delta.bad{color:var(--danger)}

.ns-tablewrap{height:100%;overflow:auto}
.ns-table{border-collapse:separate;border-spacing:0;width:100%;font-size:11px}
.ns-table th{
  position:sticky;top:0;z-index:1;padding:5px 9px;text-align:left;white-space:nowrap;
  background:var(--glass2);backdrop-filter:var(--blur);border-bottom:0.5px solid var(--border);
  font-weight:700;color:var(--text2)}
.ns-table th.num,.ns-table td.num{text-align:right;font-variant-numeric:tabular-nums}
.ns-table td{padding:4px 9px;border-bottom:0.5px solid var(--border3);color:var(--text2);white-space:nowrap}
.ns-table tr:hover td{background:var(--glass3)}
.ns-table tr.on td{background:var(--accent-soft);color:var(--accent)}
.ns-matrix th.ns-mx-rowkey{
  position:sticky;left:0;z-index:1;text-align:left;font-weight:600;color:var(--text2);
  background:var(--glass2);backdrop-filter:var(--blur);border-bottom:0.5px solid var(--border3)}
.ns-matrix th.ns-mx-corner{left:0;z-index:2}
.ns-matrix thead tr+tr th{top:25px}
.ns-mx-sep{color:var(--text3);font-weight:400}
.ns-matrix .ns-mx-total{font-weight:700;color:var(--text)}
.ns-matrix .ns-mx-grand{color:var(--accent)}
.ns-matrix tr.ns-mx-foot td,.ns-matrix tr.ns-mx-foot th{
  position:sticky;bottom:0;background:var(--glass2);backdrop-filter:var(--blur);
  border-top:0.5px solid var(--border);font-weight:700}
.ns-matrix tr.on th.ns-mx-rowkey{background:var(--accent-soft);color:var(--accent)}

.ns-slicer{display:flex;flex-direction:column;gap:5px;height:100%;padding:9px 10px;overflow:hidden}
.ns-slicer-head{display:flex;align-items:center;justify-content:space-between;gap:6px;font-size:11px;font-weight:700;color:var(--text2)}
.ns-slicer-clear{border:none;background:none;color:var(--accent2);cursor:pointer;font-family:inherit;font-size:10px;font-weight:600;padding:0}
.ns-slicer-list{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:1px}
.ns-slicer-item{display:flex;align-items:center;gap:6px;padding:3px 6px;border-radius:6px;font-size:11px;color:var(--text2);cursor:pointer}
.ns-slicer-item:hover{background:var(--glass3)}
.ns-slicer-item.on{background:var(--accent-soft);color:var(--accent);font-weight:600}
.ns-slicer-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ns-slicer-lab{display:flex;align-items:center;justify-content:space-between;gap:7px;font-size:11px;color:var(--text3)}
.ns-slicer-lab input,.ns-slicer-select{
  flex:1;min-width:0;padding:4px 7px;border-radius:7px;border:0.5px solid var(--border);
  background:var(--input-bg);font-family:inherit;font-size:11px}

/* ── The shared tooltip ────────────────────────────────────────────────── */
.ns-tip{
  position:fixed;top:0;left:0;z-index:9000;pointer-events:none;opacity:0;
  display:flex;flex-direction:column;gap:2px;max-width:280px;padding:7px 10px;
  border-radius:var(--r-sm);border:0.5px solid var(--border);background:var(--glass-card);
  backdrop-filter:var(--blur);box-shadow:var(--shadow-lg);
  font-size:11px;color:var(--text2);
  transition:opacity .12s var(--ease-out)}
.ns-tip.show{opacity:1}
.ns-tip b{display:inline-block;font-weight:700;color:var(--text)}
.ns-tip span{margin-left:6px;color:var(--text3);font-variant-numeric:tabular-nums}
.ns-tip i{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px;vertical-align:middle}

/* ── 3D ────────────────────────────────────────────────────────────────── */
.ns-viz-3d{position:relative;width:100%;height:100%}
.ns-3d-canvas{display:block;width:100%;height:100%;touch-action:none;cursor:grab}
.ns-3d-canvas:active{cursor:grabbing}
.ns-3d-canvas:focus-visible{outline:2px solid var(--accent2);outline-offset:-2px}
.ns-3d-overlay{
  position:absolute;left:8px;right:8px;bottom:7px;pointer-events:none;
  font-size:10px;line-height:1.5;color:var(--text3)}
.ns-3d-note{
  display:inline-block;padding:3px 8px;border-radius:999px;
  background:var(--glass2);backdrop-filter:var(--blur);border:0.5px solid var(--border3)}
.ns-3d-lost::after{
  content:'The graphics context was lost. It comes back on its own — this redraws when it does.';
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  padding:18px;text-align:center;font-size:11px;color:var(--text3);background:var(--glass3)}

/* ── The visualisation pane ────────────────────────────────────────────── */
.ns-pane-sec{margin-bottom:14px}
.ns-type-group-name{margin:6px 0 4px;font-size:10px;font-weight:700;color:var(--text3);letter-spacing:.05em;text-transform:uppercase}
.ns-type-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px}
.ns-type-btn{
  display:flex;flex-direction:column;align-items:center;gap:2px;padding:7px 2px;
  border:0.5px solid var(--border3);border-radius:var(--r-sm);background:var(--glass3);
  color:var(--text3);font-family:inherit;font-size:9px;font-weight:600;cursor:pointer;
  transition:background .16s var(--ease-out),color .16s var(--ease-out),transform .16s var(--ease-out)}
.ns-type-btn i{font-size:16px}
.ns-type-btn span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.ns-type-btn:hover{background:var(--glass2);color:var(--text2);transform:translateY(-1px)}
.ns-type-btn.on{background:var(--accent-soft);border-color:var(--border2);color:var(--accent)}
.ns-well{margin-bottom:8px}
.ns-well-name{margin-bottom:3px;font-size:10px;font-weight:700;color:var(--text3);letter-spacing:.04em;text-transform:uppercase}
.ns-well-chip{
  display:flex;align-items:center;gap:4px;padding:3px 4px 3px 8px;margin-bottom:3px;
  border-radius:7px;background:var(--accent-soft);border:0.5px solid var(--border2)}
.ns-well-chip-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;color:var(--accent)}
.ns-well-agg,.ns-well-bin{
  max-width:90px;padding:1px 3px;border-radius:5px;border:0.5px solid var(--border3);
  background:var(--input-bg);font-size:10px}
.ns-well-drop{
  padding:6px 8px;border:1px dashed var(--border2);border-radius:7px;
  font-size:10px;color:var(--text3);text-align:center}
.ns-well.drop .ns-well-drop{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}
.ns-fmt-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 0;font-size:11px;color:var(--text2)}
.ns-fmt-row input[type=text],.ns-fmt-row input[type=number],.ns-fmt-row select{
  flex:0 1 128px;min-width:0;padding:3px 6px;border-radius:6px;border:0.5px solid var(--border3);
  background:var(--input-bg);font-family:inherit;font-size:11px}
.ns-fmt-actions{margin-top:9px}

/* ── Live cursors ──────────────────────────────────────────────────────── */
.ns-cursor-layer{position:absolute;inset:0;pointer-events:none;z-index:8}
.ns-cursor{
  position:absolute;top:0;left:0;display:flex;align-items:flex-start;gap:3px;
  will-change:transform;transition:transform .09s linear}
.ns-cursor span{
  padding:1px 6px;border-radius:999px;white-space:nowrap;
  font-size:10px;font-weight:700;box-shadow:var(--shadow)}

/* ── History ───────────────────────────────────────────────────────────── */
.ns-history{
  flex:0 0 0;width:0;overflow:hidden;border-left:0.5px solid var(--border);
  background:var(--glass3);transition:flex-basis .28s var(--ease-out),width .28s var(--ease-out)}
.ns-history.open{flex-basis:286px;width:286px;padding:10px 12px;display:flex;flex-direction:column;min-height:0}
.ns-audit-list{flex:1;min-height:0;overflow:auto}
.ns-audit-row{display:flex;gap:8px;padding:6px 2px;border-bottom:0.5px solid var(--border3)}
.ns-audit-dot{width:8px;height:8px;border-radius:50%;margin-top:4px;flex:0 0 auto}
.ns-audit-body{min-width:0}
.ns-audit-what{font-size:11px;line-height:1.5;color:var(--text2)}
.ns-audit-when{font-size:10px;color:var(--text3)}

/* ── Slides ────────────────────────────────────────────────────────────── */
.ns-slides-body{flex:1;min-height:0;display:flex;flex-direction:column;gap:12px}
.ns-slides-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ns-slide-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:11px;align-content:start;overflow:auto}
.ns-slide-card{
  display:flex;flex-direction:column;gap:7px;padding:10px 11px;
  border:0.5px solid var(--border);border-radius:var(--r-sm);background:var(--glass-card);
  backdrop-filter:var(--blur);box-shadow:var(--shadow)}
.ns-slide-card-head{display:flex;align-items:center;gap:4px}
.ns-slide-num{
  display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;
  border-radius:50%;background:var(--accent);color:#fff;font-size:10px;font-weight:700}
.ns-slide-title-input{
  flex:1;min-width:0;padding:3px 7px;border-radius:6px;border:0.5px solid var(--border3);
  background:var(--input-bg);color:var(--text);font-family:inherit;font-size:12px;font-weight:600}
.ns-slide-pick{max-height:132px;overflow:auto;display:flex;flex-direction:column;gap:1px}
.ns-slide-pick-item{display:flex;align-items:center;gap:6px;padding:2px 5px;border-radius:6px;font-size:11px;color:var(--text2);cursor:pointer}
.ns-slide-pick-item:hover{background:var(--glass3)}
.ns-slide-pick-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ns-slide-foot{display:flex;flex-direction:column;gap:5px}
.ns-slide-notes{
  width:100%;padding:5px 7px;border-radius:7px;border:0.5px solid var(--border3);
  background:var(--input-bg);color:var(--text);font-family:inherit;font-size:11px;resize:vertical}

/* ── The formula modal ─────────────────────────────────────────────────── */
.ns-modal{position:fixed;inset:0;z-index:8600;display:flex;align-items:center;justify-content:center;
  padding:20px;background:rgba(6,10,20,0.46);backdrop-filter:blur(3px);animation:nsFadeIn .18s var(--ease-out)}
.ns-modal-card{
  width:min(560px,100%);max-height:90vh;overflow:auto;display:flex;flex-direction:column;gap:9px;
  padding:16px 18px;border:0.5px solid var(--border);border-radius:var(--r);
  background:var(--glass-card);backdrop-filter:var(--blur);box-shadow:var(--shadow-lg);
  animation:nsRiseIn .28s var(--ease-fluid)}
.ns-modal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:14px;font-weight:700;color:var(--text)}
.ns-modal-foot{display:flex;align-items:center;gap:7px;margin-top:5px}
.ns-field{display:flex;flex-direction:column;gap:3px;font-size:11px;color:var(--text3)}
.ns-field input,.ns-field select,.ns-field textarea{
  padding:6px 9px;border-radius:var(--r-sm);border:0.5px solid var(--border);
  background:var(--input-bg);color:var(--text);font-family:inherit;font-size:12px}
.ns-field textarea{font-family:var(--font-mono);font-size:12px;line-height:1.55;resize:vertical}
.ns-fx-preview{min-height:18px;font-size:11px;color:var(--text3)}
.ns-fx-preview.ok{color:var(--success)}
.ns-fx-preview.bad{color:var(--danger)}
.ns-fx-help summary{font-size:11px;color:var(--text3);cursor:pointer}
.ns-fx-help div{margin-top:5px;font-family:var(--font-mono);font-size:10px;line-height:1.7;color:var(--text3);word-break:break-word}

@keyframes nsFadeIn{from{opacity:0}to{opacity:1}}
@keyframes nsRiseIn{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}
@keyframes nsCellIn{from{opacity:0;transform:translateY(14px) scale(.98)}to{opacity:1;transform:none}}

/* ── The presentation stage ────────────────────────────────────────────── */
body.ns-presenting{overflow:hidden}
.ns-stage{
  position:fixed;inset:0;z-index:9500;display:none;
  background:radial-gradient(ellipse 80% 60% at 50% 0%,rgba(40,58,96,0.30) 0%,transparent 65%),
    linear-gradient(170deg,#0b1020 0%,#070a12 60%,#04060b 100%)}
.ns-stage-deck{position:absolute;inset:0;overflow:hidden}
.ns-slide{
  position:absolute;inset:0;display:flex;flex-direction:column;gap:14px;
  padding:42px 48px 56px;opacity:0;
  /* Transform and opacity only, and both on the compositor. Anything that
     touched layout here would re-run it for every visual on both slides at
     once, mid-transition. */
  transition:transform .52s var(--ease-fluid),opacity .38s var(--ease-out);
  will-change:transform,opacity}
.ns-slide.entering{opacity:0}
.ns-slide.current{opacity:1;z-index:2}
.ns-slide.leaving{z-index:1}
.ns-slide-title{font-size:24px;font-weight:700;color:#f3f6fb;letter-spacing:-.01em}
.ns-slide-grid{flex:1;min-height:0;display:grid;gap:16px}
.ns-slide-cell{
  min-width:0;min-height:0;position:relative;overflow:hidden;
  border:0.5px solid rgba(255,255,255,0.10);border-radius:18px;
  background:rgba(255,255,255,0.045);box-shadow:0 18px 48px rgba(0,0,0,0.42);
  animation:nsCellIn .5s var(--ease-fluid) backwards}
.ns-slide-note{font-size:12px;line-height:1.6;color:rgba(232,238,248,0.62);max-width:80ch}
.ns-stage-chrome{
  position:absolute;left:50%;bottom:20px;transform:translateX(-50%);z-index:4;
  display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:999px;
  background:rgba(12,17,30,0.72);backdrop-filter:blur(18px);border:0.5px solid rgba(255,255,255,0.12);
  color:#dfe6f2;font-size:11px;
  transition:opacity .4s var(--ease-out)}
.ns-stage-chrome.idle{opacity:0}
.ns-stage-chrome:hover{opacity:1}
.ns-stage-btn{
  display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;
  border:none;border-radius:50%;background:rgba(255,255,255,0.08);color:#dfe6f2;cursor:pointer;font-family:inherit}
.ns-stage-btn:hover{background:rgba(255,255,255,0.18)}
.ns-stage-btn i{font-size:14px}
.ns-stage-count{font-variant-numeric:tabular-nums;font-weight:700}
.ns-stage-title{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ns-stage-quality{color:rgba(223,230,242,0.6)}
.ns-stage-sep{width:1px;height:14px;background:rgba(255,255,255,0.16)}
.ns-stage-progress{position:absolute;left:0;right:0;bottom:0;height:3px;background:rgba(255,255,255,0.08);z-index:4}
.ns-stage-progress span{display:block;height:100%;background:var(--accent2);transition:width .45s var(--ease-fluid)}
/* In the deck the visuals sit on a dark ground of their own, so the card
   chrome the canvas gives them would be a second, wrong-coloured frame. */
.ns-slide-cell .ns-kpi-value,.ns-slide-cell .ns-donut-total,.ns-slide-cell .ns-gauge-value{fill:#f2f5fa;color:#f2f5fa}
.ns-slide-cell .ns-axis text,.ns-slide-cell .ns-legend-text,.ns-slide-cell .ns-axis-text{fill:rgba(226,233,245,0.72)}
.ns-slide-cell .ns-grid line,.ns-slide-cell .ns-gridline{stroke:rgba(255,255,255,0.10)}
.ns-slide-cell .ns-kpi-label,.ns-slide-cell .ns-donut-sub{color:rgba(226,233,245,0.6);fill:rgba(226,233,245,0.6)}

/* ── Narrow screens ────────────────────────────────────────────────────── */
@media(max-width:1100px){
  .ns-pane{flex-basis:186px}
  .ns-pane-right{flex-basis:210px}
}
@media(max-width:860px){
  /* The report is a two-dimensional canvas and a phone is one column, so the
     panes stack above it rather than shrinking into uselessness. */
  .ns-report-panes{flex-direction:column;overflow:auto}
  .ns-pane{flex:0 0 auto;max-height:194px;border-left:none;border-right:none;border-bottom:0.5px solid var(--border)}
  .ns-shell{height:auto;min-height:calc(100vh - 52px)}
  .ns-data-body{flex-direction:column}
  .ns-data-side{flex:0 0 auto;flex-direction:row;overflow-x:auto}
  .ns-history.open{position:fixed;right:0;top:52px;bottom:0;z-index:40;box-shadow:var(--shadow-lg);background:var(--bg)}
  .ns-slide{padding:24px 20px 46px}
}

/* ══════════════════════════════════════════════════════════════════════════
   NOVA LANDING — Liquid Glass, iOS 27
   ──────────────────────────────────────────────────────────────────────────
   The lobby, rebuilt on the material iOS 27 settled on: glass that diffuses
   what is behind it hard enough to read over, a bright specular lip where
   light catches the top edge, a darkened rim under the whole pane so it
   separates from the ground, and a highlight that follows the finger.

   Scoped to #landing on purpose. The same .desk-card/.lobby-card classes
   paint UWing Assistance's tool grid with the navy hero recipe (section 10
   above), and that screen is not being redesigned here — so every rule
   below starts at #landing, which also outranks the earlier ones without a
   single !important on layout. The two !importants that remain are on the
   icon tile and the card ground, because section 10 set those with
   !important and inline gradients, and only !important overturns them.

   The five workspace cards are one size, deliberately. A card's size says
   how much it matters, and no workspace here matters more than another to
   the person it is shown to — so the row is symmetric for whatever subset
   a role sees: flex-wrap centres the last row, and hidden cards drop out
   of the flow instead of leaving a hole.
   ══════════════════════════════════════════════════════════════════════════ */
#landing{
  /* Dark is the app's default, so it is the base; light overrides below. */
  --nova-ground:#03060d;
  --nova-ink:#f5f7fb;
  --nova-ink2:rgba(233,239,250,0.78);
  --nova-accent:#8fbcff;
  --nova-orb-a:#1f6fff;  --nova-orb-b:#163a66;  --nova-orb-c:#5145e0;
  --nova-orb-d:#12a8ff;  --nova-orb-e:#ff8a4c;  --nova-orb-f:#2b58c9;
  --nova-orb-o:0.62;
  --lg-hi:rgba(255,255,255,0.20);
  --lg-tint:rgba(255,255,255,0.07);
  --lg-lo:rgba(255,255,255,0.11);
  --lg-bright:1.12;
  --lg-lip:rgba(255,255,255,0.55);
  --lg-underlip:rgba(0,0,0,0.38);
  --lg-rim:rgba(255,255,255,0.10);
  --lg-edge:rgba(0,0,0,0.55);
  --lg-drop:rgba(0,0,0,0.55);
  --lg-drop2:rgba(0,0,0,0.35);
  --lg-glow:rgba(170,205,255,0.30);
  --lg-core:rgba(255,255,255,0.34);
  --lg-blend:screen;
  --lg-ring-a:rgba(255,255,255,0.70);
  --lg-ring-b:rgba(255,255,255,0.34);
  --nova-name:linear-gradient(100deg,#ffffff 0%,#b9dcff 25%,#c3b2ff 50%,#b9dcff 75%,#ffffff 100%);
  --nova-name-glow:rgba(90,150,255,0.35);
  /* The workspace icons, lit from inside: on the dark ground a mid-blue
     glyph on a clear tile read as a smudge, so the tile carries a blue tint
     and a ring, and the glyph is near-white with a glow of its own. */
  --nova-icon:#e6f3ff;
  --nova-icon-glow:drop-shadow(0 0 6px rgba(140,200,255,0.75));
  --nova-icon-tile:linear-gradient(150deg,rgba(140,200,255,0.34) 0%,rgba(90,150,255,0.14) 100%);
  --nova-icon-ring:0 0 0 1px rgba(170,215,255,0.42),0 8px 22px -6px rgba(40,120,255,0.45);
  --tz-p1:#1b5c97;--tz-p2:#123f6e;--tz-m1:#2a3f9e;--tz-m2:#1c2b72;
  --tz-c1:#136b86;--tz-c2:#0d4a5f;--tz-e1:#4a36a6;--tz-e2:#2f2378;
  --tz-edge:rgba(170,215,255,0.75);--tz-edge-w:1.6;--tz-inner:rgba(170,215,255,0.22);
  --tz-night:#020611;--tz-night-o:0.42;--tz-sweep:0.22;--tz-sweep-blend:screen;
  --tz-shadow:rgba(0,0,0,0.55);--tz-label:rgba(214,232,255,0.34);--tz-pin-ring:#0b1426;
  --tz-co:#ffb35c;--tz-moon:#c9d8ff;--tz-chip:rgba(14,22,42,0.72);
  --tz-chip-shadow:inset 0 1px 0 rgba(255,255,255,0.22),0 0 0 .5px rgba(160,210,255,0.28),0 10px 26px rgba(0,0,0,0.45);
  display:none;align-items:stretch;justify-content:flex-start;
  isolation:isolate;
}
:root:not([data-theme="dark"]) #landing{
  --nova-ground:#e9f0fb;
  --nova-ink:#0b1220;
  --nova-ink2:#3a4356;
  --nova-accent:#1f5f99;
  --nova-orb-a:#5b9dff;  --nova-orb-b:#9cc3ff;  --nova-orb-c:#a99cff;
  --nova-orb-d:#6fd6ff;  --nova-orb-e:#ffb98a;  --nova-orb-f:#7aa8ff;
  --nova-orb-o:0.72;
  --lg-hi:rgba(255,255,255,0.78);
  --lg-tint:rgba(255,255,255,0.30);
  --lg-lo:rgba(255,255,255,0.46);
  --lg-bright:1.06;
  --lg-lip:rgba(255,255,255,1);
  --lg-underlip:rgba(16,32,64,0.16);
  --lg-rim:rgba(255,255,255,0.55);
  --lg-edge:rgba(12,24,48,0.22);
  --lg-drop:rgba(22,58,102,0.22);
  --lg-drop2:rgba(22,58,102,0.12);
  --lg-glow:rgba(255,255,255,0.85);
  --lg-core:rgba(255,255,255,1);
  --lg-blend:soft-light;
  --lg-ring-a:rgba(255,255,255,1);
  --lg-ring-b:rgba(255,255,255,0.70);
  --nova-name:linear-gradient(100deg,#0b1a33 0%,#1f5f99 25%,#6d5bd0 50%,#1f5f99 75%,#0b1a33 100%);
  --nova-name-glow:rgba(40,80,160,0.18);
  --nova-icon:#1f5f99;
  --nova-icon-glow:none;
  --nova-icon-tile:linear-gradient(150deg,#ffffff 0%,#f1f6ff 100%);
  --nova-icon-ring:0 0 0 .5px rgba(12,24,48,0.12),0 6px 16px -4px rgba(40,80,160,0.22);
  --tz-p1:#c3ecff;--tz-p2:#8fd3ff;--tz-m1:#d0dbff;--tz-m2:#a4b8ff;
  --tz-c1:#cff6ff;--tz-c2:#98e0f2;--tz-e1:#e0d4ff;--tz-e2:#b8a3ff;
  --tz-edge:#ffffff;--tz-edge-w:2.6;--tz-inner:rgba(255,255,255,0.7);
  --tz-night:#0b1a4a;--tz-night-o:0.16;--tz-sweep:0.65;--tz-sweep-blend:soft-light;
  --tz-shadow:rgba(40,80,160,0.22);--tz-label:rgba(11,18,32,0.26);--tz-pin-ring:#ffffff;
  --tz-co:#e8740c;--tz-moon:#5b6bd6;--tz-chip:rgba(255,255,255,0.8);
  --tz-chip-shadow:inset 0 1px 0 #ffffff,0 0 0 .5px rgba(10,30,60,0.14),0 10px 24px rgba(40,80,160,0.18);
}

/* ── The moving ground ─────────────────────────────────────────────────── */
#landing .nova-bg{
  position:fixed;inset:0;z-index:0;overflow:hidden;pointer-events:none;
  background:var(--nova-ground);
}
#landing .nova-bg-parallax{
  /* It used to trail the pointer; the cursor moves nothing now (see #138),
     so the ground only drifts on its own. */
  position:absolute;inset:-8%;
}
#landing .nova-orb{
  position:absolute;border-radius:50%;
  filter:blur(72px);opacity:var(--nova-orb-o);
  will-change:transform;
  /* An ease that leaves rest slowly and arrives slowly, on long loops: the
     orbs never visibly start or stop, they only ever seem to be drifting. */
  animation-timing-function:cubic-bezier(.45,0,.55,1);animation-iteration-count:infinite;animation-direction:alternate;
}
#landing .nova-orb-1{width:46vw;height:46vw;min-width:420px;min-height:420px;background:var(--nova-orb-a);top:-14%;right:-8%;animation-name:novaDriftA;animation-duration:34s}
#landing .nova-orb-2{width:40vw;height:40vw;min-width:380px;min-height:380px;background:var(--nova-orb-b);bottom:-18%;left:-10%;animation-name:novaDriftB;animation-duration:41s}
#landing .nova-orb-3{width:34vw;height:34vw;min-width:320px;min-height:320px;background:var(--nova-orb-c);top:38%;left:30%;animation-name:novaDriftC;animation-duration:31s}
#landing .nova-orb-4{width:26vw;height:26vw;min-width:260px;min-height:260px;background:var(--nova-orb-d);top:8%;left:12%;animation-name:novaDriftD;animation-duration:27s}
#landing .nova-orb-5{width:18vw;height:18vw;min-width:200px;min-height:200px;background:var(--nova-orb-e);bottom:6%;right:14%;opacity:calc(var(--nova-orb-o) * 0.55);animation-name:novaDriftE;animation-duration:38s}
#landing .nova-orb-6{width:30vw;height:30vw;min-width:300px;min-height:300px;background:var(--nova-orb-f);top:52%;right:-12%;animation-name:novaDriftA;animation-duration:45s;animation-delay:-11s}
@keyframes novaDriftA{0%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(-9vw,7vh,0) scale(1.12)}100%{transform:translate3d(-3vw,15vh,0) scale(.94)}}
@keyframes novaDriftB{0%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(11vw,-8vh,0) scale(1.08)}100%{transform:translate3d(5vw,-16vh,0) scale(1.16)}}
@keyframes novaDriftC{0%{transform:translate3d(0,0,0) scale(.92)}50%{transform:translate3d(-12vw,-10vh,0) scale(1.1)}100%{transform:translate3d(8vw,-4vh,0) scale(1)}}
@keyframes novaDriftD{0%{transform:translate3d(0,0,0) scale(1)}100%{transform:translate3d(14vw,12vh,0) scale(1.22)}}
@keyframes novaDriftE{0%{transform:translate3d(0,0,0) scale(1)}100%{transform:translate3d(-10vw,-9vh,0) scale(1.3)}}
/* A slow turning sheen, the way an iOS wallpaper shifts its light. Screen-
   blended so it only ever brightens: it can lift the orbs, never muddy them. */
#landing .nova-sheen{
  position:absolute;left:-50%;top:-50%;width:200%;height:200%;
  background:conic-gradient(from 0deg at 50% 50%,
    transparent 0deg,rgba(143,188,255,0.10) 60deg,transparent 130deg,
    rgba(255,255,255,0.06) 200deg,transparent 260deg,rgba(111,214,255,0.08) 320deg,transparent 360deg);
  mix-blend-mode:screen;
  animation:novaTurn 120s linear infinite;
}
@keyframes novaTurn{to{transform:rotate(360deg)}}

/* ── Layout ────────────────────────────────────────────────────────────── */
#landing .nova-landing-inner{
  /* One of the three column tokens, like every other screen (the CI holds
     every column to --col-narrow/--col-std/--col-wide). */
  position:relative;z-index:1;width:100%;max-width:var(--col-std);margin:0 auto;
  display:flex;flex-direction:column;
}
#landing .nova-hero{
  display:flex;justify-content:space-between;align-items:center;gap:40px;
  margin:0 0 48px;
}
#landing .nova-hero-text{display:flex;flex-direction:column;gap:22px;min-width:0;flex:1 1 auto}
/* The switch in the corner, above the map rather than beside the clocks. */
#landing .nova-theme{position:absolute;top:-58px;right:0;z-index:2}
#landing .nova-eyebrow{
  /* Was a bordered pill in the clock's mono face; now the line above the
     headline, the way a date sits over a title on an Apple page. */
  all:unset;display:block;align-self:flex-start;
  font-family:var(--font-sans);font-size:18px;font-weight:600;letter-spacing:-.01em;
  color:var(--nova-accent);
}
/* Two lines. The greeting is set light and quiet; the name is the headline,
   heavy, in a gradient that drifts across it slowly — the one thing on the
   page that is about the person reading it. */
#landing .nova-hello{
  margin:0;color:var(--nova-ink);display:flex;flex-direction:column;gap:6px;
  font-weight:400;letter-spacing:-.035em;
}
#landing .nova-hello-1{
  font-size:clamp(28px,3.1vw,44px);font-weight:300;line-height:1.05;letter-spacing:-.025em;
  color:var(--nova-ink2);
}
#landing .nova-hello-2{
  font-size:clamp(64px,8.2vw,116px);font-weight:800;line-height:.95;letter-spacing:-.055em;
  padding-bottom:.08em;
  background:var(--nova-name);background-size:200% 100%;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 8px 26px var(--nova-name-glow));
  animation:novaShimmer 12s linear infinite;
}
#landing .nova-hello .desk-hi,#landing .nova-hello .desk-name{
  all:unset;display:inline;font:inherit;color:inherit;letter-spacing:inherit;
}
@keyframes novaShimmer{from{background-position:0% 50%}to{background-position:200% 50%}}
#landing .nova-section-title{
  margin:0 0 22px;color:var(--nova-ink);
  font-size:clamp(28px,3vw,40px);font-weight:700;letter-spacing:-.03em;
}

/* ── Team clocks: the map card (drawn by 02-clock.js) ──────────────────── */
#landing .nova-tzmap{
  position:relative;flex:0 0 480px;width:480px;box-sizing:border-box;
  padding:18px 20px 16px;border-radius:28px;overflow:hidden;isolation:isolate;
  display:flex;flex-direction:column;gap:6px;color:var(--nova-ink);
  background:linear-gradient(155deg,var(--lg-hi) 0%,var(--lg-tint) 45%,var(--lg-lo) 100%);
  backdrop-filter:blur(30px) saturate(200%) brightness(var(--lg-bright));
  -webkit-backdrop-filter:blur(30px) saturate(200%) brightness(var(--lg-bright));
  box-shadow:inset 0 1.5px 0 var(--lg-lip),inset 0 -1.5px 1px var(--lg-underlip),
    inset 0 0 0 1px var(--lg-rim),0 0 0 .5px var(--lg-edge),
    0 26px 56px -18px var(--lg-drop),0 8px 18px -8px var(--lg-drop2);
  /* Rises once and then stays put. It floated too, and a blurred-glass card
     moving over the page re-blurs everything under it on every frame — with
     five more blurred clocks inside it, that is what made the map stutter. */
  animation:novaRise 1.3s cubic-bezier(.22,1,.36,1) .12s backwards;
}
#landing .nova-tzmap::before{
  content:'';position:absolute;inset:0;border-radius:inherit;padding:1.5px;pointer-events:none;z-index:3;
  background:linear-gradient(140deg,var(--lg-ring-a) 0%,rgba(255,255,255,0.10) 30%,
    rgba(255,255,255,0) 55%,rgba(255,255,255,0.06) 75%,var(--lg-ring-b) 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
}
#landing .tz-head{display:flex;align-items:center;justify-content:space-between;height:24px}
#landing .tz-title{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600}
#landing .tz-live{position:relative;width:7px;height:7px;border-radius:50%;background:#34c759}
/* The pulse is a copy of the dot growing and fading — transform and opacity,
   which the compositor animates alone — rather than a spreading box-shadow,
   which is repainted on every frame. */
#landing .tz-live::after{
  content:'';position:absolute;inset:0;border-radius:50%;background:#34c759;
  animation:tzLive 2.8s cubic-bezier(.2,.7,.3,1) infinite;will-change:transform,opacity;
}
@keyframes tzLive{0%{transform:scale(1);opacity:.55}100%{transform:scale(3.3);opacity:0}}
#landing .tz-legend{display:flex;gap:12px;font-size:12px;color:var(--nova-ink2)}
#landing .tz-legend>span{display:flex;align-items:center;gap:5px}
#landing .tz-legend .tz-sun,#landing .tz-legend .tz-moon{display:block}
#landing .tz-map{position:relative;width:100%;aspect-ratio:1100 / 610}
#landing .tz-svg,#landing .tz-fx{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
/* The drawing rises in as one piece, on its own layer, and is never touched
   again. */
#landing .tz-svg{animation:tzMapIn 1.2s cubic-bezier(.22,1,.36,1) .15s backwards;will-change:transform,opacity}
@keyframes tzMapIn{from{opacity:0;transform:translate3d(0,14px,0)}to{opacity:1;transform:none}}
#landing .tz-fx{pointer-events:none;will-change:transform;animation:tzFade .8s ease .9s backwards}
@keyframes tzFade{from{opacity:0}}
/* The sweep: a band of light slid by transform inside a box masked to the
   country (the mask is set inline from the outlines). */
#landing .tz-sweep{
  position:absolute;inset:0;overflow:hidden;pointer-events:none;
  -webkit-mask-size:100% 100%;mask-size:100% 100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  mix-blend-mode:var(--tz-sweep-blend);animation:tzFade .8s ease 1.2s backwards;
}
#landing .tz-sweep>i{
  position:absolute;top:0;bottom:0;left:0;width:27.3%;
  background:linear-gradient(90deg,rgba(255,255,255,0) 0%,rgba(255,255,255,var(--tz-sweep)) 50%,rgba(255,255,255,0) 100%);
  transform:translate3d(-107%,0,0);will-change:transform;
  animation:tzSweep 9s cubic-bezier(.45,0,.55,1) 1.6s infinite;
}
@keyframes tzSweep{from{transform:translate3d(-107%,0,0)}to{transform:translate3d(373%,0,0)}}
/* The pins' rings: grown by scale from the pin's size to about four times
   it, and faded, each on its own layer. 68/1100 of the map is the ring's
   largest width in the drawing's own units. */
#landing .tz-pulse{
  position:absolute;width:6.2%;aspect-ratio:1;margin:-3.1% 0 0 -3.1%;border-radius:50%;
  border:2px solid var(--nova-accent);box-sizing:border-box;pointer-events:none;
  transform:scale(.26);opacity:0;will-change:transform,opacity;
  animation:tzPulse 3.2s cubic-bezier(.2,.7,.3,1) infinite;
}
@keyframes tzPulse{0%{transform:scale(.26);opacity:.75}100%{transform:scale(1);opacity:0}}
#landing .tz-land-all{filter:drop-shadow(0 12px 14px var(--tz-shadow))}
#landing .tz-land{stroke:var(--tz-edge);stroke-width:var(--tz-edge-w);stroke-linejoin:round}
#landing .tz-night{fill:var(--tz-night);fill-opacity:var(--tz-night-o);transition:opacity 1.2s ease}
#landing .tz-lines{fill:none;stroke:var(--tz-inner);stroke-width:1}
#landing .tz-s1-P{stop-color:var(--tz-p1)} #landing .tz-s2-P{stop-color:var(--tz-p2)}
#landing .tz-s1-M{stop-color:var(--tz-m1)} #landing .tz-s2-M{stop-color:var(--tz-m2)}
#landing .tz-s1-C{stop-color:var(--tz-c1)} #landing .tz-s2-C{stop-color:var(--tz-c2)}
#landing .tz-s1-E{stop-color:var(--tz-e1)} #landing .tz-s2-E{stop-color:var(--tz-e2)}
#landing .tz-names text{
  font-family:var(--font-sans);font-size:22px;font-weight:700;letter-spacing:5px;
  text-anchor:middle;fill:var(--tz-label);
}
#landing .tz-arc{fill:none;stroke:var(--nova-accent);stroke-width:2.5;stroke-dasharray:2 9;stroke-linecap:round;opacity:.85}
#landing .tz-traveller{fill:var(--nova-accent);stroke:var(--tz-pin-ring);stroke-width:2}
#landing .tz-pin{fill:var(--nova-accent);stroke:var(--tz-pin-ring);stroke-width:3.5}
#landing .tz-pin-co{fill:var(--tz-co)}
#landing .tz-chip{
  position:absolute;transform:translate(-50%,calc(-100% - 14px));
  display:flex;flex-direction:column;gap:1px;padding:6px 10px 7px;border-radius:14px;white-space:nowrap;
  background:var(--tz-chip);
  backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);
  box-shadow:var(--tz-chip-shadow);
  animation:tzChipIn .9s cubic-bezier(.22,1,.36,1) backwards;
}
#landing .tz-chip.tz-below{transform:translate(-50%,14px)}
#landing .tz-chip.tz-below.tz-west{transform:translate(-30%,14px)}
#landing .tz-chip.tz-co{transform:translate(-70%,calc(-100% - 12px));box-shadow:var(--tz-chip-shadow),0 0 0 1.5px var(--tz-co)}
#landing .tz-chip:nth-child(3){animation-delay:.5s}  #landing .tz-chip:nth-child(4){animation-delay:.62s}
#landing .tz-chip:nth-child(5){animation-delay:.74s} #landing .tz-chip:nth-child(6){animation-delay:.86s}
#landing .tz-chip:nth-child(2){animation-delay:.98s}
/* Slid in with translate, which stacks on the transform that places the chip
   and never touches layout; margin-top re-laid the map out on every frame. */
@keyframes tzChipIn{from{opacity:0;translate:0 10px}to{opacity:1;translate:0 0}}
#landing .tz-chip-row{display:flex;align-items:center;gap:6px}
#landing .tz-code{font-size:11px;font-weight:700;letter-spacing:.06em;color:var(--nova-accent)}
#landing .tz-co .tz-code{color:var(--tz-co)}
#landing .tz-time{font-size:18px;font-weight:700;letter-spacing:-.01em;font-variant-numeric:tabular-nums}
#landing .tz-city{font-size:11px;color:var(--nova-ink2)}
#landing .tz-sun{stroke:#f5a623}
#landing .tz-moon{stroke:var(--tz-moon);display:none}
#landing .tz-chip .tz-sun{display:block}
#landing .tz-chip.is-night .tz-sun{display:none}
#landing .tz-chip.is-night .tz-moon{display:block}

/* ── The cards ─────────────────────────────────────────────────────────── */
#landing .lobby-grid{
  display:flex;flex-wrap:wrap;justify-content:center;gap:22px;
}
#landing .lobby-grid>.lobby-card{
  --gap:22px;
  flex:0 0 calc((100% - 2 * var(--gap)) / 3);
  box-sizing:border-box;height:210px;min-width:0;
}
/* Wider screens get wider cards, not a row of five: at the widest column a
   fifth of it is too narrow for "Account Management" on one line, and a
   title that wraps on one card and not the next is the asymmetry this
   layout exists to avoid. */
@media (min-width:1600px){
  #landing .nova-landing-inner{max-width:var(--col-wide)}
}
@media (max-width:1040px){
  #landing .lobby-grid>.lobby-card{flex-basis:calc((100% - var(--gap)) / 2)}
}

#landing .lobby-card{
  /* The card's own text follows the page's ink, not section 10's
     light-on-navy variables, because the ground under it is glass now. */
  --text:var(--nova-ink);--text3:var(--nova-ink2);--accent:var(--nova-accent);
  position:relative;isolation:isolate;overflow:hidden;
  display:grid;grid-template-columns:auto 1fr;
  grid-template-rows:auto 1fr auto auto auto;
  grid-template-areas:"icon badge" ". ." "title title" "sub sub" "go go";
  align-items:start;column-gap:12px;
  padding:28px;border:0;border-radius:32px;cursor:pointer;
  color:var(--nova-ink);
  background:linear-gradient(155deg,var(--lg-hi) 0%,var(--lg-tint) 44%,var(--lg-lo) 100%)!important;
  backdrop-filter:blur(28px) saturate(220%) brightness(var(--lg-bright));
  -webkit-backdrop-filter:blur(28px) saturate(220%) brightness(var(--lg-bright));
  box-shadow:
    inset 0 1.5px 0 var(--lg-lip),
    inset 0 -1.5px 1px var(--lg-underlip),
    inset 0 0 0 1px var(--lg-rim),
    0 0 0 .5px var(--lg-edge),
    0 26px 56px -18px var(--lg-drop),
    0 8px 18px -8px var(--lg-drop2);
  /* --press is the touch state. Nothing follows the cursor: no tilt, no
     lift, no light (see #138 — the cursor is the system's own, and the
     glass does not answer it). The release is the spring: a curve that
     overshoots and settles, which is what makes iOS glass feel like it has
     mass. The press itself is fast (below), so the card answers at once. */
  transform:scale(var(--press,1));
  transition:transform .7s cubic-bezier(.34,1.3,.5,1),box-shadow .5s cubic-bezier(.22,1,.36,1);
  will-change:transform;
}
/* The lens rim: brightest where light enters at the top-left, fading, then
   a faint catch again at the bottom-right — the double edge that makes a
   pane read as thick glass rather than as a tinted rectangle. */
#landing .lobby-card::before{
  content:'';position:absolute;inset:0;border-radius:inherit;padding:1.5px;height:auto;
  background:linear-gradient(140deg,var(--lg-ring-a) 0%,rgba(255,255,255,0.10) 30%,
    rgba(255,255,255,0) 55%,rgba(255,255,255,0.06) 75%,var(--lg-ring-b) 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  pointer-events:none;z-index:2;
}
/* A fixed specular highlight where the light enters, top-left. It no
   longer follows the pointer; it brightens only under a press. */
#landing .lobby-card::after{
  content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:0;
  background:
    radial-gradient(110px circle at 22% -8%,var(--lg-core),transparent 70%),
    radial-gradient(380px circle at 22% -8%,var(--lg-glow),transparent 66%);
  opacity:var(--glow-o,.5);mix-blend-mode:var(--lg-blend,screen);
  transition:opacity .45s cubic-bezier(.22,1,.36,1);
}
#landing .lobby-card>*{position:relative;z-index:1}
#landing .lobby-card:hover{border-color:transparent}
#landing .lobby-card.is-pressed,#landing .lobby-card:active{
  --press:.955;--glow-o:1;
  transition:transform .14s cubic-bezier(.3,.7,.4,1),box-shadow .2s ease;
}
#landing .lobby-card:focus-visible{
  outline:none;
  box-shadow:inset 0 1.5px 0 var(--lg-lip),inset 0 0 0 1px var(--lg-rim),
    0 0 0 3px var(--nova-accent),0 26px 56px -18px var(--lg-drop);
}

/* Icon tile: the same glass squircle on every card (the Marketing card's
   icon is checked to read identically to Admin's), glyph in the accent. */
#landing .lobby-card-icon{
  grid-area:icon;width:60px;height:60px;margin:0;border-radius:18px;
  background:var(--nova-icon-tile)!important;
  border:0;
  box-shadow:inset 0 1.5px 0 var(--lg-lip),inset 0 -1px 1px var(--lg-underlip),var(--nova-icon-ring);
  backdrop-filter:blur(12px) saturate(200%);-webkit-backdrop-filter:blur(12px) saturate(200%);
}
#landing .lobby-card-icon i{color:var(--nova-icon)!important;font-size:28px!important;filter:var(--nova-icon-glow)}
#landing .lobby-card-badge{
  grid-area:badge;justify-self:end;align-self:center;
  font-family:var(--font-sans);font-size:12px;font-weight:600;
  padding:5px 11px;border-radius:999px;border:0;
  background:var(--lg-hi);color:var(--nova-ink);
  box-shadow:inset 0 1px 0 var(--lg-lip),0 0 0 .5px var(--lg-edge);
}
#landing .lobby-card-badge-live i{color:#34c759}
#landing .lobby-card-title{
  grid-area:title;margin:0 0 6px;color:var(--nova-ink);
  font-size:24px;font-weight:700;letter-spacing:-.025em;line-height:1.15;
  /* One line on every card, so the five titles share a baseline. The
     longest ("Account Management") fits the narrowest column at 24px;
     the ellipsis is only a guard for a wider fallback font. */
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;
}
#landing .lobby-card-sub{
  grid-area:sub;margin:0;color:var(--nova-ink2);
  font-size:14px;line-height:1.45;
  /* Always two lines tall, wrapped or not: the titles above sit on one
     baseline across all five cards, which is the symmetry asked for. */
  min-height:calc(2em * 1.45);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
#landing .nova-card-go{
  grid-area:go;margin-top:12px;display:inline-flex;align-items:center;gap:2px;
  font-size:16px;font-weight:600;color:var(--nova-accent);
}
#landing .nova-card-go i{font-size:16px}

/* Maintenance keeps its own look, over the glass. */
#landing .lobby-card.lobby-card-maint{opacity:.7;filter:saturate(.5)}

/* ── Entrance: rise, un-blur, settle ───────────────────────────────────── */
/* One curve for every arrival: fast out of the gate, a long soft landing
   (an ease-out-quint), and the blur clears before the card has settled, so
   it reads as focusing rather than fading. */
#landing .lobby-grid>.lobby-card{animation:novaRise 1.1s cubic-bezier(.22,1,.36,1) backwards}
#landing .lobby-grid>.lobby-card:nth-child(1){animation-delay:.20s}
#landing .lobby-grid>.lobby-card:nth-child(2){animation-delay:.28s}
#landing .lobby-grid>.lobby-card:nth-child(3){animation-delay:.36s}
#landing .lobby-grid>.lobby-card:nth-child(4){animation-delay:.44s}
#landing .lobby-grid>.lobby-card:nth-child(5){animation-delay:.52s}
#landing .nova-hero-text{animation:novaRise 1.2s cubic-bezier(.22,1,.36,1) backwards}
@keyframes novaRise{
  0%{opacity:0;transform:translate3d(0,28px,0) scale(.965);filter:blur(6px)}
  60%{filter:blur(0)}
  100%{opacity:1;transform:none;filter:blur(0)}
}

/* ── Narrower: the map goes under the greeting ─────────────────────────── */
@media (max-width:1040px){
  #landing .nova-hero{flex-direction:column;align-items:stretch;gap:28px}
  #landing .nova-tzmap{flex:0 0 auto;width:100%;max-width:520px}
}
/* ── Phones: the list, not the grid ────────────────────────────────────── */
@media (max-width:640px){
  #landing .nova-hero{margin:0 0 32px;gap:18px}
  #landing .tz-names,#landing .tz-legend,#landing .tz-city{display:none}
  #landing .tz-time{font-size:14px}
  #landing .tz-chip{padding:4px 8px}
  #landing .lobby-grid{gap:12px}
  #landing .lobby-grid>.lobby-card{flex-basis:100%;height:auto}
  #landing .lobby-card{
    grid-template-columns:auto 1fr auto;grid-template-rows:auto auto;
    grid-template-areas:"icon title go" "icon sub go";
    align-items:center;column-gap:14px;padding:18px 18px;border-radius:26px;
  }
  #landing .lobby-card-icon{width:52px;height:52px;border-radius:15px}
  #landing .lobby-card-icon i{font-size:24px!important}
  #landing .lobby-card-title{font-size:16px;margin:0 0 2px;white-space:nowrap}
  #landing .lobby-card-sub{font-size:13px;-webkit-line-clamp:1;min-height:0}
  #landing .lobby-card-badge{display:none}
  #landing .nova-card-go{margin:0;font-size:0}
  #landing .nova-card-go i{font-size:20px;color:var(--nova-ink2)}
}

/* ── Reduced motion: still glass, no movement ──────────────────────────── */
@media (prefers-reduced-motion:reduce){
  #landing .nova-orb,#landing .nova-sheen{animation:none}
  #landing .lobby-card{transform:none;transition:none}
  #landing .lobby-grid>.lobby-card,#landing .nova-hero-text,#landing .nova-tzmap,
  #landing .nova-hello-2,#landing .tz-chip,#landing .tz-live,#landing .tz-live::after,
  #landing .tz-svg,#landing .tz-fx,#landing .tz-sweep,#landing .tz-sweep>i,#landing .tz-pulse{animation:none}
}

/* ══════════════════════════════════════════════════════════════════════════
   LIQUID GLASS — the sidebar, every top bar, and sign-in
   ──────────────────────────────────────────────────────────────────────────
   The landing's material, carried to the rest of the app: a pane that is
   light glass on the light theme and dark glass on the dark one (it used to
   be the dark panel on both), a bright specular lip along the top, a
   darkened rim under it, and a thin lens edge brightest where the light
   enters. Nothing here follows the cursor.

   Last in the file on purpose: these are the same elements the sections
   above already style, and the order is what lets these win without an
   !important on layout.
   ══════════════════════════════════════════════════════════════════════════ */
:root{
  --gl-bg:linear-gradient(170deg,rgba(255,255,255,0.10) 0%,rgba(255,255,255,0.03) 100%);
  --gl-lip:rgba(255,255,255,0.22);
  --gl-under:rgba(0,0,0,0.35);
  --gl-edge:rgba(0,0,0,0.6);
  --gl-drop:0 30px 80px rgba(0,0,0,0.5);
  --gl-ring:linear-gradient(170deg,rgba(255,255,255,0.36),rgba(255,255,255,0.04) 30%,rgba(140,200,255,0.22) 100%);
  --gl-ink:#f3f6fb;
  --gl-ink2:rgba(226,234,248,0.74);
  --gl-icon:rgba(214,230,250,0.84);
  --gl-hover:rgba(255,255,255,0.08);
  --gl-active:linear-gradient(150deg,rgba(140,200,255,0.28) 0%,rgba(140,200,255,0.10) 100%);
  --gl-active-shadow:inset 0 1px 0 rgba(255,255,255,0.30),0 0 0 .5px rgba(170,215,255,0.40),0 6px 18px rgba(40,120,255,0.25);
  --gl-active-ink:#eef7ff;
  --gl-active-glow:drop-shadow(0 0 5px rgba(140,200,255,0.8));
  --gl-accent:#8cc8ff;
  --gl-hair:rgba(255,255,255,0.10);
  --gl-btn:rgba(255,255,255,0.07);
  --gl-btn-shadow:inset 0 1px 0 rgba(255,255,255,0.14),0 0 0 .5px rgba(255,255,255,0.10);
  /* The mark is a pale glass N: on dark glass it only needs to glow, on
     light glass it is deepened to the brand blue so it reads at all. */
  --gl-mark:brightness(1.2);
}
:root:not([data-theme="dark"]){
  --gl-bg:linear-gradient(170deg,rgba(255,255,255,0.74) 0%,rgba(255,255,255,0.44) 100%);
  --gl-lip:rgba(255,255,255,0.95);
  --gl-under:rgba(10,30,60,0.05);
  --gl-edge:rgba(10,30,60,0.14);
  --gl-drop:0 24px 70px rgba(40,80,160,0.16);
  --gl-ring:linear-gradient(170deg,rgba(255,255,255,1),rgba(255,255,255,0.15) 30%,rgba(255,255,255,0.55) 100%);
  --gl-ink:#0b1220;
  --gl-ink2:#3b4658;
  --gl-icon:#4a5568;
  --gl-hover:rgba(10,30,60,0.06);
  --gl-active:linear-gradient(150deg,#ffffff 0%,rgba(255,255,255,0.78) 100%);
  --gl-active-shadow:inset 0 1px 0 #ffffff,0 0 0 .5px rgba(10,30,60,0.10),0 6px 16px rgba(40,80,160,0.14);
  --gl-active-ink:#1f5f99;
  --gl-active-glow:none;
  --gl-accent:#1f5f99;
  --gl-hair:rgba(10,30,60,0.10);
  --gl-btn:rgba(255,255,255,0.6);
  --gl-btn-shadow:inset 0 1px 0 #ffffff,0 0 0 .5px rgba(10,30,60,0.10);
  /* A thin brand-blue contour rather than a darkening: the letter keeps its
     glass (darkened, it went grey-green at the edges), and the outline is
     what gives it an edge against the pale pane. */
  --gl-mark:brightness(.9) drop-shadow(0 0 .8px #1f5f99) drop-shadow(0 0 .8px #1f5f99) drop-shadow(0 3px 6px rgba(31,95,153,.25));
}

/* ── The sidebar ───────────────────────────────────────────────────────── */
#slide-nav{
  background:var(--gl-bg);
  backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
  border:0;border-radius:26px;
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),0 0 0 .5px var(--gl-edge),var(--gl-drop);
  color:var(--gl-ink);
}
/* The lens edge. ::before is the top sheen the CI reads as "glassy"; the
   edge is drawn in ::after so that one stays what it was. */
#slide-nav::after{
  content:'';position:absolute;inset:0;border-radius:inherit;padding:1.5px;pointer-events:none;
  background:var(--gl-ring);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
}
#slide-nav::before{background:linear-gradient(90deg,transparent,var(--gl-lip),transparent)}
#slide-nav .nav-header,#slide-nav .nav-footer{border-color:var(--gl-hair)}
#slide-nav .nav-divider{background:var(--gl-hair)}
#slide-nav .nav-brand-name{color:var(--gl-ink)}
#slide-nav .nav-brand-ver,#slide-nav .nav-group-label{color:var(--gl-ink2)}
/* The mark on its own: no plate behind it, tinted for the theme. */
#slide-nav .nav-brand-mark{
  width:38px;height:38px;padding:0;border-radius:0;
  background:none;border:0;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;
}
#slide-nav .nav-brand-mark .nv-mark{filter:var(--gl-mark)}
#slide-nav .nav-item{color:var(--gl-ink2);border-radius:13px}
#slide-nav .nav-item i{color:var(--gl-icon)}
#slide-nav .nav-item:hover{background:var(--gl-hover);color:var(--gl-ink)}
#slide-nav .nav-item:hover i{color:var(--gl-ink);transform:none}
#slide-nav .nav-item.active{background:var(--gl-active);box-shadow:var(--gl-active-shadow);color:var(--gl-ink)}
#slide-nav .nav-item.active i{color:var(--gl-active-ink);filter:var(--gl-active-glow)}
#slide-nav .nav-hdr-btn{
  border:0;background:var(--gl-btn);box-shadow:var(--gl-btn-shadow);color:var(--gl-ink2);
}
#slide-nav .nav-hdr-btn:hover{background:var(--gl-hover);color:var(--gl-ink)}
#slide-nav .nav-footer,#slide-nav .nav-footer *{color:var(--gl-ink2)}
#slide-nav .gt-radial-side-btn.gt-radial-side-danger,
#slide-nav .gt-radial-side-btn.gt-radial-side-danger i{color:var(--danger)}
/* In the rail: the item is a 44px glass key, centred, with a short accent
   bar at the rail's edge for the screen you are on. */
body.nav-icons #slide-nav .nav-items{padding:6px 10px;gap:4px}
body.nav-icons #slide-nav .nav-item{padding:11px 0;min-height:42px}
body.nav-icons #slide-nav .nav-item.active::before{
  content:'';position:absolute;left:-10px;top:11px;width:3px;height:20px;border-radius:2px;
  background:var(--gl-accent);box-shadow:0 0 10px var(--gl-accent);
}
@media(min-width:761px) and (max-width:1099.98px){
  #slide-nav .nav-items{padding:6px 10px;gap:4px}
  #slide-nav .nav-item.active::before{
    content:'';position:absolute;left:-10px;top:11px;width:3px;height:20px;border-radius:2px;
    background:var(--gl-accent);box-shadow:0 0 10px var(--gl-accent);
  }
}

/* ── Every top bar ─────────────────────────────────────────────────────────
   The Analyzer's .topbar and the fifteen .wm-topbar screens are one bar, so
   they take one material. Sizes and margins are left exactly as they were:
   the bar's 64px and its offsets past the rail are measured elsewhere. */
.topbar,.wm-topbar,
[data-theme="dark"] .topbar,[data-theme="dark"] .wm-topbar{
  background:var(--gl-bg);
  backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
  border:0;border-radius:22px;
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),
    inset 0 0 0 1px var(--gl-hair),0 0 0 .5px var(--gl-edge),0 16px 44px -10px rgba(10,30,60,0.22);
}
[data-theme="dark"] .topbar,[data-theme="dark"] .wm-topbar{
  box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),
    inset 0 0 0 1px var(--gl-hair),0 0 0 .5px var(--gl-edge),0 18px 50px -10px rgba(0,0,0,0.55);
}

/* ── The mark, wherever it sits: on its own, tinted for the theme ──────── */
.tbar-mark,.auth-logo-ring,.welcome-mark,.maint-logo{
  background:none;border:0;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;
}
.tbar-mark{width:32px;height:32px;padding:0}
.tbar-mark .nv-mark,.auth-logo-ring .nv-mark,.welcome-mark .nv-mark,.maint-logo .nv-mark{filter:var(--gl-mark)}

/* ── Sign-in ───────────────────────────────────────────────────────────────
   The landing's ground and glass. The clock and the weather were two pills
   pinned to opposite corners of the window; they now sit in one row directly
   above the card and exactly as wide as it, so the three panes share both
   edges and read as one composition. */
#auth-screen{
  flex-direction:column;gap:16px;overflow:hidden;isolation:isolate;
  background:radial-gradient(1100px 760px at 88% -4%,#0f2f6b 0%,transparent 62%),
    radial-gradient(900px 700px at 8% 104%,#0a2748 0%,transparent 60%),
    linear-gradient(160deg,#03060e 0%,#060c1b 50%,#0a0e22 100%);
  --auth-orb-a:#1e5bff;--auth-orb-b:#6b3cff;--auth-orb-o:.42;
}
:root:not([data-theme="dark"]) #auth-screen{
  background:radial-gradient(1100px 760px at 88% -4%,#a8c6ff 0%,transparent 62%),
    radial-gradient(900px 700px at 8% 104%,#c4e6ff 0%,transparent 60%),
    linear-gradient(160deg,#f5f9ff 0%,#e5f0ff 45%,#e2e4ff 100%);
  --auth-orb-a:#8ab4ff;--auth-orb-b:#b7a4ff;--auth-orb-o:.65;
}
#auth-screen::before,#auth-screen::after{
  content:'';position:absolute;z-index:-1;border-radius:50%;pointer-events:none;
  filter:blur(95px);opacity:var(--auth-orb-o);
  animation:novaDriftA 34s cubic-bezier(.45,0,.55,1) infinite alternate;
}
#auth-screen::before{width:700px;height:700px;top:-240px;right:-120px;background:var(--auth-orb-a)}
#auth-screen::after{width:560px;height:560px;bottom:-200px;left:-120px;background:var(--auth-orb-b);animation-name:novaDriftB;animation-duration:41s}
#auth-screen .auth-widgets-row{
  position:relative;top:auto;left:auto;right:auto;
  width:min(440px,calc(100% - 32px));box-sizing:border-box;
  justify-content:stretch;align-items:stretch;gap:16px;
  animation:novaRise 1.2s cubic-bezier(.22,1,.36,1) backwards;
}
#auth-screen .auth-wgt,[data-theme="dark"] #auth-screen .auth-wgt,
#auth-screen .auth-card,[data-theme="dark"] #auth-screen .auth-card{
  background:var(--gl-bg);
  backdrop-filter:blur(36px) saturate(190%);-webkit-backdrop-filter:blur(36px) saturate(190%);
  border:0;
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),
    inset 0 0 0 1px var(--gl-hair),0 0 0 .5px var(--gl-edge),var(--gl-drop);
}
#auth-screen .auth-wgt{
  flex:1 1 0;min-width:0;border-radius:24px;padding:16px 20px;
  display:flex;flex-direction:column;justify-content:center;
}
#auth-screen .auth-wgt-weather{flex:0 0 164px;min-width:0}
#auth-screen .auth-clock-time{font-size:44px}
#auth-screen .auth-card{
  width:min(440px,calc(100% - 32px));max-width:none;box-sizing:border-box;
  border-radius:32px;padding:34px 36px 28px;
  animation:novaRise 1.3s cubic-bezier(.22,1,.36,1) .12s backwards;
}
#auth-screen .auth-card::before{background:linear-gradient(90deg,transparent,var(--gl-lip),transparent)}
/* The mark, bare, in a soft halo that breathes. */
#auth-screen .auth-logo-ring{
  position:relative;width:76px;height:76px;padding:0;margin-bottom:16px;overflow:visible;
}
#auth-screen .auth-logo-ring::before{
  content:'';position:absolute;inset:-14px;border-radius:50%;z-index:-1;
  background:radial-gradient(closest-side,rgba(138,180,255,0.55),transparent);
  animation:authHalo 6s cubic-bezier(.45,0,.55,1) infinite;
}
@keyframes authHalo{0%,100%{transform:scale(1);opacity:.75}50%{transform:scale(1.08);opacity:1}}
@media(prefers-reduced-motion:reduce){
  #auth-screen::before,#auth-screen::after,#auth-screen .auth-logo-ring::before,
  #auth-screen .auth-widgets-row,#auth-screen .auth-card{animation:none}
}
/* Inside a bar that blurs what is behind it, the mark's breathing glow (an
   animated filter on the <img>) repaints as a faint square around the
   letter. The contour above already gives it its edge; in the bar it holds
   still. */
.tbar-mark .nv-mark img{animation:none;filter:none}

/* ══════════════════════════════════════════════════════════════════════════
   LIQUID GLASS — the moments in between
   ──────────────────────────────────────────────────────────────────────────
   The welcome after signing in, the way into the Workers' Comp Analyzer, and
   an upload in flight, on the landing's ground and glass and moving with the
   same curves: arrivals on one ease-out (.22,1,.36,1) with a blur that
   clears, departures on a quick ease-in-out, springs only where something
   has been pressed or has just finished.
   ══════════════════════════════════════════════════════════════════════════ */
:root{
  --gl-ground:radial-gradient(1100px 760px at 88% -4%,#0f2f6b 0%,transparent 62%),
    radial-gradient(900px 700px at 8% 104%,#0a2748 0%,transparent 60%),
    linear-gradient(160deg,#03060e 0%,#060c1b 50%,#0a0e22 100%);
  --gl-orb-a:#1e5bff;--gl-orb-b:#12a8d8;--gl-orb-c:#6b3cff;--gl-orb-o:.42;
  --gl-card:linear-gradient(160deg,rgba(255,255,255,0.12) 0%,rgba(255,255,255,0.04) 100%);
  --gl-card-shadow:inset 0 1px 0 rgba(255,255,255,0.26),inset 0 -1px 0 rgba(0,0,0,0.35),0 0 0 .5px rgba(0,0,0,0.65),0 40px 100px rgba(0,0,0,0.55);
  --gl-name:linear-gradient(100deg,#ffffff 0%,#b9dcff 25%,#c3b2ff 50%,#b9dcff 75%,#ffffff 100%);
  --gl-halo:rgba(90,160,255,0.55);
  --gl-groove:rgba(255,255,255,0.08);
  --gl-tile:linear-gradient(150deg,rgba(140,200,255,0.34) 0%,rgba(90,150,255,0.14) 100%);
  --gl-tile-shadow:inset 0 1px 0 rgba(255,255,255,0.4),0 0 0 1px rgba(170,215,255,0.42),0 8px 22px rgba(40,120,255,0.3);
  --gl-tile-ink:#e6f3ff;
  --gl-fill:linear-gradient(90deg,#5ad0ff 0%,#5a8cff 55%,#8f7bff 100%);
  --gl-fill-glow:rgba(90,140,255,0.55);
  --gl-scrim:rgba(2,5,12,0.45);
}
:root:not([data-theme="dark"]){
  --gl-ground:radial-gradient(1100px 760px at 88% -4%,#a8c6ff 0%,transparent 62%),
    radial-gradient(900px 700px at 8% 104%,#c4e6ff 0%,transparent 60%),
    linear-gradient(160deg,#f5f9ff 0%,#e5f0ff 45%,#e2e4ff 100%);
  --gl-orb-a:#8ab4ff;--gl-orb-b:#7fe3ff;--gl-orb-c:#b7a4ff;--gl-orb-o:.68;
  --gl-card:linear-gradient(160deg,rgba(255,255,255,0.84) 0%,rgba(255,255,255,0.52) 100%);
  --gl-card-shadow:inset 0 1.5px 0 rgba(255,255,255,0.95),inset 0 -1px 0 rgba(10,30,60,0.05),0 0 0 .5px rgba(10,30,60,0.14),0 36px 90px rgba(40,80,160,0.22);
  --gl-name:linear-gradient(100deg,#0b1a33 0%,#1f5f99 25%,#6d5bd0 50%,#1f5f99 75%,#0b1a33 100%);
  --gl-halo:rgba(138,180,255,0.6);
  --gl-groove:rgba(10,30,60,0.08);
  --gl-tile:linear-gradient(150deg,#ffffff 0%,#eef4ff 100%);
  --gl-tile-shadow:inset 0 1px 0 #ffffff,0 0 0 .5px rgba(10,30,60,0.12),0 6px 16px rgba(40,80,160,0.16);
  --gl-tile-ink:#1f5f99;
  --gl-fill:linear-gradient(90deg,#5ad0ff 0%,#4b7dff 55%,#8f7bff 100%);
  --gl-fill-glow:rgba(75,125,255,0.45);
  --gl-scrim:rgba(220,230,248,0.35);
}

/* ── The welcome ───────────────────────────────────────────────────────── */
#welcome-overlay{background:var(--gl-ground);overflow:hidden;isolation:isolate;transition:opacity .9s cubic-bezier(.4,0,.2,1)}
#welcome-overlay .welcome-ground{position:absolute;inset:0;z-index:-1;pointer-events:none}
#welcome-overlay .wg-orb{position:absolute;border-radius:50%;filter:blur(95px);opacity:var(--gl-orb-o);
  animation:novaDriftA 34s cubic-bezier(.45,0,.55,1) infinite alternate}
#welcome-overlay .wg-orb-1{width:640px;height:640px;top:-220px;right:-120px;background:var(--gl-orb-a)}
#welcome-overlay .wg-orb-2{width:600px;height:600px;bottom:-200px;left:-140px;background:var(--gl-orb-b);animation-name:novaDriftB;animation-duration:41s}
#welcome-overlay .wg-orb-3{width:460px;height:460px;bottom:-120px;right:18%;background:var(--gl-orb-c);opacity:calc(var(--gl-orb-o) * .7);animation-duration:38s;animation-direction:alternate-reverse}
#welcome-overlay .welcome-ring-stage,#welcome-overlay.show .welcome-ring-stage{width:auto;height:auto;animation:none}
#welcome-overlay .welcome-inner{gap:0;animation:none;transition:transform 1s cubic-bezier(.4,0,.2,1),filter .9s cubic-bezier(.4,0,.2,1)}
/* Leaving: it opens out and softens as it fades, into the landing. */
#welcome-overlay:not(.show) .welcome-inner{transform:scale(1.04);filter:blur(12px)}
#welcome-overlay .welcome-core{position:relative;width:172px;height:172px;display:flex;align-items:center;justify-content:center}
#welcome-overlay .welcome-core::before{
  content:'';position:absolute;inset:18px;border-radius:50%;pointer-events:none;
  background:radial-gradient(closest-side,var(--gl-halo),transparent);
  animation:authHalo 6s cubic-bezier(.45,0,.55,1) infinite;
}
#welcome-overlay .welcome-ring{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg)}
#welcome-overlay .wr-groove{stroke:var(--gl-groove)}
#welcome-overlay .wr-progress{filter:none}
#welcome-overlay.show .wr-progress{animation:wrDrawGlass 3.2s cubic-bezier(.45,0,.55,1) .15s forwards}
@keyframes wrDrawGlass{from{stroke-dashoffset:100}to{stroke-dashoffset:0}}
#welcome-overlay .welcome-mark{
  width:104px;height:104px;padding:16px;box-sizing:border-box;border-radius:32px;
  background:var(--gl-card);box-shadow:var(--gl-card-shadow);
  backdrop-filter:blur(24px) saturate(190%);-webkit-backdrop-filter:blur(24px) saturate(190%);
}
#welcome-overlay .welcome-mark::after{content:none}
#welcome-overlay.show .welcome-mark{animation:novaRise 1.1s cubic-bezier(.22,1,.36,1) .1s both}
#welcome-overlay .welcome-greet{margin-top:34px;font-size:32px;font-weight:300;letter-spacing:-.025em;color:var(--gl-ink2)}
#welcome-overlay .welcome-name{
  margin-top:2px;font-size:96px;font-weight:800;letter-spacing:-.055em;line-height:1;padding-bottom:8px;
  background:var(--gl-name);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;
}
#welcome-overlay .welcome-meta{margin-top:18px;display:flex;align-items:center;gap:12px}
#welcome-overlay .welcome-role{
  margin:0;padding:6px 14px;border-radius:999px;font-size:13px;font-weight:600;letter-spacing:0;text-transform:none;
  color:var(--gl-accent);background:var(--gl-btn);box-shadow:var(--gl-btn-shadow);
  backdrop-filter:blur(18px) saturate(180%);-webkit-backdrop-filter:blur(18px) saturate(180%);
}
#welcome-overlay .welcome-sysline{
  margin:0;min-width:190px;text-align:left;font-family:var(--font-sans);font-size:14px;letter-spacing:0;color:var(--gl-ink2);
  transition:opacity .45s cubic-bezier(.22,1,.36,1),transform .55s cubic-bezier(.22,1,.36,1);
}
#welcome-overlay .welcome-sysline.swap{opacity:0;transform:translate3d(0,8px,0)}
#welcome-overlay.show .welcome-greet{animation:novaRise 1.1s cubic-bezier(.22,1,.36,1) .4s both}
#welcome-overlay.show .welcome-name{animation:novaRise 1.1s cubic-bezier(.22,1,.36,1) .65s both,novaShimmer 12s linear 1.6s infinite}
#welcome-overlay.show .welcome-role{animation:novaRise 1.1s cubic-bezier(.22,1,.36,1) .9s both}
#welcome-overlay.show .welcome-sysline{animation:novaRise 1.1s cubic-bezier(.22,1,.36,1) .9s both}
#welcome-overlay .wd-item{
  left:calc(50% + var(--x));top:calc(50% + var(--y));
  display:flex;align-items:center;gap:6px;padding:7px 13px;border-radius:999px;
  font-family:var(--font-sans);font-size:13px;font-weight:600;letter-spacing:0;color:var(--gl-ink2);
  background:var(--gl-btn);box-shadow:var(--gl-btn-shadow);
  backdrop-filter:blur(18px) saturate(180%);-webkit-backdrop-filter:blur(18px) saturate(180%);
  animation:wdRise var(--dur,4s) cubic-bezier(.22,1,.36,1) forwards;
}
#welcome-overlay .wd-item::before{content:'';width:6px;height:6px;border-radius:3px;background:var(--dot,#8ab4ff)}
@keyframes wdRise{
  0%{opacity:0;transform:translate(-50%,calc(-50% + 40px)) scale(.92);filter:blur(4px)}
  18%{opacity:1;filter:blur(0)}
  72%{opacity:1}
  100%{opacity:0;transform:translate(-50%,calc(-50% - 110px)) scale(1);filter:blur(2px)}
}

/* ── Into the Workers' Comp Analyzer ───────────────────────────────────── */
#analyzer-boot{background:var(--gl-ground);overflow:hidden;isolation:isolate;transition:opacity .6s cubic-bezier(.4,0,.2,1) .2s}
#analyzer-boot::before,#analyzer-boot::after{
  content:'';position:absolute;z-index:-1;border-radius:50%;pointer-events:none;
  filter:blur(95px);opacity:var(--gl-orb-o);animation:novaDriftA 34s cubic-bezier(.45,0,.55,1) infinite alternate;
}
#analyzer-boot::before{width:640px;height:640px;top:-220px;right:-100px;background:var(--gl-orb-a)}
#analyzer-boot::after{width:600px;height:600px;bottom:-200px;left:-140px;background:var(--gl-orb-b);animation-name:novaDriftB;animation-duration:41s}
#analyzer-boot .boot-inner{
  position:relative;align-items:stretch;gap:18px;width:min(460px,calc(100% - 32px));box-sizing:border-box;
  padding:30px 32px 26px;border-radius:32px;overflow:hidden;color:var(--gl-ink);
  background:var(--gl-card);box-shadow:var(--gl-card-shadow);
  backdrop-filter:blur(40px) saturate(190%);-webkit-backdrop-filter:blur(40px) saturate(190%);
  transition:transform .9s cubic-bezier(.65,0,.35,1),opacity .6s cubic-bezier(.4,0,.2,1) .15s,filter .6s ease;
}
#analyzer-boot.show .boot-inner{animation:novaRise 1.1s cubic-bezier(.22,1,.36,1) both}
/* The hand-off: up and small, toward where the top bar is about to be. */
#analyzer-boot.handoff .boot-inner{transform:translate3d(0,-38vh,0) scale(.42);opacity:0;filter:blur(4px);animation:none}
#analyzer-boot .boot-inner::before{
  content:'';position:absolute;inset:0;border-radius:inherit;padding:1.5px;pointer-events:none;
  background:var(--gl-ring);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;
}
#analyzer-boot .boot-head{display:flex;align-items:center;gap:14px}
#analyzer-boot .boot-mark{width:52px;height:52px;flex-shrink:0}
#analyzer-boot .boot-mark::before,#analyzer-boot .boot-mark::after{content:none}
#analyzer-boot .boot-mark .nv-mark{width:52px;height:52px;animation:none;filter:var(--gl-mark)}
#analyzer-boot .boot-headtext{display:flex;flex-direction:column;gap:3px;min-width:0}
#analyzer-boot .boot-title{font-size:22px;font-weight:700;letter-spacing:-.02em;color:var(--gl-ink)}
#analyzer-boot .boot-status{font-family:var(--font-sans);font-size:13px;letter-spacing:0;color:var(--gl-ink2);
  transition:opacity .45s cubic-bezier(.22,1,.36,1),transform .55s cubic-bezier(.22,1,.36,1)}
#analyzer-boot .boot-status.swap{opacity:0;transform:translate3d(0,8px,0)}
#analyzer-boot .boot-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}
#analyzer-boot .boot-step{
  display:flex;align-items:center;gap:12px;height:38px;padding:0 12px;border-radius:13px;
  font-size:14px;font-weight:500;color:var(--gl-ink2);opacity:.7;
  transition:background .5s cubic-bezier(.22,1,.36,1),box-shadow .5s cubic-bezier(.22,1,.36,1),color .4s ease,opacity .4s ease;
}
#analyzer-boot .boot-step.active{opacity:1;font-weight:600;color:var(--gl-ink);background:var(--gl-active);box-shadow:var(--gl-active-shadow)}
#analyzer-boot .boot-step.done{opacity:1;color:var(--gl-ink)}
#analyzer-boot .boot-step-dot{position:relative;width:20px;height:20px;flex-shrink:0;border-radius:50%;box-sizing:border-box;
  border:1.5px solid var(--gl-hair)}
#analyzer-boot .boot-step.active .boot-step-dot{border-color:var(--gl-hair);border-top-color:var(--gl-accent);border-width:2px;animation:bootSpin .9s linear infinite}
#analyzer-boot .boot-step.done .boot-step-dot{
  border:0;background:linear-gradient(150deg,#2f7ae0 0%,#5a5ce6 100%);box-shadow:0 4px 10px rgba(47,122,224,0.35);
  animation:bootPop .6s cubic-bezier(.34,1.3,.5,1) both;
}
#analyzer-boot .boot-step.done .boot-step-dot::after{
  content:'';position:absolute;left:7px;top:4px;width:5px;height:9px;
  border:solid #fff;border-width:0 2.4px 2.4px 0;transform:rotate(45deg);
}
@keyframes bootSpin{to{transform:rotate(360deg)}}
@keyframes bootPop{0%{transform:scale(.4);opacity:0}60%{transform:scale(1.12);opacity:1}100%{transform:scale(1);opacity:1}}
#analyzer-boot .boot-track{position:relative;height:8px;border-radius:4px;background:var(--gl-groove);box-shadow:inset 0 1px 2px rgba(10,30,60,0.12)}
#analyzer-boot .boot-fill{position:relative;overflow:hidden;border-radius:4px;background:var(--gl-fill);box-shadow:0 0 12px var(--gl-fill-glow);
  transition:width .6s cubic-bezier(.22,1,.36,1)}
#analyzer-boot .boot-fill::after,.upl-card .upl-fill::after{
  content:'';position:absolute;top:0;bottom:0;left:0;width:40%;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,0.6),transparent);
  animation:glSheen 1.8s cubic-bezier(.45,0,.55,1) infinite;
}
@keyframes glSheen{from{transform:translateX(-120%)}to{transform:translateX(320%)}}
#analyzer-boot .boot-foot{display:flex;justify-content:space-between;font-size:13px;color:var(--gl-ink2)}
#analyzer-boot .boot-pct{font-family:var(--font-sans);font-size:13px;font-weight:700;color:var(--gl-ink)}

/* ── An upload in flight ───────────────────────────────────────────────── */
.upl-modal{background:var(--gl-scrim);backdrop-filter:blur(10px) saturate(140%);-webkit-backdrop-filter:blur(10px) saturate(140%)}
.upl-modal .upl-card{
  width:min(380px,calc(100% - 32px));box-sizing:border-box;padding:26px 26px 22px;border:0;border-radius:30px;
  text-align:left;color:var(--gl-ink);background:var(--gl-card);box-shadow:var(--gl-card-shadow);
  backdrop-filter:blur(40px) saturate(190%);-webkit-backdrop-filter:blur(40px) saturate(190%);
  transform:translate3d(0,24px,0) scale(.965);filter:blur(6px);opacity:0;
  transition:transform 1.1s cubic-bezier(.22,1,.36,1),filter .8s cubic-bezier(.22,1,.36,1),opacity .6s cubic-bezier(.22,1,.36,1);
}
.upl-modal.show .upl-card{transform:none;filter:none;opacity:1}
.upl-modal .upl-card::before{
  content:'';position:absolute;inset:0;border-radius:inherit;padding:1.5px;pointer-events:none;
  background:var(--gl-ring);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;
}
.upl-modal .upl-head{display:flex;align-items:center;gap:14px}
.upl-modal .upl-icon{
  width:54px;height:54px;flex-shrink:0;margin:0;border-radius:17px;display:flex;align-items:center;justify-content:center;
  font-size:24px;color:var(--gl-tile-ink);background:var(--gl-tile);box-shadow:var(--gl-tile-shadow);
  transition:background .6s cubic-bezier(.22,1,.36,1);
}
.upl-modal .upl-icon i{animation:uplBob 1.6s cubic-bezier(.45,0,.55,1) infinite}
.upl-modal .upl-card.done .upl-icon{color:#fff;background:linear-gradient(150deg,#34c759 0%,#1fa24a 100%);box-shadow:0 8px 22px rgba(52,199,89,0.35),inset 0 1px 0 rgba(255,255,255,0.4)}
.upl-modal .upl-card.done .upl-icon i{animation:bootPop .6s cubic-bezier(.34,1.3,.5,1) both}
@keyframes uplBob{0%,100%{transform:translate3d(0,2px,0)}50%{transform:translate3d(0,-3px,0)}}
.upl-modal .upl-title{margin:0;font-size:18px;font-weight:700;letter-spacing:-.015em;color:var(--gl-ink)}
.upl-modal .upl-stream{position:relative;height:10px;margin:18px 0 8px;overflow:hidden}
.upl-modal .upl-dot{
  position:absolute;top:2px;left:0;width:6px;height:6px;border-radius:3px;
  background:var(--gl-accent);box-shadow:0 0 8px var(--gl-fill-glow);opacity:0;
  animation:uplFlow 2.2s cubic-bezier(.45,0,.55,1) infinite;
}
@keyframes uplFlow{0%{left:0;opacity:0}15%{opacity:1}85%{opacity:1}100%{left:calc(100% - 6px);opacity:0}}
.upl-modal .upl-card.done .upl-dot{animation:none;opacity:0}
.upl-modal .upl-track{height:8px;margin:0 0 10px;border-radius:4px;background:var(--gl-groove);box-shadow:inset 0 1px 2px rgba(10,30,60,0.12)}
.upl-modal .upl-fill{position:relative;overflow:hidden;border-radius:4px;background:var(--gl-fill);box-shadow:0 0 12px var(--gl-fill-glow);
  transition:width .6s cubic-bezier(.22,1,.36,1),background .6s ease}
.upl-modal .upl-card.done .upl-fill{background:linear-gradient(90deg,#2fb350,#4cc97a);box-shadow:0 0 12px rgba(52,199,89,0.45)}
.upl-modal .upl-meta{align-items:baseline;font-family:var(--font-sans);font-size:16px;font-weight:700;color:var(--gl-ink)}
.upl-modal .upl-label{font-size:12px;font-weight:500;color:var(--gl-ink2)}

/* ── Reduced motion: still glass, nothing moves ────────────────────────── */
@media(prefers-reduced-motion:reduce){
  #welcome-overlay .wg-orb,#welcome-overlay .welcome-core::before,
  #welcome-overlay.show .welcome-ring-stage,#welcome-overlay.show .wr-progress,
  #welcome-overlay.show .welcome-mark,#welcome-overlay.show .welcome-mark::after,
  #welcome-overlay.show .welcome-greet,#welcome-overlay.show .welcome-name,
  #welcome-overlay.show .welcome-role,#welcome-overlay.show .welcome-sysline{animation:none}
  #welcome-overlay .welcome-greet,#welcome-overlay .welcome-name,#welcome-overlay .welcome-role{opacity:1}
  #welcome-overlay .wr-progress{stroke-dashoffset:0}
  #welcome-overlay .welcome-inner,#welcome-overlay:not(.show) .welcome-inner{transform:none;filter:none;transition:none}
  #welcome-overlay .wd-item{display:none}
  .upl-modal .upl-card,.upl-modal.show .upl-card{transform:none;filter:none;transition:opacity .12s linear}
  .upl-modal .upl-icon i,.upl-modal .upl-dot,.upl-card .upl-fill::after{animation:none}
  .upl-modal .upl-dot{display:none}
}
/* Inside a blurred pane the mark's breathing glow repaints as a faint square
   (the same reason as in the top bar); the pane's own halo does that job. */
#analyzer-boot .boot-mark .nv-mark img,#welcome-overlay .welcome-mark .nv-mark img{animation:none;filter:none}

/* ══════════════════════════════════════════════════════════════════════════
   LIQUID GLASS — the workspaces and everything inside them
   ──────────────────────────────────────────────────────────────────────────
   The ground every screen paints (--bg / --bg-mesh) was the mountain
   landscape; it is the landing's ground now, on every screen, so walking
   from the landing into a workspace and on into a tool stays in one place.
   The four layers keep the size/position/repeat lists the screens already
   spell out. The page's glass is filled a little more on the light theme,
   because the new ground is brighter and bluer than the old one and a 0.34
   pane over it lost its edge.
   ══════════════════════════════════════════════════════════════════════════ */
:root{
  --bg:#eaf1fc;
  --bg-mesh:
    radial-gradient(1100px 760px at 88% -4%,rgba(138,180,255,0.75) 0%,transparent 62%),
    radial-gradient(900px 700px at 6% 104%,rgba(127,227,255,0.55) 0%,transparent 60%),
    radial-gradient(760px 620px at 42% 58%,rgba(183,164,255,0.30) 0%,transparent 64%),
    linear-gradient(160deg,#f5f9ff 0%,#e7f0ff 45%,#e4e6ff 100%);
  --bg-mesh-size:auto,auto,auto,auto;
  --bg-mesh-pos:0% 0%,0% 0%,0% 0%,0% 0%;
  --bg-mesh-repeat:no-repeat,no-repeat,no-repeat,no-repeat;
}
:root:not([data-theme="dark"]){--glass-card:rgba(255,255,255,0.46)}
[data-theme="dark"]{
  --bg:#04070f;
  --bg-mesh:
    radial-gradient(1100px 760px at 88% -4%,rgba(30,91,255,0.40) 0%,transparent 62%),
    radial-gradient(900px 700px at 6% 104%,rgba(18,168,216,0.24) 0%,transparent 60%),
    radial-gradient(760px 620px at 42% 58%,rgba(107,60,255,0.18) 0%,transparent 64%),
    linear-gradient(160deg,#03060e 0%,#060c1b 50%,#0a0e22 100%);
  --bg-mesh-size:auto,auto,auto,auto;
  --bg-mesh-pos:0% 0%,0% 0%,0% 0%,0% 0%;
  --bg-mesh-repeat:no-repeat,no-repeat,no-repeat,no-repeat;
}
/* The ambient orbs behind the app: the landing's colours, blur and drift. */
.amb{filter:blur(90px);animation-timing-function:cubic-bezier(.45,0,.55,1)!important}
.amb1{background:radial-gradient(circle,rgba(138,180,255,0.55) 0%,transparent 65%);animation-duration:34s!important}
.amb2{background:radial-gradient(circle,rgba(127,227,255,0.40) 0%,transparent 65%);animation-duration:41s!important}
.amb3{background:radial-gradient(circle,rgba(183,164,255,0.38) 0%,transparent 65%);animation-duration:29s!important}
[data-theme="dark"] .amb1{background:radial-gradient(circle,rgba(30,91,255,0.35) 0%,transparent 65%)}
[data-theme="dark"] .amb2{background:radial-gradient(circle,rgba(18,168,216,0.22) 0%,transparent 65%)}
[data-theme="dark"] .amb3{background:radial-gradient(circle,rgba(107,60,255,0.22) 0%,transparent 65%)}

/* ── The workspaces as an iOS 27 home screen ───────────────────────────────
   UWing Assistance, Account Management and Marketing were rows of navy
   cards with mountains in them. Now each group is one glass panel holding
   its tools as app icons in a grid — a coloured glass squircle with a white
   glyph, the name under it, a two-line note under that — and the big entry
   points (the Analyzer, CRM HUB, Marketing's Account info) are widgets:
   glass tiles with their own launch pill. The icon colour is the group's,
   from the same --pal-* chip its title already carries, so a group reads as
   one family of apps the way an iOS folder does.

   Markup and order are untouched (the lobby checks read both); the
   mountains stay in the DOM and are simply not drawn. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen){--grp:var(--pal-blue)}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen,#games-screen) .desk-card{
  --text:var(--gl-ink);--text2:var(--gl-ink2);--text3:var(--gl-ink2);--accent:var(--gl-accent);
}
.gg-analyze+.desk-grid,.gg-submit+.desk-grid{--grp:var(--pal-blue)}
.gg-track+.desk-grid{--grp:var(--pal-teal)}
.gg-document+.desk-grid{--grp:var(--pal-amber)}
.gg-coordinate+.desk-grid,.gg-features+.desk-grid{--grp:var(--pal-indigo)}
.gg-administer+.desk-grid,.gg-finalize+.desk-grid{--grp:var(--pal-green)}
.gg-breaks+.desk-grid{--grp:var(--pal-purple)}

/* Group titles: a section header, not an eyebrow. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group-title{
  font-size:20px;font-weight:700;text-transform:none;letter-spacing:-.02em;color:var(--gl-ink);
  margin:34px 6px 14px;gap:10px;
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group-title:first-of-type{margin-top:10px}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group-title::before{
  width:26px;height:26px;border-radius:8px;background-size:14px 14px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.45),0 4px 10px rgba(10,30,60,0.18);
}

/* A group of tools: one glass panel, icons in a grid. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid.desk-row{
  grid-template-columns:repeat(auto-fill,minmax(132px,1fr));grid-template-rows:none;
  gap:18px 10px;padding:22px 18px 18px;border-radius:30px;
  background:var(--gl-bg);
  backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.20);
}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid.desk-row{
  box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 20px 60px -14px rgba(0,0,0,0.55);
}

/* A tool: an app icon, its name, a note. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini{
  background:none;border:0;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;
  height:150px;min-height:0;box-sizing:border-box;padding:6px 4px 4px;gap:3px;border-radius:22px;
  align-items:center;justify-content:flex-start;text-align:center;overflow:visible;
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini::before,
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini::after{content:none;display:none}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .tile{
  width:68px;height:68px;margin:0 0 9px;border-radius:20px;border:0;
  display:flex;align-items:center;justify-content:center;
  background:
    radial-gradient(120% 90% at 30% 0%,rgba(255,255,255,0.55) 0%,rgba(255,255,255,0) 55%),
    linear-gradient(160deg,color-mix(in srgb,var(--grp) 72%,#ffffff) 0%,var(--grp) 55%,color-mix(in srgb,var(--grp) 78%,#000000) 100%)!important;
  box-shadow:inset 0 1.5px 0 rgba(255,255,255,0.65),inset 0 -2px 4px rgba(0,0,0,0.14),
    0 0 0 .5px rgba(10,30,60,0.12),0 10px 22px -8px color-mix(in srgb,var(--grp) 70%,transparent);
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .tile i{
  font-size:32px;color:#ffffff!important;filter:drop-shadow(0 1px 1px rgba(0,0,0,0.18));
}
/* Calendar keeps the calendar's own icon: white, the weekday in red. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .cal-tile{
  width:68px;height:68px;margin:0 0 9px;border-radius:20px;border:0;gap:0;
  background:linear-gradient(170deg,#ffffff 0%,#f2f4f8 100%)!important;
  box-shadow:inset 0 1.5px 0 #ffffff,inset 0 -2px 4px rgba(0,0,0,0.06),0 0 0 .5px rgba(10,30,60,0.14),0 10px 22px -8px rgba(10,30,60,0.30);
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .cal-tile .cal-tile-wday{color:#e5413a}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .cal-tile .cal-tile-day{font-size:24px;color:#111318;line-height:1}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini-title{
  max-width:100%;font-size:13px;font-weight:600;color:var(--gl-ink);letter-spacing:-.01em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini-sub{
  max-width:100%;font-size:11px;line-height:1.35;color:var(--gl-ink2);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
/* Dark: the icons go dark glass with the glyph lit in the group's colour,
   the way iOS tints its icons at night. */
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .tile{
  background:
    radial-gradient(120% 90% at 30% 0%,rgba(255,255,255,0.16) 0%,rgba(255,255,255,0) 55%),
    linear-gradient(160deg,color-mix(in srgb,var(--grp) 34%,#0b1426) 0%,color-mix(in srgb,var(--grp) 16%,#070c18) 100%)!important;
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.28),0 0 0 1px color-mix(in srgb,var(--grp) 45%,transparent),
    0 10px 24px -8px color-mix(in srgb,var(--grp) 55%,transparent);
}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .tile i{
  color:color-mix(in srgb,var(--grp) 45%,#ffffff)!important;
  filter:drop-shadow(0 0 6px color-mix(in srgb,var(--grp) 80%,transparent));
}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .cal-tile{
  background:linear-gradient(170deg,#1b2233 0%,#111726 100%)!important;
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.22),0 0 0 .5px rgba(255,255,255,0.14),0 10px 24px -8px rgba(0,0,0,0.6);
}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .cal-tile .cal-tile-wday{color:#ff6b61}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .cal-tile .cal-tile-day{color:#f3f6fb}

/* The big entry points: widgets. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row){grid-template-columns:minmax(0,1fr);grid-template-rows:auto;gap:18px}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main{
  background:var(--gl-bg);border:0;border-radius:30px;padding:22px 24px 20px;min-height:0;color:var(--gl-ink);
  backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.22);
}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main{
  box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 20px 60px -14px rgba(0,0,0,0.55);
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-mountains{display:none}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-top{margin-bottom:14px}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) :is(.desk-main-icon,.desk-main-icon-is){
  width:52px;height:52px;border-radius:16px;border:0;display:flex;align-items:center;justify-content:center;filter:none;
  background:
    radial-gradient(120% 90% at 30% 0%,rgba(255,255,255,0.55) 0%,rgba(255,255,255,0) 55%),
    linear-gradient(160deg,color-mix(in srgb,var(--grp) 72%,#ffffff) 0%,var(--grp) 55%,color-mix(in srgb,var(--grp) 78%,#000000) 100%);
  box-shadow:inset 0 1.5px 0 rgba(255,255,255,0.65),0 0 0 .5px rgba(10,30,60,0.12),0 8px 18px -6px color-mix(in srgb,var(--grp) 70%,transparent);
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-icon .nv-mark{width:38px;height:38px}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-icon svg{width:28px;height:28px;stroke:#ffffff}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-icon-is span{font-size:18px;color:#ffffff}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-title{font-size:22px;font-weight:700;color:var(--gl-ink)}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-sub{font-size:13px;color:var(--gl-ink2)}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-launch-btn{
  margin-top:16px;border:0;color:var(--gl-ink);background:var(--gl-active);box-shadow:var(--gl-active-shadow);
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-launch-arrow{
  background:linear-gradient(150deg,#2f7ae0 0%,#5a5ce6 100%);color:#ffffff;box-shadow:0 4px 10px rgba(47,122,224,0.35);
}
@media(max-width:640px){
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid.desk-row{grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:14px 6px;padding:18px 12px 14px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini{height:128px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .tile,
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini .cal-tile{width:60px;height:60px;border-radius:18px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini-sub{-webkit-line-clamp:1}
}

/* A wide widget, the way iOS lays one across the screen: the icon, then
   the name and note, then the launch pill — one row, not a tower. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main{
  display:grid;grid-template-columns:auto minmax(0,1fr) minmax(220px,260px);grid-template-rows:auto;
  grid-row:auto;align-items:center;column-gap:20px;padding:22px 24px;
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main .desk-main-top{margin:0}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main .desk-main-sub{min-height:0}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main .desk-launch-btn{margin:0;height:44px;border-radius:22px}
@media(max-width:760px){
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main{
    grid-template-columns:auto minmax(0,1fr);row-gap:14px;
  }
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main .desk-launch-btn{grid-column:1 / -1}
}
/* Nothing darkens under the pointer: the old dark-card hover shadow would
   paint a black halo around a transparent icon tile. The lift stays (the
   press/hover recipe is shared app-wide). */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen,#indications-screen) .desk-mini:hover{box-shadow:none}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main:hover{
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.22);
}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main:hover{
  box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 20px 60px -14px rgba(0,0,0,0.55);
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-icon svg [stroke]{stroke:#ffffff}

/* DocuHub's programme picker: the same app icons, in the Document colour,
   inside the card that already holds them. */
#indications-screen{--grp:var(--pal-amber)}
/* The games: glass cards, their own colourful icons kept (they already are
   app icons). */
#games-screen .lobby-card{
  background:var(--gl-bg);border:0;border-radius:28px;color:var(--gl-ink);
  backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.20);
}
#games-screen .lobby-card::before{content:none}
#games-screen .lobby-card:hover{box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
    0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.20)}
#games-screen .lobby-card-icon{border-radius:18px;box-shadow:inset 0 1.5px 0 rgba(255,255,255,0.55),0 8px 18px -6px rgba(10,30,60,0.35)}
#games-screen .lobby-card-title{color:var(--gl-ink)}
#games-screen .lobby-card-sub{color:var(--gl-ink2)}

#games-screen .lobby-card-icon{
  background:
    radial-gradient(120% 90% at 30% 0%,rgba(255,255,255,0.55) 0%,rgba(255,255,255,0) 55%),
    linear-gradient(160deg,color-mix(in srgb,var(--pal-purple) 72%,#ffffff) 0%,var(--pal-purple) 55%,color-mix(in srgb,var(--pal-purple) 78%,#000000) 100%)!important;
}
#games-screen .lobby-card-icon i{color:#ffffff!important}

/* ══ Activ & Bonus board ══════════════════════════════════════════════════
   The same card grid in both places it is drawn: NovaStudio's preview and
   Activ & Bonus itself (NSBoard.render in 24-novastudio.js). */
.nsb-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
@media (max-width:900px){ .nsb-grid{grid-template-columns:minmax(0,1fr)} }
.nsb-card{display:flex;flex-direction:column;min-width:0;background:var(--glass-card);border:0.5px solid var(--border);border-radius:var(--r-lg);padding:12px 14px}
.nsb-wide{grid-column:1 / -1}
.nsb-card-title{font-size:13px;font-weight:700;color:var(--text);margin-bottom:8px}
.nsb-card-body{position:relative;height:260px;min-width:0;overflow:auto}
.nsb-wide .nsb-card-body{height:auto;max-height:420px}
.nsb-body{display:flex;flex-direction:column;gap:12px;padding:4px 0 24px}
.nsb-bar,.kpi-board-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.nsb-bar-gap{flex:1}
.nsb-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;padding:5px 11px;border-radius:999px;background:var(--glass3);color:var(--text2);border:0.5px solid var(--border)}
.nsb-pill-live{color:var(--success);border-color:color-mix(in srgb,var(--success) 40%,transparent)}
.nsb-pill-build{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 40%,transparent)}
.nsb-status{font-size:12px;color:var(--text2);min-height:16px}
.nsb-status.bad{color:var(--danger)}
.nsb-title-lab{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:600;color:var(--text2)}
.nsb-title-lab input{flex:0 1 320px;min-width:0;font:inherit;font-size:13px;padding:7px 10px;border-radius:var(--r-sm);border:0.5px solid var(--border2);background:var(--input-bg);color:var(--text)}
.nsb-howto,.nsb-note{font-size:12px;line-height:1.6;color:var(--text3)}
.nsb-picks{display:flex;flex-wrap:wrap;gap:8px}
.nsb-pick{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:6px 10px;border-radius:var(--r-sm);background:var(--glass3);border:0.5px solid var(--border);color:var(--text);cursor:pointer}
.nsb-preview-head,.kpi-board-last{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text3);margin-top:6px}

.kpi-board{display:flex;flex-direction:column;gap:12px;padding:14px 24px 4px}
@media (max-width:560px){ .kpi-board{padding:12px 16px 4px} }
.kpi-board-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.kpi-board-title{font-size:18px;font-weight:700;color:var(--text)}
.kpi-board-meta{font-size:12px;color:var(--text3)}

/* Under construction: the notice everyone but the builders sees until the
   board is published, with a crane that keeps working while they wait. */
.kpi-construction{display:flex;align-items:center;gap:22px;padding:18px 22px;border-radius:var(--r-lg);
  background:color-mix(in srgb,var(--warn) 9%,var(--glass-card));border:0.5px solid color-mix(in srgb,var(--warn) 38%,transparent)}
@media (max-width:560px){ .kpi-construction{flex-direction:column;text-align:center} }
.kpi-construction-title{font-size:20px;font-weight:700;color:var(--text);letter-spacing:-.01em}
.kpi-construction-sub{margin-top:6px;font-size:13px;line-height:1.6;color:var(--text2);max-width:520px}
.kpi-crane{flex:none;width:200px;height:136px;overflow:visible}
.kpi-crane-structure rect,.kpi-crane-trolley rect{fill:var(--warn)}
.kpi-crane-structure .kpi-crane-weight{fill:var(--text3)}
.kpi-crane-structure .kpi-crane-cab{fill:var(--accent)}
.kpi-crane-lattice{stroke:var(--warn);stroke-width:1.6;fill:none}
.kpi-crane-hook line,.kpi-crane-hook path{stroke:var(--text2);stroke-width:1.6}
.kpi-crane-hook .kpi-crane-load{fill:var(--accent);opacity:.85}
.kpi-crane-trolley{animation:kpi-crane-trolley 7s var(--ease-out,ease-in-out) infinite alternate}
.kpi-crane-hook{transform-origin:0 27px;animation:kpi-crane-swing 2.6s ease-in-out infinite alternate}
@keyframes kpi-crane-trolley{from{transform:translateX(86px)}to{transform:translateX(186px)}}
@keyframes kpi-crane-swing{from{transform:rotate(-5deg)}to{transform:rotate(5deg)}}
@media (prefers-reduced-motion: reduce){
  .kpi-crane-trolley{animation:none;transform:translateX(136px)}
  .kpi-crane-hook{animation:none}
}

/* ══════════════════════════════════════════════════════════════════════════
   LIQUID GLASS — the Workers' Comp Analyzer and the CRMs
   ──────────────────────────────────────────────────────────────────────────
   The same language as the workspaces: sections headed like iOS groups (a
   coloured squircle and a title in sentence case), each section one glass
   panel, and in the CRMs the counters as widgets, the CRM/Data switch as
   a segmented control and the filters as glass capsules.

   Only what a surface looks like changes. The blur stays the app's one
   --blur (the glass-recipe check holds every card to it), the Yes/No pair
   keeps its green/red, radii and settle, the incomplete ring and the Joe's
   warning keep their !important colours, and none of it reaches paper —
   the print sheet has its own navy headings.
   ══════════════════════════════════════════════════════════════════════════ */
@media screen{
  /* Each Analyzer section takes the colour of the part of the submission it
     is about: the file, the people, who the account is, where it works, what
     it does, what it answers, what it has lost. */
  #app .main{--grp:var(--pal-blue)}
  #app .main #sec-head-acord{--grp:var(--pal-blue)}
  #app .main #sec-head-joes{--grp:var(--pal-indigo)}
  #app .main :is(#sec-head-acct,#sec-head-fein,#sec-head-dates,#sec-head-contact,#sec-head-owners){--grp:var(--pal-teal)}
  #app .main #sec-head-states{--grp:var(--pal-green)}
  #app .main :is(#sec-head-risk,#sec-head-mod){--grp:var(--pal-amber)}
  #app .main #sec-head-ynq{--grp:var(--pal-purple)}
  #app .main :is(#sec-head-loss,#sec-head-lr){--grp:var(--pal-red)}
  #app .main #sec-head-ani{--grp:var(--pal-cyan)}

  #app .main .sec-head{
    font-size:20px;font-weight:700;text-transform:none;letter-spacing:-.02em;color:var(--gl-ink);
    margin:34px 6px 14px;gap:10px;
  }
  #app .main .sec-head>i{
    width:26px;height:26px;border-radius:8px;flex-shrink:0;
    display:inline-flex;align-items:center;justify-content:center;font-size:14px;color:#ffffff;
    background:
      radial-gradient(120% 90% at 30% 0%,rgba(255,255,255,0.55) 0%,rgba(255,255,255,0) 55%),
      linear-gradient(160deg,color-mix(in srgb,var(--grp) 72%,#ffffff) 0%,var(--grp) 55%,color-mix(in srgb,var(--grp) 78%,#000000) 100%);
    box-shadow:inset 0 1px 0 rgba(255,255,255,0.45),0 4px 10px color-mix(in srgb,var(--grp) 40%,transparent);
  }
  [data-theme="dark"] #app .main .sec-head>i{
    color:color-mix(in srgb,var(--grp) 35%,#ffffff);
    background:linear-gradient(160deg,color-mix(in srgb,var(--grp) 52%,#0b1426) 0%,color-mix(in srgb,var(--grp) 26%,#070c18) 100%);
    box-shadow:inset 0 1px 0 rgba(255,255,255,0.24),0 0 0 1px color-mix(in srgb,var(--grp) 45%,transparent),
      0 4px 12px color-mix(in srgb,var(--grp) 45%,transparent);
  }
  #app .main .sec-head .sec-head-line{display:none}

  /* A section: one glass panel, the workspaces' own. */
  #app .main :is(.avp-card,.avp-summary,.chart-wrap,.fit-panel,.prog-wrap){
    background:var(--gl-bg);border-color:transparent;border-radius:26px;
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.18);
  }
  #app .main :is(.avp-card,.prog-wrap):is(:hover,:focus-within){
    border-color:transparent;
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 22px 56px -14px rgba(40,80,160,0.26);
  }
  [data-theme="dark"] #app .main :is(.avp-card,.avp-summary,.chart-wrap,.fit-panel,.prog-wrap){
    box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 20px 60px -14px rgba(0,0,0,0.55);
  }
  [data-theme="dark"] #app .main :is(.avp-card,.prog-wrap):is(:hover,:focus-within){
    box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 24px 64px -14px rgba(0,0,0,0.62);
  }
  /* A section only needs its clip while it is folding or folded (it is
     transparent then anyway). At rest the clip cut the panel's shadow off
     in a straight line under it. */
  #app .main .sec-body:not([data-collapsed="1"]):not([style*="max-height"]){overflow:visible}
  /* What sits inside a panel is quieter glass, not the old blue tint. */
  #app .main :is(.avp-totals,.avp-btn.add){background:var(--gl-btn);border-color:var(--gl-hair)}
  #app .main .avp-lr-table th{background:var(--gl-hover)}
  #app .main .avp-totals strong{color:var(--gl-ink)}
  /* Run market fit analysis: a wide widget with its launch pill. */
  #app .main .analyze-wrap{
    background:var(--gl-bg);border-color:transparent;border-radius:26px;
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.22);
  }
  [data-theme="dark"] #app .main .analyze-wrap{
    box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 20px 60px -14px rgba(0,0,0,0.55);
  }
  #app .main .analyze-wrap .avp-btn.primary{border-radius:22px}
  /* Field names read as iOS form labels, not as eyebrows. */
  #app .main .avp-field>label{font-size:12px;font-weight:600;text-transform:none;letter-spacing:0;color:var(--gl-ink2)}
  /* The progress widget: the landing's gradient on a quiet groove. */
  #app .main .prog-bar{background:var(--gl-groove);border-radius:6px}
  #app .main .prog-fill{background:var(--gl-fill);border-radius:6px}
  /* The Yes/No pair sits in a groove, the way a segmented control does. */
  #app .main :is(.avp-toggle,.contact-toggle){background:var(--gl-groove);border-color:transparent}
  /* The one thing to do on a card is the blue of the launch arrows. */
  #app .main .avp-btn.primary{
    color:#ffffff;border-color:transparent;
    background:linear-gradient(150deg,#2f7ae0 0%,#5a5ce6 100%);
    box-shadow:inset 0 1px 0 rgba(255,255,255,0.35),0 6px 16px -4px rgba(47,122,224,0.45);
  }

  /* ── CRM HUB and Account info ── */
  :is(#general-tracker-screen,#marketing-crm-screen){--grp:var(--pal-blue)}
  /* CRM / Data: a segmented control — one groove, the chosen side a white
     thumb, instead of two separate pills with one filled navy. */
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-tabs{
    width:max-content;margin:0 auto 20px;gap:4px;padding:4px;border-radius:26px;
    background:var(--gl-bg);
    backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 0 0 1px var(--gl-hair),0 0 0 .5px var(--gl-edge),0 10px 30px -12px rgba(40,80,160,0.22);
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-tab{
    padding:10px 26px;border:0;border-radius:22px;background:transparent;color:var(--gl-ink2);box-shadow:none;
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-tab:hover{color:var(--gl-ink);background:var(--gl-hover)}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-tab.active{
    color:var(--gl-ink);background:var(--gl-active);box-shadow:var(--gl-active-shadow);
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-tab.active i{color:var(--gl-accent)}

  /* The counters: widgets. The name in the widget's colour, the figure big. */
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi-row{gap:14px;margin-bottom:18px}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi:nth-child(1){--grp:var(--pal-blue)}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi:nth-child(2){--grp:var(--pal-teal)}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi:nth-child(3){--grp:var(--pal-indigo)}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi:nth-child(4){--grp:var(--pal-amber)}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi:nth-child(5){--grp:var(--pal-green)}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi{
    position:relative;border:0;border-radius:24px;padding:16px 18px 15px;background:var(--gl-bg);
    backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 16px 40px -14px rgba(40,80,160,0.20);
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi-label{
    display:flex;align-items:center;gap:7px;font-size:12px;font-weight:600;text-transform:none;letter-spacing:0;
    color:color-mix(in srgb,var(--grp) 82%,var(--gl-ink));
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi-label::before{
    content:'';width:10px;height:10px;border-radius:3.5px;flex-shrink:0;
    background:linear-gradient(160deg,color-mix(in srgb,var(--grp) 70%,#ffffff) 0%,var(--grp) 100%);
    box-shadow:0 2px 6px color-mix(in srgb,var(--grp) 50%,transparent);
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi-val{font-size:30px;color:var(--gl-ink);margin:8px 0 2px}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi-note{font-size:11px;color:var(--gl-ink2)}
  [data-theme="dark"] :is(#general-tracker-screen,#marketing-crm-screen) .gt-kpi-label{color:color-mix(in srgb,var(--grp) 55%,#ffffff)}

  /* The filters: glass capsules; the search one wider. */
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-search,
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-filter-bar .dt-filter-select,
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-radial-trigger{
    border:0;background:var(--gl-btn);color:var(--gl-ink);
    /* One hairline and no lift: the account picker is the floating one
       (a real blur and a two-layer shadow), the filters lie flat. */
    box-shadow:inset 0 0 0 1px var(--gl-hair);
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-search{border-radius:20px;padding:8px 16px}
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-filter-bar .dt-filter-select{border-radius:20px}

  /* The table and the chart panels: the same glass panel as every group. */
  :is(#general-tracker-screen,#marketing-crm-screen) :is(.gt-table-wrap,.gt-panel,.gt-adv){
    border:0;border-radius:24px;background:var(--gl-bg);
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.18);
  }
  [data-theme="dark"] :is(#general-tracker-screen,#marketing-crm-screen) :is(.gt-kpi,.gt-table-wrap,.gt-panel,.gt-adv){
    box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 20px 60px -14px rgba(0,0,0,0.55);
  }
  :is(#general-tracker-screen,#marketing-crm-screen) .gt-panel-head>span:first-of-type{font-size:14px;color:var(--gl-ink)}
  /* Add record / Import Excel: the launch blue. */
  :is(#general-tracker-screen,#marketing-crm-screen) .wm-topbar .avp-btn.primary{
    color:#ffffff;border-color:transparent;
    background:linear-gradient(150deg,#2f7ae0 0%,#5a5ce6 100%);
    box-shadow:inset 0 1px 0 rgba(255,255,255,0.35),0 6px 16px -4px rgba(47,122,224,0.45);
  }
}

/* ── The Analyzer's page: a header, the form, and Market fit beside it ─────
   The layout of the NovaIS mock-up: an eyebrow and a page title with the
   form's four parts as a segmented control on the right, the form in the
   wide column, and Market fit in a narrow sticky column — the carriers and
   the button that checks them always in reach. The form's own markup and
   order are untouched: the header and the rail are .page's children beside
   <main>, placed by the grid. The rail only exists where there is room for
   it (1280px and up); below that the page is one column, as before, and the
   Analyze card at the end of the form is the way to run it. */
@media print{.wca-head,.wca-rail{display:none!important}}
@media screen{
  #app .wca-head{
    display:flex;align-items:flex-end;justify-content:space-between;gap:16px 24px;flex-wrap:wrap;
    padding:24px 1.5rem 4px;
  }
  #app .wca-eyebrow{font-size:12px;font-weight:600;color:var(--gl-accent)}
  #app .wca-title{font-size:34px;font-weight:700;letter-spacing:-.03em;line-height:1.1;color:var(--gl-ink);margin-top:4px}
  #app .wca-tabs{
    display:flex;gap:2px;padding:4px;border-radius:14px;background:var(--gl-bg);
    backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 0 0 1px var(--gl-hair),0 0 0 .5px var(--gl-edge),0 8px 24px -12px rgba(40,80,160,0.22);
  }
  #app .wca-tab{
    font:inherit;font-size:13px;font-weight:600;padding:8px 16px;border:0;border-radius:10px;cursor:pointer;
    background:transparent;color:var(--gl-ink2);
    transition:background .35s cubic-bezier(.22,1,.36,1),color .35s cubic-bezier(.22,1,.36,1),box-shadow .35s cubic-bezier(.22,1,.36,1),
      transform .14s cubic-bezier(.4,0,.2,1);
  }
  #app .wca-tab:hover{color:var(--gl-ink);background:var(--gl-hover)}
  #app .wca-tab.active{color:var(--gl-ink);background:var(--gl-active);box-shadow:var(--gl-active-shadow)}

  /* One column: the rail is a bar across the top holding only the tabs, stuck
     under the top bar so where you are is always on screen. */
  #app .wca-rail{position:sticky;top:72px;z-index:30;display:flex;justify-content:center;padding:10px 1.5rem 0}
  #app .wca-rail-card{display:none}
  #app .wca-rail [hidden]{display:none}
  @media (min-width:1280px){
    #app .page{
      max-width:var(--col-wide);display:grid;grid-template-columns:minmax(0,1fr) 344px;column-gap:0;
      align-items:start;padding-left:20px;padding-right:20px;box-sizing:border-box;
    }
    #app .page>*{grid-column:1 / -1}
    #app .page>.main{grid-column:1;min-width:0}
    /* Two columns: the tabs over Market fit, the pair stuck beside the form
       and never taller than the window — the carrier list is what gives, and
       scrolls inside the card, so the tabs and the button stay in view. */
    #app .page>.wca-rail{
      grid-column:2;grid-row:3;position:sticky;top:76px;z-index:auto;margin:16px 1.5rem 0 0;padding:0;
      display:flex;flex-direction:column;align-items:stretch;gap:14px;
      /* Short enough to fit where the rail starts, under the page title,
         before anything has scrolled — not only once it is stuck. */
      max-height:calc(100vh - 184px);
    }
    #app .page>.wca-rail .wca-tabs{flex-shrink:0}
    #app .page>.wca-rail .wca-tab{flex:1;padding:8px 4px;white-space:nowrap}
    #app .page>.wca-rail .wca-rail-card{display:flex;flex-direction:column;flex:0 1 auto;min-height:0}
    #app .page>.wca-rail .wca-rail-list{
      flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
      margin:0 -8px;padding:2px 8px 10px;scrollbar-width:thin;
      -webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 14px),transparent 100%);
              mask-image:linear-gradient(to bottom,#000 calc(100% - 14px),transparent 100%);
    }
    #app .page>.wca-rail :is(.wca-rail-title,.wca-rail-sub,.wca-rail-counts,.wca-rail-run,.wca-rail-more){flex-shrink:0}
  }
  #app .wca-rail-card{
    padding:20px;border-radius:26px;background:var(--gl-bg);
    backdrop-filter:blur(36px) saturate(185%);-webkit-backdrop-filter:blur(36px) saturate(185%);
    box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 18px 50px -14px rgba(40,80,160,0.22);
  }
  [data-theme="dark"] #app .wca-rail-card{
    box-shadow:inset 0 1px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),inset 0 0 0 1px var(--gl-hair),
      0 0 0 .5px var(--gl-edge),0 20px 60px -14px rgba(0,0,0,0.55);
  }
  #app .wca-rail-title{font-size:16px;font-weight:700;color:var(--gl-ink);letter-spacing:-.01em}
  #app .wca-rail-sub{font-size:12px;color:var(--gl-ink2);margin:4px 0 14px;line-height:1.4}
  #app .wca-rail-counts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0 0 12px}
  #app .wca-rail-count{
    display:flex;flex-direction:column;align-items:center;gap:1px;padding:8px 2px;border-radius:12px;
    font-size:11px;color:var(--gl-ink2);background:var(--gl-btn);box-shadow:inset 0 0 0 1px var(--gl-hair);
  }
  #app .wca-rail-count b{font-size:18px;font-weight:700;color:var(--gl-ink)}
  #app .wca-rail-list{display:flex;flex-direction:column;gap:8px}
  #app .wca-rail-row{
    display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px;border-radius:14px;
    background:var(--gl-btn);box-shadow:inset 0 0 0 1px var(--gl-hair);
  }
  #app .wca-rail-name{font-size:13px;font-weight:600;color:var(--gl-ink);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  #app .wca-rail-pill{flex-shrink:0;font-size:11px;font-weight:600;padding:3px 9px;border-radius:10px;color:var(--gl-ink2);background:var(--gl-hover)}
  #app .wca-rail-pill.fit,#app .wca-rail-count.fit b{color:#1f8a3f}
  #app .wca-rail-pill.review,#app .wca-rail-count.review b{color:#b36200}
  #app .wca-rail-pill.notfit,#app .wca-rail-count.notfit b{color:#c9352b}
  #app .wca-rail-pill.fit{background:rgba(52,199,89,0.16)}
  #app .wca-rail-pill.review{background:rgba(255,149,0,0.16)}
  #app .wca-rail-pill.notfit{background:rgba(255,59,48,0.13)}
  [data-theme="dark"] #app .wca-rail-pill.fit,[data-theme="dark"] #app .wca-rail-count.fit b{color:#5fe08a}
  [data-theme="dark"] #app .wca-rail-pill.review,[data-theme="dark"] #app .wca-rail-count.review b{color:#ffb547}
  [data-theme="dark"] #app .wca-rail-pill.notfit,[data-theme="dark"] #app .wca-rail-count.notfit b{color:#ff7a70}
  #app .wca-rail-rest{font-size:12px;color:var(--gl-ink2);padding:2px 4px}
  #app .wca-rail-run{
    width:100%;height:44px;margin-top:16px;border:0;border-radius:22px;cursor:pointer;
    display:flex;align-items:center;justify-content:center;gap:8px;
    font:inherit;font-size:14px;font-weight:600;color:#ffffff;
    background:linear-gradient(150deg,#2f7ae0 0%,#5a5ce6 100%);
    box-shadow:inset 0 1px 0 rgba(255,255,255,0.35),0 8px 20px -6px rgba(47,122,224,0.50);
    transition:transform .14s cubic-bezier(.4,0,.2,1),box-shadow .35s cubic-bezier(.22,1,.36,1);
  }
  #app .wca-rail-run:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,0.35),0 12px 26px -6px rgba(47,122,224,0.60)}
  #app .wca-rail-run:active{transform:scale(.97)}
  #app .wca-rail-more{
    width:100%;margin-top:6px;padding:8px;border:0;background:transparent;cursor:pointer;
    font:inherit;font-size:12px;font-weight:600;color:var(--gl-accent);
  }
  @media(max-width:640px){
    #app .wca-head{padding:16px 1.25rem 0}
    #app .wca-title{font-size:28px}
    #app .wca-tabs{width:100%}
    #app .wca-tab{flex:1;padding:8px 6px}
  }
  body.readonly-mode #app .wca-rail-run{display:none}
}

/* ── The top bar on a phone ────────────────────────────────────────────────
   Below 640px the bar had grown three ways at once: the Analyzer's clipped
   everything right of Voice, the shared bar's action groups were held to
   half the bar by the laptop rule (calc(50% - 56px)) so each one wrapped its
   own buttons into a column, and the Calendar's reached 345px tall with its
   month buttons stacked one above the other.

   One layout for every bar instead, in rows:
     1. Home (or the way back), the screen's name — which truncates — and
        the avatar at the right edge;
     2. the clock on the left, and the shared menus (plus, in the Analyzer,
        Voice, the theme switch and Install) on the right, as icons;
     3. only where a screen has its own actions (Add record, the Calendar's
        month, Import Excel…), those, on a line of their own.
   The shared cluster (#global-actions) and the Analyzer's badge group are
   display:contents here so their buttons can take a row each belongs on;
   the elements themselves stay where the screens move them. */
@media screen and (max-width:640px){
  :is(.wm-topbar,#app .topbar){
    flex-wrap:wrap;align-items:center;column-gap:8px;row-gap:10px;height:auto;min-height:0;
    padding-top:10px;padding-right:10px;padding-bottom:10px;justify-content:flex-start;
  }
  /* !important because #global-actions carries display:flex inline. */
  :is(.wm-topbar,#app .topbar) #global-actions,
  #app .topbar .tbar-badges{display:contents!important}

  /* Row 1 */
  .wm-topbar > .wm-back{order:1;flex:0 0 auto}
  .wm-topbar > .wm-topbar-title{order:2;flex:1 1 calc(100% - 180px);min-width:0;font-size:14px}
  #app .topbar > .tbar-logo{order:1;flex:1 1 calc(100% - 60px);min-width:0}
  :is(.wm-topbar,#app .topbar) #tbar-user-badge{order:3;margin-left:auto;flex:0 0 auto}

  /* Row 2 — the clock is laid in the row rather than centred on the bar. */
  :is(.wm-topbar,#app .topbar) > #tbar-clock{
    order:5;position:static!important;left:auto!important;top:auto!important;transform:none;
    margin:0;flex:0 0 auto;padding:6px 12px;
  }
  /* The Analyzer's second row carries three more controls than the other
     bars' (Voice, the theme switch, Install), so it gives up the clock's
     icon — the time stays — and a little spacing to keep them on one row. */
  #app .topbar{column-gap:5px}
  #app .topbar > #tbar-clock > .ti{display:none}
  #app .topbar #voice-btn{order:6;margin-left:auto;padding:0 10px;min-height:34px;gap:0}
  #app .topbar #theme-btn{order:7}
  #app .topbar #pwa-install-btn{order:8}
  :is(.wm-topbar,#app .topbar) #global-actions > div:not(#tbar-user-badge){order:9;flex:0 0 auto}
  .wm-topbar #global-actions > div:not(#tbar-user-badge):first-child{margin-left:auto}
  /* Icons only: the labels were what could not fit. */
  #app .topbar .voice-btn-txt,
  :is(.wm-topbar,#app .topbar) .wpb-caret{display:none}
  /* !important: the button's size and gap are inline. */
  #app .topbar #pwa-install-btn{font-size:0!important;gap:0!important;padding:0 10px!important;min-height:34px}
  #app .topbar #pwa-install-btn .ti{font-size:14px}

  /* Row 3 — a screen's own actions, and its status line, each a full row.
     The laptop rule's half-bar cap is what folded these into a column. */
  .wm-topbar > div:not(#global-actions),
  .wm-topbar > span:not(.wm-topbar-title){
    order:12;flex:1 0 100%;max-width:none!important;margin-left:0!important;min-width:0;
  }
  .wm-topbar > div:not(#global-actions){display:flex;flex-wrap:wrap;align-items:center;gap:8px}
  .wm-topbar > div:not(#global-actions) .avp-btn{white-space:nowrap;min-height:34px}
  .wm-topbar > span:not(.wm-topbar-title){font-size:11px;margin-top:-4px}

  /* The Analyzer's tab bar sticks under a bar that is two rows tall here. */
  #app .wca-rail{top:118px}
}
/* Where the tab bar floats over the form (one column), the form scrolls
   under it, so it is filled in rather than left as thin glass: the text
   passing beneath must not read through the tab names. Beside the form
   (1280px and up) there is nothing behind it and it keeps the light glass. */
@media screen and (max-width:1279px){
  #app .wca-rail .wca-tabs{background:rgba(255,255,255,0.82)}
  [data-theme="dark"] #app .wca-rail .wca-tabs{background:rgba(14,22,48,0.86)}
}

/* The Analyzer's widget icon. The Nova mark is a glass letter and its glow,
   cut from a black field, and on the group-blue squircle every other widget
   icon uses it all but vanished — in the dark theme entirely. It sits on
   the deep navy it was drawn for instead, the one icon on these screens that
   is the product rather than a tool, lit a little and glowing steadily: an
   animated filter under the card's backdrop-filter is what painted faint
   squares on the top bar's mark. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-icon:has(.nv-mark){
  background:
    radial-gradient(120% 90% at 30% 0%,rgba(125,185,255,0.38) 0%,rgba(125,185,255,0) 60%),
    linear-gradient(160deg,#1b3a7c 0%,#0b1733 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.30),0 0 0 .5px rgba(10,30,60,0.35),
    0 8px 20px -6px rgba(30,80,200,0.55);
}
[data-theme="dark"] :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-icon:has(.nv-mark){
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.26),0 0 0 1px rgba(125,185,255,0.40),
    0 8px 24px -6px rgba(60,130,255,0.55);
}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-main-icon .nv-mark img{
  animation:none;filter:brightness(1.3) drop-shadow(0 0 6px rgba(125,185,255,0.80));
}
/* NovaStudio: hidden tables, folded under their own heading in the list. */
.ns-hidden-tables{margin-top:6px}
.ns-hidden-tables > summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;color:var(--text3);padding:6px 4px;user-select:none}
.ns-hidden-tables > summary::-webkit-details-marker{display:none}
.ns-table-chip-hidden{opacity:.72}

/* Calendar: the one-line note a reviewer without the admin key sees. */
.cal-key-note{align-items:center;gap:10px;margin:0 0 14px;padding:10px 14px;border-radius:16px;
  font-size:12px;color:var(--gl-ink2,var(--text2));background:var(--gl-btn,var(--glass3));
  box-shadow:inset 0 0 0 1px var(--gl-hair,var(--border))}
.cal-key-note>span{flex:1;min-width:0}
.cal-key-note>.ti{font-size:14px;color:var(--gl-accent,var(--accent));flex-shrink:0}
.cal-key-note .avp-btn{font-size:12px;white-space:nowrap}

/* ── Carriers: cards or tables ─────────────────────────────────────────── */
.car-viewbar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:4px 0 14px}
.car-viewbar .car-count{margin:0}
.car-seg{display:inline-flex;gap:2px;padding:3px;border-radius:12px;background:var(--gl-bg,var(--glass3));
  box-shadow:inset 0 1px 0 var(--gl-lip,transparent),inset 0 0 0 1px var(--gl-hair,var(--border))}
.car-seg-btn{display:inline-flex;align-items:center;gap:6px;font:inherit;font-size:12px;font-weight:600;
  padding:6px 12px;border:0;border-radius:9px;background:transparent;color:var(--gl-ink2,var(--text2));cursor:pointer;
  transition:background .3s cubic-bezier(.22,1,.36,1),color .3s cubic-bezier(.22,1,.36,1),transform .14s cubic-bezier(.4,0,.2,1)}
.car-seg-btn:hover{color:var(--gl-ink,var(--text));background:var(--gl-hover,rgba(0,0,0,.04))}
.car-seg-btn.active{color:var(--gl-ink,var(--text));background:var(--gl-active,var(--glass-card));box-shadow:var(--gl-active-shadow,none)}
.car-pivots{margin-bottom:12px;flex-wrap:wrap}
.car-pivot-summary{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12px;color:var(--gl-ink2,var(--text2));margin:0 2px 10px}
.car-pivot-summary b{color:var(--gl-ink,var(--text));font-weight:700}
.car-pivot-scroll{overflow:auto;max-height:70vh;border-radius:20px;background:var(--gl-bg,var(--glass-card));
  box-shadow:inset 0 1.5px 0 var(--gl-lip,transparent),inset 0 0 0 1px var(--gl-hair,var(--border)),
    0 0 0 .5px var(--gl-edge,transparent),0 16px 44px -14px rgba(40,80,160,0.18)}
.car-pivot{border-collapse:separate;border-spacing:0;font-size:12px;color:var(--gl-ink,var(--text));min-width:100%}
.car-pivot th,.car-pivot td{padding:7px 9px;text-align:center;white-space:nowrap;border-bottom:1px solid var(--gl-hair,var(--border))}
.car-pivot thead th{position:sticky;top:0;z-index:2;font-size:11px;font-weight:700;color:var(--gl-ink2,var(--text2));
  background:var(--gl-ground-solid,var(--bg));}
.car-pivot thead tr.cpv-total td,.car-pivot thead tr.cpv-total th{position:sticky;top:31px;z-index:2;font-weight:700;font-size:11px;
  color:var(--gl-accent,var(--accent));background:var(--gl-ground-solid,var(--bg))}
.car-pivot .cpv-name,.car-pivot .cpv-corner{position:sticky;left:0;z-index:1;text-align:left;font-weight:600;
  background:var(--gl-ground-solid,var(--bg));min-width:150px}
.car-pivot thead .cpv-corner{z-index:3}
.car-pivot tbody tr:hover td,.car-pivot tbody tr:hover th{background:color-mix(in srgb,var(--gl-accent,#4b7dff) 7%,var(--gl-ground-solid,var(--bg)))}
.car-pivot .cpv-st button{font:inherit;font-size:11px;font-weight:700;color:inherit;background:none;border:0;cursor:pointer;padding:2px 4px;border-radius:6px}
.car-pivot .cpv-st button:hover{color:var(--gl-accent,var(--accent))}
.car-pivot th.on,.car-pivot td.on{background:color-mix(in srgb,var(--gl-accent,#4b7dff) 12%,var(--gl-ground-solid,var(--bg)))}
.car-pivot .cpv-num{text-align:right;font-variant-numeric:tabular-nums}
.car-pivot .cpv-ans{text-align:left}
.car-pivot .cpv-wide{text-align:left;white-space:normal;min-width:260px;max-width:520px;color:var(--gl-ink2,var(--text2))}
.car-pivot .cpv-band{min-width:74px}
.cpv{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:6px;vertical-align:middle}
.car-pivot .cpv-ans .cpv{margin-right:6px}
.cpv .ti{font-size:12px}
.cpv-yes{color:#1f8a3f;background:rgba(52,199,89,0.16)}
.cpv-no{color:var(--gl-ink2,var(--text3));background:var(--gl-hover,rgba(0,0,0,.05));opacity:.7}
.cpv-mid{color:#b36200;background:rgba(255,149,0,0.16)}
[data-theme="dark"] .cpv-yes{color:#5fe08a}
[data-theme="dark"] .cpv-mid{color:#ffb547}
:root{--gl-ground-solid:#eef3fc}
[data-theme="dark"]{--gl-ground-solid:#0b1226}

/* ── Class code rates: rates in force ─────────────────────────────────── */
#ccr-card{max-width:980px}
.ccr-tabs{margin:0 0 14px}
.ccr-tab-count{display:inline-flex;min-width:16px;justify-content:center;padding:0 5px;border-radius:8px;font-size:11px;
  background:var(--gl-accent,var(--accent));color:#fff}
.ccr-tab-count:empty{display:none}
.ccr-browse-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.ccr-browse-bar .eml-select{flex:0 0 90px;margin:0;padding:7px 10px;font-size:12px}
.ccr-browse-bar .eml-input{flex:1 1 220px;min-width:0;margin:0;padding:7px 10px;font-size:12px}
.ccr-browse-bar .avp-btn{font-size:12px;white-space:nowrap}
.ccr-import-btn{cursor:pointer}
.ccr-browse-note{font-size:11px;color:var(--text3);margin:0 2px 8px;min-height:14px}
.ccr-browse-scroll{max-height:48vh;overflow:auto;border-radius:14px;box-shadow:inset 0 0 0 1px var(--gl-hair,var(--border))}
.ccr-browse{width:100%;border-collapse:separate;border-spacing:0;font-size:12px;color:var(--text)}
.ccr-browse th,.ccr-browse td{padding:6px 10px;text-align:left;border-bottom:1px solid var(--gl-hair,var(--border));vertical-align:middle}
.ccr-browse thead th{position:sticky;top:0;z-index:1;font-size:11px;font-weight:700;color:var(--text2);background:var(--gl-ground-solid,var(--bg))}
.ccr-browse .ccr-b-code{font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.ccr-browse .ccr-b-desc{color:var(--text2);min-width:260px}
.ccr-browse .ccr-b-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.ccr-browse .ccr-b-rate{width:92px;margin:0;padding:5px 8px;font-size:12px;text-align:right;font-variant-numeric:tabular-nums}
.ccr-browse .ccr-b-rate.ccr-b-bad{box-shadow:0 0 0 1.5px var(--danger)}
.ccr-badge{display:inline-flex;padding:2px 8px;border-radius:8px;font-size:11px;font-weight:600;white-space:nowrap;
  color:var(--text3);background:var(--gl-hover,rgba(0,0,0,.05))}
.ccr-badge-changed{color:#1f5fbf;background:rgba(75,125,255,0.14)}
.ccr-badge-new{color:#b36200;background:rgba(255,149,0,0.16)}
[data-theme="dark"] .ccr-badge-changed{color:#8cb8ff}
[data-theme="dark"] .ccr-badge-new{color:#ffb547}

/* ── Access & maintenance: finer sections and blocking people ───────────── */
.maint-sub-title{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text3);margin:10px 0 6px}
#maint-section-grid .maint-sub-title:first-child,#mb-sections .maint-sub-title:first-child{margin-top:0}
.mb-card{margin-top:14px}
.mb-cols{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:16px;margin-top:8px}
.mb-col{min-width:0;display:flex;flex-direction:column;gap:6px}
.mb-search{position:relative}
.mb-search > i{position:absolute;left:10px;top:50%;transform:translateY(-50%);font-size:13px;color:var(--text3);pointer-events:none}
.mb-search .eml-input{box-sizing:border-box;width:100%;padding-left:30px}
.mb-roster{max-height:260px;overflow-y:auto;overscroll-behavior:contain;border:0.5px solid var(--border);border-radius:var(--r-sm);background:var(--glass3)}
.mb-person{display:flex;align-items:center;gap:10px;padding:8px 10px;cursor:pointer;border-bottom:0.5px solid var(--border)}
.mb-person:last-child{border-bottom:0}
.mb-person:hover{background:var(--glass-card)}
.mb-person input{accent-color:var(--danger);margin:0;cursor:pointer;flex:none}
.mb-person.is-admin{cursor:default;opacity:.6}
.mb-person-name{flex:1;min-width:0;font-size:12px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mb-person-name small{display:block;font-size:10px;font-weight:400;color:var(--text3);overflow:hidden;text-overflow:ellipsis}
.mb-person-role{flex:none;font-size:10px;color:var(--text3);text-align:right;max-width:40%}
.mb-person-role b{color:var(--danger);font-weight:700}
.mb-roster-foot{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--text3)}
.mb-roster-foot > span{flex:1}
.mb-link{background:none;border:0;padding:2px 0;cursor:pointer;font-family:inherit;font-size:11px;font-weight:600;color:var(--accent);transition:color var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out)}
.mb-link:hover{color:var(--text)}
.mb-sections{margin-top:6px;max-height:230px;overflow-y:auto;overscroll-behavior:contain;padding-right:2px}
.mb-sections.disabled{opacity:.45;pointer-events:none}
.mb-sections .maint-pick-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}
.mb-count{display:inline-block;min-width:18px;padding:1px 6px;margin-left:4px;border-radius:999px;font-size:10px;text-align:center;color:var(--danger);background:var(--danger-soft);border:0.5px solid var(--danger-border)}
.mb-list{display:flex;flex-direction:column;gap:6px}
.mb-row{display:flex;align-items:center;gap:12px;padding:9px 12px;border-radius:var(--r-sm);background:var(--glass3);border:0.5px solid var(--border)}
.mb-row-who{flex:0 0 32%;min-width:0;font-size:12px;color:var(--text)}
.mb-row-who small,.mb-row-what small{display:block;font-size:10px;color:var(--text3);overflow:hidden;text-overflow:ellipsis}
.mb-row-what{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.mb-chip{align-self:flex-start;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;color:var(--warn);background:var(--warn-soft);border:0.5px solid var(--warn-border)}
.mb-chip.full{color:var(--danger);background:var(--danger-soft);border-color:var(--danger-border)}
.mb-unblock{flex:none;padding:7px 12px;font-size:12px}
.mb-unblock-all{align-self:flex-end;margin-top:4px}
.mb-empty{padding:12px;font-size:12px;color:var(--text3);text-align:center}
@media(max-width:720px){
  .mb-cols{grid-template-columns:1fr}
  .mb-row{flex-wrap:wrap}
  .mb-row-who{flex-basis:100%}
}

/* ── Admin → Emails: the style every email is written in ──────────────── */
.dem-style{margin:0 0 14px;padding:12px 14px;border-radius:var(--r-sm);background:var(--glass3);border:0.5px solid var(--border)}
.dem-style-head{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;color:var(--text3);letter-spacing:.04em;margin-bottom:10px}
.dem-style-head > i{font-size:13px;color:var(--accent)}
#dem-style-when{margin-left:auto;font-weight:400;letter-spacing:0}
.dem-style-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px}
.dem-style-actions{margin-top:10px}
.dem-style-f,.dem-style-c{display:flex;flex-direction:column;gap:4px;font-size:10px;font-weight:600;color:var(--text3)}
.dem-style-f{flex:1 1 200px;min-width:0}
.dem-style-f.dem-style-s{flex:0 0 96px}
.dem-style-f .eml-select{width:100%}
.dem-style-c input{width:54px;height:34px;padding:2px;border-radius:8px;border:0.5px solid var(--border2);background:var(--input-bg);cursor:pointer}
#dem-preview{white-space:normal;padding:16px;font-family:inherit}
.dem-mail{max-width:520px;margin:0 auto;background:#fff;border-radius:12px;border:1px solid rgba(30,30,26,.12);overflow:hidden}
.dem-mail-head{padding:12px 18px;color:#fff;font-size:13px;font-weight:700}
.dem-mail-body{padding:16px 18px 6px}
.dem-mail-title{font-weight:600;color:#111110;margin-bottom:10px}

/* ── One screen, no scrolling: the landing and the three workspaces ──────
   On a laptop the lobby ran 180–360px past the bottom of the window and
   UWing Assistance nearly 600, so every visit started with a scroll to reach
   the cards people came for. The rules below only tighten what is already
   there — same cards, same order, same groups — by viewport HEIGHT, so a
   tall monitor keeps the roomy layout and a 768px laptop gets the compact
   one. Phones (under 761px wide) keep their own stacked layout. */

/* Workspaces: each group is a <section class="desk-group"> (title + panel),
   so groups can sit side by side. Stacked, they keep the old spacing. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group{min-width:0}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group+.desk-group{margin-top:24px}
#marketing-workspace-screen{box-sizing:border-box;padding-bottom:24px}

/* Wide enough for two columns: the six UWing groups become three rows of
   two (Analyze|Track, Document|Coordinate, Administer|Breaks) and Account
   Management's four become two rows. Reading order and the order in the
   DOM are unchanged — left to right, then down — and Breaks is still last. */
@media (min-width:1100px){
  :is(#sales-admin-screen,#submission-screen) .desk-inner{
    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:22px;row-gap:16px;align-items:stretch;
  }
  :is(#sales-admin-screen,#submission-screen) .desk-group{display:flex;flex-direction:column;margin:0}
  :is(#sales-admin-screen,#submission-screen) .desk-group+.desk-group{margin-top:0}
  :is(#sales-admin-screen,#submission-screen) .desk-group>.desk-grid{flex:1 1 auto}
  :is(#sales-admin-screen,#submission-screen) .desk-group-title,
  :is(#sales-admin-screen,#submission-screen) .desk-group-title:first-of-type{margin:2px 6px 10px}
  :is(#sales-admin-screen,#submission-screen) .desk-grid.desk-row{
    grid-template-columns:repeat(auto-fill,minmax(108px,1fr));align-content:center;gap:12px 8px;padding:18px 14px 14px;
  }
  /* The two hero widgets share a row, so each is half as wide: the note
     keeps to two lines and the launch pill gets narrower. */
  :is(#sales-admin-screen,#submission-screen) .desk-grid:not(.desk-row)>.desk-main{
    grid-template-columns:auto minmax(0,1fr) auto;column-gap:16px;height:100%;box-sizing:border-box;
  }
  /* Padding on all three screens, so Marketing's hero keeps computing
     exactly like CRM HUB's (the lobby checks compare the two). */
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main{padding:18px 20px}
  :is(#sales-admin-screen,#submission-screen) .desk-grid:not(.desk-row)>.desk-main .desk-main-title{
    font-size:18px;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  :is(#sales-admin-screen,#submission-screen) .desk-grid:not(.desk-row)>.desk-main .desk-launch-btn{padding-left:16px;gap:10px}
  :is(#sales-admin-screen,#submission-screen) .desk-grid:not(.desk-row)>.desk-main .desk-main-sub{
    display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;margin-top:2px;
  }
  :is(#sales-admin-screen,#submission-screen) .desk-grid:not(.desk-row){height:100%}
}

/* Laptop heights: smaller icons and tighter gaps, nothing hidden. */
@media (min-width:761px) and (max-height:920px){
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .wm-topbar{margin-bottom:18px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group-title{font-size:18px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini{height:124px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini .tile,
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini .cal-tile{width:56px;height:56px;border-radius:17px;margin-bottom:7px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini .tile i{font-size:26px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini .cal-tile .cal-tile-day{font-size:20px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) :is(.desk-main-icon,.desk-main-icon-is){width:46px;height:46px;border-radius:14px}
}
@media (min-width:761px) and (max-height:780px){
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .wm-topbar{margin-bottom:12px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group-title,
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-group-title:first-of-type{margin-top:0;margin-bottom:8px}
  :is(#sales-admin-screen,#submission-screen) .desk-inner{row-gap:10px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini{height:104px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini .tile,
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini .cal-tile{width:50px;height:50px;border-radius:15px;margin-bottom:6px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini .tile i{font-size:24px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-mini-sub{-webkit-line-clamp:1}
  :is(#sales-admin-screen,#submission-screen) .desk-grid.desk-row{padding:12px 12px 10px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-grid:not(.desk-row)>.desk-main{padding:14px 18px}
  :is(#sales-admin-screen,#submission-screen) .desk-grid:not(.desk-row)>.desk-main .desk-launch-btn{height:40px}
}

/* The landing, at laptop heights: the greeting and the map shrink with the
   window, the cards lose their empty middle row, and the whole lobby —
   greeting, clocks and every workspace card — sits in one screen. */
@media (min-width:761px) and (max-height:1000px){
  #landing{padding-top:calc(60px + env(safe-area-inset-top));padding-bottom:20px}
  #landing .nova-theme{top:-48px}
  #landing .nova-hero{margin-bottom:22px;gap:32px}
  #landing .nova-hero-text{gap:12px}
  #landing .nova-hello-1{font-size:clamp(26px,4vh,40px)}
  #landing .nova-hello-2{font-size:clamp(56px,9.5vh,100px)}
  #landing .nova-tzmap{flex-basis:clamp(330px,44vh,480px);width:clamp(330px,44vh,480px);padding:14px 16px 12px}
  #landing .nova-section-title{font-size:clamp(24px,3.6vh,36px);margin-bottom:14px}
  #landing .lobby-grid{gap:16px}
  #landing .lobby-grid>.lobby-card{--gap:16px;height:clamp(140px,17vh,172px)}
  #landing .lobby-card{padding:20px 22px;grid-template-rows:auto 1fr auto auto auto;row-gap:0}
  #landing .lobby-card-icon{width:46px;height:46px;border-radius:14px}
  #landing .lobby-card-title{margin-top:10px}
  #landing .lobby-card-icon i{font-size:22px!important}
  #landing .lobby-card-title{font-size:22px;margin-bottom:4px}
  #landing .lobby-card-sub{font-size:13px}
  #landing .nova-card-go{margin-top:6px;font-size:14px}
  #landing .nova-card-go i{font-size:14px}
}
@media (min-width:761px) and (max-height:780px){
  #landing{padding-top:calc(52px + env(safe-area-inset-top));padding-bottom:14px}
  #landing .nova-theme{top:-44px}
  #landing .nova-hero{margin-bottom:14px}
  #landing .nova-section-title{margin-bottom:10px}
  #landing .lobby-grid{gap:12px}
  #landing .lobby-grid>.lobby-card{--gap:12px;height:132px}
  #landing .lobby-card{padding:16px 20px}
  #landing .lobby-card-icon{width:40px;height:40px;border-radius:12px}
  #landing .lobby-card-title{margin-top:6px}
  #landing .lobby-card-icon i{font-size:20px!important}
  #landing .lobby-card-title{font-size:20px}
  #landing .lobby-card-sub{-webkit-line-clamp:1;min-height:0}
}
/* The bar's top margin collapsed through the screen (min-height:100vh) and
   added its own height below the fold — a scroll bar for 14px of nothing.
   One pixel of padding is enough to stop the collapse, and the bar keeps
   the same offset it has on every other screen. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen){box-sizing:border-box;padding-top:1px}

/* ── Workspaces as a watch home screen (32-app-launcher.js) ──────────────
   The groups stay in the page for every rule that reads them, but are not
   drawn; the launcher shows the same tools. Favourites: the most used in
   the centre and five around it, placed on a circle with cos()/sin() so
   the geometry is one radius and six angles. All apps: a honeycomb. */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-inner.wl-on{display:block}
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .desk-inner.wl-on>.desk-group{display:none}

/* Short windows — a laptop with the browser's own bars, or Windows at 125%
   or 150%, leaves 600–700px. The lobby still fits: everything scales with
   the window height rather than stopping at a floor. */
@media (min-width:761px) and (max-height:700px){
  #landing{padding-top:calc(46px + env(safe-area-inset-top));padding-bottom:10px}
  #landing .nova-theme{top:-40px}
  #landing .nova-hero{margin-bottom:10px}
  #landing .nova-hero-text{gap:8px}
  #landing .nova-eyebrow{font-size:16px}
  #landing .nova-hello-1{font-size:clamp(22px,4vh,28px)}
  #landing .nova-hello-2{font-size:clamp(44px,9vh,64px)}
  #landing .nova-tzmap{flex-basis:330px;width:330px;padding:10px 12px 8px}
  #landing .nova-section-title{font-size:24px;margin-bottom:8px}
  #landing .lobby-grid{gap:10px}
  #landing .lobby-grid>.lobby-card{--gap:10px;height:clamp(118px,18vh,124px)}
  #landing .lobby-card{padding:14px 18px}
  #landing .lobby-card-icon{width:36px;height:36px;border-radius:11px}
  #landing .lobby-card-icon i{font-size:18px!important}
  #landing .lobby-card-title{font-size:18px;margin-top:4px;margin-bottom:2px}
  #landing .lobby-card-badge{font-size:11px;padding:3px 9px}
  #landing .nova-card-go{margin-top:2px}
}
@media (min-width:761px) and (max-height:620px){
  #landing .nova-hello-1{display:none}
  #landing .lobby-card-sub{display:none}
  #landing .lobby-grid>.lobby-card{height:116px}
}
/* The dial shrinks with the window too; below this it would crowd its own
   labels, so the bar above it gets tighter first. */

/* Team clocks: the chips scale with the map. They were a fixed size while
   the map shrinks with the window, so on a laptop the Pacific and Central
   clocks slid over each other. Each chip now scales about its own pin
   (transform-origin 0 0 is the pin: left/top put it there), in steps that
   follow the map's width — the same spacing they have on a wide screen,
   where none of them touch. transform rather than font-size, so the text
   keeps the app's own sizes and is simply drawn smaller. */
#landing .tz-map{container-type:inline-size}
#landing .tz-chip{transform-origin:0 0;transform:scale(var(--cz,1)) translate(-50%,calc(-100% - 14px))}
#landing .tz-chip.tz-below{transform:scale(var(--cz,1)) translate(-50%,14px)}
#landing .tz-chip.tz-below.tz-west{transform:scale(var(--cz,1)) translate(-30%,14px)}
#landing .tz-chip.tz-co{transform:scale(var(--cz,1)) translate(-70%,calc(-100% - 12px))}
@container (max-width:420px){#landing .tz-chip{--cz:.93}}
@container (max-width:390px){#landing .tz-chip{--cz:.86}}
@container (max-width:355px){#landing .tz-chip{--cz:.78}}
@container (max-width:320px){#landing .tz-chip{--cz:.68}}
@container (max-width:290px){#landing .tz-chip{--cz:.62}}

/* ── Team clocks, legible ─────────────────────────────────────────────────
   Two complaints, both fair: the country did not read as a country, and the
   clocks crowded it. The clocks are smaller and sit closer to their pins;
   in dark mode the card goes deep navy behind the map, the zones take
   lighter, clearly different blues, and the coast gets a bright edge, so
   the outline of the US is the first thing you see. */
#landing .tz-chip{padding:4px 8px 5px;border-radius:11px}
#landing .tz-chip-row{gap:5px}
#landing .tz-code{font-size:10px}
#landing .tz-time{font-size:16px}
#landing .tz-city{font-size:10px}
#landing .tz-chip svg{width:12px;height:12px}
#landing .tz-chip{transform:scale(var(--cz,1)) translate(-50%,calc(-100% - 10px))}
#landing .tz-chip.tz-below{transform:scale(var(--cz,1)) translate(-50%,10px)}
#landing .tz-chip.tz-below.tz-west{transform:scale(var(--cz,1)) translate(-24%,10px)}
#landing .tz-chip.tz-co{transform:scale(var(--cz,1)) translate(-72%,calc(-100% - 9px))}
[data-theme="dark"] #landing{
  --tz-p1:#3a8ee0;--tz-p2:#2466b4;--tz-m1:#5a6fe6;--tz-m2:#3a4cc0;
  --tz-c1:#23a9c8;--tz-c2:#16809c;--tz-e1:#8a6cf0;--tz-e2:#6048c8;
  --tz-edge:rgba(225,240,255,0.95);--tz-edge-w:2.2;--tz-inner:rgba(225,240,255,0.30);
  --tz-night-o:0.30;--tz-label:rgba(225,238,255,0.55);--tz-shadow:rgba(0,0,0,0.65);
}
[data-theme="dark"] #landing .nova-tzmap{
  background:radial-gradient(120% 90% at 30% 0%,rgba(90,140,255,0.16) 0%,rgba(90,140,255,0) 60%),
    linear-gradient(160deg,rgba(12,22,50,0.92) 0%,rgba(6,12,30,0.94) 100%);
}

/* ── Team clocks, opened up (02-clock.js) ─────────────────────────────────
   A click zooms the map out of its card; a glass panel beside it carries the
   zone's live time, its offset and a few curious facts. While it is open the
   landing is lifted over the sidebar so the scrim covers the whole window. */
#landing .nova-tzmap{cursor:zoom-in;outline:none}
#landing .nova-tzmap:focus-visible{box-shadow:inset 0 1.5px 0 var(--lg-lip),0 0 0 3px var(--nova-accent),0 26px 56px -18px var(--lg-drop)}
#landing .tz-head{gap:10px}
#landing .tz-legend{margin-left:auto}
#landing .tz-expand{
  display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;
  font-size:14px;color:var(--nova-ink2);background:var(--tz-chip);
  transition:transform .35s cubic-bezier(.34,1.56,.64,1),color .2s ease;
}
#landing .nova-tzmap:hover .tz-expand{transform:scale(1.15);color:var(--nova-accent)}
#landing.tzx-on{z-index:10000}
#landing .tzx-slot{flex-shrink:0}
#landing .nova-tzmap.tzx-open{
  position:fixed;z-index:41;margin:0;max-width:none;flex:none;cursor:default;
  padding:22px 26px 20px;will-change:transform;
}
#landing .tzx-open .tz-expand{opacity:0}
/* The clocks keep their size while the map grows under them, so they sit
   out the flight and pop back in once it lands. */
#landing .tzx-open .tz-chip{animation:tzxChip .55s cubic-bezier(.34,1.56,.64,1) .5s backwards;cursor:pointer}
@keyframes tzxChip{from{opacity:0;translate:0 8px}}
#landing .tzx-closing .tz-chip{opacity:0;transition:opacity .12s ease}
#landing .tz-seen .tz-chip{animation:none;transition:opacity .3s ease}
@container (min-width:600px){#landing .tzx-open .tz-chip{--cz:1.2}}
@container (min-width:800px){#landing .tzx-open .tz-chip{--cz:1.4}}
/* The zone being read stays lit; the others step back. */
#landing .tz-zone{transition:opacity .4s ease}
#landing .tzx-open .tz-zone{cursor:pointer}
#landing .tzx-open .tz-map[data-sel] .tz-zone{opacity:.32}
#landing .tzx-open .tz-map[data-sel] .tz-zone:hover{opacity:.62}
#landing .tzx-open .tz-map[data-sel="P"] .tz-zone-P,#landing .tzx-open .tz-map[data-sel="M"] .tz-zone-M,
#landing .tzx-open .tz-map[data-sel="C"] .tz-zone-C,#landing .tzx-open .tz-map[data-sel="E"] .tz-zone-E{opacity:1}
#landing .tzx-open .tz-map[data-sel] .tz-chip{opacity:.55;transition:opacity .3s ease}
#landing .tzx-open .tz-map[data-sel] .tz-chip.is-sel{opacity:1;box-shadow:var(--tz-chip-shadow),0 0 0 2px var(--nova-accent)}
#landing .tzx-open .tz-map[data-sel] .tz-chip.tz-co.is-sel{box-shadow:var(--tz-chip-shadow),0 0 0 2.5px var(--tz-co)}
#landing .tzx-open .tz-map[data-sel]:not([data-sel="CO"]) .tz-arc{opacity:.35}

#landing .tzx-scrim{
  position:fixed;inset:0;z-index:40;background:rgba(8,16,36,0.34);
  backdrop-filter:blur(10px) saturate(130%);-webkit-backdrop-filter:blur(10px) saturate(130%);
  opacity:0;transition:opacity .45s ease;cursor:zoom-out;
}
#landing .tzx-scrim.in{opacity:1}
#landing .tzx-panel{
  position:fixed;z-index:42;box-sizing:border-box;display:flex;flex-direction:column;gap:14px;
  padding:18px 20px 20px;border-radius:28px;overflow:auto;color:var(--nova-ink);
  background:linear-gradient(155deg,var(--lg-hi) 0%,var(--lg-tint) 45%,var(--lg-lo) 100%);
  backdrop-filter:blur(30px) saturate(200%) brightness(var(--lg-bright));
  -webkit-backdrop-filter:blur(30px) saturate(200%) brightness(var(--lg-bright));
  box-shadow:inset 0 1.5px 0 var(--lg-lip),inset 0 -1.5px 1px var(--lg-underlip),
    inset 0 0 0 1px var(--lg-rim),0 0 0 .5px var(--lg-edge),
    0 26px 56px -18px var(--lg-drop),0 8px 18px -8px var(--lg-drop2);
  opacity:0;transform:translate3d(24px,0,0) scale(.97);
  transition:opacity .4s ease .28s,transform .6s cubic-bezier(.3,1.2,.4,1) .28s;
}
#landing .tzx-panel.in{opacity:1;transform:none}
@media (max-width:899px){#landing .tzx-panel{transform:translate3d(0,24px,0) scale(.97)}}
#landing .tzx-panel:not(.in){transition-delay:0s;transition-duration:.25s}
[data-theme="dark"] #landing .tzx-panel{
  background:radial-gradient(120% 90% at 30% 0%,rgba(90,140,255,0.16) 0%,rgba(90,140,255,0) 60%),
    linear-gradient(160deg,rgba(12,22,50,0.92) 0%,rgba(6,12,30,0.94) 100%);
}
#landing .tzx-top{display:flex;align-items:center;gap:10px}
#landing .tzx-tabs{display:flex;flex-wrap:wrap;gap:4px;padding:4px;border-radius:18px;background:var(--tz-chip);flex:1}
#landing .tzx-tab{
  display:flex;align-items:center;gap:6px;height:28px;padding:0 10px;border:0;border-radius:14px;
  background:transparent;color:var(--nova-ink2);font:inherit;font-size:12px;font-weight:700;letter-spacing:.04em;cursor:pointer;
  transition:transform .3s cubic-bezier(.34,1.56,.64,1),background .25s ease,color .25s ease,box-shadow .25s ease;
}
#landing .tzx-tab:hover{color:var(--nova-ink)}
#landing .tzx-tab[aria-selected="true"]{background:var(--lg-hi);color:var(--nova-ink);box-shadow:0 2px 8px var(--lg-drop2)}
[data-theme="dark"] #landing .tzx-tab[aria-selected="true"]{background:rgba(255,255,255,0.14)}
#landing .tzx-dot{width:8px;height:8px;border-radius:50%;flex:none}
#landing .tzx-close{
  width:34px;height:34px;flex:none;border:0;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:var(--tz-chip);color:var(--nova-ink);font-size:16px;cursor:pointer;
  transition:transform .3s cubic-bezier(.34,1.56,.64,1),background .2s ease;
}
#landing .tzx-close:hover{transform:rotate(90deg)}
#landing .tzx-body{display:flex;flex-direction:column;flex:1}
#landing .tzx-zone{display:flex;flex-direction:column;gap:12px;flex:1}
#landing .tzx-zone>*{animation:tzxUp .55s cubic-bezier(.22,1,.36,1) backwards}
#landing .tzx-zone>:nth-child(2){animation-delay:.04s} #landing .tzx-zone>:nth-child(3){animation-delay:.08s}
#landing .tzx-zone>:nth-child(4){animation-delay:.12s} #landing .tzx-zone>:nth-child(5){animation-delay:.16s}
#landing .tzx-zone.tzx-still>*{animation:none}
@keyframes tzxUp{from{opacity:0;transform:translate3d(0,10px,0)}}
#landing .tzx-eyebrow{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--nova-ink2)}
#landing .tzx-eyebrow .tzx-dot{background:var(--dot);box-shadow:0 0 0 3px color-mix(in srgb,var(--dot) 25%,transparent)}
#landing .tzx-name{font-size:24px;font-weight:700;letter-spacing:-.02em;line-height:1.1}
#landing .tzx-now{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
#landing .tzx-clock{font-size:24px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--dot)}
#landing .tzx-rel{font-size:13px;color:var(--nova-ink2)}
#landing .tzx-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
#landing .tzx-stat{display:flex;flex-direction:column;gap:2px;padding:9px 10px;border-radius:14px;background:var(--tz-chip)}
#landing .tzx-stat b{font-size:14px;font-weight:700;white-space:nowrap}
#landing .tzx-stat span{font-size:11px;color:var(--nova-ink2)}
#landing .tzx-fact{
  position:relative;display:flex;flex-direction:column;gap:10px;margin-top:auto;padding:14px 16px 12px;border-radius:18px;overflow:hidden;
  background:linear-gradient(150deg,color-mix(in srgb,var(--dot) 18%,transparent) 0%,color-mix(in srgb,var(--dot) 6%,transparent) 100%);
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--dot) 30%,transparent);
}
#landing .tzx-fact-k{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:700;color:var(--nova-ink)}
#landing .tzx-fact-k .ti{font-size:16px;color:#f5a623}
#landing .tzx-count{margin-left:auto;font-size:11px;font-weight:600;color:var(--nova-ink2);font-variant-numeric:tabular-nums}
#landing .tzx-fact-t{margin:0;min-height:5.6em;font-size:14px;line-height:1.45}
#landing .tzx-fact-t.tzx-from-right{animation:tzxFactR .45s cubic-bezier(.22,1,.36,1)}
#landing .tzx-fact-t.tzx-from-left{animation:tzxFactL .45s cubic-bezier(.22,1,.36,1)}
@keyframes tzxFactR{from{opacity:0;transform:translate3d(18px,0,0)}}
@keyframes tzxFactL{from{opacity:0;transform:translate3d(-18px,0,0)}}
#landing .tzx-nav{display:flex;align-items:center;justify-content:space-between}
#landing .tzx-arrow{
  width:32px;height:32px;border:0;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:var(--tz-chip);color:var(--nova-ink);font-size:16px;cursor:pointer;
  transition:transform .3s cubic-bezier(.34,1.56,.64,1),background .2s ease;
}
#landing .tzx-arrow:hover{transform:scale(1.1)}
#landing .tzx-dots{display:flex;gap:6px}
#landing .tzx-pip{
  width:7px;height:7px;padding:0;border:0;border-radius:4px;background:var(--nova-ink2);opacity:.35;cursor:pointer;
  transition:transform .3s ease,width .3s cubic-bezier(.34,1.56,.64,1),opacity .3s ease,background .3s ease;
}
#landing .tzx-pip.on{width:20px;opacity:1;background:var(--dot)}
@media (prefers-reduced-motion:reduce){
  #landing .tzx-panel,#landing .tzx-scrim{transition:none}
  #landing .tzx-open .tz-chip,#landing .tzx-zone>*,#landing .tzx-fact-t{animation:none}
}
#landing .tzx-clock{color:color-mix(in srgb,var(--dot) 55%,var(--nova-ink))}
[data-theme="dark"] #landing .tzx-clock{color:var(--dot)}
#landing .tzx-tabs{gap:2px}
#landing .tzx-tab{padding:0 8px}
@media (max-width:420px){#landing .tzx-tabs{flex-wrap:nowrap;justify-content:space-between}#landing .tzx-tab{padding:0 6px;gap:5px}}
#landing .tzx-day{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:14px;background:var(--tz-chip)}
#landing .tzx-day-h{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px;color:var(--nova-ink2)}
#landing .tzx-day-s{font-size:12px;font-weight:700;color:var(--nova-ink2);white-space:nowrap}
#landing .tzx-day-s.open{color:#1f9d55}
[data-theme="dark"] #landing .tzx-day-s.open{color:#4cd98a}
#landing .tzx-track{
  position:relative;height:10px;border-radius:5px;
  background:linear-gradient(90deg,var(--tz-night-bar,rgba(40,60,120,0.30)) 0 25%,rgba(245,166,35,0.28) 25% 79.17%,var(--tz-night-bar,rgba(40,60,120,0.30)) 79.17%);
}
[data-theme="dark"] #landing .tzx-track{--tz-night-bar:rgba(120,150,255,0.18)}
#landing .tzx-work{position:absolute;top:0;bottom:0;left:37.5%;width:33.33%;border-radius:5px;background:color-mix(in srgb,var(--dot) 75%,transparent)}
#landing .tzx-mark{
  position:absolute;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;box-sizing:border-box;
  background:var(--nova-ink);border:3px solid var(--lg-hi);box-shadow:0 2px 6px rgba(0,0,0,0.3);
  transition:left .6s cubic-bezier(.22,1,.36,1);animation:tzxMark .6s cubic-bezier(.34,1.56,.64,1) .25s backwards;
}
[data-theme="dark"] #landing .tzx-mark{background:#ffffff;border-color:#0b1630}
@keyframes tzxMark{from{transform:scale(0)}}
#landing .tzx-ticks{display:flex;justify-content:space-between;font-size:10px;color:var(--nova-ink2);font-variant-numeric:tabular-nums}
@media (prefers-reduced-motion:reduce){#landing .tzx-mark{animation:none;transition:none}}
#landing .tzx-still .tzx-mark{animation:none}
@media (max-height:700px){
  #landing .tzx-panel{gap:10px;padding:14px 16px 16px}
  #landing .tzx-zone{gap:9px}
  #landing .tzx-name{font-size:22px}
  #landing .tzx-fact{padding:10px 14px}
  #landing .tzx-fact-t{min-height:0}
}
#landing .tzx-panel{container-type:inline-size}
#landing .tzx-tabs{flex-wrap:nowrap;justify-content:space-between}
#landing .tzx-dot{box-shadow:inset 0 0 0 1.5px rgba(10,30,60,0.22)}
[data-theme="dark"] #landing .tzx-dot{box-shadow:none}
@container (max-width:320px){#landing .tzx-tab .tzx-dot{display:none}#landing .tzx-tab{padding:0 9px}}
#landing .tzx-day-h span{white-space:nowrap}
@container (max-width:350px){#landing .tzx-day-s{font-size:11px}}

/* Light mode, legible: the zones were pastels a shade off the glass behind
   them, edged in white on a pale ground, so the country faded into the card.
   They now take clear mid-tone colours, one hue each, and the coast is drawn
   in navy; the state lines stay white inside them, and the zone names are
   darker. The pins and the white clocks read on top of all four. */
:root:not([data-theme="dark"]) #landing{
  --tz-p1:#8ccbf5;--tz-p2:#4f9fe0;--tz-m1:#a9b6f7;--tz-m2:#6f84e4;
  --tz-c1:#7fdbe8;--tz-c2:#35aec7;--tz-e1:#c2aef7;--tz-e2:#8f72e3;
  --tz-edge:rgba(16,44,98,0.62);--tz-edge-w:1.8;--tz-inner:rgba(255,255,255,0.75);
  --tz-night:#0b1a4a;--tz-night-o:0.18;--tz-sweep:0.5;
  --tz-shadow:rgba(20,50,110,0.32);--tz-label:rgba(11,24,52,0.5);
}
:root:not([data-theme="dark"]) #landing .tzx-open .tz-map[data-sel] .tz-zone{opacity:.42}
:root:not([data-theme="dark"]) #landing .tzx-open .tz-map[data-sel] .tz-zone:hover{opacity:.7}
:root:not([data-theme="dark"]) #landing .tzx-open .tz-map[data-sel="P"] .tz-zone-P,:root:not([data-theme="dark"]) #landing .tzx-open .tz-map[data-sel="M"] .tz-zone-M,
:root:not([data-theme="dark"]) #landing .tzx-open .tz-map[data-sel="C"] .tz-zone-C,:root:not([data-theme="dark"]) #landing .tzx-open .tz-map[data-sel="E"] .tz-zone-E{opacity:1}

/* ── Dark mode in navy and black ──────────────────────────────────────────
   The dark theme carried violet in five places: a purple bloom in the page
   ground and one of the ambient orbs, the landing's indigo orb (which
   tinted every workspace card behind the glass), the lavender stop in the
   name's gradient, and the Mountain and Eastern zones of the map. They are
   all dark blues and near-black now, which reads calmer and more
   professional. The purple and indigo tool colours (Carriers, Weekly
   Meeting, Games, the Breaks group) move to two blues in dark mode; the
   green, amber, red and teal tools keep their colours so each tool is still
   told apart at a glance. Light mode is unchanged. */
[data-theme="dark"]{
  --bg:#02040a;
  --bg-mesh:
    radial-gradient(1100px 760px at 88% -4%,rgba(30,91,255,0.30) 0%,transparent 62%),
    radial-gradient(900px 700px at 6% 104%,rgba(18,110,200,0.20) 0%,transparent 60%),
    radial-gradient(760px 620px at 42% 58%,rgba(16,44,110,0.26) 0%,transparent 64%),
    linear-gradient(160deg,#010308 0%,#040914 50%,#06101f 100%);
  --pal-indigo:#3d6fd1;--pal-purple:#2d5aa8;
}
[data-theme="dark"] .amb3{background:radial-gradient(circle,rgba(20,60,150,0.26) 0%,transparent 65%)}
[data-theme="dark"] #landing{
  --nova-ground:#010309;
  --nova-orb-a:#1d5fe0;--nova-orb-b:#0f2a52;--nova-orb-c:#12326f;
  --nova-orb-d:#0f86d1;--nova-orb-f:#1c3f8c;--nova-orb-o:0.55;
  --nova-name:linear-gradient(100deg,#ffffff 0%,#b9dcff 25%,#7fb2ff 50%,#b9dcff 75%,#ffffff 100%);
  --tz-p1:#3a8ee0;--tz-p2:#2466b4;--tz-m1:#2b5fae;--tz-m2:#1a3f7e;
  --tz-c1:#1f9fc8;--tz-c2:#12739a;--tz-e1:#4f7fd0;--tz-e2:#2c528f;
}

/* ══════════════════════════════════════════════════════════════════════════
   iOS 27 (32-app-launcher.js, 33-ios-shell.js)
   ══════════════════════════════════════════════════════════════════════════
   One set of motion tokens; Liquid Glass for structure (bars, boxes,
   widgets, sheets) and plain surfaces for anything read at length; app
   icons as squircles, a corner of 22.5% of their size. */
:root{
  --m-fast:160ms;--m-base:280ms;--m-slow:420ms;
  --m-ease:cubic-bezier(.2,.8,.2,1);--m-spring:cubic-bezier(.3,1.2,.4,1);
}

/* ── Workspaces: a Pinned row and an App Library ───────────────────────── */
:is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .wl{
  max-width:1312px;margin:0 auto;padding:6px 0 28px;
  display:flex;flex-direction:column;gap:16px;color:var(--gl-ink);
}
.wl-dock,.wl-box,.wl-suggest{
  background:var(--gl-bg);
  backdrop-filter:blur(30px) saturate(190%);-webkit-backdrop-filter:blur(30px) saturate(190%);
  box-shadow:inset 0 1.5px 0 var(--gl-lip),inset 0 -1px 0 var(--gl-under),0 0 0 .5px var(--gl-edge),var(--gl-drop);
}
.wl-dock{padding:12px 16px 14px;border-radius:32px}
.wl-dock-head{display:flex;align-items:center;justify-content:space-between;padding:0 6px 4px}
.wl-dock-head h3,.wl-box-title{margin:0;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--gl-ink2)}
.wl-edit{
  height:30px;padding:0 14px;border:0;border-radius:15px;font:inherit;font-size:13px;font-weight:700;
  color:var(--gl-accent);background:var(--gl-btn);box-shadow:var(--gl-btn-shadow);cursor:pointer;
  transition:transform var(--m-fast) ease-out,background var(--m-fast) ease-out;
}
.wl-dock-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px}
.wl-app{
  position:relative;display:flex;flex-direction:column;align-items:center;gap:8px;
  padding:8px 4px 6px;border:0;border-radius:20px;background:transparent;
  color:var(--gl-ink);font:inherit;cursor:pointer;
  transition:transform var(--m-fast) ease-out,background var(--m-fast) ease-out;
  animation:wlRise var(--m-slow) var(--m-ease) backwards;animation-delay:calc(var(--i,0) * 30ms);
}
.wl-app:hover{background:var(--gl-hover)}
.wl-app:active{transform:scale(.95)}
.wl-ic-wrap{position:relative;display:block}
.wl-ic{
  width:72px;height:72px;border-radius:16px;overflow:hidden;
  display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,color-mix(in srgb,var(--grp) 86%,#ffffff) 0%,var(--grp) 100%);
  box-shadow:0 0 0 .5px rgba(10,30,60,0.12),0 1px 2px rgba(10,30,60,0.10),0 10px 20px -12px color-mix(in srgb,var(--grp) 60%,transparent);
}
.wl-ic i{font-size:32px;color:#ffffff}
.wl-ic svg{width:62%;height:62%}
.wl-ic svg>rect:first-child{display:none}
.wl-ic svg g[stroke]{stroke:#ffffff}
.wl-ic img{width:100%;height:100%;object-fit:cover}
.wl-ic.wl-ic-logo{background:#03060f}
.wl-ic.wl-ic-cal{flex-direction:column;gap:1px;background:linear-gradient(170deg,#ffffff 0%,#f2f4f8 100%)}
.wl-ic-cal .cal-tile-wday,.wl-ic-cal .cal-tile-month{font-size:10px;font-weight:800;color:#e5413a;line-height:1.1;text-transform:uppercase}
.wl-ic-cal .cal-tile-day{font-size:26px;font-weight:700;color:#111318;line-height:1}
[data-theme="dark"] .wl-ic:not(.wl-ic-logo):not(.wl-ic-cal){
  background:linear-gradient(160deg,#1d2d4d 0%,#0c1528 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.24),inset 0 0 0 1px rgba(255,255,255,0.08),0 10px 22px -12px rgba(0,0,0,0.85);
}
[data-theme="dark"] .wl-ic i{color:color-mix(in srgb,var(--grp) 55%,#ffffff)}
[data-theme="dark"] .wl-ic svg g[stroke]{stroke:color-mix(in srgb,var(--grp) 55%,#ffffff)}
[data-theme="dark"] .wl-ic.wl-ic-cal{background:linear-gradient(170deg,#1b2233 0%,#111726 100%);box-shadow:inset 0 1px 0 rgba(255,255,255,0.18),0 0 0 1px rgba(255,255,255,0.10)}
[data-theme="dark"] .wl-ic-cal .cal-tile-day{color:#f3f6fb}
[data-theme="dark"] .wl-ic.wl-ic-logo{box-shadow:0 0 0 1px rgba(140,180,255,0.30),0 10px 22px -12px rgba(0,0,0,0.85)}
.wl-name{max-width:110px;font-size:13px;font-weight:700;line-height:1.2;text-align:center;color:var(--gl-ink)}
/* Edit: pinned icons take a minus, library icons a plus; nothing opens. */
.wl-badge{
  position:absolute;left:-7px;top:-7px;width:24px;height:24px;border-radius:50%;
  display:none;align-items:center;justify-content:center;
  font-style:normal;font-size:16px;font-weight:800;line-height:1;color:#ffffff;
  box-shadow:0 2px 6px rgba(0,0,0,0.35);cursor:pointer;
}
.wl-badge-out{background:#7d879b}
.wl-badge-in{background:#3a8ee0}
.wl[data-edit="1"] .wl-badge{display:flex}
.wl[data-edit="1"] .wl-pin .wl-ic{animation:wlJiggle .3s ease-in-out infinite alternate}
@keyframes wlJiggle{from{transform:rotate(-1.4deg)}to{transform:rotate(1.4deg)}}
.wl-free{display:flex;flex-direction:column;align-items:center;gap:8px;padding:8px 4px 6px}
.wl-free-ic{
  width:72px;height:72px;box-sizing:border-box;border-radius:16px;border:1.5px dashed var(--gl-hair);
  display:flex;align-items:center;justify-content:center;font-size:26px;color:var(--gl-ink2);
}
.wl-free .wl-name{color:var(--gl-ink2);font-weight:600}
.wl-suggest{
  align-self:flex-start;display:flex;align-items:center;gap:10px;height:46px;box-sizing:border-box;
  padding:0 7px 0 16px;border-radius:23px;font-size:13px;color:var(--gl-ink2);
  animation:wlRise var(--m-base) var(--m-ease) backwards;
}
.wl-suggest b{color:var(--gl-ink)}
.wl-suggest-k{font-size:12px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--gl-accent)}
.wl-suggest button{
  height:32px;padding:0 14px;border:0;border-radius:16px;font:inherit;font-size:13px;font-weight:700;cursor:pointer;
  transition:transform var(--m-fast) ease-out,background var(--m-fast) ease-out;
}
.wl-suggest-no{color:var(--gl-ink2);background:transparent}
.wl-suggest-yes{color:#04101f;background:#8fbcff}
.wl-lib-title{margin:4px 6px 0;font-size:22px;font-weight:800;letter-spacing:-.02em;color:var(--gl-ink)}
.wl-library{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;align-items:start}
.wl-box{padding:14px 12px 8px;border-radius:30px;animation:wlRise var(--m-slow) var(--m-ease) backwards;animation-delay:calc(var(--gi,0) * 40ms + 80ms)}
.wl-box-title{display:flex;justify-content:space-between;gap:8px;padding:0 8px 4px}
.wl-box-n{color:var(--gl-ink2);font-weight:700}
.wl-box-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(92px,1fr));gap:2px}
@keyframes wlRise{from{opacity:0;transform:translate3d(0,10px,0) scale(.98)}}
@media (min-width:761px) and (max-height:820px){
  .wl-ic,.wl-free-ic{width:58px;height:58px;border-radius:13px}
  .wl-ic i{font-size:26px}
  .wl-ic-cal .cal-tile-day{font-size:22px}
  .wl-app,.wl-free{gap:6px;padding:6px 4px 4px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .wl{gap:12px}
  .wl-box-grid{grid-template-columns:repeat(auto-fill,minmax(84px,1fr))}
  .wl-name{font-size:12px}
}
@media (max-width:760px){
  .wl-dock-row{grid-template-columns:repeat(4,minmax(0,1fr))}
  .wl-ic,.wl-free-ic{width:60px;height:60px;border-radius:13.5px}
  .wl-suggest{height:auto;flex-wrap:wrap;padding:10px 12px;border-radius:20px}
}

/* ── Opening something: the source zooms out to the whole window ───────── */
.nova-zoom{
  position:fixed;z-index:9500;pointer-events:none;
  background:linear-gradient(160deg,#1d2d4d 0%,#0c1528 100%);
  box-shadow:inset 0 1.5px 0 rgba(255,255,255,0.30),0 30px 60px -24px rgba(0,0,0,0.8);
}
.nova-zoom.grow{transition:left var(--m-slow) var(--m-ease),top var(--m-slow) var(--m-ease),width var(--m-slow) var(--m-ease),height var(--m-slow) var(--m-ease),border-radius var(--m-slow) var(--m-ease),opacity 240ms ease}
.nova-zoom.out{opacity:0}
.nova-zoom-logo{background:#03060f}
.nova-zoom-ws{background:linear-gradient(155deg,rgba(70,110,210,0.55) 0%,rgba(24,40,90,0.70) 100%)}
:root:not([data-theme="dark"]) .nova-zoom{background:linear-gradient(180deg,color-mix(in srgb,var(--grp,#4a90e0) 86%,#ffffff) 0%,var(--grp,#4a90e0) 100%)}
:root:not([data-theme="dark"]) .nova-zoom-logo{background:#03060f}
:root:not([data-theme="dark"]) .nova-zoom-ws{background:linear-gradient(155deg,rgba(255,255,255,0.86) 0%,rgba(225,236,252,0.80) 100%)}

/* ── The Home screen: a greeting, the workspaces, clocks and the month ─── */
#landing .nova-landing-inner{
  display:grid;grid-template-columns:minmax(0,1fr) clamp(340px,33vw,480px);
  grid-template-rows:auto auto minmax(0,1fr) auto;
  grid-template-areas:"hello map" "title map" "cards map" "cards cal";
  column-gap:32px;align-items:start;
}
#landing .nova-hero{display:contents}
#landing .nova-hero-text{grid-area:hello;gap:0}
#landing .nova-eyebrow{margin-bottom:10px}
/* The name is the headline; the greeting is the line above it. */
#landing .nova-hello{display:flex;flex-direction:column;gap:2px;margin:0}
#landing .nova-hello-1{font-size:26px;font-weight:600;letter-spacing:-.02em;color:var(--nova-ink2)}
#landing .nova-hello-2{font-size:clamp(56px,6.2vw,84px);font-weight:800;letter-spacing:-.05em;line-height:.98}
#landing .nova-section-title{grid-area:title;margin:28px 0 14px;font-size:20px;font-weight:800;letter-spacing:-.02em}
#landing .nova-tzmap,#landing .tzx-slot{grid-area:map}
#landing .nova-tzmap{width:auto;max-width:none;flex:none;align-self:stretch;margin:0 0 14px;padding:20px 22px;border-radius:34px;justify-content:center;gap:10px}
#landing .nova-cal{
  grid-area:cal;box-sizing:border-box;padding:14px 18px 12px;border-radius:30px;color:var(--nova-ink);
  background:linear-gradient(155deg,var(--lg-hi) 0%,var(--lg-tint) 45%,var(--lg-lo) 100%);
  backdrop-filter:blur(30px) saturate(200%) brightness(var(--lg-bright));-webkit-backdrop-filter:blur(30px) saturate(200%) brightness(var(--lg-bright));
  box-shadow:inset 0 1.5px 0 var(--lg-lip),inset 0 -1.5px 1px var(--lg-underlip),inset 0 0 0 1px var(--lg-rim),0 0 0 .5px var(--lg-edge),0 26px 56px -18px var(--lg-drop);
  animation:novaRise 1.2s cubic-bezier(.22,1,.36,1) .3s backwards;
}
#landing .nova-cal-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:6px}
#landing .nova-cal-month{font-size:16px;font-weight:800}
#landing .nova-cal-today{font-size:12px;font-weight:700;color:#ff8a80}
:root:not([data-theme="dark"]) #landing .nova-cal-today{color:#d93b2f}
#landing .nova-cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));text-align:center}
#landing .nova-cal-wd{font-size:10px;font-weight:800;color:var(--nova-ink2);padding-bottom:2px}
#landing .nova-cal-d{height:26px;display:flex;align-items:center;justify-content:center}
#landing .nova-cal-d i{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-style:normal;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}
#landing .nova-cal-d.past i{color:var(--nova-ink2);opacity:.7}
#landing .nova-cal-d.today i{font-weight:800;color:#04101f;background:#8fbcff}
:root:not([data-theme="dark"]) #landing .nova-cal-d.today i{color:#ffffff;background:var(--nova-accent)}
/* The workspaces: a grid of two, the last one taking the row when alone. */
#landing .lobby-grid{grid-area:cards;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-content:start;justify-content:stretch}
#landing .lobby-grid>.lobby-card{
  flex:none;height:clamp(128px,17vh,156px);padding:18px 18px 16px;border-radius:30px;
  grid-template-columns:52px minmax(0,1fr) auto;grid-template-rows:auto auto minmax(0,1fr);
  grid-template-areas:"icon title title" "icon sub sub" "minis minis go";
  column-gap:14px;row-gap:2px;align-items:start;
}
#landing .lobby-grid>.lobby-card.nova-wide{
  grid-column:1 / -1;height:clamp(92px,12vh,110px);
  grid-template-columns:52px minmax(0,1fr) auto auto;grid-template-rows:auto auto;
  grid-template-areas:"icon title minis go" "icon sub minis go";align-items:center;
}
#landing .lobby-grid .lobby-card-icon{width:52px;height:52px;border-radius:12px}
#landing .lobby-grid .lobby-card-icon i{font-size:26px!important}
#landing .lobby-grid .lobby-card-title{align-self:end;margin:0;font-size:18px;font-weight:800;letter-spacing:-.015em}
#landing .lobby-grid .lobby-card-badge-live{display:none}
#landing .lobby-grid .lobby-card-badge{grid-area:go;justify-self:end}
#landing .nova-card-sub{grid-area:sub;align-self:start;min-width:0;font-size:13px;color:var(--nova-ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#landing .lobby-grid .nova-card-go{
  grid-area:go;align-self:end;margin:0;width:30px;height:30px;border-radius:50%;justify-content:center;font-size:0;
  color:var(--nova-ink);background:var(--lg-hi);box-shadow:inset 0 1px 0 var(--lg-lip),0 0 0 .5px var(--lg-edge);
}
#landing .lobby-grid .nova-card-go i{font-size:16px}
#landing .nova-card-minis{grid-area:minis;align-self:end;display:flex;align-items:center;gap:8px;min-width:0}
#landing .nova-wide .nova-card-minis{align-self:center}
#landing .nova-mini{
  width:36px;height:36px;flex-shrink:0;border-radius:9px;overflow:hidden;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,color-mix(in srgb,var(--grp,var(--pal-blue)) 86%,#ffffff) 0%,var(--grp,var(--pal-blue)) 100%);
  box-shadow:0 0 0 .5px rgba(10,30,60,0.12),0 6px 14px -8px rgba(10,30,60,0.35);
}
#landing .nova-mini i{font-size:18px;color:#ffffff}
#landing .nova-mini svg{width:62%;height:62%}
#landing .nova-mini svg>rect:first-child{display:none}
#landing .nova-mini svg g[stroke]{stroke:#ffffff}
#landing .nova-mini img{width:100%;height:100%;object-fit:cover}
#landing .nova-mini.nova-mini-logo{background:#03060f}
#landing .nova-mini.nova-mini-cal{background:#ffffff}
#landing .nova-mini.nova-mini-cal b{font-size:14px;color:#111318}
[data-theme="dark"] #landing .nova-mini:not(.nova-mini-logo):not(.nova-mini-cal){
  background:linear-gradient(160deg,#1d2d4d 0%,#0c1528 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.22),inset 0 0 0 1px rgba(255,255,255,0.08);
}
[data-theme="dark"] #landing .nova-mini i{color:color-mix(in srgb,var(--grp,#8fbcff) 55%,#ffffff)}
[data-theme="dark"] #landing .nova-mini svg g[stroke]{stroke:color-mix(in srgb,var(--grp,#8fbcff) 55%,#ffffff)}
#landing .nova-mini-more{height:24px;padding:0 9px;border-radius:12px;display:flex;align-items:center;font-size:12px;font-weight:800;color:var(--nova-ink);background:var(--lg-hi)}
/* Spotlight's key on the Home screen, beside the theme switch. */
#landing .nova-spot-btn{
  position:absolute;top:-58px;right:74px;z-index:2;width:44px;height:44px;border:0;border-radius:50%;
  display:flex;align-items:center;justify-content:center;font-size:20px;color:var(--nova-ink);cursor:pointer;
  background:linear-gradient(155deg,var(--lg-hi) 0%,var(--lg-tint) 45%,var(--lg-lo) 100%);
  box-shadow:inset 0 1.5px 0 var(--lg-lip),inset 0 0 0 1px var(--lg-rim),0 0 0 .5px var(--lg-edge);
  transition:transform var(--m-fast) ease-out;
}
/* Short windows: the name and the cards give way first. */
@media (min-width:761px) and (max-height:820px){
  #landing .nova-hello-1{font-size:20px}
  #landing .nova-hello-2{font-size:clamp(44px,5vw,64px)}
  #landing .nova-section-title{margin:16px 0 10px}
  #landing .lobby-grid>.lobby-card{height:clamp(112px,16vh,132px);padding:14px 16px}
  #landing .nova-mini{width:30px;height:30px;border-radius:7px}
  #landing .nova-mini i{font-size:16px}
}
@media (min-width:761px) and (max-height:680px){
  #landing .nova-card-minis{display:none}
  #landing .lobby-grid>.lobby-card{height:88px;grid-template-areas:"icon title go" "icon sub go" ". . ."}
  #landing .lobby-grid>.lobby-card.nova-wide{height:80px}
  #landing .nova-cal-d{height:22px}
  #landing .nova-cal-d i{width:20px;height:20px}
}
@media (max-width:760px){
  #landing .nova-landing-inner{grid-template-columns:minmax(0,1fr);grid-template-areas:"hello" "map" "title" "cards" "cal";grid-template-rows:none}
  #landing .lobby-grid{grid-template-columns:minmax(0,1fr)}
  #landing .lobby-grid>.lobby-card,#landing .lobby-grid>.lobby-card.nova-wide{grid-column:auto;height:auto;min-height:120px}
  #landing .nova-cal{margin-top:14px}
}

/* A touch of violet in dark mode: the ground's glow, the name, one zone. */
[data-theme="dark"] #landing{
  --nova-orb-c:#2c2a78;
  --nova-name:linear-gradient(100deg,#ffffff 0%,#d6e8ff 45%,#d2cbff 80%,#eeeaff 100%);
  --tz-e1:#5a5fcf;--tz-e2:#3c409c;
}
[data-theme="dark"]{
  --bg-mesh:
    radial-gradient(1100px 760px at 88% -4%,rgba(30,91,255,0.30) 0%,transparent 62%),
    radial-gradient(760px 620px at 40% 62%,rgba(107,60,255,0.09) 0%,transparent 66%),
    radial-gradient(900px 700px at 6% 104%,rgba(18,110,200,0.20) 0%,transparent 60%),
    linear-gradient(160deg,#010308 0%,#040914 50%,#06101f 100%);
}

/* ── Undo ──────────────────────────────────────────────────────────────── */
.nova-toast{
  position:fixed;left:50%;bottom:36px;z-index:9600;min-width:320px;max-width:min(520px,calc(100vw - 32px));
  height:54px;box-sizing:border-box;padding:0 8px 0 20px;border-radius:27px;overflow:hidden;
  display:flex;align-items:center;gap:12px;font-size:14px;color:var(--gl-ink);
  background:var(--gl-bg);backdrop-filter:blur(30px) saturate(200%);-webkit-backdrop-filter:blur(30px) saturate(200%);
  box-shadow:inset 0 1.5px 0 var(--gl-lip),0 0 0 .5px var(--gl-edge),0 24px 50px -18px rgba(0,0,0,0.6);
  transform:translateX(-50%);animation:novaToastIn var(--m-base) var(--m-spring) both;
  transition:opacity 220ms ease,transform 220ms ease;
}
[data-theme="dark"] .nova-toast{background:linear-gradient(155deg,rgba(40,60,110,0.85) 0%,rgba(20,32,64,0.90) 100%)}
.nova-toast.out{opacity:0;transform:translate(-50%,10px)}
.nova-toast-msg{flex-grow:1}
.nova-toast-undo{
  height:38px;padding:0 16px;border:0;border-radius:19px;font:inherit;font-size:14px;font-weight:800;
  color:#04101f;background:#8fbcff;cursor:pointer;transition:transform var(--m-fast) ease-out;
}
.nova-toast-bar{position:absolute;left:24px;right:24px;bottom:0;height:2px;border-radius:1px;background:#8fbcff;transform-origin:0 50%;animation:novaToastBar 5s linear forwards}
@keyframes novaToastIn{from{opacity:0;transform:translate(-50%,14px) scale(.96)}}
@keyframes novaToastBar{from{transform:scaleX(1)}to{transform:scaleX(0)}}

/* ── Spotlight ─────────────────────────────────────────────────────────── */
.nova-spot{position:fixed;inset:0;z-index:9700}
.nova-spot-scrim{position:absolute;inset:0;background:rgba(2,6,16,0.45);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);opacity:0;transition:opacity var(--m-base) ease}
.nova-spot-sheet{
  position:absolute;left:50%;top:max(80px,14vh);width:min(640px,calc(100vw - 32px));box-sizing:border-box;padding:10px;border-radius:30px;
  display:flex;flex-direction:column;gap:2px;color:#f3f6fb;
  background:linear-gradient(155deg,rgba(50,70,120,0.72) 0%,rgba(18,28,58,0.82) 100%);
  backdrop-filter:blur(30px) saturate(200%);-webkit-backdrop-filter:blur(30px) saturate(200%);
  box-shadow:inset 0 1.5px 0 rgba(255,255,255,0.45),inset 0 0 0 1px rgba(255,255,255,0.10),0 40px 80px -30px rgba(0,0,0,0.9);
  opacity:0;transform:translate(-50%,-12px) scale(.97);transition:opacity var(--m-base) ease,transform var(--m-base) var(--m-spring);
}
.nova-spot.in .nova-spot-scrim{opacity:1}
.nova-spot.in .nova-spot-sheet{opacity:1;transform:translate(-50%,0)}
.nova-spot-field{height:54px;box-sizing:border-box;padding:0 14px;display:flex;align-items:center;gap:12px;color:#b6c6e0;font-size:22px}
.nova-spot-field input{flex-grow:1;min-width:0;border:0;outline:0;background:transparent;font:inherit;font-size:20px;color:#f3f6fb}
.nova-spot-field kbd{font:inherit;font-size:12px;font-weight:700;padding:3px 8px;border-radius:7px;color:#cfe2ff;background:rgba(255,255,255,0.12)}
.nova-spot-list{max-height:min(460px,60vh);overflow:auto;display:flex;flex-direction:column;gap:2px}
.nova-spot-head{padding:10px 14px 4px;font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#9fb2d2}
.nova-spot-row{
  height:54px;flex-shrink:0;box-sizing:border-box;padding:0 12px;border:0;border-radius:16px;
  display:flex;align-items:center;gap:12px;font:inherit;text-align:left;color:#f3f6fb;background:transparent;cursor:pointer;
  transition:transform var(--m-fast) ease-out,background var(--m-fast) ease-out;
}
.nova-spot-row.on,.nova-spot-row:hover{background:rgba(255,255,255,0.14)}
.nova-spot-ic{width:36px;height:36px;flex-shrink:0;border-radius:9px;overflow:hidden;display:flex;align-items:center;justify-content:center;color:color-mix(in srgb,var(--grp,#8fbcff) 55%,#ffffff);background:linear-gradient(160deg,#1d2d4d 0%,#0c1528 100%);box-shadow:inset 0 1px 0 rgba(255,255,255,0.22)}
.nova-spot-ic i{font-size:18px;color:inherit!important;filter:none}
.nova-spot-ic svg{width:62%;height:62%}
.nova-spot-ic svg>rect:first-child{display:none}
.nova-spot-ic svg g[stroke]{stroke:currentColor}
.nova-spot-ic img{width:100%;height:100%;object-fit:cover}
.nova-spot-ic.logo{background:#03060f}
.nova-spot-txt{display:flex;flex-direction:column;gap:2px;flex-grow:1;min-width:0}
.nova-spot-txt b{font-size:14px}
.nova-spot-txt span{font-size:12px;color:#b6c6e0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nova-spot-k{font-size:12px;font-weight:700;color:#9fb2d2;flex-shrink:0}
.nova-spot-empty{padding:18px 14px;font-size:14px;color:#b6c6e0}
.nova-spot-foot{margin-top:6px;padding:10px 14px 4px;display:flex;gap:18px;font-size:12px;color:#9fb2d2;border-top:1px solid rgba(255,255,255,0.12)}

@media (prefers-reduced-motion:reduce){
  .wl-app,.wl-box,.wl-suggest,.nova-cal,.nova-toast{animation:none}
  .wl[data-edit="1"] .wl-pin .wl-ic{animation:none}
  .nova-spot-sheet,.nova-spot-scrim{transition:none}
}
@media (min-width:761px) and (max-height:680px){
  #landing .lobby-grid .nova-card-go{display:none}
  #landing .lobby-grid>.lobby-card,#landing .lobby-grid>.lobby-card.nova-wide{grid-template-columns:52px minmax(0,1fr);grid-template-areas:"icon title" "icon sub"}
  #landing .lobby-grid .lobby-card-title{font-size:16px}
}
@media (min-width:761px) and (max-height:700px){
  .wl-ic,.wl-free-ic{width:50px;height:50px;border-radius:11px}
  .wl-ic i{font-size:22px}
  .wl-ic-cal .cal-tile-day{font-size:18px}
  .wl-ic-cal .cal-tile-wday,.wl-ic-cal .cal-tile-month{font-size:9px}
  .wl-free-ic{font-size:20px}
  .wl-name{font-size:12px}
  .wl-app,.wl-free{gap:5px;padding:4px 2px 3px}
  .wl-dock{padding:8px 14px 10px}
  .wl-dock-head{padding-bottom:2px}
  .wl-box{padding:10px 10px 6px}
  .wl-box-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .wl-lib-title{font-size:18px;margin-top:0}
  .wl-suggest{height:40px}
  :is(#sales-admin-screen,#submission-screen,#marketing-workspace-screen) .wl{gap:10px;padding-bottom:12px}
}
@media (max-width:760px){
  #landing .lobby-grid>.lobby-card.nova-wide{
    grid-template-columns:52px minmax(0,1fr) auto;grid-template-rows:auto auto minmax(0,1fr);
    grid-template-areas:"icon title title" "icon sub sub" "minis minis go";align-items:start;
  }
  #landing .nova-wide .nova-card-minis{align-self:end}
}

/* ══════════════════════════════════════
   HOW TO USE — THE OPERATING MANUAL (34-manual.js)
   An aircraft-manual layout: running headers, numbered sections,
   challenge–response checklists, QRH cards, an annunciator panel. Built on
   the app's own tokens so it follows the theme; the paper tone and the
   monospaced labels are the only things it adds.
══════════════════════════════════════ */
.man-overlay{--man-paper:color-mix(in srgb,var(--bg) 45%,#fff);--man-paper2:color-mix(in srgb,var(--bg) 80%,#fff);--man-on-alert:#fff;
  --man-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  position:fixed;inset:0;z-index:8000;flex-direction:column;background:var(--bg);color:var(--text);font-size:14px;line-height:1.6}
[data-theme="dark"] .man-overlay{--man-paper:color-mix(in srgb,var(--bg) 88%,#fff);--man-paper2:color-mix(in srgb,var(--bg) 82%,#fff);--man-on-alert:#140c04}
.man-overlay button{font:inherit;color:inherit}
.man-top{flex-shrink:0;height:56px;display:flex;align-items:center;gap:12px;padding:0 16px;background:var(--man-paper);border-bottom:1px solid var(--border)}
.man-sp{flex:1}
.man-brand{display:flex;align-items:center;gap:10px;font-weight:700;white-space:nowrap}
.man-brand small{display:block;font:600 10px/1.2 var(--man-mono);color:var(--text3);letter-spacing:.08em}
.man-brand-mark{width:30px;height:30px;border-radius:8px;background:var(--accent);color:#fff;display:grid;place-items:center;font-size:16px}
.man-icon-btn{width:36px;height:36px;border-radius:10px;border:1px solid var(--border);background:var(--man-paper);display:grid;place-items:center;cursor:pointer;font-size:18px}
.man-icon-btn:hover{border-color:var(--accent2)}
.man-menu-btn{display:none}
.man-lang{display:flex;border:1px solid var(--border);border-radius:999px;overflow:hidden}
.man-lang button{border:0;background:transparent;padding:5px 12px;font-size:12px;font-weight:700;cursor:pointer;color:var(--text3)}
.man-lang button.on{background:var(--accent);color:#fff}
.man-currency{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text2);white-space:nowrap}
.man-ring{--p:0;width:28px;height:28px;border-radius:50%;background:conic-gradient(var(--success) calc(var(--p)*1%),var(--border) 0);display:grid;place-items:center}
.man-ring::after{content:"";width:20px;height:20px;border-radius:50%;background:var(--man-paper)}
.man-shell{flex:1;min-height:0;display:grid;grid-template-columns:288px minmax(0,1fr)}
.man-toc{overflow:auto;padding:16px 12px 40px;border-right:1px solid var(--border);background:var(--man-paper2)}
.man-search{display:flex;align-items:center;gap:8px;border:1px solid var(--border);background:var(--man-paper);border-radius:10px;padding:8px 10px;margin-bottom:14px;color:var(--text3)}
.man-search input{border:0;outline:0;background:transparent;width:100%;font:inherit;font-size:13px;color:var(--text)}
.man-toc-ch>button{width:100%;display:flex;align-items:center;gap:10px;border:0;background:transparent;padding:7px 8px;border-radius:8px;cursor:pointer;text-align:left;font-size:13px;font-weight:600}
.man-toc-ch>button:hover{background:var(--accent-soft)}
.man-toc-num{font:700 11px var(--man-mono);color:var(--text3);width:22px;flex-shrink:0}
.man-toc-chk{margin-left:auto;color:var(--success);opacity:0}
.man-toc-ch.read .man-toc-chk{opacity:1}
.man-toc-car{color:var(--text3);transition:transform .2s}
.man-toc-ch.open .man-toc-car{transform:rotate(90deg)}
.man-toc-ch.active>button{color:var(--accent)}
.man-toc-ch.hidden{display:none}
.man-toc-sub{display:none;padding:0 0 6px 40px}
.man-toc-ch.open .man-toc-sub{display:block}
.man-toc-sub a{display:block;text-decoration:none;color:var(--text2);font-size:12px;padding:4px 8px;border-radius:6px;border-left:2px solid transparent}
.man-toc-sub a.active{color:var(--accent);border-left-color:var(--accent);background:var(--accent-soft);font-weight:600}
.man-toc-foot{margin-top:18px;padding:12px;border:1px dashed var(--border);border-radius:10px;font-size:11px;color:var(--text3)}
.man-main{overflow:auto;padding:28px 40px 120px;scroll-padding-top:12px}
.man-page{max-width:900px;margin:0 auto}
.man-page p{margin:0 0 12px;max-width:74ch}
.man-runhead{display:flex;justify-content:space-between;gap:10px;font:600 10px var(--man-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--text3);border-top:2px solid var(--text);border-bottom:1px solid var(--border);padding:6px 0;margin:56px 0 18px}
.man-h2{font-size:24px;margin:0 0 6px;display:flex;gap:14px;align-items:baseline;letter-spacing:-.015em}
.man-h3{font-size:18px;margin:34px 0 10px;display:flex;gap:10px;align-items:baseline;letter-spacing:-.01em}
.man-n{font:700 12px var(--man-mono);color:var(--text3)}
.man-h2 .man-n{font-size:16px}
.man-lede{color:var(--text2);font-size:16px;margin:0 0 24px}
.man-small{font-size:12px}
.man-muted{color:var(--text3)}
.man-mono{font-family:var(--man-mono)}
.man-kbd{font:600 12px var(--man-mono);border:1px solid var(--border);border-bottom-width:2px;border-radius:6px;padding:1px 6px;background:var(--man-paper)}
.man-label{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;border:1px solid var(--border);border-radius:5px;padding:1px 6px;background:var(--man-paper2);white-space:nowrap}
.man-path{font-weight:600;color:var(--accent)}
.man-cover{position:relative;overflow:hidden;border-radius:20px;background:#163a66;color:#fff;padding:40px 36px 30px;box-shadow:var(--shadow)}
.man-cover-stripe{position:absolute;right:-60px;top:0;bottom:0;width:240px;background:repeating-linear-gradient(135deg,rgba(255,255,255,.10) 0 18px,transparent 18px 36px)}
.man-cover-kicker{font:700 12px var(--man-mono);letter-spacing:.14em;opacity:.8}
.man-cover-title{font-size:40px;font-weight:800;margin:8px 0 6px;letter-spacing:-.03em;line-height:1.1}
.man-cover-sub{font-size:16px;opacity:.9;max-width:52ch;position:relative}
.man-cover-meta{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;margin-top:26px;background:rgba(255,255,255,.18);border-radius:12px;overflow:hidden;position:relative}
.man-cover-meta div{background:rgba(0,0,0,.16);padding:10px 14px;font-size:13px}
.man-cover-meta b{display:block;font:700 10px var(--man-mono);letter-spacing:.1em;opacity:.7;text-transform:uppercase}
.man-access{margin:16px 0 0;padding:14px 16px;border:1px solid var(--border);border-radius:14px;background:var(--man-paper)}
.man-access-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.man-access-row>i{font-size:22px;color:var(--accent)}
.man-access-row b{display:block}
.man-access-row span{font-size:12px;color:var(--text3)}
.man-preview{margin-left:auto;display:flex;align-items:center;gap:8px;font-size:12px;font-weight:600;color:var(--text2)}
.man-preview select{font:inherit;font-size:13px;padding:6px 10px;border-radius:8px;border:1px solid var(--border);background:var(--input-bg);color:var(--text)}
.man-start{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.man-start-card{display:flex;flex-direction:column;align-items:flex-start;gap:4px;text-align:left;padding:16px;border-radius:14px;border:1px solid var(--border);background:var(--man-paper);cursor:pointer;transition:transform .15s,border-color .15s}
.man-start-card:hover{transform:translateY(-2px);border-color:var(--accent2)}
.man-start-card i{font-size:22px;color:var(--accent)}
.man-start-card span{font-size:13px;color:var(--text3)}
.man-tbl{overflow-x:auto;margin:6px 0 10px}
.man-tbl table{width:100%;border-collapse:collapse;font-size:13px}
.man-tbl th,.man-tbl td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--border3);vertical-align:top}
.man-tbl th{font:700 11px var(--man-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--text3);border-bottom:1px solid var(--border)}
.man-matrix th,.man-matrix td{text-align:center;white-space:nowrap;font-size:12px}
.man-matrix th:first-child,.man-matrix td:first-child{text-align:left}
.man-matrix .man-me{background:var(--accent-soft)}
.man-yes{color:var(--success)}
.man-callout{border-radius:12px;margin:16px 0;overflow:hidden;border:1px solid}
.man-callout-hd{display:flex;align-items:center;gap:8px;padding:6px 14px;font:800 12px var(--man-mono);letter-spacing:.14em}
.man-callout-bd{padding:10px 16px 12px;font-size:14px}
.man-callout-bd p:last-child{margin:0}
.man-warning{border-color:var(--danger);background:var(--danger-soft)}
.man-warning .man-callout-hd{background:var(--danger);color:var(--man-on-alert)}
.man-caution{border-color:var(--warn);background:var(--warn-soft)}
.man-caution .man-callout-hd{background:var(--warn);color:var(--man-on-alert)}
.man-note{border-color:var(--border);background:var(--man-paper)}
.man-note .man-callout-hd{background:var(--accent-soft);color:var(--accent)}
.man-why{border-color:color-mix(in srgb,var(--pal-purple) 45%,transparent);background:color-mix(in srgb,var(--pal-purple) 7%,transparent)}
.man-why .man-callout-hd{background:color-mix(in srgb,var(--pal-purple) 16%,transparent);color:var(--pal-purple)}
.man-cl{border:2px solid var(--text);border-radius:12px;background:var(--man-paper);margin:12px 0 16px;overflow:hidden}
.man-cl-head{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--text);color:var(--bg)}
.man-cl-head b{font:800 13px var(--man-mono);letter-spacing:.12em}
.man-cl-type{font:700 10px var(--man-mono);letter-spacing:.1em;border:1px solid currentColor;border-radius:4px;padding:1px 6px;opacity:.8}
.man-cl-reset{border:1px solid currentColor;background:transparent;border-radius:6px;font:600 11px var(--man-mono) !important;padding:3px 8px;cursor:pointer;opacity:.8;color:inherit !important}
.man-cl-item{width:100%;display:flex;align-items:center;gap:12px;padding:10px 14px;border:0;border-top:1px solid var(--border3);background:transparent;cursor:pointer;text-align:left;font:13px var(--man-mono) !important}
.man-cl-item:hover{background:var(--accent-soft)}
.man-cl-box{width:20px;height:20px;border-radius:5px;border:2px solid var(--text3);display:grid;place-items:center;flex-shrink:0;font-size:14px;color:transparent}
.man-cl-txt{flex:1;display:flex;flex-direction:column;min-width:0}
.man-cl-row{display:flex;align-items:center;gap:10px}
.man-cl-lead{flex:1;border-bottom:2px dotted var(--border);transform:translateY(-4px);min-width:20px}
.man-cl-re{font-weight:800;white-space:nowrap}
.man-cl-hint{font-family:var(--font-sans);font-size:12px;color:var(--text3);margin-top:2px}
.man-cl-item.done{color:var(--text3)}
.man-cl-item.done .man-cl-box{background:var(--success);border-color:var(--success);color:#fff}
.man-cl-item.done .man-cl-re{color:var(--success)}
.man-cl-item.next{background:color-mix(in srgb,var(--warn) 9%,transparent)}
.man-cl-item.next .man-cl-box{border-color:var(--warn)}
.man-cl-foot{padding:10px 14px;border-top:2px solid var(--text);font:800 12px var(--man-mono);letter-spacing:.14em;text-align:center;color:var(--text3)}
.man-cl.complete .man-cl-foot{background:var(--success);color:var(--man-on-alert)}
.man-diagram{border-radius:16px;overflow:hidden;border:1px solid var(--border);background:var(--man-paper2)}
.man-diagram svg{display:block;width:100%;height:auto}
.man-svg-card{fill:var(--man-paper);stroke:var(--border)}
.man-svg-bar{fill:var(--border)}
.man-zone{fill:transparent;stroke:transparent;stroke-width:2;transition:fill .15s,stroke .15s}
.man-zone.on{fill:color-mix(in srgb,var(--warn) 14%,transparent);stroke:var(--warn)}
.man-hot{cursor:pointer}
.man-hot circle{fill:var(--accent)}
.man-hot text{fill:#fff;font:700 12px var(--man-mono);pointer-events:none}
.man-hot.on circle{fill:var(--warn)}
.man-legend{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 16px;margin-top:12px}
.man-legend button{display:flex;gap:10px;align-items:flex-start;text-align:left;border:1px solid transparent;background:transparent;padding:8px;border-radius:10px;cursor:pointer}
.man-legend button:hover,.man-legend button.on{border-color:var(--border);background:var(--man-paper)}
.man-legend b{display:block;font-size:13px}
.man-legend button span span{font-size:12px;color:var(--text3)}
.man-dot{flex-shrink:0;width:22px;height:22px;border-radius:50%;background:var(--accent);color:#fff;font:700 11px var(--man-mono);display:grid;place-items:center}
.man-legend button.on .man-dot{background:var(--warn)}
.man-flow{display:grid;grid-template-columns:1fr 36px 1.2fr 36px 1fr;align-items:center;margin:16px 0}
.man-blk{border:1px solid var(--border);background:var(--man-paper);border-radius:12px;padding:12px 14px;font-size:13px}
.man-blk b{display:block;margin-bottom:4px}
.man-arr{text-align:center;color:var(--text3);font-size:20px}
.man-mk{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
.man-mk span{font:600 10px var(--man-mono);padding:2px 6px;border-radius:5px;background:var(--accent-soft);color:var(--accent)}
.man-annun{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding:12px;background:#11151d;border-radius:14px;border:3px solid #2a303b}
.man-ann{border-radius:6px;padding:12px 6px;text-align:center;font:800 12px var(--man-mono) !important;letter-spacing:.1em;border:1px solid #000;cursor:pointer;color:#5b6270 !important;background:#1c212b;transition:background .15s,box-shadow .15s}
.man-ann.lit.man-ann-g{background:#0f3b22;color:#5ff59a !important;box-shadow:0 0 18px rgba(95,245,154,.35),inset 0 0 12px rgba(95,245,154,.25)}
.man-ann.lit.man-ann-a{background:#3d2a07;color:#ffc24d !important;box-shadow:0 0 18px rgba(255,194,77,.35),inset 0 0 12px rgba(255,194,77,.25)}
.man-ann.lit.man-ann-r{background:#3d0c12;color:#ff6b78 !important;box-shadow:0 0 18px rgba(255,107,120,.35),inset 0 0 12px rgba(255,107,120,.25)}
.man-ann.lit.man-ann-s{background:#2a2e36;color:#d4d8e0 !important;box-shadow:inset 0 0 12px rgba(255,255,255,.12)}
.man-ann-read{margin-top:10px;min-height:70px;padding:14px 16px;border:1px solid var(--border);border-radius:14px;background:var(--man-paper);font-size:13px}
.man-ann-read p{margin:6px 0 0}
.man-gate{display:grid;grid-template-columns:repeat(5,minmax(0,1fr)) 60px 1fr;gap:8px;align-items:center;margin:14px 0}
.man-gate label{display:flex;flex-direction:column;align-items:center;gap:6px;font-size:11px;text-align:center;padding:10px 4px;border:1px solid var(--border);border-radius:10px;background:var(--man-paper);cursor:pointer}
.man-gate input{width:18px;height:18px;accent-color:var(--success)}
.man-and{font:800 13px var(--man-mono);text-align:center;color:var(--text3)}
.man-out{font:800 13px var(--man-mono);letter-spacing:.08em;text-align:center;padding:14px 8px;border-radius:10px}
.man-out.man-fit{background:var(--success-soft);color:var(--success);border:1px solid var(--success)}
.man-out.man-no{background:var(--danger-soft);color:var(--danger);border:1px solid var(--danger)}
.man-acc{border:1px solid var(--border);border-radius:14px;background:var(--man-paper);margin:10px 0;overflow:hidden}
.man-acc-btn{width:100%;display:flex;gap:12px;align-items:center;padding:14px 16px;border:0;background:transparent;cursor:pointer;text-align:left}
.man-acc-btn b{display:block;font-size:14px}
.man-acc-btn span span{font-size:12px;color:var(--text3)}
.man-acc-ic{font-size:20px;width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:#fff;flex-shrink:0}
.man-acc-car{margin-left:auto;transition:transform .2s;color:var(--text3)}
.man-acc.open .man-acc-car{transform:rotate(180deg)}
.man-acc-bd{display:none;padding:0 16px 16px 64px}
.man-acc.open .man-acc-bd{display:block}
.man-spec{display:grid;grid-template-columns:110px 1fr;gap:6px 14px;font-size:13px;margin:4px 0 0}
.man-spec dt{font:700 11px var(--man-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--text3);padding-top:2px}
.man-spec dd{margin:0}
.man-spec ol{margin:0;padding-left:18px}
.man-shots{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:14px}
.man-shot{border:1px solid var(--border);border-radius:10px;padding:0;overflow:hidden;background:#0d1117;cursor:zoom-in;display:flex;flex-direction:column}
.man-shot img{width:100%;height:90px;object-fit:cover;object-position:center;display:block}
.man-shot span{font-size:11px;font-weight:600;padding:5px 8px;color:#e8eaf0;text-align:left}
.man-qrh-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.man-qrh{border-radius:14px;overflow:hidden;border:2px solid var(--warn);background:var(--man-paper)}
.man-qrh.man-red{border-color:var(--danger)}
.man-qrh-hd{display:flex;justify-content:space-between;gap:8px;align-items:center;padding:8px 12px;background:var(--warn);color:var(--man-on-alert);font:800 12px var(--man-mono);letter-spacing:.08em}
.man-qrh.man-red .man-qrh-hd{background:var(--danger)}
.man-qrh-bd{padding:12px 14px;font-size:13px}
.man-qrh-bd ol{margin:6px 0 0;padding-left:18px}
.man-sym{color:var(--text3);font-size:12px;margin-bottom:8px}
.man-memory{border:2px solid var(--text);border-radius:8px;padding:8px 10px;margin:8px 0;font:700 12px var(--man-mono)}
.man-memory small{display:block;font:700 9px var(--man-mono);letter-spacing:.14em;color:var(--text3);margin-bottom:4px}
.man-hf-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.man-hf{border:1px solid var(--border);border-radius:14px;background:var(--man-paper);padding:16px}
.man-hf-t{display:flex;gap:10px;align-items:center;margin-bottom:6px}
.man-hf-t i{font-size:20px;color:var(--pal-purple)}
.man-hf-src{font:11px var(--man-mono);color:var(--text3)}
.man-hf-use{margin-top:10px;display:grid;gap:6px;font-size:13px}
.man-hf-use div{display:flex;gap:8px}
.man-hf-use em{font-style:normal;font:700 10px var(--man-mono);letter-spacing:.08em;color:var(--text3);width:64px;flex-shrink:0;padding-top:3px}
.man-q{border:1px solid var(--border);border-radius:14px;background:var(--man-paper);padding:16px;margin:12px 0}
.man-q>b{display:block;margin-bottom:10px}
.man-opt{display:block;width:100%;text-align:left;border:1px solid var(--border);background:var(--man-paper2);border-radius:10px;padding:9px 12px;margin:6px 0;cursor:pointer;font-size:14px}
.man-opt:hover{border-color:var(--accent2)}
.man-opt.right{border-color:var(--success);background:var(--success-soft)}
.man-opt.wrong{border-color:var(--danger);background:var(--danger-soft)}
.man-fb{font-size:13px;margin-top:8px;display:none}
.man-q.answered .man-fb{display:block}
.man-ok{color:var(--success)}
.man-bad{color:var(--danger)}
.man-score{font:700 14px var(--man-mono)}
.man-cert{display:none;text-align:center;border:3px double var(--success);border-radius:16px;padding:22px;background:var(--success-soft)}
.man-cert.show{display:block}
.man-cert-t{font:800 20px var(--man-mono);letter-spacing:.12em;color:var(--success)}
.man-cert p{margin:8px auto 0}
.man-blank{margin:60px auto 0 !important;text-align:center;font:700 11px var(--man-mono);letter-spacing:.2em;color:var(--text3);text-transform:uppercase}
mark.man-hl{background:color-mix(in srgb,var(--pal-amber) 45%,transparent);color:inherit;border-radius:3px}
@media (max-width:980px){
  .man-shell{grid-template-columns:1fr}
  .man-toc{position:absolute;left:0;top:56px;bottom:0;width:86vw;max-width:340px;z-index:2;transform:translateX(-102%);transition:transform .25s;box-shadow:var(--shadow)}
  .man-overlay.nav-open .man-toc{transform:none}
  .man-menu-btn{display:grid}
  .man-main{padding:20px 16px 100px}
  .man-currency span,.man-brand small{display:none}
  .man-start,.man-hf-grid,.man-qrh-grid,.man-legend{grid-template-columns:1fr}
  .man-cover{padding:28px 20px}.man-cover-title{font-size:30px}
  .man-cover-meta{grid-template-columns:repeat(2,minmax(0,1fr))}
  .man-flow{grid-template-columns:1fr}.man-arr{transform:rotate(90deg)}
  .man-gate{grid-template-columns:repeat(3,minmax(0,1fr))}.man-and{display:none}.man-out{grid-column:1/-1}
  .man-annun{grid-template-columns:repeat(2,minmax(0,1fr))}
  .man-shots{grid-template-columns:repeat(2,minmax(0,1fr))}
  .man-acc-bd{padding:0 16px 16px}
  .man-spec{grid-template-columns:1fr}
  .man-cl-item{font-size:12px !important}
  .man-cl-row{flex-direction:column;align-items:flex-start;gap:2px}
  .man-cl-lead{display:none}
  .man-cl-re{white-space:normal;color:var(--accent)}
  .man-cl-head{flex-wrap:wrap}
}
@media (max-width:560px){
  .man-currency{display:none}
  .man-top{gap:8px;padding:0 10px}
  .man-brand{font-size:13px}
  .man-brand-mark{display:none}
}
@media print{.man-toc,.man-top{display:none}.man-overlay{position:static}.man-shell{display:block}.man-cl,.man-qrh,.man-callout{break-inside:avoid}}
