/**
 * Estilos do que o membro vê.
 *
 * Deliberadamente sóbrio e sem cores próprias: o plugin vai ser instalado em
 * sites com identidade visual própria, e uma caixa colorida que ignora o tema
 * fica pior do que uma caixa neutra. Quem quiser personalizar sobrescreve as
 * classes lym-.
 */

.lym-bloqueado {
	max-width: 34em;
	margin: 3em auto;
	padding: 2em;
	border: 1px solid rgba( 128, 128, 128, 0.3 );
	border-radius: 8px;
	text-align: center;
}

.lym-bloqueado__titulo {
	margin: 0 0 0.5em;
	font-size: 1.4em;
}

.lym-bloqueado__texto {
	margin: 0 0 1em;
	opacity: 0.85;
}

.lym-bloqueado__produto {
	margin: 0 0 1.5em;
	font-weight: 600;
}

/*
 * Botão contornado, e não preenchido: sem saber a paleta do tema, qualquer cor
 * de fundo que eu escolhesse teria chance de brigar com o texto e ficar
 * ilegível. O contorno herda a cor do texto e funciona em tema claro e escuro.
 */
/*
 * **Link NÃO é pintado, e esta é a mudança central de 01/09/2026.**
 *
 * Este bloco fazia o contrário: pintava todo `a` dentro dos invólucros do
 * plugin com a cor de ação. Alcançava tudo de uma vez — o "voltar", o nome de
 * cada conteúdo, o "ver perfil", cada linha de aviso, o título de cada produto
 * — e o resultado foi o que o dono do site descreveu ao ver a tela: "muita
 * coisa de uma cor só e nada combinando".
 *
 * **O erro não era a cor: era a quantidade.** Numa tela em que tudo o que se
 * clica tem o mesmo tom, nenhuma peça é destaque de nada. O olho não encontra
 * o caminho, porque não há um caminho — há uma superfície uniforme.
 *
 * Agora o link herda a cor do texto e se identifica pelo SUBLINHADO. A WCAG
 * 1.4.1 proíbe distinguir link só por cor; distinguir só por sublinhado é
 * legítimo, e é o que jornal e livro fazem há um século.
 *
 * **O sublinhado é discreto no repouso e cheio no gesto.** Cinza translúcido a
 * 55% funciona sobre fundo claro e escuro sem o plugin escolher cor; no
 * ponteiro e no foco ele passa a `currentColor`, que é a confirmação de que a
 * peça respondeu.
 *
 * **Quem não é frase não leva sublinhado, e quem decide isso é o `:not()`.**
 *
 * A primeira versão pegava TODO `a` do invólucro, e atropelava os componentes:
 * o sino saía sublinhado, os botões da tela de pagamento nasciam sublinhados e
 * PERDIAM o traço no ponteiro — o inverso do que um gesto deve fazer. A causa é
 * de peso: `.lym-pagamento a` pesa (0,1,1) e vence o `text-decoration: none`
 * que `.lym-pagamento__botao` declara em (0,1,0).
 *
 * `a:not([class*="lym-"])` lê "só o link que não é peça nossa". Botão, sino,
 * capa de cartão e qualquer componente futuro ficam de fora sozinhos, sem
 * precisar dobrar classe em cada um — e um componente novo nasce protegido, em
 * vez de nascer sublinhado até alguém reparar.
 *
 * As peças do plugin que SÃO frase e devem levar traço têm regra própria — a
 * linha de cada aviso, por exemplo. Sublinhar um título é tratá-lo como
 * referência no meio de um texto, e ele não é.
 *
 * Fora dos invólucros, nada muda: o plugin não pinta link de página alheia.
 */
/*
 * **A COR vale para todo link do plugin; o SUBLINHADO, só para o que é frase.**
 *
 * São dois blocos de propósito, e a separação foi um conserto:
 *
 * O primeiro dá `color: inherit` a TODO `a` dentro dos invólucros. Sem ele, um
 * link com classe nossa — o sino, o "anterior/próximo" — cairia na cor de link
 * do TEMA do cliente, que é exatamente o que a decisão de 29/08/2026 existe
 * para evitar: um tema que pinta link de vermelho fazia três coisas normais
 * parecerem erro. A primeira versão desta separação usou um `:not()` só, e
 * abriu esse buraco.
 *
 * O segundo sublinha só o que NÃO é peça nossa. Sem o `:not()`, a regra
 * atropelava os componentes: o sino saía sublinhado, e os botões da tela de
 * pagamento nasciam sublinhados e PERDIAM o traço no ponteiro — o inverso do
 * que um gesto deve fazer. A causa é de peso: `.lym-pagamento a` pesa (0,1,1) e
 * vence o `text-decoration: none` que `.lym-pagamento__botao` declara em
 * (0,1,0).
 *
 * `a:not([class*="lym-"])` lê "só o link que não é peça nossa", e um componente
 * novo nasce protegido em vez de nascer sublinhado até alguém reparar.
 */
.lym-area a,
.lym-forma a,
.lym-menu a,
.lym-tela a,
.lym-pagina a,
.lym-indice a,
.lym-cabecalho a,
.lym-checkout a,
.lym-aviso a,
.lym-caixa-aviso a,
.lym-conta a,
.lym-pagamento a,
.lym-renovar a,
.lym-bloqueado a,
.lym-pagina-bloqueada a,
.lym-conversa a,
.lym-peca a,
.lym-sino-caixa a {
	color: inherit;
}

.lym-area a:not([class*="lym-"]),
.lym-forma a:not([class*="lym-"]),
.lym-menu a:not([class*="lym-"]),
.lym-tela a:not([class*="lym-"]),
.lym-pagina a:not([class*="lym-"]),
.lym-indice a:not([class*="lym-"]),
.lym-cabecalho a:not([class*="lym-"]),
.lym-checkout a:not([class*="lym-"]),
.lym-aviso a:not([class*="lym-"]),
.lym-caixa-aviso a:not([class*="lym-"]),
.lym-conta a:not([class*="lym-"]),
.lym-pagamento a:not([class*="lym-"]),
.lym-renovar a:not([class*="lym-"]),
.lym-bloqueado a:not([class*="lym-"]),
.lym-pagina-bloqueada a:not([class*="lym-"]),
.lym-conversa a:not([class*="lym-"]),
.lym-peca a:not([class*="lym-"]),
.lym-sino-caixa a:not([class*="lym-"]) {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/*
 * O gesto ENGROSSA o sublinhado em vez de trocar a cor: a resposta acontece na
 * mesma peça que já dizia "isto se clica", e não numa segunda pista que a
 * pessoa precisa aprender. Dobrar a espessura é perceptível e não mexe em
 * contraste nenhum.
 */
.lym-area a:not([class*="lym-"]):hover,
.lym-forma a:not([class*="lym-"]):hover,
.lym-menu a:not([class*="lym-"]):hover,
.lym-tela a:not([class*="lym-"]):hover,
.lym-pagina a:not([class*="lym-"]):hover,
.lym-indice a:not([class*="lym-"]):hover,
.lym-cabecalho a:not([class*="lym-"]):hover,
.lym-checkout a:not([class*="lym-"]):hover,
.lym-aviso a:not([class*="lym-"]):hover,
.lym-caixa-aviso a:not([class*="lym-"]):hover,
.lym-conta a:not([class*="lym-"]):hover,
.lym-pagamento a:not([class*="lym-"]):hover,
.lym-renovar a:not([class*="lym-"]):hover,
.lym-bloqueado a:not([class*="lym-"]):hover,
.lym-pagina-bloqueada a:not([class*="lym-"]):hover,
.lym-conversa a:not([class*="lym-"]):hover,
.lym-peca a:not([class*="lym-"]):hover,
.lym-sino-caixa a:not([class*="lym-"]):hover,
.lym-area a:not([class*="lym-"]):focus,
.lym-forma a:not([class*="lym-"]):focus,
.lym-menu a:not([class*="lym-"]):focus,
.lym-tela a:not([class*="lym-"]):focus,
.lym-pagina a:not([class*="lym-"]):focus,
.lym-indice a:not([class*="lym-"]):focus,
.lym-cabecalho a:not([class*="lym-"]):focus,
.lym-checkout a:not([class*="lym-"]):focus,
.lym-aviso a:not([class*="lym-"]):focus,
.lym-caixa-aviso a:not([class*="lym-"]):focus,
.lym-conta a:not([class*="lym-"]):focus,
.lym-pagamento a:not([class*="lym-"]):focus,
.lym-renovar a:not([class*="lym-"]):focus,
.lym-bloqueado a:not([class*="lym-"]):focus,
.lym-pagina-bloqueada a:not([class*="lym-"]):focus,
.lym-conversa a:not([class*="lym-"]):focus,
.lym-peca a:not([class*="lym-"]):focus,
.lym-sino-caixa a:not([class*="lym-"]):focus {
	text-decoration-thickness: 2px;
}

/*
 * **São DOIS botões, e a diferença entre eles é a hierarquia da tela.**
 *
 * Antes eram um só, contornado e escrito na cor de ação — e como quase toda
 * tela tem mais de um botão, a cor de ação aparecia várias vezes por tela sem
 * dizer qual delas era A ação. O `--cheio` existia e era só um cinza por cima
 * do mesmo desenho.
 *
 * Agora:
 *
 * - **`.lym-botao` é o secundário**, e é NEUTRO: contorno de cinza medido em
 *   3:1 e a cor do texto do tema. Ele não disputa atenção com nada.
 * - **`.lym-botao--cheio` é o principal**, e é SÓLIDO na cor de ação. Um por
 *   tela: "Abrir", "Começar", "Salvar", "Entrar", "Renovar meu acesso".
 *
 * É o desenho da Netflix, e a razão é a mesma: quando só uma peça da tela é
 * preenchida com a cor da marca, ela é o caminho — e o olho a encontra sem
 * procurar.
 *
 * **A classe é dobrada, e não é enfeite.** Um seletor de uma classe tem peso
 * menor que `.algo button` do tema — e o tema do cliente pinta botão. Dobrar
 * empata contra o tema e continua deixando o cliente mudar depois, que é o
 * motivo de este projeto não usar `!important` em botão.
 */
.lym-botao,
.lym-botao.lym-botao {
	display: inline-block;
	padding: 0.7em 1.5em;
	/*
	 * **O contorno é o que identifica o botão, então ele é MEDIDO.** Estava em
	 * 0,45, e ali dá 1,71:1 contra o branco — abaixo dos 3:1 que a WCAG 1.4.11
	 * pede para o contorno de um componente de interface. Em 0,92 dá 3,45:1 no
	 * branco e 4,13:1 no quase-preto, e passa em toda a escala em que um tema
	 * de verdade vive.
	 *
	 * O fundo de 6% não conta como identificação: ele desloca o tom em 1,05:1,
	 * que o olho usa e a régua não aceita. Ele está aqui para o botão parecer
	 * uma superfície, e não para dizer onde ele começa.
	 */
	border: 1px solid rgba( 128, 128, 128, 0.92 );
	border-radius: 8px;
	background: rgba( 128, 128, 128, 0.06 );
	color: inherit;
	font-weight: 600;
	line-height: 1.2;
	text-decoration: none;
}

/*
 * O secundário responde ao gesto ganhando presença, e não perdendo: o fundo
 * firma e o contorno acende. Opacidade menor faria o contrário — é o defeito
 * que esta folha já registra ter consertado no preenchido.
 */
.lym-botao:hover,
.lym-botao:focus,
.lym-botao.lym-botao:hover,
.lym-botao.lym-botao:focus {
	background: rgba( 128, 128, 128, 0.14 );

	/*
	 * **O contorno vai para a cor do texto no gesto, e não para um cinza mais
	 * forte.** A primeira versão punha 0,75 aqui — que é MENOS que o 0,92 do
	 * repouso, ou seja, o botão respondia ao ponteiro ficando mais fraco. É
	 * exatamente o defeito que esta folha já registra ter consertado duas vezes
	 * noutras peças: o estado de resposta ao gesto não pode ser o pior estado.
	 *
	 * `currentColor` é o teto: o contorno passa a ter o contraste do próprio
	 * texto, e não há como ficar mais presente que isso sem inventar cor.
	 */
	border-color: currentColor;
	text-decoration: none;
}

/*
 * **`display` derrota o `[hidden]` do navegador, e foi o defeito de três peças
 * de uma vez.**
 *
 * O navegador esconde com `[hidden] { display: none }`, que é regra de peso
 * ZERO. Qualquer `display` nosso numa classe vence — então o script escondia a
 * seta e o botão, e o CSS os trazia de volta. Na tela do Flávio apareceram as
 * duas setas e o "Mostrar mais produtos" com dois produtos só.
 *
 * A regra com atributo pesa mais que a da classe sozinha, e por isso vence sem
 * `!important`. Vale para todo elemento do plugin: quem esconder por script
 * daqui para a frente já nasce coberto.
 */
/*
 * O atributo aparece TRÊS vezes de propósito. Este projeto dobra a classe para
 * empatar com o tema do cliente (`.lym-botao.lym-botao`), e uma regra dobrada
 * pesaria o mesmo que esta se ela citasse o `[hidden]` só uma vez — e num empate
 * vence quem vier depois no arquivo, o que é regra invisível e muda sozinha se
 * alguém mover um bloco. Repetido, ele pesa mais que qualquer classe dobrada,
 * sem `!important` e sem impedir o cliente de escrever a dele.
 */
[class^="lym-"][hidden][hidden][hidden],
[class*=" lym-"][hidden][hidden][hidden] {
	display: none;
}

/*
 * **Receber o foco não pode PIORAR o contraste, e era o que acontecia.**
 *
 * O único tratamento de foco dos botões era `opacity: 0.75`, e opacidade não
 * deixa a cor mais fraca: ela troca a cor pela mistura com o fundo. A cor de
 * link a 75% sobre o cartão dá 4,20:1 — reprova AA. E quem navega por teclado é a
 * única pessoa que vê esse estado, ou seja, o pior estado da tela era o dela.
 *
 * A opacidade fica só no ponteiro, que é onde ela é só um retorno de gesto. O
 * foco ganha anel, como a bolinha de concluído já tem — e `:focus-visible` para
 * o anel não aparecer em quem clicou com o mouse.
 */
/*
 * **O `opacity: 0.85` do ponteiro saiu em 01/09/2026.** Ele sobrou da época em
 * que o botão era um contorno sobre o fundo da página, e com o botão SÓLIDO
 * ele passou a misturar o vermelho inteiro com a página: no tema escuro o
 * preenchimento escurece, a letra branca escurece junto, e o par perde
 * contraste — o inverso do que um retorno de gesto deve fazer.
 *
 * A resposta ao ponteiro agora está nas regras de cada botão: o secundário
 * firma o fundo e acende o contorno, o principal aprofunda o gradiente.
 */
.lym-botao:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

/*
 * **O anel do botão PRINCIPAL não pode ser `currentColor`, e essa é a armadilha
 * do botão sólido.**
 *
 * Ali `currentColor` é a letra — branca. E o anel é desenhado com
 * `outline-offset`, ou seja FORA do botão, sobre a página: branco sobre uma
 * página clara é um anel invisível, e quem navega por teclado perde a única
 * indicação de onde está.
 *
 * A cor de ação resolve porque ela é o par MEDIDO contra o fundo da página —
 * que é exatamente a superfície sobre a qual o anel é desenhado. É o mesmo
 * raciocínio do preenchimento, ao contrário: lá a conta é contra o botão, aqui
 * é contra a página.
 */
.lym-botao--cheio:focus-visible,
.lym-botao--cheio.lym-botao--cheio:focus-visible {
	outline-color: var( --lym-link, #c40812 );
}

/*
 * **Este comentário descrevia o botão translúcido, que deixou de existir.** Ele
 * dizia que preencher com a cor da marca exigiria saber o fundo da página — e a
 * saída foi outra: um preenchimento SÓLIDO não precisa saber o fundo, porque
 * ele é o fundo. A conta que sobra é a letra contra o preenchimento, e os dois
 * são nossos.
 *
 * O que segue é a história do cinza que ele usava, mantida porque é ela que
 * explica por que o sólido resolve mais que uma escolha de tom.
 */
/*
 * **O cinza clareou, e era conserto de contraste medido.**
 *
 * Estava em 0,22, e sobre o cartão claro isso dá um fundo #dbdbdb: a cor de
 * link em cima dele fica em 4,47:1, contra os 4,5:1 que a WCAG exige. E o
 * texto do botão é 13,6px em negrito — abaixo dos 18,66px que fariam dele
 * "texto grande" e baixariam a exigência.
 *
 * Não é falha de escolha de cor: é o preenchimento comendo o contraste que a
 * cor tinha. Em 0,10 o fundo vira #e9e9e9 e a mesma cor passa a 5,10:1.
 */
/*
 * **Os modificadores dobram a classe pela MESMA razão que a base dobra, e sem
 * isso metade do que eles declaram era inerte.**
 *
 * A regra base é uma LISTA — `.lym-botao, .lym-botao.lym-botao` — e numa lista
 * vale o membro mais específico que casar: para qualquer botão do plugin ela
 * pesa (0,2,0). Um modificador de classe única pesa (0,1,0) e PERDE, mesmo
 * vindo depois no arquivo.
 *
 * O que estava morto: `border-color: transparent` e `font-weight: 700` aqui, e
 * `padding`, `border-width` e `font-weight` no `--fraco`. Só `background` e
 * `font-size` sobreviviam, porque a base não os declara.
 *
 * Na tela isso aparecia como **contorno de 2px na cor de ação em volta do botão
 * preenchido** — a peça em que a cor do plugin já ocupa mais espaço, com o
 * contorno somando mais dela sem dizer nada — e como um "botão fraco" do mesmo
 * tamanho e do mesmo peso do botão normal, ou seja, sem nada de fraco.
 *
 * Achado por revisão adversarial em 01/09/2026. É a família que este arquivo já
 * registra: regra que parece fazer alguma coisa e não faz.
 */
/*
 * **O preenchimento é a cor da marca, e ele NÃO usa o tom medido.**
 *
 * `--lym-link` é um par escolhido contra o fundo da PÁGINA: no tema escuro ele
 * vira o tom claro, e um preenchimento claro com letra branca dá 3,18:1 —
 * reprova. A conta muda porque um botão sólido **carrega o próprio fundo**: o
 * que precisa contrastar ali é a letra contra o preenchimento, e isso não
 * depende do tema do cliente.
 *
 * Por isso o valor é fixo nos dois temas, e por isso ele pode ser o vermelho
 * cru da Netflix: branco sobre `#e50914` dá 4,79:1 e sobre `#c40812` dá 6,19:1
 * — os dois passam em AA.
 *
 * **O gradiente escurece para BAIXO, e a direção foi medida.** Clarear o topo
 * derrubaria a letra branca abaixo de 4,5. Descendo, todo ponto do botão fica
 * entre 4,79 e 6,19 — e o efeito é o de uma peça iluminada de cima, que é o que
 * dá volume a um botão num fundo escuro sem sombra nenhuma.
 *
 * Os dois tons do gradiente são os DOIS vermelhos da família: o do fundo claro
 * e o do escuro, um em cima do outro. O botão é a paleta inteira numa peça só.
 */
.lym-botao--cheio,
.lym-botao--cheio.lym-botao--cheio {
	border-color: transparent;
	background-color: var( --lym-acao-cheio );
	background-image: linear-gradient(
		var( --lym-acao-alto ),
		var( --lym-acao-cheio )
	);

	/*
	 * **A única cor literal desta folha, e a exceção é a de sempre**: a letra
	 * precisa contrastar com o PREENCHIMENTO, não com a página, e nem o CSS nem
	 * o plugin sabem calcular esse contraste. Sai como valor de reserva, então
	 * quem trocar o preenchimento por um tom claro troca uma linha.
	 */
	color: var( --lym-acao-texto );
	font-weight: 700;
}

/*
 * **O ponteiro ESCURECE menos que antes, de propósito.** Ia a 0,32, e o estado
 * de resposta ao gesto ficava com menos contraste que o de repouso — o inverso
 * do que um retorno de interface deve fazer.
 *
 * **E desceu de 0,16 para 0,13 em 01/09/2026, por medida e não por gosto.** A
 * conta de 0,16 tinha sido feita só sobre o cartão CLARO. Refeita sobre o
 * escuro de fábrica (#121416), a cor de ação em cima dela dava **4,35:1** — ou
 * seja, o estado de resposta ao gesto voltava a reprovar, que é exatamente o
 * defeito que o parágrafo acima registra ter consertado uma vez.
 *
 * 0,13 é o maior valor que passa nos dois temas: 4,53:1 no escuro e 4,96:1 no
 * claro. Acima disso o escuro cai.
 *
 * **A conta que decide um valor destes é a do tema ESCURO**, e não a do claro:
 * a cor de ação é mais clara que o fundo ali, então cada grau de cinza a
 * aproxima do texto em vez de afastar. No claro acontece o contrário, e é por
 * isso que medir só um lado aprova o que o outro reprova.
 */
/*
 * **No gesto o botão APROFUNDA, e isso aumenta o contraste da letra.** O
 * gradiente desce um degrau na própria família: o topo passa a ser o tom que
 * antes era a base. Branco sobre os dois pontos continua acima de 6:1.
 *
 * Escurecer é a direção certa aqui pela mesma razão de sempre — o estado de
 * resposta ao gesto não pode ser o pior estado da tela, que é o que uma
 * opacidade menor faria.
 */
.lym-botao--cheio:hover,
.lym-botao--cheio:focus,
.lym-botao--cheio.lym-botao--cheio:hover,
.lym-botao--cheio.lym-botao--cheio:focus {
	background-color: var( --lym-acao-baixo );
	background-image: linear-gradient(
		var( --lym-acao-cheio ),
		var( --lym-acao-baixo )
	);

	/*
	 * **A borda precisa ser repetida aqui, e o motivo é de peso.** O gesto do
	 * botão base é `.lym-botao.lym-botao:hover`, que pesa (0,3,0) — mais que o
	 * `.lym-botao--cheio.lym-botao--cheio` (0,2,0) que zera a borda no repouso.
	 * Sem esta linha, passar o ponteiro no botão sólido desenhava um contorno
	 * da cor da letra em volta dele: um retângulo branco onde não deveria haver
	 * borda nenhuma.
	 */
	border-color: transparent;
	opacity: 1;
}

/*
 * **Enquanto envia, o botão PARECE desabilitado — e já estava.** A trava de clique
 * duplo do `publico.js` desabilita os botões de enviar da caixa durante o envio,
 * e nada aqui dizia isso: numa rede lenta o botão ficava igual, a pessoa achava
 * que travou, recarregava e perdia o que tinha escrito ou gravado.
 *
 * **Aqui a opacidade é a informação, e não um tom mais discreto.** É a exceção
 * que a regra "opacidade troca a cor" admite: componente desabilitado não tem
 * piso de contraste na WCAG, e o que a peça diz é justamente "agora não" — como o
 * item trancado do índice. Ela dura o tempo do envio, e o botão volta sozinho.
 *
 * **Três classes, e é o peso que decide.** O botão sólido declara `opacity: 1`
 * no `:focus` e no `:hover` com `.lym-botao--cheio.lym-botao--cheio`, que pesa
 * (0,3,0) — e o botão que acabou de ser apertado tem o foco, e no telefone fica
 * "sob o dedo". Com duas classes a regra empataria e perderia ou ganharia pela
 * ordem no arquivo.
 */
.lym-botao.lym-botao.lym-botao:disabled {
	cursor: progress;
	opacity: 0.55;
}

.lym-botao--fraco,
.lym-botao--fraco.lym-botao--fraco {
	padding: 0.5em 1.1em;
	border-width: 1px;
	font-weight: 400;
	font-size: 0.9em;
}

.lym-pagina-bloqueada {
	min-height: 40vh;
}

/*
 * Sem cabeçalho e rodapé do tema, a caixa fica sozinha e centralizada.
 *
 * Em coluna, para o que o dono acrescentar pelo filtro `lym_html_bloqueado` ficar
 * embaixo da caixa e não ao lado dela. (A saída "Ir para os meus produtos", que
 * morava ali, saiu em 16/09/2026.)
 */
.lym-pagina-bloqueada--limpa {
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	min-height: 100vh;
	padding: 1em;
}

.lym-pagina-bloqueada--limpa .lym-bloqueado {
	margin: 0;
}

/*
 * A área de membros.
 *
 * Nenhuma cor própria. Tudo herda a cor do texto do tema, e as separações são
 * feitas com transparência sobre o fundo — o que funciona em tema claro e em
 * tema escuro sem precisar saber qual dos dois é. Um plugin que impõe a paleta
 * dele fica certo no primeiro site e errado em todos os outros.
 *
 * As variáveis existem para que quem for personalizar mude três linhas em vez
 * de caçar cinquenta.
 */
.lym-pagina,
.lym-menu,
.lym-tela,
.lym-area,
.lym-forma,
.lym-indice,
.lym-cabecalho,
.lym-checkout,
.lym-aviso,
.lym-pagamento,
.lym-renovar,
.lym-bloqueado,
.lym-pagina-bloqueada,
.lym-caixa-aviso,
.lym-conta,
.lym-conversa,
.lym-peca,
.lym-sino-caixa {
	--lym-borda: rgba( 128, 128, 128, 0.25 );
	--lym-fundo: rgba( 128, 128, 128, 0.08 );
	--lym-raio: 14px;

	/*
	 * **A cor de link das telas do plugin, e ela é VERMELHA desde 01/09/2026.**
	 *
	 * A história tem três capítulos, e o terceiro só se entende com os dois
	 * primeiros:
	 *
	 * 1. Não declarar cor nenhuma, para usar a do tema. Razão boa — escolher
	 *    uma criaria um segundo tom na mesma página.
	 * 2. Declarar azul (29/08/2026), porque um tema que pinta link de VERMELHO
	 *    fazia o botão de começar, o nome de cada conteúdo e o "voltar" saírem
	 *    com cara de erro: três coisas normais parecendo problema.
	 * 3. Declarar VERMELHO (01/09/2026), a pedido do Flávio, que não gostou do
	 *    azul em tudo e pediu a família de cor da Netflix.
	 *
	 * **O capítulo 2 não foi desfeito, foi resolvido de outro jeito.** O medo
	 * dele era um vermelho de ERRO no meio de coisa normal — vermelho vindo do
	 * tema, sem intenção, em apenas algumas peças. Aqui o vermelho é a cor de
	 * TODA ação do plugin: quando é a cor de tudo o que se clica, ela deixa de
	 * significar "deu errado" e passa a significar "aqui se clica", que é
	 * exatamente o que a Netflix faz com o mesmo tom.
	 *
	 * **O que NÃO se resolveu, e fica registrado:** `--lym-alerta` (o "gravando
	 * agora") também é vermelha, e agora divide a família com a cor de ação.
	 * Com o azul havia **418** pontos de distância perceptual entre as duas no
	 * tema claro e 352 no escuro; com o vermelho entregue há **46** e **61**.
	 *
	 * **Os números são do par ENTREGUE**, e uma versão anterior deste comentário
	 * dizia 84 — que é a distância do `#e50914` que foi REJEITADO por contraste.
	 * Medir a colisão contra uma cor que não entrou fazia o registro parecer
	 * duas vezes menos apertado do que é. Achado por revisão adversarial.
	 *
	 * Cor vermelha nenhuma dá muito mais que isso: é propriedade da família, e
	 * não escolha ruim. Enquanto a decisão registrada de `--lym-alerta` não for
	 * revista com o Flávio, as duas convivem separadas pelo CONTEXTO — o alerta
	 * só existe com o microfone aberto, ao lado de um cronômetro correndo, e
	 * some quando a gravação para.
	 *
	 * O valor é uma VARIÁVEL: quem tiver a própria marca troca uma linha.
	 */
	--lym-link: #c40812;

	/*
	 * **Duas cores com PAPEL, e nenhuma com valor de marca.**
	 *
	 * `--lym-nome` pinta quem assinou cada mensagem. Numa conversa longa, o
	 * nome com a mesma cor do texto faz a lista virar um bloco só — a pessoa
	 * perde onde uma fala acaba e a outra começa.
	 *
	 * `--lym-alerta` é o "gravando agora" — o cronômetro que corre enquanto o
	 * microfone está aberto. Vermelho ali não é decoração: é a única coisa que
	 * avisa que o site ainda está ouvindo, sem exigir leitura.
	 *
	 * **Este comentário dizia "e o que apaga", e isso é falso**: a variável tem
	 * UM consumidor na folha inteira, e é o estado da gravação. Nada que apague
	 * usa cor nenhuma — as ações destrutivas do plugin são botões de texto. Um
	 * comentário que promete um segundo uso faz a próxima pessoa procurá-lo e
	 * concluir que ele sumiu.
	 *
	 * **A cadeia tem TRÊS degraus, e a ordem é a decisão.**
	 *
	 * 1. `--lym-nome` — o que o dono do site escolheu em Configurações. Sai como
	 *    estilo em linha na própria peça, e vence tudo.
	 * 2. `--lym-nome-medido` — o padrão, escolhido pelo script depois de MEDIR o
	 *    fundo real da página. Ele existe porque nenhuma cor única passa em
	 *    4,5:1 contra fundo claro e contra fundo escuro: o melhor âmbar dá 5,0
	 *    no branco e 3,5 no quase-preto. Sem par medido, todo padrão seria
	 *    ilegível em metade dos sites.
	 * 3. `currentColor` — sem JavaScript, o comportamento de sempre.
	 *
	 * **O sufixo existe para o dono continuar mandando.** Se o script escrevesse
	 * direto em `--lym-nome`, ele sobrescreveria a escolha de quem instalou —
	 * estilo em linha contra estilo em linha, e o último a escrever vence.
	 *
	 * A folha continua sem cor de marca: o valor de reserva aqui é
	 * `currentColor`, e os tons medidos moram no script, escolhidos por conta e
	 * não por gosto. Existe teste que falha se cor de marca voltar a esta folha.
	 *
	 * **E as duas NÃO são declaradas aqui, o que parece descuido e é a peça que
	 * faz a cadeia funcionar.** Elas estavam, com o valor `currentColor` — e uma
	 * variável DECLARADA nunca cai no valor de reserva do `var()`. Com elas no
	 * ar, `var( --lym-nome, var( --lym-nome-medido, currentColor ) )` resolvia
	 * direto para `currentColor` e o tom medido não chegava a existir: o degrau
	 * do meio era decoração.
	 *
	 * O comportamento sem JavaScript não muda, porque o último degrau da cadeia
	 * é o mesmo `currentColor` que estava aqui.
	 */
	/*
	 * **O brilho do que chegou desde a última visita, e ele é ÂMBAR desde
	 * 01/09/2026.**
	 *
	 * Era cinza translúcido, pela regra de não escolher cor — e o efeito era
	 * que "novo" ficava com o mesmo tom de todas as outras separações da tela,
	 * que também são cinza translúcido. O destaque não destacava.
	 *
	 * Âmbar aqui não é decoração: é o mesmo papel do prazo que está acabando e
	 * da etiqueta de estado — "isto quer a sua atenção". A 14% ele desloca o
	 * fundo o bastante para o olho achar a linha e de menos para mexer no
	 * contraste do texto por cima. Medido contra o cinza que ele substituiu: o
	 * texto do tema PERDE 0,27 de razão no tema escuro (de 12,17 para 11,91) e
	 * GANHA 1,53 no claro (de 15,41 para 16,94). Os dois continuam muito acima
	 * de qualquer piso.
	 *
	 * Continua configurável — mas só por hexadecimal, então quem escolher ali
	 * troca o véu translúcido por um fundo opaco. É limitação antiga da tela de
	 * Configurações, e não desta cor.
	 */
	--lym-novo: rgba( 245, 158, 11, 0.14 );

	/*
	 * ---------------------------------------------------------------------
	 * **Os PAPÉIS de cor, e a regra que os governa (01/09/2026).**
	 *
	 * A versão anterior pintava TODA peça clicável com a mesma cor de ação, e
	 * o dono do site resumiu o resultado: "ficou pior do que tudo azul; o
	 * problema está em ter muita coisa de uma cor só e nada combinando".
	 *
	 * Ele tinha razão, e a razão tem nome. **Cor não é como se diz "clicável";
	 * cor é como se diz "este, entre tudo o que está na tela".** Quando o
	 * título, o nome do item, o voltar, o botão e o menu são todos do mesmo
	 * tom, nenhum deles é destaque de nada — sobra ruído, e a tela deixa de ter
	 * um caminho.
	 *
	 * A regra que passou a valer:
	 *
	 * 1. **A maior parte da interface é NEUTRA.** A hierarquia sai de tamanho,
	 *    peso e espaço — que é o que uma tela escura faz bem, e o que não
	 *    depende de o plugin conhecer o tema do cliente.
	 * 2. **Cada matiz tem UM trabalho**, e aparece pouco justamente para ser
	 *    notado quando aparece.
	 * 3. **Nada é pintado por ser link.** Link se identifica por sublinhado.
	 *
	 * Os quatro papéis, e nenhum deles é decoração:
	 *
	 * - `--lym-link`  — a AÇÃO em TEXTO: o anel de foco. Vermelho, e é um PAR
	 *                   medido contra o fundo da página. (Pintava também a faixa
	 *                   do item aberto no índice, que saiu a pedido do Flávio em
	 *                   16/09/2026, e o coração curtido, que virou verde em
	 *                   20/09/2026 — `--lym-curtido`.)
	 * - `--lym-acao-*` — a mesma AÇÃO em PREENCHIMENTO: o botão principal (um
	 *                   por tela) e a bolinha do sino. **Não é par**, e a
	 *                   distinção não é detalhe: um preenchimento carrega o
	 *                   próprio fundo, então a conta é a letra contra ELE e não
	 *                   muda com o tema. Tratar os dois como a mesma coisa poria
	 *                   a bolinha em vermelho claro com letra branca — 3,18:1.
	 * - `--lym-feito` — o que já foi CONCLUÍDO: a onda já tocada de uma
	 *                   mensagem de voz. Verde.
	 * - `--lym-atencao` — o que é NOVO ou está para acabar. Âmbar.
	 * - `--lym-info`  — a nota que explica, e ORIENTAÇÃO na coluna do
	 *                   produto: o nome do módulo, a bolinha cheia, o anel de
	 *                   progresso e o ícone do sino. Azul. (A bolinha e o anel
	 *                   eram do verde até 16/09/2026; o Flávio os pediu no
	 *                   mesmo azul dos módulos, e o azul ganhou um trabalho a
	 *                   mais em troca de a coluna ter uma cor só de orientação.)
	 *
	 * **Todos são pares medidos**, como a cor de ação: nenhuma cor única passa
	 * em 4,5:1 contra fundo claro E contra fundo escuro, e quem escolhe entre
	 * os dois tons é o script, lendo o fundo real. Estes valores são o de
	 * reserva. Existe teste que refaz cada conta.
	 *
	 * **Os quatro tons CLAROS ficam na mesma faixa de luminância** — 0,115 a
	 * 0,159 —, então num tema claro nenhum grita mais alto que os outros.
	 *
	 * **Nos ESCUROS não ficam, e isso é propriedade do matiz e não descuido**:
	 * o vermelho dá 0,28 e o âmbar 0,44, porque um âmbar escuro deixa de ser
	 * âmbar. É o mesmo limite que obriga cada papel a ter dois tons.
	 *
	 * O que equilibra a tela não é a luminância: é a ÁREA. O vermelho aparece
	 * como preenchimento de um botão inteiro; o âmbar, como uma palavra ou uma
	 * pílula. Um botão sólido pesa mais na tela que qualquer texto colorido, e é
	 * por isso que a hierarquia continua de pé mesmo com o âmbar mais luminoso.
	 * ---------------------------------------------------------------------
	 */
	--lym-feito: #15803d;
	--lym-atencao: #a4490a;
	--lym-info: #1d5faf;

	/*
	 * **O coração curtido, e ele saiu de `--lym-link` a pedido do Flávio**
	 * (20/09/2026): ele quis o verde do botão de compartilhar da página do evento
	 * dele, `#4a9e72`, e quis em toda conversa — página aberta, conteúdo, grupo e
	 * suporte.
	 *
	 * **É um PAR, porque o verde dele reprova no tema claro.** Medido sobre o
	 * balão da mensagem, que é onde o botão de fato mora (cinza translúcido de 8%
	 * sobre a página): `#4a9e72` dá 5,18:1 no escuro e **3,00:1 no claro** — e
	 * este botão leva TEXTO junto do desenho ("Curtir" ou o número), então o piso
	 * é 4,5 e não os 3:1 de ícone. O tom do claro é o mesmo verde trazido para
	 * baixo até passar: 4,86:1 no balão, 5,30:1 na página.
	 *
	 * **O gesto não entra nesta conta**, e é de propósito: o `:hover` da fileira
	 * devolve `color: inherit` com peso maior, então o botão apontado volta à cor
	 * do texto. A cor só precisa sobreviver ao repouso.
	 */
	--lym-curtido: #1f7a52;

	/*
	 * **Os tons do PREENCHIMENTO da ação, e eles não têm par por construção.**
	 *
	 * Os quatro papéis acima são cor de TEXTO, e por isso são medidos contra o
	 * fundo da página. Estes três são o preenchimento de um botão sólido, que
	 * carrega o próprio fundo: a conta que importa é a letra contra ELES, e essa
	 * não muda com o tema do cliente. Um só valor serve aos dois.
	 *
	 * `alto` é o topo do gradiente e `cheio` a base; no gesto o par desce um
	 * degrau, para `cheio` e `baixo`. Branco sobre os três dá 4,79, 6,19 e 8,11.
	 *
	 * **A letra é a única cor literal que este plugin escolhe**, e a exceção é a
	 * de sempre: ela precisa contrastar com o preenchimento, não com a página, e
	 * nem o CSS nem o plugin sabem calcular esse contraste.
	 */
	--lym-acao-alto: #e50914;
	--lym-acao-cheio: #c40812;
	--lym-acao-baixo: #a30610;
	--lym-acao-texto: #ffffff;
}

/*
 * **O verde escuro do ícone do Grupo, e ele é FIXO de propósito.** O Flávio pediu
 * "verde escuro" em 16/09/2026. O verde medido do plugin (o par de `--lym-feito`)
 * sai CLARO no tema escuro, que é justamente o do site dele — então o pedido não
 * cabia num par.
 *
 * Fixo é aceitável aqui, e só aqui, porque ele pinta um ÍCONE, e ícone pede 3:1
 * (WCAG 1.4.11), não os 4,5:1 de texto. Medido: 5,02:1 sobre branco, 3,76:1 sobre
 * `#111111` e 3,68:1 sobre o `#121416` do tema forçado escuro — passa nos dois
 * extremos, como os preenchimentos acima. No cinza médio não passa, e nenhuma cor
 * passa ali.
 *
 * **Declarado no próprio MENU, e não nos invólucros.** O ícone só existe dentro
 * de `.lym-menu-lateral`, e o menu não é invólucro: dentro da moldura ele herdava
 * de `.lym-tela`, mas `[lym_menu]` colado numa página do construtor não tem
 * invólucro nenhum em volta, e o ícone caía na cor do texto — a mesma peça com
 * cores diferentes conforme a página, que é a queixa que trouxe esta cor.
 */
.lym-menu-lateral {
	--lym-grupo: #15803d;
}

/*
 * **O mesmo vermelho não serve nos dois fundos.** `#c40812` tem contraste
 * 6,19:1 sobre branco — passa no critério AA — e cai para 3,02:1 sobre um fundo
 * quase preto. O plugin não sabe o fundo da página do cliente, mas o navegador
 * sabe o que a pessoa escolheu no aparelho, e é a melhor informação disponível
 * sem chutar.
 *
 * Área de membros escura é a maioria delas, e é exatamente onde o vermelho
 * claro precisa entrar: `#fb565e` sobre um fundo quase preto dá 5,93:1.
 *
 * **Os dois têm o MESMO matiz (357°), e isso não é enfeite.** São a mesma cor
 * em duas claridades, e não duas cores parecidas: quem abre o site claro e o
 * escuro no mesmo dia reconhece a marca nos dois. O tom claro é o vermelho da
 * Netflix trazido para baixo o bastante para sobreviver ao preenchimento do
 * botão — `#e50914` cru dá 4,79:1 sobre branco e despenca para 3,95:1 sobre o
 * cinza de 10% do `.lym-botao--cheio`, que reprova. Foi medido antes de
 * escolher, e existe teste que refaz a conta.
 */
/*
 * **Este bloco é o VALOR DE RESERVA, e não a decisão.** Quem decide de verdade é
 * o script, lendo o fundo que a página realmente tem — ver `pintarLinks()` em
 * publico.js.
 *
 * A razão de não bastar: `prefers-color-scheme` é a preferência do APARELHO, e
 * o fundo é do TEMA. As duas coisas se separam o tempo todo — um site claro
 * aberto por quem deixou o celular em modo escuro recebia `#63b3ff` sobre
 * branco, que dá 2,2:1 e é ilegível. Medido, o caso simétrico também reprovava.
 *
 * Fica como reserva porque é melhor que nada para quem não tem JavaScript: ali
 * o palpite acerta sempre que o dono do site seguiu a preferência do sistema,
 * que é o caso comum.
 */
@media ( prefers-color-scheme: dark ) {
	.lym-pagina,
	.lym-menu,
	.lym-tela,
	.lym-area,
	.lym-forma,
	.lym-indice,
	.lym-cabecalho,
	.lym-checkout,
	.lym-aviso,
	.lym-pagamento,
	.lym-renovar,
	.lym-bloqueado,
	.lym-pagina-bloqueada,
	.lym-caixa-aviso,
	.lym-conta,
	.lym-conversa,
	.lym-peca,
	.lym-sino-caixa {
		--lym-link: #fb565e;

		/* Os mesmos quatro papéis, no tom que serve a fundo escuro. */
		--lym-feito: #22c55e;
		--lym-atencao: #f59e0b;
		--lym-info: #6eacf7;

		/* O verde do compartilhar da página do evento, que é onde ele nasceu. */
		--lym-curtido: #4a9e72;

		/*
		 * **Sem isto, um formulário nosso numa página escura sai com caixa
		 * BRANCA e letra preta.** Campo de texto, seletor de arquivo, tocador
		 * de áudio e barra de rolagem não são desenhados pela folha: quem os
		 * pinta é o navegador, e o padrão dele é claro. Nenhum seletor CSS
		 * alcança essas peças — só esta propriedade.
		 *
		 * Aqui é o VALOR DE RESERVA, como a cor de link: quem decide de verdade é o
		 * script, medindo o fundo que a página realmente tem.
		 */
		color-scheme: dark;
	}
}

/*
 * **O respiro do topo é pequeno, e diminui na tela pequena.**
 *
 * Eram 3rem em toda largura, e numa tela cujo único trabalho é mostrar o que a
 * pessoa comprou isso era conteúdo empurrado para baixo da dobra sem ganhar
 * nada. No celular custava ainda mais caro: a dobra ali tem meia tela, e 3rem
 * dela é o topo vazio.
 *
 * O respiro não vai a zero porque o modelo desenha a página inteira — sem
 * nenhum, o título encosta na barra do navegador.
 */
/*
 * **`100vh` mais `padding` não é uma tela: é uma tela mais o padding.**
 *
 * Sem `border-box`, o `min-height` mede a caixa de CONTEÚDO — então toda página
 * da moldura nasce mais alta que a janela e ganha rolagem vertical mesmo quando
 * o conteúdo cabe. Numa tela de celular são 100px a mais, e a pessoa rola para
 * descobrir que embaixo não tem nada.
 */
.lym-pagina--limpa {
	box-sizing: border-box;
	min-height: 100vh;
	padding: 1.25rem 1.25rem 5rem;
}

@media ( min-width: 783px ) {
	.lym-pagina--limpa {
		padding-top: 1.75rem;
	}
}

.lym-area {
	margin: 0 auto;
	max-width: 54rem;
}

/*
 * A margem do primeiro elemento não soma ao respiro de cima.
 *
 * **Sozinha ela não resolvia o pedido, e o comentário anterior dizia que sim.**
 * O espaço que o Flávio via era o `padding` do modelo, logo acima — esta regra
 * só impede que a margem do `<h1>` se some a ele. As duas são necessárias, e é
 * por isso que a primeira sem a segunda não mudava um pixel.
 */
.lym-area > :first-child {
	margin-top: 0;
}

/*
 * A segunda fileira: o que a pessoa ainda não tem. Separada por respiro, e não
 * por linha — a linha divide a tela em duas metades de mesmo peso, e estas duas
 * não têm o mesmo peso nenhum.
 */
.lym-vitrine__titulo {
	margin: 3rem 0 1.25rem;
	font-size: 1.15rem;
	opacity: 0.75;
}

.lym-titulo {
	margin: 0 0 1rem;
	font-size: 1.7rem;
	line-height: 1.2;
}

.lym-voltar {
	margin: 0 0 1.25rem;
	font-size: 0.9rem;
	opacity: 0.7;
}

/*
 * **O "voltar" MANTÉM o sublinhado, e a regra que o tirava saiu em 01/09/2026.**
 *
 * Ela fazia sentido quando o link era pintado: a cor já dizia que ele era
 * clicável, e o traço seria redundante. Sem a cor, tirar o traço também deixa
 * a peça sem nada — e ela ainda mora dentro de um parágrafo com opacidade 0,7,
 * ou seja, é o link mais discreto da tela.
 *
 * A seta ← ajuda e não basta: ela é um caractere, e um caractere não diz que o
 * texto ao lado responde ao clique.
 */
.lym-voltar a {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/*
 * A barra usa currentColor com transparência: é a única forma de desenhar
 * "cheio" e "vazio" sem escolher duas cores que podem sumir no tema de quem
 * instalar.
 */
.lym-barra {
	height: 5px;
	border-radius: 999px;
	background: rgba( 128, 128, 128, 0.28 );
	overflow: hidden;
}

.lym-barra__cheio {
	display: block;
	height: 100%;
	border-radius: 999px;
	background: currentColor;
}

/*
 * O anel de progresso é um gradiente cônico. Onde o navegador não souber
 * desenhá-lo sobra o círculo com o número dentro, que é a informação — nada
 * aqui depende do anel para ser entendido.
 */
.lym-anel {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 52px;
	height: 52px;
}

/*
 * O buraco do meio é feito com máscara, e não com um círculo opaco por cima: um
 * círculo opaco precisaria da cor de fundo da página, que o plugin não conhece.
 * Onde a máscara não existir, sobra um disco com o número em cima — feio, mas
 * ainda responde à pergunta.
 */
.lym-anel::before {
	content: "";
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	border-radius: 50%;
	background: rgba( 128, 128, 128, 0.28 );

	/*
	 * **O arco é AZUL, o mesmo azul dos nomes de módulo e da bolinha cheia.**
	 * Pedido do Flávio em 16/09/2026; até ali era o verde de concluído. Ele mede
	 * o quanto já foi concluído, e é a mesma frase que a lista abaixo dele conta
	 * item por item — por isso a cor é a MESMA cadeia da bolinha marcada: a do
	 * produto, quando o dono escolheu uma, e senão o azul medido (`--lym-info`).
	 * Duas cadeias escritas separadas é como o anel e a bolinha começam a sair
	 * em azuis diferentes.
	 *
	 * O resto da volta continua cinza translúcido: o que falta não é um estado,
	 * é a ausência de um.
	 */
	background: conic-gradient( var( --lym-destaque, var( --lym-info, currentColor ) ) var( --lym-pct, 0% ), rgba( 128, 128, 128, 0.28 ) 0 );
	-webkit-mask: radial-gradient( farthest-side, rgba( 0, 0, 0, 0 ) 66%, #000 68% );
	mask: radial-gradient( farthest-side, rgba( 0, 0, 0, 0 ) 66%, #000 68% );
}

.lym-anel__valor {
	position: relative;
	font-size: 0.72rem;
	font-weight: 700;
}

/* A lista de produtos, em cartões com capa */

.lym-cartoes,
.lym-itens,
.lym-menu__itens {
	margin: 0;
	padding: 0;
	list-style: none;
}

.lym-cartoes {
	display: grid;
	grid-template-columns: repeat( auto-fill, minmax( 16rem, 1fr ) );
	gap: 1.5rem;
}

/* ==========================================================================
 * Alvo de toque: 44px, e o DESENHO não muda.
 *
 * A auditoria de 30/08/2026 mediu nove controles do plugin entre 19 e 34px de
 * altura clicável — o mínimo que um dedo acerta com confiança é 44. O erro é
 * sempre o mesmo e é fácil de não ver: o alvo parece grande porque é LARGO, e
 * a altura é a de meia linha de texto.
 *
 * O padrão aqui é `inline-flex` com `min-height`, que cresce a área sem mexer
 * na fonte nem no espaçamento em volta — e, onde o controle vive dentro de uma
 * linha apertada, `padding` com `margin` negativa, que cresce o alvo e devolve
 * o espaço.
 *
 * Vale só no toque: no computador o ponteiro acerta 20px sem esforço, e forçar
 * 44 ali engordaria listas inteiras à toa.
 * ========================================================================== */

@media ( max-width: 782px ) {
	/*
	 * **A classe do botão é DOBRADA na regra base, e por isso ela precisa ser
	 * dobrada aqui.** `.lym-botao.lym-botao` pesa (0,2,0) e declara
	 * `display: inline-block`; esta regra pesava (0,1,0), então o `display`
	 * dela nunca valia — e sem `flex` o `align-items` fica inerte. O
	 * `min-height` continuava valendo, então a caixa crescia para 44px e o
	 * rótulo ficava colado no TOPO dela.
	 *
	 * Especificidade vence ordem: estar depois na folha não bastava.
	 */
	.lym-botao.lym-botao,
	.lym-pagamento__conferir.lym-pagamento__conferir,
	.lym-botao,
	.lym-conta__sair-link,
	.lym-checkout__voltar,
	.lym-pagamento__conferir,
	.lym-forma__ajuda a,
	.lym-navegacao__link {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}

	/*
	 * Nos links de lista o alvo cresce por padding e a margem negativa devolve
	 * o espaço: sem ela, a linha de cada item engordaria 1,1rem e a lista de
	 * 148 conteúdos ficaria 160px mais alta sem ganhar nada.
	 */
	.lym-menu__item a,
	.lym-item__nome {
		display: block;
		padding: 0.55rem 0;
		margin: -0.55rem 0;
	}
}

/*
 * O separador do "conferir" precisa de `display` para existir: em elemento em
 * linha, `margin-top`, `padding-top` e `border-top` não têm efeito de layout —
 * o traço desenhava atravessado no texto do parágrafo acima, em vez de separar.
 */
.lym-pagamento__conferir {
	display: inline-block;
}

/* ==========================================================================
 * A fileira que rola para o lado.
 *
 * **Ela existe porque a grade crescia para BAIXO.** Com dez produtos, a tela
 * empilhava dez cartões e a pessoa rolava a página inteira para ver o que tinha
 * comprado — numa tela cujo trabalho é justamente mostrar isso de relance.
 *
 * O rolar é do navegador (`overflow-x`), e não do script: o dedo no celular e o
 * trackpad no computador já movem a faixa sem uma linha de JavaScript. As setas
 * são conveniência para quem usa mouse de rodinha, e nascem escondidas — o
 * script só as mostra quando confirma que há o que rolar.
 * ========================================================================== */

.lym-fileira {
	position: relative;
}

/*
 * **A pista tem largura fixa, e antes ela dependia da QUANTIDADE.**
 *
 * Com `minmax( 15rem, 17rem )`, três produtos deixavam as pistas crescerem até
 * o máximo e o quarto as jogava de volta ao mínimo: os cartões encolhiam 12%
 * quando um produto novo entrava na lista, sem nada ter acontecido com eles.
 *
 * Numa faixa que rola, quem resolve o espaço é a rolagem — a pista não precisa
 * negociar largura com o número de itens.
 */
.lym-cartoes--faixa {
	grid-auto-flow: column;
	grid-auto-columns: 16rem;
	grid-template-columns: none;
	overflow-x: auto;
	scroll-snap-type: x proximity;
	scroll-behavior: smooth;

	/*
	 * O respiro embaixo é onde a barra de rolagem mora. Sem ele, a barra passa
	 * por cima da borda do último cartão em quem tem barra sempre visível.
	 */
	padding-bottom: 0.75rem;
}

.lym-cartoes--faixa > .lym-cartao {
	scroll-snap-align: start;
}

@media ( prefers-reduced-motion: reduce ) {
	.lym-cartoes--faixa {
		scroll-behavior: auto;
	}
}

/*
 * **Classe dobrada, e não `!important`.** O tema do cliente pinta os botões
 * dele com seletores de peso maior que uma classe só — e ele já provou vencer
 * nesta mesma tela: é a razão de `.lym-botao` estar dobrado no alto do arquivo.
 * Dobrar empata em especificidade e continua deixando o cliente mudar depois.
 */
.lym-fileira__seta,
.lym-fileira__seta.lym-fileira__seta {
	position: absolute;
	top: 40%;
	z-index: 2;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 2.5rem;
	height: 2.5rem;
	padding: 0;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 50%;

	/*
	 * O fundo é lido do navegador pelo script, como o painel do índice já faz:
	 * a seta fica POR CIMA dos cartões e precisa ser opaca, e o plugin não sabe
	 * a cor de fundo da página do cliente. O valor de reserva quase nunca é
	 * visto, porque é o script que revela a seta.
	 */
	background: var( --lym-painel, rgba( 128, 128, 128, 0.92 ) );
	color: inherit;
	cursor: pointer;
}

.lym-fileira__seta--antes {
	left: 0;
}

.lym-fileira__seta--depois {
	right: 0;
}

/*
 * **As setas ficam FORA dos cartões, na margem da página.**
 *
 * Elas nasceram sobrepostas — meia rem para fora, o resto por cima da capa do
 * primeiro e do último produto. Seta em cima do conteúdo esconde justamente o
 * que ela existe para ajudar a ver.
 *
 * A faixa recua para a margem que a área de membros já tem de sobra (`.lym-area`
 * tem 54rem no meio de uma tela larga) e devolve o recuo como respiro interno.
 * Abaixo dessa largura não há margem para ocupar, e aí as setas somem — o dedo
 * rola a faixa, que é o gesto natural nessa tela mesmo.
 */
/* Mesma fenda fracionária do par acima, e mesma razão. */
@media ( min-width: 1059.02px ) {
	.lym-fileira {
		margin-left: -3.5rem;
		margin-right: -3.5rem;
		padding-left: 3.5rem;
		padding-right: 3.5rem;
	}
}

/*
 * **Entre 783 e 1059px a seta fica POR DENTRO, e isso é obrigatório.**
 *
 * A primeira versão simplesmente escondia a seta abaixo de 1060px, e o
 * resultado era pior que a sobreposição que ela existia para evitar: nessa
 * faixa a fileira ainda rola para o lado, o corte em três do celular ainda não
 * vale, e ficava uma tela inteira sem NENHUM controle. Com doze produtos num
 * tablet, a pessoa via três cartões e não tinha como chegar aos outros nove —
 * a barra de rolagem é invisível por padrão justamente nos aparelhos dessa
 * faixa.
 *
 * Sobreposta é ruim; ausente é impossível. Aqui ela entra para dentro, com
 * sombra para não se confundir com a capa do cartão.
 */
@media ( min-width: 782.02px ) and ( max-width: 1059px ) {
	.lym-fileira__seta--antes {
		left: 0.35rem;
	}

	.lym-fileira__seta--depois {
		right: 0.35rem;
	}

	.lym-fileira__seta {
		box-shadow: 0 1px 6px rgba( 0, 0, 0, 0.28 );
	}
}

/*
 * Abaixo de 783px a fileira já empilhou e existe o botão de mostrar mais: ali a
 * seta não teria o que fazer.
 */
@media ( max-width: 782px ) {
	.lym-fileira__seta {
		display: none;
	}
}

.lym-fileira__seta:hover,
.lym-fileira__seta:focus-visible {
	/*
	 * **A seta responde ficando mais presente, e não mudando de cor.** Ela é
	 * navegação — a mesma peça repetida duas vezes por fileira —, e gastar a
	 * cor de ação nela é gastar o que deveria apontar o botão principal do
	 * cartão logo abaixo.
	 */
	border-color: rgba( 128, 128, 128, 0.75 );
	color: inherit;
}

/*
 * **No celular a faixa vira coluna, e mostra três de cada vez.**
 *
 * Rolar para o lado numa tela de 360px mostra um cartão por vez e esconde que
 * existem outros. Empilhado, o que custa é altura — daí o corte em três, com o
 * botão que revela o resto.
 *
 * Quem não tem JavaScript vê TODOS: o corte é aplicado pela classe que o script
 * acrescenta, nunca pelo HTML. Errar para o lado de mostrar demais é o barato.
 */
@media ( max-width: 782px ) {
	.lym-cartoes--faixa {
		grid-auto-flow: row;
		grid-auto-columns: auto;
		grid-template-columns: 1fr;
		overflow-x: visible;
		padding-bottom: 0;
	}

	.lym-fileira__seta {
		display: none;
	}

	.lym-fileira--dobrada .lym-cartao:nth-child( n + 4 ) {
		display: none;
	}
}

.lym-fileira__mais {
	margin: 1rem 0 0;
	text-align: center;
}

/*
 * **A vitrine é mais discreta que o que a pessoa já tem, e a classe existia sem
 * uma linha atrás.**
 *
 * As duas fileiras eram idênticas pixel a pixel — mesma capa, mesmo nome, mesmo
 * cartão preenchido — e a única diferença era a palavra dentro do botão. Numa
 * grade de cartões, palavra não é o que se lê primeiro.
 *
 * O cartão de oferta é só contorno: o preenchimento é do que já foi pago.
 */
.lym-cartoes--vitrine .lym-cartao {
	background: none;
}

/*
 * O parágrafo do botão só ocupa espaço quando há botão. Escondido, ele deixava
 * 1rem de vão embaixo da fileira em toda tela larga — sobra que ninguém
 * relaciona a um botão invisível.
 */
.lym-fileira__mais:has( [hidden] ) {
	margin: 0;
}

/*
 * ---------------------------------------------------------------------------
 * **A luz de cima, e é o único "efeito" que este plugin inventa.**
 *
 * Num fundo escuro, uma caixa separada do resto só pela borda parece um
 * recorte; com uma linha clara na aresta de cima ela parece uma superfície
 * apoiada, iluminada de cima. É o que dá volume a uma tela escura sem sombra
 * nenhuma, e é boa parte da diferença entre um desenho com acabamento e um sem.
 *
 * `inset 0 1px 0 rgba( 255, 255, 255, 0.07 )` é branco a 7% no primeiro pixel.
 * **Ela só ADICIONA**: num tema claro, branco sobre um fundo quase branco é
 * invisível, e nada piora. Num tema escuro é exatamente o efeito.
 *
 * Não é uma borda superior mais clara porque a borda já existe e é do tema:
 * esta linha fica por DENTRO dela, e as duas juntas é que fazem a aresta.
 *
 * E não toca em contraste de texto nenhum — é um pixel na borda, fora da área
 * onde alguma coisa é lida.
 * ---------------------------------------------------------------------------
 */
.lym-cartao,
.lym-topo,
.lym-bloco,
.lym-caixa-aviso {
	box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.07 );
}

.lym-cartao {
	display: flex;
	flex-direction: column;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	background: var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) );
	overflow: hidden;

	/*
	 * A transição existe para o cartão parecer uma superfície que responde, e
	 * não uma imagem que troca. 120ms é o limite abaixo do qual o olho lê como
	 * instantâneo — o suficiente para o movimento existir sem atrasar nada.
	 */
	transition: background-color 0.12s ease, border-color 0.12s ease;
}

/*
 * **O cartão inteiro responde ao gesto, e isso substitui a cor que o título
 * perdeu.**
 *
 * O nome do produto era pintado com a cor de ação, e era ele que dizia "isto se
 * clica". Sem a cor — e sem sublinhado, porque um título sublinhado lê como
 * referência no meio de um texto — sobrava um cartão inerte com um botão dentro.
 *
 * Quem passa a dizer é a superfície: no ponteiro o fundo firma e o contorno
 * acende. É o gesto que a Netflix usa na fileira de capas, e ele tem uma
 * vantagem sobre a cor no título — vale para o cartão INTEIRO, que é o que a
 * pessoa de fato mira, e não só para as duas palavras do nome.
 *
 * **`:focus-within` é o que faz isso valer para o teclado.** Sem ele, quem
 * navega por Tab vê o anel de foco no link e o cartão em volta continua morto —
 * e o cartão é a peça, não o link.
 */
.lym-cartao:hover,
.lym-cartao:focus-within {
	border-color: rgba( 128, 128, 128, 0.55 );
	background-color: rgba( 128, 128, 128, 0.14 );
}

/*
 * **Quem pediu menos movimento recebe a mudança sem a transição, e não sem a
 * mudança.** Tirar o realce junto seria decidir que quem tem enxaqueca não
 * precisa saber onde está o ponteiro.
 */
@media ( prefers-reduced-motion: reduce ) {
	.lym-cartao {
		transition: none;
	}
}

/*
 * A capa tem proporção fixa: sem isso, uma imagem em pé e uma deitada na mesma
 * lista deixam os cartões de alturas diferentes e a grade parece quebrada.
 */
.lym-cartao__capa {
	display: flex;
	align-items: center;
	justify-content: center;
	aspect-ratio: 16 / 9;
	background: rgba( 128, 128, 128, 0.15 );
	overflow: hidden;
}

.lym-cartao__capa img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/*
 * **A inicial da capa vazia: sem opacidade, com cor própria.**
 *
 * Ela estava em 0,35 — 1,09:1 sobre a capa clara, praticamente invisível — e
 * dentro de um cartão fechado a opacidade ainda se multiplicava. É o estado de
 * instalação nova e o da visão de quem administra, ou seja, a primeira coisa
 * que o dono do site vê do produto dele.
 *
 * `currentColor` a 45% via `color` e não via `opacity` faz a mesma mistura sem
 * multiplicar com nada em volta — a opacidade do modificador continua valendo
 * uma vez só, que é o que ela deve fazer.
 */
.lym-cartao__inicial {
	font-size: 2.5rem;
	font-weight: 700;
	color: rgba( 128, 128, 128, 0.9 );
}

.lym-cartao__corpo {
	display: flex;
	flex-direction: column;
	flex: 1 1 auto;
	gap: 0.6rem;
	padding: 1.1rem 1.25rem 1.25rem;
}

.lym-cartao__nome {
	margin: 0;
	font-size: 1.1rem;
	line-height: 1.3;
}

/*
 * **O título do cartão não leva sublinhado, e quem responde é o cartão.**
 * Sublinhar um título é tratá-lo como referência no meio de um texto, e ele não
 * é: ele nomeia a peça inteira, que é o alvo de verdade.
 *
 * O gesto continua tendo resposta — `.lym-cartao:hover` e `:focus-within`
 * acendem o cartão todo. O sublinhado aqui é o reforço para quem já está com o
 * ponteiro exatamente sobre o nome.
 */
.lym-cartao__nome a {
	text-decoration: none;
}

.lym-cartao__nome a:hover,
.lym-cartao__nome a:focus {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/*
 * **Sem opacidade: ela MULTIPLICA com a do modificador em volta.**
 *
 * A varredura de 30/08/2026 achou sete pares assim. O pior: a descrição de um
 * cartão fechado ficava a 0,525 efetivo — e ela é justamente o texto que
 * precisa ser LIDO para a pessoa entender por que aquele produto está fechado.
 * O modificador já apaga o bloco inteiro; apagar de novo por dentro é cobrar
 * duas vezes pela mesma informação.
 *
 * Quem quiser hierarquia dentro de um bloco apagado usa corpo e peso, que não
 * se multiplicam.
 */
.lym-cartao__descricao {
	margin: 0;
	font-size: 0.88rem;
	line-height: 1.5;
}

.lym-cartao__rodape {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.75rem;
	margin: auto 0 0;
	padding-top: 0.5rem;
	font-size: 0.85rem;
}

.lym-cartao__prazo {
}

/*
 * O prazo acabando desfaz a discrição do prazo normal, e faz isso sem cor: o
 * plugin não sabe o fundo da página do cliente, e um vermelho escolhido aqui
 * some numa área de membros escura. Opacidade cheia e peso já separam a frase
 * das outras duas da mesma linha.
 */
/*
 * **O prazo que está acabando é ÂMBAR**, e o peso vem junto.
 *
 * A regra tinha `opacity: 1` — inerte, porque 1 já é o padrão — e só o peso
 * fazia efeito. Âmbar é o papel de "isto vai acabar": chama a atenção sem
 * dizer que algo deu errado, que é o que o vermelho diria. É a mesma cor do
 * aviso que ainda não foi lido, e é a mesma ideia.
 */
.lym-cartao__prazo--acabando {
	color: var( --lym-atencao, currentColor );
	font-weight: 600;
}

/*
 * **Fechado apaga a CAPA, o nome e a descrição — nunca o rodapé.**
 *
 * A regra era `opacity: 0.7` no cartão inteiro, e `opacity` compõe a subárvore
 * de uma vez: o botão "Renovar meu acesso" mora dentro dele e era apagado
 * junto. Medido no tema escuro de fábrica (#121416), o rótulo do botão dava
 * **2,95:1** — e com o azul de antes dava 4,04:1, ou seja já reprovava e a
 * troca de cor aprofundou. No tema claro melhorou de 2,90 para 3,54, e
 * continuava reprovando.
 *
 * **Descendente não desfaz `opacity` do ancestral**, então não havia como
 * consertar de dentro: a única saída é o apagado não alcançar o rodapé. É a
 * mesma correção que este projeto já fez no nome do item concluído e na lista
 * do produto — e a razão é a registrada: quem está no cartão fechado é
 * exatamente quem precisa apertar aquele botão.
 *
 * O comentário antigo dizia "fechado continua legível: ele precisa ser lido
 * para ser entendido", e a regra fazia o contrário com a única peça acionável
 * do cartão.
 *
 * O estado continua dito de três formas sem depender de cor: a etiqueta no
 * rodapé, a capa apagada e o nome apagado.
 */
.lym-cartao--fechado .lym-cartao__capa,
.lym-cartao--fechado .lym-cartao__nome,
.lym-cartao--fechado .lym-cartao__descricao {
	opacity: 0.7;
}

/*
 * **A etiqueta de estado é ÂMBAR**: ela aparece só em produto expirado ou
 * encerrado, que é exatamente "isto precisa da sua atenção". Era um contorno na
 * cor do texto, e se confundia com o resto do rodapé do cartão.
 */
/*
 * **A etiqueta perdeu a opacidade quando ganhou cor, e a conta é a razão.**
 *
 * O `opacity: 0.85` estava aqui para amaciar uma pílula NEUTRA — e opacidade
 * não enfraquece cor, ela troca a cor pela mistura com o fundo. Com o âmbar, a
 * mesma linha derrubava a etiqueta para 3,61:1 sobre o cartão claro, abaixo dos
 * 4,5:1 de texto. É o padrão que esta folha já registra ter pago sete vezes.
 *
 * O que ela amaciava agora é feito pelo tamanho (0,75rem) e pelo contorno fino.
 * A cor não precisa de ajuda para ser discreta: ela aparece uma vez por cartão,
 * e só quando há um estado a dizer.
 */
.lym-etiqueta-estado {
	color: var( --lym-atencao, currentColor );
	display: inline-block;
	padding: 0.2rem 0.7rem;
	border: 1px solid currentColor;
	border-radius: 999px;
	font-size: 0.75rem;
	text-transform: lowercase;
}

/* O alto do produto */

.lym-topo {
	margin: 0 0 2rem;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	background: var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) );
	overflow: hidden;
}

.lym-topo__capa {
	aspect-ratio: 21 / 9;
	background: rgba( 128, 128, 128, 0.15 );
}

.lym-topo__capa img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.lym-topo__corpo {
	padding: 1.5rem;
}

.lym-topo__progresso {
	display: flex;
	align-items: center;
	gap: 0.9rem;
	margin: 0.5rem 0 0;
}

.lym-topo__conta {
	font-size: 0.88rem;
	opacity: 0.75;
}

.lym-topo__acao {
	margin: 1.25rem 0 0;
}

/* Os grupos, em cartões que abrem no lugar */

.lym-bloco {
	margin: 0 0 1rem;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	overflow: hidden;
}

.lym-bloco__cabecalho {
	display: flex;
	align-items: center;
	gap: 1rem;
	padding: 0.9rem 1.25rem 0.9rem 0.9rem;
	background: var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) );
	cursor: pointer;
	list-style: none;
}

.lym-bloco__cabecalho::-webkit-details-marker {
	display: none;
}

.lym-bloco__cabecalho::after {
	content: "\203A";
	margin-left: auto;
	padding-left: 0.5rem;
	font-size: 1.3rem;
	line-height: 1;
	transform: rotate( 90deg );
}

.lym-bloco[open] > .lym-bloco__cabecalho::after {
	transform: rotate( -90deg );
}

.lym-bloco__capa {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 82px;
	height: 52px;
	border-radius: 8px;
	background: rgba( 128, 128, 128, 0.18 );
	overflow: hidden;
}

.lym-bloco__capa img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.lym-bloco__numero {
	font-size: 1.1rem;
	font-weight: 700;
}

.lym-bloco__texto {
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
	min-width: 0;
}

.lym-bloco__nome {
	font-size: 1.05rem;
	font-weight: 600;
	line-height: 1.3;
}

.lym-bloco__conta {
	font-size: 0.8rem;
}

.lym-bloco--trancado {
	opacity: 0.7;
}

.lym-item {
	display: flex;
	align-items: center;
	gap: 0.75rem;
	padding: 0.85rem 1.25rem;
	border-top: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
}

.lym-item a {
	text-decoration: none;
}

.lym-item a:hover,
.lym-item a:focus {
	text-decoration: underline;
}

/*
 * A marca tem largura fixa mesmo quando está vazia. Sem isso, os títulos de uma
 * lista de 148 itens dançam para a direita conforme o membro vai concluindo.
 *
 * **E ela NÃO cresce.** A regra dava `flex: 1 1 auto` à marca junto com o nome —
 * o que é o contrário do que este comentário sempre disse: a marca esticava e
 * empurrava o título para o meio da linha. Numa lista de 148 itens, nenhum
 * título começava onde o de cima começou.
 */
.lym-item__marca {
	flex: 0 0 1.25rem;
	text-align: center;
}

.lym-item__nome {
	flex: 1 1 auto;
	text-align: left;
}

/*
 * **O nome do item concluído NÃO desbota, e isso é conserto de contraste.**
 *
 * Ele tinha `opacity: 0.6`, e a cor de link a 60% sobre branco dá 3,29:1 —
 * reprova o mínimo de 4,5:1 da WCAG para texto normal. Numa lista de 148 aulas,
 * é a MAIORIA dos nomes que o membro que está avançando lê desbotada.
 *
 * E ela nem era necessária: a bolinha ao lado já diz "feito", cheia contra
 * vazia, que é a decisão registrada deste projeto — "cheio contra vazio já diz
 * isso sem ajuda de cor nenhuma". Desbotar o nome era um segundo código para a
 * mesma informação, cobrado em legibilidade.
 */

/*
 * O trancado continua mais apagado, porque ali o apagado É a informação — e
 * aqui ela não custa contraste de link: o nome de um item trancado é um
 * `<span>`, e herda a cor de texto do tema, não a cor de link.
 *
 * 0,7 e não 0,55: a 0,55 um texto quase preto sobre branco já se aproxima do
 * limite, e o plugin não sabe qual é a cor de texto do tema do cliente — não dá
 * para calcular o contraste, então erra-se para o lado de apagar menos.
 */
.lym-item--trancado {
	opacity: 0.7;
}

/*
 * **O item concluído não muda de aparência, e a regra existe para dizer isso.**
 *
 * Ele tinha `opacity: 0.6` no nome, que reprovava o contraste — e a correção foi
 * tirar, porque a bolinha cheia ao lado já diz "feito". A classe continua sendo
 * escrita pela view, e sem esta regra ela vira classe órfã: quem lesse a view
 * procuraria o estilo dela, e quem escrevesse CSS depois poderia criá-la com
 * outro sentido.
 *
 * `list-style: none` é o valor que o `.lym-itens` já dá; declarar aqui é o jeito
 * de a regra existir sem mudar nada.
 */
.lym-item--feito {
	list-style: none;
}

/*
 * A capa muda o respiro do topo: com imagem, o título encosta nela e o espaço
 * de cima seria repetido. Sem imagem, ele é o que separa o título da borda.
 */
.lym-topo--com-capa {
	padding-top: 0;
}

.lym-item__aviso {
	font-size: 0.8rem;
	white-space: nowrap;
}

/*
 * **Numa coluna estreita o aviso desce para a linha de baixo quando não cabe ao
 * lado do nome — e nunca é CORTADO.** O `.lym-bloco` tem `overflow: hidden`,
 * então o que passa da borda some sem rolagem nenhuma. Medido no Chrome com a
 * marcação real de `produto.php`: com um nome de uma palavra longa
 * ("Responsabilidades") ao lado, "Será liberado em 10 dias" (mais longa que o
 * "libera em 1 semana" de antes) perdia uns 24px do fim a 360px em Arial e a
 * 390px em Verdana, e mais de 60px a 320px. A frase antiga já era cortada a
 * 320px (e a 360px em Verdana). Com as três regras abaixo: nenhuma peça cortada
 * nem fora da página a 320, 360 e 390px, em Arial e em Verdana, com a frase de
 * 10 dias, a de 59 minutos, a de 1.000 dias e a antiga.
 *
 * **Sem media query, porque quem aperta é a COLUNA e não a janela** — a mesma
 * lição da fileira da onda. `[lym_meus_produtos]` mora onde quem monta a página
 * o puser, e numa coluna de construtor a conta do flex é exatamente a do
 * telefone. Medido no Chrome, com a marcação real e a janela em 1280px: presas
 * a `max-width: 782px`, as três regras não valiam ali e quatro avisos passavam
 * da borda do bloco — 25px numa coluna de 340px em Arial, 40px numa de 360px em
 * Verdana. Soltas, nada é cortado em coluna nenhuma (280, 320, 340, 360 e
 * 390px, em janela estreita e em janela de 1280). E num bloco de 900px a
 * geometria é a MESMA de antes, pixel a pixel: nome e aviso na mesma linha, o
 * aviso à direita.
 *
 * **As classes são DOBRADAS, e não é enfeite:** a base `.lym-item__nome`
 * declara `flex: 1 1 auto` e `.lym-item` declara `gap`, as duas com o mesmo
 * peso destas. Empate se resolve pela ORDEM na folha, e uma media query não
 * soma peso nenhum: juntar estas regras a um bloco de telefone escrito mais
 * acima — e existe um, com `.lym-item__nome` dentro — devolvia a base a `auto`
 * em silêncio, com a suíte verde. Em (0,2,0) elas vencem em qualquer posição.
 *
 * Cada uma tem a sua razão, também medida:
 *
 * - **O aviso continua numa linha só.** Com `white-space: normal` ele virava
 *   uma coluna de 46px, em quatro linhas.
 * - **`flex-basis: 0` no nome** é o que decide QUANDO descer. A quebra de linha
 *   do flex mede o nome pelo tamanho de partida: com o `auto`, um título comprido
 *   de várias palavras pedia a largura inteira e ia sozinho para a linha de
 *   baixo, deixando a bolinha solta no alto. Com zero, conta a maior palavra, e
 *   o aviso só desce quando de fato não cabe ao lado do nome.
 * - **`margin-left: auto`** mantém à direita o aviso que desceu; na mesma
 *   linha o nome cresce e a margem vale zero.
 */
.lym-item.lym-item {
	flex-wrap: wrap;
	row-gap: 0.25rem;
}

.lym-item__nome.lym-item__nome {
	flex-basis: 0;
}

.lym-item__aviso.lym-item__aviso {
	margin-left: auto;
}

/* ==========================================================================
 * A conversa abaixo do conteúdo.
 *
 * Sóbria como o resto: nenhuma cor própria, separação por cinza translúcido
 * sobre o fundo do tema, e a cor dos links vindo da variável que o script
 * decide a partir do fundo medido.
 *
 * **O recuo das respostas é pequeno de propósito.** Cinco níveis com um recuo
 * generoso deixam o quinto com metade da largura no celular — e o teto de cinco
 * existe justamente porque a conversa vai fundo. Um traço na lateral diz a
 * hierarquia melhor que o espaço, e não custa largura nenhuma.
 * ========================================================================== */

/*
 * **Sem linha em cima, e sem respiro largo — é a regra que a faixa do perfil
 * já registra, e ela vale aqui pela mesma razão.**
 *
 * A conversa é uma peça que vai a três lugares: abaixo de um conteúdo, numa
 * página de grupo onde ela é a única coisa na tela, e na conversa particular.
 * Nos dois últimos não há nada acima para separar, e a linha atravessada
 * vira sujeira — desenha uma divisão entre a peça e o nada.
 *
 * Eram 3rem de margem mais 2rem de calha: oitenta pixels de vão antes da
 * caixa de escrever, comendo o alto da tela numa página que existe para
 * conversar.
 *
 * **Quem quer separação põe no construtor**, que é onde ele já decide o
 * espaçamento de tudo. O respiro que fica é o mínimo para a peça não
 * encostar no que estiver em cima quando ela cai depois de um conteúdo.
 *
 * **Ele caiu de 1,5rem para 0,75rem em 19/09/2026**, a pedido do Flávio ("muito
 * espaço acima e abaixo da caixa de comentários"): cada pixel aqui é um pixel a
 * menos de conversa na primeira tela. Medido na `/video1/` do site dele, com o
 * Chrome sem janela a 1920px: o parágrafo do widget de texto do Elementor já
 * põe 14px embaixo dele, e com os 24px daqui eram 38px entre o texto e a caixa —
 * agora 26px. O grupo e o suporte não têm esta margem (`--papo`, mais abaixo).
 */
.lym-conversa {
	margin: 0.75rem 0 0;
}

.lym-conversa__titulo {
	margin: 0 0 1.5rem;
}

/*
 * **O tamanho é do PLUGIN, e a classe dobrada é o que o faz valer.** Ele conta
 * quantas mensagens há — é uma etiqueta, e não o título da página.
 *
 * Ele desceu duas vezes a pedido (de 1,15rem, a medida original, para 1,05rem e
 * depois 0,95rem) e nas páginas montadas no Elementor NENHUMA das duas chegou à
 * tela: o Kit do construtor
 * declara `.elementor-kit-N h2`, que pesa (0,1,1) e vence uma classe só. O que o
 * Flávio via era o tamanho do Kit — 23px no computador e no tablet, 19px no
 * celular —, e numa página sem Elementor o do plugin. Duas páginas do mesmo
 * produto com letras diferentes, a mesma armadilha das cores do menu.
 *
 * **O valor é o que ele aprovou no celular** (16/09/2026: "no mobile tá bom, no
 * tablet e no PC tá muito grande"): 19px, em rem, agora em toda largura e em
 * toda página. O piso continua sendo o texto das mensagens (0,9375rem) — abaixo
 * dele a contagem leria MENOR que a conversa que ela anuncia.
 *
 * **No bate-papo ela fica abaixo desse piso, e a exceção é pedida** (1.100.0):
 * ali a contagem divide a tela com a lista e a caixa, e cada pixel dela é um
 * pixel a menos de mensagem. A regra mora junto das outras do bate-papo.
 */
.lym-conversa__titulo.lym-conversa__titulo {
	font-size: 1.1875rem;
}

.lym-conversa__vazia,
.lym-conversa__entrar {
	margin: 0 0 1.5rem;
}

.lym-conversa__lista,
.lym-comentario__respostas {
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
 * **Três medidas, e todo o resto sai delas.** O recuo da resposta, a posição
 * do fio que liga as bolinhas e a largura da coluna da esquerda são a MESMA
 * conta escrita uma vez: mudar o tamanho da bolinha aqui move as três juntas.
 *
 * **A coluna tem a largura da bolinha, e mais nada** (18/09/2026). Ela era
 * mais larga — 56px para uma foto de 32 — porque a etiqueta do papel morava
 * embaixo da foto e pedia dez letras de largura. A foto ficava centrada, e os
 * 12px que sobravam à direita dela se somavam ao vão: eram 22px de vazio
 * entre a bolinha e o balão, e o Flávio pediu a bolinha encostada. A etiqueta
 * foi para o lado do nome, e a coluna passou a ser a foto.
 *
 * **Cada pixel aqui é multiplicado por cinco**, que é a profundidade máxima de
 * resposta: a coluna mais o vão é o recuo no computador, e o recuo se acumula
 * a cada nível. Eram 66px por nível; são 38.
 */
.lym-comentario {
	--lym-foto: 2rem;
	--lym-lado: var( --lym-foto );
	--lym-vao: 0.375rem;

	/*
	 * **Onde o fio desce, escrito UMA vez.** É o centro da coluna da esquerda,
	 * medido a partir da borda esquerda da resposta — que é onde a coluna 2 do
	 * pai começa. Os três pedaços do fio (o de cima, o do galho e o cotovelo que
	 * entra na bolinha) leem esta conta; escrita três vezes, ela um dia
	 * discordaria de si mesma e o traço sairia torto por meio pixel em algum
	 * nível de resposta.
	 */
	--lym-fio-x: calc( var( --lym-vao ) + var( --lym-lado ) / 2 );

	/*
	 * **O RECUO da resposta, que no celular não é o mesmo que a posição do fio.**
	 *
	 * No computador os dois coincidem: a resposta nasce onde o nome de quem ela
	 * responde começa, e o fio desce do centro da bolinha — `--lym-fio-x` dá
	 * conta das duas coisas. Numa tela estreita o recuo encolhe (cinco níveis com
	 * o recuo do computador deixariam o quinto com metade da largura da tela), e
	 * aí eles se separam: o fio continua no centro da bolinha de cima, e a
	 * resposta chega mais perto dele.
	 *
	 * **Foi assim que o fio quebrou no celular.** O recuo encolhia numa regra que
	 * mexia na LISTA, enquanto os pedaços de cima do fio se penduravam no
	 * invólucro: as respostas andavam meio centímetro para a esquerda e o fio
	 * delas ia junto, o de cima ficava onde estava, e os dois deixavam de se
	 * encontrar. Com o recuo declarado aqui, quem o encolhe move as duas pontas
	 * de uma vez.
	 */
	--lym-fio-recuo: var( --lym-fio-x );

	/*
	 * **A borda ESQUERDA do fio, contada da resposta.** Todo pedaço dele é uma
	 * caixa de dois pixels, e uma caixa se posiciona pela borda esquerda: para
	 * ficar CENTRADA na linha, ela começa um pixel antes. Escrito sem esse pixel,
	 * o fio da resposta sai meio traço à direita do fio de quem a respondeu — e
	 * um degrau de um pixel lê como borrão, não como erro.
	 */
	--lym-fio-esq: calc( -1 * var( --lym-fio-recuo ) - 1px );

	--lym-fio-cor: var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );

	/*
	 * O respiro que a mensagem tem em cima e embaixo, e que o fio precisa vencer.
	 *
	 * **Pela METADE desde a 1.119.0** (pedido do Flávio em 20/09/2026, olhando a
	 * tela do grupo: "diminua pela metade o espaço vazio entre um comentário e
	 * outro", para caber mais mensagem na tela). Eram 0,35rem de cada lado, ou
	 * seja 11,2px entre dois balões vizinhos; agora são 5,6px. Medido no Chrome
	 * sem janela com a marcação e a folha de verdade.
	 *
	 * **O fio está seguro por construção, e é por isso que esta é a alavanca
	 * certa**: `--lym-fio-cabeça` e o respiro do galho leem ESTA variável, então
	 * a geometria inteira encolhe junto sem nenhuma conta refeita à mão.
	 *
	 * **O preço, medido e aceito:** o brilho de "novo" passa 0,375rem (6px) acima
	 * e abaixo do balão, e agora esses 6px são maiores que os 5,6px que separam
	 * dois balões — ele encosta 0,4px atrás do balão vizinho, que tem fundo
	 * próprio e o cobre. Quatro décimos de pixel atrás de uma caixa opaca não
	 * aparecem; encolher o brilho junto o deixaria de ser brilho.
	 */
	--lym-msg-y: 0.175rem;

	/*
	 * **A linha divisória saiu.** Numa conversa ela desenhava uma régua a cada
	 * mensagem, e o que separa uma fala da seguinte já são o peso do nome e o
	 * espaço — a régua era o terceiro sinal dizendo o que dois já diziam, e
	 * custava altura em cada linha da tela.
	 */
	display: grid;
	grid-template-columns: var( --lym-lado ) minmax( 0, 1fr );
	column-gap: var( --lym-vao );

	padding: var( --lym-msg-y ) 0;
}

/*
 * A coluna da esquerda: a foto, e embaixo dela o fio quando há respostas.
 */
.lym-comentario__lado {
	grid-column: 1;

	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.15rem;

	min-width: 0;
}

/*
 * **O pedaço de cima do fio, e ele é a razão desta mudança.**
 *
 * O fio era só a borda da lista de respostas, e ela começa DEPOIS do balão
 * inteiro: o traço nascia no vazio, na altura em que a mensagem termina, sem
 * tocar em quem foi respondido. Quem olha não lê "estas são respostas
 * daquela" — lê uma linha solta.
 *
 * Este pedaço desce da bolinha até o fim da fileira do comentário, e o
 * `flex: 1` é o que o faz começar exatamente onde a coluna acaba de escrever,
 * que é embaixo da foto. Não há número a acertar — ele ocupa o que sobrou, e o
 * que sobrou começa onde a última peça terminou.
 *
 * O `margin-top` é o "quase encosta": o fio não toca a bolinha.
 */
.lym-comentario--fio > .lym-comentario__lado::after {
	content: "";

	flex: 1 1 auto;
	min-height: 0.35rem;
	width: 2px;
	margin-top: 0.25rem;

	/*
	 * **Ela é centrada pelo `align-items`, e por isso nasce em `lado / 2`** — o
	 * centro da coluna, que é exatamente onde `--lym-fio-esq` põe os pedaços de
	 * baixo. Não há correção a fazer: os dois são caixas de dois pixels sobre a
	 * mesma linha.
	 */
	background: var( --lym-fio-cor );
	border-radius: 1px;
}

/*
 * A coluna da direita: o nome, a hora, o texto, a mídia e as ações — todos
 * começando no mesmo lugar, que é o que faz a conversa ter uma margem só.
 *
 * **E ela é o ENVOLTÓRIO da mensagem**, no lugar da régua que separava uma
 * fala da outra. Uma linha divide, mas não diz onde a fala termina: numa
 * conversa de mensagens curtas, o que a pessoa procura é o contorno do que
 * alguém disse. A bolinha fica de fora de propósito — ela é de quem falou, e
 * não do que foi dito.
 *
 * **A cor é um cinza TRANSLÚCIDO, e a escolha não é preguiça.** Um tom fixo
 * seria a paleta deste plugin aparecendo no site de outra pessoa: no tema
 * escuro do primeiro cliente ele precisa clarear, num site claro precisa
 * escurecer, e nenhum hexadecimal faz as duas coisas. Cinza a 14% sobre o
 * fundo real vira grafite no escuro e cinza-claro no claro, sem que o plugin
 * precise saber qual dos dois é.
 *
 * A luz de cima é a única "cor" que este plugin inventa, e ela só ADICIONA:
 * num tema claro ela é invisível.
 */
.lym-comentario__corpo {
	grid-column: 2;
	min-width: 0;

	/*
	 * **A largura do envoltório é a do que está DENTRO dele, e não a da coluna.**
	 *
	 * Como item de grade ele esticava até a borda, e todo comentário saía com a
	 * mesma largura: um "olá" ocupava a tela inteira igual a um parágrafo de dez
	 * linhas. O contorno deixava de dizer o tamanho da fala — que é metade do que
	 * um envoltório serve para dizer.
	 *
	 * **`justify-self: start` e não `width: fit-content`.** Os dois dão o mesmo
	 * tamanho, mas o primeiro é a própria regra de dimensionamento da grade: o
	 * item fica com o menor entre o conteúdo esticado e o espaço disponível, e
	 * portanto NUNCA estoura a coluna. A palavra-chave `fit-content` num `width`
	 * precisou de prefixo por anos, e onde ela não é entendida a declaração cai
	 * inteira — deixando o envoltório crescer até o tamanho do parágrafo sem
	 * quebra, que é rolagem lateral na página inteira.
	 *
	 * O teto existe pela leitura, e não pelo desenho: uma linha de texto que
	 * atravessa um monitor largo perde o começo da frase seguinte no caminho de
	 * volta. Ele nunca aperta o celular, onde a coluna já é menor que isso.
	 */
	justify-self: start;
	max-width: 42rem;

	/*
	 * **O recheio de cima caiu pela METADE e o de baixo foi a ZERO** (1.119.0,
	 * pedido do Flávio em 20/09/2026, para caber mais mensagem na tela). Em cima
	 * eram 0,4rem = 6,4px entre a borda do balão e a fileira do nome, e agora são
	 * 3,2px — a metade exata que ele pediu.
	 *
	 * **Embaixo, os 0,15rem eram 2,4px, e o vão que ele Vê ali é de 12,4px.** A
	 * diferença não é espaçamento: são os 10px de sobra de DENTRO do botão de
	 * ação, que tem 36px no mouse e 44px no toque porque é alvo de dedo, e a
	 * tinta da palavra tem 16px (medido no Chrome com a marcação de verdade).
	 * Zerar o recheio é tudo o que dá para tirar dali sem encolher o alvo de
	 * toque — e encolher o alvo de toque é decisão travada, com vigia. A outra
	 * saída, puxar a fileira com margem negativa, faria o fundo do botão em gesto
	 * sair 3,6px para FORA da borda arredondada do balão: está registrada aqui
	 * para a leitura seguinte não a redescobrir e escrever sem ver o preço.
	 */
	padding: 0.2rem 0.65rem 0;

	border-radius: 0.85rem;
	background: rgba( 128, 128, 128, 0.14 );
	box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.07 );
}

/*
 * **Ela QUEBRA, como a fileira de ações 20 linhas abaixo já quebra.** Duas
 * peças desta linha não encolhem — o carimbo da hora e o rótulo de papel têm
 * `white-space: nowrap` —, e o mínimo automático de um item de flex é o
 * min-content dele. Sem `flex-wrap`, num celular o nome era espremido e as
 * marcas "Fixado no alto" e "Assunto encerrado" saíam cortadas.
 */
.lym-comentario__quem {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.4rem;
	margin-bottom: 0.1rem;
}

/*
 * A foto é a mesma de Minha conta — o plugin já se pendura no filtro de avatar
 * do WordPress. Um `<img>` próprio aqui faria a foto do comentário divergir da
 * do resto do site no dia em que alguém trocasse a dela.
 */
.lym-comentario__foto.lym-comentario__foto {
	flex: 0 0 auto;
	width: var( --lym-foto );
	height: var( --lym-foto );
	border-radius: 50%;
}

.lym-comentario__nome {
	font-weight: 600;
	font-size: 0.875rem;

	/*
	 * **A cor separa uma fala da outra sem precisar de linha nem de caixa.**
	 * Numa conversa de mil mensagens, o nome com a mesma cor do texto faz a
	 * lista virar um bloco só — a pessoa perde onde uma fala acaba e a
	 * seguinte começa, e é o defeito que ninguém consegue nomear olhando.
	 *
	 * Herda a cor do texto até o dono do site escolher a dele.
	 */
	/*
	 * **O nome de quem assinou é NEUTRO por padrão desde 01/09/2026.**
	 *
	 * Ele saía em âmbar, e numa conversa em que quase toda mensagem é do mesmo
	 * autor a tela virava uma coluna de nomes coloridos — foi a segunda queixa
	 * do dono do site, junto com o vermelho em tudo. O que separa uma fala da
	 * seguinte é o PESO do nome e o espaço entre elas, e os dois já estão aqui.
	 *
	 * A cadeia continua inteira: quem quiser o âmbar de volta escolhe em
	 * Configurações, e a escolha vence. O que mudou é o padrão — e o padrão de
	 * um plugin que vai para muitos sites tem de ser o que funciona sem
	 * ninguém escolher nada.
	 */
	color: var( --lym-nome, var( --lym-nome-medido, currentColor ) );

	/* Nome pode ser um e-mail, que é uma palavra só que não quebra. */
	min-width: 0;
	overflow-wrap: anywhere;
}

/*
 * **A hora fica ao lado do nome, e não encostada na borda.** Ela tinha
 * `margin-left: auto`, que a empurrava para o fim da linha: numa tela larga o
 * nome ficava numa ponta e a hora na outra, com um vão vazio no meio, e os
 * dois pedaços da mesma informação deixavam de se ler juntos.
 */
.lym-comentario__quando {
	font-size: 0.6875rem;
	white-space: nowrap;
	opacity: 0.7;
}

/*
 * A marca de "esperando aprovação" é uma faixa na lateral, e não um fundo
 * colorido: qualquer cor que eu escolhesse teria chance de apagar o texto no
 * tema de alguém. É a mesma razão do recado de erro.
 */
/*
 * **O comentário pendente não tem marca nenhuma, e as duas regras que existiam
 * aqui saíram.**
 *
 * A primeira desenhava um traço vertical à esquerda dele. A frase que explicava o
 * traço foi removida a pedido do Flávio — a mensagem aparece como enviada —, e o
 * traço ficou: uma barra sem uma palavra ao lado, que em toda interface do mundo
 * quer dizer erro, citação ou alerta. Ela dizia à pessoa que alguma coisa deu
 * errado, justamente quando deu certo.
 *
 * A segunda vestia essa frase, e ficou órfã: nenhuma view a usa desde 30/08. Regra
 * de CSS sem quem a use é pior que regra ausente — quem lê a folha procura o
 * elemento, e quem escreve depois pode reaproveitar o nome com outro sentido.
 *
 * A classe `--esperando` continua saindo no HTML, sem pintar nada: ela existe para
 * quem quiser marcar o próprio pendente na folha dele.
 */

.lym-comentario__texto {
	font-size: 0.9375rem;
	line-height: 1.4;

	/* O texto de um comentário pode trazer um endereço colado sem espaço. */
	overflow-wrap: anywhere;
}

.lym-comentario__texto p {
	margin: 0 0 0.4rem;
}

.lym-comentario__texto p:last-child {
	margin-bottom: 0;
}

/*
 * **O recuo da resposta não é um número: é a coluna 2.** A bolinha de uma
 * resposta nasce exatamente onde o nome de quem ela responde começa, e isso
 * sai de graça de a lista morar na mesma coluna do nome — não há conta a
 * refazer quando a bolinha mudar de tamanho.
 */
.lym-comentario__respostas {
	grid-column: 2;

	/*
	 * **A cabeça: o que separa a lista do que está acima dela.** Ela é recheio, e
	 * não margem, porque a primeira resposta puxa o fio para cima por exatamente
	 * esta medida — e margem não entra na conta de quem se posiciona por dentro.
	 */
	--lym-fio-cabeca: var( --lym-msg-y );

	margin-top: 0;
	padding-top: var( --lym-fio-cabeca );
}

/*
 * **Cada resposta é a referência do pedaço de fio que passa por ela.** Sem isto
 * o pedaço se mediria contra o primeiro ancestral posicionado, que pode ser
 * qualquer coisa da página do cliente — e o traço apareceria do outro lado da
 * tela.
 */
.lym-comentario__respostas > .lym-comentario {
	position: relative;
}

/*
 * **O fio passa inteiro pelas respostas que NÃO são a última, e para na última.**
 *
 * É a diferença entre este fio e o de antes. Desenhado por um invólucro único,
 * ele ia até o fim da área de respostas: com uma resposta longa, ou com uma
 * resposta que tem respostas, sobrava um rabo de linha descendo ao lado dela sem
 * ligar coisa nenhuma. Desenhado pedaço a pedaço pelas próprias respostas, o fio
 * acaba onde a última bolinha começa — que é onde ele deixou de ter o que ligar.
 *
 * A altura é a da resposta INTEIRA, subárvore incluída: o fio precisa atravessar
 * tudo o que está pendurado nela para alcançar a irmã seguinte.
 *
 * **E quem é a última é a CLASSE, e nunca `:last-child`.** Clicar em "Responder"
 * move a caixa de escrever para dentro da lista, logo depois da mensagem
 * respondida: com `:last-child`, a última deixava de ser a última no instante do
 * clique, o fio dela voltava a descer, e o traço passava a ligar mensagens sem
 * relação nenhuma. A classe vem do PHP e não depende do que mais entra na lista.
 */
.lym-comentario__respostas > .lym-comentario:not( .lym-comentario--fim )::before {
	content: "";
	position: absolute;

	left: var( --lym-fio-esq );
	top: 0;
	bottom: 0;
	width: 2px;

	background: var( --lym-fio-cor );
}

/*
 * **O pedaço de baixo do fio, e ele cobre a área de respostas INTEIRA.**
 *
 * A borda morava na lista, e o botão "N respostas" fica FORA dela: o fio se
 * partia em volta do botão, e voltava depois. Aqui ela mora no invólucro, que
 * contém o botão e a lista — um traço só, do fim do balão até o fim das
 * respostas.
 *
 * **A margem negativa leva a borda até o centro da bolinha de cima, e o recheio
 * devolve o conteúdo para a coluna.** As duas pontas são a MESMA conta, e ela
 * é a mesma que o pedaço de cima usa — é assim que os dois ficam no mesmo
 * prumo sem ninguém medir nada.
 *
 * O respiro de cima é recheio, e não margem: com margem o fio se partiria de
 * novo, agora entre o balão e a primeira resposta.
 */
.lym-comentario__galho {
	grid-column: 2;

	position: relative;

	/*
	 * **Ele posiciona, e não desenha.** A borda daqui era o fio inteiro, e por
	 * isso ele ia até o FIM de tudo o que estivesse pendurado na última resposta
	 * — uma resposta longa deixava um rabo de linha descendo ao lado dela,
	 * ligando a coisa nenhuma. O fio agora é desenhado pedaço a pedaço pelas
	 * próprias respostas, e por isso sabe onde parar: na bolinha da última.
	 */
	/*
	 * **A margem é a POSIÇÃO do fio; o recheio é o RECUO da resposta.** No
	 * computador os dois são o mesmo número e parecem uma conta só — numa tela
	 * estreita o recuo encolhe e a posição não, porque o fio continua descendo do
	 * centro da bolinha de quem foi respondido.
	 */
	margin-left: calc( -1 * var( --lym-fio-x ) );
	padding-left: var( --lym-fio-recuo );
	padding-top: var( --lym-msg-y );
}

/*
 * O primeiro pedaço do galho: o respiro entre o fim do balão e o que vem abaixo,
 * seja o botão de recolher ou a primeira resposta.
 */
.lym-comentario__galho::before {
	content: "";
	position: absolute;

	left: -1px;
	top: 0;
	width: 2px;
	height: var( --lym-msg-y );

	background: var( --lym-fio-cor );
}

/*
 * **O cotovelo: do fio até a bolinha da resposta.**
 *
 * Sem ele o fio passa RENTE aos avatares sem tocar em nenhum, e a conversa fica
 * com uma régua ao lado das respostas em vez de uma ligação entre elas.
 *
 * A conta: ele nasce na linha do fio (`--lym-fio-x` à esquerda da resposta) e
 * morre na borda esquerda da bolinha dela, que fica a meia diferença entre a
 * coluna e a foto. A altura é o centro da foto. Os três números são os mesmos
 * que desenham a coluna — nenhum foi inventado aqui.
 *
 * **O canto é arredondado no pé esquerdo**, que é por onde a curva sai do fio:
 * um ângulo reto ali lê como cruzamento, e a curva lê como derivação.
 */
.lym-comentario__respostas > .lym-comentario > .lym-comentario__lado::before {
	content: "";
	position: absolute;

	/*
	 * **A conta, refeita em coordenadas do pai.** A borda do galho fica em
	 * `--lym-lado / 2` — o centro da coluna de cima — e ocupa dois pixels; o
	 * recheio do galho é `--lym-fio-x`, então a resposta começa dois pixels e um
	 * `--lym-fio-x` à direita dessa borda. Daí `left: -1 * --lym-fio-x` cair
	 * exatamente na borda direita do fio: o cotovelo começa onde a linha acaba.
	 *
	 * E ele morre na borda esquerda da bolinha da resposta, que fica a meia
	 * diferença entre a coluna e a foto. Somando: `--lym-fio-x` para atravessar o
	 * recheio, mais essa meia diferença.
	 *
	 * **Desde 18/09/2026 essa meia diferença é zero**: a coluna tem a largura da
	 * foto. A parcela continua escrita porque é ela que mantém a conta certa no
	 * dia em que alguém alargar a coluna de novo — apagada, o cotovelo pararia
	 * antes da bolinha sem nada acusar.
	 *
	 * **A primeira versão SUBTRAÍA as duas parcelas em vez de somar**, e dava
	 * 0,625rem no lugar de 3,125rem: o cotovelo saía do fio e morria no meio do
	 * caminho, sem tocar bolinha nenhuma. O vigia não pegava — ele confere que a
	 * conta é lida, e não que ela fecha.
	 */
	left: var( --lym-fio-esq );
	width: calc( var( --lym-fio-recuo ) + 1px + ( var( --lym-lado ) - var( --lym-foto ) ) / 2 );

	/*
	 * **A curva é a BORDA DE BAIXO com o canto arredondado, e não uma linha de
	 * dois pixels de altura.** Um raio num bloco de 2px não desenha curva nenhuma
	 * — não há altura onde curvar. Aqui o bloco vai do alto da coluna até o
	 * centro da foto, e só a aresta de baixo é pintada: ela sobe no canto
	 * esquerdo e encontra o fio como uma derivação, e não como um cruzamento.
	 */
	/*
	 * **Ele começa no topo da CAIXA da resposta, e não no topo do conteúdo dela.**
	 *
	 * A mensagem tem `--lym-msg-y` de respiro em cima, e a coluna da esquerda —
	 * de quem este cotovelo é filho — começa DEPOIS desse respiro. Começando em
	 * zero, sobrava uma falha da altura do respiro entre o fio que desce e a
	 * curva.
	 *
	 * **E ela só aparecia na ÚLTIMA resposta**, que é o que torna o defeito
	 * difícil de ler: nas outras, o pedaço de passagem cobre a caixa inteira,
	 * respiro incluído, e tapa o buraco sem ninguém notar que ele existe. A
	 * última não tem pedaço de passagem — é exatamente essa a diferença dela.
	 */
	top: calc( -1 * var( --lym-msg-y ) );
	height: calc( var( --lym-foto ) / 2 + 1px + var( --lym-msg-y ) );

	/*
	 * **A borda ESQUERDA veio junto, e ela é o último pedaço do fio.** Ela desce
	 * do alto da resposta até a curva; sem ela, a última resposta ficaria com o
	 * cotovelo solto, sem nada descendo até ele.
	 */
	border-left: 2px solid var( --lym-fio-cor );
	border-bottom: 2px solid var( --lym-fio-cor );
	border-bottom-left-radius: 10px;
}

/*
 * **O botão que abre mais respostas, e ele mora FORA da lista.**
 *
 * Dentro dela ele seria um `<li>` — e todo `<li>` da lista é uma mensagem, para
 * o fio e para quem lê com leitor de tela. Fora, ele fica depois do fio: o
 * traço acaba na bolinha da última resposta à vista, e o botão vem embaixo,
 * sem linha nenhuma chegando nele.
 */
.lym-comentario__abrir {
	margin: 0.35rem 0 0;
}

/*
 * **Ele é um LINK com classe do plugin, então precisa de pista PRÓPRIA.**
 *
 * A regra que sublinha os links da conversa alcança só `a:not([class*="lym-"])`
 * — senão ela atropelaria os componentes. Todo link nosso que seja frase paga
 * essa conta com uma pista sua: aqui é o contorno, que também é o que o faz
 * parecer um botão sem ganhar preenchimento.
 *
 * **A classe é dobrada, e não `!important`.** O tema do cliente pinta links;
 * um empate na especificidade impede este de sair vermelho sem ninguém pedir, e
 * continua deixando o cliente mudar depois.
 */
.lym-comentario__abrir-botao.lym-comentario__abrir-botao {
	display: inline-flex;
	align-items: center;

	/* O alvo de toque: uma linha de texto tem metade do que um dedo pede. */
	min-height: 44px;
	padding: 0 0.75rem;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 999px;

	color: inherit;
	font-size: 0.875rem;
	text-decoration: none;
}

.lym-comentario__abrir-botao.lym-comentario__abrir-botao:hover,
.lym-comentario__abrir-botao.lym-comentario__abrir-botao:focus {
	border-color: rgba( 128, 128, 128, 0.55 );
}

/*
 * **A caixa de escrever, quando o script a move para dentro da lista, carrega o
 * fio pela altura dela.**
 *
 * Ela entra logo depois da mensagem respondida. No meio da lista, sem este
 * pedaço o fio ficaria com um buraco do tamanho do formulário — e um formulário
 * não é pequeno.
 *
 * `position: relative` vale sempre; o desenho só aparece com ela dentro da
 * lista, que é onde o seletor casa.
 */
.lym-comentario__respostas > .lym-conversa__form {
	position: relative;
}

.lym-comentario__respostas > .lym-conversa__form::before {
	content: "";
	position: absolute;

	left: var( --lym-fio-esq );
	top: 0;
	bottom: 0;
	width: 2px;

	background: var( --lym-fio-cor );
}

/*
 * **Depois da ÚLTIMA, não.** Ali o fio já acabou — ele para na bolinha dela —, e
 * um pedaço ao lado do formulário seria o rabo de linha de volta, agora só
 * enquanto alguém escreve.
 */
.lym-comentario__respostas > .lym-comentario--fim + .lym-conversa__form::before {
	content: none;
}

/*
 * **A primeira resposta puxa o fio até o que está acima dela.** Ela é quem fecha
 * o vão entre o balão (ou o botão de recolher) e a lista: sobem a cabeça da lista
 * e o respiro que a própria mensagem tem em cima, que são as duas únicas coisas
 * entre um e outro.
 */
.lym-comentario__respostas > .lym-comentario:first-child > .lym-comentario__lado::before {
	top: calc( -1 * ( var( --lym-fio-cabeca ) + var( --lym-msg-y ) ) );
	height: calc( var( --lym-foto ) / 2 + 1px + var( --lym-fio-cabeca ) + var( --lym-msg-y ) );
}

/*
 * **A coluna da resposta vira referência para o cotovelo dela.** Sem isto ele
 * se posicionaria contra o primeiro ancestral posicionado, que pode ser
 * qualquer coisa da página do cliente — e o traço apareceria do outro lado da
 * tela.
 */
.lym-comentario__respostas > .lym-comentario > .lym-comentario__lado {
	position: relative;
}

/*
 * O assunto que se recolhe, com a contagem no botão.
 *
 * **`<details>` porque ele abre e fecha sem JavaScript nenhum** — o mesmo
 * idioma do menu de ordenar, e a dívida que o painel do índice contraiu e que
 * aqui não se repete. O navegador dá de graça o foco, o teclado e o anúncio
 * para leitor de tela.
 *
 * O bloco em si não desenha nada: quem desenha a calha é a lista de respostas
 * dentro dele. Uma borda aqui somaria com a de lá e a conversa ganharia duas
 * linhas verticais paralelas.
 */
/*
 * **O botão de recolher mora DENTRO do invólucro do fio desde 04/09/2026**, e
 * por isso não carrega mais nem coluna nem respiro próprios: quem os dá agora é
 * o invólucro. Deixados aqui, eles empurrariam o botão para dentro do recheio
 * que existe para afastar o conteúdo do fio.
 */
.lym-comentario__fio {
	margin-top: 0;
}

/*
 * **Quando ele está aberto, a lista de dentro já traz o respiro dela.** Sem
 * isto o `margin-top` do bloco somaria com o da lista e a primeira resposta
 * ficaria descolada do botão que a revela.
 */
.lym-comentario__fio .lym-comentario__respostas {
	--lym-fio-cabeca: 0.2rem;
}


/*
 * **Classe dobrada, e pelo mesmo motivo do botão de ordenar:** o tema do cliente
 * pinta `summary` em muitos temas de bloco, e um empate na especificidade é o
 * que impede este botão de sair vermelho sem ninguém ter pedido.
 *
 * **O alvo de toque é de ALTURA**, e é o erro que se repete: a linha parece
 * grande porque é larga. Uma linha de texto tem metade do que um dedo pede.
 *
 * O tom é o do texto, apagado: ele é uma etiqueta que conta quantas respostas
 * estão ali, e não a ação principal da linha. Pintá-lo com a cor de ação poria
 * um vermelho em cada assunto da conversa — que é exatamente o erro de
 * QUANTIDADE que o sistema de cor deste plugin existe para não repetir.
 */
.lym-comentario__fio-botao.lym-comentario__fio-botao {
	/*
	 * **Sem `display: inline-flex` aqui, e isso não é estilo: é a pista.** O
	 * `summary` nasce `display: list-item`, e é dali que sai o triângulo do
	 * navegador — trocar o display por flex apaga o marcador no Chrome, e o que
	 * sobra é um texto cinza claro que ninguém sabe que abre. Este botão é a
	 * ÚNICA forma de ver as respostas de um assunto recolhido: sem a pista, elas
	 * somem para quem não descobrir que aquilo se clica.
	 *
	 * **O alvo de toque cresce por `padding`, e aqui pode.** A regra da casa
	 * proíbe engordar com padding quando quem desenha a peça é a BORDA — não é o
	 * caso: a borda esquerda daqui não desenha o botão, desenha o FIO que passa
	 * por trás dele, e o padding só afasta o texto.
	 *
	 * **E é ele que carrega o fio pela própria altura.** O botão fica entre o
	 * balão e as respostas, e antes o fio se partia em volta dele. Uma borda no
	 * próprio botão cobre exatamente o que ele ocupa — sem ninguém precisar saber
	 * quanto isso mede, que é o que uma altura escrita à mão exigiria.
	 */
	padding: 0.6rem 0.25rem 0.6rem calc( var( --lym-fio-recuo ) + 1px );
	margin-left: var( --lym-fio-esq );

	border-left: 2px solid var( --lym-fio-cor );

	cursor: pointer;
	color: inherit;
	font-size: 0.875rem;
	opacity: 0.75;
}

/*
 * **Zero em cima, porque a seção já dá o respiro.** Somando com o que a
 * `.lym-conversa` tinha — 3rem de margem mais 2rem de calha —, eram cento e
 * doze pixels de vão antes da caixa de escrever, numa página que existe para
 * conversar.
 *
 * **Havia aqui uma segunda regra, para o formulário MOVIDO, e ela morreu com
 * o movimento.** Ao responder, o script tirava a caixa do alto e a punha
 * dentro da lista — e a caixa do topo sumia da tela sem que nada anunciasse
 * que era a mesma. Hoje ela fica onde está e quem diz a quem se responde é a
 * faixa dentro dela, então não há posição na árvore que precise de respiro
 * próprio.
 */
.lym-conversa__form {
	margin-top: 0;
}

.lym-conversa__form label {
	display: block;
	margin-bottom: 0.35rem;
	font-weight: 600;
}

.lym-conversa__form textarea {
	display: block;
	width: 100%;
	max-width: 100%;
	box-sizing: border-box;
}

.lym-conversa__aviso {
	margin: 0.5rem 0 1rem;
	font-size: 0.85rem;
	opacity: 0.8;
}

@media ( max-width: 600px ) {
	/*
	 * No celular o recuo por nível encolhe: cinco níveis com o recuo do
	 * computador deixariam o quinto com metade da largura da tela, e o traço
	 * sozinho já diz a hierarquia.
	 *
	 * **Quem encolhe é a MEDIDA, e nunca o recheio de uma peça.** Escrita como
	 * `padding-left` na lista, ela movia as respostas sem mover o fio que desce
	 * até elas: os pedaços de cima ficavam onde estavam, os de baixo iam junto com
	 * as respostas, e o traço quebrava no meio — só na tela estreita, que é onde
	 * ninguém estava olhando.
	 */
	.lym-comentario {
		--lym-fio-recuo: 0.6rem;
	}
}

/* ==========================================================================
 * A tela de renovar.
 *
 * **Ela não tinha uma linha de CSS.** O cabeçalho saía na largura do contêiner
 * do tema — no computador, uma frase de 175 caracteres numa linha só, contra os
 * 45 a 75 que se lê sem esforço — e o formulário logo abaixo vinha centrado num
 * teto próprio: as duas peças da mesma tela não compartilhavam nem largura nem
 * alinhamento.
 *
 * As medidas são as mesmas do checkout de propósito: é o mesmo formulário
 * embaixo, e dois tetos diferentes fariam a emenda aparecer.
 * ========================================================================== */

.lym-renovar {
	max-width: 32em;
	margin: 0 auto 1.5em;
}

.lym-renovar__titulo {
	margin: 0 0 0.5em;
}

.lym-renovar__estado {
	margin: 0;
}

@media ( min-width: 900px ) {
	.lym-renovar {
		max-width: 58em;
	}
}

/*
 * **A caixa curta se centraliza na tela em que ela é o único conteúdo.**
 *
 * As telas de "já entrou", "senha inválida" e "precisa entrar" colavam a caixa
 * no alto de um modelo com `min-height: 100vh` e deixavam três quartos da
 * primeira tela vazios embaixo. O plugin já resolve isso para a tela de
 * bloqueio, na regra irmã algumas linhas acima — faltava dizer que vale aqui
 * também.
 *
 * `:only-child` é o que amarra: numa página em que a caixa divide espaço com
 * outra coisa, centralizar seria arrastar o resto junto.
 */
.lym-pagina--limpa > .lym-caixa-aviso:only-child {
	margin-top: 0;
	margin-bottom: 0;
}

.lym-pagina--limpa:has( > .lym-caixa-aviso:only-child ) {
	display: flex;
	align-items: center;
	justify-content: center;
}

.lym-caixa-aviso {
	max-width: 34rem;
	margin: 2rem auto;
	padding: 2rem;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	background: var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) );
	text-align: center;
}

.lym-caixa-aviso h2 {
	margin: 0 0 0.75rem;
	font-size: 1.3rem;
}

.lym-caixa-aviso__texto {
	margin: 0 0 1.25rem;
	opacity: 0.85;
}

/* O índice do produto */

.lym-menu {
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
	overflow: hidden;
	font-size: 0.95rem;
}

.lym-menu__topo {
	display: flex;
	align-items: center;
	gap: 0.9rem;
	padding: 1.1rem 1.25rem;
	background: var( --lym-fundo );
}

.lym-menu__nome {
	display: flex;
	flex-direction: column;
	gap: 0.15rem;
	min-width: 0;
	font-weight: 600;
	line-height: 1.3;
}

.lym-menu__nome small {
	font-size: 0.75rem;
	font-weight: 400;
	opacity: 0.7;
}

.lym-menu__grupo {
	border-top: 1px solid var( --lym-borda );
}

.lym-menu__cabecalho {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.75rem;
	padding: 0.85rem 1.25rem;
	cursor: pointer;
	font-weight: 600;
	list-style: none;
}

/* O triângulo padrão do details some: a seta própria alinha melhor. */
.lym-menu__cabecalho::-webkit-details-marker {
	display: none;
}

.lym-menu__cabecalho::after {
	content: "\203A";
	margin-left: auto;
	opacity: 0.5;
	transform: rotate( 90deg );
}

.lym-menu__grupo[open] > .lym-menu__cabecalho::after {
	transform: rotate( -90deg );
}

.lym-menu__conta {
	font-size: 0.75rem;
	font-weight: 400;
	white-space: nowrap;
	opacity: 0.7;
}

.lym-menu__item {
	display: flex;
	align-items: flex-start;
	gap: 0.65rem;
	padding: 0.55rem 1.25rem 0.55rem 1rem;
	line-height: 1.4;
}

.lym-menu__item a {
	text-decoration: none;
}

.lym-menu__item a:hover,
.lym-menu__item a:focus {
	text-decoration: underline;
}

/*
 * **Sem opacidade: ela MULTIPLICA com a do item, e o resultado era ilegível.**
 *
 * O aviso de "Será liberado em 3 dias" tinha 0,75 e vive dentro de um item
 * trancado, que tinha 0,5 — efetivo 0,375. Nenhuma cor de texto de tema salva um
 * texto de 11,5px a 37% de opacidade.
 *
 * Ele já é menor que o nome do item, e o corpo menor sozinho basta para
 * separá-lo. O que ele diz — quando o conteúdo abre — é informação, e informação
 * não se apaga.
 */
/*
 * O nome do grupo dentro do índice. A classe existia na view sem regra nenhuma,
 * e o título saía com o mesmo peso dos itens embaixo dele — a lista perdia a
 * divisão que a estrutura tem.
 */
/*
 * **O módulo é a cor, e o conteúdo é o texto.** Era o contrário — o nome de cada
 * conteúdo saía na cor de link do tema e o módulo em branco —, e numa coluna de
 * 148 nomes coloridos a divisão da estrutura sumia. Decisão do Flávio em
 * 15/09/2026: "os módulos todos em azul e o nome dos conteúdos todos em branco,
 * assim vai dar mais leveza".
 *
 * O azul é `--lym-info`, que é o par MEDIDO do plugin para os dois temas — e não
 * o azul do tema de quem instalou, que o plugin não sabe qual é. A cor do
 * produto vence, quando o dono escolheu uma.
 */
.lym-menu .lym-menu__titulo {
	display: block;
	color: var( --lym-destaque, var( --lym-info ) );
	font-weight: 600;
}

/*
 * **E o nome do conteúdo herda a cor do texto.** O seletor é fundo de propósito:
 * o tema do cliente pinta os links dele com a classe do corpo (`body.x a` pesa
 * mais que `.lym-menu a`), e era ele que deixava a lista inteira azul. Duas
 * classes mais o elemento vencem aquele peso sem `!important`, que tiraria do
 * dono a chance de mudar depois.
 */
.lym-menu .lym-menu__item a,
.lym-menu .lym-menu__item a:hover,
.lym-menu .lym-menu__item a:focus {
	color: inherit;
}

.lym-menu__item small {
	display: block;
	font-size: 0.72rem;
}

/*
 * **O nome do item concluído NÃO desbota, e é o mesmo conserto de contraste
 * já aplicado à lista da página do produto — que ficou lá e não veio para
 * cá.**
 *
 * Ele tinha `opacity: 0.7`, e a `opacity` num `li` alcança o subárvore
 * inteira: a cor de link a 70% sobre branco dá 4,03:1, contra os 4,5:1 que
 * a WCAG pede para texto normal — e o corpo aqui é 0,95rem, que não é texto
 * grande. Numa lista de 148 itens, é a MAIORIA dos nomes que o membro que
 * está avançando lê desbotada, justamente quando ele quer voltar para
 * revisar.
 *
 * **E ela apagava a bolinha junto.** A regra logo abaixo devolve
 * `opacity: 1` ao botão do item feito — e não devolvia nada: `opacity` no
 * ancestral cria um grupo, e o filho compõe DENTRO dele. Os dois sinais de
 * "feito" saíam a 70%: o nome e a bolinha que já dizia tudo.
 *
 * `list-style: none` é o valor que a lista já dá; declarar aqui é o jeito de
 * a classe não ficar órfã — ela é escrita pelo PHP, e uma classe sem regra
 * manda quem lê a view procurar uma que não existe.
 */
.lym-menu__item--feito {
	list-style: none;
}
.lym-menu__item--trancado {
	opacity: 0.7;
}

/*
 * **O item aberto é marcado pelo FUNDO e pelo PESO, sem faixa nenhuma.**
 *
 * Houve uma faixa na lateral, e ela chegou a ser a cor de ação — o único
 * vermelho do índice. O Flávio pediu para tirar em 16/09/2026, vendo a tela: na
 * coluna azul dos módulos, o vermelho antes da bolinha era a peça que sobrava.
 *
 * **Quem marca é o PESO.** O fundo é o cinza TRANSLÚCIDO de `--lym-fundo`, que
 * só clareia ou escurece o que já está atrás e por isso não apaga o texto no
 * tema de ninguém — mas ele dá 1,09:1 contra o fundo da página, e sozinho não
 * seria marca. Quem usa leitor de tela ouve o `aria-current` do link.
 */
.lym-menu__item--atual {
	background: var( --lym-fundo );
	font-weight: 600;
	opacity: 1;
}

/*
 * As peças da tela de um conteúdo.
 *
 * Cada uma funciona sozinha, colada onde o cliente quiser no construtor de
 * páginas. Uma peça que só funcionasse dentro do nosso modelo obrigaria a
 * escolher entre o desenho dele e o que o plugin sabe fazer.
 */

/*
 * Sem linha embaixo e sem respiro largo: a faixa é colada onde o cliente
 * quiser, inclusive numa coluna estreita, e ali uma linha atravessada vira
 * sujeira. Quem quiser separação põe no construtor de páginas, que é onde
 * ele já decide o espaçamento de tudo.
 */
.lym-cabecalho {
	display: flex;
	align-items: center;
	gap: 1rem;
}

/*
 * O sino vai para a ponta direita da faixa. `margin-left: auto` e não
 * `justify-content: space-between`: a faixa pode ganhar uma terceira peça um
 * dia, e com `space-between` ela apareceria no meio sem ninguém ter pedido.
 */
/*
 * **O filho direto do cabeçalho é o INVÓLUCRO, e não o sino.** Quando o painel
 * entrou, o sino ganhou um `<div>` em volta — e este seletor, que é de filho
 * direto, parou de casar em silêncio: o sino saiu do canto e foi colar no nome
 * da pessoa, sem nada na tela dizendo por quê.
 *
 * É a família de defeito que este arquivo já registra: regra que parece fazer
 * alguma coisa e não faz.
 */
.lym-cabecalho > .lym-sino-caixa {
	margin-left: auto;
}

/*
 * max-width e min-width existem porque o nome pode ser um e-mail — é o que o
 * WordPress usa quando a conta não tem nome cadastrado, e foi o caso do
 * primeiro comprador de teste. Um endereço de e-mail é uma palavra só, não
 * quebra em lugar nenhum, e empurrava a página inteira para fora da tela: um
 * elemento que estoura a largura faz o site ganhar rolagem lateral, e aí some
 * texto que não tem nada a ver com ele.
 */
.lym-cabecalho__perfil.lym-cabecalho__perfil {
	display: inline-flex;
	gap: 0.7rem;
	align-items: center;
	max-width: 100%;
	min-width: 0;
	padding: 0.35rem 1.1rem 0.35rem 0.35rem;
	border: 1px solid rgba( 128, 128, 128, 0.35 );
	border-radius: 2rem;
	color: inherit;
	font-size: 0.92rem;
	text-decoration: none;
}

.lym-cabecalho__perfil.lym-cabecalho__perfil:hover,
.lym-cabecalho__perfil.lym-cabecalho__perfil:focus {
	border-color: var( --lym-destaque, currentColor );
}

.lym-cabecalho__texto {
	display: flex;
	flex-direction: column;
	gap: 0.1rem;
	min-width: 0;
	line-height: 1.25;
}

/* Cortar com reticências é melhor que empurrar a página para fora da tela. */
.lym-cabecalho__eu,
.lym-cabecalho__acao {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.lym-cabecalho__eu {
	font-weight: 600;
}

/* Menor e apagado: é a instrução, não o nome da pessoa. */
.lym-cabecalho__acao {
	color: var( --lym-destaque, currentColor );
	font-size: 0.78rem;
	opacity: 0.85;
}

/*
 * A classe é dobrada em si mesma, e não presa a um ancestral: o mesmo desenho
 * aparece solto na faixa e dentro do índice, e amarrar a regra ao envoltório
 * fazia a foto sair no tamanho natural — enorme e quadrada — no segundo lugar.
 */
.lym-cabecalho__foto.lym-cabecalho__foto {
	width: 2.1rem;
	height: 2.1rem;
	max-width: 2.1rem;
	flex: 0 0 auto;
	border-radius: 50%;
	object-fit: cover;
}

/* Anterior e próximo, soltos, para o autor pôr onde quiser. */

/*
 * Respira em cima e quase nada embaixo: o que vem antes é o vídeo, que precisa
 * do espaço, e o que vem depois é o título do conteúdo — que pertence ao mesmo
 * bloco de leitura e não pode parecer solto.
 */
.lym-navegacao {
	display: flex;
	flex-wrap: wrap;
	gap: 1rem;
	align-items: center;
	margin: 1.25rem 0 0.25rem;
}

/*
 * **O "anterior" e o "próximo" levam sublinhado no repouso**, e a regra que o
 * tirava saiu em 01/09/2026.
 *
 * O comentário que estava aqui dizia que a cor de link do tema era a certa —
 * e ela deixou de chegar quando os links do plugin passaram a herdar a cor do
 * texto. Sem cor e sem traço, os dois viravam texto solto abaixo do vídeo.
 *
 * Eles não são uma lista nem um cartão: são duas frases soltas, e para frase
 * solta o traço é a única pista que existe.
 */
.lym-navegacao__link {
	font-size: 0.95rem;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

.lym-navegacao__link:hover,
.lym-navegacao__link:focus {
	text-decoration: underline;
}


/*
 * A bolinha ao lado de cada item é o botão de marcar.
 *
 * Ela já estava ali dizendo o estado; fazer dela o controle põe a ação onde a
 * informação está, e poupa um botão a mais numa coluna estreita. Os seletores
 * são duplos porque o tema do cliente pinta os botões dele.
 */
.lym-marcar {
	margin: 0;
	line-height: 0;
	padding-top: 2px;
}

/*
 * **O desenho tem 18px e o ALVO tem 44px, e são coisas diferentes.**
 *
 * Ela é o único controle de progresso do plugin e tinha 18×18 de área
 * clicável — menos da metade do mínimo de 44px que dedo nenhum acerta. O
 * formulário em volta não ajudava, porque tem `line-height: 0`.
 *
 * Quem cresce é um pseudoelemento invisível por cima, e não a caixa do botão:
 * `padding` engordaria o círculo junto, porque quem desenha o círculo é a
 * BORDA. O pseudoelemento recebe o toque e o entrega ao botão, e o desenho
 * continua com os mesmos 18px.
 */
.lym-menu .lym-marca {
	position: relative;
	display: block;
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	margin: 0;
	padding: 0;
	border: 2px solid currentColor;
	border-radius: 50%;
	background: transparent;
	box-shadow: none;
	opacity: 0.45;
	cursor: pointer;
}

.lym-menu .lym-marca::after {
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	width: 44px;
	height: 44px;
	transform: translate( -50%, -50% );
}

/*
 * **A bolinha NÃO marcada é um contorno CINZA, e o vermelho que havia nela nunca
 * foi do plugin.** O desenho é a borda em `currentColor`, e a bolinha é um
 * `<button>`: sem `color` declarado, quem decidia era o tema — o Hello Elementor
 * pinta todo botão de `#c36` —, e a 0,45 de opacidade aquilo dava 1,64:1 no fundo
 * escuro. O Flávio pediu em 16/09/2026 que ela saísse sem cor.
 *
 * O cinza é o mesmo contorno MEDIDO do botão secundário (0,92, 3:1 contra
 * branco e contra quase-preto), e sem opacidade: a 0,45 esse mesmo cinza cai para
 * 1,79:1. Cinza, e não a cor do texto, porque a bolinha do conteúdo que ainda não
 * liberou já é a cor do texto — as duas ficariam iguais.
 *
 * **`color: inherit` corta o tema pela raiz**, e é o que faz o anel de foco do
 * teclado (`currentColor`) sair na cor do texto, e não no branco que o tema dá a
 * botão em foco. E a regra é do BOTÃO, e não da base `.lym-menu .lym-marca`:
 * a base também alcança o `<span>` trancado.
 */
.lym-menu button.lym-marca {
	color: inherit;
	border-color: rgba( 128, 128, 128, 0.92 );
	opacity: 1;
}

/*
 * Todos os estados do botão são declarados, e não só o normal.
 *
 * O tema do cliente pinta botão em foco e em ação — e pintou este de vermelho
 * assim que a pessoa clicava, o que fazia o item recém-marcado ficar de uma cor
 * e os outros de outra. Quem clicava concluía que as duas cores queriam dizer
 * coisas diferentes. Não querem: era o tema por cima do nosso botão.
 *
 * No gesto o contorno ganha o azul da bolinha cheia: é o "vai ficar assim".
 */
.lym-menu button.lym-marca:hover,
.lym-menu button.lym-marca:focus,
.lym-menu button.lym-marca:active {
	color: inherit;
	border-color: var( --lym-marcado, var( --lym-destaque, var( --lym-info, #1d5faf ) ) );
	background: transparent;
	box-shadow: none;
	opacity: 1;
}

/* Anel de foco só para quem chegou pelo teclado; o mouse já sabe onde clicou. */
.lym-menu button.lym-marca:focus {
	outline: none;
}

.lym-menu button.lym-marca:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

/*
 * Marcado é a bolinha cheia, sem símbolo dentro. Um sinal desenhado por cima
 * precisaria contrastar com a cor de fundo, e o plugin não sabe calcular esse
 * contraste — cheio contra vazio já diz tudo sozinho.
 *
 * **O azul é o dos nomes de módulo, e pela MESMA cadeia** (16/09/2026; antes era
 * o verde de concluído). A cor do produto vence quando o dono escolheu uma, e
 * senão vale o par medido `--lym-info` (6,35:1 no claro, 7,83:1 no escuro do
 * tema forçado). Escrita igual à do título do módulo e à do anel de progresso,
 * as três peças não têm como sair em azuis diferentes.
 *
 * `--lym-marcado` nunca foi declarada em lugar nenhum: é a saída para quem
 * quiser uma cor só para a bolinha, e ela vem por fora da cadeia.
 *
 * **O seletor começa em `.lym-menu`**, e não é enfeite: a bolinha vazia do botão
 * (`.lym-menu button.lym-marca`) pesa (0,2,1), o mesmo que esta regra pesaria
 * sem ele — e num empate vence quem vem depois na folha. Com a classe a mais a
 * cheia vence em qualquer ordem.
 */
.lym-menu .lym-menu__item--feito button.lym-marca,
.lym-menu .lym-menu__item--feito button.lym-marca:hover,
.lym-menu .lym-menu__item--feito button.lym-marca:focus,
.lym-menu .lym-menu__item--feito button.lym-marca:active {
	border-color: var( --lym-marcado, var( --lym-destaque, var( --lym-info, #1d5faf ) ) );
	background: var( --lym-marcado, var( --lym-destaque, var( --lym-info, #1d5faf ) ) );
	opacity: 1;
}
/*
 * Trancado não é botão: não recebe o cursor de clique nem reage ao mouse.
 *
 * **O seletor começa em `.lym-menu` para o tracejado VALER.** Com a classe
 * sozinha (0,1,0), o `border: 2px solid` da base (0,2,0) vencia, e o tracejado
 * que este bloco sempre declarou nunca apareceu na tela. Com a bolinha vazia
 * cinza, é ele que separa "ainda não liberou" de "não marquei".
 */
.lym-menu .lym-marca--trancado {
	border-style: dashed;
	cursor: default;
	/*
	 * 0,45 fora de um item trancado (a bolinha vazia foi para 1, com o cinza
	 * medido, em 16/09/2026): a 0,3 o anel dava 1,41:1 e a coluna de 18px ficava
	 * visualmente vazia — o estado "trancado" não chegava a ser comunicado por
	 * nada, porque o elemento é `aria-hidden` e não sobra nem para leitor de
	 * tela. Quem diferencia é o tracejado, não o apagamento.
	 *
	 * **E ela vinha DUAS vezes.** Este valor é herdado de `.lym-menu .lym-marca`
	 * e o `<li>` que contém a bolinha trancada tem os seus próprios 0,7 — e
	 * `opacity` de ancestral compõe a subárvore inteira, então o que saía era
	 * 0,70 × 0,45 = **0,315**: abaixo do 0,3 que o parágrafo acima descarta
	 * nominalmente, entre 1,84:1 e 2,54:1 conforme o tema.
	 *
	 * O par não parece aninhado no texto da folha — `.lym-menu__item--trancado`
	 * e `.lym-marca--trancado` são blocos BEM diferentes e nunca se tocam — e
	 * na árvore está sempre um dentro do outro. É a razão de a varredura por
	 * seletor descendente devolver zero com o defeito de pé.
	 *
	 * A regra logo abaixo desfaz a segunda dose: dentro do item trancado a
	 * bolinha vale 1, e o que sobra é o 0,7 do `<li>` — mais visível que os
	 * 0,45 que este comentário defende, e não menos.
	 */
	opacity: 0.45;
}

.lym-menu__item--trancado .lym-marca--trancado {
	opacity: 1;
}

/*
 * O rótulo existe para leitor de tela e some da vista. Uma bolinha sem texto
 * nenhum é um botão mudo para quem não enxerga a tela.
 */
.lym-marca__rotulo {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect( 0 0 0 0 );
	white-space: nowrap;
}

/* O índice, com o próprio botão de abrir e fechar. */

.lym-indice {
	position: relative;
}

/*
 * Os seletores são duplos de propósito. O tema do cliente pinta os botões dele
 * — e pintou este de vermelho — e uma classe sozinha perde para a regra do tema
 * em quase todo tema comercial. Duplicar a classe empata em especificidade sem
 * recorrer a !important, que tiraria do cliente a chance de mudar depois.
 */
.lym-indice .lym-indice__botao {
	display: inline-flex;
	gap: 0.6rem;
	align-items: center;
	width: auto;
	max-width: 100%;
	margin: 0 0 0.85rem;
	padding: 0.6rem 1.1rem;
	border: 1px solid rgba( 128, 128, 128, 0.35 );
	border-radius: 2rem;
	background: rgba( 128, 128, 128, 0.1 );
	box-shadow: none;
	color: inherit;
	font: inherit;
	font-size: 0.92rem;
	line-height: 1.2;
	text-transform: none;
	letter-spacing: normal;
	cursor: pointer;
}

.lym-indice .lym-indice__botao:hover,
.lym-indice .lym-indice__botao:focus {
	border-color: var( --lym-destaque, currentColor );
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
}

.lym-indice__icone {
	flex-shrink: 0;
	color: var( --lym-destaque, currentColor );
}

.lym-indice__icone--fechar,
.lym-indice__fechar,
.lym-indice--aberto .lym-indice__icone--abrir,
.lym-indice--aberto .lym-indice__abrir {
	display: none;
}

.lym-indice--aberto .lym-indice__icone--fechar {
	display: block;
}

.lym-indice--aberto .lym-indice__fechar {
	display: inline;
}

/*
 * O rótulo é o nome que o cliente deu ao conteúdo, e pode ser comprido. Numa
 * coluna estreita ele esticava o botão além da tela.
 */
.lym-indice__abrir,
.lym-indice__fechar {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/*
 * Quem decide o estado inicial é a largura da tela, e não o script: sem
 * JavaScript o índice continua aparecendo no computador, que é onde ele cabe.
 * O script só troca a classe; as duas leituras dela moram aqui.
 */
/*
 * **No computador o índice fica SEMPRE aberto, e o botão nem aparece.**
 *
 * Recolher fazia sentido quando o índice disputava espaço; acima de 1024px ele
 * tem coluna própria e não disputa com nada. O botão ali só oferecia à pessoa a
 * chance de esconder a única coisa que a orienta dentro do produto — e quem
 * fechava por engano não tinha como saber que o caminho de volta era aquele
 * mesmo botão, que fica FORA do painel.
 *
 * **O estado "fechado" deixou de existir no computador, em vez de ser
 * sobrescrito.** A regra que o escondia morava fora de media query, e a saída
 * óbvia — um `display: block` acima de 1024px — criava duas regras dizendo o
 * contrário uma da outra sobre a mesma classe. Pior: deixava de pé um seletor
 * `--fechado` que NÃO esconde, e é exatamente isso que põe um painel invisível
 * na ordem do Tab. Movendo a regra para dentro da faixa estreita, o estado
 * fechado só existe onde ele de fato esconde.
 */
/*
 * **1024.02px, e não 1025px.** Entre as duas medidas existe uma faixa de
 * larguras fracionárias — a escala de 125% ou 150% do Windows e o zoom do
 * navegador produzem exatamente isso — em que NENHUMA das duas regras casa: o
 * menu aparece na coluna E o botão aparece junto, e o botão não faz nada,
 * porque a regra que ele aciona só existe dentro do `max-width: 1024px`.
 *
 * O valor fracionário fecha a fenda sem mexer no corte de ninguém.
 */
@media ( min-width: 1024.02px ) {
	.lym-indice .lym-indice__botao {
		display: none;
	}

	/*
	 * A coluna acompanha a rolagem e quem rola por dentro é o índice: o perfil,
	 * o sino e o Grupo ficam parados no alto, e a lista corre embaixo deles.
	 */
	.lym-tela__lado {
		display: flex;
		flex-direction: column;
	}

	.lym-tela__lado .lym-menu-lateral,
	.lym-tela__lado .lym-indice {
		flex: 1 1 auto;
		min-height: 0;
	}

	.lym-tela__lado .lym-indice {
		overflow-y: auto;
	}
}

.lym-indice__veu {
	display: none;
}

/*
 * O corte é 1024px, e não 860: no tablet as duas colunas do construtor de
 * páginas já empilharam, e um índice aberto ali fica em cima do vídeo — o
 * sumário no lugar do conteúdo. Ao lado ou recolhido; nunca aberto por cima.
 */
@media ( max-width: 1024px ) {
	.lym-indice .lym-menu {
		display: none;
	}

	.lym-indice--fechado .lym-menu {
		display: none;
	}

	.lym-indice--aberto .lym-menu {
		display: block;
		position: fixed;
		z-index: 2147483000;
		top: 0;
		bottom: 0;
		left: 0;
		width: min( 20rem, 85vw );
		overflow-y: auto;
		padding: 1rem;
		box-shadow: 0 0 2rem rgba( 0, 0, 0, 0.35 );
		/*
		 * O painel cobre o conteúdo, então precisa ser opaco — e o plugin não
		 * sabe a cor de fundo da página do cliente. Quem sabe é o navegador: o
		 * script lê a cor e a escreve nesta variável. Chutar branco quebraria
		 * toda área de membros escura, que é a maioria delas.
		 */
		background: var( --lym-painel, Canvas );
	}

	/*
	 * O número é absurdo de propósito. O player de vídeo do cliente desenha os
	 * avisos dele por cima de tudo — e apareceu na frente do painel, que é a
	 * única coisa na tela que a pessoa acabou de mandar abrir.
	 */
	.lym-indice--aberto .lym-indice__veu {
		display: block;
		position: fixed;
		z-index: 2147482999;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		background: rgba( 0, 0, 0, 0.5 );
	}
}
/*
 * O menu do comprador: coluna no computador, barra no tablet e no celular.
 *
 * **A marcação é uma só, e quem rearranja é esta folha.** Duas marcações — uma
 * por largura — seriam dois sinos no mesmo HTML (dois nonces, dois painéis, dois
 * ouvintes de Esc) e dois índices com o mesmo `id`.
 */
.lym-menu-lateral {
	display: flex;
	flex-direction: column;
	gap: 0.85rem;
	min-width: 0;
}

/*
 * Na coluna cada item ocupa a largura toda: numa lista vertical, itens de
 * larguras diferentes leem como coisas de tipos diferentes.
 */
/*
 * `border-box` escopado aos itens, e não à tela inteira: o botão do perfil tem
 * recheio e borda, e num tema que não declare o modelo de caixa os 100% viram
 * 100% MAIS a borda — que é uma coluna estourada em todo tema comum.
 */
.lym-menu-lateral > .lym-sino-caixa,
.lym-menu-lateral > .lym-cabecalho__perfil.lym-cabecalho__perfil,
.lym-menu-lateral > .lym-menu-lateral__item {
	box-sizing: border-box;
	width: 100%;
}

/*
 * **O perfil do menu NÃO tem contorno, em largura nenhuma** (pedido do Flávio em
 * 18/09/2026: primeiro na barra, "tire o envoltório"; depois no computador, "na
 * versão mobile você tirou este envoltório e ficou bom"). O contorno fazia do
 * perfil a única pílula de um menu em que o sino e o Grupo são desenho e
 * palavra. A borda continua existindo, transparente — é ela o anel de FOCO de
 * quem navega pelo teclado, e só de quem navega pelo teclado (`:focus-visible`):
 * com `:focus`, o clique e o toque também acenderiam o contorno tirado, até a
 * página seguinte. Quem aponta com o mouse vê a palavra "Perfil" sublinhada,
 * como o Grupo. As três regras vencem o `:hover` e o `:focus` do bloco base do
 * perfil, que pesam o mesmo, por ORDEM — e o foco pelo peso a mais.
 */
.lym-menu-lateral > .lym-cabecalho__perfil.lym-cabecalho__perfil {
	border-color: transparent;
}

.lym-menu-lateral > .lym-cabecalho__perfil.lym-cabecalho__perfil:hover .lym-cabecalho__acao {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

.lym-menu-lateral > .lym-cabecalho__perfil.lym-cabecalho__perfil:focus-visible {
	border-color: var( --lym-destaque, currentColor );
}

/*
 * **A caixa do sino é COLUNA, e a direção não é detalhe.** Na linha (que é o
 * padrão do flex), o painel — que nesta coluna ocupa lugar em vez de flutuar —
 * abria AO LADO do sino, espremido em 180px, e esticava o próprio sino para
 * 200px de altura com o ícone, a palavra e a segunda linha espalhados.
 * Medido em navegador, e o comentário do painel prometia o contrário.
 */
.lym-menu-lateral > .lym-sino-caixa {
	display: flex;
	flex-direction: column;
}

.lym-menu-lateral .lym-sino {
	flex: 1 1 auto;
	flex-wrap: wrap;
	min-width: 0;
}

/*
 * O item do Grupo: o desenho e a palavra, como o sino e o botão do índice. O
 * alvo de toque é a ALTURA de 44px, e não a largura — o erro de sempre é achar
 * que um item largo já é grande o bastante para o dedo.
 */
.lym-menu-lateral__item {
	display: inline-flex;
	gap: 0.4rem;
	align-items: center;
	min-width: 0;
	min-height: 44px;
	padding: 0 0.25rem;
	color: inherit;
	text-decoration: none;
}

/*
 * **A cor do link do Grupo tem classe DOBRADA**, pela mesma razão do sino: o
 * `color: inherit` acima pesa (0,1,0) e perdia para o `.elementor-kit-N a` (0,1,1)
 * do Kit do Elementor, que pintava "Grupo" de azul só nas páginas montadas nele.
 */
.lym-menu-lateral__item.lym-menu-lateral__item,
.lym-menu-lateral__item.lym-menu-lateral__item:hover,
.lym-menu-lateral__item.lym-menu-lateral__item:focus,
.lym-menu-lateral__item.lym-menu-lateral__item:active {
	color: inherit;
}

/*
 * A pista deste link é a resposta ao gesto: ele é uma FRASE com classe nossa, e
 * frase sem pista nenhuma não se distingue de texto.
 */
.lym-menu-lateral__item:hover,
.lym-menu-lateral__item:focus {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/*
 * **O ícone do Grupo é VERDE ESCURO, e fixo** (pedido do Flávio em 16/09/2026;
 * antes era a cor de ação, e antes ainda cinza como a palavra). A razão de ele
 * não ser um par medido, e a conta que o autoriza, moram na declaração de
 * `--lym-grupo`. A palavra "Grupo" continua na cor do texto.
 *
 * **A cor do produto NÃO vence aqui**, ao contrário do nome do módulo e do sino:
 * o verde foi pedido como a cor DESTA peça, e não como a cor de orientação da
 * coluna — que é o papel que a cor do produto substitui.
 */
.lym-menu-lateral__icone {
	flex: 0 0 auto;
	color: var( --lym-grupo, currentColor );
}

/*
 * **A palavra de cada item é menor e mais leve que o nome da pessoa** — e não
 * apagada. O Flávio pediu "cinza", e cinza aqui sai caro: `opacity` não
 * enfraquece a cor, TROCA pela mistura com o fundo, e estas duas palavras são o
 * único texto de um link (o nome que o leitor de tela anuncia), em corpo
 * pequeno, onde o mínimo é 4,5:1.
 *
 * **A conta, medida:** para sobreviver a 0,75 o texto herdado precisaria de
 * 9,15:1 no claro e 7,13:1 no escuro. Um tema com texto `#767676` — que passa
 * sozinho, com 4,54:1 — cairia para 2,88:1, e a guarda de legibilidade do
 * script não pega: ela mede a cor do invólucro e a opacidade é aplicada depois
 * dela. Hierarquia dentro de bloco se faz com CORPO e PESO, que é o que este
 * projeto já decidiu, e é o que sobrou aqui.
 */
.lym-menu-lateral .lym-sino__texto,
.lym-menu-lateral .lym-menu-lateral__texto {
	font-size: 0.85rem;
	font-weight: 400;
}

/* Cortar com reticências é melhor que empurrar a barra para fora da tela. */
.lym-menu-lateral__texto {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* A moldura pronta, que junta as peças em duas colunas. */

.lym-tela {
	max-width: 82rem;
	margin: 0 auto;
	padding: 0 1.25rem 4rem;
}

.lym-tela__grade {
	display: grid;
	grid-template-columns: 17rem minmax( 0, 1fr );
	gap: 2.5rem;
	align-items: start;
	padding-top: 2rem;
}

.lym-tela--sem-indice .lym-tela__grade {
	grid-template-columns: minmax( 0, 1fr );
}

/*
 * O índice acompanha a rolagem no computador. Num conteúdo longo, ter que
 * voltar ao topo para trocar de item é o atrito que faz a pessoa fechar a aba.
 */
/*
 * **Quem rola por dentro é o ÍNDICE, e não a coluna.** Era a coluna, e com o
 * menu lá dentro isso passou a recortar o painel do sino: um ancestral com
 * `overflow` diferente de `visible` corta o descendente absoluto, e um painel de
 * 22rem dentro de uma coluna de 17rem viraria barra de rolagem em vez de abrir
 * por cima do conteúdo. A rolagem mora no índice, que é a parte que cresce.
 */
.lym-tela__lado {
	position: sticky;
	top: 1.5rem;
	max-height: calc( 100vh - 3rem );
}

.lym-tela__principal {
	min-width: 0;
}

/*
 * **1024px, e não 860px: é a mesma decisão que o índice já usa.**
 *
 * Eram dois cortes para a mesma pergunta — "o índice cabe ao lado?" —, com
 * 164px de desacordo. Entre 861 e 1024px o menu era escondido (o índice vira
 * painel a partir de 1024) e a grade continuava reservando 17rem para ele: uma
 * coluna de 272px vazia, mais o vão de 40px, roubando 312px da largura numa
 * faixa que é exatamente a do tablet em paisagem.
 *
 * Enquanto os dois números forem diferentes, a faixa entre eles sempre vai
 * desenhar uma coluna que não tem o que mostrar.
 */
@media ( max-width: 1024px ) {
	.lym-tela__grade {
		grid-template-columns: minmax( 0, 1fr );
		gap: 1.5rem;
		padding-top: 1.5rem;
	}

	.lym-tela__lado {
		position: static;
		max-height: none;
		overflow: visible;
	}

	/*
	 * **Aqui a coluna vira uma barra de uma linha só**, e ela não quebra em duas:
	 * quem cede é o texto de cada item, que corta com reticências. Pedido do
	 * Flávio em 15/09/2026, com a letra menor se preciso.
	 */
	.lym-menu-lateral {
		flex-direction: row;
		flex-wrap: nowrap;
		align-items: center;
		gap: 0.5rem;
		font-size: 0.85rem;
	}

	.lym-menu-lateral > * {
		min-width: 0;
	}

	/*
	 * **Na barra, o painel do sino ocupa a largura da BARRA, e não a do sino.**
	 * Ancorado ao sino, as 22rem dele não cabem ao lado de um ícone num telefone:
	 * o script vira o painel para a direita quando ele sairia pela esquerda, e
	 * daí ele passa da margem direita da página — que foi o que o Flávio viu.
	 * O `max-width: calc( 100vw - 2rem )` não salva, porque ele não sabe de onde
	 * o painel começa.
	 *
	 * Ancorando no menu, ele desce inteiro embaixo da barra, com as margens da
	 * página dos dois lados.
	 *
	 * **E o `escolherLado()` continua mandando, sem estragar nada.** Ele mede o
	 * painel já posicionado e escreve `left: 0; right: auto` quando a borda
	 * esquerda fica abaixo de 8px — o que aqui acontece sempre que a própria
	 * barra começa colada na borda da tela, num tema sem recheio lateral.
	 * Escrito isso, o painel encolhe para o conteúdo a partir do MESMO canto, e
	 * o limite dele passa a ser a largura que sobra do menu: ele pode ficar mais
	 * estreito que a barra, e nunca mais largo. Era o contrário disso que
	 * estourava a margem, com o painel pendurado no sino lá no fim da linha.
	 *
	 * **O menu ancora SEM `z-index`**, e isso é decisão: um valor ali criaria um
	 * contexto de empilhamento, e o 2147482998 do painel — que existe para
	 * passar por cima do tocador de vídeo do cliente — passaria a valer só
	 * dentro do menu. O painel abriria por baixo do vídeo, e quem o abrisse
	 * concluiria que o sino não funciona.
	 */
	.lym-menu-lateral {
		position: relative;
	}

	.lym-menu-lateral > .lym-sino-caixa {
		position: static;
	}

	.lym-menu-lateral .lym-sino__painel {
		left: 0;
		right: 0;
		width: auto;
		max-width: none;
	}

	/*
	 * **A ordem da barra é do Flávio: perfil, conteúdo, Grupo, notificações** — e
	 * é a única exceção à regra "quem manda na ordem é o documento".
	 *
	 * A ordem do ARQUIVO é a da coluna do computador, onde o índice está sempre
	 * aberto: ali quem navega por teclado precisa alcançar perfil, sino e Grupo
	 * antes da lista inteira de conteúdos. Aqui o índice é só um botão, e o
	 * painel dele nasce fechado — o que muda é a ordem de quatro paradas do Tab
	 * numa barra de navegação, e nunca o que a pessoa escreve. Foi por isso que a
	 * regra nasceu no compositor, onde a troca era entre campo e botão de enviar.
	 */
	.lym-menu-lateral .lym-indice {
		order: 2;
	}

	/*
	 * **O `width: 100%` é da COLUNA, e aqui ele tem de ser desfeito** — como já
	 * era para o sino e para o perfil. Medido em navegador: sem esta linha, o
	 * item do Grupo entra na conta com a largura da barra inteira, engole o
	 * espaço dos vizinhos e, num telefone de 360px, o nome, o "Ver perfil" e o
	 * rótulo do índice saem com ZERO pixel — três dos quatro rótulos que o
	 * Flávio pediu escritos. E o que sobra vira uma faixa clicável de 400px de
	 * vazio no meio da barra.
	 */
	.lym-menu-lateral > .lym-menu-lateral__item {
		order: 3;
		flex: 0 1 auto;
		width: auto;
	}

	.lym-menu-lateral > .lym-sino-caixa {
		order: 4;
		width: auto;
	}

	/*
	 * **Na barra o índice também NÃO tem contorno** (pedido do Flávio em
	 * 18/09/2026, "tire o envoltório"): ele e o perfil eram as duas únicas pílulas
	 * numa fileira em que o sino e o Grupo são só desenho e palavra, e a borda
	 * gastava largura justamente onde ela falta. O perfil perdeu o dele em toda
	 * largura (a regra mora fora das faixas, junto das do menu); o do índice mora
	 * aqui porque só aqui o botão existe. A borda continua existindo,
	 * transparente, porque é ela que desenha o anel de FOCO de quem navega pelo
	 * teclado (abaixo); quem aponta com o mouse recebe o sublinhado da palavra,
	 * como o Grupo.
	 */
	.lym-menu-lateral > .lym-cabecalho__perfil.lym-cabecalho__perfil {
		min-height: 44px;
		width: auto;
		flex: 0 1 auto;
		padding: 0 0.25rem;
	}

	/*
	 * O botão do índice perde a margem de baixo: na barra ele está ao lado dos
	 * outros itens, e não acima de um painel.
	 */
	/*
	 * O botão perde a margem de baixo (na barra ele está ao lado dos outros, e
	 * não acima de um painel) e ganha recheio menor para caber — mas a ALTURA
	 * clicável continua sendo 44px, que é a medida do dedo. Medido: sem o
	 * `min-height` ele fica com 22px (desde a 1.100.0, sem o recheio de cima e de
	 * baixo, que morava no contorno), o alvo mais difícil da barra.
	 */
	.lym-menu-lateral .lym-indice .lym-indice__botao {
		min-height: 44px;
		margin: 0;
		padding: 0 0.25rem;
		border-color: transparent;
		background: none;
	}

	/*
	 * A resposta ao gesto de quem aponta: o sublinhado da palavra, o mesmo do
	 * Grupo e do perfil. A regra de cima vence o `:hover` do bloco base por
	 * ORDEM (o peso empata), e é por isso que a pista volta aqui, com peso a mais.
	 */
	.lym-menu-lateral .lym-indice .lym-indice__botao:hover {
		text-decoration: underline;
		text-decoration-thickness: 1px;
		text-underline-offset: 0.18em;
	}

	/*
	 * **O anel de foco é a borda que ficou transparente**, e só para quem chega
	 * pelo teclado (`:focus-visible`), pela razão escrita no do perfil.
	 */
	.lym-menu-lateral .lym-indice .lym-indice__botao:focus-visible {
		border-color: var( --lym-destaque, currentColor );
	}

	/*
	 * **Na barra o perfil é a foto e a palavra "Perfil", e o nome sai** (pedido do
	 * Flávio em 18/09/2026). Isso desfaz a decisão de 15/09 de manter o nome no
	 * celular "porque foto sozinha não diz de quem é a conta": a razão continua
	 * de pé, e o Flávio escolheu o espaço. A palavra fica — ela é o que diz que
	 * dá para clicar, e é o nome do link para quem usa leitor de tela. No
	 * computador, na coluna, o nome continua.
	 */
	.lym-menu-lateral .lym-cabecalho__eu {
		display: none;
	}

	/*
	 * **"Perfil" é o único texto do link na barra, e por isso sai sem opacidade.**
	 * O `0.85` da base existia porque ali a palavra é a instrução ao lado do nome;
	 * sem o nome, ela é o nome do link — e a regra do menu vale: palavra de menu
	 * nunca é apagada por opacidade. Medido pela revisão da 1.100.0 num tema claro
	 * com texto `#767676` (que passa sozinho, 4,54:1): "Perfil" caía para 3,41:1
	 * ao lado de "Notificações" com 4,54.
	 */
	.lym-menu-lateral .lym-cabecalho__acao {
		opacity: 1;
	}

	/*
	 * **Empilhada, a palavra só ganha reticências se a caixa dela tiver TETO.**
	 * Com o item em coluna e centralizado, a caixa da palavra tem a largura do
	 * texto, e o `overflow` dela nunca age: quando o item encolhe (a marca
	 * `--apertada`, ou a barra das aulas num telefone estreito), a palavra sai
	 * pelos dois lados e passa por cima da vizinha. Medido pela revisão da
	 * 1.100.0: com a letra da raiz em 20px, a 360px, "Perfil" e "Capítulos" se
	 * sobrepunham em 3,3px.
	 */
	.lym-menu-lateral .lym-cabecalho__texto,
	.lym-menu-lateral .lym-menu-lateral__texto,
	.lym-menu-lateral .lym-indice__abrir,
	.lym-menu-lateral .lym-indice__fechar {
		max-width: 100%;
	}

	.lym-menu-lateral .lym-indice__abrir,
	.lym-menu-lateral .lym-indice__fechar {
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
	}

	/*
	 * **A foto da barra é 20% menor** (pedido do Flávio em 18/09/2026): 2,1 →
	 * 1,68rem aqui e 1,8 → 1,44rem no telefone. O tamanho mora numa variável
	 * porque ele é também a ALTURA do lugar de cada desenho da barra (abaixo).
	 */
	.lym-menu-lateral {
		--lym-barra-foto: 1.68rem;
	}

	.lym-menu-lateral .lym-cabecalho__foto.lym-cabecalho__foto {
		width: var( --lym-barra-foto );
		height: var( --lym-barra-foto );
		max-width: var( --lym-barra-foto );
	}

	/*
	 * **As palavras têm o MESMO tamanho.** O `font-size` da barra não alcança
	 * duas delas — o botão do perfil e o do índice declaram 0.92rem por conta
	 * própria, e venciam —, e na tela a palavra do índice saía maior que
	 * "Grupo" e "Notificações". Pedido do Flávio, que viu a diferença antes de eu
	 * medir. O Ordenar da página do grupo entra na lista quando sobe para cá — e
	 * só a PALAVRA dele (o `summary`): escrito no `<details>` inteiro, o tamanho
	 * da barra descia também para a lista de ordens, que saía com 11,5px no
	 * telefone, menor que as mensagens embaixo dela (achado da revisão da
	 * 1.100.0, medido).
	 */
	.lym-menu-lateral .lym-cabecalho__acao,
	.lym-menu-lateral .lym-sino__texto,
	.lym-menu-lateral .lym-menu-lateral__texto,
	.lym-menu-lateral .lym-indice .lym-indice__botao,
	.lym-menu-lateral .lym-conversa__ordem-botao.lym-conversa__ordem-botao {
		font-size: 0.8rem;
	}

	/*
	 * **No tablet e no celular da página do grupo, o número e o Ordenar moram na
	 * barra do menu** (pedido do Flávio em 18/09/2026: uma fileira só com o número,
	 * o Ordenar, o perfil, os conteúdos e as notificações). Quem os leva é o script
	 * (`arrumarCabeca()` em publico.js); ESTA regra é a outra metade: no lugar de
	 * origem, dentro da conversa, a cabeça fica escondida.
	 *
	 * **Sem JavaScript eles simplesmente não aparecem**, e é decisão do Flávio: "se
	 * isso acontecer vai ficar tão estranho" — o número e o botão soltos acima da
	 * lista, embaixo de uma barra que tem os outros quatro. O preço está aceito: sem
	 * script, no tablet e no celular, não há como trocar a ordem. Não é preciso
	 * detectar o script: a regra casa com a cabeça DENTRO da conversa, e o script a
	 * tira de lá.
	 *
	 * **O recorte é o MESMO que o script pergunta**: a moldura do grupo COM menu
	 * (`lym-tela--sem-indice` é a moldura sem ele) e a mesma largura da barra. Com
	 * um recorte maior que o do script, a cabeça sumiria num lugar de onde ninguém
	 * a tira. A conversa de suporte não tem moldura nem menu, e lá nada muda.
	 */
	.lym-tela--papo:not( .lym-tela--sem-indice ) .lym-conversa__topo > .lym-conversa__cabeca--papo {
		display: none;
	}

	/*
	 * **A barra da página do grupo leva o número e o Ordenar**, nesta ordem, antes
	 * do perfil (pedido do Flávio em 18/09/2026, com rascunho). Quem os traz é o
	 * script, e a marca `--papo` é dele: ela só existe com a cabeça aqui dentro.
	 *
	 * - **No tablet também a palavra desce para baixo do desenho**, como no
	 *   rascunho ("versão mobile e tablet"). A barra das aulas fica como estava
	 *   — foi o que o Flávio pediu para ela —, e por isso a regra é da barra que
	 *   tem a cabeça, e não de toda barra. Custa pouca altura, porque todo item
	 *   já tem 44px de alvo: no telefone a pilha cabe nisso, e no tablet a foto de
	 *   1,68rem mais a palavra dão 47px (medido no Chrome).
	 * - **"comentários" nunca é cortado.** Sem espaço, a palavra desce para
	 *   baixo do número (`min-width: auto` e a quebra só no espaço), e o número
	 *   fica inteiro — "1.880" não tem onde quebrar. Os outros itens NÃO
	 *   encolhem enquanto o número ainda pode descer a palavra: com todos
	 *   encolhendo juntos, o flex reparte o aperto, e medido no Chrome, de 350 a
	 *   380px, "Notificações" saía cortada com reticências ao lado de um número
	 *   que ainda cabia em duas linhas. Se nem com a palavra embaixo couber
	 *   (abaixo de uns 345px, medido com a barra de verdade), o script põe a
	 *   marca `--apertada`, e aí os outros voltam a encolher, como a barra
	 *   sempre fez.
	 * - **A cabeça deixa de ser a âncora da lista de ordens** (`position:
	 *   static`): quem ancora é o menu, como no painel do sino. Ancorada na
	 *   cabeça, a lista teria a largura de dois itens da barra.
	 */
	.lym-menu-lateral > .lym-conversa__cabeca--papo {
		position: static;
		flex: 0 1 auto;
		min-width: auto;
		align-items: center;
		gap: inherit;
	}

	.lym-menu-lateral > .lym-conversa__cabeca--papo .lym-conversa__titulo.lym-conversa__titulo {
		min-width: auto;
		margin: 0;
		overflow-wrap: normal;
		word-break: normal;
		line-height: 1.2;
	}

	.lym-menu-lateral.lym-menu-lateral--papo > :not( .lym-conversa__cabeca--papo ) {
		flex-shrink: 0;
	}

	.lym-menu-lateral--papo.lym-menu-lateral--apertada > :not( .lym-conversa__cabeca--papo ) {
		flex-shrink: 1;
	}

	.lym-menu-lateral--papo > .lym-cabecalho__perfil.lym-cabecalho__perfil,
	.lym-menu-lateral--papo .lym-sino,
	.lym-menu-lateral--papo .lym-indice .lym-indice__botao,
	.lym-menu-lateral--papo .lym-conversa__ordem-botao.lym-conversa__ordem-botao {
		flex-direction: column;
		align-items: center;
		gap: 0.15rem;
		text-align: center;
	}

	/*
	 * **Com a palavra embaixo, todo desenho ocupa a altura da FOTO**, e as palavras
	 * ficam na mesma linha. Os desenhos têm 20px e a foto não (1,68rem aqui,
	 * 1,44rem no telefone); o Ordenar tinha 15px. Centralizados na altura da
	 * barra, cada pilha descia a palavra de um jeito — medido no Chrome, a 360px
	 * "Perfil" saía 7px abaixo de "Ordenar". A margem completa o lugar do desenho
	 * até a altura da foto; o do Ordenar cresce de 15 para 20px, o tamanho dos
	 * outros, e nenhum outro muda.
	 */
	.lym-menu-lateral--papo .lym-sino__icone,
	.lym-menu-lateral--papo .lym-indice__icone,
	.lym-menu-lateral--papo .lym-conversa__ordem-icone {
		width: 20px;
		height: 20px;
		margin: calc( ( var( --lym-barra-foto ) - 20px ) / 2 ) 0;
	}
}

/*
 * Na barra, a palavra do sino FICA — o Flávio pediu os quatro itens escritos.
 * A regra de 560px a esconde na faixa do alto, onde a foto e o nome ao lado dão
 * o contexto; aqui ao lado há outros dois itens escritos, e um ícone mudo no
 * meio deles lê como peça quebrada.
 */
@media ( max-width: 560px ) {
	.lym-menu-lateral {
		gap: 0.35rem;
		font-size: 0.72rem;
	}

	/*
	 * **Aqui a palavra desce para baixo do ícone, em vez de ser cortada.**
	 * Pedido do Flávio depois de ver, num telefone, "ver p...", "conte..." e
	 * "gru...": cortar a palavra economiza o mesmo espaço que empilhá-la e
	 * custa o sentido dela. Empilhados, os quatro itens cabem inteiros.
	 *
	 * **E centralizado**: o sino já descia a palavra sozinho (o link quebra a
	 * linha), mas o ícone ficava encostado à esquerda dela, como se fosse de
	 * outra peça.
	 */
	.lym-menu-lateral > .lym-cabecalho__perfil.lym-cabecalho__perfil,
	.lym-menu-lateral .lym-sino,
	.lym-menu-lateral .lym-menu-lateral__item,
	.lym-menu-lateral .lym-indice .lym-indice__botao {
		flex-direction: column;
		align-items: center;
		gap: 0.15rem;
		text-align: center;
	}

	/*
	 * Sem o contorno (acima, na faixa do tablet), o recheio de lado só separava a
	 * palavra de uma borda que não aparece mais: sobra o mínimo que afasta uma
	 * palavra da outra, e a largura volta para a fileira.
	 */
	.lym-menu-lateral > .lym-cabecalho__perfil.lym-cabecalho__perfil,
	.lym-menu-lateral .lym-indice .lym-indice__botao {
		padding: 0 0.2rem;
	}

	.lym-menu-lateral .lym-cabecalho__acao,
	.lym-menu-lateral .lym-sino__texto,
	.lym-menu-lateral .lym-menu-lateral__texto,
	.lym-menu-lateral .lym-indice .lym-indice__botao,
	.lym-menu-lateral .lym-conversa__ordem-botao.lym-conversa__ordem-botao {
		font-size: 0.72rem;
	}

	.lym-menu-lateral .lym-sino__texto {
		position: static;
		width: auto;
		height: auto;
		overflow: hidden;
		clip-path: none;
		text-overflow: ellipsis;
	}

	/* A foto do telefone: 20% menor que antes (1,8 → 1,44rem), pela variável da barra. */
	.lym-menu-lateral {
		--lym-barra-foto: 1.44rem;
	}

	/* E aqui toda barra tem a palavra embaixo: o lugar de cada desenho, pela mesma razão. */
	.lym-menu-lateral .lym-sino__icone,
	.lym-menu-lateral .lym-menu-lateral__icone,
	.lym-menu-lateral .lym-indice__icone,
	.lym-menu-lateral .lym-conversa__ordem-icone {
		width: 20px;
		height: 20px;
		margin: calc( ( var( --lym-barra-foto ) - 20px ) / 2 ) 0;
	}
}

/* As telas de conta: entrar, criar senha, minha conta. */

/*
 * A conta, que NÃO é um cartão.
 *
 * Ela usava a mesma `.lym-forma` de Entrar e Esqueci a senha — 26rem, com borda
 * e fundo — e ali o cartão está certo: são dois campos e um botão, e a moldura
 * ajuda a pessoa a achar onde digitar numa página que ela não conhece.
 *
 * Aqui são sete campos, e o mesmo cartão virava uma coluna comprida no meio de
 * uma tela vazia, com cara de janelinha de aviso.
 */
/*
 * **No celular o respiro encolhe.** Nenhuma media query de largura alcançava as
 * telas curtas, então o cartão gastava no celular o mesmo respiro que gasta no
 * computador — onde ele é barato. Numa tela de 390px, 2rem de cada lado são 64
 * dos 390: um sexto da largura, devolvido em linha de texto.
 *
 * E a Minha conta dobrava a calha: o modelo já dá o respiro lateral, e ela dava
 * o dela por cima.
 */
.lym-conta {
	max-width: 58rem;
	margin: 0 auto;
	padding: 0 1.25rem 3rem;
}

.lym-conta__voltar {
	margin: 0 0 0.35rem;
	font-size: 0.92rem;
}

/*
 * **O "voltar" da conta MANTÉM o sublinhado**, pela mesma razão do da página do
 * produto: sem a cor, um `text-decoration: none` aqui deixaria a peça sem
 * nenhuma pista de que ela responde ao clique. E ela é a saída da tela — a
 * primeira coisa que alguém procura quando terminou de mexer no perfil.
 *
 * A regra fazia sentido quando o link era pintado, e passou a apagar a única
 * pista que sobrou. Achada pelo vigia que varre exatamente isso.
 */
.lym-conta__voltar a {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/*
 * O título encosta no que vem antes de propósito: o espaço em branco acima dele
 * é o que empurrava os campos para fora da primeira dobra.
 */
.lym-conta__titulo {
	margin: 0 0 1.5rem;
	font-size: 1.7rem;
	line-height: 1.2;
}

/*
 * **Duas colunas no computador, uma no resto.** É `auto-fit` com um mínimo, e
 * não uma media query: numa coluna estreita do construtor de páginas — que é
 * onde o cliente pode colar o atalho — a conta cai para uma coluna sozinha, sem
 * precisar adivinhar a largura da tela.
 */
.lym-conta__colunas {
	display: grid;
	/*
	 * **O `min()` é obrigatório, e é o mesmo conserto que a grade do checkout
	 * já tem.** `minmax( 20rem, … )` é um piso de 320px que NÃO encolhe: numa
	 * caixa menor a pista fica com os 320px e o excedente sai para fora.
	 *
	 * A conta a 360px: a página tira 40px de calha e a caixa da conta tira
	 * outros 40 — sobram 280 para uma pista de 320. Os campos encostavam na
	 * borda direita da tela enquanto o título, logo acima, parava 40px antes.
	 * Abaixo de 360px a página inteira ganhava rolagem lateral, e aí some texto
	 * que não tem nada a ver com o formulário.
	 */
	grid-template-columns: repeat( auto-fit, minmax( min( 20rem, 100% ), 1fr ) );
	gap: 2rem;
	align-items: start;
}

/*
 * **O campo de arquivo atravessava para a coluna da senha.**
 *
 * `min-width: 0` na coluna já existia, e não bastava: ele deixa a COLUNA
 * encolher, e o que estourava era o campo dentro dela. O `input[type="file"]`
 * tem largura própria — o navegador desenha o botão "Escolher arquivo" mais o
 * nome do arquivo numa peça que não quebra em lugar nenhum — e simplesmente
 * transbordava por cima do campo de senha ao lado.
 *
 * Quem conserta é o teto no próprio campo, e não na coluna. É a mesma família
 * do defeito que este projeto já registra sobre peça que estoura a largura: o
 * sintoma aparece longe da causa.
 */
.lym-conta__bloco input,
.lym-conta__bloco textarea {
	max-width: 100%;
}

/*
 * E o campo ganha linha própria: mesmo cabendo, ao lado da foto numa coluna
 * estreita sobra pouco para o nome do arquivo que a pessoa escolheu.
 */
.lym-conta__foto input[type="file"] {
	display: block;
	width: 100%;
	max-width: 100%;
	margin-top: 0.35rem;
}

/* ==========================================================================
 * O nome do arquivo escolhido, numa linha nossa.
 *
 * **O navegador desenha o botão e o nome como UMA peça só**, lado a lado, e
 * numa coluna estreita ele corta o nome no meio com reticências. Não dá para
 * mexer: aquele texto é do controle, não do documento — nenhum seletor o
 * alcança.
 *
 * A saída é apagar o texto nativo pintando o controle de transparente, e
 * repintar só o botão. O nome vai para a linha de baixo, onde há a largura
 * inteira e onde ele pode quebrar.
 *
 * **Quem liga isso é o script**, pela classe no invólucro: sem JavaScript o
 * texto nativo continua ali, cortado mas presente. Errar para o lado de mostrar
 * é o barato — apagar sem repor deixaria a pessoa sem saber o que escolheu.
 * ========================================================================== */

/*
 * A classe fica no envoltório imediato do campo — que é o `<span>` da linha, e
 * não o `<p class="lym-conta__foto">`. O nome dela diz isso: ela é do campo de
 * arquivo, e serve para qualquer um deles no dia em que houver um segundo.
 *
 * **É `font-size`, e não `color`, e a primeira tentativa apagou o botão.**
 *
 * Pintar o campo de `transparent` some com o nome do arquivo — e some com o
 * rótulo do botão junto, porque o pseudoelemento HERDA a cor do campo. Repor
 * com `color: inherit` não conserta: `inherit` é justamente o transparente.
 * Repor com uma cor concreta também não serve — o plugin não sabe a cor de
 * texto do tema, e essa é a razão registrada de ele não escolher cores.
 *
 * `font-size: 0` esconde o nome pelo mesmo caminho e deixa o botão intacto com
 * um tamanho próprio, que é medida e não cor: o plugin pode declarar sem saber
 * nada do tema.
 */
.lym-arquivo--js input[type="file"] {
	font-size: 0;
}

.lym-arquivo--js input[type="file"]::file-selector-button {
	font-size: 0.95rem;
}

/* O WebKit antigo tem o nome próprio para o mesmo pseudoelemento. */
.lym-arquivo--js input[type="file"]::-webkit-file-upload-button {
	font-size: 0.95rem;
}

.lym-conta__arquivo {
	display: block;
	margin: 0.35rem 0 0;
	font-size: 0.85rem;

	/*
	 * Nome de arquivo é uma palavra só que pode não ter espaço nenhum — a mesma
	 * armadilha do e-mail, e o mesmo remédio.
	 */
	overflow-wrap: anywhere;
}

.lym-conta__arquivo:empty {
	display: none;
}

.lym-conta__bloco {
	min-width: 0;
}

.lym-conta__secao {
	margin: 0 0 1rem;
	font-size: 1.05rem;
	opacity: 0.75;
}

.lym-conta__bloco p {
	margin: 0 0 1.1rem;
}

.lym-conta__bloco label {
	display: block;
	margin-bottom: 0.3rem;
	font-size: 0.92rem;
}

/*
 * **`font: inherit` porque sem ele o campo sai na letra do NAVEGADOR.** Medido em
 * Chrome sem janela com esta folha: os cinco campos de Minha conta saíam em
 * 13,3333px, contra os 16px do campo de nome da tela de criar a senha, que já
 * declarava `font: inherit`. Não era escolha — era a regra daqui só falar de
 * largura. E abaixo de 16px o Safari do iPhone amplia a página inteira ao tocar
 * no campo, que é o mesmo limiar que a caixa de escrever já respeita.
 *
 * **`tel` e `date` entram na lista**, senão o telefone e a data de nascimento
 * ficam fora da LARGURA e da TIPOGRAFIA e saem estreitos, com a letra do
 * navegador, ao lado de irmãos que ocupam a linha inteira. A moldura não entra
 * nesta conta: nesta tela ninguém declara borda nem fundo de campo, e todos usam
 * a do navegador — quem faz isso é a tela de criar a senha, com `.lym-forma`.
 *
 * A lista é por etiqueta, e não `input` seco, porque o `hidden` não pode receber
 * `width: 100%` e porque o campo de arquivo tem regra própria, logo acima
 * (`.lym-conta__foto input[type="file"]`), que lhe dá linha inteira por outro
 * motivo.
 */
.lym-conta__bloco input[type="text"],
.lym-conta__bloco input[type="email"],
.lym-conta__bloco input[type="tel"],
.lym-conta__bloco input[type="date"],
.lym-conta__bloco input[type="password"] {
	width: 100%;
	max-width: 100%;
	box-sizing: border-box;
	font: inherit;
}

.lym-conta__foto {
	display: flex;
	gap: 1rem;
	align-items: flex-start;
}

.lym-conta__foto > span {
	min-width: 0;
}

.lym-conta__salvar {
	margin: 1.5rem 0 0;
}

/*
 * **"Sair" fica sozinho, longe de tudo.** Ele dividia a linha com "Voltar para
 * meus produtos", e as duas coisas não têm nada a ver uma com a outra: quase
 * ninguém quer sair de uma área de membros — quer voltar para o conteúdo. Lado a
 * lado, um clique errado desloga a pessoa, que então precisa lembrar a senha.
 */
.lym-conta__sair {
	margin: 3rem 0 0;
	padding-top: 1.25rem;
	border-top: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	font-size: 0.9rem;
}

/*
 * Sem a cor dos outros links, e sem parecer um botão: sair não é uma das coisas
 * que a pessoa veio fazer aqui.
 */
.lym-conta__sair-link.lym-conta__sair-link {
	color: inherit;

	/*
	 * Frase clicável com classe do plugin: o bloco que sublinha os links do
	 * invólucro a exclui, e sem regra própria ela ficaria sem nenhuma pista.
	 */
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
	opacity: 0.7;
}

.lym-forma {
	max-width: 26rem;
	margin: 0 auto;
	padding: 2rem;
	border: 1px solid rgba( 128, 128, 128, 0.25 );
	border-radius: 14px;
	background: rgba( 128, 128, 128, 0.08 );
}

/*
 * **Esta media query estava MORTA, e a causa é a ordem.** Ela vivia antes
 * das regras base de `.lym-conta` e `.lym-forma`, com a mesma
 * especificidade — e num empate vence quem vem depois. O respiro do celular
 * nunca chegava: a caixa continuava com 2rem de calha dentro de uma tela de
 * 360px, e a conta continuava com a calha dupla que empurrava a grade dos
 * campos para fora.
 */
@media ( max-width: 600px ) {
	.lym-forma {
		padding: 1.25rem;
	}

	.lym-conta {
		padding-left: 0;
		padding-right: 0;
	}
}

.lym-forma__titulo {
	margin: 0 0 1.25rem;
	font-size: 1.5rem;
	line-height: 1.2;
}

.lym-forma__secao {
	margin: 2rem 0 1rem;
	padding-top: 1.25rem;
	border-top: 1px solid rgba( 128, 128, 128, 0.25 );
	font-size: 1.1rem;
}

/*
 * **O e-mail é uma palavra só que não quebra em lugar nenhum.**
 *
 * Nem o "@" nem o "." criam oportunidade de quebra, pela regra de quebra de
 * linha do Unicode. Um endereço de 47 caracteres mede 376px numa caixa de 324px
 * a 390px de tela: 52px para fora, e a página inteira ganha rolagem lateral.
 *
 * O CLAUDE.md já registra essa armadilha para o nome do membro; ela vale para
 * toda tela que imprime o endereço, e são três — descadastrar, pagamento e as
 * telas de conta. `anywhere` e não `break-word` porque só ele quebra quando não
 * há NENHUMA oportunidade na linha inteira.
 */
/*
 * **`width: 100%` sem `border-box` quer dizer "100% MAIS o padding e a borda".**
 *
 * O checkout e a Minha conta já declaravam; a tela de entrar, a de criar senha
 * e a de esqueci não. Um `input` de largura total dentro do cartão passava da
 * borda dele — e o navegador só não deixa isso virar rolagem lateral porque o
 * cartão tem `overflow` visível, o que empurra o problema em vez de resolver.
 */
.lym-forma,
.lym-forma * {
	box-sizing: border-box;
}

/*
 * **E o painel do índice: o `85vw` não estava querendo dizer 85%.** Ele mede a
 * caixa de conteúdo, então o `padding` de 1,25rem de cada lado saía por fora —
 * o painel cobria 90,8% de uma tela de 390px e sobravam 36px de véu, quando o
 * desenho pedia 15%. E o véu é o gesto que todo mundo tenta primeiro para
 * fechar: um véu de 36px é um alvo que ninguém acerta.
 */
.lym-menu {
	box-sizing: border-box;
}

/*
 * A ressalva do descadastro: ela diz o que NÃO para de chegar — confirmação de
 * compra, link de senha, produto liberado. É a frase que impede a pessoa de
 * achar que vai perder acesso ao que comprou, e estava sem regra nenhuma, com o
 * mesmo peso do texto principal.
 */
.lym-descadastro__ressalva {
	font-size: 0.9rem;
}

.lym-forma p,
.lym-forma__texto,
.lym-pagamento__recado,
.lym-descadastro p {
	overflow-wrap: anywhere;
}

.lym-forma__texto {
	margin: 0 0 1.25rem;
	font-size: 0.9rem;
	opacity: 0.8;
}

.lym-forma p {
	margin: 0 0 1.1rem;
}

.lym-forma label {
	display: block;
	margin: 0 0 0.35rem;
	font-size: 0.85rem;
	font-weight: 600;
}

/*
 * O campo herda a tipografia do tema e desenha a borda em cinza translúcido,
 * como o resto. Fundo transparente de propósito: fundo branco fixo some o texto
 * num tema escuro.
 */
/*
 * **`tel` e `date` estão na lista pela mesma razão dos outros três.** Eles
 * nasceram na tela de criar a senha depois desta regra e ninguém os acrescentou:
 * medido em Chrome sem janela a 390px, o telefone saía com 177px e 13,3333px e a
 * data com 102px, ao lado de um campo de nome com 374px e 16px. O tamanho é o que
 * dói mais que o desenho — abaixo de 16px o Safari do iPhone amplia a página
 * inteira, e esta é a tela por onde todo comprador passa.
 */
.lym-forma input[type="text"],
.lym-forma input[type="email"],
.lym-forma input[type="tel"],
.lym-forma input[type="date"],
.lym-forma input[type="password"] {
	width: 100%;
	padding: 0.7rem 0.85rem;
	border: 1px solid rgba( 128, 128, 128, 0.45 );
	border-radius: 8px;
	background: rgba( 128, 128, 128, 0.08 );
	color: inherit;
	font: inherit;
}

.lym-forma input:focus {
	border-color: currentColor;
	outline: none;
}

.lym-forma input[disabled] {
	opacity: 0.6;
}

/*
 * **A caixa que segura o botão de mostrar a senha.**
 *
 * O botão fica DENTRO do campo, à direita, e por isso o campo ganha recheio
 * naquele lado: sem ele, a última letra de uma senha longa passa por baixo da
 * palavra "Esconder".
 *
 * A altura vem de `top: 0; bottom: 0`, e não de um número: o campo cresce com
 * a tipografia do tema do cliente, e um botão de altura fixa ficaria menor que
 * ele em qualquer tema de letra grande — justamente onde o alvo de toque
 * precisa dos 44px.
 */
.lym-forma__senha {
	position: relative;
	display: block;
}

/*
 * **O recuo abre espaço para o botão, e ele encolheu junto com o botão.** Eram
 * 5,5rem para caber a palavra "Mostrar"; hoje é um olho num alvo quadrado de
 * 44px, e o resto era buraco no meio do campo — num celular, sete letras de
 * espaço que a senha não podia ocupar.
 */
.lym-forma__senha input[type="password"],
.lym-forma__senha input[type="text"] {
	padding-right: 3.2rem;
}

/*
 * **Sem opacidade.** A regra da casa é que opacidade não enfraquece cor: ela
 * TROCA a cor pela mistura com o fundo, e aqui o fundo é a página do cliente. O
 * traço do olho é `currentColor`: ele tem o contraste do próprio texto, e não há
 * hexadecimal nosso a medir contra um fundo que não conhecemos.
 *
 * **O alvo é quadrado, e os 44px valem nos DOIS lados.** A regra da casa fala de
 * ALTURA porque o erro comum é o alvo largo e baixo; aqui o desenho tem 20px, e
 * sem a largura mínima o dedo teria 20px de alvo dentro de um campo de texto —
 * errar significa pôr o cursor no meio da senha.
 *
 * **O sublinhado saiu junto com a palavra.** Ele era a pista de que aquilo se
 * clica; num ícone a pista é o próprio desenho mais a resposta ao gesto, e
 * sublinhar um SVG não desenha nada.
 *
 * Classe dobrada porque o tema do cliente pinta os botões dele.
 */
.lym-forma__ver,
.lym-forma__ver.lym-forma__ver {
	position: absolute;
	right: 0.3rem;
	top: 0;
	bottom: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	min-width: 44px;
	min-height: 44px;
	padding: 0;
	border: 0;
	border-radius: 8px;
	background: none;
	color: inherit;
	cursor: pointer;
}

/*
 * **O desenho é `block`** — um SVG em linha carrega a folga do que seria a
 * descida da letra, e o ícone sai um pixel acima do centro do campo.
 */
.lym-forma__ver-icone {
	display: block;
	width: 20px;
	height: 20px;
}

/*
 * **O corte do olho mora dentro do mesmo desenho**, e quem o revela é o estado
 * que o script já escrevia. Dois ícones alternados custariam duas cópias do
 * desenho e um segundo lugar para o script mexer.
 *
 * `aria-pressed` é a fonte única: o que o leitor de tela anuncia e o que a tela
 * mostra saem do MESMO atributo, então eles não têm como discordar.
 */
.lym-forma__ver-corte {
	display: none;
}

.lym-forma__ver[aria-pressed="true"] .lym-forma__ver-corte {
	display: block;
}

.lym-forma__ver:focus-visible {
	outline: 2px solid var( --lym-link );
	outline-offset: -2px;
}

.lym-forma__dica {
	display: block;
	margin: 0.35rem 0 0;
	font-size: 0.78rem;
	opacity: 0.7;
}

.lym-forma__lembrar {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	font-weight: 400;
	font-size: 0.9rem;
}

.lym-forma__lembrar input {
	width: auto;
}

.lym-forma button.lym-botao {
	width: 100%;
	cursor: pointer;
	font: inherit;
	font-weight: 700;
}

/*
 * **A saída fica no alto e à esquerda**, que é onde toda tela põe a saída. No
 * rodapé ela ficava depois de dois links de ajuda, no lugar onde ninguém
 * desiste — e esta é uma página, não uma caixa que se fecha no X.
 *
 * Ela NÃO herda o apagado de `__ajuda`: é a única saída da tela para quem
 * mudou de ideia, e apagar a única saída é o defeito que a caixa de estado
 * vazio já pagou uma vez.
 */
.lym-forma__voltar {
	margin: 0 0 1rem;
	font-size: 0.88rem;
	text-align: left;
}

.lym-forma__ajuda {
	margin: 1.5rem 0 0;
	font-size: 0.88rem;
	text-align: center;
	opacity: 0.8;
}

/*
 * O recado tem borda na lateral em vez de fundo colorido: vermelho de erro
 * sobre um tema escuro vira uma mancha, e sobre um tema claro grita.
 *
 * **A borda é AZUL, e esse é o quarto papel da paleta.** O recado é a única
 * peça das telas do comprador que não é ação, nem progresso, nem alerta: é
 * contexto — "você está vendo como administrador", "confira antes de enviar".
 * Azul é o que a interface inteira usa para dizer isso, e aqui ele aparece uma
 * vez por tela, no máximo.
 */
.lym-recado {
	margin: 0 0 1.25rem;
	padding: 0.75rem 1rem;
	border-left: 3px solid var( --lym-info, currentColor );
	background: rgba( 128, 128, 128, 0.12 );
	font-size: 0.9rem;
}

/*
 * **O recado de ERRO troca o azul pelo vermelho de alerta**, e usa o token em
 * vez do literal que estava aqui: `#d63638` é a paleta do painel do WordPress,
 * e ela não tem par medido — sobre um tema escuro esse tom fica em 3,3:1.
 *
 * **A cadeia tem um degrau a mais que as outras, e ele é a razão desta linha
 * existir.** `--lym-alerta` é configurável, então a folha não pode declará-la —
 * declarar mataria o tom medido. Sem JavaScript a cadeia caía em
 * `currentColor`, e aí o recado de ERRO ficava com a cor do texto enquanto o
 * recado NEUTRO ao lado dele mantinha a borda azul: o aviso de problema saía
 * menos marcado que o aviso de contexto.
 *
 * O último degrau é a cor de AÇÃO, que a folha declara — vermelho de verdade,
 * medido, e disponível sem script. Não é a mesma cor do alerta, e é da mesma
 * família: para o caso em que nada mais existe, é a resposta certa.
 */
.lym-recado--erro {
	border-left-color: var(
		--lym-alerta,
		var( --lym-alerta-medido, var( --lym-link, #c40812 ) )
	);
}

/*
 * **A caixa dos desvios.** Ela tinha dezenove chamadores e nenhuma linha de
 * estilo — era o que o membro via ao ser recusado na renovação, no checkout e
 * na tela de pagamento, e saía como um parágrafo solto no meio da página.
 *
 * Mesmo desenho do recado, de propósito: as duas dizem a mesma coisa em telas
 * diferentes, e dois desenhos para a mesma função é como um deles envelhece.
 */
.lym-aviso {
	max-width: 34rem;
	margin: 2rem auto;
	padding: 1rem 1.25rem;
	border-left: 3px solid currentColor;
	background: rgba( 128, 128, 128, 0.12 );
}

.lym-aviso p {
	margin: 0;
}

/* ==========================================================================
 * O checkout.
 *
 * **Ele tinha dezenove classes e nenhuma linha de estilo.** Isso não era
 * neutralidade: era um formulário sem roupa, na única tela do plugin em que o
 * dinheiro acontece. A regra "nada de cor própria" nunca quis dizer "nenhum
 * desenho" — ela quer dizer que a COR vem do tema, e o LAYOUT vem daqui.
 *
 * Tudo abaixo herda a cor do texto e do fundo de quem instalou. A única cor
 * literal continua sendo a letra por cima do botão preenchido, pela razão de
 * sempre: ela precisa contrastar com a cor que o cliente escolheu, e nem o CSS
 * nem o plugin sabem calcular esse contraste.
 * ========================================================================== */

.lym-checkout {
	--lym-borda: rgba( 128, 128, 128, 0.25 );
	--lym-fundo: rgba( 128, 128, 128, 0.06 );
	--lym-raio: 12px;

	max-width: 32em;
	margin: 0 auto;
	/*
	 * O checkout mora dentro do construtor de páginas do cliente, e ali a
	 * largura é dele. `max-width` com `margin: auto` centra sem brigar: numa
	 * coluna estreita ele encolhe, numa larga ele não vira uma linha de texto
	 * de trinta centímetros — que é o que faz um formulário parecer amador.
	 */
	text-align: left;
}

.lym-checkout *,
.lym-checkout *::before,
.lym-checkout *::after {
	box-sizing: border-box;
}

/*
 * O recado de uma tentativa anterior. É a primeira coisa que a pessoa lê depois
 * de uma recusa, e por isso ele não pode parecer decoração — mas também não
 * pode ser vermelho, porque o vermelho do tema pode ser o fundo da página.
 * Borda grossa de um lado é o que grita sem depender de cor nenhuma.
 */
.lym-checkout__recado {
	margin: 0 0 1.25em;
	padding: 0.85em 1em;
	border: 1px solid var( --lym-borda );
	border-left-width: 4px;
	border-radius: var( --lym-raio );
	background: var( --lym-fundo );
	font-weight: 600;
}

.lym-checkout__form {
	margin: 0;
}

.lym-checkout__oferta {
	margin: 0 0 1.25em;
	font-size: 1.25em;
	font-weight: 700;
	line-height: 1.3;
}

.lym-checkout__linha {
	display: block;
	margin-top: 0.25em;
	font-size: 0.75em;
	font-weight: 400;
	opacity: 0.75;
}

/*
 * Cada campo é um bloco: rótulo em cima, campo embaixo, ajuda depois. Rótulo ao
 * lado economiza altura e cobra atenção — e quem preenche um checkout no
 * celular não tem atenção sobrando.
 */
.lym-checkout__campo {
	margin: 0 0 1em;
}

/*
 * O rótulo dos campos do cartão é um `<span>`, e não um `<label>` — ver a razão
 * na view. Ele precisa do mesmo desenho, senão os três campos do cartão saem
 * diferentes dos outros no mesmo formulário.
 */
.lym-checkout__rotulo {
	display: block;
}

.lym-checkout__campo label,
.lym-checkout__campo .lym-checkout__rotulo {
	display: block;
	margin-bottom: 0.35em;
	font-size: 0.9em;
	font-weight: 600;
}

.lym-checkout__campo input,
.lym-checkout__campo select {
	display: block;
	width: 100%;
	padding: 0.7em 0.85em;
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
	/*
	 * `transparent` e `inherit`, e não branco com preto: num tema escuro, um
	 * campo branco é um retângulo aceso no meio da página — e um campo com
	 * fundo branco e letra herdada clara fica ilegível, que é pior.
	 */
	background: transparent;
	color: inherit;
	/*
	 * 16px é o piso: abaixo disso o Safari do iPhone DÁ ZOOM ao focar o campo,
	 * e a pessoa perde de vista o resto do formulário no meio da digitação.
	 */
	font-size: max( 1rem, 16px );
	font-family: inherit;
	line-height: 1.4;
}

.lym-checkout__campo input:focus,
.lym-checkout__campo select:focus {
	outline: 2px solid currentColor;
	outline-offset: 1px;
}

.lym-checkout__ajuda {
	display: block;
	margin-top: 0.35em;
	font-size: 0.85em;
	opacity: 0.7;
}

/*
 * Os meios de pagamento. Cada um é uma faixa clicável inteira, e não um
 * pontinho de rádio de doze pixels ao lado de um texto: no celular, acertar o
 * pontinho é a diferença entre comprar e desistir.
 */
.lym-checkout__meios {
	margin: 0 0 1.25em;
	padding: 0;
	border: 0;
}

.lym-checkout__meios legend {
	margin-bottom: 0.5em;
	padding: 0;
	font-size: 0.9em;
	font-weight: 600;
}

/*
 * **Lado a lado, e não empilhados.** A lição é da página de renovação que o
 * Flávio desenhou à mão: empilhados, o segundo meio caía abaixo da dobra num
 * celular pequeno, e opção que não se vê não é opção.
 *
 * `auto-fit` com `minmax` põe dois por linha no celular e três no computador,
 * sem media query e sem depender de quantos meios a oferta tem — de um a
 * quatro, o arranjo se resolve sozinho. `minmax(0,...)` porque um texto longo
 * dentro de uma célula de grade a empurra para fora sem isso, e aí a linha
 * inteira estoura a largura.
 */
.lym-checkout__grade {
	display: grid;
	grid-template-columns: repeat( auto-fit, minmax( min( 9.5em, 100% ), 1fr ) );
	gap: 0.6em;
}

/*
 * Cada quadro é o rótulo inteiro, e a área clicável é ele todo — não um
 * pontinho de rádio de doze pixels ao lado de um texto. No celular, acertar o
 * pontinho é a diferença entre comprar e desistir.
 *
 * Em coluna e não em linha: com o nome e o preço lado a lado, o quadro precisa
 * de largura para os dois, e a grade não teria como caber dois por linha.
 */
.lym-checkout__meio {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 0.3em;
	min-width: 0;
	padding: 0.9em 0.85em;
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
	cursor: pointer;
}

/*
 * O escolhido ganha a borda de destaque e um fundo levíssimo. Sem isso, a
 * única marca de qual está escolhido é o pontinho — e no celular, com o dedo
 * em cima, ele fica escondido pela própria mão que acabou de tocá-lo.
 *
 * `:has()` não é exigido: o pontinho continua desenhado e continua dizendo a
 * verdade sozinho em navegador que não o entenda.
 */
.lym-checkout__meio:has( input:checked ) {
	border-color: var( --lym-destaque, currentColor );
	background: var( --lym-fundo );
}

.lym-checkout__meio:has( input:focus-visible ) {
	outline: 2px solid var( --lym-destaque, currentColor );
	outline-offset: 2px;
}

.lym-checkout__meio input {
	flex: 0 0 auto;
	margin: 0;
	width: 1.1em;
	height: 1.1em;
	accent-color: var( --lym-destaque, currentColor );
}

.lym-checkout__meio-nome {
	font-weight: 600;
	line-height: 1.2;
}

.lym-checkout__meio-valor {
	font-weight: 700;
	line-height: 1.2;
}

/*
 * A economia quebra em duas linhas quando precisa, e não vaza: numa célula
 * estreita, "economize R$ 149,00" é mais largo que o quadro.
 */
.lym-checkout__economia {
	display: block;
	font-size: 0.8em;
	font-weight: 400;
	line-height: 1.3;
	opacity: 0.75;
	overflow-wrap: break-word;
}

/*
 * **O resumo do topo: o que está sendo comprado e por quanto.** Ele não compete
 * com a manchete da página de vendas do cliente — é uma confirmação, e por isso
 * é discreto no tamanho e forte só no número.
 */
/*
 * O "voltar" do alto. Sem cor declarada: a cor de link do tema é a certa, e é a
 * mesma dos outros links da página.
 *
 * A borda em volta existe porque ele fica sozinho no topo, longe de qualquer
 * outro link — sublinhado solto naquela posição lê como texto, e não como algo
 * que se clica. E o alvo fica grande o bastante para o polegar.
 */
.lym-checkout__voltar-linha {
	margin: 0 0 1.2em;
}

.lym-checkout__voltar.lym-checkout__voltar {
	display: inline-flex;
	align-items: center;
	gap: 0.45em;
	padding: 0.5em 0.9em;
	border: 1px solid var( --lym-borda );
	border-radius: 2em;
	font-size: 0.9em;
	text-decoration: none;
}

.lym-checkout__voltar.lym-checkout__voltar:hover,
.lym-checkout__voltar.lym-checkout__voltar:focus {
	background: var( --lym-fundo );
	text-decoration: none;
}

/*
 * **No celular o resumo vem PRIMEIRO, e isso precisa de uma linha de CSS.**
 *
 * A coluna do resumo — o que está sendo comprado, por quanto, os adicionais, o
 * total e o botão — é a SEGUNDA no documento, porque no computador ela fica à
 * direita. Numa coluna só, a ordem visual passa a ser a do documento: a pessoa
 * preenchia nome, e-mail, telefone e CPF antes de ler o que estava comprando.
 *
 * O comentário da view afirmava o contrário com todas as letras desde que as
 * duas colunas nasceram. A intenção existia; a linha que a cumpria, não.
 *
 * `order` é seguro aqui porque só reordena dois irmãos diretos do mesmo flex —
 * a ordem de leitura por teclado e por leitor de tela continua sendo a do
 * documento, que é a certa: os dados vêm antes do botão que os envia.
 */
@media ( max-width: 899px ) {
	.lym-checkout__form {
		display: flex;
		flex-direction: column;

		/* As três caixas passaram a ser irmãs num flex: sem vão, elas encostam. */
		gap: 1.5em;
	}

	/*
	 * O resumo e os adicionais sobem; o total e o botão FICAM no fim.
	 *
	 * Antes era uma caixa só, e ela subia inteira: a primeira coisa acionável
	 * da tela virava o "Pagar", com nome, e-mail, CPF e a escolha do meio de
	 * pagamento abaixo dele, fora da dobra. A inversão existe pelo resumo, e
	 * levava o botão de carona.
	 */
	.lym-checkout__lado {
		order: -1;
	}

	.lym-checkout__fechar {
		order: 1;
	}
}

/*
 * **Duas colunas a partir de 900px, e uma só abaixo disso.**
 *
 * Numa tela de computador, uma coluna só de 32em deixa o botão muito abaixo da
 * dobra: a pessoa preenche quatro campos sem nunca ver quanto vai pagar nem
 * onde é que se conclui a compra, e precisa rolar para descobrir as duas
 * coisas. Em duas, o formulário inteiro cabe de uma vez — que é o pedido.
 *
 * A largura máxima cresce junto, senão as duas colunas ficariam de 16em cada e
 * o remédio seria pior.
 */
@media ( min-width: 900px ) {
	.lym-checkout {
		max-width: 58em;
	}

	.lym-checkout__form {
		display: grid;
		grid-template-columns: minmax( 0, 1.15fr ) minmax( 0, 1fr );
		gap: 2.5em;
		align-items: start;
	}

	/*
	 * **A colocação é explícita, e não pode ser automática.** São três blocos
	 * agora — campos, resumo e fechamento —, e o encaixe automático poria o
	 * resumo na primeira coluna. Os campos ocupam a coluna da esquerda nas duas
	 * fileiras; resumo e fechamento empilham na direita, que é o desenho de
	 * antes com a caixa partida em duas.
	 */
	.lym-checkout__dados {
		grid-column: 1;
		grid-row: 1 / span 2;
	}

	.lym-checkout__lado {
		grid-column: 2;
		grid-row: 1;
	}

	/*
	 * O fechamento acompanha a rolagem: em formulário longo — boleto, com seis
	 * campos de endereço — o total e o botão sairiam da tela enquanto a pessoa
	 * preenche, e ela voltaria a não saber quanto vai pagar.
	 */
	.lym-checkout__fechar {
		position: sticky;
		top: 1.5em;
		grid-column: 2;
		grid-row: 2;
	}
}

/*
 * As duas caixas da direita têm o mesmo desenho: eram uma só, e partir em duas
 * não pode virar duas aparências.
 */
.lym-checkout__fechar {
	padding: 1.4em;
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
	background: var( --lym-fundo );
}

/*
 * **O resumo do topo: o que está sendo comprado e por quanto.** Ele não compete
 * com a manchete da página de vendas do cliente — é uma confirmação, e por isso
 * é discreto no tamanho e forte só no número.
 */
.lym-checkout__lado {
	padding: 1.4em;
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
	background: var( --lym-fundo );
}

.lym-checkout__resumo {
	margin: 0 0 1.2em;
}

.lym-checkout__resumo-nome {
	margin: 0 0 0.25em;
	font-size: 1.05em;
	font-weight: 600;
	line-height: 1.3;
}

.lym-checkout__resumo-preco {
	margin: 0;
	font-size: 1.05em;
	line-height: 1.35;
}

.lym-checkout__resumo-preco strong {
	font-size: 1.3em;
	font-weight: 700;
}

.lym-checkout__resumo-nota {
	margin: 0.45em 0 0;
	font-size: 0.9em;
	line-height: 1.45;
	opacity: 0.75;
}
/*
 * O adicional: uma caixa que se distingue do resto do formulário, porque é uma
 * OFERTA no meio de um cadastro. Sem essa separação ela lê como mais um campo
 * obrigatório, e ninguém marca uma caixinha que parece burocracia.
 */
.lym-checkout__adicional {
	margin: 0 0 1.25em;
	padding: 1em;
	border: 1px dashed var( --lym-borda );
	border-radius: var( --lym-raio );
	background: var( --lym-fundo );
}

.lym-checkout__adicional label {
	display: flex;
	align-items: flex-start;
	gap: 0.65em;
	cursor: pointer;
	font-weight: 600;
}

.lym-checkout__adicional input {
	flex: 0 0 auto;
	margin-top: 0.2em;
	width: 1.1em;
	height: 1.1em;
	accent-color: var( --lym-destaque, currentColor );
}

/*
 * Os campos extras aparecem só para quem escolhe o meio que precisa deles — o
 * script os mostra. A borda os liga visualmente ao meio escolhido logo acima.
 */
.lym-checkout__extra {
	margin: 0 0 1.25em;
	padding: 1em;
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
}

.lym-checkout__extra legend {
	padding: 0 0.4em;
	font-size: 0.9em;
	font-weight: 600;
}

.lym-checkout__parcelas select {
	width: 100%;
}

/*
 * O botão. É o único elemento preenchido da tela, e é de propósito: numa tela
 * com dez campos, o que se procura é onde clicar para terminar.
 *
 * `--lym-destaque` é a cor que o cliente declara; sem ela, `currentColor` — que
 * herda o texto do tema e nunca fica invisível. A letra por cima é a única cor
 * literal do plugin, pela razão registrada no CLAUDE.md.
 */
/*
 * **O botão saía preto sobre preto, e a causa é uma armadilha do CSS que vale
 * anotar:** `background: currentColor` NÃO usa a cor do texto herdada da
 * página — usa a cor computada DO PRÓPRIO elemento. Como a linha seguinte
 * fixava `color: #111`, o fundo virava `#111` também. Um retângulo escuro sem
 * nada escrito, no lugar do único botão que faz este plugin ganhar dinheiro.
 *
 * O par agora é explícito e não se resolve sozinho a partir de si mesmo:
 * `--lym-botao-fundo` e `--lym-botao-texto`, com padrões que o script ajusta ao
 * tema do cliente (ele lê o fundo da página, como já faz no painel do índice).
 * Sem JavaScript, os padrões abaixo são um par que se enxerga em página clara e
 * em página escura, porque um deles é a cor do texto herdada — e essa o
 * navegador sabe que contrasta com o fundo, senão ninguém leria a página.
 */
/*
 * **Classe dobrada, e não `!important`.** O tema do cliente pinta os botões
 * dele com seletores de peso maior que uma classe só — e ele já provou vencer
 * nesta mesma tela: é a razão de `.lym-botao` estar dobrado no alto do arquivo.
 * Dobrar empata em especificidade e continua deixando o cliente mudar depois.
 */
.lym-checkout__botao,
.lym-checkout__botao.lym-checkout__botao {
	display: block;
	width: 100%;
	padding: 0.95em 1.25em;
	border: 2px solid var( --lym-botao-fundo, currentColor );
	border-radius: var( --lym-raio );
	background: var( --lym-botao-fundo, transparent );
	color: var( --lym-botao-texto, currentColor );
	font-size: max( 1.05rem, 16px );
	font-family: inherit;
	font-weight: 700;
	line-height: 1.2;
	cursor: pointer;
	text-align: center;
}
.lym-checkout__botao:hover,
.lym-checkout__botao:focus {
	opacity: 0.88;
}

/*
 * **Todos os estados são declarados, e não só o normal.** O tema do cliente
 * pinta botão em foco e em ação; sem estas linhas, o botão de pagar muda de cor
 * no clique e a pessoa acha que algo deu errado bem na hora de pagar.
 */
.lym-checkout__botao:active {
	opacity: 0.8;
}

.lym-checkout__botao[disabled] {
	cursor: progress;
	opacity: 0.6;
}

/*
 * **O total. Ele nunca teve regra nenhuma e saía como texto solto** — o número
 * que decide a compra, no mesmo peso de uma legenda.
 *
 * Sem cor própria, pela regra da casa: o destaque é o tamanho e o peso, que
 * funcionam em qualquer tema, claro ou escuro. Cor exigiria conhecer o fundo da
 * página do cliente.
 */
.lym-checkout__total {
	margin: 1.2em 0 0;
	font-size: 1.15em;
}

.lym-checkout__total strong {
	font-size: 1.25em;
	font-weight: 700;
}

/*
 * O de baixo encosta no botão e ganha um traço acima: ali ele fecha a conta do
 * formulário inteiro, e o traço é o que diz que a lista terminou. O de cima não
 * leva traço nenhum, porque ali ele é um item da lista, e não o fecho dela.
 */
.lym-checkout__total--botao {
	margin: 1.4em 0 0.8em;
	padding-top: 1em;
	border-top: 1px solid var( --lym-borda );
}

/*
 * As duas linhas do pé. Pequenas de propósito: elas respondem a dúvida de quem
 * hesita, e quem não hesita não deve ter a atenção puxada para longe do botão.
 */
.lym-checkout__depois,
.lym-checkout__seguranca {
	margin: 0.8em 0 0;
	font-size: 0.85em;
	line-height: 1.5;
	opacity: 0.75;
}

.lym-checkout__depois {
	margin-top: 0.9em;
	text-align: center;
}

.lym-checkout__seguranca {
	text-align: center;
	opacity: 0.6;
}

/*
 * A ajuda vira alerta quando alguém tenta colar na confirmação do e-mail. Só
 * ganha peso e opacidade cheia — **nada de vermelho**: a pessoa não errou, ela
 * usou um atalho que este campo não aceita, e pintar de erro trata um gesto
 * comum como falta.
 */
.lym-checkout__ajuda--alerta {
	font-weight: 600;
	opacity: 1;
}

/*
 * O "usar este" da sugestão de domínio. Parece link e não botão porque é uma
 * ação de conserto no meio de uma frase: um botão desenhado ali competiria com
 * o "Pagar", que é o único botão que esta tela quer que se aperte.
 *
 * Sem cor declarada — a cor de link do tema é a certa, e é a mesma dos outros
 * links da página.
 */
.lym-checkout__trocar.lym-checkout__trocar {
	padding: 0;
	border: 0;
	background: none;
	font: inherit;
	font-weight: 600;
	text-decoration: underline;
	cursor: pointer;
}

/*
 * **No celular, o pé do formulário é onde a compra acontece.** A tela é
 * estreita, o polegar está embaixo, e o total é o número que a pessoa relê no
 * instante de apertar — num aparelho pequeno ele é a última coisa que ela vê
 * antes do botão.
 *
 * **O bloco anterior era quase todo inócuo, e a única regra que fazia efeito
 * fazia o CONTRÁRIO do que este comentário dizia.** O `width: 100%` e o padding
 * do botão já estão na regra base, letra por letra — não mudavam um pixel. E o
 * total, que o comentário dizia crescer, ENCOLHIA: 1,05em contra os 1,15em da
 * base, 8,7% menor justamente na tela em que ele mais importa.
 *
 * Agora ele cresce de verdade. E a lição é sobre o resto do arquivo: uma regra
 * idêntica à base dentro de um media query parece cuidado com o celular e não
 * é nada — some sem que ninguém veja diferença, e por isso ninguém confere.
 */
@media ( max-width: 600px ) {
	.lym-checkout__total {
		font-size: 1.3em;
	}
}

/*
 * **`__seguro` é onde o GATEWAY monta o campo do cartão, e não uma linha de
 * texto.** Eu escrevi estas regras olhando o nome da classe e supondo que fosse
 * um selo de segurança — e o resultado foi os três campos do cartão saindo
 * pequenos, centralizados e a setenta por cento de opacidade, na única tela em
 * que a pessoa digita o número do cartão.
 *
 * A lição não é sobre esta classe: **estilizar pelo nome, sem abrir onde ela é
 * usada, é escrever CSS para um elemento imaginário.**
 *
 * O `span` vira bloco porque um iframe dentro de um elemento em linha herda a
 * altura de uma linha de texto — e três riscos finos não se parecem com campos.
 */
.lym-checkout__seguro {
	display: block;
	width: 100%;
	min-height: 1.5em;
}

/*
 * Os campos do cartão são desenhados pelo GATEWAY, dentro de iframes dele — o
 * número nunca entra nesta página. Um iframe nasce com altura de linha e sem
 * borda: sem estas regras, os três campos do cartão aparecem como três riscos
 * finos que ninguém identifica como campo.
 */
.lym-checkout__cartao .lym-checkout__seguro {
	padding: 0.7em 0.85em;
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
	background: transparent;
	min-height: 3em;
}

.lym-checkout__cartao iframe {
	display: block;
	width: 100%;
	border: 0;
}

/*
 * ─────────────────────────────────────────────────────────────────────────
 * A tela de pagamento.
 *
 * **Ela não tinha uma linha de CSS.** Nove classes na view, zero regras — e é a
 * tela que a pessoa vê no instante em que o dinheiro já saiu da conta dela.
 * Nada limitava a largura da imagem do QR, que num celular sai do tamanho que o
 * gateway mandou.
 *
 * Declara as próprias variáveis em vez de herdar as do checkout: os dois
 * atalhos são colados em páginas diferentes, e peça que depende de um ancestral
 * que pode não existir é peça que funciona por sorte.
 * ─────────────────────────────────────────────────────────────────────────
 */
.lym-pagamento {
	--lym-borda: rgba( 128, 128, 128, 0.25 );
	--lym-fundo: rgba( 128, 128, 128, 0.06 );
	--lym-raio: 12px;

	max-width: 32em;
	margin: 0 auto;
	text-align: left;
}

/*
 * **Sem `border-box`, `width: 100%` significa "100% MAIS o padding e a borda".**
 *
 * No celular os botões de recuperação desta tela — tentar outro cartão depois
 * de uma recusa, abrir o boleto — são 100% de largura com 22,4px de padding e
 * 2px de borda de cada lado: 48,8px além da borda direita, e a página inteira
 * ganha rolagem lateral. Na tela em que o dinheiro já saiu da conta.
 *
 * O tema pode ou não declarar isso; um plugin não pode depender disso.
 */
.lym-pagamento,
.lym-pagamento * {
	box-sizing: border-box;
}

/*
 * **A imagem do QR vem do gateway na largura que ele mandar.** O teto estava no
 * parágrafo, e parágrafo não segura filho: a `img` passava da borda e levava a
 * página inteira à rolagem lateral. O teto tem que estar na imagem.
 */
.lym-pagamento__qr img {
	display: block;
	width: 100%;
	height: auto;
}

.lym-pagamento__titulo {
	margin: 0 0 0.5em;
	font-size: 1.35em;
	line-height: 1.25;
	text-wrap: balance;
}

.lym-pagamento__valor {
	margin: 0 0 1em;
	font-size: 1.6em;
	font-weight: 700;
	line-height: 1.1;
}

.lym-pagamento__recado {
	margin: 0 0 1.1em;
	line-height: 1.5;
}

/*
 * **A imagem do QR tem teto e piso.** Sem teto ela sai na largura que o gateway
 * mandou e estoura a tela do celular; sem piso, um tema que encolha imagens a
 * deixaria pequena demais para a câmera do banco ler — e aí a pessoa que já
 * pagou fica tentando enquadrar um quadrado de dois centímetros.
 *
 * `image-rendering: pixelated` porque o QR é desenho de blocos: suavizar as
 * bordas ao ampliar é o que faz a leitura falhar.
 */
.lym-pagamento__qr {
	display: block;
	width: 100%;
	max-width: 16em;
	min-width: 11em;
	height: auto;
	margin: 0 0 1em;
	image-rendering: pixelated;
}

.lym-pagamento__campo {
	display: block;
	margin: 0 0 1em;
}

.lym-pagamento__campo label {
	display: block;
	margin-bottom: 0.35em;
	font-size: 0.9em;
	font-weight: 600;
}

/*
 * O código do Pix e a linha do boleto: monoespaçado, quebrando em qualquer
 * ponto. São sequências longas sem espaço, e sem a quebra forçada elas empurram
 * a página inteira para o lado — o sintoma aparece longe da causa.
 *
 * O corpo mínimo de 16px é o que impede o iPhone de dar zoom ao tocar no campo.
 */
.lym-pagamento__campo input,
.lym-pagamento__campo textarea {
	width: 100%;
	padding: 0.7em 0.85em;
	border: 1px solid var( --lym-borda );
	border-radius: var( --lym-raio );
	background: transparent;
	color: inherit;
	font-family: ui-monospace, Menlo, Consolas, monospace;
	font-size: max( 0.95rem, 16px );
	line-height: 1.4;
	overflow-wrap: anywhere;
}

/*
 * **O botão da tela de pagamento entrou no sistema em 01/09/2026.**
 *
 * Ele era um TERCEIRO desenho de botão — contorno de 2px em `currentColor` —
 * numa base que já tinha dois. Cada tela do comprador desenha o mesmo par
 * (principal sólido, secundário contornado), e aqui, que é a tela em que o
 * dinheiro acontece, aparecia um botão que não é nenhum dos dois.
 *
 * Todos os três da tela são a ação daquele momento — "Tentar de novo", "Abrir o
 * que eu comprei", "Abrir o boleto" — e nunca aparecem juntos: cada estado do
 * pagamento desenha o seu. Então todos são o PRINCIPAL, e o preenchimento
 * sólido é o certo.
 *
 * As três propriedades vêm de `.lym-botao--cheio` para não haver duas fontes da
 * verdade sobre o que é um botão principal. O que sobra aqui é a geometria, que
 * é desta tela: um botão maior, porque ele costuma estar sozinho no meio de uma
 * página de espera.
 */
.lym-pagamento__botao {
	display: inline-block;
	padding: 0.8em 1.4em;
	border: 1px solid transparent;
	border-radius: var( --lym-raio );
	background-color: var( --lym-acao-cheio );
	background-image: linear-gradient(
		var( --lym-acao-alto ),
		var( --lym-acao-cheio )
	);
	color: var( --lym-acao-texto );
	font-weight: 700;
	line-height: 1.2;
	text-align: center;
	text-decoration: none;
}

.lym-pagamento__botao:hover,
.lym-pagamento__botao:focus {
	background-color: var( --lym-acao-baixo );
	background-image: linear-gradient(
		var( --lym-acao-cheio ),
		var( --lym-acao-baixo )
	);
	text-decoration: none;
}

/*
 * O anel não pode ser `currentColor` aqui pela mesma razão do botão principal:
 * ali `currentColor` é a letra branca, e o anel é desenhado fora do botão,
 * sobre a página.
 */
.lym-pagamento__botao:focus-visible {
	outline: 2px solid var( --lym-link );
	outline-offset: 2px;
}

.lym-pagamento__ajuda,
.lym-pagamento__indo {
	margin: 0.8em 0 0;
	font-size: 0.88em;
	line-height: 1.5;
	opacity: 0.75;
}

/*
 * **Este link precisa de sublinhado PRÓPRIO, e a razão é a mesma de sempre com
 * um agravante.**
 *
 * Ele carrega classe do plugin, então o bloco que sublinha os links do
 * invólucro o exclui de propósito — aquele `:not()` existe para não atropelar
 * componentes. Só que este não é componente: é uma frase clicável. Sem cor,
 * sem traço e sem regra própria, ele virava texto comum.
 *
 * O agravante é onde ele mora: é a saída de quem PAGOU e está esperando a
 * confirmação, na tela em que a pessoa mais olha para a tela. "Já paguei —
 * conferir agora" que não parece clicável é a pessoa esperando para sempre.
 */
.lym-pagamento__conferir {
	margin: 1.2em 0 0;
	padding-top: 1.1em;
	border-top: 1px solid var( --lym-borda );
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

@media ( max-width: 600px ) {
	.lym-pagamento__botao {
		display: block;
		width: 100%;
	}

	.lym-pagamento__qr {
		max-width: 13em;
	}
}

/* ---------------------------------------------------------------------------
 * A mídia que aparece dentro de uma mensagem.
 *
 * O que se anexa ao ESCREVER mora no bloco da caixa de escrever, mais abaixo:
 * as classes daqui saíram junto com o formulário cru que elas vestiam.
 * ------------------------------------------------------------------------- */
.lym-comentario__midia {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
	margin: 0.5rem 0 0;
}

.lym-comentario__imagem {
	display: inline-block;
	max-width: 100%;
}

/*
 * `height: auto` junto do `max-width` porque o tema pode ter declarado uma
 * altura fixa para imagens dentro de conteúdo — e aí a foto sairia esticada em
 * vez de menor.
 *
 * **O teto de ALTURA faltava, e a fila de moderação já tinha o dela.** Sem ele
 * uma foto de tela em pé — que é o formato natural de tudo o que sai de um
 * celular — ocupa a tela inteira dentro da mensagem, e quem lê rola dois
 * polegares para achar a resposta que veio embaixo. A largura nunca foi o
 * problema: `max-width: 100%` já a segurava.
 *
 * O clique abre a lupa, que é onde a imagem aparece inteira — o teto aqui não
 * esconde nada.
 */
.lym-comentario__imagem img {
	display: block;
	max-width: 100%;
	max-height: 26em;
	height: auto;
	border-radius: 4px;
}

/*
 * O tocador comum do navegador tem largura própria, e ela é maior que uma coluna
 * estreita de celular: sem um teto ele estoura a borda e leva a página inteira à
 * rolagem lateral. Quem o segura é a regra de largura fixa lá embaixo, que ele
 * divide com a onda — as duas peças são o mesmo áudio visto de dois jeitos, e
 * larguras diferentes na mesma conversa leem como defeito.
 */
.lym-comentario__audio {
	display: block;
}

/*
 * O estado de quem está gravando.
 *
 * **Vermelho aqui não é decoração.** É a única cor que diz "o microfone está
 * aberto agora" sem exigir que a pessoa leia — e o custo de não perceber isso é
 * alto: ela sai da mesa achando que parou. A luz da aba do navegador diz o
 * mesmo, e nem todo mundo olha para lá.
 *
 * Herda a cor do texto até o dono do site escolher a dele: cor de marca em folha
 * é o que este projeto não faz.
 */
/*
 * **A classe é DOBRADA, e sem isso o `opacity: 1` era letra morta.**
 *
 * `.lym-escrever__estado` declara `opacity: 0.75` e mora mais ABAIXO nesta
 * folha. Empate de especificidade (0,1,0) se resolve pela ordem, então o apagado
 * vencia o aceso — e o vermelho do microfone aberto, que existe para ser visto
 * sem que ninguém precise ler, saía a 4,42:1 no tema claro e 3,79:1 no escuro:
 * abaixo dos 4,5:1 nos DOIS.
 *
 * Dobrar a classe é a regra da casa contra empate (a mesma dos botões), e ela
 * deixa o dono do site continuar vencendo com estilo na linha. Mover a regra
 * para o fim do arquivo também resolveria hoje e voltaria a quebrar na primeira
 * vez que alguém reordenasse a folha.
 */
.lym-escrever__estado--gravando.lym-escrever__estado--gravando {
	color: var( --lym-alerta, var( --lym-alerta-medido, currentColor ) );
	font-variant-numeric: tabular-nums;
	opacity: 1;
}

/* ---------------------------------------------------------------------------
 * A onda sonora de uma mensagem de voz.
 *
 * O desenho é o do aplicativo de mensagens que todo mundo já usa, e a razão é
 * essa: quem abre a conversa de um curso não vai aprender um jeito novo de ouvir
 * um áudio. Barras, um botão à esquerda e a duração à direita.
 *
 * Nenhuma cor própria: as barras usam a cor do texto, e a parte já tocada usa a
 * cor de link que o script mediu contra o fundo real da página.
 * ------------------------------------------------------------------------- */

/*
 * **A caixa da fileira é contada com a borda DENTRO, e o escopo é estreito de
 * propósito.**
 *
 * O padrão do navegador é `content-box`: um botão com `min-width: 44px`,
 * `padding: 0 0.4rem` e `border: 1px` ocupa 58,8px de verdade. A conta que decide
 * se a onda é cortada — e que o teste REFAZ — soma 44. Sem esta regra, a conta é
 * verdadeira só nos temas que já declaram `border-box` para tudo, e o plugin não
 * pode depender disso (a mesma razão está escrita em `.lym-pagamento`).
 *
 * **NÃO vale para a conversa inteira, e a razão é o FIO.** O cotovelo da última
 * resposta é uma caixa com `width`, `height` e duas bordas de 2px, e a conta dele
 * conta com o modelo de conteúdo: sob `border-box` a curva subiria 2px e sairia
 * de baixo da bolinha. Nenhum vigia pega isso — o do fio refaz a conta das
 * MEDIDAS, e o modelo de caixa não é uma delas. O fio custou seis rodadas de ida
 * e volta; ele não entra de carona numa regra que existe por outro motivo.
 */
.lym-onda,
.lym-onda *,
.lym-onda *::before,
.lym-onda *::after {
	box-sizing: border-box;
}

.lym-onda {
	display: flex;
	align-items: center;
	gap: 0.6rem;

	/*
	 * **A fileira NÃO quebra: quem cede é a ONDA.** Decisão do dono do site em
	 * 05/09/2026, depois de ver a versão que quebrava: "se tiver que ficar em 2
	 * linhas pra caber, diminua o tamanho da onda sonora".
	 *
	 * Ele está certo, e a razão é de leitura: uma mensagem de voz em duas linhas
	 * deixa de parecer uma peça só — o botão de tocar fica numa fileira e os
	 * comandos noutra, e quem olha não lê mais "isto é um áudio". A onda encurta
	 * sem deixar de ser onda; a fileira partida vira outra coisa.
	 *
	 * **Quem torna isso possível NÃO é uma base zero nas barras, e este
	 * parágrafo afirmou que era até a 1.118.0.** Elas são `flex: 1 1 auto` com
	 * `min-width: 2px` — logo abaixo, com a razão escrita ao lado —, e a base
	 * zero foi TENTADA e MEDIDA: com ela a onda some, porque num balão de
	 * tamanho de conteúdo quem não pede largura não recebe nenhuma. Quem encurta
	 * a onda numa coluna estreita é a classe `--curta`, escrita pelo script.
	 *
	 * **A fileira não quebra porque `flex-wrap` nunca foi escrito aqui**: ela é
	 * `nowrap`, que é o padrão. O preço está declarado — as barras não cedem
	 * abaixo do mínimo delas, então numa coluna mais estreita que a fileira quem
	 * sai pela direita é a MENSAGEM. Medido no Chrome sem janela em 20/09/2026,
	 * com a marcação e a folha de verdade: num invólucro de 150px a terceira
	 * resposta ficou com 36px de coluna e a caixa das barras continuou em 46px.
	 */
	width: auto;
}

/*
 * **A largura do tocador tem TETO, e ela não cresce com a tela.**
 *
 * Ela era `max-width: 100%` com as barras em `flex: 1 1 auto`: numa coluna de
 * celular isso dá o tamanho certo por acidente, e num computador o mesmo áudio
 * de seis segundos vira uma faixa de oitocentos pixels atravessando a página. A
 * onda não é uma barra de progresso a ser preenchida — ela é o desenho de uma
 * fala, e esticá-la não acrescenta informação nenhuma: as mesmas quarenta e oito
 * barras ficam só mais gordas.
 *
 * O número é o do aplicativo de mensagens no telefone, que é onde essa peça foi
 * aprendida. No celular nada muda — `max-width: 100%` continua encolhendo o
 * tocador numa coluna estreita —, e o que a linha resolve é o computador e o
 * tablet.
 *
 * **A conta que sustenta o número está no teste**, e ela é o que impede alguém
 * de apertar mais: são 48 barras de 2px com 2px entre elas, o que dá 190px de
 * onda no mínimo; abaixo disso o `overflow: hidden` das barras corta a fala pela
 * direita, e o corte não se anuncia.
 *
 * O tocador comum do navegador — o que aparece quando a onda não foi medida —
 * divide a regra de propósito: dois áudios lado a lado na mesma conversa com
 * larguras diferentes leem como defeito, e dois números para a mesma pergunta é
 * como eles começam a discordar.
 */
.lym-onda,
.lym-comentario__audio {
	/*
	 * **22rem, e o número subiu de 19 quando o botão de velocidade entrou.** Ele
	 * ocupa 44px mais um respiro, e a largura antiga não os tinha: as barras
	 * cederiam o espaço, e barra que cede é barra CORTADA — o `overflow: hidden`
	 * delas leva a fala pela direita sem anunciar nada.
	 *
	 * **O tocador comum do navegador não tem botão nenhum, e cresce junto assim
	 * mesmo.** É a decisão antiga desta regra compartilhada: dois áudios lado a
	 * lado na mesma conversa com larguras diferentes leem como defeito, e o
	 * desencontro seria de 3rem — visível. Quem paga o espaço é só um dos dois; a
	 * largura continua sendo uma.
	 *
	 * A conta não está aqui de propósito: o teste a REFAZ a partir das peças da
	 * folha e falha se ela não fechar. Quem quiser um tocador mais estreito
	 * precisa antes estreitar as barras.
	 */
	/*
	 * **`max-width`, e nunca `width`, e isto é o conserto de um estouro que
	 * ANTECEDE o botão de velocidade.**
	 *
	 * O envoltório da mensagem é `justify-self: start` — tamanho de conteúdo —, e
	 * o piso desse tamanho é o MIN-CONTENT do que está dentro. Uma largura fixa é
	 * definida: ela entra no min-content inteira, e o `max-width: 100%` ao lado
	 * não a reduz. Resultado medido em navegador, numa coluna de 180px: o balão
	 * saía 325px e passava 211px da borda — rolagem lateral na página inteira,
	 * com o sintoma longe da causa. Com `max-width`, o piso passa a ser o
	 * min-content de verdade.
	 *
	 * **E a fileira NÃO quebra: `flex-wrap` nunca foi escrito em `.lym-onda`.**
	 * Este parágrafo prometeu um até a 1.118.0, e ele não existe em folha
	 * nenhuma. Quem segura o estouro é o `max-width` daqui mais o `min-width: 0`
	 * da caixa das barras; as barras em si têm `min-width: 2px` e não cedem
	 * abaixo disso, então numa coluna mais estreita que a fileira quem sai pela
	 * direita é a mensagem. É dívida declarada, e escrever o `flex-wrap` agora é
	 * mudança de desenho e não conserto de linha: precisa ser medida antes.
	 *
	 * Medido, e a conta é a do `max-width`: numa coluna de 300px o estouro
	 * passou de 91px para ZERO; nas de 180 e 220 caiu de 211 e 171 para 97 e 57
	 * — o que sobra é o próprio tamanho dos três botões, e aí já não há coluna
	 * para nada.
	 */
	max-width: 22rem;
}

/*
 * O tocador comum do navegador divide o TETO, e não mais a largura fixa: os dois
 * continuam parando no mesmo lugar, e nenhum dos dois empurra a coluna.
 */
.lym-comentario__audio {
	width: 100%;
}

/*
 * Classe dobrada para empatar com o tema sem "!important": o tema do cliente
 * pinta botão, e um botão de tocar áudio pintado de vermelho no foco é o defeito
 * que a bolinha de concluir já pagou.
 */
.lym-onda__botao.lym-onda__botao {
	display: flex;
	align-items: center;
	justify-content: center;

	/*
	 * O alvo de toque inteiro. A auditoria de desenho achou nove controles com
	 * menos de 44px, e o engano é sempre o mesmo: o alvo parece grande porque é
	 * largo, e a altura é a de meia linha de texto.
	 */
	min-width: 44px;
	min-height: 44px;
	flex: 0 0 auto;

	padding: 0;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 50%;
	background: rgba( 128, 128, 128, 0.10 );
	color: inherit;
	cursor: pointer;
}

.lym-onda__botao.lym-onda__botao:hover,
.lym-onda__botao.lym-onda__botao:focus,
.lym-onda__botao.lym-onda__botao:active {
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
}

/*
 * O triângulo é recortado de um retângulo, e vira duas barras quando está
 * tocando. Desenho em SVG seria mais fácil de errar aqui: são dois estados do
 * MESMO elemento, e trocar o conteúdo do botão faria o leitor de tela reanunciar
 * a peça inteira a cada play.
 */
.lym-onda__triangulo {
	display: block;
	width: 12px;
	height: 14px;
	background: currentColor;
	clip-path: polygon( 0 0, 100% 50%, 0 100% );
}

.lym-onda--tocando .lym-onda__triangulo {
	clip-path: none;
	background: none;
	border-left: 4px solid currentColor;
	border-right: 4px solid currentColor;
}

.lym-onda__barras {
	display: flex;
	align-items: center;
	gap: 2px;
	height: 28px;

	/*
	 * **Base AUTO, e a base zero foi tentada e medida.** Com `flex: 1 1 0` a onda
	 * some: o balão da mensagem tem tamanho de CONTEÚDO, então uma onda que não
	 * pede largura nenhuma não recebe nenhuma — medido em navegador, as barras
	 * ficaram com ZERO pixel em todas as larguras, inclusive num monitor.
	 *
	 * Quem encurta a onda numa coluna estreita é a classe `--curta`, escrita pelo
	 * script, que é quem sabe medir a coluna. O CSS sozinho não sabe: media query
	 * pergunta o tamanho da JANELA, e o que aperta aqui é a coluna da resposta.
	 */
	flex: 1 1 auto;

	/*
	 * Sem isto, quarenta e oito barras numa coluna estreita empurram a duração
	 * para fora e a página inteira ganha rolagem lateral — com o sintoma
	 * aparecendo longe da causa.
	 */
	min-width: 0;
	overflow: hidden;

	cursor: pointer;
}

.lym-onda__barra {
	flex: 1 1 auto;
	min-width: 2px;
	border-radius: 2px;
	background: currentColor;

	/*
	 * A barra ainda não tocada é a mesma cor do texto, enfraquecida. Opacidade
	 * aqui não empilha com nada: é o único nível.
	 *
	 * **0,18 e não 0,3, e o número foi medido depois que a barra tocada virou
	 * verde.** O que precisa contrastar não é a barra com o fundo: é a barra
	 * tocada com a NÃO tocada, que é a fronteira que diz onde o áudio está. Com
	 * 0,3 no tema claro, a barra apagada vira um cinza médio e o verde escuro
	 * fica a 2,34:1 dela — as duas metades da onda quase se confundem.
	 *
	 * 0,18 é o maior valor que passa nos dois temas: 3,12:1 no claro e 4,43:1 no
	 * escuro. **A conta que manda aqui é a do tema CLARO**, porque nele o verde
	 * é escuro e a barra apagada é clara, e as duas se aproximam por cima; no
	 * escuro elas se afastam.
	 */
	opacity: 0.18;
}

/*
 * **A parte já tocada é VERDE**, e é o mesmo verde do microfone: numa mensagem
 * de voz o verde é a identidade da peça, do botão que grava até a barra que
 * mostra o que já passou. Era a cor de ação, e ali ela não dizia ação nenhuma
 * — dizia progresso, que é outro papel.
 */
/*
 * **A onda CURTA: metade das barras, para caber numa coluna estreita.**
 *
 * Pedido do dono do site em 05/09/2026: "se tiver que ficar em 2 linhas pra
 * caber, diminua o tamanho da onda sonora". Uma mensagem de voz partida em duas
 * fileiras deixa de parecer uma peça só.
 *
 * **Esconder uma barra sim, uma não, mantém a conta do progresso CERTA de
 * graça.** A pintura marca um PREFIXO das quarenta e oito, e esconder de forma
 * uniforme preserva a proporção: marcadas N de 48, aparecem N/2 de 24. Escolher
 * "as 24 primeiras" quebraria isso — a onda mostraria só a primeira metade da
 * fala, e o verde encheria tudo na metade do áudio.
 *
 * **As medidas, refeitas em navegador em 05/09/2026** (com o controle de
 * velocidade escondido, que é como ele nasce):
 *
 * | barras | a fileira ocupa | a mensagem exige |
 * |---|---|---|
 * | 48 | 277px | 298px |
 * | 24 | 181px | 202px |
 * | 12 | 133px | 154px |
 *
 * **E esse ÚLTIMO número é um PISO de verdade: abaixo dele a mensagem sai pela
 * direita, e não há CSS que a encolha.** Quem o fixa é a `min-width` de cada
 * barra somada à mobília da fileira (botão 44px, duração 24px, dois respiros e o
 * recheio do balão).
 *
 * **Duas saídas foram tentadas para tirar esse piso, e as duas apagam a onda —
 * cada uma à sua maneira, e a diferença importa para quem for tentar a
 * terceira.** As duas partem da mesma ideia: fazer a caixa das barras não pedir
 * largura nenhuma. Num balão de tamanho de CONTEÚDO, quem não pede não recebe.
 *
 * - `flex: 1 1 0` nas barras: medido em navegador, ZERO pixel de barra em TODA
 *   largura, inclusive num monitor. A onda simplesmente não existe.
 * - `contain: inline-size` (e `container-type`, que faz o mesmo) na caixa delas:
 *   mais traçoeiro, porque numa tela larga PARECE funcionar — a mensagem de
 *   raiz sai com as 48 barras e 352px. É nas respostas fundas que ele morde:
 *   medido numa proveta de 768px, a quarta resposta ficou com 174px de fileira e
 *   a quinta com 87px, que é a mobília sozinha, **sem barra nenhuma**. Ele apaga
 *   a onda exatamente onde ela é mais difícil de caber, que é onde se estava
 *   tentando consertar.
 *
 * **Não tente de novo sem medir, e não meça só a mensagem de raiz.**
 */
.lym-onda--curta .lym-onda__barra:nth-child( 2n ) {
	display: none;
}

/*
 * **O terceiro degrau: doze barras, para a resposta de resposta.**
 *
 * Vinte e quatro barras exigem uma coluna de 202px, e cada nível de resposta comia
 * uns 87px — num tablet a terceira resposta já não tinha isso, e a mensagem saía
 * pela direita. Foi o que o dono do site viu: "alguns pontos estão estourando um
 * pouco no tablet". (Desde a 1.97.0 a coluna da bolinha é a foto, e o nível custa
 * 38px no computador e 25,6px abaixo de 600px — medido no Chrome em 18/09/2026.
 * O degrau continua: uma coluna estreita chega a 202px por outros caminhos.)
 *
 * **Uma de quatro, e não "as doze primeiras"**, pela mesma razão do degrau
 * anterior: escondendo de forma uniforme, as que ficam continuam cobrindo a fala
 * INTEIRA, e a pintura por prefixo continua proporcional sem saber quantas estão
 * no ar. Mostrando as doze primeiras, a onda contaria só o primeiro quarto da
 * gravação e o verde encheria tudo aos 25%.
 *
 * `4n + 1` guarda a PRIMEIRA de cada grupo de quatro — a 1, a 5, a 9. Começar
 * pela 1 importa: a onda tem de nascer alinhada com o começo do áudio.
 */
.lym-onda--curtissima .lym-onda__barra:not( :nth-child( 4n + 1 ) ) {
	display: none;
}

.lym-onda__barra--tocada {
	background: var( --lym-feito, currentColor );
	opacity: 1;
}

.lym-onda__tempo {
	flex: 0 0 auto;
	font-size: 0.8125rem;
	font-variant-numeric: tabular-nums;
	opacity: 0.75;
}

/*
 * O aviso de quando a gravação não toca.
 *
 * **Vazio ele tem altura zero, e nunca é escondido por `display`.** Ele é uma
 * região `role="status"`: tirada da árvore e devolvida na mesma tarefa em que a
 * frase chega, o leitor de tela não anuncia nada.
 *
 * **Altura zero não é lugar zero.** Na conversa ele é filho direto de
 * `.lym-comentario__midia`, que é flex em coluna com `gap`: vazio, ele continua
 * sendo item e ganha o vão, e toda mensagem de voz ficava 8px mais alta (medido
 * no Chrome, com e sem script). A margem negativa do `:empty` devolve o vão, e
 * ela tem de ser o `gap` de lá com o sinal trocado — existe vigia que refaz a
 * conta. Na fila do painel o pai é bloco comum, e ali a regra nem casa.
 *
 * **Sem opacidade**: a frase é a única pista de por que não saiu som, e apagada
 * ela perde o contraste que a regra da casa mede. Quem a distingue é o corpo.
 */
.lym-onda__aviso {
	display: block;
	max-width: 100%;
	font-size: 0.875rem;
	line-height: 1.4;
	overflow-wrap: anywhere;
}

.lym-onda__aviso:not( :empty ) {
	margin: 0.25rem 0 0.5rem;
}

.lym-comentario__midia > .lym-onda__aviso:empty {
	margin-top: -0.5rem;
}

/*
 * O botão de velocidade: 1x, 1,5x, 2x.
 *
 * **Ele é um alvo de 44px de verdade, e não um número solto.** A auditoria de
 * desenho deste projeto achou nove controles com menos que isso, e o engano é
 * sempre o mesmo: o alvo parece grande porque é largo. Aqui a altura vem do
 * `min-height`, como no botão de tocar ao lado — e não de um pseudoelemento,
 * porque a fileira já tem 44px de altura e o botão pode ocupá-los sem engordar
 * nada.
 *
 * **A largura MÍNIMA existe para a fileira não dançar.** "1x" tem dois
 * caracteres e "1,5x" tem quatro: sem o piso, cada toque mudaria a largura do
 * botão e empurraria a onda para o lado, no meio da escuta.
 *
 * **Números tabulares** pela mesma razão do relógio: num tipo proporcional o "1"
 * é mais estreito que o "2", e a peça estremeceria ao trocar.
 *
 * A classe é dobrada para empatar com o tema do cliente sem `!important`, e o
 * contorno é a pista de que aquilo se clica — um número solto ao lado da duração
 * pareceria mais um número.
 */
.lym-onda__velocidade.lym-onda__velocidade {
	display: flex;
	align-items: center;
	justify-content: center;

	min-width: 2.75rem;
	min-height: 44px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0 0.4rem;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 22px;
	background: rgba( 128, 128, 128, 0.10 );
	color: inherit;

	font: inherit;
	font-size: 0.8125rem;
	font-variant-numeric: tabular-nums;
	line-height: 1.2;
	opacity: 1;

	cursor: pointer;
}

/*
 * Todos os estados são declarados, e não só o normal: o tema do cliente pinta
 * botão em foco e em ação, e já pintou um deste plugin de vermelho.
 */
.lym-onda__velocidade.lym-onda__velocidade:hover,
.lym-onda__velocidade.lym-onda__velocidade:focus,
.lym-onda__velocidade.lym-onda__velocidade:active {
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
}

/*
 * **O anel de foco, nos DOIS botões da fileira.**
 *
 * O estado de foco declarado acima só firma o fundo cinza — de 10% para 18% de
 * alfa, o que mede 1,09:1 contra o próprio fundo: quem navega por teclado não
 * enxerga onde está. É a mesma lição que o botão principal do plugin já registra
 * ("o foco ganha anel"), e ela faltava aqui.
 *
 * **O de TOCAR ganha junto, e isso é de propósito.** Ele tinha o mesmo defeito
 * antes desta versão; dar anel a um e não ao vizinho, na mesma fileira, leria
 * como descuido.
 *
 * `currentColor` é seguro nos dois: aqui a letra é a cor do texto da página, e
 * não o branco de um botão sólido — que é a armadilha registrada no
 * `.lym-botao--cheio`.
 */
.lym-onda__botao.lym-onda__botao:focus-visible,
.lym-onda__velocidade.lym-onda__velocidade:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

/* ---------------------------------------------------------------------------
 * A fileira no celular, e ela é o preço do botão novo.
 *
 * **A conta, num telefone de 390px, na época do botão de velocidade:** a coluna
 * da mensagem dava uns 263px dentro do balão na raiz e cada nível de resposta
 * comia 66px; as peças que NÃO encolhem passaram de 90px para 149px — e no
 * segundo nível de resposta sobravam 131px. A fileira deixou de caber, e o que
 * não cabe numa linha de flex sai pela direita e leva a PÁGINA INTEIRA à rolagem
 * lateral, com o sintoma aparecendo longe da causa.
 *
 * **Desde a 1.97.0 o aperto mudou de lugar, e não sumiu.** A coluna da bolinha
 * passou a ser a foto: medido no Chrome em 18/09/2026, num telefone de 390px a
 * raiz ganhou 28px e cada nível custa 25,6px, e a fileira cabe até a quinta
 * resposta. Num telefone de 320px, pela conta, a quinta fica com uns 127px por
 * dentro — abaixo dos 149 —, e é ali que a quebra continua trabalhando.
 *
 * **E aqui está a outra metade da dívida: `flex-wrap` NÃO existe.** Este bloco
 * prometeu até a 1.118.0 que ele impedia o estouro; ele nunca foi escrito em
 * `.lym-onda`. A caixa das barras encolhe primeiro (ela tem `min-width: 0`),
 * mas as barras param no `min-width: 2px` de cada uma — e daí em diante quem
 * sai pela direita é a mensagem. O que esta media query faz de verdade é
 * apertar o vão e o botão, e isso ADIA o aperto sem resolvê-lo.
 *
 * O botão também encolhe aqui: 2,25rem ainda seguram "1,5x" sem a fileira dançar
 * a cada toque, e o alvo de 44px volta por um pseudoelemento, que não ocupa
 * lugar. É o mesmo arranjo da bolinha de concluir.
 * ------------------------------------------------------------------------- */
@media ( max-width: 600px ) {
	.lym-onda {
		gap: 0.35rem;
	}

	.lym-onda__velocidade.lym-onda__velocidade {
		position: relative;
		min-width: 2.25rem;
		padding: 0 0.15rem;
	}

	.lym-onda__velocidade.lym-onda__velocidade::after {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 44px;
		height: 44px;
		transform: translate( -50%, -50% );
	}
}

/* ---------------------------------------------------------------------------
 * O vídeo citado numa mensagem.
 *
 * A capa é desenhada aqui, e não buscada na plataforma: pedir a miniatura já é
 * uma conexão a um terceiro, com o IP de quem está lendo, antes de a pessoa ter
 * demonstrado interesse. O que se vê até o clique é feito de texto e uma seta.
 * ------------------------------------------------------------------------- */

.lym-comentario__videos {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
	margin: 0.5rem 0 0;
}

/*
 * Classe dobrada para empatar com o tema sem "!important". O tema do cliente
 * pinta botão, e uma capa de vídeo pintada de vermelho no foco é o defeito que a
 * bolinha de concluir já pagou.
 */
.lym-video.lym-video {
	display: flex;
	align-items: center;
	gap: 0.75rem;

	width: 100%;
	max-width: 100%;
	min-height: 44px;

	padding: 0.75rem 1rem;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	background: rgba( 128, 128, 128, 0.08 );
	color: inherit;
	text-align: left;
	cursor: pointer;
}

.lym-video.lym-video:hover,
.lym-video.lym-video:focus,
.lym-video.lym-video:active {
	background: rgba( 128, 128, 128, 0.13 );
	color: inherit;
}

.lym-video__play {
	flex: 0 0 auto;
	width: 14px;
	height: 16px;
	background: currentColor;
	clip-path: polygon( 0 0, 100% 50%, 0 100% );
}

.lym-video__nome {
	flex: 1 1 auto;

	/*
	 * O nome da plataforma não estoura a coluna: um elemento que passa da borda
	 * direita dá rolagem lateral à página inteira, com o sintoma aparecendo
	 * longe da causa.
	 */
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-weight: 600;
}

.lym-video__aviso {
	flex: 0 0 auto;
	font-size: 0.8125rem;
	opacity: 0.7;
}

/*
 * Abaixo de 560px a frase do aviso e o nome disputam a mesma linha, e o que
 * perde é o nome — que é justamente o que diz qual plataforma vai abrir. A
 * frase desce para a linha de baixo em vez de sumir: ela é a informação que
 * torna o clique uma decisão.
 */
@media ( max-width: 560px ) {
	.lym-video.lym-video {
		flex-wrap: wrap;
	}

	.lym-video__aviso {
		flex: 1 1 100%;
	}
}

/*
 * A moldura do tocador, depois do clique. A proporção é declarada para a página
 * não pular quando o vídeo entra — sem ela, o conteúdo abaixo desce de repente
 * e a pessoa perde a linha que estava lendo.
 */
.lym-video__moldura {
	position: relative;
	width: 100%;
	aspect-ratio: 16 / 9;
	border-radius: var( --lym-raio, 14px );
	overflow: hidden;
}

.lym-video__moldura iframe {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
}

/* ---------------------------------------------------------------------------
 * A tela da conversa privada.
 *
 * Ela é só uma moldura: o que está dentro é a MESMA caixa de conversa que
 * aparece abaixo do conteúdo e na página do grupo. O que muda é o título, a
 * frase que diz quem lê, e a lista de produtos quando a pessoa ainda não
 * escolheu.
 * ------------------------------------------------------------------------- */

.lym-conversa-tela__titulo {
	margin: 0 0 0.5rem;
	font-size: 1.5rem;

	/* O nome do produto é escolhido pelo cliente e pode ser tão comprido
	 * quanto ele quiser: sem isto ele estoura a coluna e a página inteira ganha
	 * rolagem lateral, com o sintoma aparecendo longe da causa. */
	overflow-wrap: anywhere;
}

.lym-conversa-tela__dica {
	margin: 0 0 1.5rem;
	opacity: 0.8;
}

.lym-conversa-tela__lista {
	list-style: none;
	margin: 0;
	padding: 0;

	display: flex;
	flex-direction: column;
	gap: 0.5rem;
}

.lym-conversa-tela__item a {
	display: block;

	/* O alvo de toque inteiro: numa lista de links, a altura de uma linha de
	 * texto é metade do que um dedo precisa. */
	min-height: 44px;
	padding: 0.75rem 1rem;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	background: var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) );

	overflow-wrap: anywhere;
}

.lym-conversa-tela__item a:hover,
.lym-conversa-tela__item a:focus {
	background: rgba( 128, 128, 128, 0.13 );
}

/* ---------------------------------------------------------------------------
 * O que chegou desde a última visita.
 *
 * O brilho dura alguns segundos e some. Ele não é um estado: é um gesto — "olha
 * aqui" —, e um destaque que ficasse para sempre viraria só mais uma cor na
 * tela, que a pessoa aprende a ignorar em dois dias.
 * ------------------------------------------------------------------------- */

/*
 * **O brilho abraça a bolinha e o balão DAQUELA mensagem, e mais nada**
 * (18/09/2026, pedido do Flávio com o print). Até ali ele era o fundo do `li`
 * inteiro mais uma sombra de 12px para fora: pintava de uma borda à outra da
 * lista, passava da lista dos dois lados — e, como o `li` de uma mensagem
 * contém o galho, uma mensagem nova acendia junto todas as respostas ANTIGAS
 * dela.
 *
 * **Quem desenha é um pseudoelemento do BALÃO, esticado para a esquerda até
 * cobrir a coluna da bolinha.** O balão tem a largura do que diz (é o
 * `justify-self: start` dele), então o brilho herda essa largura sem conta
 * nenhuma; a coluna da bolinha tem medida conhecida, e o esticão para a
 * esquerda é exatamente ela mais o vão. Uma sombra deslocada foi descartada: as
 * duas sombras se sobreporiam nas faixas de cima e de baixo, e translúcido
 * somado a translúcido sai mais escuro — uma listra onde elas se encontram.
 *
 * O filho DIRETO (`>`) é o que impede uma raiz nova de acender os balões das
 * respostas que moram dentro dela.
 *
 * **O contexto de empilhamento é o da MENSAGEM, e não o do balão.** Com o
 * `z-index: -1` o brilho fica por baixo de tudo o que a mensagem desenha — a
 * foto, o texto, a etiqueta, o fio —, e o contexto da mensagem é o que o impede
 * de descer até a página, onde o fundo de qualquer invólucro do construtor
 * pintaria por cima dele. A primeira versão abria o contexto no balão, e o
 * brilho ficava POR CIMA do cinza dele: a etiqueta, que agora mora dentro do
 * balão, passava a ter três camadas embaixo (página, cinza, âmbar) e a vermelha
 * caía para 3,8:1 no escuro. A revisão adversarial mediu.
 */
.lym-comentario--novo {
	position: relative;
	z-index: 0;
}

/*
 * **Durante o brilho o balão TROCA o cinza pelo âmbar, e não soma os dois.** O
 * fundo da etiqueta e do texto volta a ser a página mais uma camada só — a mesma
 * conta que a etiqueta tinha quando morava embaixo da foto. A luz de cima sai
 * junto: ela desenharia uma linha no meio do âmbar, seis pixels abaixo da borda
 * dele.
 */
.lym-comentario--novo > .lym-comentario__corpo {
	position: relative;
	background: transparent;
	box-shadow: none;
}

.lym-comentario--novo > .lym-comentario__corpo::before {
	content: "";
	position: absolute;
	top: -0.375rem;
	bottom: -0.375rem;
	left: calc( -1 * ( var( --lym-lado ) + var( --lym-vao ) ) - 0.375rem );

	/*
	 * **À direita ele PARA na borda do balão.** Um elemento posicionado conta na
	 * área de rolagem, ao contrário da sombra de antes: com o brilho passando
	 * 8px da borda, toda página em que a conversa encosta na borda da tela ganhava
	 * rolagem lateral pelos seis segundos do brilho (medido em Chrome, na revisão
	 * adversarial). Para a esquerda ele pode passar — do lado do começo da linha
	 * nada vira rolagem.
	 */
	right: 0;
	z-index: -1;

	border-radius: 0.85rem;
	background: var( --lym-novo, rgba( 128, 128, 128, 0.18 ) );
	pointer-events: none;

	animation: lym-brilho-acende 1.2s ease;
}

/*
 * O brilho acende devagar, como a transição de antes fazia: um pseudoelemento
 * nasce com a classe, e nascer não é mudança de valor — sem a animação ele
 * apareceria de uma vez.
 */
@keyframes lym-brilho-acende {
	from {
		opacity: 0;
	}

	to {
		opacity: 1;
	}
}

/*
 * **Quem pediu menos movimento recebe o brilho sem a animação, e não sem o
 * brilho.** A informação continua sendo entregue; o que sai é o movimento. Tirar
 * o destaque junto seria decidir que quem tem enxaqueca não precisa saber o que
 * é novo.
 */
@media ( prefers-reduced-motion: reduce ) {
	.lym-comentario--novo > .lym-comentario__corpo::before {
		animation: none;
	}
}

/* ---------------------------------------------------------------------------
 * O sino e a caixa de avisos.
 *
 * O sino é um LINK, e com script ele abre um painel. As duas coisas, e nesta
 * ordem: sem JavaScript o clique leva à página, que funciona sozinha.
 *
 * **A lista é pedida no clique, uma vez.** Esta seção dizia que isso era o que
 * o desenho existia para evitar, e a frase estava errada: o que a decisão
 * registrada proíbe é a tela PERGUNTAR EM LAÇO. Uma busca única quando a pessoa
 * pede é exatamente o que o desenho previa — "quem nunca clica no sino gera
 * zero requisições a mais". Desenhar a lista em toda página, essa sim, custaria
 * uma consulta por visita.
 * ------------------------------------------------------------------------- */

.lym-sino {
	position: relative;

	display: inline-flex;
	align-items: center;
	gap: 0.4rem;

	/* O alvo de toque inteiro: o ícone tem 20px, e o dedo precisa de 44. */
	min-height: 44px;
	padding: 0 0.25rem;

	/*
	 * **O `text-decoration: none` é desta classe, e só ele decide.** Desde que o
	 * bloco de sublinhar ganhou `:not([class*="lym-"])`, o sino está fora dele —
	 * é esta linha que suprime o sublinhado do navegador sob "Notificações".
	 *
	 * A COR não mora aqui: mora na regra de classe dobrada logo abaixo, pela
	 * razão escrita nela.
	 */
	text-decoration: none;
}

/*
 * **A cor do sino tem classe DOBRADA, e é o Elementor que obriga.** O `color:
 * inherit` vinha só do bloco dos invólucros (`.lym-sino-caixa a`, peso 0,1,1). O
 * Kit global do Elementor declara `.elementor-kit-N a { color }` com o MESMO
 * peso, e o arquivo dele chega depois da nossa folha: numa página montada no
 * Elementor o empate ia para ele, e o sino e a palavra saíam no azul do Kit — e
 * brancos na página vizinha, que não é do Elementor. Foi o que o Flávio viu em
 * 16/09/2026: duas aulas do mesmo produto com cores diferentes.
 *
 * Com (0,2,0) a regra vence o Kit e o `a:hover` do tema em qualquer ordem, e os
 * estados pesam (0,3,0), que vence também um `.elementor-kit-N a:hover`.
 */
.lym-sino.lym-sino,
.lym-sino.lym-sino:hover,
.lym-sino.lym-sino:focus,
.lym-sino.lym-sino:active {
	color: inherit;
}

/*
 * **O ícone é AZUL, o mesmo azul dos nomes de módulo** (16/09/2026). Ele era a
 * cor do link em volta — e por isso saía no azul do Elementor numa aula e branco
 * na outra. A cor é declarada no próprio desenho, pela MESMA cadeia do nome do
 * módulo: a do produto quando o dono escolheu uma, e senão o azul medido. A
 * palavra ao lado continua na cor do texto.
 */
.lym-sino__icone {
	width: 20px;
	height: 20px;
	flex: 0 0 auto;
	color: var( --lym-destaque, var( --lym-info ) );
}

/*
 * A bolinha do número fica POR CIMA do ícone, e não ao lado: ao lado ela
 * empurraria o nome da pessoa a cada aviso novo, e a barra inteira mudaria de
 * largura sozinha.
 */
.lym-sino__conta {
	position: absolute;
	top: 4px;
	left: 12px;

	min-width: 1.1rem;
	padding: 0 0.25rem;

	border-radius: 999px;

	/*
	 * **A bolinha é o MESMO vermelho sólido do botão principal**, e não o tom
	 * medido. Duas razões, e a segunda é a que decide:
	 *
	 * 1. Ela carrega o próprio fundo, como o botão — então a conta é a letra
	 *    contra o preenchimento, e essa não depende do tema do cliente.
	 * 2. Com o tom medido, num tema escuro a bolinha ficava no vermelho CLARO
	 *    enquanto o botão da mesma tela ficava no escuro. Dois vermelhos a um
	 *    palmo um do outro parecem engano, não sistema.
	 */
	background: var( --lym-acao-cheio );

	/*
	 * **A letra é a mesma do botão principal, e por isso é FIXA.**
	 *
	 * Ela precisava contrastar com a bolinha, e a bolinha era o tom MEDIDO —
	 * então a letra também tinha de ser medida, e o script escrevia uma das
	 * duas conforme o fundo da página. Era uma engrenagem inteira para resolver
	 * um contraste que só existia porque o fundo da bolinha variava.
	 *
	 * Com o preenchimento sólido a variação some, e a engrenagem some junto:
	 * branco sobre `#c40812` dá 6,19:1 em qualquer tema. Continua saindo de uma
	 * variável, para quem trocar o preenchimento poder trocar a letra na mesma
	 * linha em que troca o fundo.
	 */
	color: var( --lym-acao-texto );

	font-size: 0.6875rem;
	font-weight: 700;
	line-height: 1.1rem;
	text-align: center;
	font-variant-numeric: tabular-nums;
}

/*
 * O texto ao lado do sino existe, e não é só para leitor de tela: ícone sozinho
 * depende de a pessoa já conhecer a convenção. É a mesma razão pela qual o botão
 * do índice traz o desenho E a palavra.
 */
.lym-sino__texto {
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/*
 * Com aviso por ler, o texto ganha peso — e nada mais. Uma cor própria aqui
 * seria um segundo código para a pessoa aprender, quando a bolinha já disse.
 */
.lym-sino--tem .lym-sino__texto {
	font-weight: 700;
}

/*
 * **Na barra do GRUPO a palavra desce para baixo do desenho também no tablet**
 * (1.100.0), e a bolinha vai junto para o canto do ícone — a mesma posição do
 * telefone, logo abaixo. Sem isto, de 561 a 1024px ela ficava com a posição da
 * barra em fileira e caía à ESQUERDA do sino, tapando um terço dele (achado da
 * revisão da 1.100.0, medido). Depois do bloco base, pela razão escrita na
 * regra do telefone.
 */
@media ( max-width: 1024px ) {
	.lym-menu-lateral--papo .lym-sino__conta {
		top: -2px;
		left: 55%;
	}
}

@media ( max-width: 560px ) {
	/*
	 * **No menu, empilhado, a bolinha sobe para o canto do ÍCONE.** Com a palavra
	 * embaixo, o link fica alto e os 4px do topo caem longe do desenho. Esta
	 * regra mora DEPOIS do bloco base de propósito: os vigias das cores da
	 * bolinha recortam a folha a partir da primeira ocorrência do seletor dela
	 * até a chave que fecha, e escrita antes era a minha que eles mediam.
	 */
	.lym-menu-lateral .lym-sino__conta {
		top: -2px;
		left: 55%;
	}

	/*
	 * Na tela estreita a barra do perfil disputa espaço, e o que perde é a
	 * palavra: ali o sino já está ao lado da foto e do nome, que dão o contexto
	 * que o ícone sozinho não daria.
	 */
	.lym-sino__texto {
		position: absolute;
		width: 1px;
		height: 1px;
		overflow: hidden;
		clip-path: inset( 50% );
		white-space: nowrap;
	}
}

/*
 * **O invólucro é o que dá ao painel onde se pendurar.** Ele é `inline-flex`
 * para não virar uma linha inteira dentro da faixa do perfil, onde mora ao lado
 * da foto e do nome.
 */
.lym-sino-caixa {
	position: relative;
	display: inline-flex;
}

/*
 * **O painel precisa ser OPACO, e o plugin não sabe o fundo da página.** É o
 * mesmo problema já resolvido no painel do índice: quem lê a cor do corpo é o
 * script, e a escreve em `--lym-painel`. Como é o script que abre o painel, o
 * valor de reserva nunca chega a ser visto.
 */
.lym-sino__painel {
	position: absolute;
	top: 100%;
	/*
	 * **O número é grande porque a folha já provou que precisa ser.** O painel
	 * do índice usa 2147483000 aqui do lado, e o comentário dele diz por quê: o
	 * player de vídeo do cliente empilha em valores desse tamanho. Um painel de
	 * avisos que aparece POR BAIXO do vídeo é um painel que a pessoa abre e não
	 * vê — e ela conclui que o sino não funciona.
	 *
	 * Um abaixo do índice, de propósito: os dois nunca aparecem juntos, e se um
	 * dia aparecerem, o índice é o que a pessoa abriu para navegar.
	 */
	z-index: 2147482998;

	/*
	 * **Ancorado à DIREITA.** O sino fica no canto da faixa do perfil, que é o
	 * canto direito na esmagadora maioria dos temas: ancorado à esquerda, o
	 * painel sairia da tela. E `max-width` com a largura da janela impede que
	 * ele estoure a borda em qualquer largura — a regra da casa é que peça
	 * nenhuma pode ganhar rolagem lateral para a página inteira.
	 */
	right: 0;

	width: 22rem;
	max-width: calc( 100vw - 2rem );

	/*
	 * Uma lista longa rola DENTRO do painel. Sem teto, quarenta avisos fariam
	 * um painel mais alto que a tela, e o rodapé ficaria fora do alcance.
	 */
	max-height: 60vh;
	overflow-y: auto;

	margin-top: 0.35rem;
	padding: 0.5rem;

	/*
	 * O painel é uma lista de recados curtos, e não o corpo da página: no
	 * computador ele saía com a letra do conteúdo e pesava mais que a conversa
	 * ao lado. Pedido do Flávio em 15/09/2026.
	 */
	font-size: 0.9rem;

	border-radius: 0.5rem;

	/*
	 * **O painel PRECISA parecer outra superfície, e antes ele não parecia.**
	 *
	 * O fundo dele é o fundo da página, medido pelo script — e essa era a
	 * queixa: cor idêntica à do conteúdo, então não se via onde o painel
	 * começava nem onde acabava. Ele flutuava sem borda visível por cima de um
	 * fundo igual ao dele.
	 *
	 * A causa é boa e continua valendo: o painel cobre o conteúdo, logo tem de
	 * ser OPACO, e o plugin não sabe a cor de fundo do tema do cliente — chutar
	 * branco quebraria toda área de membros escura. O que faltava não era outra
	 * cor: era **contraste com o próprio fundo**.
	 *
	 * São três camadas, e cada uma resolve um pedaço:
	 *
	 * 1. `background-color` continua sendo a cor medida — é ela que garante a
	 *    opacidade.
	 * 2. `background-image` põe um cinza translúcido POR CIMA dela. Gradiente e
	 *    não uma segunda cor porque `background-image` pinta acima de
	 *    `background-color` no mesmo elemento, e é o jeito de empilhar as duas
	 *    sem um envoltório a mais. Cinza a 12% clareia um fundo escuro e
	 *    escurece um claro — funciona nos dois sem o plugin escolher cor.
	 * 3. **A borda é quem carrega o limite, e o valor dela foi MEDIDO.** Ela
	 *    estava em `--lym-borda`, que vale 0,25 — e é o mesmo token dos cartões
	 *    que ficam DENTRO do painel: a linha de fora tinha o peso das linhas de
	 *    dentro, então não lia como limite de nada. Subir para 0,45 não bastava:
	 *    contra a página ela dava 1,71:1 no branco e 1,92:1 no quase-preto,
	 *    longe dos 3:1 que a WCAG 1.4.11 pede para o contorno de um componente.
	 *    Em 0,92 dá **3,45:1 no branco e 4,18:1 no quase-preto**.
	 *
	 *    A conta é contra o fundo da PÁGINA, e não contra o do painel: quem
	 *    precisa enxergar o limite está do lado de fora dele.
	 *
	 *    **E ela NÃO passa no meio da escala** — contra um cinza médio o melhor
	 *    que existe é 1,00:1, porque a borda é cinza e o fundo também. Uma
	 *    versão anterior deste comentário dizia "passa nos dois extremos e no
	 *    meio da escala", e a segunda metade era falsa: entre `#e5e5e5` e
	 *    `#3a3a3a` ela fica abaixo de 3. É a mesma propriedade que faz a cor de
	 *    ação precisar de dois tons — num fundo de luminância média, cinza
	 *    nenhum contrasta com cinza nenhum, e não há valor que resolva. Os
	 *    temas de verdade vivem nos extremos; quem pintar a área de membros de
	 *    cinza médio perde o contorno, e o teste registra isso em vez de
	 *    fingir que não.
	 *
	 * O anel de cinza no `box-shadow` fica como o "levantar" da peça, e a sombra
	 * escura embaixo dele — ela sozinha some no tema escuro, que é justamente
	 * onde o cliente está.
	 */
	border: 1px solid rgba( 128, 128, 128, 0.92 );
	background-color: var( --lym-painel, Canvas );
	background-image: linear-gradient(
		rgba( 128, 128, 128, 0.12 ),
		rgba( 128, 128, 128, 0.12 )
	);

	box-shadow:
		0 0 0 1px rgba( 128, 128, 128, 0.16 ),
		0 10px 28px rgba( 0, 0, 0, 0.28 );

	text-align: left;
}

/*
 * **Na coluna do menu, no computador, o painel do sino EMPURRA em vez de
 * flutuar** — é o idioma da gaveta de emoji, e pela mesma razão: flutuando
 * dentro de uma coluna estreita ele seria recortado pela rolagem do índice, ou
 * ficaria preso ao contexto de empilhamento da coluna, onde o `z-index` gigante
 * que existe para passar por cima do tocador de vídeo do cliente deixa de
 * valer. Ocupando lugar, ele encolhe o índice enquanto está aberto e some
 * junto.
 *
 * **Estas regras moram depois do bloco base, e desde a 1.78.0 isso é só arranjo.**
 * Era obrigação: os vigias das três camadas de fundo recortavam a folha a partir
 * da PRIMEIRA ocorrência do seletor do painel, então uma regra escrita antes
 * virava a recortada — e nem o comentário podia escrever aquele seletor. A
 * âncora deles passou a ser a regra de COLUNA ZERO, que é única, e a regra da
 * barra já mora lá em cima com o resto do menu sem quebrar nada. Quem precisar
 * mover isto daqui pode; o que não pode é devolver a âncora frouxa.
 */
@media ( min-width: 1024.02px ) {
	.lym-menu-lateral .lym-sino__painel {
		position: static;
		width: auto;
		max-height: 50vh;
		margin-top: 0.5rem;
	}
}


/*
 * O invólucro do conteúdo existe para carregar as cores que o dono escolheu —
 * ele é onde o estilo em linha aterrissa. Sem `display` próprio: ele não desenha
 * nada, só transporta variáveis.
 */
.lym-sino__conteudo {
	display: block;
}

/*
 * O rodapé separa a lista da única ação que sobrou — "marcar tudo como lido".
 * Eram duas, e o "Ver todos" saiu em 01/09/2026 por tirar do conteúdo quem só
 * queria olhar de relance.
 *
 * A linha é cinza translúcido, e não uma cor: ela precisa aparecer sobre fundo
 * claro e sobre fundo escuro. E o `space-between` continua ali de propósito —
 * com um filho só ele não faz nada, e volta a valer no dia em que o rodapé
 * ganhar uma segunda ação que não leve ninguém embora.
 */
.lym-sino__rodape {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.75rem;

	margin-top: 0.5rem;
	padding-top: 0.5rem;
	border-top: 1px solid rgba( 128, 128, 128, 0.25 );
}

/*
 * **"Marcar tudo como lido" é um botão de texto, e não o botão preenchido da
 * casa.** Num painel de 22rem, dois botões cheios lado a lado disputam a
 * atenção com a lista, que é o que a pessoa veio ver.
 *
 * A classe dobrada empata com o tema, que pinta os botões dele — é a regra já
 * paga no botão do índice, e sem ela um tema com botão vermelho pinta este.
 */
.lym-sino__acao.lym-sino__acao {
	min-height: 44px;
	padding: 0 0.25rem;

	border: 0;
	background: none;

	font: inherit;
	color: inherit;
	text-decoration: underline;
	cursor: pointer;
}

.lym-sino__acao.lym-sino__acao:hover,
.lym-sino__acao.lym-sino__acao:focus,
.lym-sino__acao.lym-sino__acao:active {
	background: none;
	color: var( --lym-link, currentColor );
	text-decoration: underline;
}

/*
 * **`.lym-sino__todos` saiu daqui em 01/09/2026, com a peça que ela pintava.**
 * O "Ver todos" tirava do conteúdo quem só queria olhar de relance. (Na época a
 * página mostrava os mesmos avisos do painel; desde a 1.80.0 o painel mostra só
 * os NÃO lidos e a página é o histórico, e ela continua alcançável pelo link do
 * sino sem script.) A regra foi embora junto com o botão:
 * classe sem marcação nenhuma é pior que classe ausente, porque quem lê a view
 * depois procura a regra dela.
 */
.lym-avisos__titulo {
	margin: 0 0 1rem;
	font-size: 1.5rem;
}

.lym-avisos__vazio {
	margin: 0;
	opacity: 0.8;
}

/*
 * Dentro do painel o recado de "nada novo" é menor do que na página inteira:
 * ali ele é a tela toda, aqui é um bilhete dentro de uma caixa de 22rem.
 */
.lym-sino__painel .lym-avisos__vazio {
	font-size: 0.85rem;
}

/*
 * **Enquanto a lista não chega, o recado ocupa o lugar de UM aviso.** Na coluna
 * do computador o painel é estático e EMPURRA o "Grupo" e o índice: com o
 * recado sozinho (38px) a coluna descia uma vez ao abrir e de novo quando a
 * lista chegava — um salto duplo que lê como tremida. Medido em Chrome, na
 * coluna de 17rem, sem tema: o painel com um aviso e o rodapé tem 172px, e cada
 * aviso a mais soma uns 101px. A reserva é a de um aviso, que é o caso mais
 * comum de quem tem a bolinha acesa; com mais, sobra um salto só, e menor.
 *
 * **O botão de apagar (16/09/2026) não mexeu nessa conta no caso comum.** Medido
 * em Chrome, na mesma coluna, com a folha e a marcação de antes e de depois e a
 * mesma frase: a altura do aviso é igual enquanto a frase cabe nas mesmas
 * linhas. O botão tira uns 36px da largura do texto, e um nome longo passou a
 * quebrar uma linha a mais — 17px.
 *
 * **A altura mora no RECADO, e não no painel.** O painel tem recheio e borda, e
 * um `min-height` nele muda de sentido conforme o tema declare `border-box` ou
 * não; o parágrafo não tem nenhum dos dois, e a conta é a mesma nos dois. São os
 * 172px menos os 18px de recheio e borda do painel, arredondados para baixo:
 * medido com esta regra, a coluna ainda desce 1,7px quando um aviso chega.
 *
 * **O seletor lê `aria-busy`**, o mesmo atributo que diz ao leitor de tela que o
 * painel está esperando: o que a tela reserva e o que se anuncia saem de uma
 * fonte só, e quem o tira ao chegar a lista desfaz a reserva junto.
 */
.lym-sino__painel[aria-busy="true"] .lym-avisos__vazio {
	min-height: 9.5rem;
}

/*
 * A margem existe na PÁGINA, onde o botão fica acima da lista. Dentro do
 * rodapé do painel ela vira um vão sobrando abaixo da linha divisória — o
 * `:not` mantém a regra onde ela vale sem criar uma segunda classe para a
 * mesma peça.
 */
.lym-avisos__marcar:not( .lym-sino__rodape .lym-avisos__marcar ) {
	margin: 0 0 1rem;
}

.lym-sino__rodape .lym-avisos__marcar {
	margin: 0;
}

.lym-avisos__lista {
	list-style: none;
	margin: 0;
	padding: 0;

	display: flex;
	flex-direction: column;
	gap: 0.5rem;
}

/*
 * **Cada aviso é uma fileira de duas peças: o corpo e o botão de apagar**
 * (16/09/2026). A frase e a hora moram no corpo e continuam se arrumando como
 * antes, numa linha que quebra; o botão fica ao lado e não entra nessa quebra.
 *
 * **O recheio da DIREITA é menor**, porque ali quem afasta o desenho da borda é
 * o próprio alvo de 44px do botão, com o ícone no meio dele.
 */
.lym-avisos__item {
	display: flex;
	align-items: flex-start;
	gap: 0.25rem;

	min-height: 44px;
	padding: 0.75rem 0.25rem 0.75rem 1rem;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );

	overflow-wrap: anywhere;
}

/*
 * **O corpo pega o que sobra do botão, e `min-width: 0` é o que deixa.** O
 * mínimo de um item flex é o conteúdo dele, e a hora não quebra ("há 3
 * semanas"): numa barra de telefone estreita, esse mínimo empurraria o botão
 * para fora do cartão — e a regra da casa é que peça nenhuma estoura a largura
 * de onde está.
 */
.lym-avisos__corpo {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.25rem 0.75rem;

	flex: 1 1 auto;
	min-width: 0;
}

/*
 * O recado de quando o apagar não deu, escrito pelo script DENTRO do corpo da
 * linha que ficou: é a mesma peça dos outros recados do plugin, numa linha
 * própria e mais apertada, porque aqui ele é um bilhete dentro de um cartão.
 */
.lym-avisos__corpo > .lym-recado {
	flex-basis: 100%;
	margin: 0.25rem 0 0;
	padding: 0.35rem 0.6rem;
}

/*
 * **A margem negativa devolve ao cartão a altura que o alvo de toque pediria.**
 * O botão tem 44px de altura clicável, e a linha de texto ao lado tem pouco mais
 * da metade disso: sem a margem, todo aviso cresceria só para abrigar o alvo. O
 * recheio de cima e de baixo do cartão (0,75rem) é maior que a margem (0,625rem),
 * então o alvo continua inteiro dentro da borda.
 */
.lym-avisos__apagar {
	flex: none;
	margin: -0.625rem 0;
}

/*
 * **O botão de apagar é um ícone sem fundo, na cor do texto.** Numa lista de
 * trinta avisos, trinta botões com cor seriam o que mais aparece na tela, e o que
 * a pessoa veio ver é a frase.
 *
 * A classe dobrada empata com o tema, que pinta os botões dele, e TODOS os
 * estados são declarados pela mesma razão: o tema pinta botão em foco e em ação.
 * O gesto ganha um fundo de cinza translúcido — e não opacidade, que trocaria a
 * cor do desenho pela mistura com o fundo.
 */
.lym-avisos__apagar-botao.lym-avisos__apagar-botao {
	display: flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	min-height: 44px;
	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 50%;
	background: none;
	box-shadow: none;

	font: inherit;
	color: inherit;
	cursor: pointer;
}

.lym-avisos__apagar-botao.lym-avisos__apagar-botao:hover,
.lym-avisos__apagar-botao.lym-avisos__apagar-botao:focus,
.lym-avisos__apagar-botao.lym-avisos__apagar-botao:active {
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
	box-shadow: none;
}

.lym-avisos__apagar-botao.lym-avisos__apagar-botao:focus-visible {
	outline: 2px solid var( --lym-link, currentColor );
	outline-offset: -2px;
}

/*
 * Enquanto o pedido não volta, o botão diz que está trabalhando. É
 * `aria-disabled`, e não `disabled`: desabilitar o botão que tem o foco joga o
 * foco para o começo da página, e quem usa teclado se perde.
 */
.lym-avisos__apagar-botao.lym-avisos__apagar-botao[aria-disabled="true"] {
	cursor: progress;
}

.lym-avisos__apagar-icone {
	display: block;
	width: 1.125rem;
	height: 1.125rem;
}

/*
 * **A frase de cada aviso NÃO é pintada com a cor de ação, e isso é decisão de
 * 01/09/2026.**
 *
 * Ela é um `<a>`, então caía na regra do topo que pinta todo link dentro dos
 * invólucros do plugin. Com o azul isso passava; com o vermelho, não: cada
 * aviso é um cartão com borda, e uma caixa de dez cartões vira dez linhas de
 * vermelho saturado empilhadas — "muita coisa vermelho", que foi a queixa.
 *
 * **A razão é de papel, e não de gosto.** Numa lista de avisos a frase é o
 * CONTEÚDO, e não uma chamada para agir: quem abre a caixa vem ler o que
 * aconteceu. A cor de ação fica onde ela significa alguma coisa — a bolinha do
 * número e o "marcar tudo como lido" —, e ali ela se destaca justamente porque o
 * resto não a usa. Cor que pinta tudo não destaca nada. (O ícone do sino saiu da
 * cor de ação na 1.80.0: ele é o azul dos nomes de módulo, e a palavra ao lado,
 * a cor do texto.)
 *
 * **O sublinhado entra no lugar da cor**, senão a linha deixa de parecer
 * clicável: a WCAG 1.4.1 proíbe identificar link só por cor, e aqui não sobrou
 * nem a cor. Ele é discreto por padrão e ganha peso no foco e no ponteiro.
 *
 * **Dois níveis de classe**, e não um: `.lym-sino-caixa a` e `.lym-caixa-aviso a`
 * têm o mesmo peso que `.lym-avisos__item a` teria, e num empate vence a ordem
 * do arquivo — regra invisível, que muda sozinha se alguém mover um bloco.
 *
 * **E a frase tem classe PRÓPRIA, que é o que faz esta regra valer de verdade.**
 * O `<a>` nascia sem classe nenhuma, e o tema forçado emite
 * `html body a:not([class*="lym-"]){color:…!important}`: ele repintava a frase
 * com a cor de ação por cima de tudo, porque `!important` vence especificidade
 * e ordem. Numa instalação com o tema forçado ligado — a do primeiro cliente —
 * o painel continuava sendo a pilha de vermelho que esta regra existe para
 * desfazer, e a suíte ficava verde porque lia a regra na folha sem perguntar
 * quem a sobrescreve. Uma classe que começa com `lym-` sai sozinha daquele
 * `:not()`; é por isso que ela vale mais que um `!important` do nosso lado.
 *
 * O seletor cita as duas coisas — o `a` e a classe — porque a classe sozinha
 * empataria com `.lym-sino-caixa a`, e num empate vence a ordem do arquivo.
 */
.lym-avisos__lista .lym-avisos__frase,
.lym-avisos__lista a.lym-avisos__frase {
	color: inherit;
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.15em;
}

/*
 * O `<span>` da frase sem endereço não é clicável, e por isso não leva
 * sublinhado: ele existe quando o conteúdo do aviso foi apagado, e sublinhar
 * prometeria um clique que não acontece.
 */
.lym-avisos__lista span.lym-avisos__frase {
	text-decoration: none;
}

.lym-avisos__lista a.lym-avisos__frase:hover,
.lym-avisos__lista a.lym-avisos__frase:focus,
.lym-avisos__lista a.lym-avisos__frase:active {
	color: inherit;
	text-decoration-thickness: 2px;
}

/*
 * O que ainda não foi lido usa o MESMO fundo do comentário recém-chegado. Duas
 * cores diferentes para "isto é novo" seriam dois códigos para a mesma ideia.
 */
.lym-avisos__item--novo {
	background: var( --lym-novo, rgba( 128, 128, 128, 0.18 ) );
}

.lym-avisos__quando {
	margin-left: auto;
	font-size: 0.8125rem;
	opacity: 0.7;
	white-space: nowrap;
}


/* ---------------------------------------------------------------------------
 * As peças soltas: compartilhar, perfil e notificações.
 *
 * **Desenho em cima, palavra embaixo** — o da barra do menu no celular —, e as
 * três com as MESMAS medidas, porque nasceram para ficar lado a lado na página
 * aberta de um evento (19/09/2026, pedido do Flávio). Quem as põe lado a lado
 * é a página: cada peça é um bloco em linha que não encolhe, e o arranjo, o vão
 * e a quebra são de quem desenha.
 *
 * **As cores são as pedidas**: o sino na cor de orientação do plugin (a regra
 * dele, `.lym-sino__icone`, vale aqui também), e o compartilhar e o perfil na
 * cor do texto, desenhados em `currentColor`.
 *
 * **Todo seletor que pinta dobra a classe**, pelo Kit do Elementor: ele declara
 * `.elementor-kit-N a { color }`, peso (0,1,1), e só carrega em página montada
 * nele — que é justamente onde estas peças moram. Com uma classe só, o perfil
 * sairia na cor de link do Kit numa página e na do texto em outra.
 * ------------------------------------------------------------------------- */

.lym-peca {
	position: relative;
	display: inline-flex;
	flex: none;
	vertical-align: top;
}

/*
 * **44px de ALTURA clicável**, que é o alvo de toque da casa — a largura é a da
 * palavra, e "Perfil" fica estreito de propósito: a fileira do evento divide a
 * linha com o nome de quem assina, e ele não pode ser cortado.
 *
 * O botão é um `<a>` no perfil e um `<summary>` no compartilhar; `font: inherit`,
 * `border: 0` e `background: none` desfazem o que o tema põe em cada um.
 */
.lym-peca__botao.lym-peca__botao {
	display: inline-flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 0.2rem;

	min-height: 44px;
	margin: 0;
	padding: 0 0.25rem;

	border: 0;
	border-radius: 8px;
	background: none;

	color: inherit;
	font: inherit;
	line-height: 1;
	text-decoration: none;

	cursor: pointer;
	list-style: none;
}

.lym-peca__botao.lym-peca__botao:hover,
.lym-peca__botao.lym-peca__botao:focus,
.lym-peca__botao.lym-peca__botao:active {
	color: inherit;
	background: none;
	text-decoration: none;
}

/*
 * **O triângulo do `<details>` sai, e a pista é o desenho.** O `display` acima
 * já o apaga no Chrome e no Firefox; o Safari desenha o dele por este
 * pseudoelemento.
 */
.lym-peca__botao.lym-peca__botao::-webkit-details-marker {
	display: none;
}

.lym-peca__botao.lym-peca__botao:focus-visible {
	outline: 2px solid var( --lym-link );
	outline-offset: 2px;
}

/*
 * **A palavra de quem aponta com o mouse ganha o sublinhado**, a mesma resposta
 * ao gesto do perfil do menu — o desenho sozinho não diz que aquilo se clica.
 */
.lym-peca__botao.lym-peca__botao:hover .lym-peca__texto,
.lym-peca .lym-sino.lym-sino:hover .lym-sino__texto {
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

/*
 * **Largura e altura também estão escritas no SVG**, e não é redundância: numa
 * página montada no construtor a folha chega no rodapé, e um `<svg>` sem
 * tamanho nasce do tamanho da tela até ela chegar.
 */
.lym-peca__desenho,
.lym-peca .lym-sino__icone {
	display: block;
	flex: none;
	width: 22px;
	height: 22px;
}

/*
 * A foto de quem entrou. A classe dobrada vence o `img { height: auto;
 * max-width: 100% }` do tema e do Elementor, que a deixaria oval.
 */
.lym-peca__foto.lym-peca__foto {
	display: block;
	flex: none;
	width: 22px;
	height: 22px;
	max-width: none;
	margin: 0;
	border: 0;
	border-radius: 50%;
	object-fit: cover;
}

.lym-peca__texto,
.lym-peca .lym-sino__texto {
	font-size: 0.75rem;
	line-height: 1.2;
	white-space: nowrap;
}

/*
 * **O sino em pé.** O dele é deitado, com a palavra ao lado; aqui a palavra vai
 * para baixo do desenho e a bolinha do número sobe para o canto do ícone, como
 * no menu empilhado. A palavra NÃO some na tela estreita — a regra de 560px que
 * a esconde existe para o sino ao lado da foto e do nome, que dão o contexto;
 * aqui a palavra é metade da peça.
 */
.lym-peca .lym-sino.lym-sino {
	flex-direction: column;
	justify-content: center;
	gap: 0.2rem;
	padding: 0 0.25rem;
}

.lym-peca .lym-sino__conta {
	top: -2px;
	left: 55%;
}

.lym-peca .lym-sino__texto {
	position: static;
	width: auto;
	height: auto;
	max-width: none;
	overflow: visible;
	clip-path: none;
	text-overflow: clip;
}

/*
 * **Na tela estreita a palavra encolhe um pouco, e o recheio do lado também** —
 * é a conta da fileira do evento: num telefone de 360px o nome de quem assina e
 * as três peças precisam caber na mesma linha, sem o nome ser cortado nem
 * quebrar. Medido no Chrome com a página de verdade e a fonte dela carregada,
 * com a palavra em 11px e 2px de recheio de cada lado: a fileira cabe numa linha
 * a partir de 352px, e a 360px sobram 8px. Abaixo de 352px o nome quebra em duas
 * linhas, inteiro — é o último recurso, e não o corte com reticências.
 */
@media ( max-width: 400px ) {
	.lym-peca__texto,
	.lym-peca .lym-sino__texto {
		font-size: 0.6875rem;
	}

	.lym-peca__botao.lym-peca__botao,
	.lym-peca .lym-sino.lym-sino {
		padding: 0 0.125rem;
	}
}

.lym-peca__menu {
	margin: 0;
	padding: 0;
}

/*
 * **O menu do compartilhar é um painel, e tem as três camadas do painel do
 * sino**: a cor medida da página como base (`--lym-painel`, que o script
 * escreve ao abrir), o cinza translúcido por cima e a borda medida contra a
 * página. Sem a base opaca o texto de baixo apareceria através dele.
 *
 * **Ele pende da DIREITA da peça**, porque cresce por cima do nome de quem
 * assina, que está à esquerda; o script o vira para a esquerda quando sairia
 * pela borda da tela. O `z-index` é o do painel do sino, pela mesma razão: o
 * tocador de vídeo do cliente empilha em números desse tamanho.
 */
.lym-peca__painel {
	position: absolute;
	top: 100%;
	right: 0;
	z-index: 2147482998;

	display: flex;
	flex-direction: column;
	gap: 0.15rem;

	min-width: 11rem;
	margin-top: 0.35rem;
	padding: 0.35rem;

	border: 1px solid rgba( 128, 128, 128, 0.92 );
	border-radius: 12px;
	background-color: var( --lym-painel, Canvas );
	background-image: linear-gradient(
		rgba( 128, 128, 128, 0.12 ),
		rgba( 128, 128, 128, 0.12 )
	);

	box-shadow:
		0 0 0 1px rgba( 128, 128, 128, 0.16 ),
		0 10px 28px rgba( 0, 0, 0, 0.28 );

	text-align: left;
}

/*
 * Cada opção é uma linha inteira clicável, com 44px de altura, e a resposta ao
 * gesto é o fundo — a pista de que a linha se clica.
 */
.lym-peca__opcao.lym-peca__opcao {
	display: flex;
	align-items: center;
	gap: 0.6rem;

	width: 100%;
	min-height: 44px;
	margin: 0;
	padding: 0 0.6rem;

	border: 0;
	border-radius: 8px;
	background: none;

	color: inherit;
	font: inherit;
	font-size: 0.875rem;
	line-height: 1.2;
	text-align: left;
	text-decoration: none;
	white-space: nowrap;

	cursor: pointer;
}

.lym-peca__opcao.lym-peca__opcao:hover,
.lym-peca__opcao.lym-peca__opcao:focus,
.lym-peca__opcao.lym-peca__opcao:active {
	color: inherit;
	background: rgba( 128, 128, 128, 0.18 );
	text-decoration: none;
}

.lym-peca__opcao.lym-peca__opcao:focus-visible {
	outline: 2px solid var( --lym-link );
	outline-offset: -2px;
}

.lym-peca__marca {
	display: block;
	flex: none;
	width: 18px;
	height: 18px;
}


/* ---------------------------------------------------------------------------
 * A caixa de escrever.
 *
 * **Uma linha que cresce, com os dois botões à direita.** A versão anterior
 * nascia com três linhas de altura: uma caixa enorme e vazia no alto da
 * conversa, empurrando tudo para baixo antes de alguém ter escrito uma palavra.
 *
 * Os botões ficam FORA do campo. Dentro, eles disputariam o espaço do texto numa
 * tela estreita — e fora é onde o plugin de terceiro os põe, que é o arranjo que
 * a turma já sabe usar.
 * ------------------------------------------------------------------------- */

/*
 * **O vão embaixo caiu de 1,5rem para 1rem em 19/09/2026**, no mesmo pedido do
 * respiro de cima da conversa. Não desce mais que isso de propósito: embaixo
 * vem o número de mensagens, que é o TÍTULO da lista, e colado na caixa ele
 * passaria a ler como legenda dela. Medido na `/video1/` a 1920px: 24px entre a
 * caixa e o número, agora 16px — e outros 11px saíram com o botão "Ordenar"
 * desligado de fábrica (1.104.0), que tem 44px de alvo e empurrava o número para
 * baixo pela linha de base. No bate-papo quem manda é a regra `--papo`.
 */
.lym-escrever {
	margin: 0 0 1rem;
}

.lym-escrever__linha {
	display: flex;
	align-items: flex-end;
	gap: 0.25rem;
}

/*
 * **A coluna da direita, e ela existe mesmo quando tem um botão só.**
 *
 * Com o texto passando de uma linha, o script move para cá o botão da imagem e o
 * do microfone: eles saem de dentro da caixa e devolvem ao texto a largura dos
 * dois. Pedido do dono do site em 06/09/2026 — "a caixa de texto fica com menos
 * espaço".
 *
 * **Os botões ficam juntos, e quem acompanha o pé do outro é a CAIXA.** A fileira
 * é `align-items: flex-end`, e a altura dela é a do item mais alto — que com três
 * botões empilhados é esta coluna: 44 + 4 + 44 + 4 + 44 = 140px. Uma caixa de duas
 * linhas tem 66px, então **sobram uns 74px de vazio acima dela**, e isso vale de
 * duas até cinco linhas de texto (na sexta a caixa passa dos 140px e o vazio some).
 * Medido em navegador, e está escrito aqui porque a primeira versão deste
 * comentário afirmava o contrário — que a coluna é que acompanhava a caixa.
 *
 * **É o preço do arranjo que o dono do site desenhou**, e ele o viu medido: três
 * alvos de 44px não cabem ao lado de uma caixa de duas linhas de jeito nenhum. As
 * duas saídas foram apresentadas com o custo — só trocar de lado numa caixa alta
 * (mas aí o ganho chega tarde), ou pôr a imagem e o microfone lado a lado acima do
 * enviar (mas aí a coluna fica com 92px de largura e devolve ao texto 40px em vez
 * de 88px). Ficou como está.
 *
 * Espalhar os três pela altura inteira foi descartado: a caixa cresce até `40vh`,
 * e numa mensagem longa o enviar fugiria do polegar, longe do texto que a pessoa
 * acabou de escrever.
 */
.lym-escrever__coluna {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.25rem;
	flex: 0 0 auto;
}

/*
 * **Sem nada para mostrar, a coluna SOME — e o `display: none` do botão sozinho
 * não bastava.**
 *
 * Sem texto e sem arquivo o enviar já era escondido, e aí ele deixa de ser item de
 * flex e o respiro ao lado dele desaparece junto. Com a coluna no meio, ela
 * continua sendo um item de largura zero — e o `gap` de 0,25rem da fileira
 * continua valendo, comendo quatro pixels da caixa em repouso, que é o estado em
 * que a conversa passa a maior parte do tempo.
 *
 * A primeira condição é a MESMA do botão, de propósito: duas perguntas diferentes
 * para "há o que enviar?" é como as duas começam a discordar. E os dois botões que
 * viajam nunca estão aqui neste estado — eles só saem da caixa com texto escrito,
 * e com texto a coluna aparece.
 */
.lym-escrever--js:not( .lym-escrever--tem-texto ):not( .lym-escrever--tem-arquivo ) .lym-escrever__coluna {
	display: none;
}

/*
 * **O enviar tem uma SEGUNDA condição de sumir, e a coluna precisava dela: com a
 * barra de gravação no ar, quem envia é o botão da barra.** Copiando só a primeira,
 * a coluna ficava visível e VAZIA durante a gravação de quem já tinha escrito uma
 * linha, comendo de novo os quatro pixels que a regra de cima existe para matar.
 * Achado por revisão adversária em 06/09/2026.
 *
 * **O `:not( --fora )` é o que impede o conserto de virar um defeito bem pior.**
 * Com o texto passando de uma linha, os dois ícones estão AQUI DENTRO — e o
 * microfone é o botão de PARAR a gravação. Escondendo a coluna sem essa guarda,
 * quem gravasse depois de escrever um parágrafo ficaria com o microfone aberto e
 * sem nenhum botão na tela para fechá-lo.
 */
.lym-escrever--com-barra:not( .lym-escrever--fora ) .lym-escrever__coluna {
	display: none;
}

/*
 * O rótulo existe para leitor de tela: o texto de dentro do campo some quando a
 * pessoa começa a escrever. `display: none` o tiraria da árvore de
 * acessibilidade junto, que é o oposto do que ele existe para fazer.
 */
.lym-escrever__rotulo,
.lym-escrever__so-leitor {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset( 50% );
	white-space: nowrap;
}

/*
 * Classe dobrada para empatar com o tema sem "!important": o tema do cliente
 * pinta campo de formulário, e um campo com a altura dele engoliria o desenho
 * inteiro desta caixa.
 */
.lym-escrever__campo.lym-escrever__campo {
	flex: 1 1 auto;
	min-width: 0;

	box-sizing: border-box;
	margin: 0;

	/*
	 * **A calha lateral saiu, e quem a faz agora são os dois ícones.** Eles
	 * ficam DENTRO da caixa, um de cada lado, e cada um já ocupa 44px — repetir
	 * `1rem` aqui somaria uma calha à outra e o texto começaria longe demais da
	 * borda. A vertical fica, porque é ela que entra na conta da altura.
	 */
	padding: 0.7rem 0;

	/*
	 * Uma linha de texto mais o respiro de cima e de baixo. O script faz a caixa
	 * crescer conforme se escreve; sem ele, a barra de rolagem do campo resolve.
	 *
	 * **A altura é CALCULADA das três medidas, e não escolhida.** Era `2.9rem`,
	 * e a conta não fechava por quatro décimos de pixel: com `border-box`, a
	 * altura precisa caber a linha (1.4em de `line-height`), a calha de cima e
	 * de baixo (0.7rem cada) e a borda (1px de cada lado). Num corpo de 16px
	 * são 46,8px contra os 46,4px declarados.
	 *
	 * O sintoma era desproporcional à conta: com `overflow-y: auto`, quatro
	 * décimos de pixel a mais de conteúdo bastam para o navegador desenhar a
	 * BARRA DE ROLAGEM — e ela aparecia com o campo VAZIO, um controle de setas
	 * espremido ao lado do botão de imagem, sem nada para rolar.
	 *
	 * Em `em` e `rem` porque o corpo do texto é do tema (`font: inherit`): um
	 * número fixo volta a não fechar no primeiro tema que use outro tamanho.
	 *
	 * **A borda saiu da conta porque saiu do campo.** Ela mora agora em
	 * `.lym-campo`, a caixa que envolve os dois ícones e o texto — e uma borda
	 * contada duas vezes traz de volta exatamente a barra de rolagem que esta
	 * conta existe para evitar. São dois termos agora, não três.
	 */
	min-height: calc( 1.4em + 1.4rem );
	height: calc( 1.4em + 1.4rem );
	max-height: 40vh;

	border: 0;
	background: transparent;
	color: inherit;

	font: inherit;

	/*
	 * **Um pouco menor que o corpo do tema, a pedido do dono do site.** Ele
	 * herda a fonte da página (`font: inherit`), e num tema de 16px a frase de
	 * dentro do campo saía do tamanho de um parágrafo — grande demais para uma
	 * caixa de uma linha, e num balão estreito ela quebrava em duas.
	 *
	 * A altura acompanha sozinha: ela é `calc( 1.4em + 1.4rem )`, e o `em` é
	 * deste campo. Um número fixo aqui traria de volta a barra de rolagem que
	 * aquela conta existe para evitar.
	 */
	font-size: 0.9375rem;

	line-height: 1.4;
	resize: none;
	overflow-y: auto;
}

/*
 * **No toque a letra do campo vai a 16px, e o computador fica nos 15px pedidos.**
 * O Safari do iPhone dá zoom na página inteira quando alguém toca num campo com
 * letra abaixo de 16px: a conversa cresce, e para voltar é preciso apertar os
 * dedos. Nada a ver com gosto — é o limiar do navegador.
 *
 * `pointer: coarse` pergunta pelo ponteiro PRINCIPAL, como o alvo de 44px das
 * ações: um notebook com tela de toque tem mouse como principal e continua nos
 * 15px, e um tablet largo continua sendo dedo.
 *
 * **Os 16px são piso, e não conta em `rem`.** Um tema que declara a raiz em
 * 62,5% faz `1rem` valer 10px, e o zoom voltaria; `max()` guarda o tamanho do
 * tema quando ele é maior. O `16px` de cima é para o navegador que não conhece
 * `max()` — ele descarta a segunda linha e fica com a primeira. A altura do campo
 * acompanha sozinha, porque é `em` deste campo.
 *
 * Três classes porque `@media` não soma peso: com duas, a regra empataria com a
 * de cima e venceria só por vir depois.
 */
@media ( pointer: coarse ) {
	.lym-escrever__campo.lym-escrever__campo.lym-escrever__campo {
		font-size: 16px;
		font-size: max( 16px, 0.9375rem );
	}
}

/*
 * **O mesmo piso de 16px nas telas de CONTA, pela mesma razão do navegador.**
 * A caixa de escrever ganhou este piso na 1.83.0 e as telas de conta ficaram de
 * fora — e são elas que todo comprador atravessa: criar a senha, entrar, esqueci
 * a senha, Minha conta. Com `font: inherit`, um tema de letra pequena (ou de raiz
 * em 62,5%) devolve o campo para baixo dos 16px e o Safari do iPhone amplia a
 * página inteira no toque, no meio do cadastro.
 *
 * **`max()` guarda o tema quando ele é maior**, e o `16px` de cima atende o
 * navegador que não conhece `max()`. A classe é DOBRADA porque a regra base pesa
 * (0,2,1) — uma classe, um elemento e uma etiqueta — e `@media` não soma peso
 * nenhum.
 */
@media ( pointer: coarse ) {
	.lym-forma.lym-forma input[type="text"],
	.lym-forma.lym-forma input[type="email"],
	.lym-forma.lym-forma input[type="tel"],
	.lym-forma.lym-forma input[type="date"],
	.lym-forma.lym-forma input[type="password"],
	.lym-conta__bloco.lym-conta__bloco input[type="text"],
	.lym-conta__bloco.lym-conta__bloco input[type="email"],
	.lym-conta__bloco.lym-conta__bloco input[type="tel"],
	.lym-conta__bloco.lym-conta__bloco input[type="date"],
	.lym-conta__bloco.lym-conta__bloco input[type="password"] {
		font-size: 16px;
		font-size: max( 16px, 1rem );
	}
}

/*
 * **A calha da direita, para quando os dois ícones saem da caixa.**
 *
 * O campo não tem recheio lateral nenhum (`padding: 0.7rem 0`), e está certo
 * enquanto os botões de 44px estão lá: são eles que afastam a primeira e a última
 * letra das bordas arredondadas. Com os dois da direita na coluna, a última letra
 * passava a encostar na borda — medido em navegador: 1px de folga à direita contra
 * 45px à esquerda. Achado por revisão adversária em 06/09/2026.
 *
 * **A classe é dobrada porque a base também é.** `.lym-escrever__campo` está
 * escrita duas vezes na regra de cima (0,2,0); um ancestral de classe única mais
 * a classe daria (0,2,0) também, e o empate se resolveria pela ordem no arquivo —
 * que é a coisa mais fácil de mudar sem querer.
 */
.lym-escrever--fora .lym-escrever__campo.lym-escrever__campo {
	padding-right: 0.7rem;
}

/*
 * **O anel de foco é da CAIXA, e não do campo.** Com a borda no envoltório, um
 * contorno no `textarea` desenharia um retângulo por dentro do arredondado —
 * duas bordas concêntricas, e a de dentro quadrada.
 */
.lym-escrever__campo.lym-escrever__campo:focus {
	outline: none;
}

/* ---------------------------------------------------------------------------
 * A RÉPLICA DA CAIXA, para quem não entrou
 *
 * **Ela reusa `.lym-escrever` e `.lym-campo` inteiros**, e por isso quase não
 * declara nada: o desenho é o mesmo porque as classes são as mesmas. O que muda
 * é a tag de cada peça — todas são `<a>` para o login.
 * ------------------------------------------------------------------------- */

/*
 * O campo é um `<a>`, e link é `inline` por natureza: sem virar caixa, a altura
 * que `.lym-escrever__campo` declara não vale, e a palavra encosta no topo.
 *
 * **E ela NÃO é esmaecida para imitar o texto de espera do campo real.** Aquele
 * é o cinza padrão do navegador sobre um campo que a pessoa vai preencher; este
 * é o rótulo do único link da tela. Discrição feita com transparência custa
 * contraste — e aqui a peça que se apagaria é a que convida.
 */
.lym-escrever__campo--convite.lym-escrever__campo--convite {
	display: flex;
	align-items: center;

	text-decoration: none;
}

/*
 * **A pista de que a caixa inteira é clicável.** Ela é feita de links com classe
 * nossa, e a regra da casa é que esses tenham pista própria — aqui a borda do
 * campo responde ao gesto, do mesmo jeito que `.lym-forma input:focus` já faz.
 * O `focus-within` é o que dá a mesma pista a quem navega por teclado.
 */
.lym-escrever--convite .lym-campo {
	transition: border-color 0.15s ease;
}

.lym-escrever--convite:hover .lym-campo,
.lym-escrever--convite:focus-within .lym-campo {
	border-color: currentColor;
}

/* ---------------------------------------------------------------------------
 * A caixa de escrever: os dois ícones DENTRO, o texto entre eles.
 *
 * **`align-items: flex-end` é o que ancora os ícones embaixo quando o campo
 * cresce.** Escrevendo cinco linhas, o texto sobe e os dois botões continuam
 * rentes à base — que é o arranjo do aplicativo de mensagens que a turma já
 * conhece. Com `center` eles flutuariam no meio de um bloco alto.
 * ------------------------------------------------------------------------- */
.lym-campo {
	display: flex;
	align-items: flex-end;
	flex: 1 1 auto;
	min-width: 0;

	box-sizing: border-box;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	background: var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) );
}

/*
 * O foco marca a caixa inteira, e é a única pista de que ali se escreve.
 * `:focus-within` porque quem recebe o foco é o `textarea` lá dentro.
 *
 * **Ele responde ganhando PRESENÇA, e não trocando de cor.** A borda era
 * pintada com a cor de ação: num site cujo destaque já é vermelho, o campo
 * ficava vermelho ao lado de um enviar vermelho e de um índice vermelho — e a
 * regra desta casa é que cor diz "este, entre tudo o que está na tela", o que
 * deixa de valer quando tudo tem o mesmo tom.
 *
 * O cinza de 0,92 não é escolhido: é o mesmo que a borda do botão e a do painel
 * de avisos usam, medido em 3,45:1 no branco e 4,18:1 no quase-preto. Sair de
 * 0,25 para 0,92 é a borda passando de quase invisível a nítida, que é uma
 * mudança maior do que trocar o matiz.
 */
.lym-campo:focus-within {
	border-color: rgba( 128, 128, 128, 0.92 );
}

/*
 * Os dois controles de dentro: o emoji à esquerda, a imagem à direita.
 *
 * **Eles são a calha lateral do texto**, e por isso não têm margem: os 44px de
 * cada um já afastam a primeira letra da borda arredondada. Um `padding` no
 * campo somaria as duas coisas.
 *
 * **44px de ALTURA clicável**, que é a regra da casa — e a altura, não a
 * largura, é o que costuma faltar.
 */
.lym-campo__acao.lym-campo__acao {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	height: 44px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 50%;
	background: transparent;

	/*
	 * **A cor do texto, DECLARADA, e não herdada por acaso.**
	 *
	 * O microfone e a câmera têm cor própria logo abaixo; o emoji não tinha
	 * nenhuma, e a classe também não declarava. Sem declaração o botão não
	 * herda: ele fica com o que o tema do CLIENTE pinta em `button` — e num
	 * site cujo destaque é vermelho, o rostinho saía vermelho, ao lado de um
	 * enviar que já é vermelho sólido.
	 *
	 * `inherit` aqui alcança qualquer botão futuro desta fileira: o padrão
	 * passa a ser a cor do texto, e quem quiser outra escreve por atributo,
	 * como os dois de baixo fazem.
	 */
	color: inherit;
	opacity: 1;

	cursor: pointer;

	/* Nada vaza deste círculo — é a rede do botão do microfone, pela mesma razão. */
	overflow: hidden;
	white-space: nowrap;
}

.lym-campo__acao.lym-campo__acao:hover,
.lym-campo__acao.lym-campo__acao:focus,
.lym-campo__acao.lym-campo__acao:active {
	background: rgba( 128, 128, 128, 0.18 );
	opacity: 1;
}

.lym-campo__acao svg {
	width: 22px;
	height: 22px;
}

/*
 * **O botão de emoji nasce escondido, e quem o esconde já está escrito.** A
 * regra geral de `[hidden]` lá em cima cita o atributo TRÊS vezes justamente
 * para vencer qualquer `display` de classe — repeti-la aqui seria uma segunda
 * regra dizendo o que a primeira já diz, e a segunda é a que um dia deixa de
 * receber a correção da outra.
 */

/* ---------------------------------------------------------------------------
 * A gaveta de emoji.
 *
 * **Ela EMPURRA, e não flutua.** Um painel posicionado seria a cópia do sino, e
 * pagaria três coisas que esta peça não precisa: uma quarta medição do fundo da
 * página (cobrindo a conversa, ele teria de ser opaco), mais um degrau na escada
 * de `z-index` que existe para não ficar embaixo do tocador de vídeo do cliente,
 * e o risco de ser CORTADO por um `overflow: hidden` de um ancestral que não é
 * nosso — a conversa mora dentro do que o construtor de páginas montou.
 *
 * Ocupando lugar, ela herda o mesmo fundo translúcido e a mesma borda do campo
 * de escrever: é a continuação da caixa, e não uma superfície por cima dela.
 * ------------------------------------------------------------------------- */
.lym-emoji {
	margin-top: 0.5rem;

	/*
	 * `.lym-escrever` é BLOCO, e não flex: a gaveta empilha embaixo da linha do
	 * campo por fluxo normal, e a largura dela é a da caixa. Houve aqui um
	 * `min-width: 0` justificado por um flex que não existe — a linha era
	 * inerte, e a explicação mandaria a leitura seguinte para o lugar errado.
	 */
	max-width: 100%;

	box-sizing: border-box;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: var( --lym-raio, 14px );
	background: var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) );

	/* O raio da caixa corta as pontas da fileira de abas. */
	overflow: hidden;
}

/*
 * A fileira de categorias.
 *
 * **Ela rola na horizontal, e é a peça que pode rolar.** São nove abas de 44px:
 * num celular estreito elas não cabem, e a regra da casa é que a rolagem lateral
 * nunca pode ser da PÁGINA.
 *
 * Quem a segura é ela mesma ser um bloco — a largura sai da gaveta, que sai da
 * caixa de escrever —, e o `overflow-x` mandar o excedente rolar aqui dentro. O
 * `overflow: hidden` da gaveta não tem parte nisto: ele existe para o raio da
 * borda cortar as pontas da fileira.
 */
.lym-emoji__abas {
	display: flex;
	overflow-x: auto;

	border-bottom: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
}

/*
 * Cada aba, com os mesmos 44px de altura clicável do resto do compositor.
 *
 * **A aba escolhida ganha PRESENÇA; a não escolhida não perde nada.** A tentação
 * aqui é apagar as outras com `opacity`, e opacidade não enfraquece cor: ela
 * troca a cor pela mistura com o fundo. Oito abas apagadas seriam oito alvos com
 * menos contraste que o mínimo, para marcar uma.
 */
.lym-emoji__aba.lym-emoji__aba {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	height: 44px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 0;
	background: transparent;
	color: inherit;
	opacity: 1;

	font: inherit;
	line-height: 1;
	cursor: pointer;
}

.lym-emoji__aba.lym-emoji__aba:hover,
.lym-emoji__aba.lym-emoji__aba:focus {
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
}

.lym-emoji__aba.lym-emoji__aba[aria-pressed="true"] {
	background: rgba( 128, 128, 128, 0.28 );
	box-shadow: inset 0 -2px 0 currentColor;
}

.lym-emoji__aba:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: -2px;
}

/*
 * O desenho da aba é um emoji, e não um SVG.
 *
 * **É a única peça do plugin cujo ícone vem da fonte do sistema**, e a razão é
 * que ele nomeia um conjunto de figurinhas: nove SVGs desenhados à mão diriam
 * pior o que um rostinho diz de imediato. `line-height: 1` porque a caixa de um
 * emoji é mais alta que a de uma letra, e sem isso ela empurra os 44px.
 */
.lym-emoji__icone {
	font-size: 22px;
	line-height: 1;
}

/*
 * A grade.
 *
 * **O teto e a rolagem andam juntos**, e o teto é em `vh` porque quem manda é a
 * altura da tela: num celular deitado, uma grade de altura fixa empurraria o
 * campo de escrever para fora da janela.
 *
 * Sem `gap` — e a folha o usa em outros lugares, então a escolha é desta peça e
 * não da casa. No flex ele só existe a partir do Safari 14.1: numa fileira de
 * dois ou três itens, perdê-lo é um detalhe que ninguém nota; numa grade de
 * centenas, é a diferença entre uma grade e um borrão. Os 44px de alvo já
 * separam o suficiente.
 */
.lym-emoji__grade {
	display: flex;
	flex-wrap: wrap;

	max-height: 30vh;
	overflow-y: auto;

	padding: 0.25rem;
}

/*
 * Cada figurinha.
 *
 * **É a única classe deste bloco que o script cria**, e por isso ela é a única
 * que o vigia de classe órfã não enxerga: aquele varre as views. Existe uma
 * asserção própria para ela, e o motivo dela está escrito lá.
 */
.lym-emoji__item.lym-emoji__item {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	height: 44px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 8px;
	background: transparent;
	color: inherit;
	opacity: 1;

	font-size: 24px;
	line-height: 1;
	cursor: pointer;
}

.lym-emoji__item.lym-emoji__item:hover,
.lym-emoji__item.lym-emoji__item:focus {
	background: rgba( 128, 128, 128, 0.22 );
	color: inherit;
}

.lym-emoji__item:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: -2px;
}

/*
 * O recado de quando ainda não há recentes.
 *
 * Ele não é pintado com cor nenhuma: um recado que só explica não é um aviso, e
 * a cor de ação existe para dizer "este, entre tudo o que está na tela".
 */
.lym-emoji__vazio {
	margin: 0;
	padding: 1rem;

	font-size: 0.9em;
	text-align: center;
}

/*
 * O campo de arquivo nativo sai da tela e quem abre o seletor é o rótulo. O
 * botão cinza que o navegador desenha não aceita estilo em navegador nenhum, e
 * era a peça mais feia da tela.
 *
 * `opacity: 0` e não `display: none`: escondido de verdade ele deixa de ser
 * focável por teclado, e quem navega assim perderia o anexo.
 */
.lym-escrever__arquivo {
	position: absolute;
	width: 1px;
	height: 1px;
	opacity: 0;
	pointer-events: none;
}

/*
 * **Gravando é o MESMO botão em outro estado**, e não outro conteúdo. O
 * script escrevia "Parar a gravação" por cima do ícone: o texto virava um
 * item de flex dentro do círculo de 44px, quebrava em duas linhas e vazava
 * por cima do campo de escrever ao lado — e ao parar o ícone não voltava.
 *
 * O quadrado é a convenção universal de "parar", e ele é um elemento próprio
 * pela mesma razão que o triângulo da onda sonora: o leitor de tela
 * reanunciaria a peça inteira se o conteúdo do botão mudasse. Quem muda é o
 * `aria-label`.
 */
.lym-escrever__parada {
	display: none;
	width: 14px;
	height: 14px;
	background: currentColor;
	border-radius: 2px;
}

.lym-campo__acao--gravando .lym-escrever__parada {
	display: block;
}

.lym-campo__acao--gravando svg {
	display: none;
}

/*
 * O bloco da voz não é peça de layout: ele agrupa o botão com os campos
 * escondidos. Sem `display: contents` viraria mais uma caixa entre os dois
 * ícones, e eles deixariam de ficar juntos.
 */
.lym-escrever__voz {
	display: contents;
}

/*
 * **O rodapé só existe quando há o que enviar.** Um botão parado embaixo de uma
 * caixa vazia é ruído numa tela cuja única coisa a fazer é ler.
 *
 * Quem o mostra é o `:focus-within`, e não o script: assim funciona sem
 * JavaScript nenhum. A classe `--ativo` é do script, e serve para o botão não
 * sumir quando a pessoa clica fora com o texto já escrito.
 */
.lym-escrever__rodape {
	display: none;

	align-items: center;
	gap: 0.75rem;

	margin: 0.5rem 0 0;
}

.lym-escrever:focus-within .lym-escrever__rodape,
.lym-escrever--ativo .lym-escrever__rodape {
	display: flex;
}

.lym-escrever__estado {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;

	font-size: 0.8125rem;
	opacity: 0.75;
}


/* ---------------------------------------------------------------------------
 * O botão de fora, que se reveza: microfone enquanto não há texto, enviar
 * assim que houver.
 *
 * **Um lugar só, e é isso que torna a exclusividade óbvia sem explicar.** Áudio
 * e texto não viajam juntos; com dois botões lado a lado a pessoa tentaria os
 * dois e descobriria a regra por uma recusa.
 *
 * **Quem aparece SEM script é o enviar**, e a ordem importa: o microfone nasce
 * com `hidden` e só o script o revela, então a ausência de JavaScript deixa o
 * enviar sozinho — que é justamente o caminho que funciona sem script. O
 * inverso deixaria quem está sem script sem como enviar.
 * ------------------------------------------------------------------------- */
.lym-escrever__enviar.lym-escrever__enviar {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	height: 44px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 50%;
}

.lym-escrever__enviar.lym-escrever__enviar svg {
	width: 22px;
	height: 22px;
}

/*
 * **A troca é do SCRIPT, e ele se anuncia.** A classe `--js` no invólucro é o
 * que diz "há quem faça a troca"; sem ela nada aqui casa, e a tela fica com o
 * enviar de sempre. É o mesmo idioma do `lym-arquivo--js`, que apaga o texto
 * nativo do campo de arquivo só depois de haver quem o reponha.
 */
/*
 * **São DUAS condições, e a segunda foi paga duas vezes.** O enviar volta quando
 * há texto OU quando há arquivo escolhido — e uma mensagem de voz não tem texto
 * nenhum. Só com a primeira, a pessoa gravava, o áudio entrava no campo, e não
 * havia como mandá-lo: o lugar do enviar continuava ocupado pelo microfone. O
 * conserto perguntou só pelo ÁUDIO, e a foto sem legenda ficou sem botão até
 * 17/09/2026 — a pessoa via a miniatura e só achava o enviar digitando uma letra.
 */
.lym-escrever--js:not( .lym-escrever--tem-texto ):not( .lym-escrever--tem-arquivo ) .lym-escrever__enviar.lym-escrever__enviar {
	display: none;
}

/*
 * **O microfone NÃO some mais quando há texto, e a mudança é de produto.** Áudio
 * e texto eram exclusivos; passaram a poder viajar juntos, pela mesma razão que
 * imagem e texto sempre puderam. Escondê-lo deixaria a pessoa sem como gravar
 * depois de escrever uma palavra — e ela teria de apagar tudo para o botão
 * voltar.
 *
 * Foi isso que levou o microfone para DENTRO do campo, ao lado da imagem: ele
 * virou o que a câmera sempre foi — um anexo, sempre à mão. Fora sobrou só o
 * enviar.
 */

/*
 * O título da conversa ganha a régua embaixo, que é o que o separa do resto sem
 * precisar de uma linha atravessando a página inteira.
 */
.lym-conversa__titulo {
	display: inline-block;
	padding-bottom: 0.4rem;
	/*
	 * O traço abaixo do título é uma RÉGUA, e não uma ação: ele separa a
	 * conversa do conteúdo acima. Em vermelho ele lia como se o título fosse
	 * clicável, e era o terceiro vermelho da mesma tela.
	 */
	border-bottom: 2px solid rgba( 128, 128, 128, 0.45 );
}

/* ---------------------------------------------------------------------------
 * O "Leia mais" de uma mensagem longa.
 *
 * **O corte só existe quando o script pode desfazê-lo.** A classe que corta é
 * acrescentada por JavaScript, nunca pelo PHP: sem script, o texto sai inteiro.
 * Cortar no servidor prenderia a mensagem atrás de um botão que ninguém consegue
 * apertar — e o degrado passaria a ser MENOS conteúdo, que é o lado errado.
 * ------------------------------------------------------------------------- */

.lym-comentario__texto--cortado {
	position: relative;

	/*
	 * Cerca de cinco linhas. O suficiente para saber se a mensagem interessa, e
	 * pouco o bastante para vinte delas caberem na tela — que é o problema que o
	 * corte existe para resolver numa conversa de mil e novecentas.
	 */
	max-height: 7.5em;
	overflow: hidden;
}

/*
 * O esmaecimento no pé diz que tem mais coisa embaixo, sem precisar de palavra.
 * `transparent` é escrito como a cor do fundo com alfa zero porque o Safari
 * antigo interpola a palavra `transparent` passando pelo preto, e a faixa saía
 * com uma sombra suja no meio.
 */
.lym-comentario__texto--cortado::after {
	content: "";

	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 2.5em;

	background: linear-gradient( rgba( 128, 128, 128, 0 ), var( --lym-fundo, rgba( 128, 128, 128, 0.08 ) ) );
	pointer-events: none;
}

.lym-comentario__mais.lym-comentario__mais {
	display: inline-flex;
	align-items: center;

	/* O alvo de toque inteiro: um link de uma linha tem metade do que um dedo pede. */
	min-height: 44px;

	margin: 0;
	padding: 0;

	border: 0;
	background: none;
	color: inherit;

	/*
	 * **O sublinhado nasce com ele, e não só no gesto.** Este é um `<button>`,
	 * então regra de link nenhuma o alcança — e sem cor própria ele virava uma
	 * frase igual ao texto da mensagem logo acima. Num celular não existe
	 * ponteiro: o estado de repouso é o único estado que a maioria vê.
	 */
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;

	font: inherit;
	cursor: pointer;
}

.lym-comentario__mais.lym-comentario__mais:hover,
.lym-comentario__mais.lym-comentario__mais:focus {
	background: none;
	text-decoration: underline;
	text-decoration-thickness: 2px;
}

/* ---------------------------------------------------------------------------
 * A fileira de ações de um comentário, e a edição.
 *
 * Curtir, responder, editar e apagar dividem a mesma fileira e o mesmo desenho.
 * Cada uma é um formulário ou um link de verdade: sem JavaScript todas
 * funcionam recarregando a página.
 * ------------------------------------------------------------------------- */

.lym-comentario__papel {
	/*
	 * **A etiqueta perdeu a pílula e ganhou a cor**, e as duas coisas são a
	 * mesma decisão. O que distingue um papel do outro é a cor, que é escolhida
	 * pelo dono do site e viaja em estilo na linha.
	 *
	 * **Ela mora ao lado do nome desde 18/09/2026**, e não mais embaixo da foto.
	 * Lá ela obrigava a coluna da bolinha a ter a largura de dez letras, e o que
	 * sobrava da coluna virava vazio entre a bolinha e o balão. Ao lado do nome
	 * ela cresceu de 9px para o corpo da marca vizinha: 9px só se justificava
	 * pela coluna estreita, e ao lado de um nome de 14px ela lia como sujeira.
	 *
	 * **Sem `opacity`.** Ela estava em 0,8 e valia quando a etiqueta era um
	 * contorno cinza; sobre uma cor escolhida por outra pessoa, apagar 20% é
	 * mexer numa conta que ninguém refez — e opacidade não enfraquece cor, ela
	 * troca a cor pela mistura com o fundo.
	 *
	 * **E sem CAIXA ALTA.** Maiúscula é cerca de 40% mais larga que minúscula, e
	 * a linha do nome é justamente a que aperta no celular. O que faz a etiqueta
	 * parecer etiqueta continua sendo o tamanho, o peso e a cor.
	 *
	 * **Dentro do balão a conta de contraste é outra**, e ela foi refeita: o
	 * fundo deixou de ser a página e passou a ser o cinza de 14% do balão por
	 * cima dela. No tema escuro os quatro tons continuam acima de 4,9:1; no
	 * claro, o verde cai de 5,02 para 4,28:1 — dívida medida e travada em
	 * `teste-conversa-compacta.php`, e não esquecida.
	 */
	font-size: 0.6875rem;
	font-weight: 700;
	line-height: 1.2;
	white-space: nowrap;

	/*
	 * **A mesma guarda que a marca ao lado já tem**, e pela mesma razão: o
	 * rótulo do papel é escolhido pelo dono do site e pode ser tão comprido
	 * quanto ele quiser. Com `nowrap` e sem teto, ele empurra a linha do nome
	 * para fora — e um elemento que passa da borda dá rolagem lateral à página
	 * inteira, com o sintoma aparecendo longe da causa.
	 */
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

/*
 * **As quatro cores das etiquetas, e por que são estas quatro.**
 *
 * Elas não são inventadas aqui: são os papéis que o plugin já mede nos DOIS
 * temas, e o script sobrescreve com o tom certo depois de ler o fundo real da
 * página. Uma cor nova, escrita em hexadecimal, teria de passar em 4,5:1 contra
 * o claro e contra o escuro — e nenhuma passa nos dois.
 *
 * Quem escolhe qual das quatro é o RÓTULO, na view. A cor que o dono do site
 * escreve em Configurações vence estas: ela sai em estilo na linha, e estilo na
 * linha ganha de regra de folha sem `!important`.
 *
 * **Sem opacidade em nenhuma delas.** Opacidade não enfraquece cor: troca a cor
 * pela mistura com o fundo, e refaria por baixo a conta que estes quatro tons
 * existem justamente por já terem passado.
 */
.lym-comentario__papel[data-lym-papel="0"] {
	color: var( --lym-info );
}

.lym-comentario__papel[data-lym-papel="1"] {
	color: var( --lym-feito );
}

.lym-comentario__papel[data-lym-papel="2"] {
	color: var( --lym-atencao );
}

.lym-comentario__papel[data-lym-papel="3"] {
	color: var( --lym-link );
}

/*
 * As duas marcas que quem modera põe: fixado no alto e assunto encerrado.
 *
 * **Elas dizem por que a tela está diferente**, e não decoram nada. Sem a
 * primeira, uma mensagem antiga no topo parece a ordenação quebrada; sem a
 * segunda, o "Responder" some de um assunto só e não há como saber por quê.
 *
 * **Sem cor própria, e sem fundo.** Elas moram na mesma linha do nome, do
 * papel e do horário: uma cor a mais ali seria o quarto código a aprender, e
 * um fundo escolhido por nós tem chance de apagar a letra no tema de alguém.
 * O que as separa do resto é o traço tracejado — que funciona em qualquer
 * fundo porque é desenhado com a cor do próprio texto.
 *
 * A opacidade é 0,75 e não se multiplica com nada: este elemento não mora
 * dentro de nenhum bloco já apagado. O par de sete achados de opacidade
 * aninhada nasceu exatamente de não conferir isso.
 */
.lym-comentario__marca {
	padding: 0.1rem 0.45rem;

	border: 1px dashed var( --lym-borda, rgba( 128, 128, 128, 0.35 ) );
	border-radius: 999px;

	font-size: 0.6875rem;
	font-weight: 600;
	letter-spacing: 0.02em;
	opacity: 0.75;
	white-space: nowrap;

	/*
	 * O rótulo é escrito por nós e traduzível: numa língua comprida ele não
	 * pode empurrar a linha do nome para fora da largura da conversa.
	 */
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
}

.lym-comentario__acoes {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0 0.35rem;

	margin: 0;

	/*
	 * O recheio do próprio botão já afasta a fileira do texto acima; uma
	 * margem aqui somaria com ele e devolveria a altura que a compactação
	 * acabou de tirar.
	 */
	margin-left: -0.5rem;
}

/*
 * Os formulários de curtir e apagar não são peças de layout: eles existem para
 * carregar o nonce. Sem `display: contents` cada um viraria uma caixa entre os
 * botões, e a fileira deixaria de ser uma fileira.
 */
.lym-comentario__acoes form {
	display: contents;
}

/*
 * Classe dobrada para empatar com o tema sem "!important": o tema do cliente
 * pinta botão e link, e uma ação pintada de vermelho no foco é o defeito que a
 * bolinha de concluir já pagou.
 */
.lym-comentario__acao.lym-comentario__acao {
	display: inline-flex;
	align-items: center;
	gap: 0.3rem;

	/*
	 * **44px é o alvo de DEDO, e ele fica — mas só onde há dedo.**
	 *
	 * Esta fileira se repete em cada mensagem: com 44px de altura numa
	 * conversa compacta, ela passa a ser a peça mais alta do comentário, e
	 * quem lê no computador paga por um alvo que o mouse não precisa. Os 36px
	 * de base são o que os aplicativos de conversa usam nessa mesma fileira.
	 *
	 * A regra da casa continua inteira onde ela nasceu: no toque, logo abaixo,
	 * o alvo volta a 44px. `pointer: coarse` pergunta pelo APARELHO, e não pela
	 * largura — um tablet largo continua sendo dedo, e uma janela estreita no
	 * computador continua sendo mouse.
	 */
	min-height: 2.25rem;
	padding: 0 0.5rem;

	border: 0;
	border-radius: var( --lym-raio, 14px );
	background: none;
	color: inherit;

	font: inherit;
	font-size: 0.75rem;
	font-weight: 600;
	text-decoration: none;
	opacity: 0.75;
	cursor: pointer;
}

@media ( pointer: coarse ) {
	.lym-comentario__acao.lym-comentario__acao {
		min-height: 44px;
	}
}

.lym-comentario__acao.lym-comentario__acao:hover,
.lym-comentario__acao.lym-comentario__acao:focus {
	background: rgba( 128, 128, 128, 0.14 );
	color: inherit;
	opacity: 1;
}

/*
 * **O que já foi curtido é VERDE, e o verde é um par medido** (`--lym-curtido`,
 * 20/09/2026, pedido do Flávio). Era `--lym-link`, o vermelho de ação em texto —
 * e o vermelho, no coração, lê como alerta em vez de gostei.
 *
 * A reserva do `var()` é `currentColor` e não uma cor escrita: sem a folha de
 * variáveis, o botão fica na cor do texto, e a diferença entre curtido e não
 * curtido continua dita pelo ícone preenchido contra vazado.
 */
.lym-comentario__acao--marcada.lym-comentario__acao--marcada {
	color: var( --lym-curtido, currentColor );
	opacity: 1;
}

/*
 * Quem não entrou vê o número, e não um botão. Botão que recusa o clique é pior
 * que botão nenhum.
 */
.lym-comentario__acao--conta.lym-comentario__acao--conta {
	cursor: default;
}

.lym-comentario__acao--conta.lym-comentario__acao--conta:hover {
	background: none;
	opacity: 0.75;
}

.lym-comentario__acao svg {
	width: 16px;
	height: 16px;
	flex: 0 0 auto;
}

.lym-comentario__editar {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 0.5rem;

	margin: 0.5rem 0;
}

/*
 * O campo da edição não é o campo de escrever: aqui a mensagem já existe e pode
 * ser longa, então ele nasce com altura de leitura em vez de uma linha.
 */
.lym-comentario__campo.lym-comentario__campo {
	width: 100%;
	height: auto;
	min-height: 6rem;
	resize: vertical;
}

.lym-comentario__aviso {
	margin: 0;
	font-size: 0.8125rem;
	opacity: 0.75;
}

/*
 * A linha de "respondendo a" fica no alto da caixa de escrever, e some quando
 * não há a quem responder — o atributo `hidden` do HTML, que a folha respeita
 * com a regra de peso triplicado lá no começo.
 */
.lym-escrever__respondendo {
	display: flex;
	align-items: center;
	gap: 0.75rem;

	margin: 0 0 0.5rem;
	font-size: 0.875rem;
	opacity: 0.85;
}

/* ---------------------------------------------------------------------------
 * O cabeçalho da lista: quantas mensagens, e em que ordem.
 * ------------------------------------------------------------------------- */

/*
 * **O botão de ordenar fica ao LADO do número, e não colado na borda direita.**
 *
 * Com `space-between` ele ia para a outra ponta da tela: numa largura de
 * computador, o olho lia "2 comentários", atravessava um palmo de vazio e só
 * então encontrava a ação. Duas coisas que se leem juntas ficam juntas.
 *
 * **E ele NUNCA desce para a linha de baixo** (16/09/2026). Com `flex-wrap:
 * wrap`, num telefone de 360px o número e o botão somavam uns 327px numa coluna
 * de 320, e o navegador mandava o botão inteiro para baixo — foi o que o Flávio
 * viu. Encurtar a palavra resolve a conta de hoje, e não a de amanhã: letra
 * ampliada pela acessibilidade do aparelho, ou a conversa colada numa coluna
 * estreita do construtor, e ele cairia de novo. Sem quebra, quem cede é o TEXTO
 * do número (`min-width: 0` e `overflow-wrap` nele), e o botão fica à direita.
 *
 * **`position: relative` é a âncora da lista de ordens**, e não o `<details>`.
 * Ancorada no botão, a lista de 12rem que abre para a direita passava da borda
 * da tela assim que o botão ficou ao lado do número — a mesma armadilha do
 * painel do sino na barra. Ancorada na fileira, ela começa na margem da coluna
 * e nunca é mais larga que ela.
 */
.lym-conversa__cabeca {
	position: relative;

	display: flex;
	flex-wrap: nowrap;
	align-items: baseline;
	gap: 0.5rem 1.25rem;
}

.lym-conversa__cabeca .lym-conversa__titulo {
	min-width: 0;
	overflow-wrap: anywhere;
}

/*
 * **O bloco da ordem virou um `<details>`, e ele abre sem script nenhum.** Eram
 * três links soltos lado a lado; numa tela estreita eles quebravam em três
 * linhas acima da conversa, e a pessoa lia três coisas para escolher uma.
 *
 * **Ele não encolhe** (`flex: none`): quem cede numa fileira apertada é o texto
 * do número. Encolhido, o botão quebraria a palavra "Ordenar" em duas linhas.
 *
 * **E ele não é a âncora da lista** (`position: static`): quem ancora é a
 * fileira, pela razão escrita nela. A lista continua saindo POR CIMA do que
 * está embaixo — um menu que empurra a conversa faz a primeira mensagem pular no
 * instante em que a pessoa abre.
 */
.lym-conversa__ordem {
	position: static;
	flex: none;

	font-size: 0.875rem;
}

/*
 * **O triângulo do navegador NÃO fica, e o comentário aqui dizia o contrário.**
 *
 * O `summary` nasce `display: list-item`, e é dali que sai o marcador. Este
 * botão é `inline-flex` — para alinhar o ícone com a palavra —, e trocar o
 * display apaga o marcador no Chrome. O texto ficava sozinho, cinza, sem nada
 * dizendo que ele abre alguma coisa.
 *
 * **Quem devolve a pista é o ícone**, que é marcação nossa e não depende nem do
 * display nem de o tema não mexer no botão. É a mesma razão pela qual os ícones
 * deste plugin são SVG, e não pseudoelementos.
 *
 * (O outro botão de recolher, o das respostas, continua `list-item` de
 * propósito: lá o marcador é a única pista, e a decisão está escrita ao lado
 * dele.)
 *
 * A classe é dobrada porque o tema do cliente pinta `summary` em muitos temas
 * de bloco, e um empate na especificidade é o que impede o botão de sair
 * vermelho sem ninguém ter pedido.
 */
.lym-conversa__ordem-botao.lym-conversa__ordem-botao {
	display: inline-flex;
	align-items: center;
	gap: 0.35rem;

	/* O alvo de toque: uma linha de texto tem metade do que um dedo pede. */
	min-height: 44px;
	padding: 0 0.25rem;

	list-style: none;
	white-space: nowrap;
	cursor: pointer;
	color: inherit;
}

/*
 * **O Safari desenha o triângulo por outro caminho**, e o `inline-flex` não o
 * apaga lá: ele somava uns 10px a um botão que já disputava a linha no iPhone.
 * A pista de que o botão abre continua sendo o ícone, que é marcação nossa.
 */
.lym-conversa__ordem-botao.lym-conversa__ordem-botao::-webkit-details-marker {
	display: none;
}

/*
 * **O ícone não encolhe.** Num flex ele é um item como outro qualquer: sem
 * `flex: none`, uma tela estreita o espreme antes de quebrar a linha, e o
 * desenho de "ordenar" vira três riscos tortos.
 */
.lym-conversa__ordem-icone {
	flex: none;

	/*
	 * Meio ponto abaixo da linha do texto: as três barras são geometria, e
	 * assentadas na base elas parecem altas ao lado das letras.
	 */
	margin-top: 1px;
}

.lym-conversa__ordem-lista {
	position: absolute;
	z-index: 20;

	/*
	 * **Ancorada na margem da FILEIRA, e com teto na largura dela.** A âncora é
	 * `.lym-conversa__cabeca`, que é a coluna da conversa inteira: `left: 0` a
	 * põe na margem de onde a conversa começa, e `max-width: 100%` a impede de ser
	 * mais larga que a coluna. Um teto em `vw` não salvava, porque não sabe de
	 * onde a lista começa. É a regra da casa — peça nenhuma estoura a largura de
	 * onde está —, e o nome de uma ordem é traduzível.
	 */
	left: 0;
	min-width: min( 12rem, 100% );
	max-width: 100%;

	margin: 0.25rem 0 0;
	padding: 0.35rem;

	list-style: none;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.35 ) );
	border-radius: 0.5rem;
	background: var( --lym-painel, Canvas );
	box-shadow: 0 8px 24px rgba( 0, 0, 0, 0.18 );
}

.lym-conversa__ordem-lista li {
	margin: 0;
}

/*
 * O alvo de toque inteiro nos dois links da ordem: um link de uma linha tem
 * metade da altura que um dedo pede, e aqui eles ficam colados um no outro.
 */
.lym-conversa__ordem-lista a,
.lym-conversa__ordem-lista strong {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
}

/*
 * **A cor das ordens tem classe DOBRADA, pelo Kit do Elementor** (achado em
 * 18/09/2026, medido no Chrome com o `post-79.css` do site). O `color: inherit`
 * dos links do plugin vem do bloco dos invólucros, que pesa (0,1,1) — o mesmo
 * peso do `.elementor-kit-N a` do Kit, que chega DEPOIS da nossa folha e vence:
 * as duas ordens que não estão valendo saíam no azul do Kit, e a que vale na cor
 * do texto. É o defeito registrado para todo link nosso que dependa só daquele
 * bloco, e é pago aqui como foi no sino: (0,2,1), e (0,3,1) nos estados, contra
 * o `a:hover` do Kit.
 */
.lym-conversa__ordem-lista.lym-conversa__ordem-lista a,
.lym-conversa__ordem-lista.lym-conversa__ordem-lista a:hover,
.lym-conversa__ordem-lista.lym-conversa__ordem-lista a:focus,
.lym-conversa__ordem-lista.lym-conversa__ordem-lista a:active {
	color: inherit;
}

.lym-conversa__mais {
	margin: 1rem 0 0;
	text-align: center;
}

/*
 * O botão some quando o script assume a rolagem — mas o BLOCO fica.
 *
 * **`display: none` aqui matava a rolagem inteira, e em silêncio.** O script
 * esconde este bloco e logo depois manda o `IntersectionObserver` vigiá-lo: um
 * elemento sem caixa nunca intersecta coisa nenhuma, então o observador jamais
 * dispararia — e como o botão também estava escondido, não sobrava caminho
 * nenhum para carregar a leva seguinte. Pior que antes da mudança, e invisível
 * para a suíte, que não roda navegador.
 *
 * O bloco continua no fluxo com um pixel de altura: é ele que entra na tela
 * quando a pessoa chega ao fim, e é essa entrada que pede a leva. Quem some é o
 * botão dentro dele.
 *
 * **Classe DOBRADA**, e não única: a regra base `.lym-conversa__mais` já pesa
 * (0,1,0), e um modificador de classe única empata com ela — a ordem no arquivo
 * passaria a decidir, que é a armadilha registrada neste projeto para todo
 * modificador.
 */
.lym-conversa__mais--auto.lym-conversa__mais--auto {
	min-height: 1px;
	margin: 0;
}

.lym-conversa__mais--auto.lym-conversa__mais--auto > a {
	display: none;
}

/*
 * O recado de que a tela está mostrando um assunto sozinho.
 *
 * Mesmo desenho do recado de fim de lista: informação, não erro. A saída fica
 * ao lado, e ela é um link de FRASE — leva sublinhado próprio, porque a regra
 * geral de sublinhar links não alcança quem tem classe nossa.
 */
.lym-conversa__fio {
	margin: 0 0 1rem;

	font-size: 0.9rem;
	opacity: 0.75;
	max-width: 100%;
}

.lym-conversa__fio-sair.lym-conversa__fio-sair {
	text-decoration: underline;
	text-underline-offset: 2px;
}

/*
 * O recado de que a conversa tem mais do que cabe nesta página.
 *
 * **Ele não é aviso de erro, e por isso não usa a cor de erro.** É uma
 * informação sobre o limite da tela, e quem a lê não fez nada errado — a cor
 * vermelha ali ensinaria a pessoa a procurar um problema que não existe.
 *
 * Apagado com opacidade, e sem nada dentro para multiplicá-la: ele não mora
 * em bloco nenhum já apagado. O par de sete achados de opacidade aninhada
 * nasceu de não conferir isso.
 */
.lym-conversa__teto {
	margin: 1rem 0 0;

	text-align: center;
	font-size: 0.9rem;
	opacity: 0.75;

	/*
	 * A frase é traduzível e pode ficar comprida: numa coluna estreita ela não
	 * pode empurrar a conversa para fora da largura da página.
	 */
	max-width: 100%;
}

/* ---------------------------------------------------------------------------
 * O bate-papo: a página do grupo e a conversa de suporte (1.98.0).
 *
 * **A mesma conversa, com o arranjo de um grupo de WhatsApp** (pedido do Flávio
 * em 18/09/2026): o número e o Ordenar presos no alto, a faixa das fixadas logo
 * abaixo, a caixa de escrever presa embaixo, e entre os dois a lista — a ÚNICA
 * coisa que rola. Mensagem nenhuma aparece acima do número nem abaixo da caixa.
 *
 * **Sem `position: sticky` e sem `fixed` na página.** A conversa ocupa uma altura
 * medida e a lista rola por DENTRO dela. Sticky na página dependeria de nenhum
 * invólucro do construtor ter `overflow` (que o quebra) e fixed, de nenhum ter
 * `transform`; e a barra do menu do celular, que fica acima da conversa, sumiria
 * de vista junto com o começo da página — que no bate-papo nunca chega, porque
 * as antigas carregam para cima sem fim. Com a rolagem por dentro, o que o dono
 * montou acima da conversa continua acima dela, e a barra do menu, à vista.
 *
 * **A altura é medida pelo script**, a partir da tela visível e do topo da
 * seção (`publico.js`, "O bate-papo"). A daqui é a reserva de quem ainda não
 * rodou o script — ou não tem —, e é por isso que ela chuta: 8rem de sobra para
 * o que costuma haver acima.
 * ------------------------------------------------------------------------- */

.lym-conversa--papo.lym-conversa--papo {
	display: flex;
	flex-direction: column;
	margin-top: 0;

	height: calc( 100vh - 8rem );
	height: calc( 100dvh - 8rem );

	/*
	 * **O piso vale mais que a conta.** Uma página com muita coisa acima da
	 * conversa, ou o teclado do celular aberto, deixariam a conta abaixo do
	 * razoável; com o piso a página passa a rolar um pouco, e a lista continua
	 * tendo onde mostrar mensagens.
	 */
	min-height: 20rem;
}

.lym-conversa__topo {
	flex: none;
}

/*
 * A cabeça do bate-papo é mais baixa que a da conversa de um conteúdo: ali o
 * título separava a conversa do texto da aula, e aqui ele divide a tela com a
 * lista e com a caixa.
 *
 * **As regras da cabeça são presas a ELA** (`--papo`), e nunca à conversa: no
 * tablet e no celular da página do grupo o script a leva para a barra do menu,
 * onde a conversa já não é ancestral dela (1.100.0). É a regra da casa para
 * peça que aparece em dois lugares.
 */
.lym-conversa__cabeca--papo .lym-conversa__titulo {
	margin-bottom: 0.5rem;
}

/*
 * **O número do bate-papo é 30% MENOR que o de um conteúdo** (pedido do Flávio em
 * 18/09/2026, "para economizar espaço e conseguir mostrar mais comentários"):
 * 1,1875rem × 0,7 = 0,83125rem, uns 13px. Três classes, porque a regra do
 * número pesa duas e o Kit do Elementor declara `h2` com (0,1,1).
 */
.lym-conversa__cabeca--papo .lym-conversa__titulo.lym-conversa__titulo {
	font-size: 0.83125rem;
}

/*
 * **No computador, o número e o Ordenar na mesma linha e no mesmo tamanho**
 * (pedido do Flávio em 18/09/2026: o número "ligeiramente abaixo de Ordenar, e
 * com a letra menor").
 *
 * - **O tamanho**: a palavra do Ordenar fica com o do número, 0,83125rem. Só a
 *   palavra (o `summary`): a lista de ordens continua com o dela.
 * - **A linha**: igualar o tamanho NÃO bastava, e foi medido. A fileira alinha
 *   pela linha de base, e a linha de base do botão vinha do DESENHO, que é o
 *   primeiro item dele — o pé do ícone, e não o da palavra: com os dois no mesmo
 *   tamanho, o número continuava 2,5px abaixo (Chrome, com o Kit do site).
 *   Tirado do fluxo, centrado na palavra, o desenho deixa de ser item, e a linha
 *   de base do botão passa a ser a da palavra: medido, os dois textos ocupam a
 *   mesma faixa (33,5–50,5px a 1280) e o ícone continua no meio da palavra. O
 *   recheio da esquerda devolve o lugar que ele ocupava, com o mesmo vão.
 *   Centralizar a fileira também alinhava, e mexia no respiro de baixo; assim, o
 *   vão entre a régua do número e o que vem embaixo continua de 0,5rem.
 *
 * No tablet e no celular do grupo o Ordenar mora na barra, com a palavra embaixo
 * do desenho, e isto não vale lá.
 */
@media ( min-width: 1024.02px ) {
	.lym-conversa__cabeca--papo .lym-conversa__ordem-botao.lym-conversa__ordem-botao {
		position: relative;
		padding-left: calc( 0.25rem + 15px + 0.35rem );
		font-size: 0.83125rem;
	}

	.lym-conversa__cabeca--papo .lym-conversa__ordem-icone {
		position: absolute;
		left: 0.25rem;
		top: 50%;
		margin-top: -7.5px;
	}
}

/*
 * **As molduras das duas páginas do bate-papo perdem a sobra de baixo.** A
 * conversa ocupa a altura da tela, e a sobra — os 4rem da moldura do grupo, a
 * altura mínima de uma tela inteira e os 5rem da página de suporte — empurraria a
 * caixa de escrever para longe da borda de baixo. A marca é posta pelo PHP
 * (`templates/grupo.php` e `templates/area.php`), que sabe qual página é.
 */
.lym-tela.lym-tela--papo {
	padding-bottom: 0.75rem;
}

.lym-pagina.lym-pagina--papo {
	min-height: 0;
	padding-bottom: 0.75rem;
}

/*
 * **No computador o alto da página do grupo respira menos** (pedido do Flávio em
 * 18/09/2026: "diminua um pouquinho o espaço acima"): 2rem → 1,25rem, 12px que a
 * lista ganha. O menu da coluna sobe junto, e é de propósito — a coluna e a
 * conversa continuam começando na mesma altura. Só no computador: no tablet e
 * no celular o número e o Ordenar saem daqui e vão para a barra.
 */
@media ( min-width: 1024.02px ) {
	.lym-tela--papo .lym-tela__grade {
		padding-top: 1.25rem;
	}

	/*
	 * **A coluna gruda na mesma altura do respiro novo.** Ela é `sticky` com
	 * `top: 1.5rem`, e o sticky a segurava 4px abaixo da conversa para quem não
	 * tem a barra do WordPress (medido pela revisão da 1.100.0: coluna em 24px,
	 * conversa em 20px). O teto de altura desconta os dois respiros, como na base.
	 */
	.lym-tela--papo .lym-tela__lado {
		top: 1.25rem;
		max-height: calc( 100vh - 2.5rem );
	}
}

/* ---------------------------------------------------------------------------
 * O bate-papo APERTADO no telefone e no tablet (1.119.0).
 *
 * Pedido do Flávio em 20/09/2026, com três telas marcadas: "precisamos diminuir
 * os espaços entre os elementos do grupo para caber mais comentários visíveis".
 *
 * **Tudo daqui é escopado a `--papo`, e isso é a coisa toda.** As declarações que
 * produzem estes vãos são as da moldura e da grade, que servem TAMBÉM a tela de
 * um conteúdo: apertadas na raiz, elas estreitariam o vídeo e o texto de uma aula
 * para resolver um telefone. O que o pedido alcança fora daqui é só a geometria
 * da MENSAGEM (o recheio do balão e o `--lym-msg-y`), e essa vale nos dois
 * lugares de propósito — ele pediu a economia "nos comentários dos conteúdos"
 * também.
 *
 * **Este bloco mora DEPOIS do `min-width: 1024.02px` acima, e a ordem é regra.**
 * `teste-bate-papo.php` ancora em `.lym-tela--papo .lym-tela__grade` pela PRIMEIRA
 * ocorrência e exige que ela esteja na faixa do computador: uma regra nova escrita
 * antes daquela faz o vigia medir a errada e falhar sem nada estar quebrado.
 * ------------------------------------------------------------------------- */
@media ( max-width: 1024px ) {
	/*
	 * **O alto do bate-papo pela metade**, nos dois pedidos dele: 24px acima da
	 * barra do menu e 24px entre a barra e a primeira mensagem viram 12px cada.
	 * São 24px que a lista ganha, e nesta tela isso é uma mensagem curta inteira.
	 *
	 * A base continua em 1,5rem (`publico.css`, no bloco de `max-width: 1024px` lá
	 * em cima) para a moldura de um conteúdo: ali o alto da página não disputa
	 * espaço com nada, e encolhê-lo seria apertar por apertar.
	 */
	.lym-tela--papo .lym-tela__grade {
		gap: 0.75rem;
		padding-top: 0.75rem;
	}
}

@media ( max-width: 600px ) {
	/*
	 * **As bordas laterais pela metade, e SÓ no telefone** (ele pediu o item no
	 * bloco "VERSÃO CELULAR"). Eram 1,25rem = 20px de cada lado, da moldura; agora
	 * são 10px. A caixa de escrever, a barra do menu e a lista andam juntas, porque
	 * as três moram dentro da mesma moldura — que é o alinhamento que a linha
	 * vermelha do rascunho dele pede.
	 */
	.lym-tela.lym-tela--papo {
		padding-left: 0.625rem;
		padding-right: 0.625rem;
	}

	/*
	 * **E a assimetria da faixa que rola some junto.** Ela tinha 0,75rem à esquerda
	 * e 0,25rem à direita, o que punha a bolinha da mensagem a 32px da borda e o
	 * balão a 24px — medido no Chrome sem janela em 20/09/2026, com a página do
	 * grupo de verdade, e é a diferença que o Flávio viu comparando o grupo com a
	 * conversa de uma aula (lá a bolinha fica a 20px, porque esta faixa não existe).
	 *
	 * **0,375rem é metade do que era E o piso de verdade**, e as duas coisas
	 * coincidirem é sorte: o recheio da esquerda existe para o brilho de "novo",
	 * que passa exatamente 0,375rem (6px) para fora da bolinha
	 * (`left: calc( -1 * ( var( --lym-lado ) + var( --lym-vao ) ) - 0.375rem )`) —
	 * e uma faixa que rola corta o que sai dela. Menos que isso decepa o brilho.
	 * A direita recebe o mesmo valor pelo pedido dele: "o mesmo espaço reduzido".
	 *
	 * Depois: bolinha e balão a 16px de cada borda, a caixa de escrever a 10px.
	 */
	.lym-conversa--papo .lym-conversa__rolagem.lym-conversa__rolagem {
		padding-left: 0.375rem;
		padding-right: 0.375rem;
	}
}

/*
 * **No bate-papo o balão cresce até a coluna, e o teto de leitura sai** (1.119.0,
 * pedido do Flávio: "permita que os comentários grandes vão até a altura do botão
 * de enviar imagem, se necessário").
 *
 * **Isto DESFAZ aqui a razão escrita no teto de 42rem**, que está vinte linhas
 * acima e continua valendo na conversa de um conteúdo: uma linha de texto que
 * atravessa um monitor largo perde o começo da frase seguinte no caminho de
 * volta. Ele olhou a tela dele e escolheu o espaço; a decisão é dele e está
 * datada para ninguém a desfazer em silêncio.
 *
 * Medido no Chrome sem janela em 20/09/2026, com a página do grupo de verdade: o
 * balão parava a 137px do botão de imagem no tablet e a 184px no computador; sem
 * o teto ele vai até a borda da coluna, que fica 3px aquém do botão. No telefone
 * nada muda — lá a coluna é menor que o teto, e ele nunca chegou a pegar.
 *
 * A onda sonora não se incomoda: ela tem teto próprio de 22rem, e um balão mais
 * largo só lhe dá folga.
 */
.lym-conversa--papo .lym-comentario__corpo {
	max-width: none;
}

/*
 * **A única faixa que rola.**
 *
 * - `min-height: 0` é o que deixa um item de flex encolher abaixo do próprio
 *   conteúdo; sem ele, a lista crescia até o tamanho de todas as mensagens e a
 *   seção inteira transbordava — a caixa saía da tela.
 * - O piso de 6rem é o que a lista guarda quando o teclado, a gaveta de emoji e a
 *   barra de gravação estão todos abertos: menos que isso e a pessoa escreveria
 *   sem ver o que está respondendo. Quem garante que a caixa cabe junto com ele é
 *   o script (`repartir()`), que dá à caixa e à faixa das fixadas só o que sobra —
 *   descontado o recheio de cada uma. Sobram 8px num extremo só (faixa aberta,
 *   gaveta de emoji e texto longo num telefone): o recheio da faixa não encolhe.
 * - `scroll-behavior: auto` com classe dobrada porque o script escreve a
 *   posição da lista, e um tema com `scroll-behavior: smooth` em tudo
 *   transformaria cada escrita numa animação — a leitura logo depois devolveria
 *   o valor antigo.
 * - **A barra de rolagem não aparece** (pedido do Flávio em 18/09/2026, vendo
 *   a barra clássica do Windows, com as duas setas, ao lado das mensagens: "não
 *   era para aparecer"). A lista continua rolando pela roda, pelo toque, pelo
 *   teclado e pela seta que volta ao fim. `scrollbar-width` é a propriedade
 *   da norma; o pseudoelemento é para o Chrome antes da 121 e o Safari antes
 *   do 18.2, que não a conhecem. E a barra sumida resolve de graça o que o
 *   `scrollbar-gutter: stable` resolvia aqui: sem barra, a coluna não muda de
 *   largura quando a lista enche, e a onda sonora — que mede a coluna — não
 *   passa do balão.
 * - O recheio da esquerda é o do brilho de "novo", que passa 6px para fora da
 *   bolinha, e o do anel de foco: uma lista que rola corta o que sai dela.
 */
.lym-conversa__rolagem.lym-conversa__rolagem {
	flex: 1 1 auto;
	min-height: 6rem;
	overflow-x: hidden;
	overflow-y: auto;
	scroll-behavior: auto;
	scrollbar-width: none;
	padding: 0.5rem 0.25rem 0.5rem 0.75rem;
	outline-offset: -2px;
}

.lym-conversa__rolagem.lym-conversa__rolagem::-webkit-scrollbar {
	display: none;
}

.lym-conversa--papo .lym-conversa__mais,
.lym-conversa--papo .lym-conversa__teto {
	margin: 0 0 1rem;
}

.lym-conversa__recentes {
	margin: 1rem 0 0;
	text-align: center;
}

/*
 * **O trilho da seta: preso ao pé da parte visível da lista, e com altura zero.**
 * Ele é o último filho da lista e gruda no fundo dela enquanto a pessoa rola;
 * sem altura, ele não acrescenta espaço embaixo da última mensagem. A seta é
 * posicionada a partir dele, por cima das últimas mensagens.
 */
.lym-conversa__trilho {
	position: sticky;
	bottom: 0;
	z-index: 1;
	height: 0;
}

/*
 * **A seta que volta ao fim.** Redonda, no canto direito, logo acima da caixa —
 * onde fica o microfone. Ela fica POR CIMA de mensagens, então o fundo é opaco:
 * `--lym-painel` é a cor da página que o script mede e escreve na conversa; sem
 * script, `Canvas` segue o `color-scheme` que a conversa já declara.
 *
 * Classe dobrada, e não mais: o `[hidden]` do plugin pesa três atributos, e uma
 * regra mais pesada que ele deixaria a seta à vista com a lista no fim.
 */
.lym-conversa__descer.lym-conversa__descer {
	position: absolute;
	right: 0.5rem;
	bottom: 0.5rem;

	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	height: 44px;
	padding: 0;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.35 ) );
	border-radius: 50%;
	background: var( --lym-painel, Canvas );
	color: inherit;
	box-shadow: 0 2px 8px rgba( 0, 0, 0, 0.25 );
	cursor: pointer;
}

.lym-conversa__descer.lym-conversa__descer:hover,
.lym-conversa__descer.lym-conversa__descer:focus-visible {
	border-color: currentColor;
}

/*
 * **A base: o recado e a caixa de escrever, presos embaixo.**
 *
 * Ela tem teto e rola sozinha quando passa dele. A caixa cresce com o texto (até
 * 40% da janela), a gaveta de emoji a empurra, a barra de gravação sobe, o "Como
 * liberar" abre: num telefone com o teclado aberto, a soma passava da conversa
 * inteira e a lista ficava com altura negativa (conta da revisão do desenho).
 *
 * **Os 60% daqui são a reserva de quem não tem script.** Somados ao topo e ao
 * piso da lista eles passam da conversa num telefone, e quem transbordava era a
 * caixa; com script, o teto é o que sobra depois do topo e do piso da lista
 * (`repartir()`, em `publico.js`).
 */
.lym-conversa__base {
	flex: none;
	position: relative;
	max-height: 60%;
	overflow-y: auto;
	padding-top: 0.5rem;
}

.lym-conversa--papo .lym-escrever {
	margin-bottom: 0.25rem;
}

.lym-conversa--papo .lym-recado {
	margin: 0 0 0.5rem;
}

/*
 * **O atalho para a caixa de escrever, visível só no foco.** Escondido do jeito
 * que leitor de tela e teclado continuam alcançando — `display: none` o tiraria
 * dos dois.
 */
.lym-conversa__pular.lym-conversa__pular {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect( 0 0 0 0 );
	white-space: nowrap;
}

/*
 * **`flex: none` no foco, e é o que o deixa legível.** Ele é item da coluna flex
 * da conversa, que tem altura fixa e lista transbordando; com o `overflow: hidden`
 * da regra de cima o mínimo automático dele vira zero, e o encolhimento da lista
 * o levava junto — medido, 20px de altura para 37 de texto, com a metade de
 * baixo das letras cortada (achado da revisão da 1.98.0).
 */
.lym-conversa__pular.lym-conversa__pular:focus {
	flex: none;
	position: static;
	display: inline-block;
	width: auto;
	height: auto;
	margin: 0 0 0.5rem;
	padding: 0.5rem 0.75rem;
	clip: auto;
	text-decoration: underline;
}

/*
 * **A faixa das fixadas.** Uma linha só, como a do WhatsApp; tocar abre a
 * mensagem inteira ali mesmo. É um `<details>`, que abre sem JavaScript.
 *
 * **O `summary` é flex, e isso apaga o triângulo do navegador**: a pista de que a
 * faixa abre é a SETA desenhada na marcação, que gira quando ela está aberta —
 * é a regra do par display/marcador que o botão de ordenar já segue.
 */
.lym-conversa__fixadas {
	margin: 0 0 0.5rem;
	border-radius: 0.75rem;
	background: rgba( 128, 128, 128, 0.1 );
}

.lym-conversa__fixadas-faixa.lym-conversa__fixadas-faixa {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	min-height: 44px;
	padding: 0.25rem 0.75rem;
	list-style: none;
	cursor: pointer;
	font-size: 0.875rem;
}

.lym-conversa__fixadas-faixa::-webkit-details-marker {
	display: none;
}

.lym-conversa__fixadas-icone,
.lym-conversa__fixadas-seta {
	flex: none;
	width: 1rem;
	height: 1rem;
}

.lym-conversa__fixadas-seta {
	transition: transform 0.2s ease;
}

.lym-conversa__fixadas[open] .lym-conversa__fixadas-seta {
	transform: rotate( 180deg );
}

@media ( prefers-reduced-motion: reduce ) {
	.lym-conversa__fixadas-seta {
		transition: none;
	}
}

/*
 * O texto da faixa corta com reticências numa linha só: é a faixa, e não a
 * mensagem — a mensagem inteira está logo abaixo quando ela abre.
 */
.lym-conversa__fixadas-texto {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/*
 * **Aberta, ela tem teto e rola por dentro.** Cinco fixadas longas abertas de uma
 * vez empurrariam a lista para fora da tela. O teto daqui é o de quem não tem
 * script; com ele, a faixa fica com o que sobra depois da caixa e do piso da
 * lista — ela é a peça que cede primeiro (`repartir()`, em `publico.js`).
 */
.lym-conversa__fixadas-lista {
	margin: 0;
	padding: 0 0.75rem 0.5rem;
	list-style: none;
	max-height: 16rem;
	max-height: min( 40vh, 16rem );
	overflow-y: auto;
}

.lym-conversa__fixadas-resto {
	margin: 0 0.75rem 0.5rem;
	font-size: 0.8125rem;
}

/*
 * A cópia da fixada dentro da faixa: sem as ações da fila, e um pouco mais junta.
 */
.lym-comentario--fixada {
	padding: 0.25rem 0;
}

/*
 * **O quadrinho da mensagem respondida**, como o do WhatsApp: o nome de quem a
 * escreveu e o começo do que disse, dentro do balão da resposta.
 *
 * **A pista de que ele é clicável é o PREENCHIMENTO**, e não a cor: cor não é
 * como se diz "clicável". O nome sai no azul de "o recado que explica"
 * (`--lym-info`, par medido), que numa conversa de nomes neutros diz "este é
 * outro autor"; o texto herda a cor do balão. Sem opacidade em nada: opacidade
 * troca a cor pela mistura com o fundo.
 *
 * Classe dobrada porque ele é um `<a>`, e o Kit do Elementor pinta `a` com o
 * mesmo peso de uma classe só.
 */
.lym-comentario__citacao.lym-comentario__citacao {
	display: block;
	max-width: 100%;
	margin: 0.15rem 0 0.35rem;
	padding: 0.3rem 0.55rem;
	overflow: hidden;

	border-left: 3px solid var( --lym-destaque, var( --lym-info ) );
	border-radius: 0.5rem;
	background: rgba( 128, 128, 128, 0.14 );
	color: inherit;
	text-decoration: none;

	font-size: 0.8125rem;
	line-height: 1.35;
}

.lym-comentario__citacao.lym-comentario__citacao:hover,
.lym-comentario__citacao.lym-comentario__citacao:focus-visible {
	background: rgba( 128, 128, 128, 0.24 );
}

.lym-comentario__citacao-quem {
	display: block;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-weight: 700;
	color: var( --lym-destaque, var( --lym-info ) );
}

/*
 * Duas linhas, e o resto cortado. `-webkit-line-clamp` é o que todo navegador
 * atual entende; onde não for, o teto de altura corta seco — o quadrinho é uma
 * lembrança, e não a mensagem.
 */
.lym-comentario__citacao-texto {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	max-height: 2.7em;
	overflow: hidden;
	overflow-wrap: anywhere;
}

/*
 * **O × da faixa "Respondendo a", no bate-papo.** Alvo de 44px e fundo como
 * pista: sem ele, um × solto é um caractere, e não um botão.
 */
.lym-escrever__cancelar.lym-escrever__cancelar {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: none;

	width: 44px;
	height: 44px;

	border-radius: 50%;
	background: rgba( 128, 128, 128, 0.14 );
	color: inherit;
	text-decoration: none;

	font-size: 1.25rem;
	line-height: 1;
}

.lym-escrever__cancelar.lym-escrever__cancelar:hover,
.lym-escrever__cancelar.lym-escrever__cancelar:focus-visible {
	background: rgba( 128, 128, 128, 0.26 );
}

/*
 * No bate-papo a faixa "Respondendo a" é uma fileira: a frase de um lado e o ×
 * do outro. O `[hidden]` do plugin pesa mais que esta regra, então a faixa
 * continua escondida enquanto ninguém responde.
 *
 * **E ela GRUDA no alto da caixa** quando a caixa rola por dentro. Com o teclado
 * aberto num telefone, a caixa fica com pouca altura e rola até o cursor, e a
 * faixa — com o × que desiste da resposta — saía de vista por cima (achado da
 * revisão da 1.98.0, medido a 360x440). Grudada, ela cobre o alto do texto, e por
 * isso é opaca: o fundo é o da página, medido pelo script (`--lym-painel`), e a
 * opacidade da regra de cima volta a 1 — translúcida, a letra de baixo apareceria
 * através dela.
 */
.lym-conversa--papo .lym-escrever__respondendo {
	display: flex;
	align-items: center;
	gap: 0.5rem;

	position: sticky;
	top: 0;
	z-index: 1;
	background: var( --lym-painel, Canvas );
	opacity: 1;
}

.lym-conversa--papo .lym-escrever__respondendo [data-lym-respondendo-quem] {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/*
 * O botão de tirar um anexo. Ele nasce do script — um campo de arquivo não pode
 * ser esvaziado pelo servidor, então um botão desenhado pelo PHP seria um botão
 * que não funciona para quem está sem JavaScript.
 */
.lym-escrever__tirar.lym-escrever__tirar {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 28px;
	height: 28px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 50%;
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;

	font: inherit;
	line-height: 1;
	cursor: pointer;
}

.lym-escrever__tirar.lym-escrever__tirar:hover,
.lym-escrever__tirar.lym-escrever__tirar:focus {
	background: rgba( 128, 128, 128, 0.3 );
	color: inherit;
}

/*
 * A miniatura do que foi escolhido, antes de enviar.
 *
 * **Um nome de arquivo não diz se a pessoa anexou o print certo**, e na conversa
 * particular de suporte o print errado custa uma ida e volta inteira: quem
 * responde pede de novo, e quem perguntou volta ao telefone.
 *
 * O teto é pequeno de propósito — ela mora numa linha ao lado do nome e do botão
 * de tirar, e não pode empurrar o botão de enviar para fora da tela. `width:
 * auto` junto do teto de altura porque o tema do cliente pode ter declarado
 * largura para imagens, e aí a miniatura sairia esticada.
 *
 * O atributo é citado no seletor do `[hidden]` porque o `[hidden]` do navegador
 * tem peso ZERO: um `display` numa classe o vence, e a miniatura apareceria
 * vazia enquanto não houvesse arquivo nenhum.
 */
.lym-anexo__previa[hidden] {
	display: none !important;
}

.lym-anexo__previa.lym-anexo__previa {
	display: block;
	max-height: 40px;
	max-width: 80px;
	width: auto;
	height: auto;
	flex: 0 0 auto;
	border-radius: 4px;
}

/*
 * A recusa por tamanho, escrita na mesma linha que diria o nome do arquivo.
 *
 * **Sem cor, e o peso é o destaque.** A linha herda `opacity: 0.75` de
 * `.lym-escrever__estado`, e um texto apagado é a última coisa que serve para
 * uma recusa — mas dar cor aqui exigiria escolher um papel para uma peça que
 * também existe no painel, onde nenhuma variável do plugin chega. Corpo e peso
 * fazem a hierarquia sem gastar cor, que é a regra registrada para blocos
 * apagados.
 *
 * **E as três linhas de corte precisam ser DESFEITAS, senão a frase sai pela
 * metade — e a metade que some é o número.** `.lym-escrever__estado` é
 * `white-space: nowrap` com `overflow: hidden` e reticências, porque ali o
 * normal é um nome de arquivo que não pode empurrar o botão de enviar. A recusa
 * é outra coisa: "O arquivo passa do tamanho que este site aceita. Envie um de
 * até 2 MB" virava "O arquivo passa do tamanho que este site a…" numa coluna de
 * celular. O tamanho é a razão inteira desta versão existir, e era exatamente
 * ele que o corte engolia.
 */
.lym-anexo__erro.lym-anexo__erro {
	opacity: 1;
	font-weight: 600;

	white-space: normal;
	overflow: visible;
	text-overflow: clip;
}

/*
 * E o rodapé deixa a frase quebrar em vez de espremer o botão de enviar. Sem a
 * quebra, a linha de estado em duas linhas empurraria o botão para fora da
 * largura — o sintoma apareceria longe da causa, como rolagem lateral da página
 * inteira.
 */
.lym-escrever__rodape {
	flex-wrap: wrap;
}

/* ---------------------------------------------------------------------------
 * O CAMINHO DE VOLTA DE QUEM BLOQUEOU O MICROFONE (17/09/2026).
 *
 * **"Dá para liberar nas configurações do navegador" sem dizer ONDE é o mesmo
 * que não dizer nada** — foi o que o Flávio apontou, e tem razão. O aviso no
 * celular carrega esse defeito desde que nasceu. Aqui a frase curta fica na
 * linha de estado e o passo a passo abre ao lado dela.
 *
 * **Ela NÃO declara `display`, e a omissão é deliberada.** Qualquer `display`
 * numa classe nossa venceria o `[hidden]` do navegador, que tem peso zero — a
 * folha tem uma regra inteira lá em cima só para consertar isso, citando o
 * atributo três vezes. Não declarando nada, o `details` fica no `block` do
 * navegador e o `hidden` funciona sozinho, nas DUAS folhas, sem depender de um
 * ancestral (no painel aquela regra é escopada à tela de Comentários).
 *
 * **`flex-basis: 100%` põe o bloco numa linha só dele.** O rodapé é um flex com
 * `flex-wrap`, e uma lista de três passos ao lado do nome de um arquivo seria
 * duas colunas de texto disputando uma largura de celular.
 * ------------------------------------------------------------------------- */
/*
 * **Ele encosta na DIREITA, e o pedido tem razão de ser.** Alinhado à esquerda,
 * a frase e o caminho de volta nasciam na outra ponta da caixa, longe do lugar
 * de onde o botão do microfone acabou de sumir — e a pessoa não liga uma coisa
 * na outra. Encostado à direita, ele aparece onde o olho já estava. (Pedido do
 * Flávio em 17/09/2026, vendo a tela do site dele.)
 *
 * **Os passos continuam alinhados à ESQUERDA**, dentro de uma caixa que é a que
 * se alinha à direita: uma lista numerada com o texto correndo para a direita
 * seria a única do plugin assim, e listas se leem pela margem esquerda.
 */
.lym-voz-negado {
	margin: 0.5rem 0 0;

	text-align: right;
	font-size: 0.8125rem;
}

/*
 * **A frase mora DENTRO do bloco, e não na linha de estado do rodapé.** O
 * rodapé é volátil: a limpeza do envio esvazia todas as linhas de estado e tira
 * a classe que o mantém à vista, e quem estava bloqueada ficava com um "Como
 * liberar" órfão. Bloqueio é condição permanente.
 *
 * **Sem opacidade nenhuma**, pela razão que a folha já registra sobre a recusa
 * da imagem grande: um texto apagado é a última coisa que serve para dizer que
 * alguma coisa não funciona.
 */
.lym-voz-negado__frase {
	margin: 0 0 0.25rem;
	font-weight: 600;
}

/*
 * **O `summary` continua `list-item`, e por isso não há `display` aqui.**
 * Trocar o `display` de um `summary` APAGA o triângulo do navegador, e com ele
 * a única pista de que aquilo abre — a folha já pagou por isso no botão de
 * ordenar, que ficou anos sem marcador nenhum com um comentário ao lado
 * afirmando que o triângulo estava lá.
 *
 * **O alvo de toque sai do `min-height`**, que não mexe no `display`. Recheio
 * sozinho não chegava aos 44px com letra de 13px, e engordar o texto para
 * alcançar seria resolver com a peça errada.
 */
/*
 * O `details` em si não precisa de desenho — precisa de RESET: um tema que dê
 * margem a `details` afastaria o "Como liberar" da frase que ele explica, e as
 * duas são uma peça só.
 */
.lym-voz-negado__caminho {
	margin: 0;
}

/*
 * **A classe é DOBRADA, e o `color: inherit` não é enfeite.** É a terceira vez
 * que esta folha escreve isto sobre um `summary`, e a razão é a mesma das duas
 * anteriores: o tema do cliente pinta `summary` em muitos temas de bloco, e uma
 * regra como `.entry-content summary` pesa (0,1,1) — vence uma classe única e
 * repinta o botão com a cor dele, ou troca o `display` e apaga o triângulo. E o
 * tema forçado NÃO cobre este flanco: `Lym_Tema::PINTADAS` não lista `summary`.
 *
 * **`border-box` escopado a esta peça.** Sem ele o `min-height` mede só o
 * conteúdo e o recheio entra POR CIMA dos 44px: com este recheio a caixa sairia
 * a 68px. Medido em 17/09/2026, com `border-box`: 44px exatos.
 *
 * **E nenhum `display`**: trocar o de um `summary` apaga o marcador do
 * navegador, que é a única pista de que aquilo abre.
 */
.lym-voz-negado__abrir.lym-voz-negado__abrir {
	box-sizing: border-box;
	min-height: 44px;
	padding: 0.75rem 0;

	/*
	 * **Ele é AZUL, e o azul aqui é o papel certo, não uma exceção à regra.**
	 * `--lym-info` é "o recado que explica" — é o que ele é. O Flávio clicou
	 * porque estava esperando a funcionalidade; quem não está não clica em texto
	 * que parece legenda. O par é MEDIDO nos dois temas, como todo papel fixo.
	 *
	 * **E o sublinhado entra junto**, porque cor sozinha não é pista: quem não
	 * distingue azul de cinza fica sem sinal nenhum. É o mesmo idioma do resto do
	 * plugin — link se identifica por sublinhado, e a cor diz "este, entre tudo o
	 * que está na tela".
	 *
	 * **`list-style-position: inside` põe o triângulo DENTRO da linha**, e é o que
	 * permite o alinhamento à direita: por fora, o marcador ficaria preso à margem
	 * esquerda enquanto a palavra viaja para a direita, e os dois se separariam. O
	 * `display` continua sendo o do navegador — trocá-lo apagaria o triângulo.
	 */
	color: var( --lym-info );
	text-decoration: underline;
	list-style-position: inside;

	font-size: 0.8125rem;
	font-weight: 600;
	cursor: pointer;
}

/*
 * **O `list-style` é DECLARADO, e este é o único list do plugin cujo marcador
 * carrega informação.** Um `ol { list-style: none }` de tema pesa (0,0,1) e não
 * encontra regra nossa para disputar: os números somem, o `padding-left` fica
 * reservando uma calha vazia, e o passo a passo — onde a ORDEM é o recado —
 * vira três frases soltas. Todos os outros lists desta folha já declaram o
 * deles; este precisava mais que os outros.
 */
.lym-voz-negado__passos {
	margin: 0 0 0.35rem;
	padding-left: 1.5rem;
	list-style: decimal;

	/*
	 * **A LISTA se alinha à direita; o TEXTO dela, não.** Sendo um bloco em linha,
	 * ela obedece ao `text-align: right` do bloco como um todo e encosta onde o
	 * microfone estava — e por dentro volta a correr da esquerda, que é como uma
	 * lista numerada se lê.
	 */
	display: inline-block;
	text-align: left;
}

.lym-voz-negado__passos li {
	margin: 0 0 0.35rem;
}

/* ---------------------------------------------------------------------------
 * A lupa: a imagem de uma mensagem, por cima da página.
 *
 * **O véu é preto translúcido, e não a cor medida do fundo.** As outras
 * superfícies do plugin — o painel do índice, o do sino — precisam ser OPACAS,
 * porque cobrem conteúdo que continua legível por baixo; por isso elas leem a
 * cor do corpo com o script. Aqui o objetivo é o contrário: a página tem de
 * sumir para a foto aparecer, e escuro atrás de imagem é o que todo visualizador
 * faz. Nada a medir, e um consumidor a menos para `--lym-painel`.
 * ------------------------------------------------------------------------- */
/*
 * A CAIXA DE CONFIRMAR UMA AÇÃO SEM VOLTA
 * ---------------------------------------------------------------------------
 *
 * **Ela é irmã da caixa de convite, e usa a mesma mecânica**: véu que escurece
 * a página, caixa medida contra o fundo REAL (`--lym-painel`, escrito pelo
 * script) e o mesmo andar da lupa. O que muda é o tamanho — uma pergunta e dois
 * botões cabem em menos espaço que duas portas e um parágrafo.
 *
 * **O `[hidden]` vem primeiro e cita o atributo TRÊS vezes**, pela razão de
 * sempre: `[hidden]` do navegador tem peso ZERO, e o `display: flex` de baixo o
 * derrotaria — a caixa nasceria aberta em cima da conversa.
 */
.lym-confirmar[hidden][hidden][hidden] {
	display: none;
}

.lym-confirmar.lym-confirmar {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;

	display: flex;
	align-items: center;
	justify-content: center;

	padding: 1.5rem;

	background: rgba( 0, 0, 0, 0.72 );

	/* O mesmo andar da lupa e da caixa de convite, e pela mesma razão escrita lá. */
	z-index: 2147483001;
}

.lym-confirmar__caixa.lym-confirmar__caixa {
	position: relative;

	box-sizing: border-box;
	width: 100%;
	max-width: 24rem;

	padding: 1.5rem;

	background: var( --lym-painel, #ffffff );
	border: 1px solid rgba( 128, 128, 128, 0.38 );
	border-radius: 0.75rem;

	/* A luz de cima de cartão, topo e caixa de aviso: só ADICIONA. */
	box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.07 );
}

.lym-confirmar__pergunta {
	margin: 0 0 1.25rem;

	font-size: 1rem;
	line-height: 1.5;
}

/*
 * **Empilhados no aperto e lado a lado a partir daí**, e quem decide é o `wrap`
 * — não um media query, que responderia sobre a JANELA quando quem aperta é a
 * caixa. É a mesma regra das portas do convite.
 *
 * **O "Cancelar" fica à ESQUERDA na tela e PRIMEIRO no documento.** A ordem do
 * documento é a do teclado, e numa pergunta sem volta o Enter batido por reflexo
 * tem de cair na saída segura.
 */
.lym-confirmar__acoes {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;

	margin: 0;
}

.lym-confirmar__acoes .lym-botao {
	flex: 1 1 8rem;

	text-align: center;
}

/*
 * A CAIXA DE CONVITE
 *
 * **Ela flutua, ao contrário da gaveta de emoji — e a diferença é o que ela
 * interrompe.** A gaveta se abre para escolher e some, e empurrar a conversa
 * para baixo é o que ela já fazia. Esta é modal: ela existe porque a pessoa
 * tentou fazer uma coisa e não pôde, e empurrada para o fim da página ela seria
 * uma resposta que ninguém vê. O precedente aqui é a lupa da imagem, e ela
 * empresta o véu, o andar e o gesto de fechar.
 *
 * **O fundo é medido, e não escolhido.** A caixa cobre a página do cliente,
 * então precisa ser opaca — e o plugin não sabe o fundo dela.
 *
 * **E medir é o SCRIPT escrevendo no próprio elemento, nunca um `var()` com
 * reserva.** A primeira versão desta regra escrevia `var( --lym-painel, #fff )`
 * confiando numa variável que **ninguém declara na raiz**: quem escreve
 * `--lym-painel` é o painel do índice e a fileira do carrossel, cada um no
 * próprio elemento. Fora deles a reserva vence sempre — e num site de tema
 * escuro isso é uma caixa branca de letra preta no meio de uma página preta.
 * A reserva continua aí, e agora ela só aparece se o script não rodar.
 */
.lym-convite[hidden] {
	display: none !important;
}

.lym-convite.lym-convite {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;

	display: flex;
	align-items: center;
	justify-content: center;

	padding: 1.5rem;

	background: rgba( 0, 0, 0, 0.72 );

	/* O mesmo andar da lupa, e pela mesma razão escrita lá. */
	z-index: 2147483001;
}

.lym-convite__caixa.lym-convite__caixa {
	position: relative;

	box-sizing: border-box;
	width: 100%;
	max-width: 26rem;

	padding: 1.75rem 1.5rem 1.5rem;

	background: var( --lym-painel, #ffffff );
	border: 1px solid rgba( 128, 128, 128, 0.38 );
	border-radius: 0.75rem;

	/*
	 * A mesma luz de cima de cartão, topo e caixa de aviso: ela só ADICIONA, e
	 * num tema claro é invisível.
	 */
	box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.07 );
}

.lym-convite__titulo {
	margin: 0 0 0.5rem;

	font-size: 1.15rem;
	line-height: 1.3;
}

.lym-convite__texto {
	margin: 0 0 1.25rem;

	font-size: 0.95rem;
	line-height: 1.5;
}

/*
 * **Empilhados no celular e lado a lado a partir daí**, e o `wrap` é quem decide:
 * "Entrar" e "Criar conta" somam uns 260px, e numa caixa de 26rem eles cabem —
 * numa tela de 320px, não. Um media query aqui responderia sobre a JANELA, e
 * quem aperta é a caixa.
 */
.lym-convite__portas {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;

	margin: 0;
}

.lym-convite__portas .lym-botao {
	flex: 1 1 10rem;

	text-align: center;
}

/*
 * **O fechar tem 44px de altura clicável**, e ele cresce por recheio porque quem
 * desenha aqui não é a borda: é só o sinal, sem contorno nenhum.
 */
.lym-convite__fechar.lym-convite__fechar {
	position: absolute;
	top: 0.25rem;
	right: 0.25rem;

	min-width: 44px;
	min-height: 44px;
	padding: 0;

	background: none;
	border: 0;
	border-radius: 0.5rem;

	color: inherit;
	font-size: 1.5rem;
	line-height: 1;

	cursor: pointer;
	opacity: 0.7;
}

.lym-convite__fechar.lym-convite__fechar:hover,
.lym-convite__fechar.lym-convite__fechar:focus {
	opacity: 1;
}

.lym-convite__fechar.lym-convite__fechar:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

.lym-lupa[hidden] {
	display: none !important;
}

.lym-lupa.lym-lupa {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;

	display: flex;
	align-items: center;
	justify-content: center;

	padding: 1.5rem;

	background: rgba( 0, 0, 0, 0.82 );

	/*
	 * **O andar mais alto do plugin, acima das barras presas do leitor de voz**
	 * (1.107.0). O número é absurdo de propósito: o player de vídeo do cliente
	 * empilha nessa faixa, e a razão inteira está escrita no bloco do índice.
	 *
	 * Ele subiu de 2147482998 para cá quando a coluna do menu passou a ficar
	 * presa no alto nos conteúdos com leitor: uma peça presa cria contexto de
	 * empilhamento, então ela precisou subir para o teto da família (2147483000,
	 * o do painel do índice, que mora dentro dela) — e uma caixa que cobre a tela
	 * inteira não pode ficar por baixo de uma barra.
	 */
	z-index: 2147483001;
}

.lym-lupa__imagem.lym-lupa__imagem {
	display: block;
	max-width: 100%;
	max-height: 100%;
	width: auto;
	height: auto;
	border-radius: 4px;
}

/*
 * O botão de fechar, no canto superior direito.
 *
 * **Ele carrega o próprio fundo, e é o que torna a conta simples.** A letra é
 * branca contra um cinza escuro que este bloco desenha — não contra a foto, que
 * pode ser de qualquer cor. É a mesma mecânica do botão principal e da bolinha
 * do sino: quando a peça traz o fundo, o contraste deixa de depender do tema.
 *
 * Branco sobre `#3a3a3a` dá 11,37:1, e 7,57:1 no gesto (`#545454`). `position: fixed` e não `absolute` porque o
 * véu é o pai e ele já ocupa a tela — mas o `padding` do véu empurraria o botão
 * para dentro, longe do canto.
 */
.lym-lupa__fechar.lym-lupa__fechar {
	position: fixed;
	top: 0.75rem;
	right: 0.75rem;

	display: inline-flex;
	align-items: center;
	justify-content: center;

	/* O alvo de toque inteiro: 44px de ALTURA clicável, não só de largura. */
	width: 44px;
	height: 44px;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 50%;
	background: #3a3a3a;
	color: #ffffff;

	font: inherit;
	font-size: 1.5rem;
	line-height: 1;
	cursor: pointer;
}

.lym-lupa__fechar.lym-lupa__fechar:hover,
.lym-lupa__fechar.lym-lupa__fechar:focus {
	background: #545454;
	color: #ffffff;
}

/*
 * O anel não pode ser `currentColor`: ali ele é o branco da letra, desenhado
 * fora do botão, sobre um véu quase preto. É a mesma razão registrada para o
 * botão principal e para o do pagamento.
 */
.lym-lupa__fechar.lym-lupa__fechar:focus-visible {
	outline: 2px solid #ffffff;
	outline-offset: 2px;
}

/*
 * O botão que pede a permissão de aviso no celular.
 *
 * **Ele nasce escondido, e quem o mostra é o script.** Pedir a permissão depende
 * de o navegador saber fazer, e de a pessoa ainda não ter respondido — botão que
 * recusa o clique é pior que botão nenhum, e este recusaria com um pedido que o
 * navegador nunca mais faz.
 *
 * O atributo é citado no seletor porque o `[hidden]` do navegador tem peso ZERO:
 * qualquer `display` numa classe o vence, e a folha traria de volta o botão que
 * o script escondeu.
 */
.lym-push[hidden] {
	display: none !important;
}

.lym-push {
	display: flex;
	flex-wrap: wrap;
	gap: .6rem;
	align-items: center;
	margin: 1.5rem 0 0;
}

.lym-push__estado {
	font-size: .9rem;
	opacity: .75;

	/*
	 * **Sem cor própria.** A frase é sobre o navegador de quem lê, e não sobre o
	 * plugin — e uma cor de alerta aqui competiria com a do tema numa tela que o
	 * cliente desenhou.
	 */
	max-width: 100%;
}

/*
 * **O botão do microfone em repouso, e ele é outra peça que o "gravando".**
 *
 * O pedido foi um microfone verde, e verde no CRONÔMETRO diria o contrário do
 * que aquela peça significa — ela é a única coisa que avisa que o site ainda
 * está ouvindo. Aqui é o convite: "grave uma mensagem de voz".
 *
 * **Só o microfone, e não o botão de imagem ao lado.** Os dois dividem a classe
 * `.lym-campo__acao`; quem os separa é o atributo que o script já usa para
 * achar o gravador — e usar o mesmo atributo mantém a folha e o script falando
 * da mesma peça.
 *
 * A cadeia é a de sempre: o que o dono escolheu, depois o tom medido contra o
 * fundo real, e por fim a cor do texto para quem não tem JavaScript.
 */
/*
 * **A réplica da caixa de quem não entrou tem o mesmo verde** (19/09/2026). Ela é
 * reconhecida por `data-lym-microfone`, um atributo só da folha: o
 * `data-lym-gravar` é o gancho dos scripts do gravador, e a réplica não grava.
 */
.lym-campo__acao.lym-campo__acao[data-lym-gravar],
.lym-campo__acao.lym-campo__acao[data-lym-microfone] {
	color: var( --lym-voz, var( --lym-voz-medido, currentColor ) );
}

/*
 * **O botão de anexar imagem, e a cor sai de um papel que já existe.**
 *
 * Ele era cinza — herdava a cor do texto, que é o que `.lym-campo__acao`
 * declara. Ao lado de um microfone verde, o ícone de imagem lia como o botão
 * desligado do par.
 *
 * **`--lym-info` e não os outros três, e a escolha é por eliminação medida.**
 * `--lym-feito` é o MESMO par de `--lym-voz` (#15803d / #22c55e): dois ícones
 * verdes lado a lado deixariam de se distinguir. `--lym-link` é o vermelho da
 * ação, e o botão de enviar logo ao lado já é vermelho sólido — dois vermelhos
 * na mesma linha é exatamente o que a regra da casa proíbe, porque quando tudo
 * tem o mesmo tom nenhuma peça é destaque. `--lym-atencao` diz "algo está para
 * acabar", e anexar uma imagem não avisa nada.
 *
 * Sobra o azul, e ele é o que resta em sentido também: nem ação principal, nem
 * progresso, nem alerta. As contas, contra os dois fundos de referência:
 * #1d5faf sobre #ffffff dá 6,35:1 e #6eacf7 sobre #121212 dá 7,95:1 — os dois
 * acima do 4,5 que esta base exige até de ícone, e é o par mais folgado dos
 * quatro.
 *
 * **Nada de `-medido` aqui.** `--lym-info` é papel FIXO e a folha o DECLARA;
 * uma variável declarada nunca cai no valor de reserva do `var()`, e escrever
 * a cadeia de três degraus num papel declarado deixaria o tom medido inerte.
 * Essa já foi paga inteira, com a suíte verde.
 *
 * **A ponta do seletor continua sendo `lym-campo__acao`**, e é o que mantém
 * `Lym_Tema::PINTADAS` do tamanho que está: uma classe nova declarando `color`
 * num `<label>` obrigaria a lista a crescer no mesmo commit, e esquecer isso
 * apaga a cor só para quem liga o tema forçado — que é o primeiro cliente.
 */
.lym-campo__acao.lym-campo__acao[data-lym-anexar] {
	color: var( --lym-info );
}

/* ---------------------------------------------------------------------------
 * A barra da gravação, ACIMA do campo.
 *
 * **O campo de texto CONTINUA na tela enquanto se grava.** O desenho original a
 * punha no lugar dele; isso caiu junto com a exclusividade entre áudio e texto,
 * porque esconder o que a pessoa já escreveu o faria sumir da vista no meio da
 * fala e voltar depois.
 *
 * **Ela subiu para cima do campo em 05/09/2026**, a pedido do dono do site: é
 * onde o aplicativo de mensagens que todo mundo usa a põe. Quem manda a ordem
 * aqui é o DOCUMENTO — `.lym-escrever` é um bloco comum, sem `order` nenhum,
 * então quem lê a view vê a mesma sequência que a tela mostra. Um `order` de
 * flex faria o teclado percorrer a tela numa ordem e o olho em outra.
 *
 * A margem trocou de lado junto: estando acima, o respiro dela é embaixo.
 *
 * Ela nasce escondida — sem `MediaRecorder` não há gravação, e uma barra de
 * controles de uma coisa que não acontece é pior que barra nenhuma. Quem cita o
 * `[hidden]` é a regra geral lá de cima, que repete o atributo três vezes.
 * ------------------------------------------------------------------------- */
.lym-gravacao {
	margin: 0 0 0.5rem;
}

.lym-gravacao__linha {
	display: flex;
	align-items: center;
	gap: 0.6rem;

	/* O texto do relógio não pode empurrar a onda para fora da largura. */
	min-width: 0;
}

/*
 * O relógio do que já foi falado, e o prazo do que resta.
 *
 * **Números tabulares**, senão a linha inteira estremece a cada segundo: num
 * tipo proporcional o "1" é mais estreito que o "8", e a onda ao lado dança
 * junto. `font-variant-numeric` é a forma certa de pedir isso; quem não a
 * entender continua com a mesma tela de antes.
 */
.lym-gravacao__tempo,
.lym-gravacao__resta {
	flex: 0 0 auto;
	font-size: 0.8125rem;
	font-variant-numeric: tabular-nums;
	opacity: 0.75;
}

/*
 * **O prazo que resta fica ÂMBAR no último minuto**, e é o único uso de cor da
 * barra. Âmbar chama a atenção sem dizer que algo deu errado, que é o que o
 * vermelho diria — e o vermelho já é o botão de enviar, ali do lado.
 *
 * `--lym-atencao` mede 5,94:1 no claro e 8,72:1 no escuro, e a peça é uma
 * palavra curta, que é exatamente a área em que o âmbar não grita mais que o
 * botão.
 */
.lym-gravacao__resta--pouco {
	color: var( --lym-atencao );
	opacity: 1;
}

/*
 * A onda que se forma enquanto se fala.
 *
 * **Ela reusa as classes da onda já publicada**, e não desenha as suas: duas
 * maneiras de desenhar a mesma coisa é como uma delas para de receber a
 * correção da outra. O que muda é a ESCALA — ao vivo não existe "pico da
 * gravação inteira" para normalizar, e a razão está escrita no script.
 */
.lym-gravacao__onda {
	display: flex;
	align-items: center;
	gap: 2px;
	height: 28px;

	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;

	/*
	 * **O cursor diz que dá para apontar.** Pausada, clicar na onda toca a
	 * partir dali — e um alvo clicável sem pista nenhuma é um recurso que só
	 * quem já sabe descobre.
	 */
	cursor: pointer;

	/*
	 * **Da direita para a esquerda**: a barra nova entra pela direita e empurra
	 * as antigas, como um sismógrafo. Sem isto a onda cresce para a direita e
	 * some da tela justamente na ponta que interessa, que é a de agora.
	 */
	justify-content: flex-end;
}

/*
 * **Os três botões ficam centralizados, e a pílula NÃO estica.**
 *
 * Ela era `flex: 1 1 auto` e ocupava tudo o que sobrava: num monitor de
 * computador virava uma faixa de mil pixels com a palavra "Pausar" perdida no
 * meio, enquanto a lixeira e o enviar ficavam espremidos nas pontas. O botão
 * mais largo da tela passava a ser o que menos importa.
 *
 * Agora ela tem um tamanho confortável e um TETO, e o grupo inteiro se centra —
 * no celular ela encolhe até o mínimo e continua cabendo com os outros dois.
 */
.lym-gravacao__botoes {
	display: grid;

	/*
	 * **Três colunas, e a do meio é a única com conteúdo obrigatório.** A
	 * legenda ocupa a primeira, os botões a segunda, e a terceira fica vazia
	 * de propósito: é ela que mantém o grupo CENTRADO na largura inteira,
	 * seja qual for o tamanho da frase ao lado.
	 *
	 * **`minmax( 0, 1fr )` e não `1fr`, e a ressalva importa.** O mínimo de uma
	 * coluna `1fr` é `auto`, que é o min-content do que está dentro: uma frase
	 * longa faria a primeira coluna crescer além da fração e empurrar os botões
	 * para a direita — e a frase muda de tamanho ao pausar, então eles
	 * dançariam.
	 *
	 * **Hoje quem impede isso é o `min-width: 0` da própria legenda**, que vem
	 * de `.lym-escrever__estado`: com ele, um `1fr` seco se comportaria igual.
	 * Fica escrito porque a mutação que troca um pelo outro NÃO derruba a
	 * suíte, e a leitura seguinte concluiria "isto é enfeite". Não é: o
	 * `minmax` diz a intenção na coluna, onde ela é lida, e não depende de uma
	 * propriedade escrita em outra regra, mil linhas acima, por outro motivo.
	 */
	grid-template-columns: minmax( 0, 1fr ) auto minmax( 0, 1fr );

	align-items: center;
	gap: 0.6rem;
	margin: 0.35rem 0 0;
}

/*
 * A caixa dos três botões, que é quem de fato os alinha.
 *
 * Sem ela, cada botão cairia numa célula da grade e a legenda ao lado passaria a
 * disputar o lugar do primeiro.
 */
.lym-gravacao__acoes {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.6rem;

	min-width: 0;
}

/*
 * A legenda ao vivo — "Gravando…" —, no canto esquerdo da fileira.
 *
 * **Ela É uma linha de estado, e leva as duas classes.** O tamanho, o corte com
 * reticências e o apagado vêm de `.lym-escrever__estado`, que é a mesma peça do
 * rodapé — repetir as propriedades aqui seria uma segunda conta para refazer. E
 * ela paga sozinha uma coisa que ninguém lembraria: a limpeza do envio sem
 * recarga varre `.lym-escrever__estado` (`publico.js`), então sem a classe
 * compartilhada o "Gravando…" sobreviveria ao envio, em vermelho, sobre um
 * compositor já esvaziado.
 *
 * **O que é só daqui é o alinhamento ao ALTO.** É o pedido do dono do site: a
 * frase fica logo abaixo da contagem que corre à esquerda da onda, e não no meio
 * de uma fileira de botões de 44px — ali ela pareceria uma legenda da lixeira.
 */
.lym-gravacao__estado {
	align-self: start;
}

/*
 * **No celular a legenda sobe para uma linha só dela, e quem for cortado é o
 * problema — não a falta de espaço.**
 *
 * A primeira versão deste comentário somava 220px de botão e afirmava que não
 * cabia. A conta estava errada, e o próprio arquivo a desmente treze linhas
 * acima: a pílula do meio é `flex: 0 1 auto` com `min-width: 0`, ou seja, ela
 * ENCOLHE — os três botões descem a uns 140px se precisarem.
 *
 * O problema real é QUEM encolhe primeiro. Numa tela de 320px, dividir a
 * largura entre a frase e os botões faz a pílula virar "Paus…" e a legenda
 * virar "Grava…": as duas ficam ilegíveis para ganhar uma linha. Empilhadas,
 * as duas cabem inteiras, a frase continua LOGO ABAIXO da contagem — que é o
 * que o arranjo existe para fazer — e os botões ficam centrados embaixo.
 */
@media ( max-width: 600px ) {
	.lym-gravacao__botoes {
		grid-template-columns: minmax( 0, 1fr );
	}
}

/*
 * A lixeira e o botão de ouvir: redondos, do tamanho do dedo.
 *
 * **44px de ALTURA clicável.** É sempre a altura que falta — o alvo parece
 * grande porque é largo.
 */
.lym-gravacao__apagar.lym-gravacao__apagar,
.lym-gravacao__ouvir.lym-gravacao__ouvir {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	height: 44px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 50%;
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
	opacity: 1;

	cursor: pointer;
	overflow: hidden;
}

.lym-gravacao__apagar.lym-gravacao__apagar:hover,
.lym-gravacao__apagar.lym-gravacao__apagar:focus,
.lym-gravacao__ouvir.lym-gravacao__ouvir:hover,
.lym-gravacao__ouvir.lym-gravacao__ouvir:focus {
	background: rgba( 128, 128, 128, 0.3 );
	color: inherit;
}

.lym-gravacao__apagar svg {
	width: 20px;
	height: 20px;
}

/*
 * O triângulo de tocar é um elemento, e não um caractere: o leitor de tela
 * reanunciaria a peça inteira se o conteúdo do botão mudasse. É a mesma decisão
 * da onda já publicada.
 */
.lym-gravacao__triangulo {
	width: 0;
	height: 0;
	border-top: 6px solid transparent;
	border-bottom: 6px solid transparent;
	border-left: 10px solid currentColor;
	margin-left: 2px;
}

/*
 * A pílula do meio — pausar e continuar são o MESMO botão em dois estados.
 *
 * Ela ocupa o espaço que sobra, que é o que a faz parecer o comando principal da
 * barra sem gastar cor nenhuma: quem carrega a cor ali é o enviar.
 */
.lym-gravacao__pausar.lym-gravacao__pausar {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.5rem;

	/*
	 * **Ela cresce até um teto, e não até o fim da linha.** `1 1 auto` a fazia
	 * ocupar todo o espaço que sobrava: num monitor grande a palavra "Pausar"
	 * ficava sozinha no meio de uma faixa enorme, e o botão mais largo da tela
	 * passava a ser o que menos importa. Encolhe no celular, para no computador.
	 */
	flex: 0 1 auto;
	max-width: 100%;
	min-width: 0;

	/*
	 * **`min-height`, e não `height`.** Com a palavra podendo quebrar em duas
	 * linhas (ver `.lym-gravacao__rotulo`), uma altura FIXA de 44px recortaria a
	 * segunda linha em silêncio no dia em que o tema do cliente tivesse a letra
	 * maior: duas linhas a 1,2 de entrelinha cabem em 44px com letra de 16px e
	 * passam de 44 a partir de 19px. Os 44px continuam sendo o PISO do alvo de
	 * toque, que é o que a regra existe para garantir — ela só deixou de ser
	 * também um teto. Em repouso nada muda: uma linha de texto não chega perto.
	 */
	min-height: 44px;

	margin: 0;
	padding: 0 1rem;

	border: 0;
	border-radius: 22px;
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
	opacity: 1;

	font: inherit;
	line-height: 1.2;
	cursor: pointer;

	/* Nada vaza da pílula numa coluna estreita. */
	overflow: hidden;
	white-space: nowrap;
}

.lym-gravacao__pausar.lym-gravacao__pausar:hover,
.lym-gravacao__pausar.lym-gravacao__pausar:focus {
	background: rgba( 128, 128, 128, 0.3 );
	color: inherit;
}

/*
 * O desenho de pausar são DOIS TRAÇOS, que é o universal de pausa. Ele já foi
 * um quadrado — o universal de PARAR —, e o botão não para nada: a gravação
 * continua de onde ficou. O desenho segue o que o botão faz.
 *
 * O segundo traço é uma SOMBRA, e é por isso que ele não ocupa lugar nenhum: a
 * peça mede 4px e desenha 10px. Enquanto o estado pausado trocava esta mesma
 * peça por um triângulo, a sombra tinha de ser apagada lá — ela seguia a caixa
 * de borda da seta e pintava um bloco cheio seis pixels à direita dela. Desde
 * 17/09/2026 o pausado a esconde inteira, e essa armadilha deixou de existir:
 * o que aparece no lugar é outro elemento.
 */
.lym-gravacao__parada {
	display: inline-block;
	width: 4px;
	height: 12px;
	flex: 0 0 auto;
	background: currentColor;
	border-radius: 1px;
	box-shadow: 6px 0 0 currentColor;
}

/*
 * PAUSADO, O DESENHO É UM MICROFONE — e não mais o triângulo de tocar.
 *
 * **Pedido do Flávio em 17/09/2026, com a razão dele:** a seta para a direita é
 * o universal de TOCAR, e a barra tem, três peças à esquerda, um botão de ouvir
 * que é exatamente essa seta (`.lym-gravacao__triangulo`). Duas setas iguais na
 * mesma fileira, uma tocando e a outra gravando, é a tela pedindo que a pessoa
 * adivinhe qual é qual. O microfone diz o que o botão faz, e é o desenho que o
 * aplicativo de mensagens que todo mundo usa põe ali.
 *
 * **É o MESMO microfone do botão de gravar**, `d` por `d` — e reusar o desenho
 * não é economia de bytes: dois desenhos do mesmo ícone é como um deles deixa
 * de receber a correção do outro.
 *
 * **Quem troca as duas peças é a CLASSE, e nunca o script escrevendo dentro do
 * botão** — trocar o conteúdo faz o leitor de tela reanunciar a peça inteira a
 * cada clique. É a mesma decisão do botão do microfone e da onda sonora.
 */
.lym-gravacao--pausada .lym-gravacao__parada {
	display: none;
}

/*
 * **O microfone precisa de tamanho DECLARADO, e isso não é zelo.** Não existe
 * regra genérica de `svg` em folha nenhuma: as que existem são todas escopadas
 * a um botão. Quem dá tamanho ao microfone do compositor é `.lym-campo__acao
 * svg`, que não alcança aqui dentro — e um `<svg>` com `viewBox` e sem largura
 * declarada cai no tamanho padrão de elemento substituído, ou seja, sai enorme
 * e recortado pelo `overflow: hidden` da pílula.
 *
 * **`flex: 0 0 auto` pela mesma razão que o traço de pausa já tem:** numa
 * coluna estreita a pílula encolhe, e quem tem de ceder é o texto, nunca o
 * ícone — um microfone amassado deixa de ser um microfone.
 *
 * Ele é 18px, e não os 20px da lixeira nem os 22px do microfone de gravar: ali
 * o ícone é o botão inteiro, aqui ele divide a pílula com uma palavra, e ao
 * lado de um texto de 16px um ícone de 20 pesa mais que a palavra.
 */
.lym-gravacao__microfone {
	display: none;
	width: 18px;
	height: 18px;
	flex: 0 0 auto;
}

.lym-gravacao--pausada .lym-gravacao__microfone {
	display: block;
}

/*
 * O enviar da barra é o mesmo botão principal do compositor: preenchimento
 * sólido, um por tela. Ele não se reveza com nada aqui — durante a gravação
 * sempre há o que enviar.
 */
.lym-gravacao__enviar.lym-gravacao__enviar {
	display: inline-flex;
	align-items: center;
	justify-content: center;

	width: 44px;
	height: 44px;
	flex: 0 0 auto;

	margin: 0;
	padding: 0;

	border: 0;
	border-radius: 50%;
}

.lym-gravacao__enviar.lym-gravacao__enviar svg {
	width: 22px;
	height: 22px;
}

/*
 * A palavra da pílula — "Pausar" ou "Continuar gravando".
 *
 * **Ela tem classe própria porque é o único texto da barra que TROCA.** Sem um
 * lugar nomeado, o script escreveria no botão inteiro, e trocar o conteúdo de um
 * botão faz o leitor de tela reanunciar a peça a cada clique — que é a lição
 * registrada no botão do microfone e no da onda sonora.
 *
 * **`white-space: normal` é o que deixa "Continuar gravando" cair em duas
 * linhas**, e a escolha é do Flávio (17/09/2026). A pílula inteira é `nowrap`,
 * e o rótulo desfaz isso só para si: assim o navegador mantém a frase numa
 * linha só enquanto houver espaço e a parte em duas exatamente quando não
 * houver — sem media query nenhuma. **É a regra da casa aplicada aqui: quem
 * aperta é a COLUNA, e não a janela.** A caixa de escrever desce para dentro da
 * lista de respostas quando alguém responde, e lá ela é estreita mesmo num
 * monitor grande; um `@media` de largura de tela não alcançaria esse caso.
 *
 * **O preço, declarado:** quebrando, o `text-overflow` deixa de agir — ele só
 * vale para texto que não quebra. Numa coluna mais estreita que UMA palavra o
 * corte passa a ser seco, sem as reticências. É de propósito: uma palavra só
 * cortada com reticências ("Cont…") não diz mais do que uma palavra só cortada,
 * e naquela largura a fileira dos três botões já não cabe desde antes disto.
 */
.lym-gravacao__rotulo {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;

	white-space: normal;
	text-align: center;

	/*
	 * **A entrelinha é do RÓTULO, e ela conserta a perna do "g" cortada.**
	 *
	 * A pílula declara `line-height: 1.2`, e 1,2 é MENOR que o desenho da letra:
	 * medido em 17/09/2026, a caixa dá 19px e a tinta precisa de 20px. O
	 * `overflow: hidden` daqui come a diferença — e a perna do "g" é justamente
	 * o que mora no pixel comido.
	 *
	 * **O defeito é ANTIGO, e a palavra nova só o revelou:** enquanto a pílula
	 * dizia "Pausar" e "Continuar", nenhuma letra descia abaixo da linha de base.
	 * "gravando" desce, e o Flávio viu no telefone dele.
	 *
	 * **1,35 e não mais:** com duas linhas a conta dá 43,2px, que ainda cabe nos
	 * 44px do alvo de toque sem empurrar a pílula. Acima de 1,375 ela cresceria —
	 * o que não seria errado (`min-height` é piso), mas mexeria na fileira sem
	 * necessidade.
	 */
	line-height: 1.35;
}

/*
 * O botão de ouvir enquanto TOCA: o triângulo vira dois traços.
 *
 * **Quem troca o desenho é a classe, e não o script escrevendo dentro do
 * botão** — trocar o conteúdo faz o leitor de tela reanunciar a peça inteira a
 * cada clique. É a mesma decisão do quadrado de parar do microfone.
 */
.lym-gravacao__ouvir--tocando .lym-gravacao__triangulo {
	width: 4px;
	height: 12px;
	margin-left: 0;
	border: 0;
	border-radius: 1px;
	background: currentColor;
	box-shadow: 6px 0 0 currentColor;
}

/*
 * **Com a barra de gravação na tela, o enviar de CIMA sai.**
 *
 * Os dois mandariam a mesma mensagem, e um deles fica longe do que ela mostra —
 * dois botões para a mesma coisa é a tela perguntando duas vezes. Quem manda
 * enquanto há gravação é o enviar da barra, ao lado da lixeira e do que se
 * ouve.
 */
.lym-escrever--com-barra .lym-escrever__enviar.lym-escrever__enviar {
	display: none;
}

/*
 * O estado de GRAVADO: a barra fica, mostrando o que se tem.
 *
 * **Parar guardava o áudio e sumia com a barra**, e o compositor voltava ao
 * repouso com um "Gravação pronta · 0:06" no rodapé e o botão de enviar lá em
 * cima — a mesma gravação anunciada em dois lugares, e nenhum deles mostrando o
 * que ela É. Quem parou quer conferir antes de mandar.
 *
 * A linha perde a onda em movimento e vira o que ela virou: play, onda parada e
 * a duração. As duas pílulas saem — não há mais gravação para pausar nem para
 * parar —, e ficam a lixeira, para refazer, e o enviar.
 */
.lym-gravacao--gravada .lym-gravacao__onda {
	justify-content: flex-start;
}

/*
 * ============================================================================
 * O leitor de voz (1.107.0, 19/09/2026).
 * ============================================================================
 *
 * Uma barra no alto do texto do conteúdo: o ícone e a palavra, o play que vira
 * stop, a velocidade e a voz. Ela mora DENTRO do embrulho do texto
 * (`[data-lym-leitor-texto]`), e por isso, presa no alto, acompanha o texto e
 * sai de cena junto com ele quando a pessoa chega na conversa.
 *
 * **Presa no alto pelo `sticky`, e não pelo `fixed`**, porque ela precisa
 * continuar no fluxo: no começo da página ela é a primeira linha do texto, e só
 * gruda quando a rolagem a alcança. O `top` vem do script
 * (`--lym-leitor-topo`): no tablet e no celular é o pé da barra do menu, que
 * também fica presa; no computador, a barra do WordPress de quem administra.
 *
 * **As duas camadas são altas de propósito, e a do menu é a MAIS ALTA da
 * família.** Uma peça presa passa por cima do conteúdo que rola, e o conteúdo
 * pode ter um tocador de vídeo com camada própria — é por isso que os painéis
 * do plugin usam números absurdos (2147482998 a 2147483000).
 *
 * Como `sticky` cria um contexto de empilhamento, tudo o que mora dentro da
 * barra do menu — o painel do índice (2147483000), o véu dele e o painel do
 * sino — passa a valer só até a camada DELA. Por isso ela leva o TETO da
 * família, e não um número abaixo: com 2147482990, um player do cliente
 * empilhado entre 2147482991 e 2147483000 passava a cobrir o painel do índice
 * aberto, que antes o cobria (medido em navegador pela revisão adversarial).
 *
 * O leitor fica um degrau abaixo, para o painel do sino que desce do menu
 * cobrir a barra do leitor, e não o contrário; e as caixas que cobrem a tela
 * inteira (o convite e a lupa) subiram para 2147483001, acima das duas.
 *
 * **O fundo é opaco e é o da página**, medido pelo script (`--lym-painel`): o
 * texto que rola por baixo não pode aparecer através da barra.
 */
.lym-leitor {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0 0.4rem;
	box-sizing: border-box;
	max-width: 100%;
	margin: 0 0 1.25rem;
	padding: 0.5rem 0;

	position: sticky;
	top: var( --lym-leitor-topo, 0px );
	z-index: 2147482999;
	background: var( --lym-painel, Canvas );
	box-shadow: 0 1px 0 var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
}

/*
 * O ícone é da cor de orientação da tela — a mesma cadeia do sino e da bolinha
 * de concluído —, e a palavra é do texto.
 */
.lym-leitor__nome {
	display: flex;
	align-items: center;
	gap: 0.4rem;
	min-width: 0;
	flex: 0 1 auto;
}

.lym-leitor__icone {
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	color: var( --lym-destaque, var( --lym-info, currentColor ) );
}

/*
 * **A palavra menor que o texto da pagina** (1.115.0, pedido do Flavio). Ela e
 * etiqueta, e nao leitura: quem carrega a hierarquia aqui e o PESO, como no
 * menu do comprador — e a barra nao tem largura sobrando em telefone nenhum.
 */
.lym-leitor__rotulo {
	font-size: 0.8125rem;
	font-weight: 600;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

/*
 * O play: o mesmo desenho do tocador da mensagem de voz (redondo, 44px, contorno
 * de cinza), para a pessoa reconhecer o botão de ouvir do site. Classe DOBRADA,
 * porque o tema pinta os botões dele — e o Kit do Elementor pesa (0,1,1).
 */
.lym-leitor__tocar.lym-leitor__tocar {
	display: flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 44px;
	min-width: 44px;
	height: 44px;
	flex: 0 0 auto;
	margin: 0;
	padding: 0;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 50%;
	background: rgba( 128, 128, 128, 0.10 );
	color: inherit;
	cursor: pointer;
}

.lym-leitor__tocar.lym-leitor__tocar:hover,
.lym-leitor__tocar.lym-leitor__tocar:focus,
.lym-leitor__tocar.lym-leitor__tocar:active {
	border-color: var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
}

.lym-leitor__tocar.lym-leitor__tocar:focus-visible {
	outline: 2px solid var( --lym-link, currentColor );
	outline-offset: 2px;
}

/* ---------------------------------------------------------------------------
 * O FUNDO DOS BOTÕES EM FOCO, E POR QUE ELE PRECISA DE TRÊS CLASSES.
 *
 * **O "bloco rosa" do celular do Flávio era o TEMA pintando o botão com foco**
 * (visto no site em 20/09/2026, primeiro sobre a pílula da voz e depois sobre o
 * X do popup). A conta é de especificidade, e ela já está registrada neste
 * arquivo para os links: o Kit do Elementor declara `.elementor-kit-N button`
 * com peso (0,1,1) — e no ESTADO, `.elementor-kit-N button:focus`, ele vai a
 * (0,2,1). Nossas regras de botão são de classe DOBRADA, (0,2,0), e a do estado
 * `.lym-leitor__tocar.lym-leitor__tocar:focus` dá (0,2,1): EMPATA. Em empate
 * vence quem vem depois, e o Kit é carregado depois da nossa folha.
 *
 * **Por isso o estado leva TRÊS classes** (0,3,1), que ganha em qualquer ordem —
 * é a mesma escada que o sino e o "Grupo" subiram na 1.77.0, agora para o
 * fundo em vez de para a cor.
 *
 * **E a regra vale para TODO botão do leitor, e não só para o que apareceu
 * pintado.** O defeito só se mostra onde há foco, e o foco anda: hoje na pílula
 * da voz, amanhã no play, se alguém mexer na ordem de quem recebe o foco.
 * ------------------------------------------------------------------------- */
.lym-leitor__tocar.lym-leitor__tocar.lym-leitor__tocar:focus,
.lym-leitor__tocar.lym-leitor__tocar.lym-leitor__tocar:active,
.lym-leitor__tocar.lym-leitor__tocar.lym-leitor__tocar:focus-visible {
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
}

.lym-leitor__voz-botao.lym-leitor__voz-botao.lym-leitor__voz-botao:focus,
.lym-leitor__voz-botao.lym-leitor__voz-botao.lym-leitor__voz-botao:active,
.lym-leitor__voz-botao.lym-leitor__voz-botao.lym-leitor__voz-botao:focus-visible {
	background: none;
	color: inherit;
}

.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce:focus,
.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce:active,
.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce:focus-visible {
	background: rgba( 128, 128, 128, 0.18 );
	color: inherit;
}

/*
 * **O triângulo vira quadrado pelo `aria-pressed`**, que é o mesmo atributo que
 * diz o estado ao leitor de tela: o que a tela mostra e o que se anuncia saem de
 * uma fonte só. É uma peça só, recortada, como no tocador da mensagem de voz.
 */
.lym-leitor__forma {
	display: block;
	width: 12px;
	height: 14px;
	margin-left: 3px;
	background: currentColor;
	clip-path: polygon( 0 0, 100% 50%, 0 100% );
}

.lym-leitor__tocar[aria-pressed="true"] .lym-leitor__forma {
	height: 12px;
	margin-left: 0;
	border-radius: 2px;
	clip-path: none;
}

/*
 * A velocidade é uma pílula com a velocidade que está valendo e uma lista do
 * navegador invisível por cima — o mesmo arranjo da voz, e pela mesma razão:
 * à vista, a lista tem a largura da opção mais longa e a barra não cabe numa
 * linha de telefone.
 *
 * **A largura é fixa**, do tamanho do rótulo mais largo ("1,25x", "0,75x"):
 * mudando a cada escolha, ela empurraria a voz para o lado. Os algarismos têm
 * a mesma largura (`tabular-nums`) pelo mesmo motivo.
 */
.lym-leitor__velocidade {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	box-sizing: border-box;
	width: 3.25rem;
	min-height: 44px;
	flex: 0 0 auto;
	padding: 0 0.4rem;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 22px;
	background: rgba( 128, 128, 128, 0.10 );
	font-size: 0.8125rem;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	-webkit-tap-highlight-color: transparent;
}

.lym-leitor__velocidade-valor {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
}

/*
 * **O gesto do mouse só existe onde há mouse.** Num aparelho de toque o `:hover`
 * GRUDA depois do toque, e a pílula ficava acesa até a pessoa tocar em outro
 * lugar.
 */
@media ( hover: hover ) {
	.lym-leitor__velocidade:hover {
		background: rgba( 128, 128, 128, 0.18 );
	}
}


/*
 * **A voz é uma lista do navegador INVISÍVEL por cima de um desenho nosso.** Os
 * nomes das vozes são longos, e à vista a lista não caberia na barra de um
 * telefone; o desenho mostra a pessoa falando e a palavra "Voz", e o toque em
 * qualquer ponto dele abre a lista nativa, que é a que traz o nome de cada voz.
 * A lista continua sendo o controle de verdade: é ela que recebe o foco e que o
 * leitor de tela anuncia, com a voz escolhida.
 */
.lym-leitor__voz {
	position: relative;
	display: inline-flex;
	align-items: center;
	gap: 0.25rem;
	box-sizing: border-box;
	min-height: 44px;
	flex: 0 0 auto;
	padding: 0 0.55rem;
	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 22px;
	background: rgba( 128, 128, 128, 0.10 );
	font-size: 0.8125rem;
	-webkit-tap-highlight-color: transparent;
}

@media ( hover: hover ) {
	.lym-leitor__voz:hover {
		background: rgba( 128, 128, 128, 0.18 );
	}
}

/*
 * **O ANEL DE FOCO É DE QUEM NAVEGA POR TECLADO, e quem o acende é o script**
 * (1.116.0). Ele era `:focus-within` nas duas pílulas, e isso o acendia também
 * no TOQUE: fechando o popup, o foco volta para o botão que o abriu — de
 * propósito, para quem usa leitor de tela —, e no celular do Flávio a pílula
 * ficava com um anel salmão (`--lym-link`, que no tema escuro é `#fb565e`) e o
 * fundo do toque grudado, o que ele leu como "um bloco rosa cobrindo a tela".
 *
 * **Não dá para resolver só na folha:** o controle de verdade é a lista, que é
 * invisível (`opacity: 0`), e um `outline` nela não aparece; o anel tem de ser
 * desenhado no INVÓLUCRO. `:focus-visible` não sobe para o pai, e `:has()` está
 * fora — o piso é o WordPress 6.0, e o plano B de um seletor que não casa seria
 * ficar sem anel nenhum. Então o script pergunta `:focus-visible` ao controle e
 * escreve a classe no invólucro.
 */
.lym-leitor__anel.lym-leitor__anel {
	outline: 2px solid var( --lym-link, currentColor );
	outline-offset: 2px;
}

.lym-leitor__voz-icone {
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
}

/*
 * **O botao que abre o popup cobre a pilula inteira, como a lista cobre**, e so
 * um dos dois esta no ar por vez. Ele nasce sem texto: quem a pessoa le e o
 * desenho por baixo, e quem o leitor de tela anuncia e o `aria-label`.
 */
.lym-leitor__voz-botao.lym-leitor__voz-botao {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
	border: 0;
	background: none;
	color: inherit;
	cursor: pointer;
}

/*
 * **Letra de 16px mesmo invisível**: abaixo disso o Safari do iPhone dá zoom na
 * página inteira ao abrir a lista, e a letra dela é o que ele mede.
 */
.lym-leitor__velocidades.lym-leitor__velocidades,
.lym-leitor__vozes.lym-leitor__vozes {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
	border: 0;
	opacity: 0;
	font-size: 16px;
	cursor: pointer;
	-webkit-appearance: none;
	appearance: none;
}

/*
 * O recado ocupa uma linha só dele, embaixo dos controles. Vazio, a linha não
 * tem altura, e a barra não cresce.
 */
.lym-leitor__aviso {
	flex: 1 0 100%;
	margin: 0;
	font-size: 0.875rem;
}

.lym-leitor__aviso:not( :empty ) {
	margin-top: 0.35rem;
}

/*
 * **O destaque é MARCA-TEXTO AMARELO** (1.108.0, pedido do Flávio depois de
 * ouvir o leitor no computador e no celular: "no celular a frase e a palavra
 * estão com a marcação muito fraca, quase não dá para ver").
 *
 * Ele era a cor de orientação da tela, em azul, pintada pelo script: no
 * computador a palavra aparecia bem e a frase saía apagada; num telefone, ao
 * sol, as duas sumiam. O amarelo é a convenção do marca-texto, e é a única cor
 * que se enxerga sobre fundo claro E escuro sem trocar de tom.
 *
 * **É cor FIXA, e a exceção é declarada** — como o verde do Grupo. As contas,
 * nos dois temas:
 *
 * - a palavra carrega o próprio fundo (`#ffd54f` com letra `#111`): 13,4:1, e
 *   não muda com o tema;
 * - a frase é o mesmo amarelo a 38%, e o que se mede ali é o TEXTO do tema por
 *   cima dela: num tema escuro (`#111` com letra `#e6e6e6`) a mistura dá
 *   `#6b5b29` e 5,3:1; num claro (`#fff` com letra `#222`), `#ffefbc` e 13,9:1.
 *   Acima de 40% o tema escuro cai abaixo de 4,5:1 — foi o que decidiu o 38%.
 *
 * As quatro contas são refeitas por `teste-leitor.php`, a partir dos valores
 * lidos daqui: número escrito em comentário envelhece calado.
 *
 * A palavra fica por cima da frase porque é registrada depois dela, a cada
 * palavra falada, e porque leva prioridade maior.
 */
::highlight( lym-leitor-frase ) {
	background-color: rgba( 255, 213, 79, 0.38 );
}

::highlight( lym-leitor-palavra ) {
	background-color: #ffd54f;
	color: #111111;
}


/*
 * **No tablet e no celular, a barra do menu fica presa no alto — só nos
 * conteúdos com o leitor** (pedido do Flávio em 19/09/2026: os ícones em cima,
 * o leitor logo abaixo). Nas aulas sem leitor ela continua rolando com a página.
 *
 * A barra e o leitor estendem o fundo até as bordas da tela, descontando o
 * recheio da moldura (`.lym-tela`, 1.25rem): sem isso, o texto que rola por
 * baixo apareceria nas duas faixas laterais.
 *
 * **A barra do WordPress de quem administra** fica presa em cima de tudo a
 * partir de 601px (46px até 782, 32px acima), e até 600px ela rola com a
 * página. São os cortes do próprio WordPress.
 */
@media ( max-width: 1024px ) {
	.lym-tela--leitor .lym-tela__lado {
		position: sticky;
		top: 0;
		z-index: 2147483000;
		margin: 0 -1.25rem;
		padding: 0.5rem 1.25rem;
		background: var( --lym-painel, Canvas );
		box-shadow: 0 1px 0 var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	}

	.admin-bar .lym-tela--leitor .lym-tela__lado {
		top: 32px;
	}

	/*
	 * **O teto de largura sai junto com as margens negativas**: com o
	 * `max-width: 100%` da base, a caixa ficava presa à largura da coluna e só a
	 * margem da ESQUERDA avançava — a barra acabava 20px antes da borda direita
	 * (medido).
	 */
	.lym-leitor {
		max-width: none;
		margin-right: -1.25rem;
		margin-left: -1.25rem;
		padding-right: 1.25rem;
		padding-left: 1.25rem;
	}
}

@media ( max-width: 782px ) {
	.admin-bar .lym-tela--leitor .lym-tela__lado {
		top: 46px;
	}
}

@media ( max-width: 600px ) {
	.admin-bar .lym-tela--leitor .lym-tela__lado {
		top: 0;
	}
}

/*
 * **Enquanto o leitor fala, o texto responde ao toque**: tocar num parágrafo lê
 * a partir dele. O cursor de mão é a única pista disso para quem usa ponteiro —
 * junto com a dica que aparece ao parar em cima —, e ele só existe enquanto a
 * leitura está no ar. Parada, a página volta a ser texto: o cursor de seleção é
 * o que diz que dá para marcar e copiar.
 */
.lym-leitor-lendo {
	cursor: pointer;
}

/*
 * Num telefone estreito a palavra "Voz" sai e fica o desenho: são quatro peças
 * numa linha, e "Leitor de voz" é a que não pode sair. O nome continua na lista
 * (`aria-label`) e no `title`.
 *
 * **O corte caiu de 400px para 340px na 1.115.0**, e o número é medido: com a
 * letra menor e as duas setas fora, as quatro peças somam 287px de 320 num
 * telefone de 360px — a palavra cabe. Abaixo disso não cabe, e quem cede é ela,
 * porque o desenho sozinho ainda diz que ali se escolhe a voz.
 */
@media ( max-width: 340px ) {
	.lym-leitor__voz-palavra {
		display: none;
	}
}


/* ---------------------------------------------------------------------------
 * O popup que ensina a trocar de voz (1.115.0).
 *
 * **Ele mora no ANDAR do convite e da lupa** (2147483001), e não no da barra:
 * caixa que cobre a tela não fica por baixo de barra nenhuma. A barra do leitor
 * é 2147482999 e a coluna presa é 2147483000 — o teto da família —, então este
 * é o único andar que passa por cima das duas.
 *
 * **O `[hidden]` leva `!important` pela mesma razão do convite:** a regra base
 * declara `display: flex`, e um `display` nosso derrota o atributo, que tem
 * peso zero.
 * ------------------------------------------------------------------------- */
.lym-leitor-ajuda[hidden] {
	display: none !important;
}

.lym-leitor-ajuda.lym-leitor-ajuda {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;

	display: flex;
	align-items: center;
	justify-content: center;

	/*
	 * **Um dedo de véu em cima e embaixo, sempre** (1.116.0, pedido do Flávio).
	 * Com 1,25rem a caixa encostava nas bordas da tela do telefone, e o único
	 * jeito de fechar era acertar o X. **Os 5rem são a segunda medida** (1.117.0,
	 * ele de novo: "pode ser um pouco mais de espaço"): 80px é mais que o alvo
	 * de toque de 44px, ou seja, a folga deixou de ser uma fresta e virou uma
	 * área que o polegar acha sem mirar.
	 */
	padding: 5rem 1.25rem;

	background: rgba( 0, 0, 0, 0.72 );

	z-index: 2147483001;
}

/*
 * **O fundo é o MEDIDO** (`--lym-painel`), como o do painel do sino e o da caixa
 * de convite: a caixa cobre a página, precisa ser opaca, e o plugin não sabe a
 * cor do tema de quem instalou. A reserva branca só aparece se o script não
 * rodar — e aí nada abre, porque quem abre é o script.
 *
 * **A altura é limitada e o miolo rola por dentro**: o passo a passo do Samsung
 * tem oito linhas, e num telefone deitado a caixa passaria da tela com o X fora
 * de alcance.
 */
.lym-leitor-ajuda__caixa.lym-leitor-ajuda__caixa {
	position: relative;

	display: flex;
	flex-direction: column;

	box-sizing: border-box;
	width: 100%;
	max-width: 28rem;

	/*
	 * **A CAIXA não rola: quem rola é o miolo.** Ela rolava inteira, e o X, que
	 * é `absolute` nela, subia junto com o texto — quem descia até o fim do
	 * passo a passo do Samsung ficava sem como fechar (visto no aparelho do
	 * Flávio, 20/09/2026). O teto desconta o véu dos dois lados (5rem + 5rem).
	 */
	max-height: calc( 100vh - 10rem );
	overflow: hidden;

	padding: 1.75rem 1.5rem 1.5rem;

	background: var( --lym-painel, #ffffff );
	border: 1px solid rgba( 128, 128, 128, 0.38 );
	border-radius: 0.75rem;

	/* A mesma luz de cima de cartão, topo e caixa de aviso: ela só ADICIONA. */
	box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.07 );

	text-align: left;
}

.lym-leitor-ajuda__titulo {
	flex: 0 0 auto;

	margin: 0 2.5rem 0.75rem 0;

	font-size: 1.15rem;
	line-height: 1.3;
}

/*
 * **O miolo é a única coisa que rola**, e ele encolhe: `min-height: 0` é o que
 * permite a um item de flex ficar menor que o conteúdo dele — sem essa linha a
 * coluna cresce até passar do teto da caixa, e a barra de rolagem nunca
 * aparece.
 */
.lym-leitor-ajuda__rolar {
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
}

/*
 * **A seta que desce fica presa no pé da caixa**, centrada, fora do que rola —
 * dentro, ela desceria junto com o texto e só apareceria para quem já chegou ao
 * fim. Ela nasce escondida e o script a mostra só enquanto há o que descer.
 */
.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce {
	display: flex;
	align-items: center;
	justify-content: center;

	flex: 0 0 auto;
	align-self: center;

	width: 44px;
	min-width: 44px;
	height: 44px;

	margin: 0.5rem 0 0;
	padding: 0;

	border: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );
	border-radius: 22px;
	background: rgba( 128, 128, 128, 0.10 );

	color: inherit;
	cursor: pointer;

	-webkit-tap-highlight-color: transparent;
}

.lym-leitor-ajuda__desce.lym-leitor-ajuda__desce:focus-visible {
	outline: 2px solid currentColor;
	outline-offset: 2px;
}

.lym-leitor-ajuda__texto {
	margin: 0 0 0.75rem;

	font-size: 0.95rem;
	line-height: 1.5;
}

/*
 * **Os passos são uma lista NUMERADA e o marcador fica dentro da caixa.** Lista
 * de passos se lê pela margem esquerda, e o marcador fora dela encostaria na
 * borda arredondada — é a mesma regra do "Como liberar o microfone".
 */
.lym-leitor-ajuda__lista {
	margin: 0 0 0.75rem;
	padding-left: 1.25rem;

	font-size: 0.95rem;
	line-height: 1.55;
	list-style: decimal;
}

.lym-leitor-ajuda__lista li {
	margin: 0 0 0.4rem;
}

.lym-leitor-ajuda__lista li:last-child {
	margin-bottom: 0;
}

/*
 * A nota é o que se lê DEPOIS de fazer, então ela é menor — e nunca apagada por
 * opacidade, que trocaria a cor pela mistura com o fundo e derrubaria o
 * contraste do que o leitor precisa entender.
 */
.lym-leitor-ajuda__nota {
	margin: 0.75rem 0 0;

	font-size: 0.875rem;
	line-height: 1.5;
}

.lym-leitor-ajuda__avisar {
	margin: 1rem 0 0;
	padding-top: 0.75rem;
	border-top: 1px solid var( --lym-borda, rgba( 128, 128, 128, 0.25 ) );

	font-size: 0.875rem;
	line-height: 1.5;
}

/*
 * O link da frase final é FRASE, e frase precisa de pista própria além da cor:
 * o sublinhado é o que diz que dá para clicar.
 */
.lym-leitor-ajuda__link.lym-leitor-ajuda__link {
	text-decoration: underline;
}

/*
 * **O fechar tem 44px de altura clicável**, e cresce por recheio porque quem
 * desenha aqui é o sinal, e não a borda.
 */
/*
 * **O X é VERMELHO, e o vermelho é o de PREENCHIMENTO** (1.117.0, pedido do
 * Flávio: "o x do popup não quero rosa, coloque vermelho"). O rosa que ele viu
 * não era escolha nossa: era o tema pintando o botão com foco — e o X recebe o
 * foco assim que a caixa abre. Declarar o fundo com TRÊS classes tira o tema do
 * caminho, e declarar uma COR resolve a outra metade, que é ele nunca mais
 * poder ser confundido com o rosa do tema.
 *
 * **O par é o do botão sólido** (`--lym-acao-cheio` com `--lym-acao-texto`), que
 * é medido e não muda com o tema porque o botão carrega o próprio fundo — é a
 * mesma família do botão principal e da bolinha do sino. Usar `--lym-link`, que
 * é o vermelho de TEXTO, seria a confusão que este arquivo já registra: no tema
 * escuro ele é claro (#fb565e), e a letra branca em cima dele dá 3,18:1.
 */
.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar {
	position: absolute;
	top: 0.25rem;
	right: 0.25rem;

	display: flex;
	align-items: center;
	justify-content: center;

	min-width: 44px;
	min-height: 44px;
	padding: 0;

	background: var( --lym-acao-cheio, #c40812 );
	border: 0;
	border-radius: 0.5rem;

	color: var( --lym-acao-texto, #ffffff );
	font-size: 1.75rem;
	line-height: 1;

	cursor: pointer;

	-webkit-tap-highlight-color: transparent;
}

/*
 * **Todos os estados são declarados**, e com três classes: o tema do cliente
 * pinta botão em foco e em ação, e o X é o botão que NASCE com o foco.
 */
.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar:focus,
.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar:active,
.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar:focus-visible {
	background: var( --lym-acao-cheio, #c40812 );
	color: var( --lym-acao-texto, #ffffff );
}

@media ( hover: hover ) {
	.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar:hover {
		background: var( --lym-acao-baixo, #a30610 );
		color: var( --lym-acao-texto, #ffffff );
	}
}

/*
 * **O anel do X não é `currentColor`.** Ali a cor é a letra BRANCA do botão
 * sólido, e o anel é desenhado FORA dele, sobre a caixa — é a mesma lição do
 * anel do botão principal do plugin.
 */
.lym-leitor-ajuda__fechar.lym-leitor-ajuda__fechar:focus-visible {
	outline: 2px solid var( --lym-link, currentColor );
	outline-offset: 2px;
}
