/*
 * A ESTRUTURA DO DOCUMENTO — o que o leitor de tela precisa e o olho não vê.
 *
 * Três lacunas medidas passaram por baixo de todos os portões deste repositório porque **nenhuma
 * delas é de cor**, e os portões deste repositório medem cor: `portao-do-tema.js` varre todo nó de
 * texto visível e exige o piso da WCAG 2.1 AA; `PaletaDoTemaTest` e `TemaEscuroSobreSuperficieTest`
 * conferem token e superfície; `ContrasteDaMarcaTest` calcula as seis combinações. A cobertura é
 * boa o suficiente para enganar. Link de salto, marco de conteúdo principal e agrupamento de campos
 * não têm cor, e por isso ficaram em zero, zero e duas ocorrências até esta entrega (ADR-012).
 *
 * Por que uma folha NOVA, e não `componentes.css`:
 *
 *  - `UT-056` reprova todo commit em que a folha de componente tem regra e um `.phtml` viaja junto.
 *    A semântica de documento é, por definição, marcação MAIS folha — o link de salto não existe
 *    sem o `<a>`, e o `<main>` não existe sem a tag. As duas coisas têm de viajar no mesmo commit,
 *    e é exatamente o que aquele portão recusa. Foi pela mesma razão que `estados.css` e
 *    `migracao.css` nasceram separadas;
 *  - `componentes.css` veste marcador do Angular Material e nada mais (ADR-001). Nada daqui é da
 *    biblioteca: é markup nosso, escrito por esta task.
 *
 * Ela entra logo depois de `componentes.css` nas QUATRO molduras, com `media="screen,print"` — a
 * regra de impressão daqui não é decorativa, e uma folha `media="screen"` não vale no papel. Em
 * `public/maintenance.html`, que é HTML puro servido fora da pilha de molduras, o conteúdo desta
 * folha está repetido no `<style>` embutido: a página de manutenção é servida justamente quando o
 * resto está fora do ar, e um `<link>` para um arquivo do produto é um recurso a mais para falhar.
 */

/* --------------------------------------------------------------------------- o link de salto */

/*
 * O LINK DE SALTO é a primeira parada de teclado de toda tela do produto.
 *
 * Com 115 itens de menu lateral, ele não é formalidade: é o que separa teclado utilizável de
 * teclado inviável. Sem ele, toda tela começa com a navegação inteira pela frente, em cada uma das
 * telas que alguém abre no dia (US-039).
 *
 * `position: fixed` e não `absolute`: ele não pode participar do fluxo em momento nenhum — nem
 * escondido, nem revelado. Um `absolute` dentro do `<body>` empurraria a barra superior para baixo
 * no instante do foco, e a tela inteira pularia quando quem usa teclado tabulasse pela primeira
 * vez. Fixo, ele se sobrepõe; nada se move.
 *
 * `translateY(-200%)` e não `display: none`, `visibility: hidden` ou `left: -9999px`:
 *
 *  - `display: none` e `visibility: hidden` tiram o elemento da ordem de tabulação. Um link de
 *    salto que não recebe foco não é um link de salto;
 *  - `left: -9999px` funciona, mas leva o elemento para fora do lado ESQUERDO do documento, e em
 *    escrita da direita para a esquerda isso vira rolagem horizontal. `translateY` negativo sai por
 *    cima, que não tem esse efeito colateral em direção nenhuma;
 *  - a transformada é composta pelo compositor, então revelar o link não repinta a página.
 *
 * `--camada-dica` é o topo da escala de `paleta.css`, e é deliberado: o link precisa ficar acima da
 * barra superior (`--camada-fixo`), do menu lateral aberto e do véu que o acompanha
 * (`--camada-veu`), porque a US-039.EC-2 exige que ele continue sendo a primeira parada com o menu
 * aberto sobre a tela a 360px. Ficar em ordem de tabulação e ficar embaixo de um véu opaco são a
 * mesma falha para quem enxerga.
 */
.salto {
	position: fixed;
	top: 0;
	left: 0;
	z-index: var(--camada-dica);

	display: block;
	padding: var(--e-2) var(--e-3);

	background-color: var(--acao);
	color: var(--texto-sobre-acao);

	font-family: inherit;
	font-size: 14px;
	font-weight: 500;
	line-height: 1.4;
	text-decoration: underline;

	border-bottom-right-radius: var(--r-container);

	transform: translateY(-200%);
	transition: transform var(--dur-rapida) var(--ease-padrao);
}

/*
 * `:focus` e não `:focus-visible`. O link é invisível até receber foco, e `:focus-visible` só casa
 * quando o navegador julga que o foco veio do teclado — o que é a heurística certa para um anel de
 * foco sobre um elemento que já se vê, e a errada para um elemento cuja única forma de existir é
 * estar focado. Um `.focus()` por script num link de salto o deixaria focado e invisível.
 */
.salto:focus {
	transform: translateY(0);
}

