/* =========================================================================
 * micro-interactions.css — Admin V2
 *
 * Sistema compartilhado de microinterações para o admin v2.
 * Todas as classes usam o prefixo `mi-` (micro-interactions).
 *
 * Conteúdo:
 *   1. Tokens (variáveis CSS de duração/easing)
 *   2. Botões: mi-btn-elevated, mi-btn-elevated-lift, mi-btn-quiet, mi-pressable, mi-icon-tone (stroke/fill SVG)
 *   3. Animações de ícone: spin, rise, tilt, sway, squeeze
 *      (dentro de botão via .mi-btn-icon E standalone via .mi-icon-standalone)
 *   4. Featured icon (container redondo do modal): 5 variantes
 *   5. Modal animado: container, overlay, content, __content-swap
 *   6. Container expansível: mi-collapsible (grid trick)
 *   7. Checkbox v2 animado: mi-checkbox + keyframe mi-checkbox-mark
 *   8. Chosen-drop v2: mi-chosen (override do Chosen.js)
 *   9. Action dropdown ⋮: mi-row-actions-trigger / mi-row-actions-dropdown
 *   9b.Bootstrap button dropdown: mi-bs-dropdown + chevron 0→180°
 *  10. Tooltip animation (override Bootstrap)
 *  11. Reduced motion fallback (obrigatório)
 *
 * Como usar nas views v2:
 *   echo $this->Html->css('v2/micro-interactions');
 * ========================================================================= */


/* -------------------------------------------------------------------------
 * 1. Tokens
 * ------------------------------------------------------------------------- */
:root {
    --mi-ease-emphasized: cubic-bezier(0.22, 1, 0.36, 1);
    --mi-ease-standard:   cubic-bezier(0.4, 0, 0.2, 1);
    --mi-ease-soft:       cubic-bezier(0.45, 0, 0.55, 1);
    --mi-ease-bouncy:     cubic-bezier(0.34, 1.2, 0.64, 1);
    --mi-ease-checkbox:   cubic-bezier(0.33, 1, 0.64, 1);

    --mi-duration-fast:   0.15s;
    --mi-duration-base:   0.22s;
    --mi-duration-modal:  0.28s;

    /* Use o token JS via `getComputedStyle(...).getPropertyValue('--mi-modal-close-ms')` */
    --mi-modal-close-ms:  260;

    --mi-brand:           #FF2B34;
    --mi-focus-ring:      0 0 0 2px rgba(255, 43, 52, 0.35);
}


/* -------------------------------------------------------------------------
 * 2. Botões
 *
 *   .mi-btn-elevated — padrão v2: hover = `background-color` mais escuro (0.18s),
 *                      sem subir; clique = scale(0.97) + inset shadow.
 *
 *   .mi-btn-elevated-lift — modificador (com `mi-btn-elevated`): hover sobe 2px.
 *                            Usar em botões só com ícone (`mi-btn-icon`) ou se o usuário pedir.
 *
 *   .mi-btn-quiet    — botão DISCRETO, não levanta, só muda background no hover.
 *                      Usar em containers apertados (toolbars, barras inline).
 *
 *   .mi-pressable    — utilitário standalone, só o feedback de pressionamento.
 *                      Aplicar em links/cards/tags que devem ter feedback de clique.
 * ------------------------------------------------------------------------- */
.mi-btn-elevated {
    transition:
        transform var(--mi-duration-base) var(--mi-ease-standard),
        box-shadow var(--mi-duration-base) var(--mi-ease-standard),
        background-color 0.18s var(--mi-ease-standard),
        border-color 0.18s var(--mi-ease-standard),
        color 0.18s var(--mi-ease-standard),
        filter var(--mi-duration-fast) ease;
}

.mi-btn-elevated.mi-btn-elevated-lift:hover:not(:active) {
    transform: translateY(-2px);
}

.mi-btn-elevated:active,
.mi-btn-elevated:hover:active {
    transform: scale(0.97);
    box-shadow: inset 0 1px 3px rgba(10, 13, 18, 0.12);
    filter: saturate(0.94);
}

.mi-btn-elevated:focus-visible {
    outline: 2px solid var(--mi-brand);
    outline-offset: 2px;
}

.mi-btn-quiet {
    transition:
        background 0.18s var(--mi-ease-standard),
        background-color 0.18s var(--mi-ease-standard),
        color 0.18s var(--mi-ease-standard),
        border-color 0.18s var(--mi-ease-standard),
        box-shadow var(--mi-duration-base) var(--mi-ease-standard),
        transform var(--mi-duration-base) var(--mi-ease-standard),
        filter var(--mi-duration-fast) ease;
}
.mi-btn-quiet:hover {
    background: #ebebeb;
    color: #181d27;
}
.mi-btn-quiet:active,
.mi-btn-quiet:hover:active {
    /* Feedback de clique unificado: encolhe (scale 0.97) + afunda (inset shadow)
       + dessatura levemente. O transform garante visibilidade do "press" mesmo
       em botões cujo background é fixado com !important (ex: .d_button vermelho
       da marca), onde o inset shadow sozinho sumiria. */
    transform: scale(0.97);
    box-shadow: inset 0 1px 3px rgba(10, 13, 18, 0.12);
    filter: saturate(0.92) brightness(0.97);
}
.mi-btn-quiet:focus-visible {
    outline: 2px solid var(--mi-brand);
    outline-offset: 2px;
}

