/* ---- fonts (self-hosted, SIL OFL: assets/fonts/OFL.txt) ---- */
@font-face {
	font-family: 'Geist Variable';
	font-style: normal;
	font-display: swap;
	font-weight: 100 900;
	src: url(fonts/geist-latin-wght-normal.woff2) format('woff2-variations');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Geist Variable';
	font-style: normal;
	font-display: swap;
	font-weight: 100 900;
	src: url(fonts/geist-latin-ext-wght-normal.woff2) format('woff2-variations');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Geist Mono Variable';
	font-style: normal;
	font-display: swap;
	font-weight: 100 900;
	src: url(fonts/geist-mono-latin-wght-normal.woff2) format('woff2-variations');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Geist Mono Variable';
	font-style: normal;
	font-display: swap;
	font-weight: 100 900;
	src: url(fonts/geist-mono-latin-ext-wght-normal.woff2) format('woff2-variations');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ---- tokens: the Enterprise ("Obsidian") palette of the app ---- */
:root {
	color-scheme: dark;

	--c-canvas: #07080a;
	--c-canvas-deep: #050607;
	--c-surface: #0b0d10;
	--c-surface-2: #111419;
	--c-line: #16191e;
	--c-line-strong: #23272e;

	--c-ink: #eceef1;
	--c-ink-2: #8a919c;
	--c-ink-3: #7a818c;
	--c-ghost: rgb(236 238 241 / 0.08);

	--c-signal: #2fd17c;
	--c-signal-ink: #7be3a8;
	--c-signal-soft: rgb(47 209 124 / 0.12);
	--c-advisory: #f2b033;
	--c-advisory-ink: #f7c766;
	--c-advisory-soft: rgb(242 176 51 / 0.13);
	--c-warning: #ff5c5c;
	--c-warning-ink: #ff8a8a;
	--c-warning-soft: rgb(255 92 92 / 0.13);
	--c-info: #7da9ff;
	--c-info-ink: #b3ccff;
	--c-info-soft: rgb(125 169 255 / 0.13);

	/* The solid button is ink on black, not green: green means "up". */
	--c-primary: #eceef1;
	--c-on-primary: #07080a;
	--c-focus: #7da9ff;

	--c-river-up: #1d5e3c;
	--c-river-warn: #a7761c;
	--c-river-down: #c24040;
	--c-river-none: #13161a;

	--shadow-lift: 0 1px 0 rgb(255 255 255 / 0.02) inset, 0 1px 2px rgb(0 0 0 / 0.5);
	--shadow-float: 0 2px 8px rgb(0 0 0 / 0.5), 0 24px 48px -16px rgb(0 0 0 / 0.8);

	--font-ui: 'Geist Variable', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
	--font-code: 'Geist Mono Variable', ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace;

	--radius-plate: 6px;
	--radius-btn: 8px;
	--radius-card: 12px;

	--head-h: 52px;
	--gutter: 16px;
	--ease: cubic-bezier(0.16, 1, 0.3, 1);
}

/* ---- base ---- */
*,
*::before,
*::after {
	box-sizing: border-box;
}
html {
	-webkit-text-size-adjust: 100%;
	text-size-adjust: 100%;
	scroll-padding-top: calc(var(--head-h) + 16px);
}
body {
	margin: 0;
	background: var(--c-canvas);
	color: var(--c-ink);
	font-family: var(--font-ui);
	font-size: 0.9375rem;
	line-height: 1.6;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	overflow-x: hidden;
}
img,
svg {
	display: block;
	max-width: 100%;
}
h1,
h2,
h3,
p,
ul,
ol,
figure {
	margin: 0;
}
ul,
ol {
	padding: 0;
	list-style: none;
}
h1,
h2,
h3 {
	font-weight: 600;
	letter-spacing: -0.02em;
	line-height: 1.2;
	text-wrap: balance;
	overflow-wrap: anywhere;
}
p {
	text-wrap: pretty;
}
a {
	color: var(--c-info-ink);
	text-decoration: underline;
	text-decoration-color: rgb(125 169 255 / 0.35);
	text-underline-offset: 3px;
}
a:hover {
	text-decoration-color: currentColor;
}
:focus-visible {
	outline: 2px solid var(--c-focus);
	outline-offset: 2px;
	border-radius: 4px;
}
code,
kbd,
pre,
samp {
	font-family: var(--font-code);
	font-size: 0.85em;
}
:not(pre) > code {
	padding: 1px 5px;
	border: 1px solid var(--c-line-strong);
	border-radius: 4px;
	background: var(--c-surface-2);
	color: var(--c-ink);
	overflow-wrap: anywhere;
}
strong {
	font-weight: 600;
	color: var(--c-ink);
}
::selection {
	background: rgb(125 169 255 / 0.3);
}
.muted {
	color: var(--c-ink-2);
}
.tnum,
.num {
	font-variant-numeric: tabular-nums;
}
.skip {
	position: absolute;
	left: 8px;
	top: -60px;
	z-index: 100;
	padding: 10px 14px;
	border-radius: var(--radius-btn);
	background: var(--c-primary);
	color: var(--c-on-primary);
	font-weight: 600;
	text-decoration: none;
}
.skip:focus {
	top: 8px;
}
.wrap {
	width: 100%;
	max-width: 1160px;
	margin-inline: auto;
	padding-inline: var(--gutter);
}
@media (min-width: 600px) {
	:root {
		--gutter: 24px;
	}
}
@media (min-width: 1200px) {
	:root {
		--gutter: 32px;
	}
}

/* ---- header: a classic horizontal bar ---- */
.sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
}
.topbar {
	position: sticky;
	top: 0;
	z-index: 30;
	height: var(--head-h);
	border-bottom: 1px solid var(--c-line);
	background: rgb(7 8 10 / 0.92);
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
}
.topbar .wrap {
	display: flex;
	align-items: center;
	gap: 16px;
	height: 100%;
	max-width: 1280px;
}
.brand {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	min-height: 40px;
	color: var(--c-ink);
	font-size: 0.9375rem;
	font-weight: 600;
	letter-spacing: -0.01em;
	text-decoration: none;
	white-space: nowrap;
}
.brand img {
	width: 28px;
	height: 28px;
	border-radius: 7px;
}
.nav {
	display: none;
}
@media (min-width: 1140px) {
	.nav {
		display: flex;
		align-items: center;
		gap: 2px;
		margin-left: 12px;
	}
	.nav a {
		display: inline-flex;
		align-items: center;
		height: 36px;
		padding: 0 11px;
		border-radius: var(--radius-btn);
		color: var(--c-ink-2);
		font-size: 0.875rem;
		font-weight: 500;
		text-decoration: none;
		white-space: nowrap;
	}
	.nav a:hover {
		color: var(--c-ink);
	}
	.nav a[aria-current] {
		color: var(--c-ink);
		box-shadow: inset 0 -2px 0 var(--c-info);
		border-radius: 0;
	}
	.nav .nav-extra {
		display: none;
	}
}
.actions {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-left: auto;
}
.actions .btn {
	display: none;
}
@media (min-width: 600px) {
	.actions .btn {
		display: inline-flex;
	}
}
@media (min-width: 1140px) and (max-width: 1279px) {
	.actions .gh span {
		display: none;
	}
	.actions .gh {
		padding: 0 10px;
	}
}
.menu-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border: 1px solid var(--c-line-strong);
	border-radius: var(--radius-btn);
	background: var(--c-surface);
	color: var(--c-ink);
	cursor: pointer;
}
.menu-btn span,
.menu-btn span::before,
.menu-btn span::after {
	display: block;
	width: 16px;
	height: 1.5px;
	border-radius: 1px;
	background: currentColor;
	transition: transform 0.2s var(--ease);
}
.menu-btn span {
	position: relative;
}
.menu-btn span::before,
.menu-btn span::after {
	content: '';
	position: absolute;
	left: 0;
}
.menu-btn span::before {
	top: -5px;
}
.menu-btn span::after {
	top: 5px;
}
.menu-open .menu-btn span {
	background: transparent;
}
.menu-open .menu-btn span::before {
	transform: translateY(5px) rotate(45deg);
}
.menu-open .menu-btn span::after {
	transform: translateY(-5px) rotate(-45deg);
}
@media (min-width: 1140px) {
	.menu-btn {
		display: none;
	}
}
@media (max-width: 1139px) {
	.menu-open .nav {
		position: fixed;
		top: var(--head-h);
		left: 0;
		right: 0;
		z-index: 29;
		display: grid;
		gap: 2px;
		max-height: calc(100dvh - var(--head-h));
		overflow-y: auto;
		padding: 8px var(--gutter) 16px;
		border-bottom: 1px solid var(--c-line);
		background: var(--c-canvas-deep);
		box-shadow: var(--shadow-float);
	}
	.menu-open .nav a {
		display: flex;
		align-items: center;
		min-height: 44px;
		padding: 0 12px;
		border-radius: var(--radius-btn);
		color: var(--c-ink);
		font-weight: 500;
		text-decoration: none;
	}
	.menu-open .nav a:hover,
	.menu-open .nav a[aria-current] {
		background: var(--c-surface-2);
	}
}

