*,
*::before,
*::after {
	box-sizing: border-box;
}

/* Compensa o cabeçalho público fixo (sticky) ao saltar para uma âncora
   (ex.: menu "FAQ" → #darka-faq), para o título da secção não ficar
   escondido atrás dele. Inofensivo nas páginas autenticadas (Dashboard/
   Perfil), cuja barra superior não é sticky. */
html {
	scroll-padding-top: 90px;
}

/*
 * Alternância claro/escuro do lado do cliente (Secção 33): as variáveis
 * base já vêm calculadas no <head> pelo ThemeOutput (tema escolhido pelo
 * admin ou paleta clara), consoante `dark_mode.enabled`. Este bloco só
 * força uma variante clara quando o próprio aluno alterna manualmente,
 * mantendo as cores de marca (primária/secundária/links) e trocando
 * apenas fundo/superfície/texto/contorno.
 */
:root.darka-force-light {
	--darka-bg: #f9fafb;
	--darka-surface: #ffffff;
	--darka-text: #1f2937;
	--darka-border: #e5e7eb;
}

body.darka-frontend {
	margin: 0;
	background: var(--darka-bg);
	color: var(--darka-text);
	font-family: var(--darka-font-family);
	/* NOVO (pedido "Classificação, Tipografia e Hero Responsiva" —
	   Secção 2.1): peso base configurável (Administrador → Preferência
	   individual, ver `Preferences::effective()`), aplicado junto com a
	   Família/Tamanho acima. Elementos com peso próprio já definido
	   explicitamente na folha de estilos (títulos, botões, etc.)
	   continuam a usar o seu valor — este só define o texto corrido, tal
	   como já acontecia com o tamanho de fonte base. */
	font-weight: var(--darka-font-weight, 400);
	/* AJUSTADO (Revisão Geral e Otimização Responsiva — Secção 3): antes
	   fixo em `--darka-font-size-base` (só o valor Desktop, sempre igual
	   em qualquer ecrã) — passa a usar o passo "base" da escala fluida
	   (`clamp()`, calculada em `ThemeOutput::css_variables()`), a mesma
	   reutilizada por todo o resto do texto da plataforma. */
	font-size: var(--darka-text-base);
	line-height: 1.5;
	-webkit-font-smoothing: antialiased;
}

/* AJUSTADO (pedido "Ajuste à Implementação de Responsividade" —
   Secção 2): causa real identificada — `.darka-auth-shell` tinha
   `min-height:100vh` PRÓPRIO, somado ao espaço já ocupado no fluxo
   normal do documento pelo `.darka-public-header` (sticky, mas sticky
   continua a ocupar espaço real, não é `fixed`) logo acima dela. Ou
   seja, o total real da página passava a ser "altura do header +
   100vh", e o formulário ficava centrado nesses 100vh extra — sempre
   deslocado para baixo do centro visual verdadeiro do ecrã, tanto
   mais visível quanto maior o header. Corrigido tornando `<body>`
   (só nas páginas de autenticação, via `body.darka-auth-page` — nunca
   as restantes) uma coluna flex de `100vh`, com `.darka-auth-shell` a
   preencher exatamente o espaço que sobra abaixo do header
   (`flex:1`), sem duplicar viewport nenhum. */
body.darka-auth-page {
	display: flex;
	flex-direction: column;
	min-height: 100vh;
}

.darka-auth-shell {
	flex: 1;
	display: flex;
	align-items: flex-start;
	justify-content: center;
	padding: 24px;
	/* Desktop: mais próximo do topo do que o centrado vertical
	   anterior, mas com respiro suficiente para não parecer colado ao
	   Header — Tablet/Mobile reduzem este valor progressivamente
	   (media queries abaixo). */
	padding-top: 64px;
}

.darka-auth-card {
	width: 100%;
	max-width: 420px;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 14px;
	padding: 36px 32px;
	box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);
}

.darka-profile-card {
	max-width: 560px;
}

.darka-auth-card h1 {
	margin: 0 0 24px;
	font-size: var(--darka-text-lg);
	font-weight: 600;
}

.darka-auth-card h3 {
	margin: 28px 0 14px;
	font-size: var(--darka-text-sm);
	font-weight: 600;
	border-top: 1px solid var(--darka-border);
	padding-top: 20px;
}

/* AJUSTADO (finalização 1.0.0 — Fase 4, "Login e Registo/Cadastro"):
   espaçamento entre campos (14px→20px) e entre label/campo (6px→10px,
   ver `form input`/`form textarea` abaixo) aumentado — os campos
   ficavam visualmente colados uns aos outros. */
.darka-auth-card form label {
	display: block;
	font-size: var(--darka-text-xs);
	font-weight: 500;
	margin-bottom: 20px;
}

.darka-auth-card form input {
	display: block;
	width: 100%;
	margin-top: 10px;
	/* AJUSTADO: campos visualmente baixos — altura aumentada de forma
	   ligeira e proporcional (10px→13px de padding vertical), nunca
	   exagerada. */
	padding: 13px 14px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: rgba(255, 255, 255, 0.04);
	color: var(--darka-text);
	font-size: var(--darka-text-sm);
	font-family: inherit;
}

.darka-auth-card form input:focus {
	outline: 2px solid var(--darka-primary);
	outline-offset: 1px;
}

/* NOVO (pedido "Olhinho nos campos de senha"): wrapper só à volta do
   próprio `<input>` (ver `Components::password_field_html()`) — a
   altura do wrapper coincide sempre com a do campo, por isso a
   centragem vertical do botão (`top:50%`) funciona sem precisar de
   saber a altura exata do campo. */
.darka-password-field {
	position: relative;
}

.darka-password-field input {
	/* AJUSTADO: acompanha o aumento da área clicável do ícone acima —
	   nunca sobrepor o texto escrito no campo. */
	padding-right: 46px;
}

.darka-password-toggle {
	position: absolute;
	right: 6px;
	top: 50%;
	transform: translateY(-50%);
	background: none;
	border: none;
	/* AJUSTADO (finalização 1.0.0 — Fase 4.3): área clicável maior
	   (4px→8px de padding à volta do ícone de 18px, ~34px no total) —
	   mais confortável em Mobile/Tablet, sem aumentar visualmente o
	   ícone em si. */
	padding: 8px;
	margin: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: inherit;
	opacity: 0.6;
	cursor: pointer;
}

.darka-password-toggle:hover {
	opacity: 1;
}

.darka-password-toggle .dashicons {
	font-size: 18px;
	width: 18px;
	height: 18px;
}

/* CORRIGIDO: as perguntas do tipo "textarea" do formulário de avaliação
   (ex.: "Fale sobre o Curso") nunca tinham estilo próprio — caíam para a
   aparência nativa do navegador, pequena e inconsistente com os outros
   campos (`input` acima). Agora tem a mesma largura/borda/padding, com
   altura inicial para ~5 linhas e redimensionamento vertical livre. */
.darka-auth-card form textarea {
	display: block;
	width: 100%;
	margin-top: 10px;
	padding: 13px 14px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: rgba(255, 255, 255, 0.04);
	color: var(--darka-text);
	font-size: var(--darka-text-sm);
	font-family: inherit;
	line-height: 1.5;
	resize: vertical;
}

.darka-auth-card form textarea:focus {
	outline: 2px solid var(--darka-primary);
	outline-offset: 1px;
}

.darka-btn-primary,
.darka-btn-secondary {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* AJUSTADO (finalização 1.0.0 — Fase 4.2): altura ligeiramente maior
	   (11px→13px), mesmo critério dos inputs acima. */
	padding: 13px 18px;
	border-radius: 8px;
	border: none;
	font-size: var(--darka-text-sm);
	font-weight: 600;
	cursor: pointer;
	font-family: inherit;
	text-decoration: none;
}

.darka-btn-primary {
	background: var(--darka-primary);
	color: #fff;
}

.darka-btn-secondary {
	background: transparent;
	color: var(--darka-text);
	border: 1px solid var(--darka-border);
}

.darka-btn-primary:disabled,
.darka-btn-secondary:disabled {
	opacity: 0.6;
	cursor: not-allowed;
}

.darka-auth-card form .darka-btn-primary,
.darka-auth-card form .darka-btn-secondary {
	width: 100%;
}

/* NOVO (pedido "Nova Aba reCAPTCHA"): espaço próprio para o widget v2
   ("Não sou um robô"), entre a senha e o botão de submissão. */
.darka-auth-card form .g-recaptcha {
	margin: 8px 0 20px;
}

.darka-auth-alt {
	margin-top: 20px;
	font-size: var(--darka-text-xs);
	text-align: center;
	color: var(--darka-text);
	opacity: 0.85;
}

.darka-auth-alt a,
.darka-auth-card a {
	color: var(--darka-links);
	text-decoration: none;
}

.darka-auth-alt a:hover,
.darka-auth-card a:hover {
	text-decoration: underline;
}

.darka-form-message {
	padding: 10px 14px;
	border-radius: 8px;
	font-size: var(--darka-text-xs);
	margin-bottom: 18px;
}

.darka-form-message[data-status='error'] {
	background: rgba(239, 68, 68, 0.15);
	color: #fca5a5;
	border: 1px solid rgba(239, 68, 68, 0.3);
}

.darka-form-message[data-status='success'] {
	background: rgba(34, 197, 94, 0.15);
	color: #86efac;
	border: 1px solid rgba(34, 197, 94, 0.3);
}

.darka-avatar-row {
	display: flex;
	align-items: center;
	gap: 16px;
	margin-bottom: 24px;
}

.darka-avatar-preview {
	width: 64px;
	height: 64px;
	border-radius: 50%;
	object-fit: cover;
	border: 1px solid var(--darka-border);
}

.darka-field-help {
	font-size: var(--darka-text-xs);
	opacity: 0.7;
	margin: 4px 0 0;
}

/* AJUSTADO (pedido "Ajuste à Implementação de Responsividade" —
   Secção 2): progressão de respiro no topo — 64px no Desktop (regra
   base, acima), 40px em Tablet, 20px em Mobile — nunca colado ao
   Header, mas cada vez mais compacto conforme o ecrã encolhe. */
@media (max-width: 900px) {
	.darka-auth-shell {
		padding-top: 40px;
	}
}

@media (max-width: 600px) {
	.darka-auth-shell {
		padding: 16px;
		padding-top: 20px;
	}

	.darka-auth-card {
		padding: 28px 20px;
	}
}

/* ---------- Cabeçalho público (fixo/sticky, partilhado por todas as
   páginas acessíveis antes do login) ---------- */

.darka-public-header {
	position: sticky;
	top: 0;
	z-index: 100;
	padding: 16px 32px;
	border-bottom: 1px solid var(--darka-border);
	background: var(--darka-surface);
	transition: padding 0.2s ease, box-shadow 0.2s ease;
}

/* NOVO (auditoria "Header Principal — Boxed vs Full-Width"): o
   `<header>` continua o fundo/faixa a toda a largura (sticky, borda,
   padding) - só o conteúdo (logo + navegação + ações) passa a viver
   neste wrapper próprio, que é quem realmente ganha o `max-width`
   quando "Boxed" estiver escolhido, abaixo. Layout flex idêntico ao
   que já estava no `<header>`, só deslocado para aqui - nenhuma
   mudança visual para quem ficar em "Full Width" (o valor por
   omissão). */
.darka-public-header__inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	width: 100%;
}

/* AJUSTADO (pedido "Unificar a Largura dos Containers da Home"): o
   valor 1100px passou a viver numa única variável
   (`--darka-home-content-width`, definida em `.darka-public`, abaixo,
   com este mesmo valor como reserva para quando o cabeçalho aparece
   fora da Home — Página do Curso, Login, Registo, etc. — que não têm
   esse wrapper) - `.darka-public section.darka-section`/
   `#darka-youtube` (mais abaixo) leem a MESMA variável, em vez de cada
   um repetir "1100px" solto, que era a causa real de as secções da
   Home ficarem com larguras de conteúdo ligeiramente diferentes do
   Header (o Header não tinha padding lateral próprio nesta caixa; as
   secções tinham `padding: 0 24px` DENTRO do mesmo `max-width`, com
   `box-sizing: border-box` — encolhendo o conteúdo real ~24px de cada
   lado em relação ao Header). Sem efeito nenhum em ecrãs mais estreitos
   do que 1100px (único breakpoint deste cabeçalho é 900px, abaixo), por
   isso não interfere com o menu hambúrguer mobile. */
.darka-public-header--boxed .darka-public-header__inner {
	max-width: var(--darka-home-content-width, 1100px);
	margin: 0 auto;
}

/* Aplicada via JS ao rolar (ver assets/frontend/js/student.js) — reduz
   ligeiramente a altura e acrescenta sombra, sem exagerar na animação. */
.darka-public-header.is-scrolled {
	padding-top: 10px;
	padding-bottom: 10px;
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
}

.darka-app-logo {
	font-weight: 700;
	font-size: var(--darka-text-md);
	color: var(--darka-text);
	text-decoration: none;
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
}

/* NOVO (correção do logotipo): imagem da logo carregada no admin (em vez do
   texto do nome da plataforma). O tamanho vem de um `style="height:...px"`
   inline, aplicado dinamicamente a partir da configuração "Altura da Logo". */
.darka-app-logo__img {
	display: block;
	max-width: 220px;
}

/* Alternância clara/escura: por omissão mostra-se a imagem correspondente
   ao tema do servidor (--default-dark ou --default-light, calculada a
   partir de `dark_mode.enabled`); a classe `darka-force-light` em `<html>`
   é a mesma já usada por todo o sistema de tema para a troca ao vivo, sem
   recarregar a página, quando o aluno alterna o tema manualmente. */
.darka-app-logo--default-dark .darka-app-logo__img--light,
.darka-app-logo--default-light .darka-app-logo__img--dark {
	display: none;
}

:root.darka-force-light .darka-app-logo--default-dark .darka-app-logo__img--dark {
	display: none;
}

:root.darka-force-light .darka-app-logo--default-dark .darka-app-logo__img--light {
	display: block;
}

.darka-icon-btn {
	background: none;
	border: 1px solid var(--darka-border);
	border-radius: 8px;
	width: 36px;
	height: 36px;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: var(--darka-text);
	flex-shrink: 0;
}

.darka-public-header__toggle {
	display: none;
	background: none;
	border: 1px solid var(--darka-border);
	border-radius: 8px;
	width: 40px;
	height: 40px;
	align-items: center;
	justify-content: center;
	color: var(--darka-text);
	cursor: pointer;
	flex-shrink: 0;
}

.darka-public-header__panel {
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: 24px;
	flex: 1;
	min-width: 0;
}

/* AJUSTADO (auditoria "Header Principal — Espaçamento do Menu"):
   20px → 28px, pedido explícito ("os itens estão muito próximos") -
   `flex-wrap: wrap`, já existente, continua a ser a rede de segurança
   contra overflow horizontal em qualquer largura (Tablet incluído) -
   sem breakpoint novo, os itens simplesmente passam para uma segunda
   linha se não couberem, em vez de espremer o cabeçalho. Em Mobile
   (<900px, abaixo) o menu já muda para coluna vertical, com o seu
   próprio `gap` mais compacto - inalterado. */
.darka-public-header__nav {
	display: flex;
	align-items: center;
	gap: 28px;
	flex-wrap: wrap;
}

.darka-public-header__nav a {
	color: var(--darka-text);
	text-decoration: none;
	font-size: var(--darka-text-sm);
	font-weight: 500;
	opacity: 0.8;
	white-space: nowrap;
}

.darka-public-header__nav a:hover {
	opacity: 1;
	color: var(--darka-primary);
}

.darka-public-header__actions {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-shrink: 0;
}

.darka-public-header .darka-btn-primary,
.darka-public-header .darka-btn-secondary {
	padding: 8px 16px;
	white-space: nowrap;
}

@media (max-width: 900px) {
	.darka-public-header__toggle {
		display: inline-flex;
	}

	.darka-public-header__panel {
		display: none;
		position: absolute;
		top: 100%;
		left: 0;
		right: 0;
		flex-direction: column;
		align-items: stretch;
		gap: 18px;
		background: var(--darka-surface);
		border-bottom: 1px solid var(--darka-border);
		padding: 20px 24px 24px;
		box-shadow: 0 16px 30px rgba(0, 0, 0, 0.18);
		max-height: calc(100vh - 68px);
		overflow-y: auto;
	}

	.darka-public-header__panel.is-open {
		display: flex;
	}

	.darka-public-header__nav {
		flex-direction: column;
		align-items: flex-start;
		gap: 14px;
	}

	.darka-public-header__actions {
		flex-direction: column;
		align-items: stretch;
	}

	.darka-public-header__actions .darka-btn-primary,
	.darka-public-header__actions .darka-btn-secondary {
		text-align: center;
	}
}

.darka-eyebrow {
	display: inline-block;
	font-size: var(--darka-text-xs);
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--darka-primary);
	margin-bottom: 10px;
}

.darka-section-subtitle {
	opacity: 0.75;
	margin: -8px 0 20px;
	font-size: var(--darka-text-sm);
}

/* ---------- App shell (Dashboard / Perfil) ---------- */

.darka-app-shell {
	display: flex;
	min-height: 100vh;
}

.darka-app-shell[data-darka-sidebar-position='right'] {
	flex-direction: row-reverse;
}

.darka-sidebar {
	width: 260px;
	flex-shrink: 0;
	background: var(--darka-surface);
	border-right: 1px solid var(--darka-border);
	padding: 20px 16px;
	display: flex;
	flex-direction: column;
}

