*,
*::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;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	padding: 16px 32px;
	border-bottom: 1px solid var(--darka-border);
	background: var(--darka-surface);
	transition: padding 0.2s ease, box-shadow 0.2s ease;
}

/* 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;
}

.darka-public-header__nav {
	display: flex;
	align-items: center;
	gap: 20px;
	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;
}

.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;
}

/* ---------- 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);
	}
}

.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;
	font-size: var(--darka-text-xs);
	opacity: 0.8;
}

.darka-course-card__category {
	padding: 2px 8px;
	border-radius: 999px;
	border: 1px solid var(--darka-border);
}

.darka-course-card__curriculum-stats,
.darka-course-card__students-stat {
	white-space: nowrap;
}

/* 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 ---------- */

.darka-continue-list {
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.darka-continue-card {
	display: flex;
	align-items: center;
	gap: 16px;
	padding: 14px 16px;
	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: 56px;
	height: 56px;
	border-radius: 8px;
	overflow: hidden;
	flex-shrink: 0;
	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: auto;
	padding: 8px 18px;
	flex-shrink: 0;
}

/* ---------- 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;
}

.darka-public section.darka-section {
	max-width: 1100px;
	margin: 0 auto 60px;
	padding: 0 24px;
}

/* 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;
}

/* Respiro superior só da secção Catálogo (pedido específico) — as
   restantes secções públicas (Depoimentos, FAQ) não são alteradas por
   este ajuste. 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;
	}
}

/* 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%;
	}
}

.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. */
.darka-course-hero {
	text-align: left;
	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);
}

.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,
	body.darka-lesson-page .darka-lesson-sidebar {
		height: 100%;
		overflow-y: auto;
	}

	/* 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. */
.darka-lesson-layout {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 320px;
	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: 320px 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. */
.darka-lesson-main {
	width: 100%;
	padding: 24px 32px 32px;
	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: 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;
}

.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;
}

/* 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;
}

.darka-lesson-sidebar {
	border-left: 1px solid var(--darka-border);
	background: var(--darka-surface);
	padding: 20px;
	overflow-y: auto;
}

/* 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;
}

.darka-sidebar-module {
	border-bottom: 1px solid var(--darka-border);
	padding: 8px 0;
}

/* 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. */
.darka-sidebar-module summary {
	cursor: pointer;
	font-size: var(--darka-sidebar-module-title-size, 13px);
	font-weight: 600;
	padding: 6px 0;
}

.darka-sidebar-module summary.is-active {
	color: var(--darka-primary);
}

.darka-sidebar-lessons {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding-left: 8px;
}

/* 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);
}

.darka-sidebar-lesson.is-current {
	background: var(--darka-primary);
	color: #fff;
}

.darka-sidebar-lesson__status {
	font-size: var(--darka-text-xs);
	flex-shrink: 0;
}

/* NOVO: ícone pequeno e verde de aula concluída — mesmo tom de verde já
   usado na plataforma para indicações positivas (ex.: selo "Grátis").
   `color` explícito sobrepõe-se sempre ao `color: #fff` herdado da linha
   atual (`.darka-sidebar-lesson.is-current`), por isso o ✓ mantém-se
   verde mesmo na aula selecionada. */
.darka-lesson-complete-icon {
	font-size: 14px;
	width: 14px;
	height: 14px;
	color: #22c55e;
}

.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. */
	.darka-lesson-main {
		max-width: 100% !important;
	}

	.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;
}

/* ---------- 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;
}

.darka-testimonial-card {
	background: var(--darka-surface);
	border: 1px solid var(--darka-border);
	border-radius: 12px;
	padding: 22px;
}

.darka-testimonial-card__stars {
	color: #f59e0b;
	font-size: var(--darka-text-base);
	margin-bottom: 10px;
}

.darka-testimonial-card p {
	font-size: var(--darka-text-sm);
	opacity: 0.85;
	margin: 0 0 14px;
}

.darka-testimonial-card strong {
	display: block;
	font-size: var(--darka-text-sm);
}

/* ---------- 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) ---------- */

.darka-chat-widget {
	position: fixed;
	right: 20px;
	bottom: 20px;
	z-index: 200;
}

.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;
	}
}