/*
 *   .mi-pressable        — versão LIMPA (default): só scale + filter.
 *                          Use em links, textos, grupos sem fundo/borda.
 *                          NÃO aplica inset-shadow (que viraria um quadrado
 *                          visível em elementos transparentes).
 *
 *   .mi-pressable-card   — adiciona inset-shadow para parecer "afundar".
 *                          Use SOMENTE em cards/containers com background
 *                          sólido e border-radius próprio.
 */
.mi-pressable,
.mi-pressable-card {
    transition:
        transform var(--mi-duration-base) var(--mi-ease-standard),
        box-shadow var(--mi-duration-base) var(--mi-ease-standard),
        filter var(--mi-duration-base) var(--mi-ease-standard);
}
.mi-pressable:active,
.mi-pressable:hover:active,
.mi-pressable-card:active,
.mi-pressable-card:hover:active {
    transform: scale(0.97);
    filter: saturate(0.94);
}
.mi-pressable-card:active,
.mi-pressable-card:hover:active {
    box-shadow: inset 0 1px 3px rgba(10, 13, 18, 0.12);
}

/**
 * Transição suave em stroke/fill/opacidade de ícones SVG (evita mudança de cor “seca”).
 * Use no wrapper do ícone (ex.: headbar sino, links só com SVG).
 */
.mi-icon-tone svg path,
.mi-icon-tone svg circle,
.mi-icon-tone svg line,
.mi-icon-tone svg polyline,
.mi-icon-tone svg polygon,
.mi-icon-tone svg rect,
.mi-icon-tone svg ellipse {
    transition:
        stroke var(--mi-duration-base) var(--mi-ease-standard),
        fill var(--mi-duration-base) var(--mi-ease-standard),
        opacity var(--mi-duration-base) var(--mi-ease-standard);
}


/* -------------------------------------------------------------------------
 * 3. Animações de ícone
 *
 *   Duas variantes de uso:
 *     - Dentro de botão: <a class="mi-btn-elevated mi-btn-icon mi-icon-spin">
 *     - Standalone:      <a class="mi-icon-standalone mi-icon-spin">
 *
 *   5 animações pré-definidas:
 *     mi-icon-spin    → girar ida-e-volta (engrenagem, settings)
 *     mi-icon-rise    → subir e voltar (padrão genérico)
 *     mi-icon-download → descer e voltar (download, exportar)
 *     mi-icon-tilt    → inclinar lateral (editar, lápis)
 *     mi-icon-sway    → balançar leve (sino, tags)
 *     mi-icon-squeeze → espremer Y (olho, visibility)
 * ------------------------------------------------------------------------- */
.mi-btn-icon .fa, .mi-btn-icon svg,
.mi-icon-standalone .fa, .mi-icon-standalone svg,
svg.mi-icon-standalone, i.mi-icon-standalone {
    transform-origin: 50% 50%;
    transition:
        transform var(--mi-duration-base) var(--mi-ease-standard),
        color 0.14s ease;
    will-change: transform;
}

/* Standalone: ícone "solto", sem background/border. Hover muda cor levemente. */
.mi-icon-standalone {
    color: #5a5a5a;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
/* Garante que .hidden continua funcionando mesmo com a regra acima carregando depois. */
.mi-icon-standalone.hidden {
    display: none;
}
.mi-icon-standalone:hover {
    color: #181d27;
}
.mi-icon-standalone:active {
    transform: scale(0.93);
}
.mi-icon-standalone:focus-visible {
    outline: 2px solid var(--mi-brand);
    outline-offset: 2px;
    border-radius: 4px;
}

/* As animações abaixo aplicam ao filho (.fa::before / svg) — NUNCA ao próprio
 * elemento que carrega `mi-icon-standalone` — para evitar transforms duplicados
 * (pai + filho) que faziam o ícone "viajar" fora do eixo.
 *
 * Caso especial: quando a classe está direto num `<svg>` ou `<i.fa>` (sem
 * wrapper, ex: <svg class="mi-icon-standalone mi-icon-rise"/>), o próprio
 * elemento É o ícone — animamos ele mesmo via os seletores `svg.mi-icon-X` /
 * `i.mi-icon-X` abaixo. */

/* ---- spin: giro curto no lugar 0°→-34°→+26°→0° (idêntico ao tc-mb-cog-hover
 * usado na meta-bar de Trabalhos Científicos). Active: micro-giro -13°. ---- */
.mi-icon-spin:hover .fa::before,
.mi-icon-spin:hover svg,
svg.mi-icon-spin:hover,
i.mi-icon-spin:hover {
    animation: mi-icon-spin-hover 0.68s var(--mi-ease-soft) 1;
}
.mi-icon-spin:active .fa::before,
.mi-icon-spin:active svg,
svg.mi-icon-spin:active,
i.mi-icon-spin:active {
    animation: mi-icon-spin-active 0.26s var(--mi-ease-standard) 1;
}

/* ---- rise: sobe -2px e volta. Active: scale 0.93. ---- */
.mi-icon-rise:hover .fa::before,
.mi-icon-rise:hover svg,
svg.mi-icon-rise:hover,
i.mi-icon-rise:hover {
    animation: mi-icon-rise-hover 0.56s var(--mi-ease-soft) 1;
}
.mi-icon-rise:active .fa::before,
.mi-icon-rise:active svg,
svg.mi-icon-rise:active,
i.mi-icon-rise:active {
    animation: mi-icon-rise-active 0.2s var(--mi-ease-standard) 1;
}

/* ---- tilt: inclina -6° e volta. Active: scale 0.93. ---- */
.mi-icon-tilt:hover .fa::before,
.mi-icon-tilt:hover svg,
svg.mi-icon-tilt:hover,
i.mi-icon-tilt:hover {
    animation: mi-icon-tilt-hover 0.48s var(--mi-ease-standard) 1;
}
.mi-icon-tilt:active .fa::before,
.mi-icon-tilt:active svg,
svg.mi-icon-tilt:active,
i.mi-icon-tilt:active {
    animation: mi-icon-tilt-active 0.2s var(--mi-ease-standard) 1;
}

/* ---- sway: balança -4°/+4°. Active: rotate -7°. ---- */
.mi-icon-sway:hover .fa::before,
.mi-icon-sway:hover svg,
svg.mi-icon-sway:hover,
i.mi-icon-sway:hover {
    animation: mi-icon-sway-hover 0.62s var(--mi-ease-soft) 1;
}
.mi-icon-sway:active .fa::before,
.mi-icon-sway:active svg,
svg.mi-icon-sway:active,
i.mi-icon-sway:active {
    animation: mi-icon-sway-active 0.22s var(--mi-ease-standard) 1;
}

/* ---- squeeze: espreme Y (scaleY 0.72/1.06/1). Active: scale 0.93. ---- */
.mi-icon-squeeze:hover .fa::before,
.mi-icon-squeeze:hover svg,
svg.mi-icon-squeeze:hover,
i.mi-icon-squeeze:hover {
    animation: mi-icon-squeeze-hover 0.42s var(--mi-ease-standard) 1;
}
.mi-icon-squeeze:active .fa::before,
.mi-icon-squeeze:active svg,
svg.mi-icon-squeeze:active,
i.mi-icon-squeeze:active {
    animation: mi-icon-squeeze-active 0.2s var(--mi-ease-standard) 1;
}

@keyframes mi-icon-spin-hover {
    0%, 100% { transform: rotate(0deg); }
    35%      { transform: rotate(-34deg); }
    65%      { transform: rotate(26deg); }
}
@keyframes mi-icon-spin-active {
    0%   { transform: rotate(0deg); }
    55%  { transform: rotate(-13deg); }
    100% { transform: rotate(0deg); }
}

@keyframes mi-icon-rise-hover {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-2px); }
}
@keyframes mi-icon-rise-active {
    0%   { transform: scale(1); }
    100% { transform: scale(0.93); }
}