/* AJUSTADO (pedido "Ajuste à Implementação de Responsividade" —
   Secção 1): faltava esta regra de base — sem ela, o botão (um
   `<button>`, `display:inline-block` por omissão do navegador) ficava
   visível em desktop, onde a Sidebar nunca funciona como painel
   sobreposto e não há nada para "fechar". Só ganha `display:flex`
   dentro da media query mobile/tablet, mais abaixo — exatamente o
   intervalo (≤900px) em que a Sidebar passa a comportar-se como
   painel lateral/overlay em toda a folha de estilos. */
.darka-sidebar-close {
	display: none;
}

/* CORRIGIDO: o botão de alternar (`data-darka-sidebar-toggle`) já
   alternava a classe `is-open` corretamente via JS, mas essa classe só
   tinha algum efeito visual dentro da media query do mobile (abaixo) —
   em ecrã largo (>900px, onde a Sidebar já está sempre visível por
   omissão), clicar no botão não tinha nenhum efeito percetível. Agora o
   mesmo clique também recolhe/expande a Sidebar em desktop/tablet
   largo; `.darka-app-content` já tem `flex: 1`, por isso ocupa sozinho o
   espaço libertado sem precisar de mais nenhum ajuste. */
@media (min-width: 901px) {
	.darka-sidebar.is-open {
		display: none;
	}
}

.darka-sidebar-logo {
	padding: 8px 12px 20px;
}

.darka-sidebar-label {
	font-size: var(--darka-text-xs);
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	opacity: 0.5;
	padding: 0 12px 10px;
}

.darka-sidebar nav {
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.darka-sidebar nav a {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 12px;
	border-radius: 8px;
	color: var(--darka-text);
	text-decoration: none;
	font-size: var(--darka-text-sm);
}

.darka-sidebar nav a.is-active,
.darka-sidebar nav a:hover {
	background: var(--darka-primary);
	color: #fff;
}

.darka-sidebar-bottom {
	margin-top: auto;
	padding-top: 16px;
	border-top: 1px solid var(--darka-border);
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.darka-sidebar-bottom a {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 12px;
	border-radius: 8px;
	color: var(--darka-text);
	text-decoration: none;
	font-size: var(--darka-text-xs);
	opacity: 0.8;
}

.darka-sidebar-bottom a:hover {
	opacity: 1;
}

.darka-sidebar-logout {
	color: #ef4444 !important;
	opacity: 1 !important;
}

.darka-app-content {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
}

.darka-app-topbar {
	display: flex;
	align-items: center;
	gap: 16px;
	padding: 14px 24px;
	border-bottom: 1px solid var(--darka-border);
	background: var(--darka-surface);
}

.darka-app-header__actions {
	display: flex;
	align-items: center;
	gap: 16px;
	margin-left: auto;
}

/* AJUSTADO: "Ver Perfil" passou de link de navegação a gatilho de um
   popover (`.darka-user-popover`, ver marcação em Components::topbar()).
   `.darka-user-menu` continua a dar o mesmo aspeto (agora num <button>,
   por isso o reset de estilo nativo do botão logo a seguir). */
.darka-user-popover {
	position: relative;
}

button.darka-user-menu {
	background: none;
	border: none;
	padding: 0;
	font: inherit;
	cursor: pointer;
}

.darka-user-menu {
	display: flex;
	align-items: center;
	gap: 10px;
	text-decoration: none;
	color: var(--darka-text);
}

.darka-user-avatar {
	width: 36px;
	height: 36px;
	border-radius: 50%;
	object-fit: cover;
	flex-shrink: 0;
}

.darka-user-avatar--initials {
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--darka-primary);
	color: #fff;
	font-size: var(--darka-text-xs);
	font-weight: 700;
}

.darka-user-menu__text {
	display: flex;
	flex-direction: column;
	font-size: var(--darka-text-xs);
	line-height: 1.3;
}

.darka-user-menu__text small {
	opacity: 0.6;
	font-size: var(--darka-text-xs);
}

.darka-app-main {
	padding: 32px;
	max-width: 1200px;
}

/* AJUSTADO (pedido "alinhamento não está perfeito em Mobile/Tablet —
   containers com a mesma largura do Header"): `.darka-app-topbar` já
   reduz o seu padding horizontal para 14px em ≤900px (ver
   `.darka-app-topbar` dentro do `@media (max-width: 900px)`, mais
   abaixo), mas `.darka-app-main` — o contentor do conteúdo de cada
   página (Dashboard, Meus Cursos, Mais Cursos, Perfil, Certificados,
   Links) — nunca tinha um ajuste equivalente, ficando preso ao padding
   de 32px do desktop também em ecrãs pequenos. Os limites esquerdo/
   direito do conteúdo ficavam, por isso, 18px mais para dentro do que
   os do cabeçalho, dando a impressão de que a página é "mais estreita".
   `:not(.darka-app-main--course)` preserva o caso especial da página do
   Curso sem acesso (`padding: 0`, mais abaixo — já tem o seu próprio
   padding via `.darka-course-page-wrap`, nunca deve ganhar este). */
@media (max-width: 900px) {
	.darka-app-main:not(.darka-app-main--course) {
		padding-left: 14px;
		padding-right: 14px;
	}
}

.darka-app-main h1 {
	margin-top: 0;
}

.darka-app-main--narrow .darka-profile-card {
	max-width: 560px;
	margin: 0;
	box-shadow: none;
}

.darka-section {
	margin-bottom: 40px;
}

.darka-dashboard-hero {
	background: linear-gradient(135deg, var(--darka-bg), var(--darka-surface));
	border: 1px solid var(--darka-border);
	border-radius: 14px;
	padding: 32px;
	margin-bottom: 24px;
}

.darka-dashboard-hero h1 {
	margin: 6px 0 8px;
	font-size: var(--darka-text-xl);
}

.darka-dashboard-hero__actions {
	display: flex;
	gap: 10px;
	margin-top: 16px;
}

.darka-dashboard-hero__actions .darka-btn-primary,
.darka-dashboard-hero__actions .darka-btn-secondary {
	padding: 10px 20px;
}

.darka-stat-cards {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
	gap: 16px;
	margin-bottom: 32px;
}

.darka-stat-card {
	display: flex;
	align-items: center;
	gap: 14px;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 18px 20px;
}

.darka-stat-card .dashicons {
	font-size: 22px;
	width: 22px;
	height: 22px;
	color: var(--darka-primary);
}

.darka-stat-card strong {
	display: block;
	font-size: var(--darka-text-lg);
}

.darka-stat-card span {
	font-size: var(--darka-text-xs);
	opacity: 0.7;
}

.darka-quick-actions {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
	gap: 16px;
}

.darka-quick-tile {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 8px;
	padding: 24px 12px;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	color: var(--darka-text);
	text-decoration: none;
	font-size: var(--darka-text-xs);
	font-weight: 600;
	cursor: pointer;
	font-family: inherit;
}

.darka-quick-tile .dashicons {
	font-size: 22px;
	width: 22px;
	height: 22px;
	color: var(--darka-primary);
}

.darka-quick-tile:hover {
	border-color: var(--darka-primary);
}

.darka-quick-tile--danger .dashicons,
.darka-quick-tile--danger {
	color: #ef4444;
}

/* NOVO (pedido "Pesquisa e Filtros do Catálogo — AJAX"): barra de
   pesquisa + filtros (Categoria/Instrutor) do Catálogo da Home — ver
   `HomePage::catalog_toolbar()`/`initCatalogFilters()` (student.js). */
.darka-catalog-toolbar {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin: 20px 0 28px;
}

.darka-catalog-toolbar__search,
.darka-catalog-toolbar__select {
	padding: 11px 14px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: var(--darka-surface);
	color: var(--darka-text);
	font-size: var(--darka-text-sm);
}

.darka-catalog-toolbar__search {
	flex: 1 1 240px;
	min-width: 0;
}

.darka-catalog-toolbar__select {
	flex: 1 1 180px;
	min-width: 0;
}

/* NOVO (pedido explícito): cor de destaque (`var(--darka-primary)`, a
   mesma da Identidade Visual) ao passar o cursor sobre uma opção
   específica destes selects. NOTA TÉCNICA: a lista aberta de um
   `<select>` nativo é desenhada pelo sistema operativo/motor do
   navegador (não pelo CSS da página) — `option:hover`/`option:checked`
   só têm efeito visível nalguns navegadores (ex.: Firefox); no Chrome/
   Edge em Windows e macOS a lista aberta não é estilizável por CSS.
   Aplicado mesmo assim, sem inventar um componente de lista à parte,
   por ser a forma correta e sem duplicação de o pedir a um `<select>`
   nativo — funciona onde o navegador o permitir. */
.darka-catalog-toolbar__select option:hover,
.darka-catalog-toolbar__select option:checked,
.darka-catalog-toolbar__select option:focus {
	background-color: var(--darka-primary);
	color: #fff;
}

.darka-course-grid[aria-busy="true"] {
	opacity: 0.5;
	pointer-events: none;
}

.darka-catalog-empty {
	grid-column: 1 / -1;
}

/* ---------- Cartões de curso ---------- */

.darka-course-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 20px;
}

/* Modificador só usado pelo Catálogo da Home (número de colunas
   configurável pelo admin) — a grelha base acima mantém-se inalterada
   para o Dashboard/Perfil, que não têm essa configuração. */
.darka-course-grid--columns {
	grid-template-columns: repeat(var(--darka-catalog-columns, 4), 1fr);
}

/* AJUSTADO (Secção 15/16 do pedido "Revisão Geral e Otimização
   Responsiva" — padronizar breakpoints): 1024px era o único sítio em
   toda a folha de estilos a usar esse valor — passou a 900px, a
   mesma fronteira tablet/mobile já usada em todo o resto (Sidebar,
   Header, Hero, Login/Registo, página de Aula). */
