/*
	INICIO HEADER
*/

.nk-sidebar .nk-sidebar-main{
	overflow-x: clip;
	overflow-y: clip;
	position: relative;
}
.nk-sidebar .nk-sidebar-main:before{
	content: "";
	position: absolute;
	top: 20px;
	left: -220px;
	background: url('../../assets/images/logos/brasao-ub.png');
	background-size: contain;
	background-repeat: no-repeat;
	width: 500px;
	height: 500px;
	opacity: 0.03;
	filter: grayscale(1);
}
.nk-sidebar .nk-menu-content .modulo-title{
	display: flex;
	align-items: center;
	justify-content: flex-start;
	gap: 5px;
	font-variant: small-caps;
}
.nk-sidebar .nk-menu-content .modulo-title .nk-menu-icon em{
	color: var(--color-principal); 
	font-size: 1.8rem;
}

.nk-main{
	overflow-x: clip;
	overflow-y: clip;
}
.nk-main:before{
	content: "";
	position: absolute;
	bottom: -120px;
    right: -285px;
	background: url('../../assets/images/logos/brasao-ub.png');
	background-size: contain;
	background-repeat: no-repeat;
	width: 500px;
	height: 500px;
	opacity: 0.03;
	filter: grayscale(1);
}

/* ^^^^^^^^^^^ 2026 ^^^^^^^^^^ */

.nk-block-head-content{
    align-content: center;
}
.nk-block-head-content .nk-menu-icon{
	width: auto;
    margin-right: 10px;
    display: flex;
    align-items: flex-start;
    height: 100%;
}
.nk-block-head-content .nk-menu-icon .icon{
	color: var(--color-principal);
    font-size: 2.8rem;
}
.header-page{
	display: flex;
	justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px;
}
.nk-block-head-content .btn{
    width: 100%;
    display: flex;
    justify-content: center;
}
#Senha .nk-block-head .nk-block-between .nk-block-head-content .btn-trigger{
	justify-content: flex-end;
}
.nk-block-head-content > .btn > .icon{
	margin-left: 0.25rem;
}
@media (max-width: 900px){
	.nk-block-head-content .btn span{
	    display: none;
	}
	.nk-block-head-content .btn .icon{
		margin: 0;
	}
}
@media (max-width: 721px){
	.nk-block-head-content{
		width: 100%; 
		padding-left: 10px;
	}
	.nk-block-head-content .toglle .btn{
		width: 100%; 
	 padding-left: 10px;
 }
	.nk-block-head-content .btn span{
	    display: block;
	}
	/* .nk-block-head-content .btn .icon{
		 margin-right: 0.25em; 
	} */
}
/*
	FIM HEADER
*/

/*
	INICIO DUAL LIST BOX
*/

.dual-listbox .dual-listbox__search{
	min-width: 100%;
	height: calc(2.625rem + 2px);
	min-height: calc(2.125rem + 2px);
	padding: 0.6875rem 1rem;
    font-size: 0.9375rem;
    border-radius: 5px;
}
.dual-listbox .dual-listbox__container{
	justify-content: space-between;
}
.dual-listbox .dual-listbox__container div{
	flex-basis: 43% !important;
}
.dual-listbox .dual-listbox__container .dual-listbox__buttons{
	flex-basis: 14% !important;
	margin: 0;
}
.dual-listbox .dual-listbox__container .dual-listbox__available, .dual-listbox .dual-listbox__container .dual-listbox__selected{
	width: 100%;
	height: 500px;
}
.dual-listbox .dual-listbox__available::-webkit-scrollbar, .dual-listbox .dual-listbox__selected::-webkit-scrollbar {
  width: 8px;               /* width of the entire scrollbar */
}

/*
	FIM DUAL LIST BOX
*/

.js_carregando{
	display: none;
	position: absolute;
	background: var(--bs-body-bg);
	width: 100%;
	height: 100%;
    z-index: 9;
    text-align: center;
    align-content: center;
} /* div de carregamento */

