/* Shared indeterminate feedback: activity never implies payment completion. */
.df-loading-ring {
    display: inline-block; flex: 0 0 auto; width: 1.1rem; height: 1.1rem;
    border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%;
    animation: df-loading-turn .85s linear infinite; vertical-align: middle;
}
.btn.df-button-busy, .btn-loading { display: inline-flex; align-items: center; justify-content: center; gap: .55rem; cursor: progress; }
.btn.df-button-busy { min-width: min(var(--df-busy-width, 0px), 100%) !important; max-width: 100%; }
.df-button-busy .df-busy-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.btn.df-button-busy:disabled, .btn-loading:disabled {
    opacity: 1; color: var(--bs-btn-color); background-color: var(--bs-btn-bg); border-color: var(--bs-btn-border-color);
}
.btn-primary.df-button-busy:disabled { color: var(--text-light, #fff); background-color: var(--btn-primary, var(--df-color-brand)); border-color: var(--btn-primary-border, var(--df-color-brand)); }
.btn-secondary.df-button-busy:disabled { color: var(--text-light, #fff); background-color: var(--btn-secondary, #666); border-color: var(--btn-secondary-border, #5c5c5c); }
.btn-danger.df-button-busy:disabled { color: var(--text-light, #fff); background-color: var(--btn-danger, #a51d2d); border-color: var(--btn-danger-border, #a51d2d); }
.df-busy-spinner { margin: 0; }
.df-loading-panel { display: flex; flex-direction: column; align-items: center; gap: .85rem; padding: 2rem 1.25rem; text-align: center; color: var(--df-color-ink, #18202c); }
.df-loading-emblem {
    display: grid; place-items: center; width: 4rem; height: 4rem; margin-bottom: .35rem;
    border: 1px solid var(--df-color-border, #d8dee7); border-radius: 1.25rem;
    background: var(--df-color-surface-subtle, #f7f8fa); color: var(--btn-primary, var(--df-color-brand, #876719));
}
.df-loading-emblem .df-loading-ring { width: 2rem; height: 2rem; border-width: 3px; }
#spinner-modal .modal-dialog { max-width: 420px; margin-right: auto; margin-left: auto; padding: 1rem; }
#spinner-modal .modal-content {
    overflow: hidden; border: 1px solid var(--df-color-border, #d8dee7); border-radius: 1.25rem;
    background: var(--df-color-surface, #fff); box-shadow: 0 1.5rem 5rem rgba(24, 32, 44, .18);
}
#spinner-modal .df-spinner-title { margin: 0; font-size: 1.25rem; line-height: 1.4; font-weight: 600; }
#spinner-modal .df-spinner-body-text { margin: 0; max-width: 32ch; font-size: .9rem; line-height: 1.65; color: var(--df-color-ink-muted, #526071); }
.df-loading-slow { margin: 0; padding-top: .85rem; border-top: 1px solid var(--df-color-border, #d8dee7); font-size: .85rem; line-height: 1.6; color: var(--df-color-ink-muted, #526071); }
.df-inline-loading { display: inline-flex; align-items: center; gap: .5rem; font-size: .85rem; color: var(--df-color-ink-muted, #526071); }
.df-table-loading { display: inline-flex; align-items: center; gap: .65rem; font-size: .9rem; color: var(--df-color-ink, #18202c); }
.dt-container .dt-processing {
    width: auto; min-width: 190px; margin-left: 0; transform: translateX(-50%); padding: 1rem 1.25rem;
    border: 1px solid var(--df-color-border, #d8dee7); border-radius: .85rem; background: var(--df-color-surface, #fff);
    box-shadow: var(--df-shadow-sm, 0 .25rem .75rem rgba(24,32,44,.08));
}
.dt-container .dt-processing > div { display: none; }
.df-route-loading { position: fixed; inset: 0 0 auto; z-index: 1040; height: 3px; overflow: hidden; background: var(--df-color-border, #d8dee7); pointer-events: none; }
.df-route-loading::before { content: ""; display: block; width: 30%; height: 100%; background: var(--btn-primary, var(--df-color-brand, #876719)); animation: df-loading-route 1.2s ease-in-out infinite; }
@keyframes df-loading-route { from { transform: translateX(-110%); } to { transform: translateX(350%); } }
@keyframes df-loading-turn { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
    .df-loading-ring, .df-busy-spinner, .btn-loading .df-spinner { animation: none; }
    #spinner-modal.fade, #spinner-modal.fade .modal-dialog { transition: none; }
    .df-route-loading::before { animation: none; width: 100%; }
}
@media (forced-colors: active) { .df-loading-ring { border-color: ButtonText; border-right-color: transparent; } }
