/* Caderno Zero Suite — frontend styles. Neutral, theme-friendly (Kadence). */

/* Goteira lateral da Home (templates/home-caderno-zero.php). As seções czs-*
   são <section> de largura total: sem este respiro elas encostam na borda da
   janela enquanto o cabeçalho do tema mantém a margem dele. Só padding — a
   largura máxima continua sendo do contêiner do tema, para não haver duas
   restrições de largura disputando a mesma página. O valor vem do token de
   espaçamento (--czs-space-5 = 1.5rem = 24px), nunca de um número solto. */
.czs-home {
	box-sizing: border-box;
	padding-left: var(--czs-space-5, 1.5rem);
	padding-right: var(--czs-space-5, 1.5rem);
}
@media (max-width: 640px) {
	.czs-home { padding-left: var(--czs-space-4, 1rem); padding-right: var(--czs-space-4, 1rem); }
}

.czs-section { margin: 2rem 0; }
.czs-section__header { margin-bottom: 1rem; }
.czs-section__title { font-size: 1.5rem; margin: 0 0 .25rem; }
.czs-section__subtitle { margin: 0; opacity: .8; }
/* Archive/taxonomy page-level header (spec 1.7.0 §14): larger title + a
   comfortable max-width intro line, distinct from a section header nested
   further down the page. */
.czs-page-header { margin: var(--czs-space-5, 1.5rem) 0 var(--czs-space-6, 2.5rem); }
.czs-page-header .czs-section__title { font-size: 1.9rem; }
.czs-page-header .czs-section__subtitle { max-width: 60ch; font-size: 1rem; }

/* Responsive card grid (spec 1.7.1 §24): up to 3 columns on desktop, 2 on
   tablet, 1 on small mobile. minmax(0, 1fr) keeps a long word/URL in a card
   from forcing horizontal overflow. Never a carousel on the catalog. */
.czs-grid {
	display: grid;
	grid-template-columns: repeat(var(--czs-columns, 3), minmax(0, 1fr));
	gap: var(--czs-space-5, 1.5rem);
}
@media (max-width: 960px) { .czs-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .czs-grid { grid-template-columns: 1fr; } }

/* height:100% + o grid em `stretch` (padrão) são o que faz TODOS os cards de
   uma linha terminarem na mesma altura, com o rodapé ("Ver material") alinhado
   entre eles — ver .czs-card__footer. */