.js_carregando.active{
	display: block;
}
/*
	IMAGE PREVIEW
*/
.img-preview{
    border-radius: 4px;
    overflow: hidden;
    height: calc(2.125rem + 50px);
    width: calc(2.125rem + 50px);
}
.img-preview .preview-lightbox{
    display: block;
    width: 100%;
    height: 100%;
}
.img-preview .preview-lightbox .preview{
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.img-preview-input .img-preview{
    height: calc(2.125rem + 2px);
    width: calc(2.125rem + 50px);
}
.img-preview-input{
	display: none;
	flex-direction: row;
	gap: 10px;
	margin-left: 10px;
}
.img-preview-modal{
	margin-top: 10px;
    width: 100%;
}
.img-preview-modal .img-preview{
    height: calc(2.125rem + 150px);
    width: 100%;
}
.img-preview-avatar .img-preview{
    height: calc(2.125rem + 70px);
    width: calc(2.125rem + 70px);
}
.btn-remove-img-preview{
	margin-left: 10px;
	display: none;
}

@media  (max-width: 992px) {
	.modal-content .modal-body .card-aside-wrap .card {
		height: 100vh;
	} /* TAMANHO DA MODAL */
}
/*****************
↓↓↓↓↓  GLOBAL ↓↓↓↓↓
*******************/
.select2-selection__choice{
	z-index: 3;
}
select[multiple] .select2-search__field{
	width: 144px !important;
}
.w-70{
	width: 70% !important;
}
.w-20{
	width: 20% !important;
}
.w-25{
	width: 25% !important;
}
.w-30{
	width: 30% !important;
}
.u-100{
	height: 100% !important;
	width: 100% !important;
}
.text-right{
	text-align: right !important;
}
::-webkit-scrollbar {
    background: #12121629;
    width: 8px;
    height: 8px;
}
.nk-kanban{
    display: flex;
    justify-content: center;
    overflow: hidden;
}
::-webkit-scrollbar-thumb {
    background: var(--color-principal);
    border-radius: 4px;
}
.d-flex-normal{
	display: flex;
}
.d-none-normal{
	display: none;
}
table .dropdown{
	position: static;
}
/*******************************************************************************
↓↓↓↓↓ DATATABLE: O CARD QUE ENVOLVE A TABELA NAO TEM PADDING ↓↓↓↓↓
********************************************************************************
 REGRA DO PROJETO (pedido, 2026-08-27): **`.card.card-bordered.card-stretch`
 tem `padding: 0`**, e vale para TODA datatable do sistema — as que existem e as
 que vierem. Esta linha aqui e a implementacao: nenhuma view precisa fazer nada,
 e nenhuma folha de pagina deve reintroduzir folga nesse card.

 >>> ELE TINHA 24px ATE HOJE, e era folga DUPLICADA. O `.card-inner` de dentro
     ja afasta o conteudo da borda (1.25rem no mobile, 1.5rem a partir de
     576px — dashlite.css:15861 e :15986), entao o total media 49px da moldura
     ate a primeira celula: a tabela nascia como uma ilha no meio do card, e a
     coluna de acoes terminava longe da borda direita.
     Medido depois da mudanca: 25px da moldura ate a celula (o `.card-inner`
     sozinho), que e o mesmo respiro de qualquer outro card do app.

 >>> `padding: 0` E NAO REMOVER A REGRA. O seletor tem de continuar existindo:
     e ele que documenta a decisao e o lugar onde alguem vai procurar quando
     quiser entender por que a tabela encosta. Removida, a folga voltaria pelo
     primeiro `.card { padding }` que aparecesse.

 >>> A COMBINACAO E O CONTRATO. `card-stretch` e o que marca "card de tabela"
     nas 13 telas de listagem do app (pacientes, clinicas, equipe, alimentos,
     suplementos, medicamentos, DRI, plano alimentar, conteudo do site, fila e
     historico de atendimentos, fichas de pre-consulta). Card comum (sem
     `card-stretch`) nao e afetado.
*******************************************************************************/
.card.card-bordered.card-stretch{
	padding: 0;
}

/* ---- CELULA "TITULO + SUBTITULO" DAS DATATABLES ----------------------
   >>> O MARKUP VEM DO RENDERIZADOR `titulosub` (scripts.js), que e GENERICO: titulo com
       subtitulo embaixo, sem avatar. Ele nasceu na lista de suplementos (a marca sob o nome
       do produto) e hoje serve tambem alimentos (marca + grupo) e a DRI (o estagio de vida
       sob o nutriente).
   >>> ELA MOROU EM clinica/nutricao/gerenciar.css ATE O SEGUNDO CONSUMIDOR APARECER, com a
       instrucao de subir para ca quando isso acontecesse - foi o que aconteceu com a tela de
       DRI (2026-08-17), que e de OUTRO MODULO e nao carrega aquele arquivo. Uma segunda copia
       seria onde as duas comecariam a divergir.
   >>> SEM ESCOPO DE PAGINA E SEGURO AQUI porque a chave e `.tb-titulosub`, uma classe que SO
       existe onde o renderizador rodou - nao ha markup do tema que a carregue.

   O TEMA JA DA metade: `.nk-tb-list .tb-lead` e block/`#364a63`/500 e `.nk-tb-list .tb-sub`
   e `0.9em`. O que falta e o subtitulo ser BLOCO (para cair na linha de baixo) e CINZA. Os
   11px sao os mesmos que o tema usa no subtitulo do `user-card`
   (`.nk-tb-list .user-info .tb-lead + span`), para as listas do sistema terem o mesmo
   segundo nivel. */
.nk-tb-list .tb-titulosub .tb-sub {
	display: block;
	font-size: 11px;
	line-height: 1.4;
	color: #8094ae;
}

/* ---- PAGINACAO: O NUMERO DA PAGINA ATIVA SUMIA NO HOVER ---------------
   SINTOMA: passar o mouse sobre o botao da pagina que JA ESTA ativa apagava o numero -
   ele ficava do mesmo verde do fundo. Vale(ia) para TODA tabela paginada do sistema.

   >>> A CAUSA E UM EMPATE DE ESPECIFICIDADE DECIDIDO PELA ORDEM DOS ARQUIVOS, e nao um
       valor errado. Duas regras disputam a COR do <a> nesse estado, as duas com peso 0,2,0:
         dashlite.css:4834   `.active > .page-link { color: var(--bs-pagination-active-color) }`  -> #fff
         theme-principal.css `.page-link:hover     { color: var(--color-principal) }`             -> o verde
       O skin e carregado DEPOIS do dashlite (master.blade.php:28 e :32), entao no empate ele
       vence - e o texto passa a ser pintado da mesma tinta que o fundo.

   >>> O FUNDO NAO ENTRA NA DISPUTA, e por isso so a cor precisa de conserto: o
       `background-color` do hover (`.page-link:hover`, 0,2,0) perde para
       `.page-item.active .page-link` do skin (0,3,0), entao o verde do ativo permanece.
       Corrigir a cor devolve o contraste sem mexer no desenho do botao.

   >>> `:focus` **NAO** ESTA QUEBRADO e por isso nao entra aqui: o `.page-link:focus` do
       dashlite (linha 4827) e o `.active > .page-link` (linha 4834) tem o MESMO peso, e o
       segundo vem depois NO MESMO ARQUIVO - o #fff ja vence. So o hover atravessa a
       fronteira de arquivo.

   A ESPECIFICIDADE AQUI E 0,4,0 (page-item + active + page-link + hover), o que faz a regra
   valer mesmo estando este arquivo ANTES do skin (master.blade.php:30). Depender da ordem
   seria o mesmo erro que criou o defeito.

   >>> O MODO ESCURO JA ESTAVA CERTO, e a forma abaixo e copiada de la: o proprio dashlite
       resolve o mesmo empate com `.dark-mode .page-item.active .page-link { color:#fff }`
       (dashlite.css:43481). O que faltava era o par no modo claro.

   O TOKEN, E NAO O LITERAL: `--bs-pagination-active-color` e a MESMA variavel que pinta o
   numero quando o mouse nao esta em cima (dashlite.css:4795). Cravar `#fff` faria o estado
   de hover deixar de acompanhar o tema no dia em que o ativo mudar de fundo. */
.page-item.active .page-link:hover {
	color: var(--bs-pagination-active-color);
}
.text-divisor{
	display: flex;
	flex-direction: row;
    align-items: center;
    gap: 12px;
    width: 100%;
}
.text-divisor::after{
	content: "";
	position: relative;
	width: 100%;
	height: 2px;
    border-radius: 4px;
	background: -webkit-gradient(linear, 0 100%, 0 0, from(rgba(var(--color-principal-rgb)), color-stop(0, 0)), color-stop(0.5, rgba(var(--color-principal-rgb)), to(1)));
	background: -webkit-linear-gradient(90deg, rgba(var(--color-principal-rgb), 0) 0%, rgba(var(--color-principal-rgb), 1) 100%);
	background: -moz-linear-gradient(90deg, rgba(var(--color-principal-rgb), 0) 0%, rgba(var(--color-principal-rgb), 1) 100%);
	background: -o-linear-gradient(90deg, rgba(var(--color-principal-rgb), 0) 0%, rgba(var(--color-principal-rgb), 1) 100%);
	background: linear-gradient(90deg, rgba(var(--color-principal-rgb), 0) 0%, rgba(var(--color-principal-rgb), 1) 100%);
}
.dropdown .dropdown-menu{
	z-index: 99999;
}
.nowrap{
	white-space: nowrap; /* EVITA A QUEBRA DE LINHA	NO TEXTO */
}
.cursor-pointer, .cp {
	cursor: pointer;
}
.fade.in {
	opacity: 1;
}
span.badge-toast{
	width: 100%;
	display: flex;
	justify-content: center;
	font-size: 0.75rem;
    padding: 0.75em;
}
.form-file-label::after{
	content: "Selecionar";
}
.d-contents {
	display: contents;
}

/*QUADRO DE HORARIOS*/


.swal2-container .swal2-modal .header-quadro{
	padding: 15px 45px;
	background-color: #f5f5f5;
    border-top-right-radius: 10px;
    border-top-left-radius: 10px;
    padding-left: 20px;
    border-bottom: 1px solid #e5e9f2;
}

.swal2-container .swal2-modal .header-quadro .swal2-close{
	color: #929292;
}

.swal2-container .swal2-modal .header-quadro .swal2-title{
	margin-bottom: 0;
    color: #000000;
    font-size: 1.25rem;
    justify-content: flex-start;
    width: 100%;
    text-align: start;
}

.swal2-container .swal2-modal .swal2-content{
	/*padding: 20px;*/
}

.swal2-container .swal2-modal .swal2-content .swal2-html-container .inner-header{
	display: flex;
	flex-direction: row-reverse;
	justify-content: space-between;
	align-items: center;
	padding: 0 20px;
	padding-top: 20px;
	position: relative;
}

.swal2-container .swal2-modal .swal2-content .swal2-html-container .inner-header:before{
	content: "";
	position: absolute;
    bottom: -10px;
    width: 50px;
    height: 3px;
    background: #0fac81;
    left: 20px;
    border-radius: 10px;
}

.swal2-container .swal2-modal .swal2-content .swal2-html-container .inner-header h5{
	display: none;
}
.swal2-container .swal2-modal .swal2-content .swal2-html-container .membros{
	display: flex;
	flex-direction: column;
}
.swal2-container .swal2-modal .swal2-content .swal2-html-container .membros-text{
	color: #999999;
}

.swal2-container .swal2-modal .swal2-content .swal2-html-container .footer-swal2{
	padding: 20px;
	border-top: 1px solid #e5e9f2;
	background-color: #f8f8f8;
    border-bottom-right-radius: 10px;
    border-bottom-left-radius: 10px;
}

.swal2-container .swal2-modal .swal2-content .swal2-html-container .descricao{
	padding: 0 20px;
	margin-top: 10px;
}


.swal2-container .swal2-modal .swal2-content .swal2-html-container .inner-tools{
	gap: 10px;
}

/*********************************
↓↓↓↓↓  INPUT/SELECT C/ ÍCONE ↓↓↓↓↓
**********************************/

.form-group-icon, .icon-wrapper {
    display: flex;
    align-items: center;
}

.form-group-icon .icon-wrapper {
    width: 40px !important;
    height: 36px;
    justify-content: center;
    border: 1px solid #dbdfea;
    border-right: none;
    border-radius: 5px 0 0 5px;
}

.icon-wrapper em, .icon-wrapper i {
    font-size: 1.2em;
}

.form-group-icon input, .form-group-icon select, .form-group-icon .select2-container--default .select2-selection--single {
    border-top-left-radius: 0 !important;
    border-bottom-left-radius: 0 !important;
}

/*** Fim input/select com ícone ***/

/*** INICIO -> Gerenciamento/Cadastro ***/

.btn-foto-cadastro{
	height: 44px;
	width: 205px;
	display: inline-block;
	text-align: center;
}

.img-cadastro{
	height: 205px;
	width: 205px;
	border-radius: 4px;
	background: var(--color-principal);
	border: 4px solid;
	border-color: var(--color-principal);
}

.img-cadastro img{
	width: auto;
	height: 100%;
	object-fit: cover;
}

@media(max-width: 1023px){
	.dados-pessoais{
		flex-direction: column;
	}
	.dados-pessoais .box-img-cadastro{
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
		margin-bottom: 1.25rem;
	}
	.dados-pessoais .form-group:last-child{
		margin-bottom: 1.25rem !important;
	}
}
/*** FIM -> Gerenciamento/Cadastro ***/

/*********************
↓↓↓↓↓ UB LOADING ↓↓↓↓↓
*********************/
.ub-loading {
	z-index: 9999;
	position: fixed;
	background: #241010;
	height: 100%;
	width: 100%;
	left: 0;
	top: 0;
	display: flex;
	align-content: center;
	justify-content: center;
	align-items: center;
	flex-direction: column;
}
.ub-loading svg{
	width: 20rem;
	height: 20rem;
}
.ub-loading .brasao-svg-loading{
	stroke: #0FAC81;
	fill: transparent;
	stroke-width: 1.2;
	stroke-dashoffset: 4000;
	stroke-dasharray: 4000;
	animation: dashLoading 5s linear forwards;
}
.ub-loading .ub-loading-text{
	color: #0FAC81;
	font-size: 0.9rem;
	font-weight: 200!important;
	line-height: 0;
	/* margin-top: -20px; */
	margin-top: 20px;
}
.ub-loading .ub-loading-text span{
	font-size: 2rem;
	letter-spacing: -2px;
}
.ub-loading .ub-loading-text span:nth-child(1){
	animation: dotsLoading 1s linear forwards infinite;
    animation-delay: 0.3s;
}
.ub-loading .ub-loading-text span:nth-child(2){
	animation: dotsLoading 1s linear forwards infinite;
    animation-delay: 0.6s;
}
.ub-loading .ub-loading-text span:nth-child(3){
	animation: dotsLoading 1s linear forwards infinite;
    animation-delay: 0.9s;
}

@keyframes dashLoading {
	95%{
		fill: transparent;
		stroke-dashoffset: 0;
		stroke: #0FAC81;
		stroke-width: 1.2;
	}
	100%{
		stroke: #0FAC81;
		stroke-dashoffset: 0;
		fill: #13182C;
		stroke-width: 0.2;
	}
}
@keyframes dotsLoading {
	0%{
		opacity: 0.2;
	}
	50%{
		opacity: 1;
	}
}

.crop-container {
    width: 100%;
    max-height: 70vh; /* limita altura da modal */
    overflow: hidden;
}

.crop-container img {
    max-width: 100%;
    display: block;
}

/*******************************************************************************
↓↓↓↓↓ RITMO VERTICAL DOS CAMPOS DENTRO DE MODAL ↓↓↓↓↓
********************************************************************************
 O PROBLEMA: quando o campo e a PROPRIA COLUNA do grid (<div class="form-group
 col-md-6">), duas margens se somam e o formulario fica esparramado:

   .row > *      margin-top    = var(--bs-gutter-y)   -> 28px com .g-gs (dashlite:987)
   .form-group   margin-bottom = 1.25rem              -> dashlite:16223

 Entre dois campos empilhados isso da ~3rem. E o padrao 'form-group col-*'
 aparece em quase toda modal do projeto (equipe, agenda, anexo, configuracoes,
 perfil, widget do prontuario), entao o defeito e o mesmo em todas.

 A CORRECAO: 0.75rem de espaco ENTRE os campos, e nada nas bordas da modal.

 >>> POR QUE MEXER NA VARIAVEL --bs-gutter-y E NAO NA MARGEM DO CAMPO:
     o gutter do Bootstrap e um PAR CASADO - a .row leva margin-top NEGATIVO
     (-1 * gutter) para anular o da primeira linha (dashlite:759). Escrever
     'margin: 0.75rem 0' na coluna mexe so em um lado do par: a .row continua
     puxando -28px e a PRIMEIRA linha sobe por dentro do padding da modal,
     enquanto a ULTIMA soma a propria margem com o padding de baixo. Trocando a
     variavel, o negativo da .row acompanha e as bordas ficam limpas
     automaticamente - em qualquer modal, sem ajuste caso a caso.

 ESCOPO (proposital): so .row que tem .form-group como FILHO DIRETO, que e
 exatamente o arranjo com o defeito. Fica de fora:
   - grid que nao e de campos (switches de pagina, cards de escolha, slots da
     agenda) - continuam com o gutter que o markup pediu;
   - o arranjo SAUDAVEL '.col-* > .form-group' (campos-paciente, perfil clinico),
     onde o :last-child ja zera a margem e o ritmo e so o gutter;
   - PAGINAS - a regra e ancorada em .modal de proposito.

 O :has() e o que permite casar as duas declaracoes no MESMO conjunto (a da .row
 e a do filho). Navegador sem :has() ignora as duas juntas e cai no visual
 antigo - degrada, nao quebra. Mesmo recurso ja usado em clinica/prontuario/ver.css.
*******************************************************************************/
.modal .row:has(> .form-group) {
	--bs-gutter-y: 0.75rem;
}
.modal .row:has(> .form-group) > .form-group {
	margin-bottom: 0;
}

/*******************************************************************************
↓↓↓↓↓ MENU DE DROPDOWN COLADO (PADRAO DA CASA) ↓↓↓↓↓
********************************************************************************
 VALE PARA **TODOS** OS DROPDOWNS DO APP - `.link-list-opt` e o menu de opcoes do
 tema, usado em todo card, linha de tabela e cabecalho de widget (cards de membro
 e de equipe, linha do atendimento, modelos de anamnese, agenda...).

 O tema deixa o menu "flutuando" dentro do popover:
   .link-list-opt.no-bdr   padding: .5rem 0    -> dashlite:32629
   .link-list-opt .divider margin: .5rem 0     -> dashlite:32635

 Os dois viram ZERO aqui: o item ja tem o proprio padding (.625rem 1.25rem,
 dashlite:32640), entao o do <ul> so somava altura, e o divider entre grupos fica
 sendo uma linha real de separacao em vez de uma faixa de ar.

 SO O VERTICAL: o padding/margin lateral continua 0 como no tema, e a borda do
 item (`.link-list-opt` sem `no-bdr`) segue intacta.
*******************************************************************************/
.link-list-opt.no-bdr {
	padding-top: 0;
	padding-bottom: 0;
}
.link-list-opt .divider {
	margin-top: 0;
	margin-bottom: 0;
}

/*******************************************************************************
↓↓↓↓↓ DROPDOWN DE SELECT2 EM MODAL: NASCE INVISIVEL ATE ESTAR NO LUGAR ↓↓↓↓↓
********************************************************************************
 O select2 posiciona o dropdown SEM somar o `scrollTop` do `dropdownParent`
 (`_positionDropdown`, bundle_desminificado.js:11581). Num modal
 `modal-dialog-scrollable` o pai E o proprio elemento que rola (o `.modal-body`),
 entao o dropdown nasce `scrollTop` pixels acima do campo.

 A correcao mora no `select2:open` de clinica/prontuario.js, e ela **so pode rodar
 depois** de o select2 anexar e posicionar - ou seja, o estado errado chega a
 existir no DOM. Sem esta regra ele chega a ser PINTADO, e o dropdown salta na
 cara do usuario ("aparece, some e aparece de novo").

 QUEM PoE E TIRA A CLASSE:
   `select2:opening` (antes de anexar)  -> adiciona
   requestAnimationFrame, ja corrigido  -> remove

 `visibility` E NAO `display`: o dropdown precisa continuar OCUPANDO espaco e
 tendo altura, senao o proprio calculo de posicao (que le `outerHeight`) sairia
 zerado e a correcao nao teria o que corrigir.

 ESCOPO: so o filho direto do pai marcado - e la que o select2 anexa o container.
*******************************************************************************/
.js_select2_posicionando > .select2-container {
	visibility: hidden;
}
/*******************************************************************************
↓↓↓↓↓ BLOCO DE DATATABLE NAO LEVA O RESPIRO DE 28px DO TEMA ↓↓↓↓↓
********************************************************************************
 `.nk-block + .nk-block, .nk-block + .nk-block-head { padding-top: 28px }`
 (dashlite.css:35085) e o respiro PADRAO entre blocos irmaos. Nas listagens do
 app o bloco seguinte e sempre o card da datatable, e ali o respiro e excesso: o
 card ja tem a propria moldura e o `card-inner` ja afasta o conteudo da borda -
 o resultado e um vao grande demais entre o cabecalho da pagina e a tabela.
 Zerado em TODAS as datatables (pedido, 2026-08-24).

 >>> O ALVO E O BLOCO QUE **CONTEM** A TABELA, e nao uma classe posta no markup:
     e assim que a regra vale para as 40 datatables do sistema sem visitar
     nenhuma view - e para as proximas tambem.
 >>> `[class*="datatable-init"]` COBRE OS QUATRO INICIALIZADORES do tema de uma
     vez (`datatable-init`, `-ajax`, `-export`, `-server-side`; scripts.js:767).
     Uma lista de quatro classes exigiria oito seletores aqui - e o dobro no dia
     em que aparecer um quinto. O prefixo e o contrato: e por ele que o
     `NioApp.DataTable.init` acha as tabelas.
 >>> `:has()` E DESCENDENTE (qualquer profundidade), entao pega a estrutura usual
     `.nk-block > .card > .card-inner > table` sem depender do aninhamento.
 >>> A ESPECIFICIDADE (0,3,0) VENCE tambem `.nk-block + .nk-block-lg`
     (2.5rem, dashlite.css:35088): o bloco `nk-block-lg` tambem carrega
     `nk-block`, entao a datatable dentro dele fica zerada do mesmo jeito.
*******************************************************************************/
.nk-block + .nk-block:has([class*="datatable-init"]),
.nk-block + .nk-block-head:has([class*="datatable-init"]) {
	padding-top: 0;
}
/*******************************************************************************
↑↑↑↑↑ ...MAS DATATABLE DEPOIS DE UM CARD LEVA O RESPIRO DE VOLTA ↑↑↑↑↑
********************************************************************************
 A regra acima existe porque o bloco anterior a uma listagem e QUASE sempre o
 cabecalho da pagina (titulo + botao de acao), e ali 28px sobrava. Quando o bloco
 anterior tem um CARD, o caso e outro: sao duas molduras encostadas, e sem folga
 elas leem como um unico card partido no meio. Foi o que aconteceu em Formularios
 Pre-Consulta, onde o card do "link unico da clinica" fica logo acima da tabela
 (pedido, 2026-08-27).

 >>> O SELETOR OLHA O IRMAO ANTERIOR, e por isso nao precisa de classe no markup:
     `:has(.card)` no PRIMEIRO `.nk-block` do combinador `+` e o que distingue
     "bloco de cabecalho" de "bloco com card". Vale para qualquer tela futura com
     a mesma forma.
 >>> ESPECIFICIDADE (0,4,0) contra os (0,3,0) da regra acima — ela vence sem
     `!important`. Se um dia empatar, o que decide e a ORDEM: esta vem depois.
 >>> 28px E O VALOR DO TEMA (`.nk-block + .nk-block`, dashlite.css:35085), e nao
     um numero novo: o objetivo e devolver o respiro padrao, nao inventar outro.
*******************************************************************************/
.nk-block:has(.card) + .nk-block:has([class*="datatable-init"]) {
	padding-top: 28px;
}

/* =====================================================================================
   BOTÃO `.btn-light` NÃO FICA "APERTADO" DEPOIS DO CLIQUE
   =====================================================================================
   SINTOMA: clicar num botão cinza (o "Voltar" do rodapé da modal de cadastro, por
   exemplo) e ele PERMANECER num cinza mais forte depois da ação — como se continuasse
   pressionado. Acontece em qualquer `.btn-light` do sistema, e some quando se clica em
   outro lugar.

   CAUSA: o tema pinta o estado de foco com `:focus` puro —
   `.btn-light:focus { color: #101924; background: #b7c2d0 }` (dashlite.css:15613). O
   clique do mouse DEIXA O FOCO no botão, então a cor de foco fica na tela até o foco
   sair. Não é o `:active` (esse solta junto com o botão do mouse), é o `:focus`.

   CORREÇÃO: `:focus:not(:focus-visible)` — o navegador só casa `:focus-visible` quando o
   foco veio de teclado (ou de um campo de texto). Assim:
     - clique de mouse  -> `:focus` sem `:focus-visible` -> esta regra devolve o repouso;
     - Tab / Enter      -> `:focus-visible` casa, esta regra NÃO se aplica, e o cinza de
                           foco do tema continua marcando onde está o cursor de teclado.
   Ou seja: o realce de acessibilidade fica intacto. Tirar o `:focus` do tema (ou dar
   `blur()` no clique) apagaria a marca do teclado também.

   >>> OS VALORES DE REPOUSO VÊM DAS VARIÁVEIS DO PRÓPRIO BOTÃO (`--bs-btn-color` e
       `--bs-btn-bg`, dashlite.css:3102), e não de um hex nosso: é a MESMA fonte que o
       estado normal usa, então o dia em que o tema mudar o cinza, isto acompanha.

   >>> O SELETOR ACOMPANHA O DO TEMA, incluindo `.dual-listbox__button` (a regra
       corrigida vale para os dois) e a variante de `.dark-mode`, que empacota
       `:hover`/`:focus`/`:active` num seletor de especificidade (0,5,0) — por isso lá o
       nosso repete os dois `:not()` dele, senão perderia.
   ===================================================================================== */
.btn-light:focus:not(:focus-visible),
.dual-listbox .dual-listbox__button:focus:not(:focus-visible) {
	color: var(--bs-btn-color);
	background: var(--bs-btn-bg);
}

.dark-mode .btn-light:not(:disabled):not(.disabled):focus:not(:focus-visible),
.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled):focus:not(:focus-visible) {
	color: var(--bs-btn-color);
	background: var(--bs-btn-bg);
	border-color: var(--bs-btn-border-color);
}