/*
 * O ANEL DE FOCO DESTE LINK MORA EM `foco.css`, e não aqui.
 *
 * Medido no portão de navegador: o `--foco-anel` padrão sobre o fundo `--acao` deste link dá
 * **1,93:1**, contra os 3:1 da WCAG 2.1 SC 1.4.11 — o único controle do produto cuja razão de
 * existir é receber foco era o que ficava com o anel invisível ao recebê-lo.
 *
 * A correção não cabe nesta folha porque `foco.css` é a ÚLTIMA por contrato
 * (`IndicadorDeFocoTest`), e a regra genérica dela — `a:not(.md-button):not([disabled]):focus-visible`
 * — pesa (0,3,1) e vence qualquer `.salto:focus` escrito aqui, venha depois ou não. A exceção fica
 * ao lado da regra que ela excetua, junto da exceção irmã da barra superior, que existe pelo mesmo
 * motivo e usa o mesmo token.
 */

/*
 * NO PAPEL ele não existe. Não há tabulação numa folha impressa, e um retângulo com a cor da ação
 * no canto superior esquerdo de toda página impressa seria tinta gasta em um controle que ninguém
 * pode acionar.
 *
 * Esta regra só vale porque o `<link>` das quatro molduras diz `media="screen,print"`. Escrita numa
 * folha `media="screen"`, ela seria código morto — foi o que aconteceu com todo `@media print`
 * deste projeto até a task_01.
 */
@media print {
	.salto {
		display: none;
	}
}

/* ------------------------------------------------------------ o marco de conteúdo principal */

/*
 * O DESTINO DO LINK não pode ganhar anel de foco por ter sido saltado para.
 *
 * `<main tabindex="-1">` é o que faz o `href="#conteudo-principal"` mover o FOCO, e não só a
 * rolagem: sem o `tabindex` negativo, o navegador rola até a âncora e deixa o foco no `<body>`, de
 * modo que a próxima tabulação volta ao começo do documento — o link de salto teria a aparência de
 * funcionar e não faria nada (US-039.AC-3).
 *
 * O preço do `tabindex="-1"` é o anel de foco do WebKit sobre um retângulo do tamanho da tela. Ele
 * sai aqui, e SÓ aqui: `foco.css` é a última folha por contrato (`IndicadorDeFocoTest`) justamente
 * para desfazer o `outline: none` do Material, e esta é a exceção nomeada — um marco de página não
 * é um controle, e não há nada a indicar quando ele recebe foco programático.
 *
 * O foco continua CHEGANDO nele; só não se anuncia com um contorno. Quem usa leitor de tela ouve o
 * marco ser anunciado, que é o sinal que importa.
 */
[role="main"]:focus,
main:focus {
	outline: none;
}

/*
 * A MARGEM DA PÁGINA MORA NA ÁREA PRINCIPAL (polimento-ui ADR-006, ADR-014).
 *
 * Cada tela decidia o próprio respiro — `layout-padding` num formulário, `layout-margin` noutra
 * tela, nada na maioria das listagens —, e a moldura não aplicava nenhum: o `layout-marging` que
 * estava no `<md-content>` era erro de digitação, e nada o estilizava. Agora a margem é UMA, e
 * toda tela a herda sem lembrar dela: 16px abaixo de 600px de largura, 24px a partir de 600px
 * (BR-08). As views não somam respiro externo próprio; cartões, listas e filtros mantêm o interno.
 *
 * `.conteudo-sob-a-faixa >` NÃO É ENFEITE. Esta folha entra nas QUATRO molduras, e as quatro têm
 * um `#conteudo-principal` — é o destino do link de salto. Em `login.phtml` e em `report.phtml` ele
 * é o `<main>` da página, que não pode mudar de medida; em `moved.phtml` ele tem `layout-padding`
 * próprio, e um seletor de id puro (1,0,0) venceria a classe do Material (0,1,0). Só a moldura
 * principal põe a área dentro de `md-content.conteudo-sob-a-faixa`.
 *
 * `box-sizing: border-box` É O QUE SEGURA A LARGURA. A área é `layout-fill` — `width: 100%` —, e
 * o Material só dá `border-box` a `.flex`. Em `content-box`, 48px de padding somados a 100% de
 * largura seriam rolagem horizontal em toda tela do produto (o risco que o ADR-014 nomeia).
 */
.conteudo-sob-a-faixa > #conteudo-principal {
	--margem-moldura: var(--e-4);
	box-sizing: border-box;
	padding: var(--margem-moldura);
}

@media (min-width: 600px) {
	.conteudo-sob-a-faixa > #conteudo-principal {
		--margem-moldura: var(--e-5);
	}
}

/*
 * O PANORAMA FICA DE FORA (US-022). O mapa é o conteúdo, de ponta a ponta, e os painéis flutuam
 * sobre ele com o afastamento que já têm (`panorama.css`). `:has()` depois da media query, com a
 * especificidade maior, vale nas duas larguras.
 */
.conteudo-sob-a-faixa > #conteudo-principal:has(.panorama) {
	--margem-moldura: 0px;
}