@media (max-width: 900px) {
	.darka-course-grid--columns {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 600px) {
	.darka-course-grid--columns {
		grid-template-columns: repeat(1, 1fr);
	}
}

/* AJUSTADO (auditoria "Meus Cursos — Configuração no Administrador"):
   generalizado de `--more-courses` para `--configurable` — o mesmo
   mecanismo passou a servir também "Meus Cursos" (`MyCoursesPage`),
   não só "Mais Cursos"; cada página define os seus próprios valores
   nas variáveis CSS abaixo (ver `Components::course_grid_section()`),
   por isso continuam independentes uma da outra apesar de partilharem
   a mesma regra. Independente de `--columns` (Catálogo da Home, acima)
   — colunas configuráveis por dispositivo (desktop/tablet/mobile), em
   vez de valores fixos. */
.darka-course-grid--configurable {
	grid-template-columns: repeat(var(--darka-course-grid-columns-desktop, 4), 1fr);
}

@media (max-width: 900px) {
	.darka-course-grid--configurable {
		grid-template-columns: repeat(var(--darka-course-grid-columns-tablet, 2), 1fr);
	}
}

@media (max-width: 600px) {
	.darka-course-grid--configurable {
		grid-template-columns: repeat(var(--darka-course-grid-columns-mobile, 1), 1fr);
	}
}

.darka-course-card {
	display: block;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	overflow: hidden;
	transition: transform 0.15s ease;
}

.darka-course-card:hover {
	transform: translateY(-3px);
}

.darka-course-card__link {
	display: block;
	text-decoration: none;
	color: var(--darka-text);
}

.darka-course-card__buy {
	display: block;
	margin: 0 16px 16px;
	text-align: center;
}

.darka-course-card__media {
	position: relative;
	aspect-ratio: 16 / 9;
	background: var(--darka-border);
}

.darka-course-card__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.darka-course-card__placeholder {
	width: 100%;
	height: 100%;
	background: linear-gradient(135deg, var(--darka-primary), var(--darka-secondary));
}

/* REMOVIDO: `.darka-course-card__lock` (overlay "Conteúdo Bloqueado"
   sobre a imagem) — removido a pedido explícito; a indicação de
   módulos/aulas/alunos mudou-se para o conteúdo normal do card (ver
   `.darka-course-card__stats-row`, mais abaixo). Regra órfã
   eliminada. */

/* AJUSTADO (Parte 4 do pedido "Meus Cursos"): renomeada de
   `__locked-info` para `__stats-row` — deixou de ser exclusiva de
   cards bloqueados ("Mais Cursos"), passa a aparecer também em
   "Meus Cursos" (cursos já com acesso). Dados reais
   (módulos/aulas/alunos), nunca inventados — ver
   `Components::course_card()`. */
.darka-course-card__stats-row {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px 10px;
	margin: 4px 0 8px;
}

.darka-course-card__category {
	padding: 2px 8px;
	border-radius: 999px;
	border: 1px solid var(--darka-border);
	font-size: var(--darka-text-xs);
	opacity: 0.8;
}

/* CORRIGIDO (auditoria "Mais Cursos"/"Meus Cursos — Informações dos
   Cards"): substitui `.darka-course-card__curriculum-stats`/
   `__students-stat` (dois blocos separados por "•") por uma única
   linha, sempre discreta e, sempre que possível, sem quebra — quando
   não couber, trunca com reticências em vez de quebrar para uma
   segunda linha. Cor cinza discreta via `var(--darka-text)` + opacidade
   reduzida (nunca um cinzento fixo em hexadecimal) — mantém contraste
   correto tanto em Light Mode como em Dark Mode, porque parte sempre
   da MESMA cor de texto que o tema ativo já usa. */
.darka-course-card__summary {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	flex: 1 1 auto;
	min-width: 0;
	color: var(--darka-text);
	opacity: 0.6;
}

/* Tamanhos diferentes por página (pedido explícito: "Meus Cursos" com
   fonte ainda menor do que "Mais Cursos") — ver o contexto
   `--more-courses`/`--my-courses` acrescentado em
   `Components::course_card()`, reaproveitando os parâmetros `$locked`/
   `$show_stats` já existentes, sem novo parâmetro. */
.darka-course-card__stats-row--more-courses .darka-course-card__summary {
	font-size: 11px;
}

.darka-course-card__stats-row--my-courses .darka-course-card__summary {
	font-size: 10px;
}

/* NOVO (auditoria "Catálogo da Home — Linha de Meta-informação nos
   Cards"): bloco próprio e independente de `.darka-course-card__stats-row`
   (acima, inalterado) - só aparece nos cards do Catálogo da Home,
   com os 4 dados individualmente comutáveis pelo Administrador. Mesma
   técnica discreta (cor herdada do tema + opacidade reduzida) para
   contraste garantido em Dark e Light Mode sem cor nova. */
.darka-course-card__meta-line {
	display: flex;
	flex-direction: column;
	gap: 2px;
	margin-top: 6px;
	font-size: 11px;
	color: var(--darka-text);
	opacity: 0.6;
}

/* NOVO (pedido explícito): classificação por estrelas dos alunos,
   abaixo do bloco de estatísticas acima - mesma cor âmbar já usada
   nas estrelas dos cards de depoimento (`.darka-testimonial-card__stars`,
   mais abaixo neste ficheiro), nunca uma cor nova. Valor numérico com
   a mesma técnica discreta (opacidade reduzida) do resto do bloco. */
.darka-course-card__rating {
	display: flex;
	align-items: center;
	gap: 4px;
	margin-top: 4px;
	font-size: 11px;
}

.darka-course-card__rating-stars {
	color: #f59e0b;
	letter-spacing: 1px;
}

.darka-course-card__rating-value {
	color: var(--darka-text);
	opacity: 0.6;
}

/* NOVO (pedido explícito): número de avaliadores, à direita da
   pontuação - mesma técnica discreta, um pouco mais apagada (0.5) por
   ser só informação de apoio ao valor principal. */
.darka-course-card__rating-count {
	color: var(--darka-text);
	opacity: 0.5;
}

/* NOVO (Parte 4 do pedido "Meus Cursos"): percentagem em texto, ao
   lado da barra de progresso já existente (`.darka-progress-bar`,
   inalterada) — mesmo valor (`Progress::course_summary()`), nunca um
   cálculo à parte. */
.darka-course-card__progress {
	margin: 8px 0;
}

.darka-course-card__progress-label {
	display: block;
	margin-top: 4px;
	font-size: var(--darka-text-xs);
	opacity: 0.75;
}

.darka-course-card__duration {
	position: absolute;
	top: 10px;
	left: 10px;
	display: flex;
	align-items: center;
	gap: 4px;
	background: rgba(0, 0, 0, 0.65);
	color: #fff;
	font-size: var(--darka-text-xs);
	font-weight: 600;
	padding: 4px 10px;
	border-radius: 999px;
}

.darka-course-card__duration .dashicons {
	font-size: 13px;
	width: 13px;
	height: 13px;
}

.darka-course-card__body {
	padding: 16px;
}

.darka-course-card__body h3 {
	margin: 8px 0 6px;
	font-size: var(--darka-text-sm);
}

.darka-course-card__body p {
	margin: 0 0 10px;
	font-size: var(--darka-text-xs);
	opacity: 0.75;
}

/* AJUSTADO: o preço passou a aparecer logo acima do título (antes vinha
   depois da descrição) — ganhou `display: block` (linha própria) e mais
   destaque (tamanho e cor da marca, já usada em botões/links) para
   corresponder à nova posição de maior relevo no card. */
.darka-course-card__price {
	display: block;
	font-weight: 700;
	font-size: var(--darka-text-base);
	color: var(--darka-primary);
	margin-bottom: 2px;
}

/* Tamanho dos cards do Catálogo (configuração do admin) — aplicado à
   grelha, não ao card isoladamente, para poder também ajustar o
   espaçamento entre cards de forma coerente com o tamanho escolhido.
   A proporção 16:9 da capa (`.darka-course-card__media`) é sempre
   preservada — só o card à volta muda de tamanho, nunca a imagem em si. */
.darka-course-grid--size-small {
	gap: 14px;
}

.darka-course-grid--size-small .darka-course-card__body {
	padding: 12px;
}

.darka-course-grid--size-small .darka-course-card__body h3 {
	margin: 6px 0 4px;
	font-size: var(--darka-text-xs);
}

.darka-course-grid--size-small .darka-course-card__body p {
	font-size: var(--darka-text-xs);
	margin-bottom: 6px;
}

.darka-course-grid--size-large {
	gap: 28px;
}

.darka-course-grid--size-large .darka-course-card__body {
	padding: 22px;
}

.darka-course-grid--size-large .darka-course-card__body h3 {
	margin: 10px 0 8px;
	font-size: var(--darka-text-md);
}

.darka-course-grid--size-large .darka-course-card__body p {
	font-size: var(--darka-text-sm);
	margin-bottom: 12px;
}

.darka-badge {
	display: inline-block;
	padding: 3px 10px;
	border-radius: 999px;
	font-size: var(--darka-text-xs);
	font-weight: 700;
	text-transform: uppercase;
}

.darka-badge--free {
	background: rgba(34, 197, 94, 0.2);
	color: #4ade80;
}

.darka-progress-bar {
	height: 6px;
	border-radius: 999px;
	background: var(--darka-border);
	margin-top: 10px;
	overflow: hidden;
}

.darka-progress-bar__fill {
	height: 100%;
	background: var(--darka-primary);
}

/* ---------- Continuar assistindo ---------- */

/* CORRIGIDO (auditoria "Dashboard — Cursos em Andamento"): de lista
   vertical de linhas horizontais (miniatura + texto + botão numa só
   fila, sem nenhuma adaptação por tamanho de ecrã) para uma grelha de
   cards responsiva — mesma técnica já usada em `.darka-course-grid`/
   `.darka-testimonial-grid` (`repeat(auto-fill, minmax(...))`, sem
   nenhuma regra de largura fixa): o número de colunas ajusta-se
   sozinho ao espaço disponível, nunca quebrando/estourando em Mobile
   ou Tablet. Nenhum dado/campo novo — mesma marcação PHP de sempre
   (`DashboardPage::continue_watching_section()`, não alterada), só o
   layout. */
.darka-continue-list {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: 16px;
}

.darka-continue-card {
	display: flex;
	flex-direction: column;
	gap: 10px;
	padding: 14px;
	border-radius: 10px;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	color: var(--darka-text);
	font-size: var(--darka-text-xs);
}

.darka-continue-card__media {
	width: 100%;
	aspect-ratio: 16 / 9;
	border-radius: 8px;
	overflow: hidden;
	background: var(--darka-border);
}

.darka-continue-card__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.darka-continue-card__body {
	flex: 1;
	min-width: 0;
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.darka-continue-card__body strong {
	font-size: var(--darka-text-sm);
}

.darka-continue-card__body span {
	opacity: 0.7;
	font-size: var(--darka-text-xs);
}

.darka-continue-card .darka-btn-primary {
	width: 100%;
	padding: 8px 18px;
}

/* ---------- Home pública ---------- */

.darka-hero {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 80px 24px;
	background-size: cover;
	background-position: center;
	overflow: hidden;
}

/* Altura configurável pelo admin (Configurações → Geral → Hero da Home).
   `min-height` (não `height` fixo) para nunca cortar o conteúdo em
   ecrãs pequenos ou com título/subtítulo longos. */
.darka-hero--small {
	min-height: 280px;
}

.darka-hero--medium {
	min-height: 420px;
}

.darka-hero--large {
	min-height: 560px;
}

.darka-hero--screen {
	min-height: calc(100vh - 70px);
}

.darka-hero__overlay {
	position: absolute;
	inset: 0;
	background: linear-gradient(
		180deg,
		rgba(var(--darka-hero-overlay-color, 0, 0, 0), var(--darka-hero-overlay-opacity, 0.55)) 0%,
		var(--darka-bg) 95%
	);
}

.darka-hero__content {
	position: relative;
	max-width: 640px;
	margin: 0 auto;
	text-align: center;
}

.darka-hero h1 {
	font-size: var(--darka-text-3xl);
	line-height: 1.15;
	margin: 0 0 16px;
}

.darka-hero p {
	max-width: 560px;
	margin: 0 auto 28px;
	opacity: 0.85;
}

.darka-hero__actions {
	display: flex;
	justify-content: center;
	gap: 12px;
}

.darka-hero__actions .darka-btn-primary,
.darka-hero__actions .darka-btn-secondary {
	padding: 12px 28px;
}

.darka-stats-bar {
	display: flex;
	justify-content: center;
	flex-wrap: wrap;
	gap: 48px;
	padding: 28px 24px;
	border-bottom: 1px solid var(--darka-border);
}

.darka-stat {
	text-align: center;
}

.darka-stat strong {
	display: block;
	font-size: var(--darka-text-lg);
}

.darka-stat span {
	font-size: var(--darka-text-xs);
	opacity: 0.7;
}

/* NOVO (pedido "Unificar a Largura dos Containers da Home"): fonte
   única da largura de conteúdo da Home — mesmo valor (1100px) já usado
   pelo Header quando "Boxed" (`.darka-public-header--boxed
   .darka-public-header__inner`, acima), lido de volta por essa regra e
   pelas de largura das secções, abaixo, em vez de "1100px" repetido em
   cada sítio. `--darka-home-section-padding` é o padding lateral já
   existente das secções (24px) — usado para calcular o `max-width`
   necessário para o CONTEÚDO (depois de subtrair o padding, com
   `box-sizing: border-box`) ficar exatamente igual ao do Header. */
.darka-public {
	--darka-home-content-width: 1100px;
	--darka-home-section-padding: 24px;
}

.darka-public section.darka-section {
	margin: 0 auto 60px;
	padding: 0 var(--darka-home-section-padding);
}

/* AJUSTADO: `max-width` deixou de ser um valor único e incondicional —
   passa a respeitar a mesma configuração "Boxed"/"Full-Width" do
   Header (`general.header_layout`, ver `HomePage::render()` —
   `.darka-public--boxed`/`.darka-public--full_width`, aplicada ao
   wrapper da página). "Boxed": `max-width` calculado para o CONTEÚDO
   (já descontado o padding lateral) ficar exatamente com
   `--darka-home-content-width` (1100px), igual ao Header. "Full-Width":
   sem limite de largura — mesmo comportamento já existente do próprio
   Header nesse modo (só o padding lateral de sempre, sem "caixa"
   central). */
.darka-public--boxed section.darka-section {
	max-width: calc(var(--darka-home-content-width) + (var(--darka-home-section-padding) * 2));
}

.darka-public--full_width section.darka-section {
	max-width: none;
}

/* CORRIGIDO (pedido explícito — "largura ligeiramente superior à do
   Header Boxed"): ao contrário das restantes secções (acima, sem fundo
   próprio — só o CONTEÚDO interno, depois do padding, precisa de bater
   certo com o Header), a secção Youtube tem um fundo bem visível
   (`var(--darka-surface)`, ver `#darka-youtube.darka-youtube-section`,
   mais abaixo) — a borda que tem de alinhar com o Header é a da própria
   CAIXA (fundo/limite visível), não o texto lá dentro. A versão anterior
   somava o padding (40px de cada lado) ao `max-width`
   (`calc(...+80px)`), o que alargava exatamente essa caixa 80px além do
   Header — a causa exata do problema relatado. Corrigido usando o
   MESMO valor do Header directamente, sem soma nenhuma — com
   `box-sizing: border-box` (global no site), o padding de 40px fica
   sempre DENTRO desses 1100px, nunca a alargar a caixa para além
   deles. Maior especificidade (`id` + classe) do que
   `.darka-public--boxed section.darka-section`, para vencer sem
   `!important`. */
.darka-public--boxed #darka-youtube.darka-youtube-section {
	max-width: var(--darka-home-content-width);
}

.darka-public--full_width #darka-youtube.darka-youtube-section {
	max-width: none;
}

/* Corrige o espaçamento vertical apertado entre o rótulo "CATÁLOGO", o
   título, a descrição e os cards — sem alterar `.darka-eyebrow`/
   `.darka-section-subtitle` de base (partilhadas com o Dashboard/
   Perfil autenticados, que não têm este problema). */
.darka-public section.darka-section > .darka-eyebrow {
	display: block;
	margin-bottom: 14px;
}

.darka-public section.darka-section > h2 {
	margin: 0 0 14px;
}

.darka-public section.darka-section > .darka-section-subtitle {
	margin: 0 0 36px;
}

/* AJUSTADO: respiro superior, inicialmente só da secção Catálogo
   (pedido específico), depois também aplicado a "Depoimentos" (mesmo
   problema, mesma correção — ver `#darka-testimonials` abaixo); FAQ
   continua sem este ajuste, por não ter sido pedido. Reduzido em
   ecrãs mais pequenos para não desperdiçar espaço útil, mantendo os
   mesmos breakpoints já usados no resto da folha de estilos (900px /
   600px). */
.darka-public #darka-courses {
	padding-top: 72px;
}

@media (max-width: 900px) {
	.darka-public #darka-courses {
		padding-top: 56px;
	}
}

@media (max-width: 600px) {
	.darka-public #darka-courses {
		padding-top: 40px;
	}
}

/* CORRIGIDO (auditoria "Depoimentos e Estatísticas — Padding
   Superior"): mesmo ajuste já aplicado a `#darka-courses` acima
   (`padding: 0 24px` da regra partilhada `.darka-section` não dá
   nenhum espaço próprio no topo — só o `margin-bottom: 60px` da secção
   anterior separa as duas, o que nunca é sentido como respiração
   DENTRO da própria secção "Depoimentos"). Mesmos valores/breakpoints,
   para manter o espaçamento consistente entre as duas secções — sem
   tocar em `.darka-section` (partilhada com FAQ e as restantes) nem no
   layout dos cards. */
.darka-public #darka-testimonials {
	padding-top: 72px;
}

@media (max-width: 900px) {
	.darka-public #darka-testimonials {
		padding-top: 56px;
	}
}

@media (max-width: 600px) {
	.darka-public #darka-testimonials {
		padding-top: 40px;
	}
}

/* NOVO (pedido "Revisão Geral e Otimização Responsiva" — Secção 2:
   "evitar espaçamentos exagerados"): o Hero da Home tinha sempre
   80px de respiro vertical, o mesmo em qualquer ecrã — reduzido em
   tablet/mobile, mesmos breakpoints já usados no resto da folha de
   estilos (900px/600px). */
@media (max-width: 900px) {
	.darka-hero {
		padding: 56px 20px;
	}
}

@media (max-width: 600px) {
	.darka-hero {
		padding: 40px 16px;
	}

	.darka-hero__actions {
		flex-direction: column;
	}

	.darka-hero__actions .darka-btn-primary,
	.darka-hero__actions .darka-btn-secondary {
		width: 100%;
	}
}

/* NOVO (pedido "Secção Youtube"): vídeo + botão para o canal, antes do
   Rodapé — ver `HomePage::youtube_section()`. `.darka-lesson-player`
   (reutilizada para a caixa do vídeo) já trata do fundo preto, cantos
   arredondados e proporção 16:9 — só a margem própria é reposta aqui,
   para não competir com o `gap` da grelha. */
.darka-youtube-section {
	display: grid;
	grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);
	gap: 40px;
	align-items: center;
}

/* NOVO (pedido explícito): destacada com a mesma cor de fundo do
   cabeçalho (`var(--darka-surface)`, já usada em `.darka-public-header`/
   `.darka-app-topbar`) e padding próprio de 40px em todos os lados —
   para ficar nítido que é uma secção externa à plataforma. Seletor com
   o `id` (`#darka-youtube`, já presente na marcação) para ganhar
   especificidade sobre `.darka-public section.darka-section` (a regra
   partilhada por Catálogo/Depoimentos/FAQ, que já define
   `padding: 0 24px`/`margin: 0 auto 60px`) sem precisar de `!important`.
   `margin-top` bem maior do que o espaçamento normal entre secções
   (60px) para nunca ficar colada à secção de cima. */
#darka-youtube.darka-youtube-section {
	background: var(--darka-surface);
	padding: 40px;
	margin-top: 100px;
	/* NOVO (pedido explícito): cantos ligeiramente arredondados. */
	border-radius: 18px;
}

.darka-youtube-section__player {
	margin: 0;
}

.darka-youtube-section__content h2 {
	margin-top: 0;
}

.darka-youtube-section__content .darka-btn-primary {
	margin-top: 8px;
}

/* AJUSTADO (pedido "Responsividade da Secção Youtube"): título,
   descrição e botão centralizados horizontalmente em Tablet/Mobile —
   `text-align: center` trata o texto (título/descrição), `align-items:
   center` (eixo transversal de um `flex-direction: column`) centra o
   botão, que é um elemento de bloco e não seguiria só o `text-align`.
   Único breakpoint (900px) já usado por esta secção — cobre Tablet e
   Mobile com a mesma regra, sem duplicar. Nada aqui dentro deste
   `@media` afeta o Desktop (>900px), que mantém o alinhamento actual à
   esquerda. */
@media (max-width: 900px) {
	.darka-youtube-section {
		grid-template-columns: 1fr;
	}

	.darka-youtube-section__content {
		display: flex;
		flex-direction: column;
		align-items: center;
		text-align: center;
	}
}

.darka-public-footer {
	text-align: center;
	padding: 32px;
	border-top: 1px solid var(--darka-border);
	font-size: var(--darka-text-xs);
	opacity: 0.7;
}

.darka-public-footer p {
	margin: 0 0 6px;
}

.darka-public-footer p:last-child {
	margin-bottom: 0;
}

/* NOVO (pedido "Configurações da Empresa"): linha de copyright sempre
   gerada pelo servidor (nunca texto livre) - ligeiramente mais
   discreta que uma eventual tagline acima dela. */
.darka-public-footer__copyright {
	opacity: 0.85;
}

/* NOVO (pedido "Rodapé com links legais"): linha de links centrada,
   com separadores "·" - sem cores/gradiente próprios, usa sempre as
   variáveis de tema já existentes (Claro/Escuro continuam a decidir a
   cor, nunca um valor fixo aqui). */
.darka-public-footer__links {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: 8px;
	margin: 14px 0;
}

.darka-public-footer__links a {
	color: inherit;
	text-decoration: none;
	opacity: 0.85;
}

.darka-public-footer__links a:hover,
.darka-public-footer__links a:focus-visible {
	opacity: 1;
	text-decoration: underline;
}

.darka-public-footer__links span[aria-hidden="true"] {
	opacity: 0.5;
}

.darka-public-footer__credit {
	opacity: 0.85;
}

.darka-public-footer__credit a {
	color: var(--darka-primary, inherit);
	text-decoration: none;
}

.darka-public-footer__credit a:hover,
.darka-public-footer__credit a:focus-visible {
	text-decoration: underline;
}

.darka-public-footer__version {
	opacity: 0.6;
	font-size: 0.9em;
}

/* ---------- Página de curso ---------- */

.darka-course-page-wrap {
	max-width: 1100px;
	margin: 0 auto;
	padding: 32px 24px 60px;
}

/* NOVO: quando esta página é mostrada dentro da app shell (aluno
   autenticado sem acesso ao curso, ver `CoursePage::render()`), remove o
   padding próprio de `.darka-app-main` — `.darka-course-page-wrap` já
   tem o seu, evita padding a dobrar. */
.darka-app-main--course {
	padding: 0;
	max-width: none;
}

.darka-course-layout-grid {
	display: grid;
	grid-template-columns: 1fr 320px;
	gap: 40px;
	align-items: start;
}

/* AJUSTADO: de centrado para alinhado à esquerda (pedido explícito) —
   título e categoria já não ficam centralizados. */
/* CORRIGIDO (auditoria "Página do Curso — Alinhamento do Título"):
   já tinha `text-align:left`, mas sem `max-width`/`margin:auto` — a
   secção ficava full-bleed enquanto `.darka-course-page-wrap` (onde
   vive "Conteúdo do Curso") é centrada com o mesmo max-width; o
   `padding-left` dos dois só coincidia em ecrãs estreitos. Alinha as
   duas margens esquerdas exatamente. */
.darka-course-hero {
	text-align: left;
	max-width: 1100px;
	margin: 0 auto;
	padding: 56px 24px 32px;
}

.darka-course-hero__content h1 {
	font-size: var(--darka-text-2xl);
	margin: 0 0 10px;
}

.darka-course-hero__content p {
	max-width: 640px;
	margin: 0;
	opacity: 0.8;
}

.darka-course-stats-row {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	font-size: var(--darka-text-xs);
	opacity: 0.75;
	margin-bottom: 24px;
}

.darka-dot {
	opacity: 0.5;
}

.darka-course-description {
	line-height: 1.7;
	margin-bottom: 32px;
}

.darka-curriculum h2 {
	font-size: var(--darka-text-md);
	margin-bottom: 16px;
}

.darka-curriculum-module {
	border: 1px solid var(--darka-border);
	border-radius: 10px;
	padding: 16px 20px;
	margin-bottom: 12px;
}

.darka-curriculum-module h3 {
	margin: 0 0 10px;
	font-size: var(--darka-text-base);
}