/* language selector */
.lang {
	position: relative;
}
.lang summary {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	height: 40px;
	padding: 0 10px;
	border: 1px solid var(--c-line-strong);
	border-radius: var(--radius-btn);
	background: var(--c-surface);
	color: var(--c-ink-2);
	font-family: var(--font-code);
	font-size: 0.75rem;
	font-weight: 500;
	cursor: pointer;
	list-style: none;
}
@media (min-width: 1140px) {
	.lang summary {
		height: 36px;
	}
}
.lang summary::-webkit-details-marker {
	display: none;
}
.lang summary:hover {
	color: var(--c-ink);
}
.lang summary svg {
	width: 14px;
	height: 14px;
}
.lang ul {
	position: absolute;
	right: 0;
	top: calc(100% + 6px);
	z-index: 40;
	min-width: 200px;
	padding: 4px;
	border: 1px solid var(--c-line-strong);
	border-radius: 10px;
	background: var(--c-surface);
	box-shadow: var(--shadow-float);
}
.lang a {
	display: flex;
	align-items: center;
	min-height: 40px;
	padding: 0 10px;
	border-radius: 6px;
	color: var(--c-ink);
	font-size: 0.8125rem;
	text-decoration: none;
}
.lang a:hover,
.lang a[aria-current] {
	background: var(--c-surface-2);
}
.lang a[aria-current] {
	font-weight: 600;
}
.lang a[aria-current]::after {
	content: '';
	width: 6px;
	height: 6px;
	margin-left: auto;
	border-radius: 50%;
	background: var(--c-info);
}

