/* Shared button polish for CPM and PTS: shimmer, press, morph, loading/done states, dirty pulse. Pure CSS + ui-buttons.js. */
.btn-top,.btn-mini,.btn-clear,.btn-link-file,.auth-btn,.ceo-btn,.save-btn{
  transition:background-color .18s,border-color .18s,color .18s,box-shadow .18s,transform .12s,border-radius .18s,filter .18s;
}
.btn-top:not(:disabled):hover,.btn-mini:not(:disabled):hover,.btn-clear:hover,.btn-link-file:hover{
  border-radius:8px;box-shadow:0 2px 8px rgba(60,40,30,.18);
}
.btn-top:not(:disabled):active,.btn-mini:not(:disabled):active,.btn-clear:active,.btn-link-file:active,.auth-btn:active{
  transform:scale(.96);box-shadow:none;
}
/* Shimmer on primary buttons: a light band sweeps across on hover */
.btn-top-primary:not(:disabled):hover,.btn-mini-primary:not(:disabled):hover,.btn-link-file:hover,.auth-btn:hover{
  background-image:linear-gradient(110deg,transparent 35%,rgba(255,255,255,.32) 50%,transparent 65%);
  background-size:250% 100%;background-repeat:no-repeat;animation:uib-shimmer .9s ease-out 1;
}
@keyframes uib-shimmer{from{background-position:130% 0}to{background-position:-30% 0}}
/* Danger buttons: fill in on hover */
.btn-mini-danger:not(:disabled):hover,.btn-danger:not(:disabled):hover{background:#c84a3c;border-color:#c84a3c;color:#fff}
/* Unsaved changes: the Save button breathes */
.btn-top.dirty{animation:uib-pulse 1.8s ease-in-out infinite}
@keyframes uib-pulse{0%,100%{box-shadow:0 0 0 0 rgba(220,138,74,.55)}50%{box-shadow:0 0 0 5px rgba(220,138,74,0)}}
/* Run action: spinner while working, tick when done, shake on error */
.uib-run{position:relative}
.uib-run.is-loading{pointer-events:none;opacity:.85}
.uib-run.is-loading::before{content:"";display:inline-block;width:10px;height:10px;margin-right:5px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:uib-spin .6s linear infinite;vertical-align:-1px}
.uib-run.is-done{background:#2e8b57 !important;border-color:#2e8b57 !important;color:#fff !important;animation:uib-pop .3s ease-out}
.uib-run.is-done::before{content:"\2713";margin-right:5px;font-weight:700}
.uib-run.is-error{animation:uib-shake .35s}
@keyframes uib-spin{to{transform:rotate(360deg)}}
@keyframes uib-pop{0%{transform:scale(.92)}60%{transform:scale(1.05)}100%{transform:scale(1)}}
@keyframes uib-shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-3px)}75%{transform:translateX(3px)}}
@media (prefers-reduced-motion:reduce){.btn-top,.btn-mini,.uib-run,.btn-top.dirty{animation:none !important;transition:none !important}}
