/* ==========================================================================
 * Layout, navbar, alerts, theme (loaded on every page via default layout)
 * ========================================================================== */

body {
	min-height: 100vh;
	display: flex;
	flex-direction: column;
}

.content {
	flex: 1;
}

.navbar-brand {
	font-weight: bold;
}

/* Fixed alert overlay */
.alert-overlay {
	position: fixed;
	top: 70px;
	left: 50%;
	transform: translateX(-50%);
	z-index: 1050;
	min-width: 300px;
	max-width: 600px;
	width: auto;
	box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
	animation: slideDown 0.3s ease-out;
}

.alert-overlay.fade {
	transition: opacity 0.5s ease-out, transform 0.5s ease-out !important;
}

.alert-overlay.fade.show {
	opacity: 1;
	transform: translateX(-50%) translateY(0);
}

.alert-overlay.fade:not(.show) {
	opacity: 0 !important;
	transform: translateX(-50%) translateY(-20px) !important;
}

@keyframes slideDown {
	from {
		opacity: 0;
		transform: translateX(-50%) translateY(-20px);
	}
	to {
		opacity: 1;
		transform: translateX(-50%) translateY(0);
	}
}

@media (max-width: 768px) {
	.alert-overlay {
		left: 1rem;
		right: 1rem;
		transform: none;
		width: auto;
		min-width: auto;
	}

	.alert-overlay.fade.show {
		transform: translateY(0);
	}

	.alert-overlay.fade:not(.show) {
		opacity: 0 !important;
		transform: translateY(-20px) !important;
	}

	@keyframes slideDown {
		from {
			opacity: 0;
			transform: translateY(-20px);
		}
		to {
			opacity: 1;
			transform: translateY(0);
		}
	}
}

/* Theme toggle button */
.theme-toggle {
	background: none;
	border: none;
	cursor: pointer;
	padding: 0.5rem;
	margin-left: 0.5rem;
	transition: color 0.3s ease;
	font-size: 1em;
	display: flex;
	align-items: center;
}

.theme-toggle:hover {
	opacity: 0.8;
}

.theme-toggle i {
	font-size: 1em;
}

/* Navbar */
.navbar {
	background-color: lightgray !important;
	padding: 0 !important;
}

.navbar .navbar-nav {
	align-items: center;
}

.navbar .nav-item {
	display: flex;
	align-items: center;
}

.navbar .navbar-brand,
.navbar .nav-link {
	color: #000 !important;
	font-size: 1em !important;
	display: flex;
	align-items: center;
	padding: 0.5rem 1rem;
	margin: 0;
	line-height: 1.5;
}

.navbar .navbar-brand i,
.navbar .nav-link i {
	font-size: 1.1em;
	line-height: 1;
}

.navbar .nav-link i {
	margin-right: 8px;
}

.navbar .navbar-text {
	color: rgba(0, 0, 0, 0.3) !important;
	font-size: 1.2em !important;
	display: flex;
	align-items: center;
	margin: 0;
	line-height: 1.5;
}

.navbar .nav-link:hover {
	color: #333 !important;
}

.navbar .theme-toggle {
	color: #000 !important;
}

.navbar .navbar-toggler {
	border-color: rgba(0, 0, 0, 0.1);
}

.navbar .navbar-toggler-icon {
	background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}

.navbar .navbar-breadcrumbs .text-white {
	color: #000 !important;
}

.navbar .navbar-breadcrumbs .text-white-50 {
	color: rgba(0, 0, 0, 0.5) !important;
}

.navbar .navbar-breadcrumbs a {
	color: cornflowerblue !important;
}

[data-bs-theme="dark"] .navbar {
	background-color: #313539 !important;
}

[data-bs-theme="dark"] .navbar .navbar-brand,
[data-bs-theme="dark"] .navbar .nav-link {
	color: rgba(255, 255, 255, 0.75) !important;
}

[data-bs-theme="dark"] .navbar .navbar-text {
	color: rgba(255, 255, 255, 0.3) !important;
}

[data-bs-theme="dark"] .navbar .nav-link:hover {
	color: rgba(255, 255, 255, 1) !important;
}

[data-bs-theme="dark"] .navbar .theme-toggle {
	color: rgba(255, 255, 255, 0.75) !important;
}

[data-bs-theme="dark"] .navbar .navbar-toggler {
	border-color: rgba(255, 255, 255, 0.1);
}

