/*
 * 30/10/2026 (rodada 69, agente R69-B): o "Carregando" moderno, um arquivo para os três temas (docs/RODADA_69.md, item 6).
 * Carregado depois dos estilos de cada tema: o app (themes/cafeapp/_theme.php), o admin (themes/cafeadm/_admin.php e _login.php)
 * e o site, inclusive a casca enxuta do entrar, do 2FA e do recuperar (themes/carteiraazulweb/_theme.php), que não tinha estilo
 * nenhum para a camada: o texto ficava solto no topo da página.
 * A marcação continua a de antes (.ajax_load > .ajax_load_box > .ajax_load_box_circle + .ajax_load_box_title) e os scripts
 * continuam mostrando a camada com o fadeIn do jQuery (display: flex em linha); o display fica com eles e com as regras antigas.
 * Os seletores começam por "html" e passam pelo "body" para vencer, em qualquer ordem, as regras antigas (.ajax_load no style.css
 * do app e do site e no shared/styles/boot.css; html.adm-dark .ajax_load no admin-app.css).
 * O cartão e o escurecido só aparecem depois de 0,25 s: o pedido rápido não pisca nada. A camada transparente segura os toques
 * desde o primeiro instante (sem clique duplo). O leitor de tela fica com shared/scripts/ca-loading.js.
 */
html body .ajax_load {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 9999999;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    padding: 16px;
    background: transparent;
    cursor: progress;
}
/* O escurecido da tela atrás, um pouco desfocado. */
html body .ajax_load::before {
    content: "";
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: rgba(15, 23, 42, .45);
    animation: ca-loading-dim .16s ease-out .25s both;
}
@supports ((-webkit-backdrop-filter: blur(2px)) or (backdrop-filter: blur(2px))) {
    html body .ajax_load::before {
        background: rgba(15, 23, 42, .32);
        -webkit-backdrop-filter: blur(2px);
        backdrop-filter: blur(2px);
    }
}
/* O cartão centrado. */
html body .ajax_load_box {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 14px;
    box-sizing: border-box;
    min-width: 200px;
    max-width: min(320px, 100%);
    margin: auto;
    padding: 22px 26px 20px;
    border: 1px solid #e4e9f2;
    border-radius: 16px;
    background: #fff;
    box-shadow: 0 24px 48px -20px rgba(15, 23, 42, .45);
    color: #1c2b3d;
    text-align: center;
    text-shadow: none;
    animation: ca-loading-in .16s ease-out .25s both;
}
/* O anel pequeno (o nome da animação é novo, para não brigar com o "spin" das folhas antigas). */
html body .ajax_load_box_circle {
    flex: none;
    box-sizing: border-box;
    width: 36px;
    height: 36px;
    margin: 0;
    border: 3.5px solid #dbe7fb;
    border-top-color: #0d6efd;
    border-radius: 50%;
    animation: ca-loading-spin .8s linear infinite;
}
html body .ajax_load_box_title {
    margin: 0;
    color: #1c2b3d;
    font-size: .95rem;
    font-weight: 600;
    line-height: 1.4;
    text-shadow: none;
    overflow-wrap: anywhere;
}
/* A região que o ca-loading.js usa para o leitor de tela (fora da vista). */
html body .ca-loading-status {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    margin: -1px !important;
    padding: 0 !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

/* O escuro pelos três jeitos de cada tema: body.dark-mode (app), html.dark-mode e html.adm-dark (admin) e html[data-theme="dark"] (site). */
html.dark-mode body .ajax_load,
html body.dark-mode .ajax_load,
html.adm-dark body .ajax_load,
html[data-theme="dark"] body .ajax_load {
    background: transparent;
}
html.dark-mode body .ajax_load::before,
html body.dark-mode .ajax_load::before,
html.adm-dark body .ajax_load::before,
html[data-theme="dark"] body .ajax_load::before {
    background: rgba(0, 0, 0, .55);
}
html.dark-mode body .ajax_load_box,
html body.dark-mode .ajax_load_box,
html.adm-dark body .ajax_load_box,
html[data-theme="dark"] body .ajax_load_box {
    border-color: #36424f;
    background: #1d2530;
    box-shadow: 0 24px 48px -20px rgba(0, 0, 0, .7);
    color: #e7eef8;
}
html.dark-mode body .ajax_load_box_circle,
html body.dark-mode .ajax_load_box_circle,
html.adm-dark body .ajax_load_box_circle,
html[data-theme="dark"] body .ajax_load_box_circle {
    border-color: #2b3a4f;
    border-top-color: #6ea8fe;
}
html.dark-mode body .ajax_load_box_title,
html body.dark-mode .ajax_load_box_title,
html.adm-dark body .ajax_load_box_title,
html[data-theme="dark"] body .ajax_load_box_title {
    color: #e7eef8;
}

@keyframes ca-loading-in {
    from { opacity: 0; transform: translateY(6px) scale(.98); }
    to { opacity: 1; transform: none; }
}
@keyframes ca-loading-dim {
    from { opacity: 0; }
    to { opacity: 1; }
}
@keyframes ca-loading-spin {
    to { transform: rotate(360deg); }
}

/* Reduzir movimento: sem a entrada (o cartão aparece depois dos mesmos 0,25 s, de uma vez) e o anel girando devagar. O !important
   vence o "* { animation-duration: .01ms !important }" do release-polish.css do app, que deixaria o anel parado. */
@media (prefers-reduced-motion: reduce) {
    html body .ajax_load::before,
    html body .ajax_load_box {
        animation-duration: .01ms;
    }
    html body .ajax_load_box_circle {
        animation-duration: 2.4s !important;
        animation-iteration-count: infinite !important;
    }
}
/* Reduzir transparência (iOS e macOS): sem o desfoque, o escurecido mais forte. */
@media (prefers-reduced-transparency: reduce) {
    html body .ajax_load::before {
        background: rgba(15, 23, 42, .45);
        -webkit-backdrop-filter: none;
        backdrop-filter: none;
    }
}