/* NOVO (auditoria "Curso sem Acesso — Módulos em Accordion"): mesma
   técnica CSS-only já usada em `.darka-faq-item` (marcador `+`/`−`
   via `::after`, sem JS) - aplicada aqui só quando `.darka-curriculum-
   module` é um `<details>` (utilizador sem acesso; ver
   `CoursePage::curriculum()`). O bloco em `<div>` (utilizador com
   acesso) não tem `<summary>`, por isso estas regras não têm efeito
   nenhum nesse caso - nenhuma duplicação de estrutura. */
.darka-curriculum-module summary {
	list-style: none;
	cursor: pointer;
	margin: 0 0 10px;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 2px 16px;
}

.darka-curriculum-module summary::-webkit-details-marker {
	display: none;
}

.darka-curriculum-module summary::after {
	content: '+';
	font-size: 20px;
	font-weight: 400;
	line-height: 1;
	color: var(--darka-primary);
	flex-shrink: 0;
}

.darka-curriculum-module[open] summary::after {
	content: '\2212';
}

.darka-curriculum-module__title {
	font-size: var(--darka-text-base);
	font-weight: 600;
	flex: 1 1 auto;
	min-width: 0;
}

/* Discreta e em bloco próprio (pedido explícito), abaixo do título -
   mesma técnica de opacidade reduzida sobre a cor herdada já usada em
   `.darka-field-help`/`.darka-sidebar-module__progress`, nunca uma cor
   nova; `order:2` + `flex-basis:100%` força a quebra para a linha
   seguinte, deixando o título e o marcador +/- na primeira linha. */
.darka-curriculum-module__count {
	order: 2;
	flex-basis: 100%;
	font-size: var(--darka-text-xs);
	opacity: 0.65;
}

.darka-curriculum-lessons {
	list-style: none;
	margin: 0;
	padding: 0;
	font-size: var(--darka-text-xs);
}

.darka-curriculum-lessons li {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 0;
	border-top: 1px solid var(--darka-border);
}

.darka-curriculum-lessons li:first-child {
	border-top: none;
}

.darka-curriculum-lessons a {
	display: flex;
	align-items: center;
	gap: 10px;
	color: var(--darka-text);
	text-decoration: none;
	width: 100%;
}

.darka-curriculum-lessons a:hover {
	color: var(--darka-primary);
}

.darka-curriculum-lessons li.is-locked {
	opacity: 0.6;
}

.darka-lesson-icon {
	font-size: 13px;
	flex-shrink: 0;
}

.darka-lesson-row__text {
	display: flex;
	flex-direction: column;
	gap: 2px;
	flex: 1;
	min-width: 0;
	text-align: left;
}

.darka-lesson-row__text small {
	opacity: 0.6;
	font-size: var(--darka-text-xs);
}

.darka-course-sidebar-sticky {
	position: sticky;
	top: 20px;
}

.darka-course-sidebar-card {
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 24px;
	text-align: center;
}

.darka-course-sidebar-card .darka-price {
	display: block;
	font-size: var(--darka-text-lg);
	margin-bottom: 8px;
}

.darka-course-sidebar-card .darka-btn-primary,
.darka-course-sidebar-card .darka-btn-secondary {
	width: 100%;
	margin: 12px 0;
}

.darka-feature-list {
	list-style: none;
	margin: 16px 0 0;
	padding: 0;
	text-align: left;
	font-size: var(--darka-text-xs);
	display: flex;
	flex-direction: column;
	gap: 8px;
}

.darka-instructor-card {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-top: 20px;
	padding-top: 20px;
	border-top: 1px solid var(--darka-border);
	font-size: var(--darka-text-xs);
	text-align: left;
}

.darka-instructor-card img {
	width: 40px;
	height: 40px;
	border-radius: 50%;
	object-fit: cover;
	flex-shrink: 0;
}

.darka-instructor-card div {
	display: flex;
	flex-direction: column;
}

.darka-locked-notice {
	padding: 12px;
	border-radius: 8px;
	background: rgba(239, 68, 68, 0.1);
	color: #fca5a5;
	font-size: var(--darka-text-xs);
	margin: 12px 0;
}

/* ---------- Página de aula / player ---------- */

/* REMOVIDO: `.darka-lesson-topbar`/`.darka-lesson-back`/
   `.darka-lesson-breadcrumb*` (cabeçalho próprio da aula: botão
   "Voltar" + breadcrumb) — substituído pelo Header oficial da
   Dashboard (`Components::topbar()`, ver `LessonPage::render()`),
   pedido explícito; regras órfãs eliminadas. */

/* AJUSTADO: arquitetura "app shell fixa, só o centro rola" (pedido
   explícito) — Header e as duas Sidebars (principal e da Playlist)
   ficam sempre visíveis; só `.darka-lesson-main` tem rolagem própria.
   Só a partir de 901px: abaixo disso, o layout já reverte para uma
   única coluna empilhada (ver media query mais abaixo), onde a página
   inteira rola normalmente — mais adequado a ecrãs pequenos do que
   forçar painéis com scroll interno próprio. `body.darka-lesson-page`
   fecha isto só a esta página: `.darka-app-shell`/`.darka-sidebar` são
   classes partilhadas com o Dashboard/Perfil, que continuam com o
   comportamento de sempre (página inteira a rolar), inalterados. */
@media (min-width: 901px) {
	body.darka-lesson-page {
		height: 100vh;
		overflow: hidden;
	}

	body.darka-lesson-page .darka-app-shell {
		height: 100vh;
	}

	body.darka-lesson-page .darka-sidebar {
		overflow-y: auto;
	}

	body.darka-lesson-page .darka-app-content {
		height: 100vh;
		overflow: hidden;
	}

	body.darka-lesson-page .darka-app-topbar {
		flex-shrink: 0;
	}

	body.darka-lesson-page .darka-lesson-layout {
		flex: 1;
		min-height: 0;
	}

	body.darka-lesson-page .darka-lesson-main {
		height: 100%;
		overflow-y: auto;
	}

	/* AJUSTADO (auditoria "Sidebar da Aula — Padding e Scroll"): deixou
	   de ter `overflow-y: auto` própria — antes a Sidebar inteira
	   rolava como um único bloco (título, progresso, pesquisa e a
	   playlist juntos). Passa a ser só `height: 100%` (mantido, para o
	   layout de altura fixa da página de aula continuar igual); o
	   scroll passa a viver exclusivamente em `.darka-sidebar-modules`,
	   ver a regra base de `.darka-lesson-sidebar` mais abaixo. */
	body.darka-lesson-page .darka-lesson-sidebar {
		height: 100%;
	}

	/* NOVO: a área central continua rolável — só a barra de rolagem
	   deixa de ser desenhada, e por isso também deixa de ocupar espaço
	   na largura da página (Firefox: `scrollbar-width: none`; Chrome/
	   Safari/Edge: `::-webkit-scrollbar { display: none }`, logo
	   abaixo). */
	body.darka-lesson-page .darka-lesson-main {
		scrollbar-width: none;
	}
}

body.darka-lesson-page .darka-lesson-main::-webkit-scrollbar {
	display: none;
}

/* AJUSTADO: a barra de progresso mudou-se para dentro da Sidebar
   (`.darka-sidebar-progress`, logo abaixo do título do curso) — já não
   existe nenhuma faixa a toda a largura no topo da página, por isso a
   antiga `.darka-lesson-progress-row` foi removida (deixou de haver
   elemento nenhum a usá-la). `.darka-lesson-progress-label` continua a
   ser usada, agora dentro da Sidebar. */
.darka-lesson-progress-label {
	display: flex;
	justify-content: space-between;
	font-size: var(--darka-text-xs);
	margin-bottom: 6px;
	opacity: 0.75;
}

/* NOVO: contentor compacto da barra de progresso dentro da Sidebar,
   logo abaixo do título do curso e antes da playlist. */
.darka-sidebar-progress {
	margin-bottom: 16px;
}

/* REMOVIDO: `.darka-lesson-meta` (duração abaixo do título, pedido
   explícito de remoção) — a única chamada que a usava, em
   `LessonPage::main_area()`, foi removida; regra órfã eliminada.
   `Components::format_duration()` continua a existir e a ser usado nos
   outros locais de sempre (cartão de curso, etc.), inalterado. */

/* REMOVIDO: `.darka-lesson-title-row` (título da aula acima do Player +
   botão de alternar a Sidebar da Playlist) — título removido a pedido
   explícito; o botão mudou-se para o topo interno da própria Sidebar da
   Playlist (ver `.darka-sidebar-toggle-row`, mais abaixo). Regras órfãs
   eliminadas. */

/* AJUSTADO: `1fr` sozinho tem um mínimo automático baseado no conteúdo
   (`min-width: auto`), não `0` — nalguns casos isso impede a coluna de
   ocupar toda a largura que devia, encolhendo `.darka-lesson-main` (e a
   percentagem do Player calculada sobre ela) para menos do que o
   esperado. `minmax(0, 1fr)` é a correção padrão: liberta a coluna para
   crescer até à largura total disponível, garantindo que a percentagem
   escolhida no admin é calculada sobre o espaço real ao lado da
   Sidebar. */
/* AJUSTADO (auditoria "Sidebar da Aula — Estrutura Visual"): largura
   aumentada de 320px para 360px (pedido explícito — "aumente um pouco",
   mais espaço para título dos módulos/aulas, duração e ícones), só em
   Desktop (`minmax(0, 1fr)` na outra coluna continua a garantir que o
   Player nunca fica espremido). Tablet/Mobile inalterados — continuam
   a usar a largura própria do painel sobreposto (`min(340px, 88vw)`,
   ver a media query ≤900px mais abaixo). */
.darka-lesson-layout {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 360px;
	min-height: calc(100vh - 130px);
}

/* AJUSTADO: estado "Sidebar da aula oculta" — o botão que a alterna
   mudou-se para o topo interno da própria Sidebar (`data-darka-lesson-sidebar-toggle`,
   ver `sidebar()` em LessonPage.php e `initLessonSidebarToggle()` em
   student.js). Por isso, ao ocultar, a Sidebar já NÃO desaparece por
   completo (`display: none` deixaria o botão que a reabre também
   escondido, sem forma de a mostrar de novo) — encolhe para uma faixa
   estreita (56px) com só a linha do botão visível; o resto do conteúdo
   fica `display: none`. */
.darka-lesson-layout.darka-lesson-sidebar-hidden {
	grid-template-columns: minmax(0, 1fr) 56px;
}

.darka-lesson-layout.darka-lesson-sidebar-hidden .darka-lesson-sidebar {
	padding: 20px 8px;
	overflow: hidden;
}

.darka-lesson-layout.darka-lesson-sidebar-hidden .darka-lesson-sidebar > *:not(.darka-sidebar-toggle-row) {
	display: none;
}

/* NOVO: configuração de admin "Posição da Sidebar da Playlist"
   (`general.lesson_sidebar_position`) — 'left' aplica esta classe (ver
   `LessonPage::render()`). Usa `order` (CSS Grid também respeita
   `order` no posicionamento automático dos itens) para trocar
   visualmente Player e Sidebar da aula SEM mudar a ordem no DOM — a
   Sidebar PRINCIPAL da app shell (`.darka-sidebar`) fica de fora desta
   troca, é um grid diferente (`.darka-app-shell`), não afetado. */
.darka-lesson-layout.darka-playlist-left {
	grid-template-columns: 360px minmax(0, 1fr);
}

.darka-lesson-layout.darka-playlist-left .darka-lesson-sidebar {
	order: 1;
	border-left: none;
	border-right: 1px solid var(--darka-border);
}

.darka-lesson-layout.darka-playlist-left .darka-lesson-main {
	order: 2;
}

/* NOVO: combinação "Playlist à esquerda" + "Sidebar oculta" — precisa
   de uma regra própria (3 classes, mais específica do que as duas
   regras de 2 classes acima) para a faixa estreita (56px) aparecer do
   lado esquerdo em vez do direito. */
.darka-lesson-layout.darka-playlist-left.darka-lesson-sidebar-hidden {
	grid-template-columns: 56px minmax(0, 1fr);
}

/* AJUSTADO: `max-width` sozinho não centra um bloco — sem `margin: 0
   auto`, `.darka-lesson-main` ficava encostado à esquerda da coluna do
   grid (`.darka-lesson-layout`), com um vão vazio à direita em ecrãs
   largos, antes da Sidebar. Agora toda a área principal (player,
   título, descrição, ações, navegação, quiz, comentários — tudo o que
   já vive dentro de `main_area()`) fica centralizada como um bloco só,
   com a mesma largura máxima profissional de sempre. Continua
   responsivo sem precisar de media query própria: abaixo de 900px
   (largura do container), o `max-width` deixa de ter efeito e ocupa a
   coluna toda. A Sidebar, à parte, não foi tocada. */
/* CORRIGIDO: a percentagem configurável no admin ("Largura do Player")
   estava a ser aplicada só ao `.darka-lesson-player` (o vídeo em si), que
   fica dentro desta caixa — mas esta caixa tinha um `max-width` fixo
   (1100px), alheio à definição do admin. Resultado visível: mudar a
   percentagem no painel não tinha nenhum efeito prático, porque a caixa
   que envolve o Player + abas (Descrição/Material) + navegação +
   comentários continuava sempre do mesmo tamanho. Agora é esta caixa
   (`.darka-lesson-main`) que recebe a percentagem, via `style` inline
   gerado em `LessonPage::main_area()` a partir de
   `general.lesson_player_width` (60/70/80/90/100%, por omissão 80%),
   calculada sobre a largura da coluna de conteúdo do grid
   (`.darka-lesson-layout`), ao lado da Sidebar — exatamente a "área
   principal de conteúdo" pedida. O `max-width: 1400px` aqui é só um
   valor de resguardo generoso para o caso (não esperado) de o atributo
   `style` não chegar a ser aplicado. */
/* CORRIGIDO (causa raiz confirmada por medição real em DevTools — largura
   do container do Player a colapsar ao trocar de aba/aula, em ecrãs
   ≥901px): `.darka-lesson-main` nunca tinha um `width` explícito, só
   `max-width` — a largura real ficava dependente do navegador resolver
   "auto" através do algoritmo de stretch do grid. Este elemento é
   também um contentor de scroll (`overflow-y:auto`, `height:100%` de um
   ancestral com altura fixa — ver a arquitetura "só o centro rola" mais
   abaixo) e contém, dois níveis adentro, um vídeo com `aspect-ratio:16/9`.
   Essa combinação (bloco de largura "auto", contentor de scroll com
   altura limitada, descendente com aspect-ratio) é resolvida de forma
   ambígua por alguns motores de layout: em vez de esticar sempre até
   `max-width`, o motor tentava encontrar uma largura que "encaixasse"
   numa altura implícita — e essa altura implícita muda consoante o
   conteúdo da aba visível (Descrição mais alto, Material mais baixo),
   explicando por que só a troca de aba/aula disparava o colapso, e só
   em ecrãs onde a regra de scroll interno está ativa (confirmado: não
   ocorria em mobile, onde essa regra não existe). Dar-lhe um `width`
   explícito remove essa ambiguidade — a largura deixa de depender do
   cálculo "auto" e passa a ser sempre 100% da coluna do grid,
   independentemente da altura do conteúdo. */
/* AJUSTADO (correções finais 1.0 — Ponto 4, "área abaixo dos
   comentários muito apertada"): `.darka-lesson-comments` (a secção de
   comentários) é o último elemento desta coluna — o padding inferior
   de apenas 32px era literalmente todo o espaço de respiro depois do
   último comentário/formulário de resposta, tornando desconfortável
   ler, responder e rolar até ao fim. Não altera o Player, a Sidebar
   nem as abas — só o espaço no final da coluna rolável. */
.darka-lesson-main {
	width: 100%;
	padding: 24px 32px 120px;
	max-width: 1400px;
	margin: 0 auto;
}

/* AJUSTADO: o Player deixou de ter a sua própria percentagem — ocupa
   sempre 100% da caixa `.darka-lesson-main`, que é quem agora responde à
   definição do admin (ver acima). Continua com a mesma aparência de
   sempre (fundo preto, cantos arredondados, proporção 16:9 via
   `aspect-ratio` abaixo). Player Universal (providers, Bunny.net, etc.)
   não foi tocado — só este dimensionamento. */
.darka-lesson-player {
	background: #000;
	border-radius: 12px;
	overflow: hidden;
	width: 100%;
	margin: 0 0 20px;
}

/* AJUSTADO (Revisão Geral e Otimização Responsiva — Secção 15/16:
   "padronizar breakpoints, não multiplicar exceções pontuais"): esta
   regra vivia isolada aqui, a 640px — dobrada para dentro do bloco
   principal de mobile/tablet (900px, mais abaixo no ficheiro), o mesmo
   breakpoint usado por toda a "app shell". A caixa inteira (Player +
   abas + comentários) usa sempre a largura disponível em qualquer
   ecrã ≤900px, independentemente da percentagem configurada para
   desktop — nunca fica artificialmente pequena num tablet ou
   telemóvel. `!important` é necessário porque a largura de desktop
   vem de um `style` inline (maior prioridade de cascata do que
   qualquer regra de folha de estilo comum), a única exceção
   deliberada a esta prática no projeto. */

.darka-lesson-player img,
.darka-lesson-player video,
.darka-lesson-player iframe,
.darka-video-embed iframe {
	width: 100%;
	aspect-ratio: 16 / 9;
	border: none;
	display: block;
	background: #000;
}

/* NOVO (Player Universal): mensagem clara quando um vídeo não consegue
   carregar (ver video-player.js) — nunca um espaço vazio silencioso. */
.darka-video-error {
	margin: 0;
	padding: 14px 16px;
	background: rgba(239, 68, 68, 0.12);
	color: #fca5a5;
	font-size: var(--darka-text-xs);
	text-align: center;
}