/* ---- buttons, plates, marks ---- */
.btn {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	min-height: 40px;
	padding: 0 16px;
	border: 1px solid transparent;
	border-radius: var(--radius-btn);
	font-family: inherit;
	font-size: 0.875rem;
	font-weight: 600;
	line-height: 1.2;
	text-align: center;
	text-decoration: none;
	cursor: pointer;
	transition: filter 0.2s, border-color 0.2s, background-color 0.2s, transform 0.1s;
}
.btn:active {
	transform: translateY(1px);
}
.btn svg {
	width: 16px;
	height: 16px;
	flex-shrink: 0;
}
.btn-primary {
	background: var(--c-primary);
	color: var(--c-on-primary);
	box-shadow: var(--shadow-lift);
}
.btn-primary:hover {
	filter: brightness(1.1);
}
.btn-secondary {
	border-color: var(--c-line-strong);
	background: var(--c-surface);
	color: var(--c-ink);
	box-shadow: var(--shadow-lift);
}
.btn-secondary:hover {
	border-color: var(--c-ink-3);
}
.btn-lg {
	min-height: 48px;
	padding: 0 22px;
	font-size: 0.9375rem;
}
.btn-sm {
	min-height: 36px;
	padding: 0 12px;
	font-size: 0.8125rem;
}
@media (max-width: 1139px) {
	.btn-sm {
		min-height: 40px;
	}
}
.plate {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	height: 22px;
	padding: 0 8px;
	border: 1px solid var(--c-line);
	border-radius: var(--radius-plate);
	background: var(--c-ghost);
	color: var(--c-ink-2);
	font-size: 0.75rem;
	font-weight: 600;
	line-height: 1;
	white-space: nowrap;
}
.plate svg {
	width: 13px;
	height: 13px;
	flex-shrink: 0;
}
.plate-signal {
	border-color: rgb(47 209 124 / 0.3);
	background: var(--c-signal-soft);
	color: var(--c-signal-ink);
}
.plate-info {
	border-color: rgb(125 169 255 / 0.3);
	background: var(--c-info-soft);
	color: var(--c-info-ink);
}
.plate-advisory {
	border-color: rgb(242 176 51 / 0.35);
	background: var(--c-advisory-soft);
	color: var(--c-advisory-ink);
}
.plate-warning {
	border-color: rgb(255 92 92 / 0.35);
	background: var(--c-warning-soft);
	color: var(--c-warning-ink);
}
/* A state is a shape and a word, never a colour alone (app: enterprise/status.ts). */
.mk {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-family: var(--font-code);
	font-size: 0.625rem;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	white-space: nowrap;
}
.mk::before {
	content: '';
	width: 7px;
	height: 7px;
	flex-shrink: 0;
}
.mk-up {
	color: var(--c-signal-ink);
}
.mk-up::before {
	border-radius: 50%;
	background: var(--c-signal);
}
.mk-deg {
	color: var(--c-advisory-ink);
}
.mk-deg::before {
	transform: rotate(45deg);
	background: var(--c-advisory);
}
.mk-down {
	color: var(--c-warning-ink);
}
.mk-down::before {
	border-radius: 2px;
	background: var(--c-warning);
}
.eyebrow,
.label-tape {
	color: var(--c-ink-3);
	font-family: var(--font-code);
	font-size: 0.6875rem;
	font-weight: 500;
	letter-spacing: 0.06em;
	text-transform: uppercase;
}

/* ---- sections ---- */
main {
	flex: 1;
}
.block {
	padding-block: 48px;
	border-top: 1px solid var(--c-line);
}
@media (min-width: 900px) {
	.block {
		padding-block: 72px;
	}
}
.block.flush {
	border-top: 0;
	padding-top: 8px;
}
.section-head {
	display: grid;
	gap: 10px;
	max-width: 44rem;
	margin-bottom: 28px;
}
.section-head h2 {
	font-size: clamp(1.375rem, 1.1rem + 1vw, 1.75rem);
}
.section-head p {
	color: var(--c-ink-2);
}
.section-head.tight {
	margin-bottom: 0;
}
.page-head {
	padding-block: 40px 28px;
}
@media (min-width: 900px) {
	.page-head {
		padding-block: 64px 36px;
	}
}
.page-head h1 {
	margin-top: 8px;
	font-size: clamp(1.75rem, 1.3rem + 2vw, 2.5rem);
}
.page-head .lede {
	max-width: 44rem;
	margin-top: 14px;
	color: var(--c-ink-2);
	font-size: 1rem;
}
.page-head .code-note {
	max-width: 44rem;
}
.crumbs {
	font-size: 0.8125rem;
}
.crumbs a {
	display: inline-flex;
	align-items: center;
	min-height: 40px;
	color: var(--c-ink-2);
}

