*,
*::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);
	font-size: var(--darka-font-size-base);
	line-height: 1.5;
	-webkit-font-smoothing: antialiased;
}

.darka-auth-shell {
	min-height: 100vh;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 24px;
}

.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: 22px;
	font-weight: 600;
}

.darka-auth-card h3 {
	margin: 28px 0 14px;
	font-size: 15px;
	font-weight: 600;
	border-top: 1px solid var(--darka-border);
	padding-top: 20px;
}

.darka-auth-card form label {
	display: block;
	font-size: 13px;
	font-weight: 500;
	margin-bottom: 14px;
}

.darka-auth-card form input {
	display: block;
	width: 100%;
	margin-top: 6px;
	padding: 10px 12px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: rgba(255, 255, 255, 0.04);
	color: var(--darka-text);
	font-size: 14px;
	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 {
	padding-right: 40px;
}

.darka-password-toggle {
	position: absolute;
	right: 8px;
	top: 50%;
	transform: translateY(-50%);
	background: none;
	border: none;
	padding: 4px;
	margin: 0;
	display: inline-flex;
	align-items: 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: 6px;
	padding: 10px 12px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: rgba(255, 255, 255, 0.04);
	color: var(--darka-text);
	font-size: 14px;
	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;
	padding: 11px 18px;
	border-radius: 8px;
	border: none;
	font-size: 14px;
	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: 4px 0 16px;
}

.darka-auth-alt {
	margin-top: 20px;
	font-size: 13px;
	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: 13px;
	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: 12px;
	opacity: 0.7;
	margin: 4px 0 0;
}

@media (max-width: 480px) {
	.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: 18px;
	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: 14px;
	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: 12px;
	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: 14px;
}

/* ---------- 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;
}

/* 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: 11px;
	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: 14px;
}

.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: 13px;
	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: 12px;
	font-weight: 700;
}

.darka-user-menu__text {
	display: flex;
	flex-direction: column;
	font-size: 13px;
	line-height: 1.3;
}

.darka-user-menu__text small {
	opacity: 0.6;
	font-size: 11px;
}

.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: 24px;
}

.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: 20px;
}

.darka-stat-card span {
	font-size: 12px;
	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: 13px;
	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);
}

@media (max-width: 1024px) {
	.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: 12px;
	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: 12px;
	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: 11px;
	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: 15px;
}

.darka-course-card__body p {
	margin: 0 0 10px;
	font-size: 13px;
	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: 16px;
	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: 14px;
}

.darka-course-grid--size-small .darka-course-card__body p {
	font-size: 12px;
	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: 18px;
}

.darka-course-grid--size-large .darka-course-card__body p {
	font-size: 14px;
	margin-bottom: 12px;
}

.darka-badge {
	display: inline-block;
	padding: 3px 10px;
	border-radius: 999px;
	font-size: 11px;
	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: 13px;
}

.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: 14px;
}

.darka-continue-card__body span {
	opacity: 0.7;
	font-size: 12px;
}

.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: 40px;
	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: 22px;
}

.darka-stat span {
	font-size: 12px;
	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;
	}
}

.darka-public-footer {
	text-align: center;
	padding: 32px;
	border-top: 1px solid var(--darka-border);
	font-size: 13px;
	opacity: 0.7;
}

/* ---------- 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: 30px;
	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: 13px;
	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: 18px;
	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: 15px;
}

.darka-curriculum-lessons {
	list-style: none;
	margin: 0;
	padding: 0;
	font-size: 13px;
}

.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: 11px;
}

.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: 22px;
	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: 13px;
	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: 13px;
	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: 13px;
	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: 12px;
	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;
}

/* NOVO: em mobile, a caixa inteira (Player + abas + comentários) usa
   sempre a largura disponível, independentemente da percentagem
   configurada para desktop — nunca fica artificialmente pequena num
   ecrã pequeno. `!important` é necessário aqui 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. */
@media (max-width: 640px) {
	.darka-lesson-main {
		max-width: 100% !important;
	}
}

.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: 13px;
	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: 14px;
	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: 13px;
}

.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;
	gap: 8px;
}

.darka-lesson-star-rating {
	display: flex;
	gap: 2px;
}

.darka-lesson-star {
	background: none;
	border: none;
	padding: 2px;
	font-size: 20px;
	line-height: 1;
	color: var(--darka-border);
	cursor: pointer;
}

.darka-lesson-star.is-filled {
	color: #f59e0b;
}

.darka-lesson-rating__meta {
	font-size: 12px;
	opacity: 0.7;
}

.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;
}

/* 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: 12px;
	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: 11px;
	opacity: 0.7;
	flex-shrink: 0;
}

.darka-badge--current {
	background: rgba(255, 255, 255, 0.25);
	color: inherit;
	font-size: 9px;
	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: 14px;
}

.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: 18px;
}

.darka-profile-summary-card__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 16px;
	font-size: 13px;
	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: 14px;
}

.darka-info-card dl {
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}

.darka-info-card dt {
	font-size: 11px;
	opacity: 0.6;
	margin: 0 0 2px;
}

.darka-info-card dd {
	margin: 0;
	font-size: 14px;
}

.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-sidebar {
		position: fixed;
		inset: 0 auto 0 0;
		z-index: 100;
		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);
	}

	/* 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;
	}

	.darka-lesson-sidebar {
		border-left: none;
		border-top: 1px solid var(--darka-border);
	}

	.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: 15px;
}

.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: 12px;
	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: 12px;
	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: 16px;
	margin-bottom: 10px;
}

.darka-testimonial-card p {
	font-size: 14px;
	opacity: 0.85;
	margin: 0 0 14px;
}

.darka-testimonial-card strong {
	display: block;
	font-size: 14px;
}

/* ---------- 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: 15px;
	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: 14px;
	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%;
	padding: 12px 14px;
	border-radius: 8px;
	border: 1px solid var(--darka-border);
	background: var(--darka-surface);
	color: var(--darka-text);
	font-family: inherit;
	margin-top: 6px;
}

/* ---------- Pagamentos (Fase 6) ---------- */

.darka-price-original,
.darka-course-card__price-original {
	font-size: 13px;
	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: 13px;
	color: var(--darka-links);
	text-decoration: none;
	margin-bottom: 16px;
}

.darka-purchase-back:hover {
	text-decoration: underline;
}

.darka-purchase-amount {
	font-size: 26px;
	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: 14px;
	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: 13px;
	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: 13px;
}

.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: 14px;
}

.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: 10px;
	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: 12px;
	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: 12px;
	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: 13px;
}

.darka-notification time {
	font-size: 11px;
	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;
}

/* Em ecrãs muito estreitos, evita que os popups (notificações e perfil)
   ultrapassem a largura do ecrã — não havia nenhum limite antes disto. */
@media (max-width: 380px) {
	.darka-notifications-panel {
		width: calc(100vw - 32px);
	}
}

/* ---------- 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: 13px;
}

.darka-chat-message p {
	margin: 0 0 2px;
}

.darka-chat-message time {
	font-size: 10px;
	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: 14px;
	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: 14px;
}

.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: 12px;
	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: 14px;
}

.darka-certificate-participation-notice {
	max-width: 720px;
	font-size: 13px;
	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: 14px;
	opacity: 0.8;
}

.darka-link-card .darka-btn-primary {
	align-self: flex-start;
	margin-top: 4px;
}