.darka-pdf-frame {
	width: 100%;
	height: 70vh;
	border: none;
}

.darka-lesson-description {
	line-height: 1.7;
	margin-bottom: 24px;
}

/* NOVO (pedido "Melhoria da Área de Descrição da Aula no Front-end"):
   conteúdo rico (agora vindo de um editor WYSIWYG no admin, ver
   `Components::sanitize_rich_content()`) — imagens/vídeos/áudios/
   `<iframe>` nunca ultrapassam a largura disponível, em nenhum ecrã;
   títulos, listas e citações ganham um espaçamento próprio (antes só
   herdavam o estilo desformatado do navegador, sem nenhuma regra
   própria). Não altera o design geral da página — só o interior desta
   área de conteúdo. */
.darka-lesson-description img,
.darka-lesson-description video {
	max-width: 100%;
	height: auto;
	border-radius: 8px;
	display: block;
	margin: 12px 0;
}

.darka-lesson-description audio {
	width: 100%;
	margin: 12px 0;
}

.darka-lesson-description iframe {
	max-width: 100%;
	border: none;
	border-radius: 8px;
	margin: 12px 0;
}

.darka-lesson-description h1,
.darka-lesson-description h2,
.darka-lesson-description h3,
.darka-lesson-description h4,
.darka-lesson-description h5,
.darka-lesson-description h6 {
	margin: 24px 0 12px;
	line-height: 1.3;
}

.darka-lesson-description p:first-child,
.darka-lesson-description h1:first-child,
.darka-lesson-description h2:first-child,
.darka-lesson-description h3:first-child {
	margin-top: 0;
}

.darka-lesson-description ul,
.darka-lesson-description ol {
	margin: 0 0 16px;
	padding-left: 24px;
}

.darka-lesson-description blockquote {
	margin: 16px 0;
	padding: 8px 18px;
	border-left: 3px solid var(--darka-primary);
	opacity: 0.85;
}

.darka-lesson-description a {
	color: var(--darka-links);
	text-decoration: underline;
	word-break: break-word;
}

@media (max-width: 600px) {
	.darka-lesson-description iframe {
		width: 100%;
	}
}

/* NOVO (pedido "Botões de Acesso Rápido — Material e Quiz"): "Ver
   Material"/"Ver Quiz", logo abaixo da descrição da aula. */
.darka-lesson-description-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-top: 12px;
}

/* NOVO: abas "Descrição"/"Material" (Secção 8 do pedido) — troca de
   painel feita por `student.js` (`initLessonTabs()`) trocando só o
   atributo `hidden`; nenhuma regra abaixo define `display` de forma
   incondicional em `.darka-lesson-tabs__panel`, evitando o mesmo bug de
   especificidade CSS já corrigido no painel do chat (`[hidden]` perder
   para uma regra de classe comum). */
.darka-lesson-tabs {
	margin-bottom: 24px;
}

.darka-lesson-tabs__nav {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	border-bottom: 1px solid var(--darka-border);
	margin-bottom: 16px;
}

.darka-lesson-tabs__nav button {
	background: none;
	border: none;
	padding: 10px 16px;
	font-size: var(--darka-text-sm);
	font-weight: 600;
	color: var(--darka-text);
	opacity: 0.6;
	cursor: pointer;
	border-radius: 8px 8px 0 0;
	border-bottom: 2px solid transparent;
	margin-bottom: -1px;
	transition: opacity 0.15s ease, background 0.15s ease;
}

.darka-lesson-tabs__nav button:hover {
	opacity: 0.85;
	background: var(--darka-surface);
}

.darka-lesson-tabs__nav button.is-active {
	opacity: 1;
	background: var(--darka-surface);
	border-bottom-color: var(--darka-primary);
}

.darka-lesson-tabs__panel {
	line-height: 1.7;
}

/* NOVO: Barra de Ações — Avaliação/Reações à esquerda
   (`.darka-lesson-engagement`), navegação/conclusão à direita
   (`.darka-lesson-controls`, inalterado por dentro). `flex-wrap` +
   `justify-content: space-between` mantêm os dois grupos alinhados em
   ecrãs largos e empilhados de forma legível em ecrãs estreitos. */
.darka-lesson-actionbar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 16px;
	margin-top: 24px;
}

/* AJUSTADO: "Marcar como Concluída"/"Marcar como Incompleta" (rótulos
   longos, botão largo numa linha própria) trocado por "Completa"/
   "Incompleta" (Secção 5) na mesma linha das setas Anterior/Seguinte
   (Secção 6) — `.darka-lesson-actions`/`.darka-lesson-nav` (linhas
   separadas) substituídos por `.darka-lesson-controls`, um único
   contentor em linha. Mesma lógica de conclusão de sempre
   (`data-darka-mark-complete` em `student.js`), só a apresentação
   mudou. `margin-top` removido daqui — o espaçamento acima passou a
   ser responsabilidade de `.darka-lesson-actionbar`, que agora a
   envolve. */
.darka-lesson-controls {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 16px;
	flex-wrap: wrap;
}

/* AJUSTADO (pedido "Anterior à esquerda, Completa ao centro, Seguinte à
   direita, em Mobile/Tablet"): `justify-content: space-between` só tem
   espaço para distribuir os 3 elementos (seta Anterior, botão
   Completa/Incompleta, seta Seguinte) se `.darka-lesson-controls` ocupar
   mesmo toda a largura disponível dentro de `.darka-lesson-actionbar`
   — sem o `width: 100%` abaixo, este contentor ficava só tão largo
   quanto o conteúdo (os 3 elementos encostados uns aos outros), por ser
   um item flex dentro de `.darka-lesson-actionbar` (que só o encolhe ao
   conteúdo por omissão) — por isso `space-between` nunca tinha
   realmente espaço nenhum para distribuir, e os 3 elementos ficavam
   sempre agrupados à esquerda, mesmo já com esta regra. Com a largura
   total garantida, a seta Anterior fica encostada à margem esquerda, a
   seta Seguinte à margem direita, e o botão Completa/Incompleta fica
   centrado entre as duas (larguras iguais, 40px, de ambas as setas).
   `flex-wrap` mantido como resguarda para ecrãs muito estreitos, sem
   nunca sobrepor ou cortar botões. Nenhuma alteração de
   funcionalidade — mesmos `data-*`/`student.js` de sempre. */
@media (max-width: 900px) {
	.darka-lesson-controls {
		width: 100%;
		justify-content: space-between;
		/* NOVO (pedido "afastar a box dos botões das abas, em Mobile/
		   Tablet"): esta box passa a ocupar a sua própria linha nestes
		   ecrãs (ver `width: 100%`, acima) — sem espaço próprio abaixo
		   dela, ficava colada à borda superior das abas
		   Descrição/Material/Quiz (`.darka-lesson-tabs`, imediatamente a
		   seguir no HTML). Só o espaçamento muda; nenhuma outra
		   alteração de aspeto/funcionalidade. */
		margin-bottom: 20px;
	}
}

.darka-lesson-complete-btn {
	width: auto;
	padding: 8px 20px;
	font-size: var(--darka-text-xs);
}

.darka-lesson-complete-btn.is-completed {
	background: var(--darka-secondary);
}

/* NOVO: setas ←/→ (Secção 6) em vez de links de texto "Anterior"/
   "Próxima Aula" — mesmo destino/rota de sempre (`Router::lesson_url()`),
   só a apresentação mudou. `title`/`aria-label` (definidos em
   `LessonPage::lesson_controls()`) dão o tooltip e o rótulo acessível
   pedidos ("Aula anterior"/"Próxima aula"). */
.darka-lesson-nav-arrow {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border-radius: 999px;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	color: var(--darka-text);
	text-decoration: none;
	flex-shrink: 0;
}

.darka-lesson-nav-arrow:hover {
	background: var(--darka-primary);
	color: #fff;
	border-color: var(--darka-primary);
}

.darka-lesson-nav-arrow--disabled {
	visibility: hidden;
}

/* NOVO (auditoria "Acesso Sequencial às Aulas — Quiz Obrigatório"): seta
   "Seguinte" ainda bloqueada (`data-darka-next-locked="true"`) — visível
   (ao contrário de `--disabled`, acima, reservado ao fim do curso), mas
   com aspeto claramente inativo, para o aluno perceber que precisa de
   concluir a aula/quiz atual antes de avançar. `initNextLessonLock()`
   (student.js) alterna esta classe sem reload assim que isso acontece. */
.darka-lesson-nav-arrow--locked {
	opacity: 0.45;
	cursor: not-allowed;
}

.darka-lesson-nav-arrow--locked:hover {
	background: var(--darka-surface);
	color: var(--darka-text);
	border-color: var(--darka-border);
}

/* NOVO: aviso mostrado depois de um reencaminhamento por bloqueio de
   sequência (`?darka_locked=1`, ver `LessonPage::main_area()`) — reutiliza
   `.darka-locked-notice` (já existente, ver acima), só acrescenta o
   ícone/espaçamento em falta para este caso concreto. */
.darka-lesson-locked-notice {
	display: flex;
	align-items: center;
	gap: 8px;
}

/* AJUSTADO: Avaliação por Estrelas (lado esquerdo da Barra de Ações) —
   Reações por emoji removidas (pedido explícito; CSS órfão eliminado).
   Estado (média/escolha do próprio aluno) é carregado e mantido por
   `lesson-extras.js` — aqui só a apresentação.

   CORRIGIDO: esta secção usava `.darka-star-rating`/`.darka-star`, os
   MESMOS nomes já usados pelo formulário de Avaliação de Cursos
   (`.darka-auth-card form .darka-star-rating`, mais abaixo neste
   ficheiro), que define `flex-direction: row-reverse` para o seu
   próprio truque de CSS puro (`:checked ~ label`). Por vir depois na
   cascata, essa regra `row-reverse` também se aplicava aqui, invertendo
   visualmente o preenchimento das 5 estrelas — apesar de a lógica em
   `lesson-extras.js` (`starValue <= value`) sempre ter preenchido da
   esquerda para a direita corretamente. Renomeado para
   `.darka-lesson-star-rating`/`.darka-lesson-star`, exclusivos desta
   Avaliação de aula — o formulário de Avaliação de Cursos não foi
   tocado. */
.darka-lesson-engagement {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 20px;
}

.darka-lesson-rating {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 4px 8px;
}

.darka-lesson-star-rating {
	display: flex;
	gap: 2px;
}

/* AJUSTADO (pedido "Classificação, Tipografia e Hero Responsiva" —
   Secção 1.3): alvo de toque anterior tinha só ~24px (font-size 20px +
   2px de padding) — abaixo do mínimo recomendado (~44px) para toque
   fiável em ecrãs pequenos, com risco real de tocar na estrela vizinha
   por um deslize de poucos pixels (o valor enviado continua a ser
   sempre o da estrela efetivamente tocada — nunca calculado pela
   posição do rato/dedo — mas alvos maiores e mais espaçados eliminam o
   risco de mistoque). `min-width`/`min-height` garantem o mesmo alvo
   em qualquer tamanho de ecrã, sem depender de wrapping/zoom.
   `touch-action: manipulation` evita o atraso de ~300ms do duplo-toque
   em navegadores móveis, que podia dar a sensação de resposta
   "atrasada ou trocada". */
.darka-lesson-star {
	background: none;
	border: none;
	padding: 2px;
	min-width: 44px;
	min-height: 44px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	font-size: 22px;
	line-height: 1;
	color: var(--darka-border);
	cursor: pointer;
	touch-action: manipulation;
}

.darka-lesson-star.is-filled {
	color: #f59e0b;
}

/* NOVO: nota individual do próprio aluno — sempre um elemento distinto
   da média (`.darka-lesson-rating__meta`, abaixo), nunca o mesmo texto
   a alternar de significado (Secção 1.2 do pedido). */
.darka-lesson-rating__mine {
	font-size: var(--darka-text-xs);
	font-weight: 600;
	white-space: nowrap;
}

.darka-lesson-rating__meta {
	font-size: var(--darka-text-xs);
	opacity: 0.7;
	white-space: nowrap;
}

/* CORRIGIDO (auditoria "Sidebar da Aula — Padding e Scroll"): passa a
   coluna flex — título/progresso/pesquisa mantêm a sua altura natural
   e nunca rolam; só `.darka-sidebar-modules` (o último filho, `flex: 1`)
   ganha scroll próprio, ver abaixo. Padding lateral reduzido (20px →
   14px, pedido explícito "aproveitar melhor o espaço interno"); o
   padding inferior deixou de viver aqui — passa a ser só de
   `.darka-sidebar-modules`, para a playlist ganhar respiro mesmo com
   poucas aulas. LARGURA NÃO ALTERADA (continua 320px, definida em
   `.darka-lesson-layout`, ver auditoria em separado). */
.darka-lesson-sidebar {
	display: flex;
	flex-direction: column;
	border-left: 1px solid var(--darka-border);
	background: var(--darka-surface);
	padding: 20px 14px 0;
	overflow: hidden;
}

/* NOVO: botão de mostrar/ocultar esta Sidebar, agora no seu próprio
   topo interno (antes ficava acima do Player). Continua visível mesmo
   no estado "oculto" (ver `.darka-lesson-layout.darka-lesson-sidebar-hidden`
   acima) — é o único elemento que não é escondido nesse estado, para
   sempre haver forma de reabrir a Sidebar. */
.darka-sidebar-toggle-row {
	display: flex;
	justify-content: flex-end;
	margin-bottom: 12px;
}

.darka-lesson-layout.darka-lesson-sidebar-hidden .darka-sidebar-toggle-row {
	justify-content: center;
}

/* NOVO (pedido "Revisão Geral e Otimização Responsiva" — Secção 7):
   botão "Módulos e Aulas" (abre a Sidebar da aula em mobile/tablet) e
   botão de fechar (dentro da própria Sidebar) — escondidos por
   omissão; só ganham `display` dentro da media query mobile (abaixo),
   para nunca aparecerem nem ocuparem espaço em desktop. */
.darka-lesson-sidebar-open-btn,
.darka-lesson-sidebar-close {
	display: none;
}

.darka-lesson-sidebar-backdrop {
	display: none;
}

/* AJUSTADO: de centrado para alinhado à esquerda (Secção 4 do pedido) —
   permite que títulos de curso longos quebrem linha de forma mais
   natural/profissional em vez de ficarem centrados em várias linhas. */
.darka-sidebar-course-header {
	text-align: left;
	margin-bottom: 16px;
}

.darka-sidebar-course-header img {
	width: 100%;
	border-radius: 8px;
	margin-bottom: 10px;
}

/* AJUSTADO: tamanho de letra configurável no admin
   (`general.lesson_sidebar_course_title_size`), aplicado via variável
   CSS definida em `style` inline no `<aside class="darka-lesson-sidebar">`
   (`LessonPage::sidebar()`) — 15px é só o valor de resguardo, igual ao
   que já estava fixo aqui antes desta opção existir. */
.darka-sidebar-course-header h2 {
	font-size: var(--darka-sidebar-course-title-size, 15px);
	margin: 0;
	overflow-wrap: break-word;
}

.darka-sidebar-search input {
	width: 100%;
	padding: 8px 12px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: transparent;
	color: var(--darka-text);
	margin-bottom: 16px;
	font-family: inherit;
}

/* AJUSTADO (auditoria "Sidebar da Aula — Estrutura Visual"): deixou de
   ter `border-top` a demarcar a playlist como uma única caixa geral
   (pedido explícito — "remover a delimitação geral, a organização
   visual passa a ser feita individualmente por cada módulo", ver
   `.darka-sidebar-module` abaixo). Continua o único container com
   scroll da Sidebar — título/progresso/pesquisa ficam sempre visíveis
   e fixos, porque vivem fora deste `<div>`, como irmãos anteriores num
   pai `display:flex; flex-direction:column` (`.darka-lesson-sidebar`).
   Passa a ser também `display:flex; flex-direction:column` com `gap`,
   para criar o espaço vertical pedido entre um módulo e outro, sem
   precisar de margens individuais. `padding-bottom` generoso dá
   respiro depois do último módulo, mesmo quando a lista é curta e não
   chega a precisar de scroll. Scrollbar fina e discreta (Firefox:
   `scrollbar-width`; Chrome/Safari/Edge: `::-webkit-scrollbar` logo
   abaixo) — mesma cor já usada em todas as divisórias subtis da
   plataforma (`var(--darka-border)`), por isso respeita Light/Dark
   Mode automaticamente. */
.darka-sidebar-modules {
	display: flex;
	flex-direction: column;
	gap: 14px;
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	margin-top: 4px;
	/* AJUSTADO (auditoria "Sidebar da Aula — Espaçamento Inferior"):
	   32px → 72px (pedido explícito, faixa de 50-100px) — respiro mais
	   generoso depois do último módulo, sempre dentro deste container
	   (o único com scroll da Sidebar, inalterado). */
	padding: 4px 0 72px;
	scrollbar-width: thin;
	scrollbar-color: var(--darka-border) transparent;
}

.darka-sidebar-modules::-webkit-scrollbar {
	width: 6px;
}

.darka-sidebar-modules::-webkit-scrollbar-track {
	background: transparent;
}

.darka-sidebar-modules::-webkit-scrollbar-thumb {
	background-color: var(--darka-border);
	border-radius: 3px;
}

/* CORRIGIDO (auditoria "Sidebar da Aula — Estrutura Visual"): cada
   módulo passa a ser o seu próprio container visual — borda sólida
   nos 4 lados (pedido explícito — "não tracejada"), cantos discretos.
   Cor de tema (`var(--darka-border)`), nunca um hexadecimal fixo, para
   funcionar em Light e Dark Mode com contraste suficiente sem ficar
   pesada. O espaçamento ENTRE módulos vive no pai (`.darka-sidebar-modules`,
   `gap: 14px`, acima) — não uma margem própria aqui, para nunca
   duplicar o espaço. */