/* =====================================================================================
   BADGE: O PAR `badge-dim` DO **PURPLE**, QUE O TEMA NAO SHIPPOU
   -------------------------------------------------------------------------------------
   O dashlite tem `.badge-dim.bg-*` para toda a paleta do Bootstrap + gray/lighter
   (dashlite.css:14489+) e para as versoes de `.dark-mode` (42134+). O **purple** ficou de
   fora dos dois - existem `.bg-purple`, `.text-purple` e `.bg-purple-dim`, mas nao o
   badge. Sem esta regra, `class="badge badge-dim bg-purple"` cai so no `.bg-purple`
   solido (#816bff) e o badge sai gritando ao lado dos cinco vizinhos dim.

   >>> OS VALORES NAO SAO NOSSOS: sao os do proprio tema, reaproveitados na combinacao que
       ele mesmo usa nos outros badges dim - o `color` e o `.text-purple` (13494) e o
       `background` e o `.bg-purple-dim` (13546 no claro, 41903 no escuro). Assim, no dia
       em que a paleta do tema mudar, isto acompanha por construcao.

   QUEM USA: o badge das duas SUPERVISOES na listagem de membros da clinica
   (HelpersClinicas::FUNCOES -> HelpersHtmlsClinicas::BadgeFuncao). As cinco funcoes
   antigas ficaram nas cores que o tema ja dimava; a supervisao entrou como familia nova e
   pediu a sexta cor.

   >>> AS DUAS SUPERVISOES COMPARTILHAM A COR **DE PROPOSITO**: cor marca a familia
       ("quem supervisiona"), o texto do badge diz qual das duas. Dar uma cor a cada uma
       gastaria as duas ultimas do tema (dark e gray) para uma distincao que o rotulo ja
       faz - e o gray colide com o `bg-secondary` do "Usuário".

   `border-color` ACOMPANHA O `background`: e o que o tema faz em todas as 20 regras
   irmas, e sem ele o badge herdaria a borda do `.badge` (transparente hoje, mas o par
   completo e o contrato).
   ===================================================================================== */
.badge-dim.bg-purple {
	color: #816bff;
	background-color: #efecff !important;
	border-color: #efecff;
}

.dark-mode .badge-dim.bg-purple {
	color: #816bff;
	background-color: #282c4d !important;
	border-color: #282c4d;
}
