/* Hover states, generated 2026-08-05 from inline onmouseover/onmouseout handlers.
 *
 * These were JS: `onmouseover="this.style.background='#f8f9ff'"` and a matching
 * onmouseout. That is what :hover does natively, so the JS ran on every pointer move for
 * no reason (an INP cost), and no CSP can whitelist an inline handler — removing them is a
 * prerequisite for enforcing script-src.
 *
 * Only the HOVER state is emitted. The resting state is deliberately left alone: it comes
 * from the element's inline style, a class, or the browser default, exactly as before the
 * first hover. Emitting a resting rule too would change how elements look before any
 * interaction, since the old onmouseout often restored a shorthand or a default the inline
 * style never declared.
 *
 * !important is required, not sloppiness: these elements carry their base colours in an
 * inline style attribute, which outranks any stylesheet rule.
 */
.hv-0079ab:hover{border-color:#EA580C !important;box-shadow:0 4px 16px rgba(234,88,12,.1) !important;}
.hv-01b399:hover{transform:translateY(-4px) !important;box-shadow:0 12px 28px rgba(234,88,12,.12) !important;}
.hv-0212c0:hover{transform:translateY(-3px) !important;}
.hv-02738e:hover{background:rgba(0,0,0,.55) !important;}
.hv-063b69:hover{background:#C2410C !important;}
.hv-0fd98d:hover{transform:scale(1.01) !important;}
.hv-130d8a:hover{box-shadow:0 12px 28px rgba(234,88,12,.12) !important;transform:translateY(-4px) !important;border-color:#EA580C !important;}
.hv-169ff4:hover{border-color:var(--accent) !important;}
.hv-17128b:hover{background:var(--accent-hover) !important;}
.hv-1c4366:hover{color:#fff !important;}
.hv-25cc48:hover{box-shadow:0 6px 24px rgba(234,88,12,.08) !important;}
.hv-2614f3:hover{background:#F5F4F2 !important;}
.hv-2e955c:hover{box-shadow:0 8px 28px rgba(0,0,0,.1) !important;transform:translateY(-3px) !important;}
.hv-36c31a:hover{transform:scale(1.08) !important;}
.hv-379804:hover{border-color:#FED7AA !important;box-shadow:0 3px 12px rgba(234,88,12,.10) !important;}
.hv-381967:hover{color:var(--accent) !important;}
.hv-3b8d81:hover{box-shadow:0 4px 16px rgba(0,0,0,.06) !important;}
.hv-41ef4e:hover{border-color:#EA580C !important;}
.hv-42fcb1:hover{transform:translateY(-2px) !important;box-shadow:0 4px 16px rgba(234,88,12,.12) !important;}
.hv-434b60:hover{background:#cffafe !important;}
.hv-445c9a:hover{opacity:.9 !important;}
.hv-48a48a:hover{background:#F8FAFC !important;border-color:#CBD5E1 !important;}
.hv-5362fe:hover{border-color:#EA580C !important;box-shadow:0 4px 12px rgba(234,88,12,.1) !important;}
.hv-55610d:hover{border-color:var(--accent) !important;box-shadow:0 2px 8px rgba(233,69,96,.08) !important;}
.hv-576d10:hover{transform:scale(1.04) !important;}
.hv-5e31d1:hover{filter:brightness(1.1) !important;}
.hv-60a42e:hover{transform:translateY(-2px) !important;box-shadow:0 8px 20px rgba(234,88,12,.10) !important;}
.hv-782149:hover{border-color:#F59E0B !important;box-shadow:0 4px 16px rgba(245,158,11,.15) !important;}
.hv-7b15eb:hover{background:#EA580C !important;color:#fff !important;border-color:#EA580C !important;}
.hv-7b51cf:hover{border-color:var(--accent) !important;color:var(--accent) !important;}
.hv-9cbb31:hover{transform:translateY(-4px) !important;box-shadow:0 12px 28px rgba(28,25,23,0.12) !important;}
.hv-9df2e5:hover{transform:translateY(-3px) !important;box-shadow:0 8px 24px rgba(234,88,12,.12) !important;}
.hv-a1f74a:hover{border-color:var(--accent) !important;box-shadow:0 4px 12px rgba(233,69,96,.1) !important;}
.hv-a672b0:hover{background:#f8f9ff !important;color:var(--accent) !important;}
.hv-aae402:hover{border-color:var(--accent) !important;box-shadow:0 4px 12px rgba(0,0,0,.05) !important;}
.hv-abb84a:hover{transform:scale(1.03) !important;}
.hv-acc8b6:hover{border-color:var(--accent) !important;box-shadow:0 8px 28px rgba(0,0,0,.07) !important;transform:translateY(-3px) !important;}
.hv-af3a8f:hover{background:#f8f9ff !important;}
.hv-b3814b:hover{box-shadow:0 8px 28px rgba(0,0,0,.08) !important;transform:translateY(-3px) !important;}
.hv-b5a8e6:hover{opacity:0.9 !important;}
.hv-b5cd10:hover{background:#f5f5f7 !important;}
.hv-bf3f0e:hover{border-color:var(--accent) !important;box-shadow:0 4px 12px rgba(0,0,0,.04) !important;}
.hv-c2f0fe:hover{opacity:.85 !important;}
.hv-c53377:hover{background:#E2E8F0 !important;color:#475569 !important;}
.hv-c68a03:hover{border-color:var(--accent) !important;color:var(--accent) !important;background:#fff8f0 !important;}
.hv-c80fc5:hover{border-color:var(--accent) !important;background:var(--accent) !important;color:#fff !important;}
.hv-c9ccaa:hover{transform:scale(1.1) !important;}
.hv-d139e5:hover{background:#EA580C !important;}
.hv-d72930:hover{background:#059669 !important;color:#fff !important;}
.hv-d8c7a9:hover{border-color:#4285f4 !important;}
.hv-d9bf6e:hover{border-color:#EA580C !important;transform:translateY(-2px) !important;box-shadow:0 6px 18px rgba(234,88,12,.08) !important;}
.hv-da7fcb:hover{background:var(--accent) !important;color:#fff !important;}
.hv-e50633:hover{transform:translateY(-1px) !important;}
.hv-e6c3e0:hover{transform:translateY(-2px) !important;}
.hv-e70205:hover{text-decoration:underline !important;}
.hv-e7cf28:hover{box-shadow:0 8px 28px rgba(0,0,0,.07) !important;transform:translateY(-3px) !important;}
.hv-e8f8a6:hover{background:rgba(255,255,255,.3) !important;transform:scale(1.03) !important;}
.hv-ea1106:hover{background:var(--accent) !important;}
.hv-f13bc2:hover{box-shadow:0 6px 24px rgba(0,0,0,.08) !important;}

/* Focus states, generated 2026-08-05 from inline onfocus/onblur pairs.
 * Same reasoning as the hover rules above: :focus is what these were emulating in JS, and
 * an inline handler cannot be whitelisted by any CSP. Only pairs where BOTH sides were pure
 * style-setting are converted — one onblur closes a search dropdown, and dropping that would
 * have removed real behaviour, not styling. */
.fc-169ff4:focus{border-color:var(--accent) !important;}
.fc-41ef4e:focus{border-color:#EA580C !important;}
.fc-8dc420:focus{border-color:#F97316 !important;}

/* Unpaired focus styling: these set a colour on focus with NOTHING to undo it, so the
 * field stayed highlighted for the rest of the page's life. :focus restores on blur, which
 * is what the markup meant — a behaviour fix, not just a CSP one. */

/* Forum search box: the markup wrapped an input in a div and emulated a focus ring with
 * onfocusin/onfocusout, restoring the border after a 200ms timer. :focus-within is the CSS the
 * pair was imitating (a div cannot take :focus). The 200ms restore delay is gone — it existed to
 * outlive a click on the suggestions dropdown, which the border colour never affected. */
.fw-forumsearch:focus-within{border-color:var(--accent) !important;}

/* Header search dropdown rows (books / authors / series). These three were missed by the
   2026-08-05 sweep because they live inside JS string literals in portal-base-data.js, not in
   a template — so grepping the templates found nothing while every page still shipped them.
   That file loads on EVERY page, which is why the homepage reported the violation. */
.hv-fafbfc:hover{background:#fafbfc !important;}

/* Second sweep, 2026-08-07. The 2026-08-05 pass converted the handlers written in TEMPLATES;
   these were written inside JS string literals and built with innerHTML, so grepping the
   templates reported zero while every page still shipped them. A CSP report-only violation on
   the homepage is what surfaced it. */
.hv-f8f9ff-fff:hover{background:#f8f9ff !important;}
.hv-f8f9ff-t:hover{background:#f8f9ff !important;}
.hv-accent-fill:hover{background:var(--accent) !important;color:#fff !important;}
.hv-accent-fill-bordered:hover{background:var(--accent) !important;color:#fff !important;border-color:var(--accent) !important;}

/* Product-page card lift. Was an inline onmouseover/onmouseout pair inside a <script> block in
   product.html — a transform and a box-shadow, which is what :hover and a transition do
   natively and without a main-thread callback on every pointer move. */
.hv-card-lift:hover{box-shadow:0 8px 28px rgba(0,0,0,.07) !important;transform:translateY(-3px);}