[data-bs-theme="dark"] .navbar .navbar-toggler-icon {
	background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}

[data-bs-theme="dark"] .navbar .navbar-breadcrumbs .text-white {
	color: #fff !important;
}

[data-bs-theme="dark"] .navbar .navbar-breadcrumbs .text-white-50 {
	color: rgba(255, 255, 255, 0.5) !important;
}

[data-bs-theme="dark"] .navbar .navbar-breadcrumbs a {
	color: cornflowerblue !important;
}

[data-bs-theme="dark"] footer {
	background-color: #212529 !important;
	color: #adb5bd !important;
}

[data-bs-theme="dark"] footer p {
	color: #adb5bd !important;
}

[data-bs-theme="dark"] .card {
	background-color: #2d3238;
	border-color: #495057;
}

.alert {
	transition: background-color 0.3s ease, border-color 0.3s ease;
}

[data-bs-theme="dark"] .alert-overlay {
	box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
}

.navbar-breadcrumbs {
	font-size: 1em;
	display: flex;
	align-items: center;
}

.navbar-breadcrumbs .bi-chevron-right {
	font-size: 1em;
	font-weight: 900;
}

.navbar-breadcrumbs .hover-underline:hover {
	text-decoration: underline !important;
}

/* ==========================================================================
 * Landing page (main/index)
 * ========================================================================== */

.marlin-logo {
	width: 100%;
	max-width: 400px;
	height: auto;
	display: block;
	margin: 0 auto;
}

.marlin-logo #svgcolour {
	fill: #000;
	transition: fill 0.3s ease;
}

[data-bs-theme="dark"] .marlin-logo #svgcolour {
	fill: #fff;
}

/* ==========================================================================
 * Dashboard donation form
 * ========================================================================== */

.donation-form .table,
.donation-history .table {
	background-color: transparent;
	margin-bottom: 0.5rem;
}

.donation-form .table td,
.donation-form .table th,
.donation-history .table td,
.donation-history .table th {
	background-color: transparent;
	border-color: var(--bs-border-color);
}

/* Stacked +/- spinner buttons on the donation amount input */
.amount-spin {
	display: flex;
	flex-direction: column;
}

.amount-spin .btn {
	flex: 1 1 0;
	padding: 0 0.4rem;
	font-size: 0.7rem;
	line-height: 1;
	border-radius: 0;
}

.amount-spin .btn:first-child {
	border-top-right-radius: var(--bs-border-radius);
}

.amount-spin .btn:last-child {
	border-bottom-right-radius: var(--bs-border-radius);
	border-top: 0;
}

/* ==========================================================================
 * Firmware browser
 * ========================================================================== */

.changelog-row {
	display: table-row !important;
}

.changelog-row td {
	background-color: var(--bs-secondary-bg);
	border-top: 1px solid var(--bs-border-color);
	padding: 0 !important;
}

.changelog-wrapper {
	overflow: hidden;
	transition: max-height 0.35s ease, opacity 0.35s ease, padding 0.35s ease;
	max-height: 0;
	opacity: 0;
	padding: 0;
}

.changelog-row.show .changelog-wrapper,
.changelog-row.collapsing .changelog-wrapper {
	max-height: 2000px;
	opacity: 1;
	padding: 0.75rem;
}

.changelog-row:not(.show) .changelog-wrapper {
	max-height: 0;
	opacity: 0;
	padding: 0;
}

.changelog-content {
	background-color: var(--bs-tertiary-bg);
	border-radius: 0.375rem;
	padding: 1rem;
}

.changelog-text {
	white-space: pre-wrap;
	font-size: 0.9rem;
	color: var(--bs-body-color);
	background-color: transparent;
	border: none;
	font-family: 'Courier New', Courier, monospace;
	margin: 0;
}

[data-bs-theme="dark"] .changelog-content {
	background-color: #1a1d20;
}

.firmware-listing .table tbody td {
	vertical-align: middle;
}

.firmware-listing .table tbody tr:not(.changelog-row) {
	height: 60px;
}

.firmware-listing .table tbody tr:not(.changelog-row) td {
	height: 60px;
}

.changelog-toggle {
	padding: 0.25rem 0.5rem;
	border: none;
	background: transparent;
	color: cornflowerblue;
}

.changelog-toggle i {
	font-size: 1.5rem;
}

.changelog-toggle:hover {
	background-color: var(--bs-secondary-bg);
	color: cornflowerblue;
	opacity: 0.8;
}