/* ---- download: desce +2px e volta. Active: scale 0.93. ---- */
.mi-icon-download:hover .fa::before,
.mi-icon-download:hover svg,
svg.mi-icon-download:hover,
i.mi-icon-download:hover {
    animation: mi-icon-download-hover 0.56s var(--mi-ease-soft) 1;
}
.mi-icon-download:active .fa::before,
.mi-icon-download:active svg,
svg.mi-icon-download:active,
i.mi-icon-download:active {
    animation: mi-icon-download-active 0.2s var(--mi-ease-standard) 1;
}

@keyframes mi-icon-download-hover {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(2px); }
}
@keyframes mi-icon-download-active {
    0%   { transform: scale(1); }
    100% { transform: scale(0.93); }
}

@keyframes mi-icon-tilt-hover {
    0%   { transform: rotate(0deg); }
    40%  { transform: rotate(-6deg); }
    100% { transform: rotate(0deg); }
}
@keyframes mi-icon-tilt-active {
    0%   { transform: scale(1); }
    100% { transform: scale(0.93); }
}

@keyframes mi-icon-sway-hover {
    0%, 100% { transform: rotate(-4deg); }
    50%      { transform: rotate(4deg); }
}
@keyframes mi-icon-sway-active {
    0%   { transform: rotate(0deg); }
    100% { transform: rotate(-7deg); }
}

@keyframes mi-icon-squeeze-hover {
    0%   { transform: scaleY(1) scaleX(1); }
    30%  { transform: scaleY(0.72) scaleX(1.02); }
    55%  { transform: scaleY(1.06) scaleX(0.98); }
    100% { transform: scaleY(1) scaleX(1); }
}
@keyframes mi-icon-squeeze-active {
    0%   { transform: scale(1); }
    100% { transform: scale(0.93); }
}


/* -------------------------------------------------------------------------
 * 4. Featured icon (container redondo) — usado no topo dos modais.
 *
 *   Estrutura: <span class="mi-modal__icon mi-modal__icon--brand"><svg/></span>
 *   Variantes: brand / danger / success / warning / info
 * ------------------------------------------------------------------------- */
.mi-modal__icon {
    width: 48px;
    height: 48px;
    margin: 0 auto 14px;
    border-radius: 28px;
    box-sizing: border-box;
    /* display: flex (block-level) é necessário para que `margin: 0 auto`
       centralize o ícone. inline-flex não centraliza porque margin auto
       não funciona em elementos inline-level. */
    display: flex;
    align-items: center;
    justify-content: center;
}
.mi-modal__icon svg {
    width: 22px;
    height: 22px;
    display: block;
}