/* cards (family cards from build.py, community cards) */
.cards {
	display: grid;
	gap: 12px;
}
@media (min-width: 640px) {
	.cards-fam,
	.cards-3 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
@media (min-width: 1000px) {
	.cards-fam,
	.cards-3 {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}
.card {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-width: 0;
	padding: 18px 20px;
	border: 1px solid var(--c-line);
	border-radius: var(--radius-card);
	background: var(--c-surface);
	transition: border-color 0.2s, background-color 0.2s;
}
.card:hover {
	border-color: var(--c-line-strong);
	background: var(--c-surface-2);
}
.card h3,
.card .card-h {
	font-size: 0.9375rem;
	letter-spacing: -0.01em;
}
.card h3 a {
	color: var(--c-ink);
	text-decoration: none;
}
.card h3 a::after {
	content: '';
	position: absolute;
	inset: 0;
	border-radius: inherit;
}
.card p {
	color: var(--c-ink-2);
	font-size: 0.875rem;
}
.card .label-tape {
	margin-top: auto;
	padding-top: 4px;
}
.more {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	min-height: 40px;
	font-size: 0.875rem;
	font-weight: 500;
}
.more::after {
	content: '→';
	transition: transform 0.2s var(--ease);
}
.more:hover::after {
	transform: translateX(3px);
}

/* ---- code blocks ---- */
.code {
	position: relative;
	max-width: min(40rem, 100%);
	min-width: 0;
	margin-inline: auto;
	border: 1px solid var(--c-line-strong);
	border-radius: 10px;
	background: var(--c-canvas-deep);
}
.code pre {
	margin: 0;
	padding: 16px 84px 16px 16px;
	overflow-x: auto;
	white-space: pre-wrap;
	overflow-wrap: anywhere;
	color: var(--c-ink);
	font-size: 0.8125rem;
	line-height: 1.75;
	scrollbar-width: thin;
}
.code .prompt,
.code .comment {
	color: var(--c-ink-3);
}
.code .prompt {
	user-select: none;
}
.copy {
	position: absolute;
	top: 10px;
	right: 10px;
	min-height: 32px;
	padding: 0 10px;
	border: 1px solid var(--c-line-strong);
	border-radius: 6px;
	background: var(--c-surface-2);
	color: var(--c-ink-2);
	font-family: inherit;
	font-size: 0.75rem;
	font-weight: 600;
	cursor: pointer;
}
@media (max-width: 959px) {
	.copy {
		min-height: 40px;
		top: 6px;
		right: 6px;
	}
}
.copy:hover {
	color: var(--c-ink);
}
.copy.done {
	border-color: rgb(47 209 124 / 0.4);
	color: var(--c-signal-ink);
}
.code-note {
	margin-top: 10px;
	color: var(--c-ink-2);
	font-size: 0.8125rem;
}
.cta {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}

/* ---- home ---- */
.hero {
	padding-block: 44px 56px;
	background:
		radial-gradient(48rem 26rem at 70% 10%, rgb(125 169 255 / 0.09), transparent 70%),
		linear-gradient(var(--c-line) 1px, transparent 1px) 0 0 / 44px 44px,
		linear-gradient(90deg, var(--c-line) 1px, transparent 1px) 0 0 / 44px 44px;
	border-bottom: 1px solid var(--c-line);
}
@media (min-width: 900px) {
	.hero {
		padding-block: 80px 88px;
	}
}
.hero-grid {
	display: grid;
	gap: 40px;
	max-width: 1280px;
}
@media (min-width: 1100px) {
	.hero-grid {
		grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
		gap: 56px;
		align-items: center;
	}
}
.hero-text {
	min-width: 0;
}
.hero h1 {
	margin-top: 18px;
	font-size: clamp(2.125rem, 1.4rem + 3vw, 3.4rem);
	letter-spacing: -0.035em;
	line-height: 1.08;
}
.benefits {
	display: grid;
	gap: 28px 32px;
}
@media (min-width: 640px) {
	.benefits {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
@media (min-width: 1000px) {
	.benefits {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}
.benefits li {
	min-width: 0;
}
.benefits h3 {
	font-size: 1rem;
}
.benefits p {
	margin-top: 6px;
	color: var(--c-ink-2);
	font-size: 0.9375rem;
}
.icon {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	margin-bottom: 14px;
	border: 1px solid var(--c-line-strong);
	border-radius: 10px;
	background: var(--c-canvas);
	color: var(--c-info);
}
.icon svg {
	width: 20px;
	height: 20px;
}
.card .icon {
	width: 36px;
	height: 36px;
	margin-bottom: 4px;
	background: var(--c-surface-2);
}
.card .icon svg {
	width: 18px;
	height: 18px;
}
/* ---- install ---- */
.steps {
	display: grid;
	max-width: 46rem;
	counter-reset: step;
}
.steps > li {
	position: relative;
	display: grid;
	gap: 10px;
	min-width: 0;
	padding: 0 0 32px 46px;
	counter-increment: step;
}
.steps > li::before {
	content: counter(step);
	position: absolute;
	left: 0;
	top: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	border: 1px solid var(--c-line-strong);
	border-radius: 8px;
	background: var(--c-surface-2);
	color: var(--c-ink);
	font-family: var(--font-code);
	font-size: 0.8125rem;
	font-weight: 600;
}
.steps > li::after {
	content: '';
	position: absolute;
	left: 15px;
	top: 38px;
	bottom: 8px;
	width: 1px;
	background: var(--c-line-strong);
}
.steps > li:last-child::after {
	display: none;
}
.steps h2 {
	font-size: 1.0625rem;
	line-height: 30px;
}
.steps p {
	color: var(--c-ink-2);
}
.steps .code {
	max-width: none;
}
.facts {
	display: grid;
	border-top: 1px solid var(--c-line);
}
.facts li {
	padding-block: 10px;
	border-bottom: 1px solid var(--c-line);
	font-size: 0.875rem;
}
.facts a {
	display: inline-flex;
	align-items: center;
	min-height: 24px;
}
.h-sm {
	margin-bottom: 14px;
	font-size: 1rem;
}

/* ---- community ---- */
.badges {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin-top: 4px;
}
.badges a {
	display: inline-flex;
	align-items: center;
	min-height: 40px;
	padding: 0 12px;
	border: 1px solid var(--c-line-strong);
	border-radius: var(--radius-btn);
	background: var(--c-surface);
	color: var(--c-ink);
	font-size: 0.8125rem;
	font-weight: 500;
	text-decoration: none;
}
.badges a:hover {
	border-color: var(--c-ink-3);
}

/* ---- devices catalogue ---- */
.filter {
	display: grid;
	gap: 14px;
	margin-bottom: 20px;
}
.search {
	display: grid;
	gap: 6px;
	max-width: 30rem;
}
.search[hidden] {
	display: none;
}
.search input {
	width: 100%;
	height: 40px;
	padding: 0 12px;
	border: 1px solid var(--c-line-strong);
	border-radius: var(--radius-btn);
	background: var(--c-surface);
	color: var(--c-ink);
	font: inherit;
	font-size: 0.875rem;
}
.search input::placeholder {
	color: var(--c-ink-3);
}
.search input:focus {
	outline: 2px solid var(--c-focus);
	outline-offset: 0;
	border-color: transparent;
}
.fam-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
}
.fam-chips a {
	display: inline-flex;
	align-items: center;
	min-height: 40px;
	padding: 0 12px;
	border: 1px solid var(--c-line);
	border-radius: var(--radius-btn);
	background: var(--c-surface);
	color: var(--c-ink-2);
	font-size: 0.8125rem;
	font-weight: 500;
	text-decoration: none;
}
@media (min-width: 960px) {
	.fam-chips a {
		min-height: 32px;
	}
}
.fam-chips a:hover {
	border-color: var(--c-line-strong);
	color: var(--c-ink);
}
.fam-chips a[aria-current] {
	border-color: var(--c-line-strong);
	background: var(--c-surface-2);
	color: var(--c-ink);
}
#dev-count {
	font-size: 0.8125rem;
}
.catalog {
	display: grid;
	gap: 8px;
}
@media (min-width: 640px) {
	.catalog {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
@media (min-width: 1000px) {
	.catalog {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}
.catalog > li {
	min-width: 0;
}
.catalog > li[hidden] {
	display: none;
}
.dev-card {
	display: grid;
	gap: 6px;
	height: 100%;
	padding: 14px 16px;
	border: 1px solid var(--c-line);
	border-radius: 10px;
	background: var(--c-surface);
	color: var(--c-ink);
	text-decoration: none;
	transition: border-color 0.2s, background-color 0.2s;
}
.dev-card:hover {
	border-color: var(--c-line-strong);
	background: var(--c-surface-2);
}
.dev-card .name {
	display: flex;
	align-items: center;
	gap: 8px;
	font-size: 0.875rem;
	font-weight: 600;
	overflow-wrap: anywhere;
}
.led {
	width: 7px;
	height: 7px;
	flex-shrink: 0;
	border-radius: 50%;
	background: var(--c-signal);
}
.dev-card .what {
	color: var(--c-ink-2);
	font-size: 0.8125rem;
	line-height: 1.5;
}
.dev-card .fam {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	margin-top: 4px;
	font-size: 0.625rem;
}
.dev-card .go::after {
	content: '→';
	display: inline-block;
	color: var(--c-ink-3);
	font-family: var(--font-ui);
	font-size: 0.875rem;
	transition: transform 0.2s var(--ease), color 0.2s;
}
.dev-card:hover .go::after {
	transform: translateX(3px);
	color: var(--c-ink);
}

/* ---- family pages ---- */
.devs {
	display: grid;
	gap: 16px;
	padding-bottom: 48px;
}
.dev {
	min-width: 0;
	padding: 20px;
	border: 1px solid var(--c-line);
	border-radius: var(--radius-card);
	background: var(--c-surface);
}
@media (min-width: 900px) {
	.dev {
		padding: 28px;
	}
}
.dev > header {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 6px 12px;
}
.dev > header h2 {
	font-size: 1.25rem;
}
.dev .summary {
	margin-top: 8px;
	color: var(--c-ink-2);
}
.dev-grid {
	display: grid;
	gap: 24px;
	margin-top: 22px;
	padding-top: 22px;
	border-top: 1px solid var(--c-line);
}
@media (min-width: 900px) {
	.dev-grid {
		grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
		gap: 40px;
	}
}
.dev-grid section {
	min-width: 0;
}
.dev-grid h3 {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 12px;
	font-size: 0.875rem;
}
.dev-grid p {
	font-size: 0.875rem;
}
.dev-grid p + p {
	margin-top: 8px;
}
.needs {
	display: grid;
	gap: 10px;
	margin-bottom: 10px;
}
.needs li {
	display: grid;
	gap: 2px;
	font-size: 0.875rem;
}
.needs span {
	color: var(--c-ink-2);
}
.rules {
	display: grid;
	border-top: 1px solid var(--c-line);
}
.rules li {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	gap: 2px 10px;
	align-items: start;
	padding-block: 9px;
	border-bottom: 1px solid var(--c-line);
	font-size: 0.8125rem;
}
.rules li .plate {
	grid-row: span 2;
	margin-top: 1px;
}
.rules strong {
	overflow-wrap: anywhere;
}
.rules span:not(.plate) {
	color: var(--c-ink-2);
}
details > summary {
	cursor: pointer;
}
.more-rules summary,
.setup summary {
	display: flex;
	align-items: center;
	min-height: 40px;
	color: var(--c-info-ink);
	font-size: 0.8125rem;
	font-weight: 500;
}
.setup {
	margin-top: 18px;
	padding-top: 6px;
	border-top: 1px solid var(--c-line);
}
.setup-steps {
	display: grid;
	gap: 12px;
	margin-top: 8px;
	padding-left: 20px;
	list-style: decimal;
	font-size: 0.875rem;
}
.setup-steps li {
	min-width: 0;
}
.setup-steps li::marker {
	color: var(--c-ink-3);
	font-family: var(--font-code);
}
.setup-steps pre {
	margin: 8px 0 0;
	padding: 12px 14px;
	overflow-x: auto;
	border: 1px solid var(--c-line-strong);
	border-radius: 8px;
	background: var(--c-canvas-deep);
	font-size: 0.75rem;
}
.warn {
	margin-top: 12px;
	padding: 10px 12px;
	border: 1px solid rgb(242 176 51 / 0.3);
	border-radius: 8px;
	background: var(--c-advisory-soft);
	font-size: 0.8125rem;
}
.dev-doc {
	margin-top: 18px;
}

/* ---- roadmap ---- */
.rm-discuss {
	margin-bottom: 24px;
	color: var(--c-ink-2);
}
.rm-sec {
	padding-block: 28px;
	border-top: 1px solid var(--c-line);
}
.rm-head {
	display: grid;
	gap: 4px;
	margin-bottom: 14px;
}
.rm-head h2 {
	font-size: 1.125rem;
}
.rm-list {
	display: grid;
	overflow: hidden;
	border: 1px solid var(--c-line);
	border-radius: var(--radius-card);
	background: var(--c-surface);
}
.rm-list li {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: 6px;
	padding: 12px 16px;
	border-top: 1px solid var(--c-line);
	font-size: 0.875rem;
}
.rm-list li:first-child {
	border-top: 0;
}
.rm-list .plate {
	justify-self: start;
}
@media (min-width: 700px) {
	.rm-list li {
		grid-template-columns: 9.5rem minmax(0, 1fr);
		gap: 14px;
		align-items: start;
	}
}
.rm-vote-box {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 4px 14px;
	grid-column: 1 / -1;
}
@media (min-width: 700px) {
	.rm-vote-box {
		grid-column: 2;
	}
}
.rm-votes {
	font-weight: 600;
}
.rm-vote {
	display: inline-flex;
	align-items: center;
	min-height: 40px;
	text-decoration: underline;
}
.rm-ver {
	font-family: var(--font-code);
	font-size: 0.8125rem;
}
.rm-group {
	border: 1px solid var(--c-line);
	border-radius: 10px;
	background: var(--c-surface);
}
.rm-group + .rm-group {
	margin-top: 6px;
}
.rm-group summary {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px 12px;
	min-height: 44px;
	padding: 8px 14px;
	list-style: none;
}
.rm-group summary::-webkit-details-marker {
	display: none;
}
.rm-group summary::before {
	content: '';
	width: 6px;
	height: 6px;
	border-right: 1.5px solid var(--c-ink-3);
	border-bottom: 1.5px solid var(--c-ink-3);
	transform: rotate(-45deg);
	transition: transform 0.2s var(--ease);
}
.rm-group[open] summary::before {
	transform: rotate(45deg);
}
.rm-gtitle {
	font-size: 0.875rem;
	font-weight: 600;
}
.rm-count {
	margin-left: auto;
	color: var(--c-ink-3);
	font-family: var(--font-code);
	font-size: 0.6875rem;
}
.rm-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	padding: 4px 14px 14px;
}
.rm-chips li {
	padding: 3px 9px;
	border: 1px solid var(--c-line);
	border-radius: 6px;
	background: var(--c-canvas);
	color: var(--c-ink-2);
	font-size: 0.8125rem;
}
.rm-foot {
	margin-top: 24px;
}

/* ---- footer: columns ---- */
footer {
	padding-block: 48px 28px;
	border-top: 1px solid var(--c-line);
	background: var(--c-canvas-deep);
	color: var(--c-ink-2);
	font-size: 0.875rem;
}
.foot-grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 32px 24px;
}
@media (min-width: 900px) {
	.foot-grid {
		grid-template-columns: minmax(0, 1.4fr) repeat(4, minmax(0, 1fr)) minmax(0, 1.4fr);
	}
}
.foot-about,
.foot-support {
	grid-column: 1 / -1;
}
@media (min-width: 900px) {
	.foot-about,
	.foot-support {
		grid-column: auto;
	}
}
.foot-grid > * {
	min-width: 0;
}
.foot-grid h2 {
	margin-bottom: 10px;
	color: var(--c-ink);
	font-size: 0.8125rem;
	font-weight: 600;
	letter-spacing: 0;
}
.foot-grid ul {
	display: grid;
}
.foot-grid ul a {
	display: inline-flex;
	align-items: center;
	min-height: 40px;
	color: var(--c-ink-2);
	text-decoration: none;
}
@media (min-width: 900px) {
	.foot-grid ul a {
		min-height: 30px;
	}
}
.foot-grid ul a:hover,
.foot-grid ul a[aria-current] {
	color: var(--c-ink);
}
.foot-about p + p,
.foot-support p + p {
	margin-top: 10px;
}
.foot-brand {
	display: flex;
	align-items: center;
	gap: 10px;
	color: var(--c-ink);
	font-weight: 600;
}
.foot-brand img {
	width: 24px;
	height: 24px;
	border-radius: 6px;
}
.foot-ver a {
	color: var(--c-ink-3);
	font-family: var(--font-code);
	font-size: 0.75rem;
}
.foot-support p:not(:first-of-type) a:not(.btn) {
	display: inline-flex;
	align-items: center;
	min-height: 40px;
}
.foot-note {
	margin-top: 36px;
	padding-top: 20px;
	border-top: 1px solid var(--c-line);
	color: var(--c-ink-3);
	font-size: 0.75rem;
}

/* ---- 404 ---- */
.lost {
	display: grid;
	place-content: center;
	justify-items: center;
	gap: 16px;
	min-height: 100vh;
	min-height: 100dvh;
	padding: 48px var(--gutter);
	text-align: center;
}
.lost img {
	width: 56px;
	height: 56px;
	border-radius: 14px;
}
.lost h1 {
	font-size: clamp(1.5rem, 1.2rem + 1.5vw, 2.25rem);
}

/* ---- motion: a block settles in once, nothing more ---- */
.js .reveal {
	opacity: 0;
	transform: translateY(8px);
}
.js .reveal.in {
	opacity: 1;
	transform: none;
	transition: opacity 0.5s var(--ease) var(--rd, 0ms), transform 0.5s var(--ease) var(--rd, 0ms);
}
@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		animation: none !important;
		transition: none !important;
	}
}

/* selfhostr: the DumbMonit site charter, shared by the four showcase sites.
   Same near-black ground, same tokens, Geist and Geist Mono, hairline borders; green (signal) is the accent.
   A project may colour small details only (--proj: glyphs, dots), never backgrounds or titles. */
:root {
	color-scheme: dark;
	--c-info: #2fd17c;
	--c-info-ink: #7be3a8;
	--c-info-soft: rgb(47 209 124 / 0.12);
	--c-focus: #2fd17c;
	--proj: #2fd17c;
}
a {
	text-decoration-color: rgb(47 209 124 / 0.35);
}
::selection {
	background: rgb(47 209 124 / 0.3);
}
.plate-info {
	border-color: rgb(47 209 124 / 0.3);
}
.hero {
	background:
		radial-gradient(48rem 26rem at 70% 10%, rgb(47 209 124 / 0.07), transparent 70%),
		linear-gradient(var(--c-line) 1px, transparent 1px) 0 0 / 44px 44px,
		linear-gradient(90deg, var(--c-line) 1px, transparent 1px) 0 0 / 44px 44px;
}

/* ---- header additions ---- */
.brand .org {
	color: var(--c-ink-3);
	font-weight: 500;
}

/* ---- hero ---- */
.hero .lede {
	max-width: 38rem;
	margin-top: 16px;
	color: var(--c-ink-2);
	font-size: 1.0625rem;
}
.hero .cta {
	margin-top: 26px;
}
.status-row {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
.hero-side {
	min-width: 0;
}
.hero-side .code {
	margin: 0;
	max-width: none;
}
.hero-side .code-note {
	margin-top: 10px;
}

/* the rack: a list of rows, like the product's own console */
.rack {
	border: 1px solid var(--c-line-strong);
	border-radius: var(--radius-card);
	background: var(--c-surface);
	box-shadow: var(--shadow-float);
	overflow: hidden;
}
.rack-head {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 16px;
	border-bottom: 1px solid var(--c-line);
	background: var(--c-surface-2);
	color: var(--c-ink-3);
	font-family: var(--font-code);
	font-size: 0.6875rem;
	letter-spacing: 0.06em;
	text-transform: uppercase;
}
.rack ul {
	display: grid;
}
.rack li a {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: 2px 12px;
	align-items: center;
	min-height: 52px;
	padding: 10px 16px;
	border-bottom: 1px solid var(--c-line);
	color: var(--c-ink);
	text-decoration: none;
}
.rack li:last-child a {
	border-bottom: 0;
}
.rack li a:hover {
	background: var(--c-surface-2);
}
.rack .nm {
	font-weight: 600;
}
.rack .ty {
	color: var(--c-ink-3);
	font-family: var(--font-code);
	font-size: 0.75rem;
	text-align: right;
}
.rack .host {
	grid-column: 1 / -1;
	color: var(--c-ink-3);
	font-family: var(--font-code);
	font-size: 0.75rem;
}

/* ---- project cards ---- */
.cards-proj {
	display: grid;
	gap: 12px;
}
@media (min-width: 700px) {
	.cards-proj {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
@media (min-width: 1040px) {
	.cards-proj {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}
.card .links {
	display: flex;
	flex-wrap: wrap;
	gap: 4px 16px;
	margin-top: auto;
	padding-top: 8px;
}
.card .links a {
	position: relative;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	min-height: 40px;
	font-size: 0.8125rem;
	font-weight: 500;
}
.card-h {
	font-weight: 600;
}
.card .host {
	color: var(--c-ink-3);
	font-family: var(--font-code);
	font-size: 0.75rem;
}

/* ---- prose (about) ---- */
.prose {
	display: grid;
	gap: 14px;
	max-width: 40rem;
}
.prose p {
	color: var(--c-ink-2);
	font-size: 1rem;
}
.prose h2 {
	margin-top: 18px;
	font-size: 1.25rem;
}
.people {
	display: grid;
	gap: 12px;
	margin-top: 8px;
}
@media (min-width: 640px) {
	.people {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
.list-plain {
	display: grid;
	gap: 8px;
	color: var(--c-ink-2);
}
.list-plain li {
	padding-left: 18px;
	position: relative;
}
.list-plain li::before {
	content: '';
	position: absolute;
	left: 0;
	top: 0.7em;
	width: 7px;
	height: 7px;
	border-radius: 2px;
	background: var(--c-info);
}

/* ---- project sites ---- */
.cells-3 {
	display: grid;
	gap: 12px;
}
@media (min-width: 640px) {
	.cells-3 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
@media (min-width: 1000px) {
	.cells-3 {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}
.states {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
.notice {
	display: flex;
	gap: 10px;
	max-width: 46rem;
	margin-top: 20px;
	padding: 12px 16px;
	border: 1px solid color-mix(in srgb, var(--c-advisory-ink) 35%, transparent);
	border-radius: var(--radius-card);
	background: var(--c-advisory-soft);
	color: var(--c-ink);
	font-size: 0.875rem;
}
.steps .code {
	margin: 0;
	max-width: none;
}
.code .prompt,
.code .comment {
	color: var(--c-ink-3);
}
.cta-end {
	display: grid;
	justify-items: center;
	gap: 14px;
	text-align: center;
}
.cta-end p {
	color: var(--c-ink-2);
	max-width: 36rem;
}
.cta-end .cta {
	justify-content: center;
}
.lost .cta {
	justify-content: center;
}
.lost p {
	color: var(--c-ink-2);
}
.steps h3 {
	font-size: 1.0625rem;
	line-height: 30px;
}
.ask {
	display: grid;
}
.ask li {
	padding: 12px 16px;
	border-bottom: 1px solid var(--c-line);
	color: var(--c-ink);
}
.ask li:last-child {
	border-bottom: 0;
}
.notice .nicon {
	width: 18px;
	height: 18px;
	flex-shrink: 0;
	margin-top: 2px;
	color: var(--c-advisory-ink);
}
.stack {
	margin-top: 36px;
}
.states {
	margin-top: 4px;
}
@media (min-width: 640px) {
	.benefits.b4 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}
@media (min-width: 1000px) {
	.benefits.b4 {
		grid-template-columns: repeat(4, minmax(0, 1fr));
	}
}

/* kegtrack.selfhostr.io : une page, calquée sur la maquette. Manrope et IBM Plex Mono, auto-hébergées. */
@font-face{font-family:'Manrope';font-style:normal;font-display:swap;font-weight:400;src:url(fonts/manrope-latin-400-normal.woff2) format('woff2')}
@font-face{font-family:'Manrope';font-style:normal;font-display:swap;font-weight:600;src:url(fonts/manrope-latin-600-normal.woff2) format('woff2')}
@font-face{font-family:'Manrope';font-style:normal;font-display:swap;font-weight:800;src:url(fonts/manrope-latin-800-normal.woff2) format('woff2')}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-display:swap;font-weight:400;src:url(fonts/ibm-plex-mono-latin-400-normal.woff2) format('woff2')}
body{margin:0;background:#0b0a08}
.kt{background:#0b0a08;color:#f3ecdc;font-family:'Manrope','Segoe UI',system-ui,sans-serif;font-size:16px;line-height:1.55;padding:0 24px;min-height:100vh}
.kt a{color:#f3ecdc}
.kt a:hover{color:#f2b632}
.kt h1,.kt h2,.kt p,.kt pre,.kt figure,.kt ul{margin:0}
.kt-head,.kt-hero,.kt-lower,.kt-foot{max-width:1120px;margin-inline:auto}
.kt-head{min-height:76px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 24px}
.kt-brand{display:flex;align-items:center;gap:10px;font-weight:800;text-decoration:none}
.kt-brand img{display:block;border-radius:7px}
.kt-nav{display:flex;gap:22px;font-size:14px;font-weight:600}
.kt-nav a{text-decoration:none;min-height:44px;display:flex;align-items:center}
.kt-hero{padding:48px 0 72px;display:flex;flex-wrap:wrap;gap:40px 56px;align-items:center}
.kt-hero-text{flex:1 1 380px;display:flex;flex-direction:column;gap:18px}
.kt-hero h1{font-size:clamp(36px,4.4vw,52px);line-height:1.1;font-weight:800;letter-spacing:-.03em;text-wrap:balance}
.kt-hero-text p{font-size:17px;color:#bdb5a3;text-wrap:pretty}
.kt-cta{display:flex;flex-wrap:wrap;gap:10px;font-size:15px;font-weight:800}
.kt .kt-btn{display:flex;align-items:center;min-height:46px;padding:0 20px;border:1px solid #3a3425;border-radius:6px;text-decoration:none}
.kt .kt-btn-main{background:#e8a317;border-color:#e8a317;color:#0b0a08}
.kt .kt-btn-main:hover{color:#0b0a08;background:#f2b632;border-color:#f2b632}
.kt-shot{flex:999 1 560px;min-width:0;border:1px solid #2a2619;border-radius:10px;overflow:hidden}
.kt-shot img{display:block;width:100%;height:auto}
.kt-lower{padding:0 0 72px;display:flex;flex-wrap:wrap;gap:40px 56px;align-items:flex-start}
.kt-feats{flex:1 1 340px;padding:0;list-style:none;display:flex;flex-direction:column;gap:18px}
.kt-feats strong{font-weight:800}
.kt-feats span{color:#bdb5a3}
.kt-install{flex:999 1 520px;min-width:0;display:flex;flex-direction:column;gap:12px;scroll-margin-top:16px}
.kt-install h2{font-size:22px;font-weight:800;letter-spacing:-.02em}
.kt-install pre{padding:20px;background:#15130e;border:1px solid #2a2619;border-radius:8px;font-family:'IBM Plex Mono',ui-monospace,monospace;font-size:13px;line-height:1.8;overflow-x:auto;color:#f3ecdc}
.kt-install p{font-size:14px;color:#bdb5a3}
.kt-foot{background:none;padding:20px 0 32px;border-top:1px solid #2a2619;font-size:13px;color:#bdb5a3}
@media (max-width:480px){.kt{padding:0 20px}.kt-hero{padding:32px 0 48px}.kt-lower{padding-bottom:48px}}