.changelog-toggle[aria-expanded="true"] {
	color: cornflowerblue;
	opacity: 1;
}

.download-link {
	color: var(--bs-success);
	text-decoration: none;
	font-size: 1.5rem;
}

.download-link:hover {
	color: var(--bs-success);
	opacity: 0.7;
}

.membership-status {
	font-size: 0.85rem;
	color: var(--bs-secondary);
	font-style: italic;
	text-decoration: none;
}

.membership-status:hover {
	text-decoration: underline;
}

.readme-content {
	color: var(--bs-body-color);
}

.readme-text {
	white-space: pre-wrap;
	font-size: 0.95rem;
	color: var(--bs-body-color);
	background-color: transparent;
	border: none;
	font-family: inherit;
	margin: 0;
	line-height: 1.6;
}

.readme-text a {
	color: var(--bs-link-color);
	text-decoration: none;
}

.readme-text a:hover {
	color: var(--bs-link-hover-color);
	text-decoration: underline;
}

/* ==========================================================================
 * Firmware builder (configure / build / list / profiles)
 * ========================================================================== */

.throb-group {
	display: inline-flex;
	align-items: center;
	gap: 4px;
}

.icon-throb {
	display: inline-block;          /* transform needs a non-inline box */
	animation: throb 1.2s ease-in-out infinite both;
}

.throb-group .icon-throb:nth-child(1) { animation-delay: 0s;    }
.throb-group .icon-throb:nth-child(2) { animation-delay: 0.16s; }
.throb-group .icon-throb:nth-child(3) { animation-delay: 0.32s; }

@keyframes throb {
	0%, 80%, 100% { opacity: 0.3; transform: scale(0.85); }
	40%           { opacity: 1.0; transform: scale(1.15); }
}

/* Tabs sit on the body background and the active tab merges into the card
 * below — its bottom border is painted in the card colour, hiding the line */
.builder-configure .nav-tabs {
	margin-top: 0.5rem;
	border-bottom: 0;
	position: relative;
	z-index: 2;
}

.builder-configure .nav-tabs .nav-link {
	border: 1px solid transparent;
	color: var(--bs-body-color);
	margin-bottom: -1px;
}

.builder-configure .nav-tabs .nav-link:hover {
	border-color: transparent;
	background-color: rgba(0, 0, 0, 0.04);
}

[data-bs-theme="dark"] .builder-configure .nav-tabs .nav-link:hover {
	background-color: rgba(255, 255, 255, 0.04);
}

.builder-configure .nav-tabs .nav-link.active {
	background-color: var(--bs-tertiary-bg);
	border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-tertiary-bg);
	color: var(--bs-body-color);
	font-weight: 500;
}

/* Card body for the tab content */
.builder-configure .tab-content {
	background-color: var(--bs-tertiary-bg);
	border: 1px solid var(--bs-border-color);
	border-radius: var(--bs-border-radius);
}

.builder-tab-pane {
	padding: 1.5rem;
}

.builder-configure .tab-content .row {
	--bs-gutter-x: 3rem;
	row-gap: 0.75rem;
}

.builder-configure .input-group + .input-group,
.builder-configure .input-group + .form-check,
.builder-configure .form-check + .input-group {
	margin-top: 0.5rem;
}

.builder-configure .form-check + .form-check {
	margin-top: 0.25rem;
}

.builder-tab-pane h5,
.builder-tab-pane h6 {
	margin-top: 0.75rem;
	margin-bottom: 0.75rem;
	font-weight: 500;
}

.builder-tab-pane hr {
	margin: 1.25rem 0;
	opacity: 0.15;
}

.builder-configure .input-group-text {
	min-width: 9rem;
}

.builder-configure .input-group.mt-3 {
	margin-top: 1.5rem !important;
}

@media (min-width: 1600px) {
	.builder-tab-pane {
		padding: 1.5rem 2rem;
	}
	.builder-configure .tab-content .row {
		--bs-gutter-x: 4rem;
	}
	.builder-configure .input-group-text {
		min-width: 11rem;
	}
}

/* Drop the subtle row separator that table-hover renders against the body
 * background — looks cleaner without inner-card framing */
.builder-list .table > :not(caption) > * > *,
.builder-profiles .table > :not(caption) > * > *,
.firmware-listing .table > :not(caption) > * > * {
	background-color: transparent;
}

/* vim: set ts=4 sw=4 noexpandtab: */
