/* Presentation only: no delayed actions, hidden alert text, or polling-driven motion. */
:root {
  --motion-control-duration:150ms;
  --motion-section-duration:210ms;
  --motion-status-duration:480ms;
  --motion-ease:cubic-bezier(.2,.7,.2,1);
  --motion-hover-shadow:0 3px 9px color-mix(in srgb,var(--ink) 10%,transparent);
  --motion-status-halo:color-mix(in srgb,var(--accent) 23%,transparent);
}

/* Whole workspaces can contain emergency actions; never animate their ancestors. */
.workspace,.dashboard,.trade-modal[open],.auth-card.has-error,
.auth-wrap::before,.auth-wrap::after,.auth-card-glow,
.signal-head i,.secure-kicker span,.signal-bars i,.signal-sweep,.signal-node,
.status-dot,.pulse-dot,.policy-evidence-item>i,.session-state-live::before,
.session-state.running .session-state-marker {
  animation:none;
}
.auth-submit::before,.button-arrow { transition:none; }
.auth-submit:hover .button-arrow { transform:none; }
.auth-submit:hover,.auth-submit:active,.funnel-stage:hover,
.broker-access-actions a:hover { transform:none; }

/* Worker state is evidence, not a promise that a browser request is progressing. */
[data-activity="busy"]::before,.button-spinner,
.evidence-shell-state.is-loading::before { animation:none; }
button[data-activity="busy"]::before,
.workspace-loading[data-activity="busy"]::before,
[aria-busy="true"][data-activity="busy"]::before {
  animation:quant3-working .9s linear infinite;
}
button[data-activity="busy"] .button-spinner {
  animation:spin .9s linear infinite;
}
[aria-busy="true"] > .evidence-shell-state.is-loading::before {
  animation:evidenceStateSpin 1s linear infinite;
}
#session-activity [data-activity]::before { animation:none; }

/* Existing status colors and focus outlines remain authoritative in every theme. */
button,button[class],.broker-access-actions a,summary,
.signal-summary-card,.ip-period {
  transition:color var(--motion-control-duration) var(--motion-ease),
    background-color var(--motion-control-duration) var(--motion-ease),
    border-color var(--motion-control-duration) var(--motion-ease),
    box-shadow var(--motion-control-duration) var(--motion-ease),
    translate var(--motion-control-duration) var(--motion-ease);
}

@media (hover:hover) and (pointer:fine) and (prefers-reduced-motion:no-preference) {
  button:not(:disabled):not([aria-disabled="true"]):not(.danger):not(#emergency-stop):not(.password-toggle):not(.nav-tab):hover,
  .broker-access-actions a:not(.danger):hover,
  .signal-summary-card:hover,.ip-period:hover {
    translate:0 -1px;
    box-shadow:var(--motion-hover-shadow);
  }
}

@media (prefers-reduced-motion:no-preference) {
  /* The controller opts in only newly visible, noncritical content. */
  .motion-enter:not(:is(.danger,[role="alert"],[aria-live="assertive"],#study-deadline-notice,#ip-message,#ip-methodology)):not(:has(:is(#emergency-stop,.danger,[role="alert"],[aria-live="assertive"],#study-deadline-notice,#ip-message,#ip-methodology))) {
    animation:quant3-section-enter var(--motion-section-duration) var(--motion-ease);
  }
  dialog.motion-dialog[open]:not(:has(:is(#emergency-stop,.danger,[role="alert"],[aria-live="assertive"]))) {
    animation:quant3-dialog-enter var(--motion-section-duration) var(--motion-ease);
  }
  .motion-status-change {
    animation:quant3-status-change var(--motion-status-duration) ease-out;
  }

  /* Delayed content-visibility alone leaves closed controls in the tab order.
     Animate disclosures only where CSS can make their contents inert immediately.
     Other browsers retain the native, immediate open/close behavior. */
  @supports (interactivity:inert) and (interpolate-size:allow-keywords) and (transition-behavior:allow-discrete) and selector(details::details-content) {
    :is(.workspace-details,.policy-edit-details,.account-summary,.chart-key,.ip-history-detail,.trade-provenance,.easy-requirements):not([open]) > :not(summary) {
      interactivity:inert;
    }
    :is(.workspace-details,.policy-edit-details,.account-summary,.chart-key,.ip-history-detail,.trade-provenance,.easy-requirements):not(:has(:is(#emergency-stop,.danger,[role="alert"],[aria-live="assertive"]))) {
      interpolate-size:allow-keywords;
    }
    :is(.workspace-details,.policy-edit-details,.account-summary,.chart-key,.ip-history-detail,.trade-provenance,.easy-requirements):not(:has(:is(#emergency-stop,.danger,[role="alert"],[aria-live="assertive"])))::details-content {
      block-size:0;
      overflow:clip;
      transition:block-size var(--motion-section-duration) var(--motion-ease),
        content-visibility var(--motion-section-duration) allow-discrete;
    }
    :is(.workspace-details,.policy-edit-details,.account-summary,.chart-key,.ip-history-detail,.trade-provenance,.easy-requirements)[open]:not(:has(:is(#emergency-stop,.danger,[role="alert"],[aria-live="assertive"])))::details-content {
      block-size:auto;
    }
  }
}

@keyframes quant3-section-enter {
  from { opacity:.92; transform:translateY(4px); }
  to { opacity:1; transform:none; }
}
@keyframes quant3-dialog-enter {
  from { opacity:.94; transform:scale(.99); }
  to { opacity:1; transform:none; }
}
@keyframes quant3-status-change {
  from { box-shadow:0 0 0 3px var(--motion-status-halo); }
  to { box-shadow:0 0 0 0 transparent; }
}

/* Critical controls and alerts update immediately, including while hovered. */
#emergency-stop,.danger,[role="alert"],[aria-live="assertive"] {
  animation:none!important;
  transition:none!important;
  translate:none!important;
}

/* Also cancel inherited legacy motion when this preference changes mid-session. */
@media (prefers-reduced-motion:reduce),print {
  *,*::before,*::after,details::details-content,dialog::backdrop {
    animation:none!important;
    transition:none!important;
    scroll-behavior:auto!important;
  }
  .motion-enter,.motion-status-change,dialog.motion-dialog[open] {
    opacity:1;
    transform:none;
  }
  button,.broker-access-actions a,.signal-summary-card,.ip-period { translate:none; }
}