/*
 * ONDE UM ELEMENTO GRUDENTO PARA — `--topo-colado`, lido pelo cabeçalho da listagem
 * (`componentes.css`) e pelo cabeçalho de dia do Evento.
 *
 * A margem acima MORA NO ROLADOR, e `position: sticky` para na borda do conteúdo dele, depois do
 * padding. Com `top: 0` o cabeçalho grudava 24px abaixo da borda, e as linhas continuavam
 * passando, à vista, pela faixa de cima. O valor é medido a partir da borda do conteúdo: sem
 * trilha, é o padding com sinal trocado — o elemento para rente à borda do rolador; com trilha
 * (que gruda rente à borda e cobre a faixa, `migracao.css`), é a altura dela.
 *
 * Os três são tokens da receita (`gerar-paleta.mjs`, grupo `moldura`), com valor de raiz de fora
 * da moldura principal — zero, sem padding a descontar. Aqui a área principal os redeclara.
 */
.conteudo-sob-a-faixa > #conteudo-principal {
	--topo-colado: calc(-1 * var(--margem-moldura));
}

.conteudo-sob-a-faixa > #conteudo-principal:has(.trilha) {
	--topo-colado: var(--trilha-altura);
}

/* ------------------------------------------------------------------- o agrupamento de campos */

/*
 * `<fieldset>` E `<legend>` SEM APARÊNCIA PRÓPRIA.
 *
 * A US-041.AC-2 é explícita: aplicar o agrupamento não pode mudar a aparência da seção em relação
 * ao que a folha de componente já define. O agente de usuário traz `<fieldset>` com borda, margem e
 * padding de fábrica, e `<legend>` com um recorte na borda — desenhos de 1997 que apareceriam, de
 * uma vez, em 128 telas.
 *
 * `min-width: 0` não é zelo. O `<fieldset>` tem, no motor de layout, um `min-width: min-content`
 * embutido que NÃO vem de folha nenhuma e que nenhuma outra caixa tem. Dentro de um
 * `layout="row"` do Angular Material, isso impede a caixa de encolher abaixo do conteúdo dela, e o
 * formulário passa a transbordar horizontalmente no celular — o defeito clássico de quem agrupa
 * campos num layout flexível e conclui que `<fieldset>` "não funciona com flexbox".
 *
 * `display: block` pela mesma razão do outro lado: o valor de fábrica não é `block`, e `float`,
 * `flex` e `grid` se comportam de modo diferente dentro dele em navegadores diferentes.
 */
fieldset {
	display: block;
	min-width: 0;

	margin: 0;
	padding: 0;
	border: 0;
}

/*
 * A `<legend>` É O NOME ACESSÍVEL DO GRUPO, e o nome acessível é o que esta entrega foi buscar. O
 * que ela NÃO pode fazer é trazer junto o desenho do agente de usuário, porque as seções deste
 * produto já têm título visível escrito pela folha das telas.
 *
 * Quando a seção JÁ TEM um título visível, a `<legend>` é o próprio título e herda o que a folha da
 * tela lhe dá; estas regras só neutralizam o que o navegador acrescenta por conta própria.
 *
 * `float: left; width: 100%` é o idioma que impede o recorte na borda em navegadores baseados no
 * Blink, onde `<legend>` tem um modo de posicionamento próprio que `display: block` não desliga.
 * Com `border: 0` no `<fieldset>` acima não há recorte a fazer, mas o modo de posicionamento
 * continua valendo e afeta a largura disponível para o texto.
 */
legend {
	display: block;
	float: left;
	width: 100%;

	margin: 0;
	padding: 0;
	border: 0;
}

/*
 * `legend` DEPOIS DO `float` precisa que o que vem a seguir volte à linha. Sem isto, o primeiro
 * campo da seção sobe para o lado do título em vez de ficar abaixo dele.
 */
legend + * {
	clear: both;
}

/*
 * A SEÇÃO SEM TÍTULO VISÍVEL (US-041.EC-2).
 *
 * Nem toda seção de formulário tem título na tela — há grupos que existem só para o leitor de tela,
 * porque o agrupamento é evidente para quem enxerga e invisível para quem não enxerga. Nesses casos
 * o nome do grupo vive numa `<legend>` que só o leitor de tela alcança.
 *
 * ESTA É A TÉCNICA DE RECORTE, e não `display: none` nem `visibility: hidden`: as duas tiram o
 * elemento da árvore de acessibilidade junto com a caixa, e uma `<legend>` fora da árvore não
 * nomeia grupo nenhum — seria escrever o nome e escondê-lo de quem ele serve.
 *
 * `clip-path: inset(50%)` é a forma moderna; `clip` continua para os motores que ainda não a
 * aplicam a elementos fora de `position: absolute` de modo consistente. Declarar as duas é o
 * padrão da técnica, e a redundância é deliberada.
 */
.somente-leitor {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	white-space: nowrap;
	border: 0;
	clip: rect(0, 0, 0, 0);
	clip-path: inset(50%);
}

/*
 * A `<legend>` invisível precisa desfazer o `float` da regra acima, senão ela ocupa a linha inteira
 * antes de ser recortada e o primeiro campo da seção desce um espaço sem motivo visível.
 */
legend.somente-leitor {
	float: none;
	width: 1px;
}
