/* Test-mode rendering. Scoped entirely to html[data-defex-test="1"], which js/testHooks.js sets
   only when the harness has opted in (?testhooks=1 or localStorage defexTestHooks=1) — so this
   file is a no-op for real users.

   Transitions and ripples are wall-clock cost with no observer in an automated run, and a click
   that lands mid-animation is a large share of Playwright flake: MudBlazor's dialog fade moves
   the button under the cursor, and the ripple keeps a stale overlay above it. Turning motion off
   makes each step land on a settled layout. */
html[data-defex-test="1"],
html[data-defex-test="1"] *,
html[data-defex-test="1"] *::before,
html[data-defex-test="1"] *::after {
    transition-duration: 0ms !important;
    animation-duration: 0ms !important;
    animation-delay: 0ms !important;
    transition-delay: 0ms !important;
    scroll-behavior: auto !important;
}

/* Do NOT hide `.mud-ripple` — MudBlazor puts that class on the BUTTON, not on the ripple overlay,
   so `display: none` on it hides every ripple-enabled control in the app. (Measured: it made
   /clients' Add Client button 0x0 and `getByRole` stop resolving it, which reads exactly like a
   permission bug.) The zeroed animation-duration above already retires the ripple immediately;
   this just stops a lingering overlay from swallowing the next click. */
html[data-defex-test="1"] .mud-ripple-circle {
    pointer-events: none !important;
    opacity: 0 !important;
}