.czs-card {
	display: flex; flex-direction: column; height: 100%;
	border: 1px solid var(--czs-color-border, rgba(0,0,0,.08));
	border-radius: var(--czs-card-radius, var(--czs-radius-large, 12px)); overflow: hidden;
	background: var(--czs-color-surface, #fff); color: inherit; text-decoration: none;
	transition: box-shadow .15s ease, transform .15s ease;
}
.czs-card:hover, .czs-card:focus-within { box-shadow: var(--czs-card-shadow-hover, var(--czs-shadow-medium, 0 8px 24px rgba(0,0,0,.10))); transform: translateY(-2px); }
.czs-card:focus-visible { outline: 2px solid var(--czs-color-primary, #2563eb); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .czs-card { transition: none; } .czs-card:hover { transform: none; } }
/* Card media: aspect ratio lives here (not as an inline style) so that if the
   stylesheet somehow does not load, the box collapses to its (bounded) content
   height instead of forcing a tall empty box. overflow:hidden + a hard icon
   cap guarantee the placeholder can never render gigantic (spec 1.7.1 §26). */
.czs-card__media { position: relative; aspect-ratio: 4 / 3; overflow: hidden; background: var(--czs-color-background, #eef1f6); display: grid; place-items: center; }
.czs-card__media--square { aspect-ratio: 1 / 1; }
.czs-card__media--3x2 { aspect-ratio: 3 / 2; }
.czs-card__media--16x9 { aspect-ratio: 16 / 9; }
/* object-fit: cover + width/height 100% = a imagem preenche a moldura sem
   distorcer, seja qual for a proporção do arquivo enviado. O <img> vem de
   wp_get_attachment_image(), que já emite width/height reais (sem layout
   shift), srcset e loading="lazy". */
.czs-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Cards de etapa da Home (1.7.3 §3): moldura 16:9 em vez de 4:3. A regra é
   escopada na seção, e não apenas no atributo do bloco, para que as Home já
   publicadas encurtem a área de imagem sem precisar reabrir e salvar o bloco
   no editor. */
.czs-stage-cards .czs-card__media { aspect-ratio: 16 / 9; }
/* Status "selo" over the media (Gratuito / Pago / Indisponível). */
.czs-card__badge { position: absolute; top: .6rem; left: .6rem; z-index: 2; }
/* Placeholder for a material/article/page with no featured image (spec §26):
   a bounded document icon + the title's initials — never a bare letter, never
   a full-viewport SVG. The icon is hard-capped in every dimension. */
.czs-card__media-fallback { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .4rem; color: var(--czs-color-muted, #93a1b5); }
.czs-card__media-icon { width: 3rem; height: 3rem; max-width: 3rem; max-height: 3rem; flex: none; opacity: .55; }
.czs-card__media-initials { font-size: .78rem; font-weight: 700; letter-spacing: .04em; padding: .15rem .55rem; border-radius: 999px; background: var(--czs-color-surface, #fff); border: 1px solid var(--czs-color-border, rgba(0,0,0,.1)); }
.czs-card__body { padding: .875rem 1rem 1rem; display: flex; flex-direction: column; gap: .4rem; flex: 1 1 auto; }

/* Limite VISUAL de linhas (1.7.3 §4). O corte de texto real acontece no PHP
   (Cards::card_excerpt(), com wp_trim_words, que nunca parte uma palavra ao
   meio); o line-clamp aqui é a rede de segurança para o caso de o texto ainda
   assim render mais linhas do que o card comporta — uma fonte maior, um
   título longo, uma tela estreita. Sem ele, um card cresce sozinho e desalinha
   a linha inteira.

   A propriedade padrão `line-clamp` vem junto da versão -webkit- porque os
   navegadores atuais ainda dependem da segunda; declarar as duas evita
   depender de prefixo no futuro. */
.czs-card__title {
		font-size: .95rem; margin: 0; line-height: 1.3;
	display: -webkit-box; -webkit-line-clamp: 1; line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;
}
.czs-card__desc {
	margin: 0; font-size: .95rem; /* ~15.2px */ line-height: 1.5; color: var(--czs-color-muted, #4b5563);
	display: -webkit-box; -webkit-line-clamp: 4; line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;
}
.czs-card__taxonomy { margin: .25rem 0 0; display: flex; flex-wrap: wrap; gap: .3rem; }
/* Pills coloridos por disciplina/ano-serie (2026-08). Cada disciplina e cada ano/serie tem sua propria cor de fundo (nao e cor de texto solta). Regras de cor por slug ficam no fim deste arquivo, em "cores por disciplina" / "cores por ano/serie". */
.czs-tax-pill { display: inline-flex; align-items: center; padding: .12rem .55rem; border-radius: 999px; font-size: .66rem; font-weight: 700; line-height: 1.4; white-space: nowrap; }
.czs-tax-pill--plain { background: var(--czs-color-background, #eef1f6); color: var(--czs-color-muted, #6b7280); font-weight: 600; }
.czs-card__price { margin: 0; font-weight: 700; }
.czs-card__meta { list-style: none; margin: 0; padding: 0; font-size: .8rem; color: var(--czs-color-muted, #6b7280); }
.czs-card__meta-label { font-weight: 600; }
.czs-card__count { font-size: .8rem; color: var(--czs-color-muted, #6b7280); }

/* Rodapé do card: contador + CTA. `margin-top:auto` aplicado UMA vez aqui —
   e não em cada filho — é o que empurra "Ver material" para a base e o mantém
   na mesma altura em todos os cards da linha. O padding-top/borda separam o
   rodapé do texto sem virar mais uma caixa. */
.czs-card__footer {
	margin-top: auto;
	display: flex; align-items: center; justify-content: space-between; gap: .5rem; flex-wrap: wrap;
	padding-top: .6rem;
	border-top: 1px solid var(--czs-color-border, rgba(0,0,0,.08));
}
/* "Ver material" com forma de botão discreto (contorno, não bloco cheio): o
   card inteiro já é o link — este é o alvo VISUAL, não um segundo <a>, que
   quebraria a regra de nunca aninhar links dentro do card. */
.czs-card__cta {
	display: inline-flex; align-items: center;
	padding: .3rem .75rem;
	border: 1px solid currentColor; border-radius: var(--czs-radius-sm, 8px);
	font-weight: 600; font-size: .85rem; line-height: 1.4;
	color: var(--czs-color-primary, #2563eb);
}
.czs-card:hover .czs-card__cta,
.czs-card:focus-within .czs-card__cta { background: var(--czs-color-primary-soft, #e8effd); }

.czs-btn {
	display: inline-block; padding: .6rem 1.1rem; border-radius: 8px;
	font-weight: 600; text-decoration: none; cursor: pointer; border: 1px solid transparent;
}
.czs-btn--primary { background: var(--czs-color-primary, #2563eb); color: #fff; }
.czs-btn--ghost { background: transparent; border-color: currentColor; }
.czs-btn:focus-visible { outline: 2px solid var(--czs-color-primary, #2563eb); outline-offset: 2px; }

.czs-hero { padding: 2.5rem 1rem; border-radius: 16px; text-align: center; }
.czs-hero--left { text-align: left; }
.czs-hero--bg-light { background: var(--czs-color-background, #f4f7fb); }
.czs-hero--bg-navy { background: var(--czs-color-secondary, #0f172a); color: #fff; }
.czs-hero--bg-blue { background: var(--czs-color-primary, #2563eb); color: #fff; }
.czs-hero__title { font-size: 2rem; margin: 0 0 .5rem; }
.czs-hero__subtitle { font-size: 1.1rem; margin: 0 0 1.25rem; opacity: .9; }
.czs-hero__actions { display: flex; gap: .75rem; justify-content: center; flex-wrap: wrap; }
.czs-hero--left .czs-hero__actions { justify-content: flex-start; }
.czs-hero--has-image { position: relative; overflow: hidden; }
.czs-hero__media { position: absolute; inset: 0; z-index: 0; }
.czs-hero__image { width: 100%; height: 100%; object-fit: cover; }
.czs-hero--has-image .czs-hero__inner { position: relative; z-index: 1; }

.czs-search__form { display: flex; flex-direction: column; gap: .75rem; }
.czs-search__row { display: flex; gap: .5rem; }
.czs-search__row input[type="search"] { flex: 1; padding: .6rem .8rem; border-radius: 8px; border: 1px solid rgba(0,0,0,.15); }
.czs-search__filters { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: .75rem; }
.czs-field { display: flex; flex-direction: column; gap: .25rem; }
.czs-field label { font-size: .8rem; font-weight: 600; }
.czs-field select, .czs-field input { padding: .5rem; border-radius: 8px; border: 1px solid rgba(0,0,0,.15); }
.czs-search__help { font-size: .85rem; opacity: .75; margin: 0; }

.czs-results-summary { display: flex; gap: .5rem .75rem; align-items: center; flex-wrap: wrap; }
.czs-results-total { font-weight: 700; }
.czs-clear-filters { font-size: .85rem; }
.czs-empty { padding: 1.25rem; background: var(--czs-color-background, #f4f7fb); border-radius: 10px; text-align: center; opacity: .85; }

/* Removable active-filter chip (spec 1.7.1 §22): a chip whose × link removes
   only that one filter (a plain URL, no JavaScript required). */
.czs-chip--filter { gap: .35rem; padding-right: .35rem; }
.czs-chip__remove { display: inline-flex; align-items: center; justify-content: center; width: 1.15rem; height: 1.15rem; border-radius: 50%; color: inherit; text-decoration: none; font-size: 1rem; line-height: 1; opacity: .7; }
.czs-chip__remove:hover, .czs-chip__remove:focus-visible { opacity: 1; background: rgba(0,0,0,.08); outline: none; }

/* Rich empty state (spec 1.7.1 §30): heading + explanation + two escape
   hatches. Never a bare letter or a "page not found" message. */
.czs-empty-state { padding: var(--czs-space-6, 2.5rem) var(--czs-space-4, 1rem); text-align: center; background: var(--czs-color-background, #f4f7fb); border-radius: var(--czs-radius-lg, 24px); }
.czs-empty-state__title { font-size: 1.25rem; font-weight: 700; margin: 0 0 .5rem; }
.czs-empty-state__text { max-width: 46ch; margin: 0 auto var(--czs-space-4, 1rem); opacity: .85; }
.czs-empty-state__actions { display: flex; gap: .6rem; justify-content: center; flex-wrap: wrap; margin: 0; }

.czs-pagination { display: flex; gap: .35rem; margin-top: 1.25rem; flex-wrap: wrap; }
.czs-pagination .page-numbers { padding: .4rem .7rem; border-radius: 6px; border: 1px solid rgba(0,0,0,.12); text-decoration: none; }
.czs-pagination .current { background: var(--czs-color-primary, #2563eb); color: #fff; border-color: var(--czs-color-primary, #2563eb); }
.czs-pagination a:focus-visible, .czs-pagination span:focus-visible { outline: 2px solid var(--czs-color-primary, #2563eb); outline-offset: 1px; }

.czs-carousel { position: relative; }
/* align-items:stretch (padrão do flex, declarado aqui por clareza) + o
   .czs-card com height:100% mantêm todos os itens visíveis do carrossel com a
   mesma altura, do mesmo jeito que na grade. */
.czs-carousel__track { display: flex; align-items: stretch; gap: var(--czs-space-5, 1.5rem); overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: thin; padding-bottom: .5rem; }
/* Largura do item derivada do CONTÊINER, não de um clamp fixo: 3 por linha no
   desktop, 2 no tablet, ~1 no celular — a mesma cadência da .czs-grid, sem
   sobrar metade da faixa vazia em telas largas. O `- .01px` absorve o
   arredondamento subpixel que, sem ele, faz o terceiro card cair para fora em
   algumas larguras. */
.czs-carousel__item { flex: 0 0 calc((100% - 2 * var(--czs-space-5, 1.5rem)) / 3 - .01px); min-width: 0; display: flex; scroll-snap-align: start; }
.czs-carousel__item > .czs-card { width: 100%; }
@media (max-width: 960px) { .czs-carousel__item { flex-basis: calc((100% - var(--czs-space-5, 1.5rem)) / 2 - .01px); } }
@media (max-width: 640px) { .czs-carousel__item { flex-basis: min(86%, 320px); } }
.czs-carousel__arrow { position: absolute; top: 40%; z-index: 2; width: 2.25rem; height: 2.25rem; border-radius: 50%; border: none; background: #fff; box-shadow: 0 2px 8px rgba(0,0,0,.15); cursor: pointer; font-size: 1.25rem; }
.czs-carousel__arrow--prev { left: -.5rem; }
.czs-carousel__arrow--next { right: -.5rem; }
.czs-carousel__dots { display: flex; gap: .5rem; justify-content: center; margin-top: .75rem; }
.czs-carousel__dot { width: .5rem; height: .5rem; padding: 0; border: none; border-radius: 50%; background: rgba(0,0,0,.2); cursor: pointer; }
.czs-carousel__dot.is-active { background: var(--czs-color-primary, #2563eb); }

/* Breadcrumb (spec 1.7.1 §29 / 1.7.3 §1): uma trilha HORIZONTAL "Início ›
   Anos Finais › 7º Ano › Matemática › Material", nunca uma lista numerada ou
   com marcadores.

   POR QUE OS SELETORES SÃO ASSIM
   Os resets miram só o que é nosso (.cz-breadcrumb__list/.cz-breadcrumb__item)
   — nenhuma regra aqui toca `ol`/`ul`/`li` genéricos, então nenhuma lista do
   editor, do tema ou de outro plugin muda de aparência. `nav.cz-breadcrumb`
   aparece à frente do reset de lista para vencer, por especificidade e sem
   !important, o `ol { list-style: decimal }` que praticamente todo tema
   declara. O ::marker é zerado explicitamente porque alguns temas voltam a
   numerar por ali mesmo com list-style:none. */
nav.cz-breadcrumb .cz-breadcrumb__list,
.cz-breadcrumb__list {
	list-style: none;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .15rem .4rem;
	margin: 0;
	padding: 0;
	counter-reset: none;
	font-size: .85rem; /* ~13.6px */
	line-height: 1.5;
}
.cz-breadcrumb { margin: var(--czs-space-4, 1rem) 0 var(--czs-space-5, 1.5rem); }
.cz-breadcrumb__item { display: inline-flex; align-items: center; gap: .4rem; margin: 0; padding: 0; list-style: none; }
.cz-breadcrumb__item::marker { content: ""; }
.cz-breadcrumb__item::before { content: none; }
.cz-breadcrumb__link { color: var(--czs-color-primary, #1d4ed8); text-decoration: none; border-radius: 4px; }
.cz-breadcrumb__link:hover, .cz-breadcrumb__link:focus-visible { text-decoration: underline; text-underline-offset: 2px; }
.cz-breadcrumb__link:focus-visible { outline: 2px solid var(--czs-color-primary, #1d4ed8); outline-offset: 2px; }
.cz-breadcrumb__text { color: var(--czs-color-muted, #6b7280); }
.cz-breadcrumb__current { color: var(--czs-color-muted, #6b7280); }
.cz-breadcrumb__sep { color: var(--czs-color-muted, #6b7280); opacity: .55; font-size: .95em; user-select: none; }

/* Celular: a trilha continua inteira e legível, quebrando em várias linhas.
   O `word-break` protege um título longo de material de estourar a largura da
   tela — a quebra acontece dentro do item, não em rolagem horizontal da
   página. */
@media (max-width: 640px) {
	.cz-breadcrumb { margin: var(--czs-space-3, .75rem) 0 var(--czs-space-4, 1rem); }
	.cz-breadcrumb__list { font-size: .8125rem; /* 13px */ }
	.cz-breadcrumb__current { overflow-wrap: anywhere; }
}

/* Compatibilidade: marcação de breadcrumb ANTIGA (um <ol> sem as classes
   cz-*), que pode estar salva em conteúdo de página ou em cache de página.
   `:not(.cz-breadcrumb)` garante que a trilha nova nunca receba um segundo
   separador vindo daqui. */
nav.czs-breadcrumb:not(.cz-breadcrumb) ol,
.czs-breadcrumb:not(.cz-breadcrumb) ol { list-style: none; display: flex; flex-wrap: wrap; gap: .35rem; padding: 0; margin: 0 0 1rem; font-size: .85rem; counter-reset: none; }
.czs-breadcrumb:not(.cz-breadcrumb) li { margin: 0; padding: 0; list-style: none; }
.czs-breadcrumb:not(.cz-breadcrumb) li::marker { content: ""; }
.czs-breadcrumb:not(.cz-breadcrumb) li:not(:last-child)::after { content: "›"; margin-left: .35rem; opacity: .5; }
.czs-breadcrumb:not(.cz-breadcrumb) a { color: inherit; text-decoration: none; }
.czs-breadcrumb:not(.cz-breadcrumb) a:hover { text-decoration: underline; }
.czs-breadcrumb:not(.cz-breadcrumb) [aria-current="page"] { color: var(--czs-color-muted, #6b7280); }

/* Metadata grid (spec 1.7.0 §28): a responsive grid of label/value tiles for
   the material's technical sheet — only fields that actually have a value
   ever reach this markup (Cards::material_meta()), so there is never an
   empty tile to hide here. */
.czs-material-info dl { display: flex; flex-wrap: wrap; gap: var(--czs-space-3, .75rem) 0; margin: var(--czs-space-5, 1.5rem) 0; }
.czs-material-info dt, .czs-material-info dd { flex: 0 0 auto; margin: 0 var(--czs-space-3, .75rem) 0 0; padding: .4rem .7rem; font-size: .88rem; }
.czs-material-info dt { font-weight: 600; background: var(--czs-color-background, #f4f7fb); border-radius: var(--czs-radius-sm, 8px) 0 0 var(--czs-radius-sm, 8px); }
.czs-material-info dd { background: var(--czs-color-surface, #fff); border: 1px solid var(--czs-color-border, rgba(0,0,0,.1)); border-left: none; border-radius: 0 var(--czs-radius-sm, 8px) var(--czs-radius-sm, 8px) 0; }

/* Single-material hero (spec 1.7.1 §32): title + summary + top taxonomy
   chips, above the two-column layout. */
.czs-material-hero { margin: var(--czs-space-5, 1.5rem) 0 var(--czs-space-6, 2.5rem); }
.czs-material-hero__title { font-size: clamp(1.7rem, 1.3rem + 1.6vw, 2.2rem); margin: 0 0 .5rem; line-height: 1.2; }
.czs-material-hero__summary { max-width: 65ch; margin: 0; font-size: 1.1rem; color: var(--czs-color-muted, #4b5563); }

/* Two-column material layout (spec 1.7.1 §33): main content ~2/3, action
   sidebar ~1/3 on desktop; a single column on mobile with the action card
   right after the hero. The action card is first in source order so it lands
   early on mobile, then grid-column places it on the right on desktop. */
.czs-material-layout { display: flex; flex-direction: column; gap: var(--czs-space-5, 1.5rem); margin-bottom: var(--czs-space-6, 2.5rem); }
@media (min-width: 1024px) {
	.czs-material-layout { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: var(--czs-space-6, 2.5rem); align-items: start; }
	.czs-material-layout__main { grid-column: 1; grid-row: 1; }
	.czs-material-layout__action { grid-column: 2; grid-row: 1; position: sticky; top: var(--czs-space-4, 1rem); }
}

/* Action card (spec §34): the one place a visitor decides to download/buy —
   always a real CTA, never a fake button (see template). */
.czs-material-layout__action .czs-material__cta {
	display: flex; flex-direction: column; align-items: flex-start; gap: .6rem;
	padding: var(--czs-space-5, 1.5rem);
	border: 1px solid var(--czs-color-border, rgba(0,0,0,.1));
	border-radius: var(--czs-radius-lg, 24px);
	background: var(--czs-color-surface, #fff);
	box-shadow: var(--czs-shadow-sm, 0 2px 8px rgba(0,0,0,.08));
}
.czs-material-layout__action .czs-btn { width: 100%; text-align: center; }
.czs-material__cta-meta { margin: 0; font-size: .9rem; color: var(--czs-color-muted, #6b7280); }
.czs-material__price { margin: 0; font-size: 1.15rem; font-weight: 700; }
.czs-material__media { border-radius: var(--czs-radius-lg, 24px); overflow: hidden; margin-bottom: var(--czs-space-5, 1.5rem); }
.czs-material__media img { display: block; width: 100%; height: auto; }
.czs-single-material__back { margin-top: var(--czs-space-5, 1.5rem); }

/* WooCommerce frontend hooks (spec P5 §19/§20.1): short pedagogical info
   block on the product page, one-line educational tag on the shop loop item.
   Deliberately minimal — never restructures WooCommerce's own markup. */
.czs-shop-material-info { margin: 1rem 0; padding: .75rem 1rem; border-radius: var(--czs-radius-medium, 16px); background: var(--czs-color-background, #f4f7fb); }
.czs-shop-material-info__terms { margin: 0 0 .35rem; font-size: .8rem; font-weight: 600; opacity: .8; }
.czs-shop-material-info__excerpt { margin: 0 0 .5rem; font-size: .9rem; }
.czs-shop-badge { margin: .25rem 0 0; font-size: .78rem; opacity: .75; }

/* Ad slots */
.czs-ad { margin: 1.5rem 0; text-align: center; }
.czs-ad__label { display: block; font-size: .7rem; text-transform: uppercase; letter-spacing: .05em; opacity: .6; margin-bottom: .25rem; }
.czs-ad__placeholder { border: 1px dashed rgba(0,0,0,.2); border-radius: 8px; padding: 1rem; opacity: .6; }
@media (max-width: 782px) { .czs-ad--desktop { display: none !important; } }
@media (min-width: 783px) { .czs-ad--mobile { display: none !important; } }

/* Chips / selo (P3 §5): small taxonomy/status labels used on archive and
   single-material templates. ".czs-selo" is the frontend equivalent of the
   admin-only ".czs-badge" family in admin.css. */
.czs-chips { display: flex; flex-wrap: wrap; gap: .4rem; margin: .5rem 0; list-style: none; padding: 0; }
.czs-chip { display: inline-flex; align-items: center; padding: .25rem .65rem; border-radius: 999px; font-size: .8rem; background: var(--czs-color-background, #f4f7fb); color: var(--czs-color-text, #1f2937); }
.czs-chip a { color: inherit; text-decoration: none; }
.czs-chip.is-current { background: var(--czs-color-primary, #2563eb); }
.czs-chip.is-current a { color: #fff; font-weight: 600; }
.czs-selo { display: inline-flex; align-items: center; gap: .3rem; padding: .2rem .6rem; border-radius: 999px; font-size: .78rem; font-weight: 600; }
.czs-selo--success { background: #e6f4ea; color: var(--czs-color-success, #16794c); }
.czs-selo--warning { background: #fff4e5; color: var(--czs-color-warning, #a15c00); }
.czs-selo--danger { background: #fce8e8; color: var(--czs-color-danger, #b32020); }
.czs-selo--muted { background: var(--czs-color-background, #f4f7fb); color: var(--czs-color-muted, #6b7280); }

/* Classificação do material em CHIPS (1.7.3 §2). Etapa/Ano/Disciplina abaixo
   do resumo não são navegação — o breadcrumb é — e por isso não podem ocupar
   uma linha inteira cada uma, com marcador e borda de ponta a ponta. Aqui elas
   viram etiquetas compactas, na mesma linha, que continuam levando ao arquivo
   da respectiva taxonomia.

   Toda regra é escopada em .cz-material-taxonomies: nenhuma outra lista do
   site (nem as .czs-chips do arquivo de artigos ou do seletor de conteúdo da
   taxonomia) é afetada. */
.cz-material-taxonomies {
	list-style: none;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .5rem; /* 8px */
	margin: var(--czs-space-4, 1rem) 0 0;
	padding: 0;
}
.cz-material-taxonomies__item {
	display: inline-flex;
	align-items: center;
	margin: 0;
	padding: .25rem .7rem;
	list-style: none;
	border: 1px solid var(--czs-color-border, rgba(0, 0, 0, .1));
	border-radius: 999px;
	background: var(--czs-color-primary-soft, #eaf1fb);
	color: var(--czs-color-primary, #1d4ed8);
	font-size: .85rem; /* ~13.6px */
	line-height: 1.45;
	font-weight: 500;
	white-space: nowrap;
}
.cz-material-taxonomies__item::marker { content: ""; }
.cz-material-taxonomies__item a { color: inherit; text-decoration: none; }
.cz-material-taxonomies__item:hover { border-color: currentColor; }
.cz-material-taxonomies__item a:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; border-radius: 999px; }
/* Formato/Acesso não são taxonomias e não têm link: ficam neutros, para o
   olhar distinguir "classificação pedagógica" de "ficha do arquivo". */
.cz-material-taxonomies__item--plain {
	background: var(--czs-color-background, #f4f7fb);
	color: var(--czs-color-muted, #6b7280);
}
/* Um nome longo ("Educação Física", "Anos Iniciais") pode quebrar em telas
   estreitas em vez de forçar rolagem horizontal. */
@media (max-width: 480px) {
	.cz-material-taxonomies__item { white-space: normal; }
}

/* Catalog composition (spec 1.7.1 §17-§24): hero, prominent search panel,
   full-width filter grid, results bar, card grid — no sidebar, so the grid
   always uses the full content width instead of a narrow left column. */
.czs-catalog { margin-bottom: var(--czs-space-8, 4rem); }
.czs-catalog__hero { margin: var(--czs-space-5, 1.5rem) 0 var(--czs-space-6, 2.5rem); }
.czs-catalog__title { font-size: clamp(1.6rem, 1.2rem + 1.6vw, 2.1rem); margin: 0 0 .4rem; }
.czs-catalog__intro { max-width: 60ch; margin: 0; font-size: 1.05rem; color: var(--czs-color-muted, #6b7280); }
.czs-catalog__search { margin-bottom: var(--czs-space-4, 1rem); padding: var(--czs-space-5, 1.5rem); background: var(--czs-color-surface, #fff); border: 1px solid var(--czs-color-border, rgba(0,0,0,.1)); border-radius: var(--czs-radius-lg, 24px); box-shadow: var(--czs-shadow-sm, 0 2px 8px rgba(0,0,0,.08)); }
.czs-catalog__filters { margin-bottom: var(--czs-space-5, 1.5rem); }

/* Prominent search field (spec §20): a large field with a coherent button;
   stacked full-width on small screens. */
.czs-catalog__search .czs-search__row { gap: .6rem; }
.czs-catalog__search .czs-search__row input[type="search"] { font-size: 1.05rem; padding: .75rem 1rem; }
@media (max-width: 640px) {
	.czs-catalog__search .czs-search__row { flex-direction: column; }
	.czs-catalog__search .czs-search__row .czs-btn { width: 100%; }
}

/* Advanced filters (spec §21): a native <details> drawer on mobile, an
   always-open grid of fields on desktop (3 cols → 2 → 1). Works with zero
   JavaScript. */
.czs-filters-toggle { border: 1px solid var(--czs-color-border, rgba(0,0,0,.1)); border-radius: var(--czs-radius-md, 16px); }
.czs-filters-toggle > summary { cursor: pointer; font-weight: 700; padding: var(--czs-space-4, 1rem); list-style: none; }
.czs-filters-toggle > summary::-webkit-details-marker { display: none; }
.czs-filters-toggle > summary::before { content: "▸ "; }
.czs-filters-toggle[open] > summary::before { content: "▾ "; }
.czs-filters-toggle summary:focus-visible { outline: 2px solid var(--czs-color-primary, #2563eb); outline-offset: -2px; }
.czs-filters { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--czs-space-4, 1rem); padding: 0 var(--czs-space-4, 1rem) var(--czs-space-4, 1rem); }
.czs-filters > details, .czs-filters__actions { grid-column: 1 / -1; }
.czs-filters > details { border-top: 1px solid var(--czs-color-border, rgba(0,0,0,.1)); padding-top: var(--czs-space-3, .75rem); }
.czs-filters > details > .czs-field { margin-top: var(--czs-space-3, .75rem); }
.czs-filters details summary { cursor: pointer; font-weight: 600; padding: .35rem 0; }
.czs-filters summary:focus-visible { outline: 2px solid var(--czs-color-primary, #2563eb); outline-offset: 2px; }
.czs-filters__actions { display: flex; gap: .5rem; margin-top: .25rem; flex-wrap: wrap; }
@media (max-width: 960px) { .czs-filters { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) { .czs-filters { grid-template-columns: 1fr; } }
/* Filtros ficam recolhidos por padrão em qualquer largura de tela — abrem com
   um clique no cabeçalho "Filtrar materiais". Havia aqui uma tentativa de
   manter o painel sempre aberto no desktop via display:contents no
   <details>, mas o navegador não pinta o conteúdo de um <details> fechado
   mesmo com display:contents no elemento pai — na prática, o painel de
   filtros ficava com layout "fantasma" (ocupava espaço, media queries o
   mediam) porém invisível, e o "Filtrar materiais" ficava com display:none,
   deixando o desktop sem nenhuma forma de abrir os filtros (24/08/2026).
   Removida a tentativa: o <details>/<summary> já estilizado acima (linhas
   405-410) funciona em qualquer largura, só requer um clique para abrir. */

/* Results bar (spec §23): count + active-filter chips on the left, sort on
   the right; stacks on mobile. The count renders exactly once, here. */
.czs-results-bar { display: flex; gap: var(--czs-space-4, 1rem); align-items: center; justify-content: space-between; flex-wrap: wrap; margin-bottom: var(--czs-space-5, 1.5rem); }
.czs-sort { display: flex; gap: .5rem; align-items: center; flex-wrap: wrap; }
.czs-sort__label { font-size: .85rem; font-weight: 600; }
.czs-sort select { padding: .45rem .6rem; border-radius: 8px; border: 1px solid rgba(0,0,0,.15); }
@media (max-width: 640px) { .czs-results-bar { flex-direction: column; align-items: flex-start; } }

/* Featured article (P3 §10.1): the first article on the articles archive,
   restyled horizontally on wider screens without changing Render::card()'s
   markup/API. */
.czs-featured-article { margin-bottom: var(--czs-space-5, 1.5rem); }
@media (min-width: 768px) {
	.czs-featured-article .czs-card { flex-direction: row; }
	.czs-featured-article .czs-card__media { flex: 0 0 45%; }
	.czs-featured-article .czs-card__body { flex: 1; justify-content: center; }
	.czs-featured-article .czs-card__title { font-size: 1.4rem; }
}

/* Article body (P3 §10.5): comfortable reading width + spaced typography. */
.czs-article__body { font-size: 1.05rem; line-height: 1.7; }
.czs-article__body h2, .czs-article__body h3 { margin-top: 2em; }
.czs-article__body p { margin-bottom: 1.25em; }
.czs-article__body ul, .czs-article__body ol { margin-bottom: 1.25em; padding-left: 1.5em; }
.czs-article__body li + li { margin-top: .4em; }
.czs-article__meta { display: flex; gap: .75rem; align-items: center; flex-wrap: wrap; font-size: .85rem; opacity: .8; margin-bottom: 1rem; }

/* Arena CTA (P3 §6.1 Seção 6) — only ever rendered when an Arena URL is configured. */
.czs-cta-arena { background: var(--czs-color-arena, #f97316); color: #fff; border-radius: var(--czs-radius-large, 16px); padding: var(--czs-space-6, 2.5rem) var(--czs-space-4, 1rem); text-align: center; }
.czs-cta-arena .czs-btn--primary { background: #fff; color: var(--czs-color-arena, #f97316); }
.czs-cta-arena__external { font-size: .8rem; opacity: .85; }

/* Newsletter (P3 §6.1 Seção 9) — disabled by default; only markup for a
   future step, never a live form that could discard addresses. */
.czs-newsletter--disabled { opacity: .6; border: 1px dashed var(--czs-color-border, rgba(0,0,0,.2)); border-radius: var(--czs-radius-medium, 12px); padding: var(--czs-space-4, 1rem); text-align: center; }

/* 404 */
.czs-404 { text-align: center; padding: var(--czs-space-6, 2.5rem) var(--czs-space-4, 1rem); }
.czs-404__links { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; margin-top: var(--czs-space-4, 1rem); }

/* Home (23/08/2026): cards de "Últimos materiais" e "Artigos recentes" no
mesmo tamanho compacto dos cards de "Escolha a etapa de ensino" — imagem
mais baixa (16:9, como .czs-stage-cards), sem a descrição longa, e mais
cards por linha/página. Escopado só nestas duas seções da Home; o resto do
site (arquivo de materiais, arquivo de artigos) continua com o card grande
padrão. */
.czs-carousel-section .czs-card__media,
.czs-recent-posts .czs-card__media {
  aspect-ratio: 16 / 9;
}
.czs-carousel-section .czs-card__desc,
.czs-recent-posts .czs-card__desc {
  display: none;
}
.czs-carousel-section .czs-carousel__item {
  flex-basis: calc((100% - 4 * var(--czs-space-5, 1.5rem)) / 5 - .01px);
}
@media (max-width: 960px) {
  .czs-carousel-section .czs-carousel__item { flex-basis: calc((100% - 2 * var(--czs-space-5, 1.5rem)) / 3 - .01px); }
}
@media (max-width: 640px) {
  .czs-carousel-section .czs-carousel__item { flex-basis: min(60%, 220px); }
}
.czs-recent-posts .czs-grid {
  --czs-columns: 5 !important;
}
@media (max-width: 960px) {
  .czs-recent-posts .czs-grid { --czs-columns: 2 !important; }
}
@media (max-width: 640px) {
  .czs-recent-posts .czs-grid { --czs-columns: 1 !important; }
}


/* Cards de materiais/artigos SEM foto grande (23/08/2026, a pedido do
usuário: fotos com pessoas nos cards de listagem "chamam muita atenção").
O card vira orientado a texto: uma faixa de cor discreta no lugar da
fotografia, sem a descrição longa, e o título ganha mais destaque. A ficha
do próprio material/artigo continua com a foto grande — isto muda só o
CARD de listagem (home, catálogo, relacionados etc.). Os cards de ETAPA
(.czs-stage-cards, "Escolha a etapa de ensino") NÃO são afetados: continuam
com as fotos reais. Duplicado aqui e em frontend.css porque nem toda
página carrega os dois arquivos. */
.czs-card__media img,
.czs-card__media-fallback,
.czs-card__badge {
  display: none;
}
.czs-card__media {
  aspect-ratio: auto;
  height: 6px;
  min-height: 6px;
  background: var(--czs-color-primary, #2563eb);
  opacity: .8;
}
.czs-card__desc {
  display: none;
}
.czs-card__body {
  padding-top: 1.1rem;
}
.czs-card__title {
  font-size: .95rem;
  -webkit-line-clamp: 1;
  line-clamp: 1;
}
.czs-stage-cards .czs-card__media img {
  display: block;
}
.czs-stage-cards .czs-card__media-fallback {
  display: flex;
}
.czs-stage-cards .czs-card__badge {
  display: block;
}
.czs-stage-cards .czs-card__media {
  aspect-ratio: 16 / 9;
  height: auto;
  min-height: 0;
  background: var(--czs-color-background, #eef1f6);
  opacity: 1;
}

/* Bug encontrado em 24/08/2026, ao religar o "CSS do front-end": o card do
   post em destaque lateral (.cz-featured__side .cz-post-card) usa uma marca-
   ção em que .czs-card__body é IRMÃ do link .czs-card, não filha — só a
   mídia fica dentro do link. Isso é inofensivo na maior parte do site, mas
   aqui .cz-post-card herda uma altura definida (o grid pai é esticado por
   .cz-featured, que usa align-items:stretch por padrão), e a regra global
   .czs-card { height:100% } passa a esticar o link para essa altura mesmo
   sem o corpo do card dentro dele — o corpo (título/resumo/rodapé) acaba
   renderizando abaixo do link inteiro, ultrapassando a seção "Destaques" e
   sobrepondo a faixa de CTA seguinte. Corrigido só aqui: o link volta a
   ocupar só o espaço da própria mídia, e o corpo flui logo abaixo dele,
   como já acontece no card principal (.cz-featured__main). */
.cz-post-card > .czs-card {
  height: auto;
}

/* 24/08/2026: por pedido do usuário, ARTIGOS voltam a mostrar foto — o
   tratamento "sem foto" de 23/08/2026 continua valendo só para materiais.
   Cobre toda seção que mostra card de artigo: "Artigos recentes" na Home
   (.czs-recent-posts) e tanto o arquivo de Artigos quanto o bloco de
   artigos relacionados dentro de um artigo (ambos usam .cz-post-card).
   Miniatura compacta 16:9 — o card continua curto, só a imagem volta. */
.czs-recent-posts .czs-card__media img,
.cz-post-card .czs-card__media img {
  display: block;
}
.czs-recent-posts .czs-card__media-fallback,
.cz-post-card .czs-card__media-fallback {
  display: flex;
}
.czs-recent-posts .czs-card__badge,
.cz-post-card .czs-card__badge {
  display: block;
}
.czs-recent-posts .czs-card__media,
.cz-post-card .czs-card__media {
  aspect-ratio: 16 / 9;
  height: auto;
  min-height: 0;
  background: var(--czs-color-background, #eef1f6);
  opacity: 1;
}

/* 24/08/2026: por pedido do usuário, mostrar 1 linha do resumo no card
   da grade de materiais (arquivo /materiais/, .czs-catalog) e no
   carrossel "Últimos materiais" da Home (.czs-carousel-section) — antes
   o texto ficava com display:none nessas duas áreas mesmo quando o
   material já tinha resumo cadastrado. Mais específico que a regra de
   ocultar acima (2 classes vs 1), então prevalece sem precisar mexer
   nela — que continua valendo para os outros contextos de card. */
.czs-catalog .czs-card__desc,
.czs-carousel-section .czs-card__desc {
	display: -webkit-box;
	-webkit-line-clamp: 1;
	-webkit-box-orient: vertical;
	overflow: hidden;
	margin: 0.35rem 0 0;
	font-size: 0.875rem;
	line-height: 1.5;
	color: var(--czs-color-muted, #4b5563);
}

/* --- czs-tax-pill: cores por etapa (2026-08, cores mais fortes) --- */
.czs-tax-pill--etapa-anos-iniciais { background: hsl(42 70% 28%); color: #fff; }
.czs-tax-pill--etapa-anos-finais { background: hsl(222 70% 44%); color: #fff; }
.czs-tax-pill--etapa-ensino-medio { background: hsl(275 70% 40%); color: #fff; }
.czs-tax-pill--etapa-vestibular { background: hsl(355 70% 38%); color: #fff; }
.czs-tax-pill--etapa-concursos { background: hsl(155 70% 30%); color: #fff; }

/* --- czs-tax-pill: cores por disciplina (2026-08, cores mais fortes) --- */
.czs-tax-pill--disciplina-matematica { background: hsl(210 70% 44%); color: #fff; }
.czs-tax-pill--disciplina-portugues { background: hsl(260 70% 40%); color: #fff; }
.czs-tax-pill--disciplina-lingua-portuguesa { background: hsl(260 70% 40%); color: #fff; }
.czs-tax-pill--disciplina-ingles { background: hsl(185 70% 30%); color: #fff; }
.czs-tax-pill--disciplina-lingua-inglesa { background: hsl(185 70% 30%); color: #fff; }
.czs-tax-pill--disciplina-ciencias { background: hsl(140 70% 30%); color: #fff; }
.czs-tax-pill--disciplina-biologia { background: hsl(100 70% 30%); color: #fff; }
.czs-tax-pill--disciplina-fisica { background: hsl(235 70% 44%); color: #fff; }
.czs-tax-pill--disciplina-quimica { background: hsl(300 70% 40%); color: #fff; }
.czs-tax-pill--disciplina-historia { background: hsl(30 70% 28%); color: #fff; }
.czs-tax-pill--disciplina-geografia { background: hsl(165 70% 30%); color: #fff; }
.czs-tax-pill--disciplina-arte { background: hsl(330 70% 38%); color: #fff; }
.czs-tax-pill--disciplina-educacao-fisica { background: hsl(15 70% 38%); color: #fff; }
.czs-tax-pill--disciplina-filosofia { background: hsl(280 70% 40%); color: #fff; }
.czs-tax-pill--disciplina-sociologia { background: hsl(350 70% 38%); color: #fff; }
.czs-tax-pill--disciplina-redacao { background: hsl(50 70% 28%); color: #fff; }

/* --- czs-tax-pill: cores por ano/serie (progressao 1o ano -> 3a serie, cores mais fortes) --- */
.czs-tax-pill--ano-serie-1o-ano { background: hsl(150 70% 30%); color: #fff; }
.czs-tax-pill--ano-serie-2o-ano { background: hsl(166 70% 30%); color: #fff; }
.czs-tax-pill--ano-serie-3o-ano { background: hsl(183 70% 30%); color: #fff; }
.czs-tax-pill--ano-serie-4o-ano { background: hsl(199 70% 30%); color: #fff; }
.czs-tax-pill--ano-serie-5o-ano { background: hsl(215 70% 44%); color: #fff; }
.czs-tax-pill--ano-serie-6o-ano { background: hsl(232 70% 44%); color: #fff; }
.czs-tax-pill--ano-serie-7o-ano { background: hsl(248 70% 44%); color: #fff; }
.czs-tax-pill--ano-serie-8o-ano { background: hsl(265 70% 40%); color: #fff; }
.czs-tax-pill--ano-serie-9o-ano { background: hsl(281 70% 40%); color: #fff; }
.czs-tax-pill--ano-serie-1a-serie { background: hsl(298 70% 40%); color: #fff; }
.czs-tax-pill--ano-serie-2a-serie { background: hsl(314 70% 40%); color: #fff; }
.czs-tax-pill--ano-serie-3a-serie { background: hsl(330 70% 38%); color: #fff; }