.darka-sidebar-module {
	border: 1px solid var(--darka-border);
	border-radius: 8px;
	padding: 4px 10px 10px;
}

/* AJUSTADO: tamanho de letra configurável no admin
   (`general.lesson_sidebar_module_title_size`), mesma técnica da
   anterior — 13px é só o valor de resguardo.
   AJUSTADO (auditoria "Página da Aula — Indicador Visual de
   Módulo"): volta a `display:flex` (título + seta na mesma linha),
   mas agora com `flex-wrap:wrap` - o indicador de progresso
   (`.darka-sidebar-module__progress`, abaixo) continua em bloco
   próprio, numa segunda linha, via `order:2; flex-basis:100%` (mesma
   técnica já usada em `.darka-curriculum-module__count`,
   `CoursePage.php`) - nunca lado a lado com o título. */
.darka-sidebar-module summary {
	cursor: pointer;
	list-style: none;
	font-size: var(--darka-sidebar-module-title-size, 13px);
	font-weight: 600;
	padding: 6px 0;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 2px 8px;
}

.darka-sidebar-module summary::-webkit-details-marker {
	display: none;
}

.darka-sidebar-module summary.is-active {
	color: var(--darka-primary);
}

.darka-sidebar-module__title {
	flex: 1 1 auto;
	min-width: 0;
}

/* CORRIGIDO (auditoria "Ícone de Expandir/Retrair — Correção
   Definitiva"): a versão anterior desenhava a seta com um caráter
   Unicode (`›`) num `summary::after` — um pseudo-elemento de texto,
   sem o peso visual de um ícone real; mesmo a 16px, ficava fina e
   pouco percetível (opacidade reduzida a mais). Corrigido com um
   elemento REAL (`<span class="dashicons dashicons-arrow-right-
   alt2">`, gerado em `LessonPage::sidebar()`) - o mesmo ícone (e o
   mesmo sistema Dashicons, já carregado em todas as páginas via
   `Layout::render()`) já usado nesta MESMA página para as setas
   Anterior/Seguinte da aula - nunca uma biblioteca nova. Tamanho
   quase o dobro do anterior, cor com opacidade alta (sempre com
   contraste suficiente em Dark/Light, herdada do tema) e uma área
   circular própria - claramente visível, sem parecer um detalhe
   perdido no cabeçalho. */
.darka-sidebar-module__chevron {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 28px;
	height: 28px;
	flex-shrink: 0;
	font-size: 20px;
	color: var(--darka-text);
	opacity: 0.85;
	border-radius: 50%;
	transition: transform 0.2s ease, background-color 0.2s ease;
}

.darka-sidebar-module summary:hover .darka-sidebar-module__chevron {
	background: var(--darka-border);
	opacity: 1;
}

.darka-sidebar-module[open] .darka-sidebar-module__chevron {
	transform: rotate(90deg);
}

/* NOVO (pedido "Percentagem de Acertos dos Quizzes na Sidebar da
   Aula"): "ao lado do ícone/botão exibir/ocultar módulos/aulas" -
   fica na mesma linha do título/seta (título flex:1, seta e este
   ambos com tamanho próprio - ver `.darka-sidebar-module__chevron`,
   acima), sempre antes da seta. Mesma técnica discreta (cor herdada +
   opacidade reduzida) do resto da Sidebar - contraste garantido em
   Dark e Light Mode sem cor nova. */
.darka-sidebar-module__quiz-score {
	flex-shrink: 0;
	white-space: nowrap;
	font-size: var(--darka-text-xs);
	font-weight: 400;
	opacity: 0.65;
}

/* AJUSTADO (auditoria "Página da Aula — Posição do Status do
   Módulo"): passou de estar na mesma linha do título (`display:flex;
   justify-content:space-between`) para bloco próprio, numa nova
   linha, com um pequeno espaçamento vertical - pedido explícito para
   não competir lado a lado com o título. Mesma técnica discreta já
   usada em `.darka-field-help` (cor herdada + opacidade reduzida,
   nunca uma cor nova) - garante contraste suficiente tanto no Dark
   quanto no Light Mode. `order:2; flex-basis:100%` força a quebra
   para a linha seguinte (título + seta ficam na primeira linha);
   independente de Desktop/Tablet/Mobile - nenhum breakpoint próprio
   necessário. */
.darka-sidebar-module__progress {
	order: 2;
	flex-basis: 100%;
	margin-top: 2px;
	font-size: var(--darka-text-xs);
	font-weight: 400;
	opacity: 0.65;
}

/* AJUSTADO: deixou de ter recuo à esquerda (`padding-left`) e espaço
   entre aulas (`gap`) — agora que cada módulo já é o seu próprio
   container (acima), as aulas formam antes uma lista contínua dentro
   dele, delimitadas individualmente por `border-bottom`
   (`.darka-sidebar-lesson`, abaixo) — o mesmo efeito visual de "cada
   aula é uma linha própria", sem duplicar espaçamento. */
.darka-sidebar-lessons {
	display: flex;
	flex-direction: column;
	margin-top: 4px;
}

/* AJUSTADO: tamanho de letra configurável no admin
   (`general.lesson_sidebar_lesson_title_size`), mesma técnica das
   anteriores — 13px é só o valor de resguardo. */
.darka-sidebar-lesson {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px;
	border-radius: 6px;
	text-decoration: none;
	color: var(--darka-text);
	font-size: var(--darka-sidebar-lesson-title-size, 13px);
	/* AJUSTADO (auditoria "Sidebar da Aula — Estrutura Visual"): de
	   tracejado para sólido (pedido explícito — "não utilizar linhas
	   tracejadas") — cada aula fica claramente delimitada como uma
	   linha própria dentro do container do módulo, sem ficar pesada
	   (só 1px, cor de tema). Removida na última aula de cada módulo
	   (ver `:last-child` abaixo) — nunca uma linha a fechar o grupo sem
	   nada a seguir, já que o próprio módulo já tem a sua borda
	   inferior.*/
	border-bottom: 1px solid var(--darka-border);
}

.darka-sidebar-lessons > .darka-sidebar-lesson:last-child {
	border-bottom: none;
}

/* NOVO (auditoria "Acesso Sequencial às Aulas — Quiz Obrigatório"): aula
   ainda bloqueada (acesso sequencial ligado) — deixa de ser um `<a>`
   clicável (vira `<span>`, ver `LessonPage::sidebar()`), reaproveita toda
   a aparência base de `.darka-sidebar-lesson` acima, só com opacidade
   reduzida e cursor "não permitido" para indicar o estado inativo. */
.darka-sidebar-lesson--locked {
	opacity: 0.5;
	cursor: not-allowed;
}

/* NOVO (auditoria "Sidebar da Aula — Estrutura Visual"): duração com
   fonte visivelmente menor do que o título da aula (pedido explícito)
   — reaproveita o mesmo token de tamanho discreto já usado em toda a
   plataforma (`var(--darka-text-xs)`), nunca um valor novo inventado. */
.darka-sidebar-lesson small {
	font-size: var(--darka-text-xs);
	opacity: 0.75;
	flex-shrink: 0;
}

.darka-sidebar-lesson.is-current {
	background: var(--darka-primary);
	color: #fff;
}

.darka-sidebar-lesson__status {
	font-size: var(--darka-text-xs);
	flex-shrink: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}

/* NOVO (auditoria "Sidebar da Aula — Estrutura Visual"): ícone de Play
   para aulas por concluir — substitui o círculo simples anterior
   (pedido explícito), mesmo sistema de ícones já usado em toda a
   plataforma (Dashicons, núcleo do WordPress) — nenhuma biblioteca
   nova. `color: inherit` acompanha sempre a cor do texto da linha
   (`var(--darka-text)`, ou branco quando `.is-current`). */
.darka-lesson-play-icon {
	font-size: 15px;
	width: 15px;
	height: 15px;
	color: inherit;
	opacity: 0.85;
}

/* CORRIGIDO (auditoria "Sidebar da Aula — Estrutura Visual"): estado
   concluído deixou de usar verde (pedido explícito) — passa a um
   círculo com fundo branco fixo (igual em Light e Dark Mode, também
   pedido explícito) com o símbolo de certo ao centro, na cor primária
   do tema (`var(--darka-primary)` — "cor equivalente definida pelo
   tema", uma das duas opções do pedido) — sempre com contraste
   suficiente sobre um fundo branco fixo, mesmo quando a aula está
   selecionada (`.is-current`, fundo colorido da linha), porque a cor
   do ✓ é definida diretamente aqui, nunca herdada. */
.darka-lesson-complete-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	background: #fff;
	flex-shrink: 0;
}

.darka-lesson-complete-icon .dashicons {
	font-size: 11px;
	width: 11px;
	height: 11px;
	color: var(--darka-primary);
}

.darka-sidebar-lesson__text {
	display: flex;
	align-items: center;
	gap: 6px;
	flex: 1;
	min-width: 0;
}

.darka-sidebar-lesson small {
	font-size: var(--darka-text-xs);
	opacity: 0.7;
	flex-shrink: 0;
}

.darka-badge--current {
	background: rgba(255, 255, 255, 0.25);
	color: inherit;
	font-size: var(--darka-text-xs);
	padding: 2px 7px;
}

/* ---------- Perfil ---------- */

.darka-page-header {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 24px;
	flex-wrap: wrap;
}

.darka-page-header h1 {
	margin: 0 0 6px;
}

.darka-page-header p {
	margin: 0;
	opacity: 0.7;
	font-size: var(--darka-text-sm);
}

.darka-page-header .darka-btn-primary {
	width: auto;
	padding: 10px 20px;
}

/* NOVO: mensagem amigável para páginas sem conteúdo ainda (Meus Cursos,
   Mais Cursos, Certificados) — nunca uma área vazia sem explicação. */
.darka-empty-state {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	gap: 12px;
	padding: 60px 24px;
	border: 1px dashed var(--darka-border);
	border-radius: 12px;
	background: var(--darka-surface);
}

.darka-empty-state .dashicons {
	font-size: 40px;
	width: 40px;
	height: 40px;
	opacity: 0.5;
}

.darka-empty-state p {
	margin: 0;
	max-width: 420px;
	opacity: 0.8;
}

.darka-empty-state .darka-btn-primary {
	width: auto;
	padding: 10px 24px;
}

.darka-profile-summary-card {
	display: flex;
	align-items: center;
	gap: 20px;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 24px;
	margin-bottom: 20px;
}

.darka-profile-summary-card__avatar {
	width: 72px;
	height: 72px;
	border-radius: 50%;
	object-fit: cover;
	background: var(--darka-border);
}

.darka-profile-summary-card h2 {
	margin: 0 0 8px;
	font-size: var(--darka-text-md);
}

.darka-profile-summary-card__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 16px;
	font-size: var(--darka-text-xs);
	opacity: 0.85;
}

.darka-profile-summary-card__meta span {
	display: inline-flex;
	align-items: center;
	gap: 6px;
}

.darka-profile-summary-card__meta .dashicons {
	font-size: 15px;
	width: 15px;
	height: 15px;
}

.darka-info-card-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
	gap: 16px;
	margin-bottom: 24px;
}

.darka-info-card {
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 20px 22px;
}

.darka-info-card h3 {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0 0 16px;
	font-size: var(--darka-text-sm);
}

.darka-info-card dl {
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.darka-info-card dt {
	font-size: var(--darka-text-xs);
	opacity: 0.6;
	margin: 0 0 2px;
}

.darka-info-card dd {
	margin: 0;
	font-size: var(--darka-text-sm);
}

/* NOVO (pedido "Página de Preferências do Usuário"): a página reutiliza
   `.darka-info-card` (já usado no Painel/Perfil) como cartão de cada
   categoria, mas com `<label>`/`<select>` em vez de `dl/dt/dd` — estas
   regras dão-lhes a mesma aparência (borda, espaçamento, foco) já
   estabelecida para campos de formulário nos cartões de autenticação
   (`.darka-auth-card form select`), sem duplicar nenhuma cor/variável
   nova.  */
.darka-preferences-form .darka-info-card {
	margin-bottom: 16px;
}

.darka-preferences-form label {
	display: block;
	font-size: var(--darka-text-xs);
	font-weight: 500;
	margin-bottom: 0;
}

.darka-preferences-form select {
	display: block;
	width: 100%;
	margin-top: 6px;
	padding: 10px 12px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: var(--darka-surface);
	color: var(--darka-text);
	font-size: var(--darka-text-sm);
	font-family: inherit;
}

.darka-preferences-form select:focus {
	outline: 2px solid var(--darka-primary);
	outline-offset: 1px;
}

.darka-preferences-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 8px;
}

.darka-preferences-actions .darka-btn-primary,
.darka-preferences-actions .darka-btn-secondary {
	width: auto;
}

@media (max-width: 600px) {
	.darka-preferences-actions {
		flex-direction: column;
	}

	.darka-preferences-actions .darka-btn-primary,
	.darka-preferences-actions .darka-btn-secondary {
		width: 100%;
	}
}

.darka-edit-section {
	margin-bottom: 24px;
}

.darka-edit-section .darka-profile-card {
	margin: 0;
}

.darka-account-settings h2 {
	margin-bottom: 4px;
}

.darka-settings-tiles {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
	gap: 16px;
	margin-top: 16px;
}

@media (max-width: 900px) {
	.darka-app-shell {
		flex-direction: column;
	}

	.darka-app-topbar {
		padding: 10px 14px;
		gap: 10px;
	}

	.darka-sidebar {
		position: fixed;
		inset: 0 auto 0 0;
		z-index: 210;
		width: min(280px, 84vw);
		transform: translateX(-100%);
		transition: transform 0.2s ease;
		box-shadow: 0 0 40px rgba(0, 0, 0, 0.3);
	}

	.darka-sidebar.is-open {
		transform: translateX(0);
	}

	/* NOVO (Secções 9/10 do pedido): botão de fechar dedicado (só faz
	   sentido em mobile/tablet — em desktop a Sidebar já está sempre
	   visível, não há nada para "fechar") e fundo escurecido atrás dela
	   enquanto aberta, com fecho ao tocar fora. */
	.darka-sidebar-close {
		display: flex;
		align-items: center;
		justify-content: center;
		width: 32px;
		height: 32px;
		margin-bottom: 12px;
		margin-left: auto;
		border: none;
		border-radius: 8px;
		background: transparent;
		color: inherit;
		cursor: pointer;
	}

	.darka-sidebar-close:hover {
		background: rgba(255, 255, 255, 0.08);
	}

	.darka-sidebar-backdrop {
		position: fixed;
		inset: 0;
		z-index: 200;
		background: rgba(0, 0, 0, 0.45);
		opacity: 0;
		pointer-events: none;
		transition: opacity 0.2s ease;
	}

	.darka-sidebar-backdrop.is-open {
		display: block;
		opacity: 1;
		pointer-events: auto;
	}

	body.darka-no-scroll {
		overflow: hidden;
	}

	/* Força coluna única em mobile independentemente de
	   `.darka-lesson-sidebar-hidden`/`.darka-playlist-left` (definidas
	   fora desta media query, com especificidade que de outra forma
	   venceria aqui também) — a faixa estreita de 56px só faz sentido
	   lado a lado com o Player, no layout de duas colunas do desktop. */
	.darka-lesson-layout,
	.darka-lesson-layout.darka-lesson-sidebar-hidden,
	.darka-lesson-layout.darka-playlist-left.darka-lesson-sidebar-hidden {
		grid-template-columns: 1fr;
	}

	/* NOVO (pedido "Revisão Geral e Otimização Responsiva" — Secção 7,
	   ponto CRÍTICO): antes a Sidebar da aula (playlist) ficava sempre
	   visível, empilhada por baixo do Player, empurrando o resto do
	   conteúdo (abas, comentários) para muito mais abaixo na página.
	   Passa a começar FECHADA (`display:none`) e só aparece — como uma
	   gaveta sobreposta ao conteúdo, não mais empilhada no fluxo normal
	   — quando `.darka-lesson-sidebar-mobile-open` está presente em
	   `.darka-lesson-layout` (ver `initLessonSidebarMobileToggle()` em
	   student.js). O botão antigo de mostrar/ocultar (comportamento de
	   desktop, encolher para faixa estreita) fica escondido aqui — sem
	   efeito visual em mobile de qualquer forma, já que o grid está
	   sempre a 1 coluna acima. */
	.darka-lesson-sidebar {
		display: none;
		border-left: none;
		border-top: none;
	}

	.darka-lesson-sidebar-toggle-btn {
		display: none;
	}

	.darka-lesson-sidebar-open-btn {
		display: flex;
		align-items: center;
		gap: 8px;
		width: 100%;
		margin-bottom: 14px;
		padding: 10px 14px;
		border: 1px solid var(--darka-border);
		border-radius: 8px;
		background: var(--darka-surface);
		color: var(--darka-text);
		font-size: var(--darka-text-sm);
		font-weight: 600;
		font-family: inherit;
		cursor: pointer;
	}

	.darka-lesson-layout.darka-lesson-sidebar-mobile-open .darka-lesson-sidebar {
		display: flex;
		flex-direction: column;
		position: fixed;
		inset: 0 0 0 auto;
		width: min(340px, 88vw);
		z-index: 210;
		box-shadow: -10px 0 40px rgba(0, 0, 0, 0.3);
	}

	/* NOVO (pedido "Página de Preferências do Usuário" — Secção 12: "a
	   preferência Esquerda/Direita deve controlar a posição do drawer
	   quando tecnicamente aplicável"): quando a preferência pessoal é
	   "Esquerda" (`.darka-playlist-left`, já usada no layout de
	   desktop), a gaveta em mobile/tablet desliza do lado esquerdo em
	   vez do direito. */
	.darka-lesson-layout.darka-playlist-left.darka-lesson-sidebar-mobile-open .darka-lesson-sidebar {
		inset: 0 auto 0 0;
		box-shadow: 10px 0 40px rgba(0, 0, 0, 0.3);
	}

	.darka-lesson-layout.darka-lesson-sidebar-mobile-open .darka-lesson-sidebar-close {
		display: flex;
	}

	.darka-lesson-layout.darka-lesson-sidebar-mobile-open .darka-lesson-sidebar-backdrop {
		display: block;
		position: fixed;
		inset: 0;
		z-index: 205;
		background: rgba(0, 0, 0, 0.45);
	}

	/* AJUSTADO: dobra aqui a regra que antes só existia à parte, a
	   640px (ver histórico) — a percentagem de largura do Player
	   configurada no admin nunca deve encolher o conteúdo abaixo dos
	   900px, tablet incluído, não só em telemóveis pequenos.

	   AJUSTADO (pedido "alinhamento não está perfeito na página de aula
	   — largura do container igual à do Header"): causa raiz —
	   `.darka-app-topbar` (o cabeçalho, ver `padding: 10px 14px` mais
	   acima nesta mesma media query) reduz o seu padding horizontal para
	   14px nestes ecrãs, mas `.darka-lesson-main` (o contentor do
	   conteúdo da aula: player, ações, abas, comentários) mantinha o
	   `padding: 24px 32px 120px` do desktop (32px horizontal) — nunca
	   tinha sido ajustado aqui, só o `max-width`. Os limites esquerdo/
	   direito do conteúdo da aula ficavam por isso 18px mais para dentro
	   do que os do cabeçalho, em ambos os lados — exatamente o
	   desalinhamento reportado. `padding-left`/`padding-right` (não o
	   `padding` completo, para preservar o espaçamento vertical de
	   sempre, incluindo os 120px no fim) alinhados aos mesmos 14px do
	   cabeçalho fecha essa diferença. */
	.darka-lesson-main {
		max-width: 100% !important;
		padding-left: 14px;
		padding-right: 14px;
	}

	.darka-course-layout-grid {
		grid-template-columns: 1fr;
	}

	.darka-course-sidebar-sticky {
		position: static;
	}
}