.mi-modal__icon--brand   { background: #ffe4e7; border: 8px solid #ffeff2; }
.mi-modal__icon--danger  { background: #ffe4e7; border: 8px solid #ffeef0; }
.mi-modal__icon--success { background: #d1fadf; border: 8px solid #ecfdf3; }
.mi-modal__icon--warning { background: #fef0c7; border: 8px solid #fffaeb; }
.mi-modal__icon--info    { background: #d1e9ff; border: 8px solid #eff8ff; }


/* -------------------------------------------------------------------------
 * 5. Modal animado
 *
 *   Estrutura:
 *     <div class="mi-modal" id="...">
 *       <div class="mi-modal__overlay"></div>
 *       <div class="mi-modal__container">
 *         <div class="mi-modal__content mi-modal__confirm"> ... </div>
 *       </div>
 *     </div>
 *
 *   Estados: .is-open (aberto), .is-closing (fechando), .__content-swap (sucesso)
 *
 *   Padding do painel: 24px em .mi-modal__content (padrão v2-modal, forçado com
 *   !important — não sobrescrever em CSS de view; ver skill v2-modal).
 * ------------------------------------------------------------------------- */
.mi-modal {
    position: fixed;
    inset: 0;
    z-index: 1065;
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--mi-duration-base) ease;
}
.mi-modal__overlay {
    position: absolute;
    inset: 0;
    background: rgba(10, 13, 18, 0.56);
    opacity: 0;
    transition: opacity var(--mi-duration-base) ease;
}
.mi-modal__container {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 100%;
    max-width: 500px;
    border-radius: 16px;
    overflow: hidden;
    background: #fff;
    box-shadow: 0 20px 25px -5px rgba(10, 13, 18, 0.16), 0 8px 10px -6px rgba(10, 13, 18, 0.10);
}
.mi-modal__content {
    padding: 24px !important;
    position: relative;
    opacity: 0;
    transform: translateY(10px) scale(0.985);
    transition:
        opacity var(--mi-duration-modal) var(--mi-ease-emphasized),
        transform var(--mi-duration-modal) var(--mi-ease-emphasized);
}

.mi-modal.is-open {
    opacity: 1;
    pointer-events: auto;
}
.mi-modal.is-open .mi-modal__overlay {
    opacity: 1;
}
.mi-modal.is-open .mi-modal__content {
    opacity: 1;
    transform: translateY(0) scale(1);
}

/* Content-swap: usado quando a segunda seção (sucesso) entra no lugar da confirmação.
   O container já está visível, então as transições do container são desligadas e
   só os filhos internos animam em cascata. */
.mi-modal.__content-swap,
.mi-modal.__content-swap .mi-modal__overlay {
    transition: none;
}
.mi-modal.__content-swap .mi-modal__content {
    transition: none;
    animation: mi-modal-content-swap-in 0.3s cubic-bezier(0.33, 1, 0.32, 1) both;
}
.mi-modal.__content-swap .mi-modal__success > * {
    opacity: 0;
    transform: translateY(4px);
    animation: mi-modal-content-swap-in 0.3s cubic-bezier(0.33, 1, 0.32, 1) forwards;
}
.mi-modal.__content-swap .mi-modal__success > *:nth-child(1) { animation-delay: 0.03s; }
.mi-modal.__content-swap .mi-modal__success > *:nth-child(2) { animation-delay: 0.08s; }
.mi-modal.__content-swap .mi-modal__success > *:nth-child(3) { animation-delay: 0.12s; }
.mi-modal.__content-swap .mi-modal__success > *:nth-child(4) { animation-delay: 0.16s; }

@keyframes mi-modal-content-swap-in {
    from { opacity: 0; transform: translateY(5px) scale(0.998); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
}

/* Tipografia padrão de modal — usada em confirmação/sucesso/aviso (texto centralizado, com featured icon em cima). */
.mi-modal__title {
    margin: 0 0 8px;
    font-size: 22px;
    line-height: 30px;
    font-weight: 600;
    color: #181d27;
    text-align: center;
}
.mi-modal__subtitle {
    margin: 0;
    font-size: 14px;
    line-height: 20px;
    color: #535862;
    text-align: center;
}
.mi-modal__confirm,
.mi-modal__success {
    text-align: center;
}

/* Variante "list" — modais de formulário / listagem / seleção múltipla.
   Título alinhado à esquerda em 18px (não em 22px), subtítulo um pouco menor,
   e corpo de texto neutro #414651 (mesma cor de labels e parágrafos de
   listas no admin v2). Aplicar a classe modificadora `.mi-modal__content--list`
   no `.mi-modal__content` para ativar. NÃO combinar com `.mi-modal__confirm` /
   `.mi-modal__success` (que centralizam tudo). */
.mi-modal__content--list {
    color: #414651;
    text-align: left;
}
.mi-modal__content--list .mi-modal__title {
    font-size: 18px;
    line-height: 26px;
    text-align: left;
}
.mi-modal__content--list .mi-modal__subtitle {
    font-size: 13px;
    line-height: 18px;
    color: #535862;
    text-align: left;
}
.mi-modal__actions {
    margin-top: 20px;
    display: flex;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}
/* Confirmação (ex.: Cancelar + ação): mesma largura — o texto não deve definir
   larguras diferentes entre os dois botões (padrão admin v2). */
.mi-modal__confirm .mi-modal__actions {
    justify-content: stretch;
    flex-wrap: nowrap;
}
.mi-modal__confirm .mi-modal__actions > .mi-btn-elevated,
.mi-modal__confirm .mi-modal__actions > .mi-btn-quiet,
.mi-modal__confirm .mi-modal__actions > .d_button,
.mi-modal__confirm .mi-modal__actions > button,
.mi-modal__confirm .mi-modal__actions > input[type="submit"],
.mi-modal__confirm .mi-modal__actions > a.mi-btn-elevated,
.mi-modal__confirm .mi-modal__actions > a.mi-btn-quiet {
    flex: 1 1 0;
    min-width: 0;
    box-sizing: border-box;
}
.mi-modal__confirm .mi-modal__actions > :only-child {
    flex: 0 1 auto;
    margin-left: auto;
    margin-right: auto;
}
.mi-modal__success .mi-modal__actions {
    justify-content: center;
}
.mi-modal__close {
    position: absolute;
    top: 16px;
    right: 16px;
    border: none;
    background: transparent;
    padding: 4px;
    line-height: 0;
    cursor: pointer;
    color: #5a5a5a;
    transform-origin: 50% 50%;
    transition:
        color 0.14s ease,
        transform 0.12s var(--mi-ease-emphasized, cubic-bezier(0.33, 1, 0.32, 1));
}
.mi-modal__close:hover {
    color: #181d27;
}
.mi-modal__close:active {
    transform: scale(0.92);
}

/* Quando o modal está aberto, neutraliza o background-color próprio da
   .__headbar para que o overlay escuro do modal (que pode estar atrás dela
   no stacking, dependendo do z-index aplicado em media queries do admin v2)
   apareça através dela. Sem isto, em breakpoints onde a headbar ganha
   z-index alto, ela aparece "ilhada" com a cor original enquanto o resto
   da página fica sob o overlay.
   IMPORTANTE: aplicar APENAS em telas > 960px. No mobile/tablet a headbar
   ganha z-index e comportamento próprio (menu hamburguer, sticky topo) e
   precisa manter o background sólido — torná-la transparente nesses
   breakpoints faz o conteúdo da página vazar por trás do menu mobile. */
@media (min-width: 961px) {
    body.__mi-modal-open .__headbar {
        background-color: transparent !important;
    }
}

/* Loading (modo AJAX legado) */
.mi-modal__content.is-loading {
    min-height: 150px;
}
.mi-modal__content.is-loading::before {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 40px;
    height: 40px;
    margin-top: -20px;
    margin-left: -20px;
    border: 4px solid #fff;
    border-top: 4px solid var(--mi-brand);
    border-radius: 50%;
    animation: mi-modal-spin 1s linear infinite;
    z-index: 3;
}
@keyframes mi-modal-spin {
    0%   { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

/* Responsivo
   ------------------------------------------------------------------------
   Três quebras:
   1. ≤ 767px (tablet/mobile largo): container ocupa quase 100% da viewport,
      tipografia reduz, botões ficam LADO A LADO dividindo o espaço igualmente.
   2. ≤ 480px (mobile pequeno): botões EMPILHAM e cada um ocupa 100% da largura
      (não basta `flex-direction: column` — sem `width: 100%`/`flex: 1 1 auto`
      explícito o botão pega largura do conteúdo, o que faz a versão antiga
      aparecer "centralizada estreita" no celular).
   3. iPhone SE / 360: o `mi-modal__actions` herda tudo do bloco 2; só a
      tipografia se ajusta no bloco 1. Não precisamos de breakpoint extra. */
@media (max-width: 767px) {
    .mi-modal__container {
        max-width: calc(100% - 20px);
        width: calc(100% - 20px);
    }
    .mi-modal__title {
        font-size: 17px;
        line-height: 24px;
    }
    .mi-modal__subtitle {
        font-size: 13px;
        line-height: 19px;
    }
    .mi-modal__content--list .mi-modal__title {
        font-size: 16px;
        line-height: 22px;
    }
    .mi-modal__content--list .mi-modal__subtitle {
        font-size: 12px;
        line-height: 17px;
    }
    .mi-modal__actions {
        width: 100%;
        margin-top: 18px;
        flex-wrap: nowrap;
        gap: 10px;
    }
    .mi-modal__actions .mi-btn-elevated,
    .mi-modal__actions .d_button {
        width: auto;
        min-width: 0;
        flex: 1 1 0;
        height: 48px;
        min-height: 48px;
        padding: 0 10px;
    }
}
@media (max-width: 480px) {
    .mi-modal__actions {
        flex-direction: column;
        gap: 8px;
    }
    /* Em column, `flex: 1 1 0` distribuiria ALTURA. Precisamos forçar largura
       100% explicitamente para os botões ocuparem toda a linha (caso contrário
       ficam com o width do conteúdo, como aconteceu no modal de distribuição
       por área temática antes desta correção). */
    .mi-modal__actions .mi-btn-elevated,
    .mi-modal__actions .d_button,
    .mi-modal__actions button,
    .mi-modal__actions input[type="submit"] {
        width: 100% !important;
        max-width: 100%;
        flex: 0 0 auto;
        box-sizing: border-box;
    }
}


/* -------------------------------------------------------------------------
 * 6. Container expansível (mi-collapsible)
 *
 *   Técnica moderna: grid-template-rows: 0fr → 1fr (sem altura fixa,
 *   suporta conteúdo dinâmico, sem JS de measure).
 *
 *   Estrutura:
 *     <div class="mi-collapsible">
 *       <button class="mi-collapsible__trigger">
 *         Título
 *         <svg class="mi-collapsible__chevron"> ... </svg>
 *       </button>
 *       <div class="mi-collapsible__panel">
 *         <div class="mi-collapsible__inner"> conteúdo ... </div>
 *       </div>
 *     </div>
 * ------------------------------------------------------------------------- */
.mi-collapsible__panel {
    display: grid;
    grid-template-rows: 0fr;
    transition: grid-template-rows 0.42s var(--mi-ease-emphasized);
    overflow: hidden;
}
.mi-collapsible.is-open .mi-collapsible__panel {
    grid-template-rows: 1fr;
}
.mi-collapsible__panel > * {
    min-height: 0;
}
.mi-collapsible__inner {
    opacity: 0;
    transform: translateY(-6px);
    transition:
        opacity 0.38s var(--mi-ease-emphasized),
        transform 0.38s var(--mi-ease-emphasized);
}
.mi-collapsible.is-open .mi-collapsible__inner {
    opacity: 1;
    transform: translateY(0);
}
.mi-collapsible__chevron {
    display: inline-block;
    transition: transform 0.38s var(--mi-ease-emphasized);
    transform-origin: center;
}
.mi-collapsible.is-open .mi-collapsible__chevron {
    transform: rotate(180deg);
}
.mi-collapsible--soft .mi-collapsible__panel {
    transition-duration: 0.48s;
}
.mi-collapsible--soft .mi-collapsible__inner {
    transition-duration: 0.44s;
}
.mi-collapsible--soft .mi-collapsible__chevron {
    transition-duration: 0.38s;
}


/* -------------------------------------------------------------------------
 * 7. Checkbox v2 animado (mi-checkbox)
 *
 *   Estrutura:
 *     <span class="mi-checkbox">
 *       <input type="checkbox" id="..." />
 *       <label for="..."></label>
 *     </span>
 *
 *   O <label> é o visual (16×16). O <input> nativo fica invisível por cima.
 * ------------------------------------------------------------------------- */
.mi-checkbox {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
}
.mi-checkbox input[type="checkbox"] {
    position: absolute;
    inset: 0;
    opacity: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    cursor: pointer;
    z-index: 1;
}
.mi-checkbox label {
    position: absolute;
    inset: 0;
    margin: 0;
    border-radius: 4px;
    border: 1px solid #d5d7da;
    background: #fff;
    box-sizing: border-box;
    transform: scale(1);
    transform-origin: center;
    cursor: pointer;
    transition:
        background-color 0.22s var(--mi-ease-checkbox),
        border-color 0.22s var(--mi-ease-checkbox),
        transform 0.2s var(--mi-ease-checkbox);
}
.mi-checkbox:hover label {
    border-color: #a4a9b2;
    background-color: #f9fafb;
    transform: scale(1.04);
}
.mi-checkbox input:active ~ label {
    transform: scale(0.97);
    transition-duration: 0.1s;
}
.mi-checkbox input:checked ~ label {
    border-color: var(--mi-brand);
    background-color: #fff1f2;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M3.5 8.2L6.3 11L12.5 4.8' stroke='%23FF2B34' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 12px 12px;
    animation: mi-checkbox-mark 0.42s var(--mi-ease-bouncy) both;
}
.mi-checkbox:hover input:checked ~ label {
    border-color: #f04452;
    background-color: #fff5f6;
    transform: scale(1.03);
}
.mi-checkbox input:active:checked ~ label {
    transform: scale(0.98);
}
.mi-checkbox input:focus-visible ~ label {
    outline: 2px solid var(--mi-brand);
    outline-offset: 2px;
}

@keyframes mi-checkbox-mark {
    0%   { transform: scale(0.88); background-size: 0 0; }
    45%  { transform: scale(1.07); background-size: 12px 12px; }
    100% { transform: scale(1);    background-size: 12px 12px; }
}


/* -------------------------------------------------------------------------
 * 8. Chosen-drop v2 (mi-chosen)
 *
 *   Override do Chosen.js para o visual v2:
 *     - Input: altura 40px, border-radius 8px, focus ring vermelho.
 *     - Setinha SVG: gira 0→180° em 0.34s ease-in-out.
 *     - Painel: opacity + translateY com easing emphasized.
 *
 *   Uso: <div class="mi-chosen"><select> ... </select></div>
 *        $('select').chosen({ ... });
 * ------------------------------------------------------------------------- */
.mi-chosen .chosen-container {
    width: 100% !important;
    font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
.mi-chosen .chosen-container-single .chosen-single {
    height: 40px;
    line-height: 18px;
    padding: 10px 38px 10px 14px;
    border: 1px solid #d5d7da;
    border-radius: 8px;
    background: #fff;
    box-shadow: 0 1px 2px rgba(10, 13, 18, 0.05);
    color: #717680;
    font-size: 12px;
    transition: border-color 0.18s ease, box-shadow 0.18s ease;
}
.mi-chosen .chosen-container-single .chosen-single span {
    margin-right: 0;
    color: #717680;
}
.mi-chosen .chosen-container-single .chosen-single div {
    width: 20px;
    right: 12px;
    top: 0;
    bottom: 0;
    margin: auto;
    height: 20px;
}
.mi-chosen .chosen-container-single .chosen-single div b {
    background: none !important;
}
.mi-chosen .chosen-container-single .chosen-single div::after {
    content: "";
    position: absolute;
    inset: 0;
    background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M5 7.5L10 12.5L15 7.5' stroke='%23535862' stroke-width='1.66667' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center center;
    transform: rotate(0deg);
    transition: transform 0.34s ease-in-out;
    transform-origin: center;
}
.mi-chosen .chosen-container-active.chosen-with-drop .chosen-single {
    border-color: var(--mi-brand);
    box-shadow: 0 0 0 1px var(--mi-brand);
}
.mi-chosen .chosen-container-active.chosen-with-drop .chosen-single div::after {
    transform: rotate(180deg);
}

.mi-chosen .chosen-container .chosen-drop {
    border: 1px solid #d5d7da;
    border-top: none;
    border-radius: 0 0 8px 8px;
    box-shadow: 0 4px 12px rgba(10, 13, 18, 0.12);
    opacity: 0;
    transform: translateY(-4px);
    visibility: hidden;
    pointer-events: none;
    transition:
        opacity 0.24s var(--mi-ease-emphasized),
        transform 0.24s var(--mi-ease-emphasized),
        visibility 0.24s linear;
}
.mi-chosen .chosen-container.chosen-with-drop .chosen-drop {
    opacity: 1;
    transform: translateY(0);
    visibility: visible;
    pointer-events: auto;
}

.mi-chosen .chosen-container .chosen-results li {
    font-size: 12px;
    line-height: 18px;
    color: #181d27;
    padding: 8px 14px;
}
.mi-chosen .chosen-container .chosen-results li.highlighted {
    background: #fff1f2;
    color: #181d27;
}

/* Search interno (opcional) */
.mi-chosen .chosen-container .chosen-search {
    padding: 8px;
}
.mi-chosen .chosen-container .chosen-search input[type="text"] {
    width: 100%;
    height: 32px;
    padding: 6px 28px 6px 10px;
    border: 1px solid #d5d7da;
    border-radius: 6px;
    font-size: 12px;
    color: #181d27;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M17.5 17.5L13.875 13.875M15.833 9.167a6.667 6.667 0 11-13.333 0 6.667 6.667 0 0113.333 0z' stroke='%23717680' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 8px center;
    background-size: 14px 14px;
    transition: border-color 0.18s ease, box-shadow 0.18s ease;
}
.mi-chosen .chosen-container .chosen-search input[type="text"]:focus {
    outline: none;
    border-color: var(--mi-brand);
    box-shadow: 0 0 0 1px var(--mi-brand);
}


/* -------------------------------------------------------------------------
 * 9. Action dropdown ⋮ (mi-row-actions)
 *
 *   Estrutura (irmãos):
 *     <div style="position: relative; display: inline-flex;">
 *       <div class="mi-row-actions-trigger"><svg/></div>
 *       <div class="mi-row-actions-dropdown">
 *         <a href="...">Item 1</a>
 *         <a href="...">Item 2</a>
 *       </div>
 *     </div>
 *
 *   O JS (mi-row-actions-dropdown.js) move o .mi-row-actions-dropdown pro body
 *   ao abrir (portal), para evitar corte por overflow do container pai.
 * ------------------------------------------------------------------------- */
.mi-row-actions-trigger {
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 6px;
    flex-shrink: 0;
    transition:
        background 0.18s ease,
        transform var(--mi-duration-base) var(--mi-ease-standard),
        box-shadow var(--mi-duration-base) var(--mi-ease-standard);
}
.mi-row-actions-trigger:hover {
    background: #f9fafb;
    box-shadow: 0 1px 3px rgba(10, 13, 18, 0.05);
}
.mi-row-actions-trigger svg {
    display: block;
    transition: transform var(--mi-duration-base) var(--mi-ease-standard);
}
.mi-row-actions-trigger:hover svg {
    transform: scale(1.08);
}
.mi-row-actions-trigger svg path,
.mi-row-actions-trigger svg circle {
    transition: fill 0.15s ease, stroke 0.15s ease;
}
.mi-row-actions-trigger:hover svg path[stroke] {
    stroke: #5f6673;
}
.mi-row-actions-trigger:hover svg path:not([stroke]),
.mi-row-actions-trigger:hover svg circle {
    fill: #5f6673;
}
.mi-row-actions-trigger:focus-visible {
    outline: 2px solid var(--mi-brand);
    outline-offset: 2px;
}

.mi-row-actions-dropdown {
    position: absolute;
    top: calc(100% + 4px);
    right: 0;
    z-index: 4000;
    min-width: 150px;
    background: #fff;
    border: 1px solid #e9eaeb;
    border-radius: 8px;
    box-shadow: 0 4px 12px rgba(10, 13, 18, 0.12);
    padding: 4px 0;
    display: none;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateY(-8px);
    transition:
        opacity 0.2s ease,
        transform 0.2s ease,
        visibility 0.2s linear;
}
.mi-row-actions-dropdown.dropdown-top {
    transform: translateY(8px);
}
.mi-row-actions-dropdown.is-open {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translateY(0);
}
.mi-row-actions-dropdown a {
    display: block;
    padding: 9px 16px;
    font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    font-size: 13px;
    font-weight: 500;
    line-height: 18px;
    color: #344054;
    text-decoration: none;
    white-space: nowrap;
    transition: background 0.1s ease, color 0.1s ease;
}
.mi-row-actions-dropdown a:hover {
    background: #f9fafb;
    color: #181d27;
    text-decoration: none;
}


/* -------------------------------------------------------------------------
 * 9.b Bootstrap button dropdown (mi-bs-dropdown)
 *
 *   Padrão para botões que abrem menus via data-toggle="dropdown" do Bootstrap
 *   (Exportar, Nota fiscal, qualquer botão com .dropdown-toggle + .dropdown-menu).
 *
 *   Animações aplicadas:
 *     - .dropdown-menu desce com opacity + translateY (paridade visual com
 *       o painel do .mi-chosen e o .mi-row-actions-dropdown).
 *     - chevron interno gira 0→180° quando o dropdown abre (paridade com
 *       o .mi-collapsible__chevron).
 *
 *   Uso:
 *     <div class="btn-group mi-bs-dropdown">
 *       <a class="dropdown-toggle d_button mi-btn-quiet" data-toggle="dropdown" href="#">
 *         Exportar
 *         <svg class="mi-bs-dropdown__chevron">...</svg>
 *       </a>
 *       <ul class="dropdown-menu pull-right">...</ul>
 *     </div>
 *
 *   Funciona com Bootstrap 2/3 (toggla a classe .open no wrapper).
 * ------------------------------------------------------------------------- */
.mi-bs-dropdown > .dropdown-menu {
    /* Mantém o elemento no fluxo para o transition rodar, mas invisível e
       sem interceptar pointer events enquanto fechado. */
    display: block;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateY(-4px);
    transition:
        opacity 0.24s var(--mi-ease-emphasized),
        transform 0.24s var(--mi-ease-emphasized),
        visibility 0.24s linear;
}
.mi-bs-dropdown.open > .dropdown-menu,
.mi-bs-dropdown.show > .dropdown-menu {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translateY(0);
}
.mi-bs-dropdown__chevron {
    transform-origin: 50% 50%;
    transition: transform 0.34s var(--mi-ease-emphasized);
    will-change: transform;
}
.mi-bs-dropdown.open .mi-bs-dropdown__chevron,
.mi-bs-dropdown.show .mi-bs-dropdown__chevron {
    transform: rotate(180deg);
}


/* -------------------------------------------------------------------------
 * 10. Tooltip animation (override Bootstrap)
 *
 *   O projeto usa Bootstrap tooltips via data-toggle="tooltip". Aqui só
 *   suaviza o estado de entrada/saída.
 * ------------------------------------------------------------------------- */
.tooltip {
    opacity: 0;
    transform: translateY(2px);
    transition:
        opacity 0.18s ease,
        transform 0.18s var(--mi-ease-emphasized);
}
.tooltip.in,
.tooltip.show {
    opacity: 0.95;
    transform: translateY(0);
}
.tooltip-inner {
    font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    font-size: 12px;
    padding: 6px 10px;
    border-radius: 6px;
}


/* -------------------------------------------------------------------------
 * 11. Reduced motion fallback (OBRIGATÓRIO)
 *
 *   Respeita prefers-reduced-motion: reduce. Transições de cor permanecem,
 *   mas qualquer transform/animação é desativada.
 * ------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    .mi-btn-elevated,
    .mi-btn-elevated:hover,
    .mi-btn-elevated:active,
    .mi-btn-elevated-lift,
    .mi-btn-elevated-lift:hover,
    .mi-btn-elevated-lift:active,
    .mi-btn-quiet,
    .mi-btn-quiet:hover,
    .mi-btn-quiet:active,
    .mi-pressable,
    .mi-pressable:active,
    .mi-pressable-card,
    .mi-pressable-card:active {
        transform: none !important;
        transition: background 0.15s ease, background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease !important;
    }

    .mi-btn-icon:hover .fa::before,
    .mi-btn-icon:hover svg,
    .mi-btn-icon:active .fa::before,
    .mi-btn-icon:active svg,
    .mi-icon-standalone:hover .fa::before,
    .mi-icon-standalone:hover svg,
    .mi-icon-standalone:active .fa::before,
    .mi-icon-standalone:active svg,
    .mi-icon-standalone:hover,
    .mi-icon-standalone:active,
    svg.mi-icon-standalone:hover,
    svg.mi-icon-standalone:active,
    i.mi-icon-standalone:hover,
    i.mi-icon-standalone:active {
        animation: none !important;
        transform: none !important;
    }

    .mi-modal,
    .mi-modal__overlay,
    .mi-modal__content {
        transition: none !important;
    }
    .mi-modal__close:active {
        transform: none !important;
    }
    .mi-modal__content {
        transform: none !important;
        opacity: 1 !important;
        padding: 24px !important;
    }
    .mi-modal.__content-swap .mi-modal__content,
    .mi-modal.__content-swap .mi-modal__success > * {
        animation: none !important;
        opacity: 1 !important;
        transform: none !important;
    }

    .mi-collapsible__panel,
    .mi-collapsible__inner,
    .mi-collapsible__chevron {
        transition: none !important;
    }
    .mi-collapsible.is-open .mi-collapsible__inner {
        opacity: 1;
        transform: none;
    }
    .mi-collapsible.is-open .mi-collapsible__chevron {
        transform: rotate(180deg);
    }

    .mi-checkbox label,
    .mi-checkbox:hover label,
    .mi-checkbox input:checked ~ label,
    .mi-checkbox input:active ~ label {
        animation: none !important;
        transform: none !important;
        transition: background 0.15s ease, border-color 0.15s ease !important;
    }

    .mi-chosen .chosen-container .chosen-drop,
    .mi-chosen .chosen-container.chosen-with-drop .chosen-drop,
    .mi-chosen .chosen-container-single .chosen-single div::after {
        transition: none !important;
        transform: none !important;
    }

    .mi-row-actions-trigger,
    .mi-row-actions-trigger:hover,
    .mi-row-actions-trigger svg,
    .mi-row-actions-trigger:hover svg,
    .mi-row-actions-dropdown,
    .mi-row-actions-dropdown.is-open {
        transition: none !important;
        transform: none !important;
    }

    .mi-bs-dropdown > .dropdown-menu,
    .mi-bs-dropdown.open > .dropdown-menu,
    .mi-bs-dropdown.show > .dropdown-menu,
    .mi-bs-dropdown__chevron {
        transition: none !important;
        transform: none !important;
    }
    .mi-bs-dropdown.open .mi-bs-dropdown__chevron,
    .mi-bs-dropdown.show .mi-bs-dropdown__chevron {
        transform: rotate(180deg) !important;
    }

    .tooltip,
    .tooltip.in,
    .tooltip.show {
        transition: none !important;
        transform: none !important;
    }
}