/* ---------- Quizzes (Fase 5) ---------- */

.darka-quiz-widget {
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 24px;
	margin-top: 24px;
}

.darka-quiz-widget:empty {
	display: none;
}

.darka-quiz-question {
	margin-bottom: 20px;
}

.darka-quiz-question__text {
	font-weight: 600;
	margin-bottom: 10px;
}

.darka-quiz-option {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 10px;
	border: 1px solid var(--darka-border);
	border-radius: 8px;
	margin-bottom: 6px;
	cursor: pointer;
}

.darka-quiz-open-answer {
	width: 100%;
	padding: 10px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: transparent;
	color: var(--darka-text);
	font-family: inherit;
}

.darka-quiz-result {
	margin-top: 16px;
	padding: 14px 16px;
	border-radius: 8px;
	font-size: var(--darka-text-base);
}

.darka-quiz-result.is-passed {
	background: rgba(34, 197, 94, 0.12);
	color: #16a34a;
}

.darka-quiz-result.is-failed {
	background: rgba(239, 68, 68, 0.12);
	color: #dc2626;
}

/* NOVO (auditoria "Pedir Mais Tentativas de Quiz"): estado "tentativas
   esgotadas" — botão "Pedir mais tentativas" (só aparece depois de
   esgotadas, pedido explícito) ou aviso de pedido já pendente, nunca os
   dois ao mesmo tempo (ver `lesson-extras.js`, `mountQuiz()`). */
.darka-quiz-exhausted {
	margin-top: 12px;
}

.darka-quiz-request-attempts-btn {
	margin-top: 6px;
}

.darka-quiz-request-pending {
	color: var(--darka-primary);
}

/* ---------- Comentários de aula (Fase 5) ---------- */

.darka-lesson-comments {
	margin-top: 32px;
}

.darka-comment-form textarea,
.darka-comment-reply-form textarea {
	width: 100%;
	padding: 10px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: transparent;
	color: var(--darka-text);
	font-family: inherit;
	margin-bottom: 10px;
}

.darka-comments-list {
	margin-top: 20px;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.darka-comment {
	border: 1px solid var(--darka-border);
	border-radius: 10px;
	padding: 14px 16px;
}

.darka-comment__header {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 8px;
}

.darka-comment__avatar {
	width: 28px;
	height: 28px;
	border-radius: 50%;
	object-fit: cover;
	background: var(--darka-border);
}

.darka-comment__header time {
	font-size: var(--darka-text-xs);
	opacity: 0.6;
}

.darka-comment__content {
	margin: 0 0 8px;
	white-space: pre-wrap;
}

.darka-comment__actions {
	display: flex;
	gap: 12px;
}

.darka-comment-action {
	background: none;
	border: none;
	padding: 0;
	color: var(--darka-links);
	font-size: var(--darka-text-xs);
	cursor: pointer;
}

.darka-comment-replies {
	margin-top: 12px;
	margin-left: 20px;
	padding-left: 16px;
	border-left: 2px solid var(--darka-border);
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.darka-comment-reply-slot form {
	margin-top: 10px;
}

/* REMOVIDO: `.darka-lesson-testimonial-link` ("★ Avaliar este curso" na
   Sidebar da Playlist) — texto/link removido a pedido explícito;
   `testimonial_link()` foi eliminado de LessonPage.php, regra órfã
   eliminada. */

/* ---------- Avaliação pública (Fase 5) ---------- */

.darka-star-rating {
	display: flex;
	flex-direction: row-reverse;
	justify-content: flex-end;
	gap: 4px;
}

.darka-auth-card form .darka-star-rating input {
	position: absolute;
	opacity: 0;
	width: 0;
	height: 0;
	margin: 0;
}

.darka-auth-card form .darka-star-rating label.darka-star {
	display: inline-block;
	margin-bottom: 0;
	font-size: 28px;
	color: var(--darka-border);
	cursor: pointer;
}

.darka-auth-card form .darka-star-rating input:checked ~ label.darka-star,
.darka-auth-card form .darka-star-rating label.darka-star:hover,
.darka-auth-card form .darka-star-rating label.darka-star:hover ~ label.darka-star {
	color: #f59e0b;
}

.darka-testimonial-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
	gap: 20px;
	margin-top: 24px;
}

/* NOVO (auditoria "Avaliações/Depoimentos — Cards Configuráveis"):
   mesmo mecanismo de `.darka-course-grid--configurable` (Mais/Meus
   Cursos) — colunas por dispositivo, definidas pelo Administrador em
   Configurações → Geral → "Depoimentos". A grelha base acima mantém-se
   para quem nunca configurar isto. */
.darka-testimonial-grid--configurable {
	grid-template-columns: repeat(var(--darka-testimonial-grid-columns-desktop, 3), 1fr);
}

@media (max-width: 900px) {
	.darka-testimonial-grid--configurable {
		grid-template-columns: repeat(var(--darka-testimonial-grid-columns-tablet, 2), 1fr);
	}
}

@media (max-width: 600px) {
	.darka-testimonial-grid--configurable {
		grid-template-columns: repeat(var(--darka-testimonial-grid-columns-mobile, 1), 1fr);
	}
}

.darka-testimonial-grid__load-more {
	display: flex;
	justify-content: center;
	margin-top: 28px;
}

.darka-testimonial-card {
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 22px;
	display: flex;
	flex-direction: column;
}

/* AJUSTADO (auditoria "Avaliações/Depoimentos — Cards Configuráveis"):
   cada elemento do card passou a ter a sua própria classe (antes só
   `.darka-testimonial-card p`/`strong` genéricos) — nome/curso/foto
   agrupados num cabeçalho, cada peça só aparece quando o Administrador
   a autoriza (ver `Components::testimonial_card_html()`), com boas
   quebras em Light/Dark Mode (`var(--darka-text)`, nunca cor fixa). */
.darka-testimonial-card__header {
	display: flex;
	align-items: center;
	gap: 12px;
	margin-bottom: 12px;
}

.darka-testimonial-card__avatar {
	width: 44px;
	height: 44px;
	border-radius: 50%;
	object-fit: cover;
	flex-shrink: 0;
}

.darka-testimonial-card__identity {
	display: flex;
	flex-direction: column;
	min-width: 0;
}

.darka-testimonial-card__name {
	display: block;
	font-size: var(--darka-text-sm);
}

.darka-testimonial-card__course {
	font-size: var(--darka-text-xs);
	color: var(--darka-text);
	opacity: 0.65;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.darka-testimonial-card__stars {
	color: #f59e0b;
	font-size: var(--darka-text-base);
	margin-bottom: 8px;
}

.darka-testimonial-card__date {
	display: block;
	font-size: var(--darka-text-xs);
	color: var(--darka-text);
	opacity: 0.6;
	margin-bottom: 8px;
}

.darka-testimonial-card__title {
	font-size: var(--darka-text-sm);
	margin: 0 0 8px;
}

.darka-testimonial-card__text {
	font-size: var(--darka-text-sm);
	opacity: 0.85;
	margin: 0 0 6px;
	/* Solução visual pedida (Secção 2.5): limite inicial por linhas em
	   vez de corte por caracteres — preserva palavras inteiras e nunca
	   quebra o layout do card, com "Ler mais" a remover o limite. */
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 4;
	overflow: hidden;
}

.darka-testimonial-card__text.is-expanded {
	-webkit-line-clamp: unset;
	overflow: visible;
}

.darka-testimonial-card__toggle {
	align-self: flex-start;
	background: none;
	border: none;
	padding: 0;
	color: var(--darka-primary);
	font-size: var(--darka-text-xs);
	cursor: pointer;
	text-decoration: underline;
}

/* ---------- FAQ (accordion nativo <details>/<summary>, sem JS) ---------- */

.darka-faq-list {
	display: flex;
	flex-direction: column;
	gap: 12px;
	max-width: 800px;
}

.darka-faq-item {
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 4px 20px;
	transition: border-color 0.2s ease;
}

.darka-faq-item[open] {
	border-color: var(--darka-primary);
}

.darka-faq-item summary {
	list-style: none;
	cursor: pointer;
	padding: 16px 0;
	font-weight: 600;
	font-size: var(--darka-text-base);
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
}

.darka-faq-item summary::-webkit-details-marker {
	display: none;
}

.darka-faq-item summary::after {
	content: '+';
	font-size: 20px;
	font-weight: 400;
	color: var(--darka-primary);
	flex-shrink: 0;
}

.darka-faq-item[open] summary::after {
	content: '\2212';
}

.darka-faq-item__answer {
	padding: 0 0 18px;
	opacity: 0.85;
	font-size: var(--darka-text-sm);
	line-height: 1.6;
}

.darka-faq-item__answer p:first-child {
	margin-top: 0;
}

.darka-faq-item__answer p:last-child {
	margin-bottom: 0;
}

.darka-auth-card form select {
	width: 100%;
	/* AJUSTADO (finalização 1.0.0 — Fase 4.2): mesmos valores agora
	   usados por `form input`/`form textarea`, para consistência. */
	padding: 13px 14px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: var(--darka-surface);
	color: var(--darka-text);
	font-family: inherit;
	margin-top: 10px;
}

/* ---------- Pagamentos (Fase 6) ---------- */

.darka-price-original,
.darka-course-card__price-original {
	font-size: var(--darka-text-xs);
	opacity: 0.6;
	text-decoration: line-through;
}

.darka-price-original {
	display: block;
}

.darka-purchase-card {
	text-align: left;
}

.darka-purchase-back {
	display: inline-block;
	font-size: var(--darka-text-xs);
	color: var(--darka-links);
	text-decoration: none;
	margin-bottom: 16px;
}

.darka-purchase-back:hover {
	text-decoration: underline;
}

.darka-purchase-amount {
	font-size: var(--darka-text-xl);
	font-weight: 700;
	margin: 0 0 20px;
}

.darka-payment-methods {
	margin-bottom: 16px;
}

.darka-payment-method-option {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 10px 12px;
	border: 1px solid var(--darka-border);
	border-radius: 8px;
	margin-bottom: 8px;
	cursor: pointer;
	font-size: var(--darka-text-sm);
	font-weight: 500;
}

.darka-payment-method-instructions {
	background: var(--darka-bg);
	border: 1px dashed var(--darka-border);
	border-radius: 8px;
	padding: 12px 14px;
	margin: -2px 0 14px;
	font-size: var(--darka-text-xs);
	opacity: 0.9;
}

.darka-payment-method-instructions p:first-child {
	margin-top: 0;
}

.darka-payment-method-instructions p:last-child {
	margin-bottom: 0;
}

.darka-auth-card form input[type='file'] {
	display: block;
	width: 100%;
	margin-top: 6px;
	padding: 10px 0;
}

.darka-payments-history {
	margin-top: 0;
}

.darka-simple-table {
	width: 100%;
	border-collapse: collapse;
	font-size: var(--darka-text-xs);
}

.darka-simple-table th,
.darka-simple-table td {
	text-align: left;
	padding: 8px 6px;
	border-bottom: 1px solid var(--darka-border);
}

.darka-badge--payment-pending {
	background: rgba(217, 119, 6, 0.15);
	color: #d97706;
}

.darka-badge--payment-approved {
	background: rgba(34, 197, 94, 0.15);
	color: #16a34a;
}

.darka-badge--payment-rejected {
	background: rgba(239, 68, 68, 0.15);
	color: #dc2626;
}

/* ---------- Certificados (Fase 7) ---------- */

.darka-certificate-page {
	max-width: 900px;
	margin: 0 auto;
	padding: 32px 20px 60px;
}

.darka-certificate-toolbar {
	display: flex;
	justify-content: space-between;
	align-items: center;
	margin-bottom: 24px;
}

.darka-certificate-toolbar a {
	color: var(--darka-links);
	text-decoration: none;
	font-size: var(--darka-text-sm);
}

.darka-certificate-toolbar a:hover {
	text-decoration: underline;
}

.darka-certificate {
	background: #ffffff;
	border-radius: 16px;
	box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);
	padding: 10px;
}

.darka-certificate__border {
	border: 2px solid var(--darka-primary);
	border-radius: 10px;
	padding: 60px 40px;
	text-align: center;
	color: #1f2937;
}

.darka-certificate__logo {
	max-height: 64px;
	max-width: 220px;
	margin: 0 auto 20px;
	display: block;
}

.darka-certificate__platform {
	font-size: 20px;
	font-weight: 700;
	margin-bottom: 20px;
	color: var(--darka-primary);
}

.darka-certificate__intro {
	font-size: 15px;
	margin: 18px 0 6px;
	color: #4b5563;
}

.darka-certificate__name {
	font-size: 36px;
	font-weight: 700;
	margin: 0;
	color: #111827;
}

.darka-certificate__course {
	font-size: 24px;
	font-weight: 600;
	margin: 6px 0 20px;
	color: var(--darka-primary);
}

.darka-certificate__instructor {
	font-size: 13px;
	color: #6b7280;
	margin: 0 0 4px;
}

.darka-certificate__date {
	font-size: 13px;
	color: #6b7280;
	margin: 0 0 24px;
}

.darka-certificate__code {
	font-size: 11px;
	color: #9ca3af;
	letter-spacing: 0.05em;
	margin: 0;
}

@media print {
	@page {
		size: landscape;
		margin: 0;
	}

	body.darka-certificate-body {
		background: #ffffff;
	}

	.darka-certificate-toolbar {
		display: none;
	}

	.darka-certificate-page {
		max-width: none;
		padding: 0;
	}

	.darka-certificate {
		box-shadow: none;
		border-radius: 0;
	}

	.darka-certificate__border {
		border-radius: 0;
	}
}

/* ---------- Notificações (Fase 8) ---------- */

.darka-notifications {
	position: relative;
}

.darka-notifications-badge {
	position: absolute;
	top: -4px;
	right: -4px;
	background: #dc2626;
	color: #fff;
	font-size: var(--darka-text-xs);
	font-weight: 700;
	line-height: 1;
	padding: 3px 5px;
	border-radius: 999px;
	min-width: 16px;
	text-align: center;
}

.darka-notifications-panel {
	position: absolute;
	top: calc(100% + 10px);
	right: 0;
	width: 320px;
	max-height: 420px;
	overflow-y: auto;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	box-shadow: 0 20px 40px rgba(0, 0, 0, 0.25);
	z-index: 50;
}

/* NOVO: aviso inline quando "Marcar todas como lidas" falha (ver
   `showError()` em notifications.js) — nunca substitui a lista, só avisa
   por cima dela, para não dar a entender que a operação funcionou. */
.darka-notifications-error {
	margin: 0;
	padding: 10px 16px;
	font-size: var(--darka-text-xs);
	color: #ef4444;
	background: rgba(239, 68, 68, 0.1);
	border-bottom: 1px solid var(--darka-border);
}

.darka-notifications-panel__header {
	display: flex;
	justify-content: space-between;
	align-items: center;
	padding: 14px 16px;
	border-bottom: 1px solid var(--darka-border);
}

.darka-notifications-panel__header button {
	background: none;
	border: none;
	color: var(--darka-links);
	font-size: var(--darka-text-xs);
	cursor: pointer;
	padding: 0;
}

.darka-notifications-list {
	display: flex;
	flex-direction: column;
}

.darka-notifications-empty {
	padding: 20px 16px;
	margin: 0;
	text-align: center;
}

.darka-notification {
	display: block;
	padding: 12px 16px;
	border-bottom: 1px solid var(--darka-border);
	text-decoration: none;
	color: var(--darka-text);
}

.darka-notification:last-child {
	border-bottom: none;
}

.darka-notification p {
	margin: 0 0 4px;
	font-size: var(--darka-text-xs);
}

.darka-notification time {
	font-size: var(--darka-text-xs);
	opacity: 0.6;
}

.darka-notification.is-unread {
	background: rgba(99, 102, 241, 0.08);
}

.darka-notification.is-unread p {
	font-weight: 600;
}

/* NOVO: popover de perfil — reutiliza `.darka-notifications-panel` (mesmo
   padrão visual) e `.darka-notification` para as duas linhas de ação
   ("Ver Perfil Completo" / "Sair da conta"), só com o necessário próprio
   (cabeçalho com avatar+nome lado a lado, em vez do espaçamento entre
   título e botão usado nas notificações; ícone e cor do link de logout). */
.darka-user-popover__header {
	justify-content: flex-start;
	gap: 10px;
}

.darka-user-popover__link .dashicons {
	font-size: 16px;
	width: 16px;
	margin-right: 6px;
	vertical-align: text-bottom;
}

.darka-user-popover__link:hover {
	background: var(--darka-bg);
}

.darka-user-popover__logout {
	color: #ef4444;
}

/* CORRIGIDO (auditoria "Popup de Notificações — Mobile"): causa real —
   `.darka-notifications-panel` usava `position: absolute; right: 0;
   width: 320px`, sempre relativo ao próprio ícone do sino (um botão de
   36px), nunca ao ecrã. Como o sino não fica junto à margem direita
   real (há mais ícones depois dele — tema, preferências, avatar), um
   painel de 320px a abrir para a esquerda a partir dessa posição podia
   ultrapassar a margem esquerda do ecrã em qualquer largura estreita —
   a correção anterior (só ≤380px, só a largura) reduzia o sintoma sem
   corrigir a causa, e não cobria tablets/telemóveis maiores (390px,
   430px, 768px, todos > 380px).
   Corrigido com `position: fixed` (relativo ao VIEWPORT, nunca ao
   ícone) e margens fixas dos dois lados — o painel fica sempre dentro
   do ecrã, com a mesma largura disponível independentemente de onde o
   sino estiver posicionado. `env(safe-area-inset-*)` respeita entalhes/
   Ilha Dinâmica em iPhones recentes. Desktop (>900px) preservado, sem
   nenhuma alteração — continua `position: absolute` relativo ao ícone,
   comportamento de sempre. Aplica-se também a `.darka-user-popover__panel`
   (popover do perfil), que reutiliza esta mesma classe — mesma causa,
   mesma correção, sem duplicar regras. */
@media (max-width: 900px) {
	.darka-notifications-panel {
		position: fixed;
		top: 60px;
		left: calc(12px + env(safe-area-inset-left, 0px));
		right: calc(12px + env(safe-area-inset-right, 0px));
		width: auto;
		max-width: none;
		max-height: calc(100vh - 80px);
	}
}

/* ---------- Chat de suporte (Fase 9) ---------- */

/* CORRIGIDO (correções finais 1.0 — Ponto 1, "ícone de Chat não
   aparece"): z-index era 200, mais baixo do que `.darka-cookie-bar`
   (400) e `.darka-install-banner` (399) — ambas faixas fixas no fundo
   do ecrã, com largura suficiente para cobrir o canto inferior
   direito em ecrãs mais estreitos. Não era a única causa possível
   (ver relatório), mas era um problema real e confirmado: sempre que
   uma dessas faixas estivesse visível, ficava por cima do botão do
   Chat, tornando-o inacessível/invisível nesse momento. */
.darka-chat-widget {
	position: fixed;
	right: 20px;
	bottom: 20px;
	z-index: 500;
}

.darka-chat-widget__toggle {
	position: relative;
	width: 56px;
	height: 56px;
	border-radius: 50%;
	border: none;
	background: var(--darka-primary);
	color: #fff;
	cursor: pointer;
	box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
	display: flex;
	align-items: center;
	justify-content: center;
}

.darka-chat-widget__toggle .dashicons {
	font-size: 24px;
	width: 24px;
	height: 24px;
}

.darka-chat-widget__toggle .darka-notifications-badge {
	top: -2px;
	right: -2px;
}

.darka-chat-widget__panel {
	position: absolute;
	right: 0;
	bottom: calc(100% + 12px);
	width: 320px;
	height: 420px;
	display: flex;
	flex-direction: column;
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	box-shadow: 0 20px 50px rgba(0, 0, 0, 0.3);
	overflow: hidden;
}

/* CORRIGIDO: o atributo `hidden` do HTML tem a mesma especificidade que a
   classe acima (0,0,1,0) — sem este seletor combinado, `display: flex`
   ganhava sempre ao `display: none` do `[hidden]` nativo (a folha de
   estilo do autor carrega depois da folha do navegador), e o painel do
   chat ficava sempre visível, independentemente do JS abrir/fechar. */
.darka-chat-widget__panel[hidden] {
	display: none;
}

.darka-chat-widget__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 14px 16px;
	border-bottom: 1px solid var(--darka-border);
}

.darka-chat-widget__header button {
	background: none;
	border: none;
	font-size: 20px;
	line-height: 1;
	cursor: pointer;
	color: var(--darka-text);
}

.darka-chat-widget__messages {
	flex: 1;
	overflow-y: auto;
	padding: 14px 16px;
	display: flex;
	flex-direction: column;
	gap: 10px;
}

.darka-chat-message {
	max-width: 85%;
	padding: 8px 12px;
	border-radius: 12px;
	font-size: var(--darka-text-xs);
}

.darka-chat-message p {
	margin: 0 0 2px;
}

.darka-chat-message time {
	font-size: var(--darka-text-xs);
	opacity: 0.6;
}

.darka-chat-message.is-self {
	align-self: flex-end;
	background: var(--darka-primary);
	color: #fff;
}

.darka-chat-message.is-staff {
	align-self: flex-start;
	background: var(--darka-bg);
	border: 1px solid var(--darka-border);
}

/* AJUSTADO: campo e botão passam de lado-a-lado para bloco vertical —
   textarea em cima, botão "Enviar" alinhado à direita por baixo dela. */
.darka-chat-widget__form {
	display: flex;
	flex-direction: column;
	gap: 10px;
	padding: 12px;
	border-top: 1px solid var(--darka-border);
}

/* CORRIGIDO: campo de digitação demasiado pequeno (1 linha fixa). Agora
   nasce com altura para ~3-4 linhas (`min-height`) e cresce sozinho
   conforme se escreve (ver `autoGrowChatTextarea()` em chat.js), até um
   limite (`max-height`) que passa a fazer scroll interno em vez de
   continuar a crescer indefinidamente. `width: 100%` é seguro contra
   overflow horizontal graças ao `box-sizing: border-box` global no topo
   deste ficheiro. */
.darka-chat-widget__form textarea {
	width: 100%;
	resize: none;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: transparent;
	color: var(--darka-text);
	font-family: inherit;
	font-size: var(--darka-text-sm);
	line-height: 1.5;
	padding: 10px 12px;
	min-height: 88px;
	max-height: 160px;
	overflow-y: auto;
}

/* AJUSTADO: o botão reutiliza a classe partilhada `.darka-btn-primary` do
   Design System (mesma cor/tipografia/raio dos outros CTAs da plataforma)
   — esta classe só acrescenta o que é específico deste botão (posição,
   ícone, hover, foco, loading), sem tocar em `.darka-btn-primary`
   globalmente (evita alterar todos os outros botões do site). */
.darka-chat-widget__send {
	align-self: flex-end;
	gap: 6px;
}

.darka-chat-widget__send .dashicons {
	font-size: 16px;
	width: 16px;
	height: 16px;
}

.darka-chat-widget__send:hover:not(:disabled) {
	background: var(--darka-secondary);
}

.darka-chat-widget__send:focus-visible {
	outline: 2px solid var(--darka-primary);
	outline-offset: 2px;
}

.darka-chat-widget__send.is-loading {
	cursor: wait;
}

@media (max-width: 480px) {
	.darka-chat-widget__panel {
		width: calc(100vw - 40px);
	}
}

/* ---------- Certificados (Parte 3 do pedido "Ajustes Específicos") ---------- */

.darka-certificate-manual-notice {
	margin-bottom: 24px;
}

.darka-certificate-manual-notice p {
	margin: 0 0 6px;
}

.darka-certificate-manual-notice p:last-child {
	margin-bottom: 0;
	opacity: 0.85;
	font-size: var(--darka-text-sm);
}

.darka-certificate-status-list {
	display: flex;
	flex-direction: column;
	gap: 16px;
	margin-bottom: 24px;
}

.darka-certificate-status-card h3 {
	margin: 0 0 12px;
}

.darka-certificate-status-facts {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
	gap: 8px 16px;
	margin: 0 0 12px;
}

.darka-certificate-status-facts dt {
	font-size: var(--darka-text-xs);
	opacity: 0.7;
	margin: 0;
}

.darka-certificate-status-facts dd {
	margin: 2px 0 0;
	font-weight: 600;
}

.darka-certificate-status-card__situation {
	margin: 12px 0;
	font-size: var(--darka-text-sm);
}

.darka-certificate-participation-notice {
	max-width: 720px;
	font-size: var(--darka-text-xs);
	opacity: 0.75;
	line-height: 1.6;
	border-top: 1px solid var(--darka-border);
	padding-top: 16px;
	margin-top: 8px;
}

.darka-link-card {
	display: flex;
	flex-direction: column;
	gap: 10px;
}

.darka-link-card h3 {
	margin: 0;
}

.darka-link-card p {
	margin: 0;
	font-size: var(--darka-text-sm);
	opacity: 0.8;
}

.darka-link-card .darka-btn-primary {
	align-self: flex-start;
	margin-top: 4px;
}

/* ---------- Barra de Notificação (top_bar) ---------- */

.darka-top-bar {
	padding: 10px 24px;
	text-align: center;
}

.darka-top-bar__inner {
	max-width: 1200px;
	margin: 0 auto;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 16px;
	flex-wrap: wrap;
}

.darka-top-bar__text {
	font-size: var(--darka-text-sm);
	font-weight: 500;
}

.darka-top-bar__button {
	display: inline-block;
	padding: 6px 16px;
	border-radius: 999px;
	color: #fff;
	text-decoration: none;
	font-size: var(--darka-text-xs);
	font-weight: 600;
	white-space: nowrap;
}

/* ---------- Política de Privacidade / Termos e Condições ---------- */

.darka-legal-page {
	max-width: 760px;
	margin: 0 auto;
	padding: 48px 24px 80px;
	line-height: 1.7;
}

.darka-legal-page h1 {
	margin: 0 0 28px;
}

.darka-legal-content h2 {
	font-size: var(--darka-text-lg);
	margin: 32px 0 12px;
}

.darka-legal-content h2:first-child {
	margin-top: 0;
}

.darka-legal-content p {
	margin: 0 0 14px;
	opacity: 0.9;
}

.darka-legal-content ul {
	margin: 0 0 14px;
	padding-left: 22px;
}

.darka-legal-content li {
	margin-bottom: 6px;
	opacity: 0.9;
}

.darka-legal-content em {
	display: block;
	padding: 12px 16px;
	background: var(--darka-surface);
	border: 1px dashed var(--darka-border);
	border-radius: 8px;
	font-style: normal;
	font-size: var(--darka-text-xs);
	opacity: 0.8;
	margin-bottom: 20px;
}

@media (max-width: 600px) {
	.darka-legal-page {
		padding: 32px 16px 60px;
	}
}

/* ---------- Barra de Cookies ---------- */

.darka-cookie-bar {
	position: fixed;
	left: 16px;
	right: 16px;
	bottom: 16px;
	z-index: 400;
	max-width: 720px;
	margin: 0 auto;
	background: var(--darka-surface);
	color: var(--darka-text);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	box-shadow: 0 20px 50px rgba(0, 0, 0, 0.25);
	padding: 20px 22px;
}

.darka-cookie-bar h2 {
	margin: 0 0 8px;
	font-size: var(--darka-text-md);
}

.darka-cookie-bar p {
	margin: 0 0 16px;
	font-size: var(--darka-text-sm);
	opacity: 0.85;
	line-height: 1.6;
}

.darka-cookie-bar p a {
	color: var(--darka-links);
}

.darka-cookie-bar__actions {
	display: flex;
	gap: 10px;
	flex-wrap: wrap;
}

.darka-cookie-bar__actions .darka-btn-primary,
.darka-cookie-bar__actions .darka-btn-secondary {
	width: auto;
	padding: 9px 22px;
}

/* NOVO (finalização 1.0.0 — Fase 6.3, "PWA — Instalação"): faixa
   discreta no fundo do ecrã, nunca um popup/modal invasivo — criada
   dinamicamente por `pwa-install.js` só quando o navegador confirma
   suporte real de instalação (`beforeinstallprompt`). Mesmo padrão
   visual já usado por `.darka-cookie-bar` acima. */
.darka-install-banner {
	position: fixed;
	left: 16px;
	right: 16px;
	bottom: 16px;
	z-index: 399;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	max-width: 480px;
	margin: 0 auto;
	padding: 14px 16px;
	background: var(--darka-surface);
	color: var(--darka-text);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	box-shadow: 0 20px 50px rgba(0, 0, 0, 0.25);
}

.darka-install-banner__text {
	font-size: var(--darka-text-sm);
	flex: 1 1 200px;
}

.darka-install-banner__actions {
	display: flex;
	align-items: center;
	gap: 8px;
}

.darka-install-banner__actions .darka-btn-primary {
	width: auto;
	padding: 9px 18px;
}

.darka-install-banner__dismiss {
	background: none;
	border: none;
	font-size: 20px;
	line-height: 1;
	opacity: 0.6;
	cursor: pointer;
	padding: 4px 8px;
	color: inherit;
}

.darka-install-banner__dismiss:hover {
	opacity: 1;
}

@media (max-width: 480px) {
	.darka-install-banner {
		flex-direction: column;
		align-items: stretch;
	}
}

/* ---------- Esqueci Minha Senha / Login ---------- */

/* CORRIGIDO (finalização 1.0.0 — Fase 4.1): margem superior NEGATIVA
   colava este link ao campo de senha logo acima, e só 4px o separavam
   do botão "Entrar" abaixo — espaçamento respirável dos dois lados. */
.darka-auth-forgot {
	margin: 10px 0 20px;
	text-align: right;
	font-size: var(--darka-text-xs);
}

.darka-auth-forgot a {
	color: var(--darka-links);
	text-decoration: none;
}

.darka-auth-forgot a:hover {
	text-decoration: underline;
}

/* Medidor de força de senha (página "Escolher Nova Senha") — heurística
   só do lado do cliente, para dar feedback imediato; a regra que
   realmente decide se a senha é aceite continua a ser validada no
   Backend (ver `AuthController::reset_password()`). */
/* CORRIGIDO (finalização 1.0.0 — Fase 4.1): mesma classe de bug do
   `.darka-auth-forgot` acima — margem superior negativa, que agora
   colidiria ainda mais com o espaçamento maior entre campos (Fase
   4.1). O campo "Nova Senha" logo acima já tem `margin-bottom: 20px`
   (regra partilhada de `form label`), suficiente por si só — só
   precisa de uma margem inferior consistente antes de "Confirmar Nova
   Senha". */
.darka-password-strength {
	margin: 0 0 20px;
	display: flex;
	align-items: center;
	gap: 8px;
}

.darka-password-strength__bar {
	flex: 1;
	height: 6px;
	border-radius: 999px;
	background: var(--darka-border);
	overflow: hidden;
}

.darka-password-strength__bar span {
	display: block;
	height: 100%;
	width: 0;
	border-radius: 999px;
	transition: width 0.2s ease, background 0.2s ease;
	background: #ef4444;
}

.darka-password-strength[data-level='medium'] .darka-password-strength__bar span {
	background: #f59e0b;
}

.darka-password-strength[data-level='strong'] .darka-password-strength__bar span {
	background: #22c55e;
}

.darka-password-strength__label {
	font-size: var(--darka-text-xs);
	opacity: 0.75;
	white-space: nowrap;
}

/* ---------- Timeout por Inatividade ---------- */

.darka-inactivity-modal {
	position: fixed;
	inset: 0;
	z-index: 500;
	display: flex;
	align-items: center;
	justify-content: center;
	background: rgba(0, 0, 0, 0.55);
	padding: 20px;
}

.darka-inactivity-modal__card {
	background: var(--darka-surface);
	color: var(--darka-text);
	border-radius: 12px;
	padding: 28px 26px;
	max-width: 380px;
	width: 100%;
	text-align: center;
	box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35);
}

.darka-inactivity-modal__card h2 {
	margin: 0 0 12px;
	font-size: var(--darka-text-lg);
}

.darka-inactivity-modal__card p {
	margin: 0 0 20px;
	opacity: 0.85;
	line-height: 1.5;
}

.darka-inactivity-modal__actions {
	display: flex;
	justify-content: center;
}

.darka-inactivity-modal__actions .darka-btn-primary {
	width: auto;
	padding: 11px 28px;
}

@media (max-width: 600px) {
	.darka-inactivity-modal__card {
		padding: 22px 20px;
	}
}

