/* ============================================================================
   NOVA THEME — surcouche esthétique pour Ember
   Chargée après app.css et /css/dynamic, donc elle gagne sans !important
   (sauf sur les quelques règles Bootstrap déjà marquées important).
   Se désinstalle en retirant les deux <link>/<script> ajoutés aux templates.
   ========================================================================= */

/* ---------------------------------------------------------------- 1. Tokens */

:root {
	/* Palette Nova */
	--nv-violet: 139 92 246;
	--nv-indigo: 99 102 241;
	--nv-cyan: 34 211 238;
	--nv-pink: 244 114 182;
	--nv-amber: 251 146 60;

	--nv-ink: #05050a;
	--nv-surface: 14 14 22;
	--nv-surface-2: 20 20 32;
	--nv-line: 255 255 255;

	--nv-text: #eceaf5;
	--nv-muted: #8e8ba6;

	--nv-radius: 18px;
	--nv-radius-sm: 12px;
	--nv-ease: cubic-bezier(0.22, 1, 0.36, 1);
	--nv-ease-out: cubic-bezier(0.16, 1, 0.3, 1);

	/* Typographie. Chaque ambiance redéfinit ces jetons (section 34) : la
	   base ne connaît que les jetons, jamais un nom de police. */
	--nv-font-display: 'Space Grotesk', 'Inter', system-ui, sans-serif;
	--nv-font-body: 'Inter', system-ui, -apple-system, sans-serif;
	--nv-font-accent: 'Space Grotesk', 'Inter', system-ui, sans-serif;
	--nv-font-label: 'Inter', system-ui, sans-serif;
	--nv-font-mono: 'SFMono-Regular', ui-monospace, Menlo, monospace;
	--nv-body-features: 'cv02', 'cv03', 'cv04', 'ss01';
	--nv-body-size: 1rem;
	--nv-body-leading: 1.5;
	--nv-body-tracking: -0.011em;
	--nv-title-weight: 700;
	--nv-title-tracking: -0.03em;
	--nv-title-transform: none;
	--nv-title-style: normal;
	--nv-hero-weight: 700;
	--nv-hero-tracking: -0.03em;
	--nv-hero-leading: 0.92;
	--nv-hero-transform: none;
	--nv-hero-style: normal;
	--nv-nav-font: var(--nv-font-body);
	--nv-nav-weight: 500;
	--nv-nav-size: 0.94rem;
	--nv-nav-tracking: 0;
	--nv-nav-transform: none;
	--nv-btn-font: var(--nv-font-body);
	--nv-btn-weight: 600;
	--nv-btn-radius: 999px;
	--nv-btn-tracking: 0.005em;
	--nv-btn-transform: none;

	--nv-glow: 0 0 0 1px rgb(var(--nv-line) / 0.06),
		0 18px 40px -12px rgb(0 0 0 / 0.7),
		0 0 60px -30px rgb(var(--nv-violet) / 0.7);

	/* Rebranchement des variables Ember sur la palette Nova */
	--theme-primary-rgb: var(--nv-violet);
	--theme-secondary-rgb: var(--nv-cyan);
	--theme-bg-page-rgb: 5 5 10;
	--theme-bg-primary-rgb: var(--nv-surface);
	--theme-bg-secondary-rgb: 9 9 16;

	--theme-gradient: linear-gradient(
		110deg,
		rgb(var(--nv-violet)) 0%,
		rgb(var(--nv-indigo)) 40%,
		rgb(var(--nv-cyan)) 100%
	);
	--theme-border-radius: var(--nv-radius);
	--theme-focus-box-shadow: 0 0 0 3px rgb(var(--nv-violet) / 0.35);

	--bs-body-font-family: var(--nv-font-body);
	--bs-link-color: rgb(var(--nv-cyan));
	--bs-link-hover-color: rgb(var(--nv-violet));
}

/* Les variables Ember utilisent "r, g, b" ; on fournit les deux notations. */
:root {
	--theme-primary: rgb(139 92 246);
	--theme-secondary: rgb(34 211 238);
	--theme-bg-page: #05050a;
	--theme-bg-primary: rgb(14 14 22);
	--theme-bg-secondary: rgb(9 9 16);
	--bs-primary: rgb(139 92 246);
	--bs-primary-rgb: 139, 92, 246;
	--bs-secondary: rgb(34 211 238);
	--bs-secondary-rgb: 34, 211, 238;
}

/* ------------------------------------------------------------- 2. Base */

html {
	scroll-behavior: smooth;
}

body {
	background-color: var(--nv-ink);
	color: var(--nv-text);
	font-family: var(--nv-font-body);
	font-feature-settings: var(--nv-body-features);
	font-size: var(--nv-body-size);
	line-height: var(--nv-body-leading);
	letter-spacing: var(--nv-body-tracking);
	overflow-x: hidden;
}

::selection {
	background: rgb(var(--nv-violet) / 0.4);
	color: #fff;
}

::-webkit-scrollbar {
	width: 11px;
	height: 11px;
	background-color: #07070d;
}

::-webkit-scrollbar-thumb {
	background: linear-gradient(rgb(var(--nv-violet) / 0.8), rgb(var(--nv-cyan) / 0.6));
	border: 3px solid #07070d;
	border-radius: 99px;
}

::-webkit-scrollbar-thumb:hover {
	background: linear-gradient(rgb(var(--nv-violet)), rgb(var(--nv-cyan)));
}

*:focus-visible {
	outline: none;
	box-shadow: var(--theme-focus-box-shadow);
	border-radius: 6px;
}

/* --------------------------------------------------- 3. Décor de fond */

.nv-bg {
	position: fixed;
	inset: 0;
	z-index: -10;
	pointer-events: none;
	overflow: hidden;
	background:
		radial-gradient(120% 90% at 50% -20%, #16122b 0%, transparent 60%),
		var(--nv-ink);
}

.nv-blob {
	position: absolute;
	border-radius: 50%;
	opacity: 0.42;
	will-change: transform;
}

.nv-blob--1 {
	width: 46vw;
	height: 46vw;
	top: -14vw;
	left: -8vw;
	background: radial-gradient(circle, rgb(var(--nv-violet) / 0.85), transparent 68%);
	animation: nv-drift-a 26s var(--nv-ease) infinite alternate;
}

.nv-blob--2 {
	width: 40vw;
	height: 40vw;
	top: 22vh;
	right: -12vw;
	background: radial-gradient(circle, rgb(var(--nv-cyan) / 0.6), transparent 68%);
	animation: nv-drift-b 32s var(--nv-ease) infinite alternate;
}

.nv-blob--3 {
	width: 38vw;
	height: 38vw;
	bottom: -16vw;
	left: 28vw;
	background: radial-gradient(circle, rgb(var(--nv-pink) / 0.5), transparent 70%);
	animation: nv-drift-c 38s var(--nv-ease) infinite alternate;
}

@keyframes nv-drift-a {
	to { transform: translate3d(14vw, 10vh, 0) scale(1.25); }
}

@keyframes nv-drift-b {
	to { transform: translate3d(-16vw, -12vh, 0) scale(1.15); }
}

@keyframes nv-drift-c {
	to { transform: translate3d(10vw, -14vh, 0) scale(0.85); }
}

/* Grille perspective très discrète */
.nv-grid {
	position: absolute;
	inset: 0;
	background-image:
		linear-gradient(rgb(var(--nv-line) / 0.035) 1px, transparent 1px),
		linear-gradient(90deg, rgb(var(--nv-line) / 0.035) 1px, transparent 1px);
	background-size: 64px 64px;
	mask-image: radial-gradient(110% 70% at 50% 0%, #000 10%, transparent 75%);
	-webkit-mask-image: radial-gradient(110% 70% at 50% 0%, #000 10%, transparent 75%);
}

/* Grain filmique */
.nv-grain {
	position: absolute;
	inset: 0;
	opacity: 0.035;
	background-repeat: repeat;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* ------------------------------------------------- 4. Typographie */

.title,
.title-main,
h1, h2, h3, .h1, .h2, .h3,
.navbar-brand,
.card-title {
	font-family: var(--nv-font-display);
	letter-spacing: var(--nv-title-tracking);
}

:root {
	--nv-title-gradient: linear-gradient(
		96deg,
		#ffffff 0%,
		#ded7ff 20%,
		rgb(var(--nv-violet)) 44%,
		rgb(var(--nv-pink)) 60%,
		rgb(var(--nv-cyan)) 80%,
		#ffffff 100%
	);
}

.title-main {
	font-size: clamp(3.2rem, 11vw, 8.5rem);
	font-weight: var(--nv-hero-weight);
	line-height: var(--nv-hero-leading);
	letter-spacing: var(--nv-hero-tracking);
	text-transform: var(--nv-hero-transform);
	font-style: var(--nv-hero-style);
	background-image: var(--nv-title-gradient);
	background-size: 100% 100%;
	-webkit-background-clip: text;
	background-clip: text;
	-webkit-text-fill-color: transparent;
	color: transparent;
	filter: drop-shadow(0 14px 44px rgb(var(--nv-violet) / 0.4));
}

/* Une fois le titre découpé en lettres, le parent ne doit plus peindre de
   dégradé : Chrome le découpe sur une disposition décalée des enfants et
   fait apparaître un glyphe fantôme à gauche du premier caractère. */
.title-main.is-split {
	background-image: none;
	animation: none;
}

/* Chaque lettre reçoit le dégradé, décalé par le JS pour rester continu :
   un parent en background-clip:text ne peint pas à travers des enfants
   qui forment leur propre contexte d'empilement. */
.nv-char {
	background-image: var(--nv-title-gradient);
	background-repeat: no-repeat;
	-webkit-background-clip: text;
	background-clip: text;
	-webkit-text-fill-color: transparent;
	color: transparent;
}

/* Titres de section : liseré dégradé qui se dessine à la révélation */
.alternatebg > .title,
.page-header h1 {
	position: relative;
	display: block;
	width: fit-content;
	margin-inline: auto;
	padding-bottom: 0.45em;
	font-weight: var(--nv-title-weight);
	font-size: clamp(1.9rem, 4vw, 2.9rem);
	text-transform: var(--nv-title-transform);
	font-style: var(--nv-title-style);
}

.alternatebg > .title::after,
.page-header h1::after {
	content: '';
	position: absolute;
	left: 50%;
	bottom: 0.1em;
	height: 3px;
	width: 0;
	border-radius: 99px;
	background: var(--theme-gradient);
	box-shadow: 0 0 24px rgb(var(--nv-violet) / 0.8);
	transform: translateX(-50%);
	transition: width 1.1s var(--nv-ease-out) 0.15s;
}

.alternatebg.nv-in > .title::after,
.page-header.nv-in h1::after {
	width: 78px;
}

.text-muted {
	color: var(--nv-muted) !important;
}

/* --------------------------------------------------- 5. Barre de nav */

.navbar.navbar-primary {
	background: transparent !important;
	backdrop-filter: none;
	border-bottom: 1px solid transparent;
	padding-block: 0.9rem;
	transition: background 0.5s var(--nv-ease), padding 0.5s var(--nv-ease),
		border-color 0.5s var(--nv-ease), backdrop-filter 0.5s var(--nv-ease);
}

body.nv-scrolled .navbar.navbar-primary {
	background: rgb(6 6 12 / 0.72) !important;
	backdrop-filter: blur(18px) saturate(160%);
	-webkit-backdrop-filter: blur(18px) saturate(160%);
	border-bottom-color: rgb(var(--nv-line) / 0.08);
	padding-block: 0.45rem;
	box-shadow: 0 12px 40px -24px rgb(0 0 0 / 0.9);
}

.navbar-brand {
	font-weight: 700;
	font-size: 1.28rem;
	background: linear-gradient(100deg, #fff, #cdc6ff 45%, rgb(var(--nv-cyan)));
	-webkit-background-clip: text;
	background-clip: text;
	-webkit-text-fill-color: transparent;
	transition: filter 0.4s var(--nv-ease);
}

.navbar-brand:hover {
	filter: drop-shadow(0 0 16px rgb(var(--nv-violet) / 0.9));
}

.navbar .nav-link {
	position: relative;
	font-family: var(--nv-nav-font);
	font-weight: var(--nv-nav-weight);
	font-size: var(--nv-nav-size);
	letter-spacing: var(--nv-nav-tracking);
	text-transform: var(--nv-nav-transform);
	color: rgb(var(--nv-line) / 0.72) !important;
	padding-inline: 0.85rem !important;
	transition: color 0.3s var(--nv-ease);
}

.navbar .nav-link::after {
	content: '';
	position: absolute;
	left: 0.85rem;
	right: 0.85rem;
	bottom: 0.25rem;
	height: 2px;
	border-radius: 2px;
	background: var(--theme-gradient);
	transform: scaleX(0);
	transform-origin: left;
	transition: transform 0.45s var(--nv-ease-out);
}

.navbar .nav-link:hover,
.navbar .nav-link.active {
	color: #fff !important;
}

.navbar .nav-link:hover::after,
.navbar .nav-link.active::after {
	transform: scaleX(1);
}

.dropdown-menu {
	background: rgb(10 10 18 / 0.92);
	backdrop-filter: blur(20px) saturate(160%);
	-webkit-backdrop-filter: blur(20px) saturate(160%);
	border: 1px solid rgb(var(--nv-line) / 0.08);
	border-radius: var(--nv-radius-sm);
	box-shadow: 0 24px 60px -20px rgb(0 0 0 / 0.9);
	padding: 0.4rem;
	animation: nv-pop 0.28s var(--nv-ease-out);
}

@keyframes nv-pop {
	from { opacity: 0; transform: translateY(-8px) scale(0.97); }
}

.dropdown-item {
	border-radius: 9px;
	color: rgb(var(--nv-line) / 0.78);
	transition: background 0.25s var(--nv-ease), color 0.25s var(--nv-ease),
		transform 0.25s var(--nv-ease);
}

.dropdown-item:hover,
.dropdown-item:focus {
	background: rgb(var(--nv-violet) / 0.16);
	color: #fff;
	transform: translateX(3px);
}

/* ------------------------------------------------------- 6. Héros */

.parallax {
	height: 100vh;
	min-height: 620px;
	margin-top: -56px;
	isolation: isolate;
	/* Fonds semi-transparents : la toile de particules, posée en z-index -1,
	   transparaît à travers le héros. */
	background:
		radial-gradient(125% 85% at 50% 118%, rgb(var(--nv-violet) / 0.32), transparent 62%),
		radial-gradient(80% 60% at 10% 6%, rgb(var(--nv-cyan) / 0.16), transparent 60%),
		radial-gradient(70% 55% at 90% 18%, rgb(var(--nv-pink) / 0.13), transparent 62%),
		linear-gradient(to bottom, rgb(8 8 16 / 0.55), transparent 40%, var(--nv-ink) 99%);
}

/* landing.twig injecte la photo d'Ember en style inline, après cette feuille :
   il faut !important pour la retirer. */
.parallax::before {
	background: none !important;
	content: none !important;
}

/* Ligne d'horizon lumineuse au pied du héros */
.parallax::after {
	content: '';
	position: absolute;
	left: 8%;
	right: 8%;
	bottom: 0;
	height: 1px;
	background: linear-gradient(
		to right,
		transparent,
		rgb(var(--nv-violet) / 0.7),
		rgb(var(--nv-cyan) / 0.5),
		transparent
	);
	box-shadow: 0 0 40px 6px rgb(var(--nv-violet) / 0.35);
	pointer-events: none;
	z-index: 1;
}

/* Vignette : referme les bords et raccroche le héros au fond de page */
.nv-hero-veil {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	background:
		radial-gradient(120% 90% at 50% 50%, transparent 45%, rgb(5 5 10 / 0.75) 100%),
		linear-gradient(to bottom, transparent 60%, var(--nv-ink) 100%);
}

/* Halo qui suit le curseur */
.nv-hero-glow {
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	background: radial-gradient(
		320px circle at var(--nv-mx, 50%) var(--nv-my, 50%),
		rgb(var(--nv-cyan) / 0.16),
		transparent 70%
	);
	transition: opacity 0.6s var(--nv-ease);
}

.parallax .middle {
	margin-top: 0;
	text-align: center;
	padding-inline: 1rem;
	will-change: transform;
}

.parallax .middle h5 {
	margin-top: 1.4rem;
	font-size: clamp(0.98rem, 1.6vw, 1.22rem);
	font-weight: 400;
	letter-spacing: 0.01em;
	color: rgb(var(--nv-line) / 0.66);
	max-width: 40ch;
	margin-inline: auto;
}

/* Apparition lettre par lettre du titre */
.nv-char {
	display: inline-block;
	opacity: 0;
	transform: translateY(0.5em) rotateX(-70deg);
	animation: nv-char-in 0.85s var(--nv-ease-out) forwards;
}

@keyframes nv-char-in {
	to { opacity: 1; transform: none; }
}

.nv-hero-scroll {
	position: absolute;
	left: 50%;
	bottom: 2.4rem;
	z-index: 2;
	translate: -50% 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.6rem;
	font-size: 0.66rem;
	letter-spacing: 0.3em;
	text-transform: uppercase;
	color: rgb(var(--nv-line) / 0.42);
	animation: nv-fade-up 1s var(--nv-ease-out) 1.4s backwards;
}

.nv-hero-scroll span.nv-mouse {
	width: 24px;
	height: 38px;
	border: 1.5px solid rgb(var(--nv-line) / 0.3);
	border-radius: 99px;
	position: relative;
}

.nv-hero-scroll span.nv-mouse::after {
	content: '';
	position: absolute;
	left: 50%;
	top: 8px;
	width: 3px;
	height: 7px;
	border-radius: 99px;
	background: rgb(var(--nv-cyan));
	box-shadow: 0 0 12px rgb(var(--nv-cyan));
	translate: -50% 0;
	animation: nv-wheel 1.8s var(--nv-ease) infinite;
}

@keyframes nv-wheel {
	0% { opacity: 0; transform: translateY(0); }
	35% { opacity: 1; }
	100% { opacity: 0; transform: translateY(13px); }
}

@keyframes nv-fade-up {
	from { opacity: 0; transform: translateY(14px); }
}

/* ------------------------------------------------- 7. Sections */

.alternatebg {
	position: relative;
	padding-block: clamp(3.5rem, 7vw, 6rem);
	background-color: transparent !important;
}

.alternatebg:nth-child(even),
.alternatebg:nth-child(2n) {
	background-color: transparent !important;
}

/* Filet lumineux de séparation */
.alternatebg + .alternatebg::before {
	content: '';
	position: absolute;
	top: 0;
	left: 12%;
	right: 12%;
	height: 1px;
	background: linear-gradient(
		to right,
		transparent,
		rgb(var(--nv-violet) / 0.45),
		rgb(var(--nv-cyan) / 0.35),
		transparent
	);
}

.page-header {
	background: transparent !important;
	padding-block: clamp(3.5rem, 7vw, 5.5rem) 1.5rem;
	margin-bottom: 2rem;
	clip-path: none !important;
	position: relative;
	text-align: center;
}

/* ----------------------------------------------------- 8. Cartes */

.card {
	position: relative;
	background:
		linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
	border-radius: var(--nv-radius);
	box-shadow: 0 20px 45px -28px rgb(0 0 0 / 0.95);
	overflow: hidden;
	transform-style: preserve-3d;
	transition: transform 0.5s var(--nv-ease), box-shadow 0.5s var(--nv-ease),
		border-color 0.5s var(--nv-ease);
}

/* Liseré dégradé au survol (masque pour n'éclairer que le bord) */
.card::after {
	content: '';
	position: absolute;
	inset: 0;
	border-radius: inherit;
	padding: 1px;
	background: linear-gradient(
		135deg,
		rgb(var(--nv-violet) / 0.9),
		rgb(var(--nv-cyan) / 0.7) 45%,
		transparent 75%
	);
	-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
	mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
	-webkit-mask-composite: xor;
	mask-composite: exclude;
	opacity: 0;
	transition: opacity 0.45s var(--nv-ease);
	pointer-events: none;
	z-index: 3;
}

.card:hover::after {
	opacity: 1;
}

/* Projecteur qui suit la souris à l'intérieur de la carte.
   Pseudo-élément plutôt qu'un div : les cartes sont rendues par Vue,
   on évite d'injecter des nœuds dans un arbre qu'il patche. */
.card::before {
	content: '';
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	opacity: 0;
	background: radial-gradient(
		420px circle at var(--nv-mx, 50%) var(--nv-my, 50%),
		rgb(var(--nv-violet) / 0.18),
		transparent 60%
	);
	transition: opacity 0.4s var(--nv-ease);
}

.card:hover::before {
	opacity: 1;
}

.card:hover {
	border-color: rgb(var(--nv-line) / 0.14);
	box-shadow: var(--nv-glow);
}

.card-body,
.card-header,
.card-footer {
	position: relative;
	z-index: 2;
}

.card-header,
.card-footer {
	background: rgb(var(--nv-line) / 0.03);
	border-color: rgb(var(--nv-line) / 0.06);
}

.card-title {
	font-weight: 600;
}

.card-img-top,
.card-img,
.card img {
	transition: transform 0.7s var(--nv-ease), filter 0.7s var(--nv-ease);
}

.card:hover .card-img-top,
.card:hover .card-img {
	transform: scale(1.06);
	filter: saturate(1.15);
}

/* On remplace le scale brutal par une élévation plus fine */
.hoverscale {
	transition: transform 0.5s var(--nv-ease), box-shadow 0.5s var(--nv-ease);
}

.hoverscale:hover {
	transform: translateY(-8px);
}

/* Icônes de section */
.alternatebg .card [class*='fa-'] {
	background: var(--theme-gradient);
	-webkit-background-clip: text;
	background-clip: text;
	-webkit-text-fill-color: transparent;
	filter: drop-shadow(0 6px 18px rgb(var(--nv-violet) / 0.55));
	transition: transform 0.5s var(--nv-ease);
}

.alternatebg .card:hover [class*='fa-'] {
	transform: translateY(-4px) scale(1.08);
}

/* Compteurs communauté */
.alternatebg .card .fs-2 {
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-variant-numeric: tabular-nums;
	background: linear-gradient(180deg, #fff, #b9b2ff);
	-webkit-background-clip: text;
	background-clip: text;
	-webkit-text-fill-color: transparent;
}

/* ---------------------------------------------------- 9. Boutons */

.btn {
	position: relative;
	overflow: hidden;
	border-radius: var(--nv-btn-radius);
	font-family: var(--nv-btn-font);
	font-weight: var(--nv-btn-weight);
	letter-spacing: var(--nv-btn-tracking);
	text-transform: var(--nv-btn-transform);
	padding: 0.55rem 1.35rem;
	border: 1px solid rgb(var(--nv-line) / 0.1);
	transition: transform 0.35s var(--nv-ease), box-shadow 0.35s var(--nv-ease),
		border-color 0.35s var(--nv-ease), background 0.35s var(--nv-ease);
}

.btn:hover {
	transform: translateY(-2px);
}

.btn:active {
	transform: translateY(0) scale(0.98);
}

.btn.btn-primary,
.btn-primary {
	background: var(--theme-gradient);
	background-size: 180% auto;
	border: none;
	color: #fff;
	box-shadow: 0 10px 30px -12px rgb(var(--nv-violet) / 0.9);
}

.btn.btn-primary:hover {
	background-position: right center;
	box-shadow: 0 16px 42px -14px rgb(var(--nv-violet)),
		0 0 0 1px rgb(var(--nv-cyan) / 0.35);
}

/* Balayage lumineux */
.btn::before {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	width: 60%;
	height: 100%;
	background: linear-gradient(100deg, transparent, rgb(255 255 255 / 0.28), transparent);
	transform: translateX(-240%) skewX(-18deg);
	transition: transform 0.75s var(--nv-ease-out);
	pointer-events: none;
}

.btn:hover::before {
	transform: translateX(240%) skewX(-18deg);
}

.btn-outline-primary,
.btn-secondary,
.btn-light,
.btn-dark {
	background: rgb(var(--nv-line) / 0.05);
	color: var(--nv-text);
}

.btn-outline-primary:hover,
.btn-secondary:hover,
.btn-light:hover,
.btn-dark:hover {
	background: rgb(var(--nv-violet) / 0.2);
	border-color: rgb(var(--nv-violet) / 0.5);
	color: #fff;
}

/* Ondes au clic (élément injecté par le JS) */
.nv-ripple {
	position: absolute;
	border-radius: 50%;
	background: rgb(255 255 255 / 0.35);
	transform: scale(0);
	animation: nv-ripple 0.65s var(--nv-ease-out) forwards;
	pointer-events: none;
}

@keyframes nv-ripple {
	to { transform: scale(3.2); opacity: 0; }
}

.badge {
	border-radius: 999px;
	font-weight: 600;
	letter-spacing: 0.03em;
	padding: 0.4em 0.75em;
}

/* Badge promo pulsé */
.navbar .badge,
.nav-link .badge {
	box-shadow: 0 0 0 0 rgb(var(--nv-amber) / 0.7);
	animation: nv-pulse 2.4s var(--nv-ease) infinite;
}

@keyframes nv-pulse {
	70% { box-shadow: 0 0 0 12px rgb(var(--nv-amber) / 0); }
	100% { box-shadow: 0 0 0 0 rgb(var(--nv-amber) / 0); }
}

/* -------------------------------------------- 10. Formulaires */

.form-control,
.form-select,
.input-group-text {
	background: rgb(var(--nv-line) / 0.04);
	border: 1px solid rgb(var(--nv-line) / 0.09);
	border-radius: var(--nv-radius-sm);
	color: var(--nv-text);
	transition: border-color 0.35s var(--nv-ease), background 0.35s var(--nv-ease),
		box-shadow 0.35s var(--nv-ease);
}

.form-control::placeholder {
	color: rgb(var(--nv-line) / 0.28);
}

.form-control:focus,
.form-select:focus {
	background: rgb(var(--nv-line) / 0.07);
	border-color: rgb(var(--nv-violet) / 0.6);
	box-shadow: var(--theme-focus-box-shadow);
	color: #fff;
}

/* --------------------------------------------- 11. Tableaux */

.table-responsive {
	background: rgb(var(--nv-surface) / 0.75);
	border: 1px solid rgb(var(--nv-line) / 0.07);
	border-radius: var(--nv-radius);
	overflow: hidden;
}

.table {
	color: var(--nv-text);
	margin-bottom: 0;
	--bs-table-bg: transparent;
}

.table > thead th {
	background: rgb(var(--nv-line) / 0.04);
	border-bottom: 1px solid rgb(var(--nv-line) / 0.08);
	font-family: var(--nv-font-display);
	font-size: 0.76rem;
	font-weight: 600;
	letter-spacing: 0.09em;
	text-transform: uppercase;
	color: var(--nv-muted);
	padding-block: 0.95rem;
}

.table > tbody > tr {
	transition: background 0.3s var(--nv-ease), box-shadow 0.3s var(--nv-ease);
}

.table > tbody > tr:hover {
	background: rgb(var(--nv-violet) / 0.08);
	box-shadow: inset 3px 0 0 rgb(var(--nv-cyan));
}

.table td,
.table th {
	border-color: rgb(var(--nv-line) / 0.05);
	vertical-align: middle;
}

.page-item .page-link {
	background: rgb(var(--nv-line) / 0.04);
	border: 1px solid rgb(var(--nv-line) / 0.08);
	border-radius: 10px;
	color: var(--nv-text);
	transition: all 0.3s var(--nv-ease);
}

.page-item .page-link:hover {
	background: rgb(var(--nv-violet) / 0.25);
	border-color: rgb(var(--nv-violet) / 0.5);
	transform: translateY(-2px);
}

.page-item.active .page-link {
	background: var(--theme-gradient);
	border-color: transparent;
	box-shadow: 0 8px 22px -10px rgb(var(--nv-violet));
}

/* --------------------------------------- 12. Avatars & profils */

.profilecircle,
.avatar img,
.avatar-bordered img {
	border-color: rgb(var(--nv-violet) / 0.5) !important;
	box-shadow: 0 0 0 1px rgb(var(--nv-line) / 0.08),
		0 8px 22px -10px rgb(var(--nv-violet) / 0.8);
	transition: transform 0.45s var(--nv-ease), box-shadow 0.45s var(--nv-ease);
}

a:hover .profilecircle,
.card:hover .profilecircle {
	transform: scale(1.06);
	box-shadow: 0 0 0 1px rgb(var(--nv-cyan) / 0.4),
		0 12px 30px -8px rgb(var(--nv-violet));
}

.blurred-profile {
	filter: blur(22px) saturate(1.5) brightness(0.8);
	transform: scale(1.3);
}

/* ---------------------------------------------- 13. Boutique */

.list-group-item {
	background: rgb(var(--nv-line) / 0.03);
	border-color: rgb(var(--nv-line) / 0.06);
	color: var(--nv-text);
}

.nav-pills .nav-link {
	border-radius: 999px;
	color: var(--nv-muted);
	font-weight: 600;
	border: 1px solid transparent;
	transition: all 0.35s var(--nv-ease);
}

.nav-pills .nav-link:hover {
	color: #fff;
	border-color: rgb(var(--nv-line) / 0.12);
	background: rgb(var(--nv-line) / 0.05);
}

.nav-pills .nav-link.active {
	background: var(--theme-gradient) !important;
	color: #fff;
	box-shadow: 0 10px 26px -12px rgb(var(--nv-violet));
}

/* Bandeau de promo */
.banner,
[class*='alert'] {
	border-radius: var(--nv-radius-sm);
	border: 1px solid rgb(var(--nv-line) / 0.08);
}

/* Prix barré / prix soldé */
del,
s {
	color: var(--nv-muted);
	opacity: 0.65;
}

/* ------------------------------------------------ 14. Pied de page */

.footer {
	position: relative;
	background: transparent !important;
	border-top: 1px solid rgb(var(--nv-line) / 0.07);
	padding-block: 3rem 2rem;
	margin-top: 4rem;
}

.footer::before {
	content: '';
	position: absolute;
	inset: auto 0 0 0;
	height: 240px;
	background: radial-gradient(70% 100% at 50% 100%, rgb(var(--nv-violet) / 0.18), transparent 70%);
	pointer-events: none;
	z-index: -1;
}

/* --------------------------------------- 15. Curseur & toile */

/* La toile est peinte en canvas : une seule surface, pas un nœud par point.
   z-index -1 la place entre le décor de fond (-10) et le contenu : elle
   rayonne dans les zones vides et s'atténue derrière les cartes. */
.nv-web {
	position: fixed;
	inset: 0;
	z-index: -1;
	pointer-events: none;
	opacity: 0.8;
}

body.nv-lite .nv-web {
	display: none;
}

@media (hover: hover) and (pointer: fine) {
	body.nv-cursor-on,
	body.nv-cursor-on * {
		cursor: none !important;
	}

	.nv-cursor-dot,
	.nv-cursor-halo {
		position: fixed;
		top: 0;
		left: 0;
		z-index: 99999;
		pointer-events: none;
		border-radius: 50%;
		will-change: transform;
	}

	.nv-cursor-dot {
		width: 9px;
		height: 9px;
		margin: -4.5px 0 0 -4.5px;
		background: #fff;
		box-shadow:
			0 0 10px rgb(var(--nv-cyan)),
			0 0 22px rgb(var(--nv-violet)),
			0 0 44px rgb(var(--nv-violet) / 0.6);
		transition: width 0.3s var(--nv-ease), height 0.3s var(--nv-ease),
			margin 0.3s var(--nv-ease), opacity 0.25s var(--nv-ease);
	}

	/* Halo très en retard sur le point : un dégradé radial, pas un flou. */
	.nv-cursor-halo {
		width: 260px;
		height: 260px;
		margin: -130px 0 0 -130px;
		background: radial-gradient(
			circle,
			rgb(var(--nv-violet) / 0.2) 0%,
			rgb(var(--nv-cyan) / 0.1) 38%,
			transparent 68%
		);
		opacity: 0.85;
		transition: opacity 0.4s var(--nv-ease);
	}

	body.nv-hot .nv-cursor-dot {
		width: 16px;
		height: 16px;
		margin: -8px 0 0 -8px;
	}

	body.nv-hot .nv-cursor-halo {
		opacity: 1.3;
	}

	body.nv-down .nv-cursor-dot {
		width: 6px;
		height: 6px;
		margin: -3px 0 0 -3px;
	}

	body.nv-idle .nv-cursor-dot,
	body.nv-idle .nv-cursor-halo {
		opacity: 0;
	}
}

/* Pendant l'inclinaison, pas de transition sur transform : le JS écrit une
   nouvelle valeur à chaque image, la transition se battait contre lui. */
.card.nv-tilting {
	transition: box-shadow 0.5s var(--nv-ease), border-color 0.5s var(--nv-ease);
}

/* --------------------------- 16. Révélations & barre de progression */

.nv-reveal {
	opacity: 0;
	transform: translateY(34px);
	transition: opacity 0.9s var(--nv-ease-out), transform 0.9s var(--nv-ease-out);
	transition-delay: var(--nv-delay, 0ms);
}

.nv-reveal.nv-in {
	opacity: 1;
	transform: none;
}

.nv-progress {
	position: fixed;
	top: 0;
	left: 0;
	height: 2px;
	width: 100%;
	transform: scaleX(var(--nv-scroll, 0));
	transform-origin: left;
	background: var(--theme-gradient);
	box-shadow: 0 0 14px rgb(var(--nv-violet) / 0.9);
	z-index: 99998;
	pointer-events: none;
}

/* Entrée de page */
body.nv-boot #app,
body.nv-boot .navbar,
body.nv-boot .footer {
	animation: nv-page-in 0.9s var(--nv-ease-out) backwards;
}

@keyframes nv-page-in {
	from { opacity: 0; transform: translateY(10px); }
}

/* ------------------------------------------- 17. Accessibilité */

@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		animation-duration: 0.001ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.001ms !important;
		scroll-behavior: auto !important;
	}

	.nv-reveal {
		opacity: 1;
		transform: none;
	}

	.nv-blob,
	.nv-grain {
		animation: none;
	}
}

@media (max-width: 991.98px) {
	.parallax {
		height: 88vh;
		min-height: 520px;
	}

	.navbar-collapse {
		background: rgb(8 8 14 / 0.95);
		backdrop-filter: blur(20px);
		-webkit-backdrop-filter: blur(20px);
		border-radius: var(--nv-radius);
		margin-top: 0.6rem;
		padding: 0.6rem;
		border: 1px solid rgb(var(--nv-line) / 0.08);
	}

	/* Sur petit écran on réduit encore : moins de surface, pas de flou. */
	.nv-blob {
		opacity: 0.4;
	}
}


/* ============================================================================
   18. Finitions
   ========================================================================= */

/* Respiration dans les cartes */
.card-body {
	padding: 1.5rem 1.35rem;
}

.card-text,
.card .card-text {
	color: rgb(var(--nv-line) / 0.6);
	font-size: 0.9rem;
	font-weight: 400;
	line-height: 1.6;
}

.card .card-title,
.card h3.card-title {
	font-size: 1.18rem;
	margin-bottom: 0.5rem;
	color: #fff;
}

/* Avatars du staff : le SVG par défaut est clair, il repeignait la carte en blanc.
   app.css cible `.card-img-top .blurred-profile`, il faut au moins la même
   spécificité pour reprendre la main sur le filtre. */
.card-img-caption {
	position: relative;
	height: 190px;
	overflow: hidden;
	margin-bottom: 1.25em;
}

.card-img-caption .card-img-top {
	height: 100%;
	overflow: hidden;
}

.card-img-top .blurred-profile,
img.blurred-profile {
	filter: blur(24px) saturate(1.5) brightness(0.34) contrast(1.05);
	transform: scale(1.3);
	opacity: 0.85;
	height: 100%;
	width: 100%;
	object-fit: cover;
}

/* Le disque de profil est positionné en absolu avec des marges en % : on le
   recentre proprement dans le nouveau cadre. */
.card-img-caption .profilecircle {
	margin: 0;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	width: 104px;
	height: 104px;
	object-fit: cover;
}

/* Fondu vers le corps de la carte */
.card-img-caption::after {
	content: '';
	position: absolute;
	inset: auto 0 0 0;
	height: 55%;
	background: linear-gradient(to bottom, transparent, rgb(var(--nv-surface) / 0.95));
	pointer-events: none;
	z-index: 0;
}

.card > a > img,
.card > img.card-img-top {
	max-height: 190px;
	object-fit: cover;
	width: 100%;
}

/* Dégradé sous les visuels de carte pour raccrocher au fond */
.card-img-top,
.card > a > img {
	mask-image: linear-gradient(to bottom, #000 60%, rgb(0 0 0 / 0.55) 100%);
	-webkit-mask-image: linear-gradient(to bottom, #000 60%, rgb(0 0 0 / 0.55) 100%);
}

/* Bouton Steam : on garde la marque, on l'habille */
.navbar img.btn,
img.btn {
	height: auto;
	max-height: 46px;
	width: auto;
	padding: 0.25rem 0.5rem;
	background: rgb(var(--nv-line) / 0.05);
	border: 1px solid rgb(var(--nv-line) / 0.1);
	border-radius: 12px;
	object-fit: contain;
	filter: saturate(0.85) brightness(1.06);
	transition: transform 0.35s var(--nv-ease), box-shadow 0.35s var(--nv-ease),
		border-color 0.35s var(--nv-ease), filter 0.35s var(--nv-ease);
}

.navbar img.btn:hover,
img.btn:hover {
	transform: translateY(-2px);
	border-color: rgb(var(--nv-cyan) / 0.45);
	box-shadow: 0 12px 30px -14px rgb(var(--nv-cyan) / 0.9);
	filter: saturate(1) brightness(1.15);
}

.btn-outline-custom {
	background: rgb(var(--nv-line) / 0.05);
	border: 1px solid rgb(var(--nv-line) / 0.14);
	color: #fff;
}

.btn-outline-custom:hover {
	background: rgb(var(--nv-violet) / 0.22);
	border-color: rgb(var(--nv-violet) / 0.55);
	color: #fff;
}

/* Avatar du menu compte */
.avism {
	border-radius: 50%;
	border: 1px solid rgb(var(--nv-violet) / 0.5);
	box-shadow: 0 0 18px -6px rgb(var(--nv-violet));
}

/* Pastilles de statut serveur */
.badge.bg-danger {
	background: rgb(244 63 94 / 0.16) !important;
	color: #fda4af;
	border: 1px solid rgb(244 63 94 / 0.3);
}

.badge.bg-success {
	background: rgb(34 197 94 / 0.16) !important;
	color: #86efac;
	border: 1px solid rgb(34 197 94 / 0.3);
}

/* Bandeau du pied de page */
.footer a {
	color: rgb(var(--nv-line) / 0.55);
	transition: color 0.3s var(--nv-ease);
}

.footer a:hover {
	color: #fff;
	text-decoration: none;
}

/* ============================================================================
   19. Boutique & barres secondaires
   ========================================================================= */

/* Cartes de même hauteur dans une rangée */
.row {
	align-items: stretch;
}

.row > [class*='col'] {
	display: flex;
}

.row > [class*='col'] > .card,
.row > [class*='col'] > a > .card {
	width: 100%;
	display: flex;
	flex-direction: column;
}

.row > [class*='col'] > .card > .card-body {
	flex: 1 1 auto;
}

/* Barre de sélection des serveurs */
.navbar-secondary {
	background: rgb(8 8 14 / 0.75) !important;
	backdrop-filter: blur(16px) saturate(150%);
	-webkit-backdrop-filter: blur(16px) saturate(150%);
	border-bottom: 1px solid rgb(var(--nv-line) / 0.07);
}

.navbar-secondary .nav-link {
	position: relative;
	font-weight: 500;
	color: var(--nv-muted) !important;
}

.navbar-secondary .nav-link.active,
.navbar-secondary .nav-link:hover {
	color: #fff !important;
}

/* Bandeau de promo : la couleur de la vente est en style inline, on la
   garde comme accent mais on repose le bandeau sur du verre sombre. */
div.text-center.text-white[style*='background-color'] {
	position: relative;
	overflow: hidden;
	background: rgb(10 10 18 / 0.92) !important;
	border-block: 1px solid rgb(var(--nv-line) / 0.07);
	backdrop-filter: blur(14px);
	-webkit-backdrop-filter: blur(14px);
	letter-spacing: 0.01em;
	font-size: 0.94rem;
}

div.text-center.text-white[style*='background-color']::before {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(
		90deg,
		rgb(var(--nv-violet) / 0.28),
		rgb(var(--nv-pink) / 0.2) 45%,
		rgb(var(--nv-amber) / 0.28)
	);
	pointer-events: none;
}

/* Balayage lent pour attirer l'œil sur la promo */
div.text-center.text-white[style*='background-color']::after {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	width: 40%;
	height: 100%;
	background: linear-gradient(100deg, transparent, rgb(255 255 255 / 0.16), transparent);
	will-change: transform;
	animation: nv-sweep 5s var(--nv-ease) infinite;
	pointer-events: none;
}

@keyframes nv-sweep {
	0% { transform: translateX(-150%) skewX(-18deg); }
	55%, 100% { transform: translateX(400%) skewX(-18deg); }
}

div.text-center.text-white[style*='background-color'] b {
	position: relative;
	z-index: 1;
	color: #ffd8a8;
	text-shadow: 0 0 22px rgb(var(--nv-amber) / 0.8);
}

div.text-center.text-white[style*='background-color'] {
	color: rgb(var(--nv-line) / 0.85) !important;
}

/* Prix de la boutique */
.card .h1, .card h1,
.card .fs-1 {
	font-family: var(--nv-font-display);
	font-weight: 700;
}

/* Visuel des packages : cadre net, pas de bord dur */
.card img[src*='picsum'],
.card .card-img-top img {
	border-radius: var(--nv-radius-sm);
}

/* Les libellés des groupes de champs de l'admin ne doivent pas passer à la ligne */
.input-group-text {
	white-space: nowrap;
	color: var(--nv-muted);
	font-size: 0.86rem;
	font-weight: 500;
}

/* Interrupteurs */
.form-switch .form-check-input {
	background-color: rgb(var(--nv-line) / 0.12);
	border-color: rgb(var(--nv-line) / 0.12);
	transition: background 0.3s var(--nv-ease), border-color 0.3s var(--nv-ease);
}

.form-switch .form-check-input:checked {
	background: var(--theme-gradient);
	border-color: transparent;
	box-shadow: 0 0 16px -4px rgb(var(--nv-violet));
}

/* Blocs de code de l'admin */
code, pre, .ace_editor {
	font-family: var(--nv-font-mono);
	color: rgb(var(--nv-cyan));
}


/* ============================================================================
   20. Mode allégé
   Posé par le JS quand les premières images dépassent le budget de 60 fps,
   ou quand la machine annonce peu de cœurs. On coupe ce qui coûte à chaque
   image et on garde ce qui est gratuit une fois peint.
   ========================================================================= */

body.nv-lite .nv-blob {
	animation: none;
	opacity: 0.4;
}

body.nv-lite .nv-grain,
body.nv-lite .nv-grid {
	display: none;
}

body.nv-lite .card::before,
body.nv-lite .nv-hero-glow {
	display: none;
}

body.nv-lite .navbar.navbar-primary,
body.nv-lite .dropdown-menu,
body.nv-lite .navbar-secondary,
body.nv-lite div.text-center.text-white[style*='background-color'] {
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
	background: rgb(7 7 13 / 0.96) !important;
}

body.nv-lite div.text-center.text-white[style*='background-color']::after {
	display: none;
}

body.nv-lite .title-main {
	filter: none;
}

/* ============================================================================
   21. Page Commandes
   ========================================================================= */

.nv-orders {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 0.75rem;
}

.nv-order {
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
	border-radius: var(--nv-radius);
	overflow: hidden;
	transition: border-color 0.4s var(--nv-ease), box-shadow 0.4s var(--nv-ease);
}

.nv-order:hover {
	border-color: rgb(var(--nv-line) / 0.14);
}

.nv-order.is-open {
	border-color: rgb(var(--nv-violet) / 0.4);
	box-shadow: 0 0 40px -20px rgb(var(--nv-violet));
}

.nv-order__bar {
	width: 100%;
	display: grid;
	grid-template-columns: 4.5rem minmax(0, 1fr) 7rem 8rem 9.5rem 1.5rem;
	align-items: center;
	gap: 1rem;
	padding: 1rem 1.25rem;
	background: none;
	border: 0;
	color: inherit;
	text-align: left;
	font: inherit;
}

.nv-order__id {
	font-family: var(--nv-font-display);
	color: var(--nv-muted);
	font-variant-numeric: tabular-nums;
}

.nv-order__name {
	font-weight: 600;
	color: #fff;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.nv-order__date,
.nv-order__price {
	color: var(--nv-muted);
	font-variant-numeric: tabular-nums;
	font-size: 0.9rem;
}

.nv-order__price {
	font-weight: 600;
	color: var(--nv-text);
}

.nv-order__chevron {
	color: var(--nv-muted);
	transition: transform 0.4s var(--nv-ease);
	justify-self: end;
}

.nv-order.is-open .nv-order__chevron {
	transform: rotate(180deg);
}

.nv-badge {
	justify-self: start;
	display: inline-flex;
	align-items: center;
	border-radius: 999px;
	padding: 0.32em 0.85em;
	font-size: 0.8rem;
	font-weight: 600;
	white-space: nowrap;
}

.nv-badge--delivered {
	background: rgb(34 197 94 / 0.14);
	color: #86efac;
	border: 1px solid rgb(34 197 94 / 0.28);
}

.nv-badge--refunded {
	background: rgb(251 146 60 / 0.14);
	color: #fdba74;
	border: 1px solid rgb(251 146 60 / 0.3);
}

.nv-order__detail {
	padding: 0 1.25rem 1.25rem;
	border-top: 1px solid rgb(var(--nv-line) / 0.06);
}

.nv-order__grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
	gap: 0.9rem 1.5rem;
	padding-top: 1.1rem;
}

.nv-order__grid > div {
	display: flex;
	flex-direction: column;
	gap: 0.15rem;
	min-width: 0;
}

.nv-label {
	font-size: 0.72rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--nv-muted);
	font-weight: 600;
}

.nv-mono {
	font-family: var(--nv-font-mono);
	font-size: 0.86rem;
	word-break: break-all;
}

/* Bloc remboursement */
.nv-refund {
	margin-top: 1.25rem;
	padding: 1rem 1.15rem 1.15rem;
	border-radius: var(--nv-radius-sm);
	background: rgb(251 146 60 / 0.06);
	border: 1px solid rgb(251 146 60 / 0.22);
}

.nv-refund__title {
	font-size: 1rem;
	font-weight: 600;
	color: #fdba74;
	margin: 0;
}

.nv-refund__note {
	margin: 1rem 0 0;
	padding-top: 0.85rem;
	border-top: 1px solid rgb(var(--nv-line) / 0.08);
	color: var(--nv-muted);
	font-size: 0.9rem;
	white-space: pre-line;
}

.nv-btn-ghost {
	margin-top: 0.9rem;
	background: transparent;
	border: 1px solid rgb(var(--nv-line) / 0.14);
	color: var(--nv-muted);
}

.nv-btn-ghost:hover {
	border-color: rgb(244 63 94 / 0.5);
	color: #fda4af;
}

/* Formulaire de remboursement */
.nv-refund-form {
	margin-top: 1.25rem;
}

.nv-refund-form form {
	margin-top: 1rem;
	padding: 1.15rem;
	border-radius: var(--nv-radius-sm);
	background: rgb(var(--nv-line) / 0.03);
	border: 1px solid rgb(var(--nv-line) / 0.08);
}

.nv-refund-form__lead,
.nv-refund-form__warn {
	font-size: 0.88rem;
	line-height: 1.55;
	border-radius: 10px;
	padding: 0.7rem 0.9rem;
	margin-bottom: 1rem;
}

.nv-refund-form__lead {
	background: rgb(var(--nv-cyan) / 0.08);
	border: 1px solid rgb(var(--nv-cyan) / 0.2);
	color: #a5f3fc;
}

.nv-refund-form__warn {
	background: rgb(251 146 60 / 0.1);
	border: 1px solid rgb(251 146 60 / 0.3);
	color: #fdba74;
}

.nv-field-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
	gap: 0.9rem;
	margin-bottom: 0.9rem;
}

.nv-field-grid label,
label.nv-field-wide {
	display: flex;
	flex-direction: column;
	gap: 0.35rem;
}

.nv-field-wide {
	grid-column: 1 / -1;
}

.nv-help {
	color: var(--nv-muted);
	font-size: 0.76rem;
	line-height: 1.4;
}

.nv-confirm {
	display: flex;
	align-items: flex-start;
	gap: 0.2rem;
	margin: 1rem 0;
	font-size: 0.9rem;
	color: var(--nv-text);
}

.nv-confirm .form-check-input {
	margin-top: 0.15rem;
	flex: 0 0 auto;
}

/* Messages et état vide */
.nv-flash {
	border-radius: var(--nv-radius-sm);
	padding: 0.85rem 1.1rem;
	margin-bottom: 1.25rem;
	font-size: 0.92rem;
	border: 1px solid transparent;
}

.nv-flash--ok {
	background: rgb(34 197 94 / 0.1);
	border-color: rgb(34 197 94 / 0.3);
	color: #86efac;
}

.nv-flash--error {
	background: rgb(244 63 94 / 0.1);
	border-color: rgb(244 63 94 / 0.3);
	color: #fda4af;
}

.nv-empty {
	text-align: center;
	padding: 4rem 1rem;
	color: var(--nv-muted);
}

.nv-pager {
	display: flex;
	justify-content: center;
	gap: 0.4rem;
	margin-top: 1.75rem;
}

@media (max-width: 767.98px) {
	.nv-order__bar {
		grid-template-columns: 1fr auto;
		gap: 0.35rem 0.75rem;
	}

	.nv-order__id,
	.nv-order__date,
	.nv-order__price {
		grid-column: 1;
	}

	.nv-order__name {
		grid-column: 1 / -1;
	}

	.nv-order__chevron {
		grid-row: 1;
		grid-column: 2;
	}
}

/* ============================================================================
   22. Portail, règlement, débannissement
   ========================================================================= */

.nv-portal__lead {
	margin: 0.75rem auto 0;
	max-width: 56ch;
	color: var(--nv-muted);
}

.nv-portal {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
	gap: 1.25rem;
	margin-top: 1rem;
}

.nv-portal-card {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 0.6rem;
	padding: 2rem 1.75rem 1.6rem;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
	color: inherit;
	overflow: hidden;
	transition: transform 0.5s var(--nv-ease), border-color 0.5s var(--nv-ease),
		box-shadow 0.5s var(--nv-ease);
}

.nv-portal-card:hover {
	transform: translateY(-6px);
	border-color: rgb(var(--nv-violet) / 0.4);
	box-shadow: var(--nv-glow);
	text-decoration: none;
}

/* Lueur qui monte du bas au survol */
.nv-portal-card::after {
	content: '';
	position: absolute;
	inset: auto 0 0 0;
	height: 60%;
	background: linear-gradient(to top, rgb(var(--nv-violet) / 0.16), transparent);
	opacity: 0;
	transition: opacity 0.5s var(--nv-ease);
	pointer-events: none;
}

.nv-portal-card:hover::after {
	opacity: 1;
}

.nv-portal-card__glyph {
	position: relative;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 58px;
	height: 58px;
	border-radius: 16px;
	margin-bottom: 0.4rem;
	background: rgb(var(--nv-violet) / 0.14);
	border: 1px solid rgb(var(--nv-violet) / 0.28);
	font-size: 1.5rem;
	color: #fff;
	transition: transform 0.5s var(--nv-ease);
}

.nv-portal-card:hover .nv-portal-card__glyph {
	transform: translateY(-3px) scale(1.05);
}

.nv-portal-card__title {
	position: relative;
	z-index: 1;
	font-size: 1.3rem;
	font-weight: 600;
	margin: 0;
	color: #fff;
}

.nv-portal-card__text {
	position: relative;
	z-index: 1;
	flex: 1 1 auto;
	margin: 0;
	color: var(--nv-muted);
	font-size: 0.92rem;
	line-height: 1.6;
}

.nv-portal-card__go {
	position: relative;
	z-index: 1;
	margin-top: 0.5rem;
	font-weight: 600;
	font-size: 0.9rem;
	color: rgb(var(--nv-cyan));
}

.nv-portal-card__flag {
	position: absolute;
	top: 1rem;
	right: 1rem;
	z-index: 1;
	border-radius: 999px;
	padding: 0.25em 0.7em;
	font-size: 0.72rem;
	font-weight: 700;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	background: rgb(var(--nv-amber) / 0.18);
	border: 1px solid rgb(var(--nv-amber) / 0.4);
	color: #fdba74;
}

/* Règlement */
.nv-prose {
	max-width: 74ch;
	margin-inline: auto;
	line-height: 1.75;
	color: var(--nv-text);
}

.nv-prose h2,
.nv-prose h3 {
	margin-top: 2rem;
	color: #fff;
}

/* Sanctions & demande */
.nv-order.is-active-ban {
	border-color: rgb(244 63 94 / 0.28);
}

.nv-contest {
	margin-top: 1.15rem;
}

.nv-demand {
	margin-top: 1.25rem;
	padding: 1rem 1.15rem 1.15rem;
	border-radius: var(--nv-radius-sm);
	border: 1px solid rgb(var(--nv-line) / 0.1);
	background: rgb(var(--nv-line) / 0.03);
}

.nv-demand__title {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	font-size: 1rem;
	font-weight: 600;
	margin: 0;
	color: #fff;
}

.nv-demand__text {
	margin: 1rem 0 0;
	padding-top: 0.85rem;
	border-top: 1px solid rgb(var(--nv-line) / 0.08);
	color: var(--nv-muted);
	white-space: pre-line;
}

.nv-demand__verdict {
	margin-top: 1rem;
	padding: 0.85rem 1rem;
	border-radius: 10px;
	background: rgb(244 63 94 / 0.1);
	border: 1px solid rgb(244 63 94 / 0.28);
	color: #fecdd3;
}

.nv-demand__verdict--ok {
	background: rgb(34 197 94 / 0.1);
	border-color: rgb(34 197 94 / 0.28);
	color: #bbf7d0;
}

.nv-badge--pending {
	background: rgb(var(--nv-line) / 0.08);
	color: var(--nv-muted);
	border: 1px solid rgb(var(--nv-line) / 0.14);
}

.nv-badge--accepted {
	background: rgb(34 197 94 / 0.14);
	color: #86efac;
	border: 1px solid rgb(34 197 94 / 0.28);
}

.nv-badge--refused {
	background: rgb(244 63 94 / 0.14);
	color: #fda4af;
	border: 1px solid rgb(244 63 94 / 0.3);
}

/* Formulaire de contestation */
.nv-appeal {
	display: flex;
	flex-direction: column;
	gap: 1.25rem;
	max-width: 900px;
	margin-inline: auto;
}

.nv-panel {
	padding: 1.5rem;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
}

.nv-panel--admin {
	border-left: 3px solid rgb(244 63 94 / 0.55);
}

.nv-panel--player {
	border-left: 3px solid rgb(var(--nv-cyan) / 0.55);
}

.nv-panel--form {
	border-left: 3px solid rgb(var(--nv-violet) / 0.6);
}

.nv-panel__head {
	display: flex;
	align-items: center;
	gap: 0.9rem;
	padding-bottom: 1rem;
	margin-bottom: 0.25rem;
	border-bottom: 1px solid rgb(var(--nv-line) / 0.07);
}

.nv-panel__badge {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 42px;
	height: 42px;
	border-radius: 12px;
	background: rgb(var(--nv-line) / 0.06);
	border: 1px solid rgb(var(--nv-line) / 0.1);
	color: #fff;
}

.nv-panel__title {
	margin: 0;
	font-size: 1.1rem;
	font-weight: 600;
	color: #fff;
}

.nv-panel__sub {
	margin: 0.1rem 0 0;
	font-size: 0.85rem;
	color: var(--nv-muted);
}

.nv-panel__reason {
	margin-top: 1.1rem;
	padding-top: 1rem;
	border-top: 1px solid rgb(var(--nv-line) / 0.07);
}

.nv-strong {
	font-weight: 600;
	color: #fff;
}

.nv-appeal__actions {
	display: flex;
	justify-content: flex-end;
	gap: 0.75rem;
	margin-top: 1.5rem;
}

.nv-appeal__actions .nv-btn-ghost {
	margin-top: 0;
}

/* ============================================================================
   23. Ambiances (Admin → Thèmes)
   L'attribut data-nv-theme sur <html> est le seul point de contact avec le
   réglage. Chaque ambiance ne redéfinit que les jetons ; tout le reste du
   thème suit. `html[data-nv-theme]` (0,1,1) prime sur `:root` (0,1,0).
   ========================================================================= */

/* ── Halloween ─────────────────────────────────────────────── */
html[data-nv-theme='halloween'] {
	--nv-violet: 249 115 22;     /* citrouille (primaire) */
	--nv-indigo: 194 65 12;
	--nv-cyan: 163 230 53;       /* vert acide (secondaire) */
	--nv-pink: 147 51 234;       /* violet profond */
	--nv-amber: 220 38 38;
	--nv-ink: #0a0608;
	--nv-surface: 22 14 12;
	--nv-surface-2: 30 19 15;
	--nv-text: #f5ebe0;
	--nv-muted: #a89484;
	--theme-bg-page-rgb: 10 6 8;
	--theme-primary: rgb(249 115 22); --bs-primary: rgb(249 115 22); --bs-primary-rgb: 249, 115, 22;
	--theme-secondary: rgb(163 230 53); --bs-secondary: rgb(163 230 53); --bs-secondary-rgb: 163, 230, 53;
	--theme-bg-page: #0a0608; --theme-bg-primary: rgb(22 14 12); --theme-bg-secondary: rgb(14 9 8);
	--nv-title-gradient: linear-gradient(96deg, #fff7ed 0%, #fdba74 22%, rgb(249 115 22) 46%, rgb(147 51 234) 66%, rgb(163 230 53) 84%, #fff7ed 100%);
}
html[data-nv-theme='halloween'] .nv-bg {
	background: radial-gradient(120% 90% at 50% -20%, #2a1208 0%, transparent 60%), var(--nv-ink);
}
/* Une lune pâle en haut à droite du héros */
html[data-nv-theme='halloween'] .nv-hero-veil {
	background:
		radial-gradient(140px circle at 82% 22%, rgb(255 244 214 / 0.55), rgb(255 244 214 / 0.12) 40%, transparent 62%),
		radial-gradient(120% 90% at 50% 50%, transparent 45%, rgb(10 6 8 / 0.8) 100%),
		linear-gradient(to bottom, transparent 60%, var(--nv-ink) 100%);
}
html[data-nv-theme='halloween'] .nv-grain { opacity: 0.06; }

/* ── Noël ─────────────────────────────────────────────────── */
html[data-nv-theme='noel'] {
	--nv-violet: 220 38 38;      /* rouge (primaire) */
	--nv-indigo: 153 27 27;
	--nv-cyan: 22 163 74;        /* sapin (secondaire) */
	--nv-pink: 251 191 36;       /* or */
	--nv-amber: 251 191 36;
	--nv-ink: #070a10;
	--nv-surface: 15 20 32;
	--nv-surface-2: 20 27 42;
	--nv-text: #f1f5f9;
	--nv-muted: #94a3b8;
	--theme-bg-page-rgb: 7 10 16;
	--theme-primary: rgb(220 38 38); --bs-primary: rgb(220 38 38); --bs-primary-rgb: 220, 38, 38;
	--theme-secondary: rgb(22 163 74); --bs-secondary: rgb(22 163 74); --bs-secondary-rgb: 22, 163, 74;
	--theme-bg-page: #070a10; --theme-bg-primary: rgb(15 20 32); --theme-bg-secondary: rgb(10 14 22);
	--nv-title-gradient: linear-gradient(96deg, #fff 0%, #fecaca 20%, rgb(220 38 38) 44%, rgb(251 191 36) 62%, rgb(22 163 74) 82%, #fff 100%);
}
html[data-nv-theme='noel'] .nv-bg {
	background: radial-gradient(120% 90% at 50% -20%, #14213a 0%, transparent 60%), var(--nv-ink);
}
/* Guirlande sous la barre de navigation */
html[data-nv-theme='noel'] .navbar.navbar-primary {
	border-bottom: 3px solid transparent;
	border-image: repeating-linear-gradient(45deg, #dc2626 0 14px, #f8fafc 14px 28px) 1;
}
html[data-nv-theme='noel'] .navbar-brand::after { content: ' 🎄'; }

/* ── Hiver ────────────────────────────────────────────────── */
html[data-nv-theme='hiver'] {
	--nv-violet: 56 189 248;     /* glace (primaire) */
	--nv-indigo: 14 116 144;
	--nv-cyan: 186 230 253;      /* givre (secondaire) */
	--nv-pink: 165 180 252;
	--nv-amber: 248 250 252;
	--nv-ink: #05070d;
	--nv-surface: 12 17 28;
	--nv-surface-2: 17 24 38;
	--nv-text: #eef6ff;
	--nv-muted: #8ea3bd;
	--theme-bg-page-rgb: 5 7 13;
	--theme-primary: rgb(56 189 248); --bs-primary: rgb(56 189 248); --bs-primary-rgb: 56, 189, 248;
	--theme-secondary: rgb(186 230 253); --bs-secondary: rgb(186 230 253); --bs-secondary-rgb: 186, 230, 253;
	--theme-bg-page: #05070d; --theme-bg-primary: rgb(12 17 28); --theme-bg-secondary: rgb(8 12 20);
	--nv-title-gradient: linear-gradient(96deg, #fff 0%, #e0f2fe 25%, rgb(56 189 248) 50%, rgb(165 180 252) 72%, #fff 100%);
}
html[data-nv-theme='hiver'] .nv-bg {
	background: radial-gradient(120% 90% at 50% -20%, #0f1d33 0%, transparent 60%), var(--nv-ink);
}
/* Givre sur les bords de l'écran */
html[data-nv-theme='hiver'] body::after {
	content: '';
	position: fixed;
	inset: 0;
	z-index: 1028;
	pointer-events: none;
	background: radial-gradient(120% 100% at 50% 50%, transparent 68%, rgb(224 242 254 / 0.16) 100%);
}

/* ── Palestine ────────────────────────────────────────────── */
html[data-nv-theme='palestine'] {
	--nv-violet: 22 163 74;      /* vert (primaire) */
	--nv-indigo: 21 128 61;
	--nv-cyan: 220 38 38;        /* rouge (secondaire) */
	--nv-pink: 248 250 252;      /* blanc */
	--nv-amber: 220 38 38;
	--nv-ink: #06090a;
	--nv-surface: 13 20 18;
	--nv-surface-2: 18 27 24;
	--nv-text: #f2f7f4;
	--nv-muted: #8fa89a;
	--theme-bg-page-rgb: 6 9 10;
	--theme-primary: rgb(22 163 74); --bs-primary: rgb(22 163 74); --bs-primary-rgb: 22, 163, 74;
	--theme-secondary: rgb(220 38 38); --bs-secondary: rgb(220 38 38); --bs-secondary-rgb: 220, 38, 38;
	--theme-bg-page: #06090a; --theme-bg-primary: rgb(13 20 18); --theme-bg-secondary: rgb(9 14 12);
	--nv-title-gradient: linear-gradient(96deg, #fff 0%, #fff 30%, rgb(22 163 74) 52%, #fff 70%, rgb(220 38 38) 88%, #fff 100%);
}
html[data-nv-theme='palestine'] .nv-bg {
	background: radial-gradient(120% 90% at 50% -20%, #0b1f14 0%, transparent 60%), var(--nv-ink);
}
/* Sobriété : pas de grille, grain léger */
html[data-nv-theme='palestine'] .nv-grid { display: none; }
html[data-nv-theme='palestine'] .nv-grain { opacity: 0.025; }

/* Bandeau solidaire */
.nv-solidarity {
	position: relative;
	z-index: 1;
	background: linear-gradient(90deg, #0b1f14 0%, #101a16 55%, #2a0d0f 100%);
	border-bottom: 1px solid rgb(255 255 255 / 0.1);
	color: #f2f7f4;
}
.nv-solidarity__inner {
	display: flex;
	align-items: center;
	gap: 1rem;
	padding: 0.7rem 1rem;
}
.nv-solidarity__text {
	margin: 0;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.35rem 0.9rem;
	font-size: 0.92rem;
	line-height: 1.45;
}
.nv-solidarity__text strong {
	font-family: var(--nv-font-display);
	letter-spacing: 0.02em;
	color: #86efac;
}
.nv-solidarity__promo code {
	background: rgb(255 255 255 / 0.1);
	border: 1px solid rgb(255 255 255 / 0.18);
	color: #fff;
	font-weight: 600;
	padding: 0.15em 0.55em;
	border-radius: 6px;
	letter-spacing: 0.06em;
}
/* Le drapeau, en CSS : trois bandes et le triangle */
.nv-solidarity__flag {
	position: relative;
	flex: 0 0 auto;
	width: 42px;
	height: 28px;
	display: flex;
	flex-direction: column;
	border-radius: 3px;
	overflow: hidden;
	box-shadow: 0 0 0 1px rgb(255 255 255 / 0.15);
}
.nv-solidarity__flag i { flex: 1; display: block; }
.nv-solidarity__flag i:nth-child(1) { background: #111; }
.nv-solidarity__flag i:nth-child(2) { background: #fff; }
.nv-solidarity__flag i:nth-child(3) { background: #16a34a; }
.nv-solidarity__flag b {
	position: absolute;
	inset: 0 auto 0 0;
	width: 16px;
	background: #dc2626;
	clip-path: polygon(0 0, 100% 50%, 0 100%);
}

/* ── Lore — Déchirure temporelle ──────────────────────────── */
html[data-nv-theme='lore'] {
	--nv-violet: 0 255 200;      /* cyan acide (primaire) */
	--nv-indigo: 0 170 140;
	--nv-cyan: 255 0 128;        /* magenta (secondaire) */
	--nv-pink: 255 200 0;        /* or */
	--nv-amber: 255 200 0;
	--nv-ink: #030305;
	--nv-surface: 9 9 14;
	--nv-surface-2: 13 13 20;
	--nv-text: #e6fff8;
	--nv-muted: #7fa39a;
	--theme-bg-page-rgb: 3 3 5;
	--theme-primary: rgb(0 255 200); --bs-primary: rgb(0 255 200); --bs-primary-rgb: 0, 255, 200;
	--theme-secondary: rgb(255 0 128); --bs-secondary: rgb(255 0 128); --bs-secondary-rgb: 255, 0, 128;
	--theme-bg-page: #030305; --theme-bg-primary: rgb(9 9 14); --theme-bg-secondary: rgb(6 6 9);
	--nv-title-gradient: linear-gradient(96deg, #fff 0%, rgb(0 255 200) 30%, #fff 50%, rgb(255 0 128) 72%, #fff 100%);
}

/* Scanlines sur tout l'écran */
html[data-nv-theme='lore'] body::after {
	content: '';
	position: fixed;
	inset: 0;
	z-index: 1028;
	pointer-events: none;
}
/* Le titre se dédouble : aberration chromatique animée */
/* Posé sur le parent seulement : text-shadow est hérité par les lettres,
   et leur animation d'entrée reste intacte. */

@keyframes nv-rift-split {
	0%, 62%, 100% { text-shadow: none; }
	64% { text-shadow: -3px 0 rgb(0 255 200 / 0.9), 3px 0 rgb(255 0 128 / 0.9); }
	66% { text-shadow: 3px 0 rgb(0 255 200 / 0.9), -3px 0 rgb(255 0 128 / 0.9); }
	68% { text-shadow: -1px 0 rgb(0 255 200 / 0.9), 1px 0 rgb(255 0 128 / 0.9); }
	70% { text-shadow: none; }
	88% { text-shadow: 2px 0 rgb(0 255 200 / 0.8), -2px 0 rgb(255 0 128 / 0.8); }
	90% { text-shadow: none; }
}
/* Le bloc central saute, par à-coups, comme une image qui perd le signal */
html[data-nv-theme='lore'] .parallax .middle {
	animation: nv-rift-jitter 7s steps(1, end) infinite;
}
@keyframes nv-rift-jitter {
	0%, 40%, 100% { clip-path: none; }
	41% { transform: translate(-6px, 0); clip-path: inset(10% 0 55% 0); }
	42% { transform: translate(5px, 0); clip-path: inset(40% 0 20% 0); }
	43% { transform: none; clip-path: none; }
	77% { transform: translate(4px, 0); clip-path: inset(60% 0 5% 0); }
	78% { transform: none; clip-path: none; }
}
/* La marque clignote */
html[data-nv-theme='lore'] .navbar-brand {
	animation: nv-rift-flicker 5s steps(1, end) infinite;
}
@keyframes nv-rift-flicker {
	0%, 93%, 100% { opacity: 1; }
	94% { opacity: 0.35; }
	95% { opacity: 1; }
	97% { opacity: 0.5; }
	98% { opacity: 1; }
}


/* Calque des effets (neige, braises, déchirure) : au-dessus du contenu,
   sous la barre de navigation. */
.nv-fx {
	position: fixed;
	inset: 0;
	z-index: 1029;
	pointer-events: none;
}
body.nv-lite .nv-fx { display: none; }

/* ── Admin → Thèmes ───────────────────────────────────────── */
.nv-themes__lead { max-width: 64ch; }
.nv-theme-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
	gap: 1rem;
	margin-top: 1.25rem;
}
.nv-theme-card {
	position: relative;
	display: flex;
	flex-direction: column;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.08);
	overflow: hidden;
	cursor: pointer;
	transition: transform 0.4s var(--nv-ease), border-color 0.4s var(--nv-ease), box-shadow 0.4s var(--nv-ease);
}
.nv-theme-card:hover { transform: translateY(-4px); border-color: rgb(var(--nv-line) / 0.18); }
.nv-theme-card.is-active {
	border-color: rgb(var(--nv-violet) / 0.8);
	box-shadow: 0 0 0 2px rgb(var(--nv-violet) / 0.35), var(--nv-glow);
}
.nv-theme-card__input { position: absolute; opacity: 0; pointer-events: none; }
.nv-theme-card__input:focus-visible + .nv-theme-card__preview { outline: 2px solid rgb(var(--nv-cyan)); }
/* Aperçu : les quatre couleurs de l'ambiance, composées comme le héros */
.nv-theme-card__preview {
	display: grid;
	place-items: center;
	aspect-ratio: 16 / 9;
	background:
		radial-gradient(80% 70% at 20% 100%, color-mix(in srgb, var(--s1) 55%, transparent), transparent 60%),
		radial-gradient(70% 60% at 85% 10%, color-mix(in srgb, var(--s2) 45%, transparent), transparent 60%),
		radial-gradient(50% 50% at 60% 60%, color-mix(in srgb, var(--s3) 30%, transparent), transparent 60%),
		var(--s4);
}
.nv-theme-card__title {
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: 2.2rem;
	letter-spacing: -0.03em;
	background: linear-gradient(96deg, #fff, var(--s1) 45%, var(--s2) 75%, #fff);
	-webkit-background-clip: text;
	background-clip: text;
	-webkit-text-fill-color: transparent;
}
.nv-theme-card__body { display: flex; flex-direction: column; gap: 0.45rem; padding: 1rem 1.1rem 1.1rem; }
.nv-theme-card__name { font-weight: 600; color: #fff; }
.nv-theme-card__tagline { font-size: 0.86rem; color: var(--nv-muted); line-height: 1.5; }
.nv-theme-card__swatches { display: flex; gap: 0.35rem; margin-top: 0.2rem; }
.nv-theme-card__swatches i {
	width: 18px; height: 18px; border-radius: 50%;
	box-shadow: 0 0 0 1px rgb(255 255 255 / 0.15) inset;
}
.nv-theme-card__badge {
	position: absolute;
	top: 0.75rem;
	left: 0.75rem;
	border-radius: 999px;
	padding: 0.28em 0.7em;
	font-size: 0.72rem;
	font-weight: 700;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	background: rgb(var(--nv-violet));
	color: #fff;
	box-shadow: 0 6px 18px -6px rgb(var(--nv-violet));
}

/* ============================================================================
   24. Moments signature par ambiance
   Nœuds injectés par le JS (buildEffects → setup) et retirés au changement
   d'ambiance. Que du transform/opacity : rien qui repeigne à chaque image.
   ========================================================================= */

/* ── Halloween : brouillard au sol, lune cratérisée, chauves-souris (canvas) ── */
.nv-fog {
	position: absolute;
	left: -15%;
	right: -15%;
	bottom: -12%;
	height: 48%;
	z-index: 1;
	pointer-events: none;
}
.nv-fog i {
	position: absolute;
	inset: 0;
	background: radial-gradient(55% 55% at 50% 65%, rgb(140 100 80 / 0.42), transparent 70%);
	animation: nv-fog 24s ease-in-out infinite alternate;
	will-change: transform;
}
.nv-fog i:nth-child(2) {
	background: radial-gradient(50% 50% at 35% 60%, rgb(147 51 234 / 0.22), transparent 70%);
	animation-duration: 33s;
	animation-delay: -9s;
}
.nv-fog i:nth-child(3) {
	background: radial-gradient(45% 50% at 70% 70%, rgb(249 115 22 / 0.16), transparent 70%);
	animation-duration: 29s;
	animation-delay: -17s;
}
@keyframes nv-fog {
	from { transform: translate3d(-7%, 2%, 0) scale(1.06); }
	to   { transform: translate3d(7%, -2%, 0) scale(0.96); }
}
html[data-nv-theme='halloween'] .nv-hero-veil {
	background:
		radial-gradient(118px circle at 82% 22%, #fff3d6 0 99%, transparent 100%),
		radial-gradient(22px circle at 78% 18%, rgb(0 0 0 / 0.14), transparent 72%),
		radial-gradient(14px circle at 86% 27%, rgb(0 0 0 / 0.12), transparent 72%),
		radial-gradient(9px circle at 80% 27%, rgb(0 0 0 / 0.1), transparent 72%),
		radial-gradient(260px circle at 82% 22%, rgb(255 236 200 / 0.28), transparent 70%),
		radial-gradient(120% 90% at 50% 50%, transparent 45%, rgb(10 6 8 / 0.85) 100%),
		linear-gradient(to bottom, transparent 58%, var(--nv-ink) 100%);
}
html[data-nv-theme='halloween'] .parallax::after {
	background: linear-gradient(to right, transparent, rgb(249 115 22 / 0.9), rgb(163 230 53 / 0.6), transparent);
	box-shadow: 0 0 40px 6px rgb(249 115 22 / 0.35);
}

/* ── Noël : guirlande sous la barre, neige sur les cartes ── */
.nv-lights {
	position: absolute;
	left: 0;
	right: 0;
	bottom: -9px;
	height: 0;
	display: flex;
	justify-content: space-evenly;
	pointer-events: none;
	border-top: 2px solid #23392c;
}
.nv-lights i {
	position: relative;
	top: 3px;
	width: 9px;
	height: 13px;
	border-radius: 45% 45% 55% 55%;
	background: var(--c);
	box-shadow: 0 0 8px var(--c), 0 0 18px var(--c);
	animation: nv-twinkle 1.7s ease-in-out infinite alternate;
	animation-delay: var(--d);
}
.nv-lights i::before {
	content: '';
	position: absolute;
	top: -4px;
	left: 2.5px;
	width: 4px;
	height: 5px;
	border-radius: 2px 2px 0 0;
	background: #23392c;
}
@keyframes nv-twinkle {
	from { opacity: 0.45; transform: scale(0.92); }
	to   { opacity: 1; transform: scale(1.06); }
}
html[data-nv-theme='noel'] .card {
	box-shadow: inset 0 3px 0 rgb(255 255 255 / 0.85), inset 0 8px 10px -6px rgb(255 255 255 / 0.55),
		0 20px 45px -28px rgb(0 0 0 / 0.95);
}
html[data-nv-theme='noel'] .parallax::after {
	background: linear-gradient(to right, transparent, rgb(220 38 38 / 0.85), rgb(251 191 36 / 0.9), rgb(22 163 74 / 0.85), transparent);
	box-shadow: 0 0 40px 6px rgb(251 191 36 / 0.3);
}

/* ── Hiver : aurore boréale qui défile, givre dans les angles ── */
.nv-aurora {
	position: absolute;
	left: 0;
	top: 4%;
	width: 200%;
	height: 42%;
	z-index: 0;
	pointer-events: none;
	opacity: 0.6;
	transform: skewY(-5deg);
	mask-image: linear-gradient(to bottom, transparent, #000 28%, #000 62%, transparent);
	-webkit-mask-image: linear-gradient(to bottom, transparent, #000 28%, #000 62%, transparent);
	background: linear-gradient(100deg,
		transparent 0%, rgb(56 189 248 / 0.45) 12%, rgb(165 180 252 / 0.35) 22%, rgb(52 211 153 / 0.3) 31%,
		rgb(56 189 248 / 0.4) 40%, transparent 50%,
		rgb(56 189 248 / 0.45) 62%, rgb(165 180 252 / 0.35) 72%, rgb(52 211 153 / 0.3) 81%, rgb(56 189 248 / 0.4) 90%, transparent 100%);
	animation: nv-aurora 26s linear infinite;
	will-change: transform;
}
@keyframes nv-aurora {
	from { transform: skewY(-5deg) translate3d(0, 0, 0); }
	to   { transform: skewY(-5deg) translate3d(-50%, 0, 0); }
}
html[data-nv-theme='hiver'] .nv-bg::after {
	content: '';
	position: absolute;
	inset: 0;
	background:
		radial-gradient(38% 34% at 0% 0%, rgb(224 242 254 / 0.2), transparent 62%),
		radial-gradient(34% 30% at 100% 100%, rgb(224 242 254 / 0.16), transparent 62%),
		radial-gradient(22% 20% at 100% 0%, rgb(224 242 254 / 0.1), transparent 62%);
}

/* ── Palestine : motif keffieh discret, barre de progression aux couleurs, pulsation ── */
html[data-nv-theme='palestine'] .nv-bg::after {
	content: '';
	position: absolute;
	inset: 0;
	opacity: 0.55;
	background:
		repeating-linear-gradient(45deg, rgb(255 255 255 / 0.035) 0 1.5px, transparent 1.5px 16px),
		repeating-linear-gradient(-45deg, rgb(255 255 255 / 0.035) 0 1.5px, transparent 1.5px 16px);
	mask-image: radial-gradient(90% 70% at 50% 40%, #000 20%, transparent 80%);
	-webkit-mask-image: radial-gradient(90% 70% at 50% 40%, #000 20%, transparent 80%);
}
html[data-nv-theme='palestine'] .nv-progress {
	background: linear-gradient(90deg, #111 0 25%, #fff 25% 50%, #16a34a 50% 75%, #dc2626 75%);
	box-shadow: 0 0 14px rgb(22 163 74 / 0.8);
}
html[data-nv-theme='palestine'] .nv-solidarity__flag {
	animation: nv-heartbeat 2.6s ease-in-out infinite;
}
@keyframes nv-heartbeat {
	0%, 100% { transform: scale(1); }
	14% { transform: scale(1.08); }
	28% { transform: scale(1); }
	42% { transform: scale(1.06); }
}
html[data-nv-theme='palestine'] .parallax::after {
	background: linear-gradient(to right, transparent, #111 20%, #fff 40%, #16a34a 60%, #dc2626 80%, transparent);
	box-shadow: 0 0 40px 4px rgb(22 163 74 / 0.3);
	height: 2px;
}

/* ── Lore : fissure dans le héros, inversion flash, horloge fracturée ── */
.nv-crack {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	z-index: 1;
	pointer-events: none;
	mix-blend-mode: screen;
	animation: nv-crack-flicker 4.7s steps(1, end) infinite;
}
.nv-crack path {
	fill: none;
	stroke-width: 0.35;
	stroke-linejoin: miter;
	vector-effect: non-scaling-stroke;
	stroke-dasharray: 6 3;
	animation: nv-crack-crawl 1.6s linear infinite;
}
.nv-crack .cyan { stroke: #00ffc8; filter: drop-shadow(0 0 6px #00ffc8); }
.nv-crack .mag  { stroke: #ff0080; filter: drop-shadow(0 0 6px #ff0080); opacity: 0.8; }
@keyframes nv-crack-crawl { to { stroke-dashoffset: -18; } }
@keyframes nv-crack-flicker {
	0%, 71%, 100% { opacity: 1; }
	72% { opacity: 0.2; }
	73% { opacity: 1; }
	75% { opacity: 0.5; }
	76% { opacity: 1; }
}
.nv-invert {
	position: fixed;
	inset: 0;
	z-index: 1032;
	pointer-events: none;
	background: #fff;
	mix-blend-mode: difference;
	opacity: 0;
}
.nv-invert.is-on { opacity: 1; }
.nv-clock {
	position: fixed;
	left: 1.1rem;
	bottom: 1rem;
	z-index: 1029;
	pointer-events: none;
	font-family: var(--nv-font-mono);
	font-size: 0.72rem;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: rgb(0 255 200 / 0.85);
	text-shadow: 1px 0 rgb(255 0 128 / 0.8), -1px 0 rgb(0 255 200 / 0.8);
	background: rgb(3 3 5 / 0.6);
	border: 1px solid rgb(0 255 200 / 0.25);
	padding: 0.35rem 0.6rem;
	border-radius: 6px;
}
.nv-clock b { color: #fff; font-weight: 500; }


.nv-theme-card__flag {
	position: absolute;
	top: 0.75rem;
	right: 0.75rem;
	width: 28px;
	height: 28px;
	display: grid;
	place-items: center;
	border-radius: 50%;
	background: rgb(0 0 0 / 0.45);
	border: 1px solid rgb(255 255 255 / 0.2);
	color: #fff;
	font-size: 0.72rem;
}

/* ============================================================================
   25. Admin → Commandes, bannissement par SteamID
   ========================================================================= */

.nv-admin-hint {
	display: inline-flex;
	align-items: center;
	margin-bottom: 1.25rem;
	padding: 0.6rem 1rem;
	border-radius: 999px;
	background: rgb(var(--nv-violet) / 0.1);
	border: 1px solid rgb(var(--nv-violet) / 0.3);
	color: var(--nv-text);
	font-size: 0.9rem;
	text-decoration: none;
	transition: border-color 0.3s var(--nv-ease), background 0.3s var(--nv-ease);
}
.nv-admin-hint:hover {
	color: #fff;
	background: rgb(var(--nv-violet) / 0.18);
	border-color: rgb(var(--nv-violet) / 0.55);
}

.nv-orders-filter { margin: 1.25rem 0 1rem; }
.nv-orders-filter__grid {
	display: grid;
	grid-template-columns: 11rem 11rem minmax(14rem, 1fr) 11rem;
	gap: 0.9rem;
}
.nv-orders-filter__grid label {
	display: flex;
	flex-direction: column;
	gap: 0.35rem;
	margin: 0;
}
.nv-orders-filter__foot {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 0.75rem;
	margin-top: 1rem;
	padding-top: 1rem;
	border-top: 1px solid rgb(var(--nv-line) / 0.07);
}
.nv-orders-filter__actions { display: flex; gap: 0.5rem; }
.nv-orders-filter__actions .nv-btn-ghost { margin-top: 0; }
@media (max-width: 991.98px) {
	.nv-orders-filter__grid { grid-template-columns: 1fr 1fr; }
	.nv-orders-filter__player { grid-column: 1 / -1; }
}

.nv-input-icon { position: relative; display: block; }
.nv-input-icon > i {
	position: absolute;
	left: 0.9rem;
	top: 50%;
	transform: translateY(-50%);
	color: var(--nv-muted);
	pointer-events: none;
}
.nv-input-icon > .form-control { padding-left: 2.5rem; }
.nv-mono-input {
	font-family: var(--nv-font-mono);
	letter-spacing: 0.02em;
}

.nv-chips { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.nv-chip {
	padding: 0.35em 0.9em;
	border-radius: 999px;
	font-size: 0.82rem;
	color: var(--nv-muted);
	background: rgb(var(--nv-line) / 0.04);
	border: 1px solid rgb(var(--nv-line) / 0.1);
	text-decoration: none;
	transition: color 0.3s, border-color 0.3s, background 0.3s;
}
.nv-chip:hover { color: #fff; border-color: rgb(var(--nv-line) / 0.25); }
.nv-chip.is-active {
	color: #fff;
	background: rgb(var(--nv-violet) / 0.2);
	border-color: rgb(var(--nv-violet) / 0.6);
}

.nv-orders-summary {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
	gap: 0.9rem;
	margin-bottom: 1.5rem;
}
.nv-stat {
	position: relative;
	overflow: hidden;
	display: flex;
	flex-direction: column;
	gap: 0.3rem;
	padding: 1rem 1.2rem 1rem 1.35rem;
	border-radius: var(--nv-radius-sm);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
}
.nv-stat::before {
	content: '';
	position: absolute;
	inset: 0 auto 0 0;
	width: 3px;
	background: rgb(var(--nv-cyan) / 0.75);
}
.nv-stat strong {
	display: flex;
	flex-wrap: wrap;
	gap: 0.1rem 0.9rem;
	font-family: var(--nv-font-display);
	font-size: 1.45rem;
	font-weight: 700;
	color: #fff;
	font-variant-numeric: tabular-nums;
}
.nv-stat small { color: var(--nv-muted); font-size: 0.8rem; }
.nv-stat--refund::before { background: rgb(251 146 60 / 0.8); }

.nv-orders--admin .nv-order__bar {
	grid-template-columns: 4.5rem minmax(0, 1.2fr) minmax(0, 1fr) 6.5rem 8rem 9.5rem 1.5rem;
}
.nv-order__player {
	display: flex;
	flex-direction: column;
	min-width: 0;
	line-height: 1.25;
}
.nv-order__player-name,
.nv-order__player-id {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.nv-order__player-name { color: var(--nv-text); }
.nv-order__player-id {
	font-family: var(--nv-font-mono);
	font-size: 0.72rem;
	color: var(--nv-muted);
}
.nv-order__filter-link { margin-left: 0.5rem; color: var(--nv-muted); font-size: 0.8rem; }
.nv-order__filter-link:hover { color: rgb(var(--nv-cyan)); }
@media (min-width: 768px) and (max-width: 1199.98px) {
	.nv-orders--admin .nv-order__bar {
		grid-template-columns: 4rem minmax(0, 1fr) minmax(0, 1fr) 7rem 9.5rem 1.5rem;
	}
	.nv-orders--admin .nv-order__date { display: none; }
}
@media (max-width: 767.98px) {
	.nv-orders--admin .nv-order__bar { grid-template-columns: 1fr auto; }
	.nv-order__player { grid-column: 1; }
}
.nv-pager { flex-wrap: wrap; align-items: center; }
.nv-pager__gap { color: var(--nv-muted); padding: 0 0.25rem; }

/* Bannissement par SteamID */
.nv-banform__form { margin-top: 1.1rem; }
.nv-banform__duration { display: flex; flex-direction: column; gap: 0.35rem; }
.nv-banform__duration-row { display: grid; grid-template-columns: 6rem 1fr; gap: 0.5rem; }
.nv-banform__duration-row :disabled { opacity: 0.4; }
.nv-field-grid label.nv-banform__permanent {
	flex-direction: row;
	align-items: center;
	gap: 0.5rem;
	margin-top: 0.25rem;
	font-size: 0.9rem;
	color: var(--nv-text);
	cursor: pointer;
}
.nv-banform__permanent .form-check-input { margin: 0; }
.nv-banform__note { margin: 0.25rem 0 0; }
.nv-banform__actions { display: flex; justify-content: flex-end; margin-top: 1rem; }
.nv-banform { transition: border-color 0.4s var(--nv-ease); }
.nv-banform:has(.nv-ban-permanent:checked) { border-left-color: rgb(244 63 94 / 0.85); }

/* ============================================================================
   26. Bandeau promo des fêtes
   Une ligne sous la barre de navigation : titre, texte, code à copier, lien
   boutique. Chaque ambiance l'habille à sa façon.
   ========================================================================= */

.nv-promo {
	position: relative;
	z-index: 1;
	overflow: hidden;
	color: #fff;
	border-bottom: 1px solid rgb(255 255 255 / 0.1);
}
.nv-promo__inner {
	position: relative;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.6rem 1.1rem;
	padding: 0.65rem 1rem;
}
.nv-promo__mark {
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	display: grid;
	place-items: center;
}
.nv-promo__mark svg { width: 100%; height: 100%; overflow: visible; }
.nv-promo__text {
	margin: 0;
	flex: 1 1 280px;
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.15rem 0.8rem;
	font-size: 0.92rem;
	line-height: 1.45;
}
.nv-promo__text strong {
	font-family: var(--nv-font-display);
	letter-spacing: 0.02em;
}
.nv-promo__code {
	display: inline-flex;
	align-items: stretch;
	padding: 0;
	border: 0;
	background: none;
	color: inherit;
	font: inherit;
	cursor: pointer;
	transition: transform 0.3s var(--nv-ease);
}
.nv-promo__code:hover { transform: translateY(-1px); }
.nv-promo__code code {
	display: block;
	padding: 0.32em 0.85em;
	font-size: 0.92rem;
	font-weight: 700;
	letter-spacing: 0.14em;
	color: inherit;
	background: rgb(255 255 255 / 0.08);
	border: 1px dashed rgb(255 255 255 / 0.5);
	border-right: 0;
	border-radius: 8px 0 0 8px;
}
.nv-promo__copy {
	display: flex;
	align-items: center;
	padding: 0 0.75em;
	font-size: 0.7rem;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	background: rgb(255 255 255 / 0.92);
	color: #111;
	border-radius: 0 8px 8px 0;
	transition: background 0.3s, color 0.3s;
}
.nv-promo__code.is-copied .nv-promo__copy { background: #22c55e; color: #fff; }
.nv-promo__cta {
	display: inline-flex;
	align-items: center;
	font-size: 0.88rem;
	font-weight: 600;
	color: inherit;
	text-decoration: none;
	white-space: nowrap;
	border-bottom: 1px solid currentColor;
	padding-bottom: 1px;
}
.nv-promo__cta:hover { color: inherit; opacity: 0.8; }

/* Saint-Valentin : velours bordeaux, cœur qui bat */
.nv-promo--valentin {
	background:
		radial-gradient(60% 180% at 0% 50%, rgb(251 113 133 / 0.28), transparent 60%),
		linear-gradient(90deg, #3b0716 0%, #6d0f2c 55%, #9f1239 100%);
}
.nv-promo--valentin .nv-promo__mark { color: #fb7185; filter: drop-shadow(0 0 8px rgb(251 113 133 / 0.8)); animation: nv-heartbeat 1.3s ease-in-out infinite; }
.nv-promo--valentin strong { color: #fecdd3; }
.nv-promo--valentin .nv-promo__code code { border-color: rgb(253 164 175 / 0.7); }
.nv-promo--valentin .nv-promo__copy { background: #fde2e4; color: #7f1233; }

/* Nouvel An : nuit, filets d'or, reflet qui balaie */
.nv-promo--nouvelan {
	background: linear-gradient(90deg, #06060f 0%, #0d0d1f 50%, #06060f 100%);
	border-top: 1px solid rgb(231 186 84 / 0.35);
	border-bottom-color: rgb(231 186 84 / 0.35);
}
.nv-promo--nouvelan::before {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(100deg, transparent 35%, rgb(231 186 84 / 0.2) 50%, transparent 65%);
	transform: translateX(-100%);
	animation: nv-promo-glint 6s var(--nv-ease) infinite;
	pointer-events: none;
}
@keyframes nv-promo-glint {
	0%, 40% { transform: translateX(-100%); }
	100% { transform: translateX(100%); }
}
.nv-promo--nouvelan .nv-promo__mark { color: #f5d88a; filter: drop-shadow(0 0 8px rgb(231 186 84 / 0.9)); animation: nv-spark-turn 8s linear infinite; }
@keyframes nv-spark-turn { to { transform: rotate(360deg); } }
.nv-promo--nouvelan strong { color: #f5d88a; }
.nv-promo--nouvelan .nv-promo__code code { border-color: rgb(231 186 84 / 0.7); color: #fde68a; }
.nv-promo--nouvelan .nv-promo__copy { background: #e7ba54; color: #1a1204; }

/* Fête de l'Humanité : papier blanc, fil doré, colombe */
.nv-promo--humanite {
	background: linear-gradient(90deg, #ffffff 0%, #f8f6f1 100%);
	color: #1f2733;
	border-top: 1px solid rgb(201 168 106 / 0.55);
	border-bottom: 1px solid rgb(201 168 106 / 0.55);
}
.nv-promo--humanite .nv-promo__mark {
	color: #5b7fa6;
	font-size: 1.15rem;
	animation: nv-dove-float 6s ease-in-out infinite;
}
@keyframes nv-dove-float {
	0%, 100% { transform: translateY(0); }
	50% { transform: translateY(-3px); }
}
.nv-promo--humanite strong { color: #5b7fa6; }
.nv-promo--humanite .nv-promo__code code {
	background: #fff;
	color: #1f2733;
	border: 1px dashed rgb(31 39 51 / 0.4);
	border-right: 0;
}
.nv-promo--humanite .nv-promo__copy { background: #1f2733; color: #fff; }
.nv-promo--humanite .nv-promo__cta { color: #5b7fa6; }

@media (prefers-reduced-motion: reduce) {
	.nv-promo__mark,
	.nv-promo--nouvelan::before { animation: none !important; }
}

/* ============================================================================
   27. Ambiances de fête : Saint-Valentin, Nouvel An, Fête de l'Humanité
   Nœuds injectés par le JS (dressUp) juste avant le bloc central du héros,
   pour passer sous le titre. Que du transform/opacity en animation.
   ========================================================================= */

/* ── Saint-Valentin ───────────────────────────────────────── */
html[data-nv-theme='valentin'] {
	--nv-violet: 225 29 72;      /* rose profond (primaire) */
	--nv-indigo: 159 18 57;
	--nv-cyan: 251 113 133;      /* rose (secondaire) */
	--nv-pink: 244 196 160;      /* or rosé */
	--nv-amber: 244 196 160;
	--nv-ink: #0c0508;
	--nv-surface: 24 11 16;
	--nv-surface-2: 33 15 22;
	--nv-text: #fdf2f4;
	--nv-muted: #b58b97;
	--theme-bg-page-rgb: 12 5 8;
	--theme-primary: rgb(225 29 72); --bs-primary: rgb(225 29 72); --bs-primary-rgb: 225, 29, 72;
	--theme-secondary: rgb(251 113 133); --bs-secondary: rgb(251 113 133); --bs-secondary-rgb: 251, 113, 133;
	--theme-bg-page: #0c0508; --theme-bg-primary: rgb(24 11 16); --theme-bg-secondary: rgb(16 7 11);
	--nv-title-gradient: linear-gradient(96deg, #fff1f2 0%, #fecdd3 22%, rgb(251 113 133) 42%, rgb(225 29 72) 62%, #f4c4a0 84%, #fff1f2 100%);
}
html[data-nv-theme='valentin'] .nv-bg {
	background:
		radial-gradient(120% 90% at 50% -20%, #2e0a18 0%, transparent 60%),
		radial-gradient(60% 50% at 0% 100%, rgb(225 29 72 / 0.14), transparent 70%),
		radial-gradient(50% 40% at 100% 80%, rgb(244 196 160 / 0.07), transparent 70%),
		var(--nv-ink);
}
html[data-nv-theme='valentin'] .nv-grid { opacity: 0.4; }
html[data-nv-theme='valentin'] .nv-progress {
	background: linear-gradient(90deg, #9f1239, #e11d48 40%, #fda4af 70%, #f4c4a0);
	box-shadow: 0 0 14px rgb(225 29 72 / 0.8);
}
html[data-nv-theme='valentin'] .parallax::after {
	background: linear-gradient(to right, transparent, rgb(225 29 72 / 0.9), rgb(244 196 160 / 0.85), rgb(225 29 72 / 0.9), transparent);
	box-shadow: 0 0 40px 6px rgb(225 29 72 / 0.35);
}
html[data-nv-theme='valentin'] .card:hover {
	box-shadow: 0 0 0 1px rgb(251 113 133 / 0.35), 0 26px 60px -26px rgb(225 29 72 / 0.6), var(--nv-glow);
}
html[data-nv-theme='valentin'] .nv-cursor-halo { border-color: rgb(251 113 133 / 0.6); }

/* Le cœur se trace puis bat derrière le titre : double battement, pause */
.nv-heart {
	position: absolute;
	left: 50%;
	top: 50%;
	width: min(68vmin, 620px);
	height: auto;
	aspect-ratio: 100 / 90;
	overflow: visible;
	pointer-events: none;
	transform: translate(-50%, -52%);
	filter: drop-shadow(0 0 26px rgb(225 29 72 / 0.55));
	animation: nv-lubdub 1.3s ease-in-out 2.4s infinite;
	will-change: transform;
}
.nv-heart path {
	fill: rgb(225 29 72 / 0.07);
	stroke: url(#nvHeartStroke);
	stroke-width: 0.5;
	stroke-linejoin: round;
	stroke-dasharray: 1;
	stroke-dashoffset: 1;
	animation: nv-heart-draw 2.4s var(--nv-ease-out) 0.2s forwards;
}
@keyframes nv-heart-draw { to { stroke-dashoffset: 0; } }
@keyframes nv-lubdub {
	0%, 50%, 100% { transform: translate(-50%, -52%) scale(1); }
	12% { transform: translate(-50%, -52%) scale(1.05); }
	24% { transform: translate(-50%, -52%) scale(0.99); }
	34% { transform: translate(-50%, -52%) scale(1.035); }
}
/* Tracé d'électrocardiogramme au pied du héros */
.nv-ecg {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 12%;
	width: 100%;
	height: 60px;
	pointer-events: none;
	overflow: visible;
}
.nv-ecg path { fill: none; stroke-linejoin: round; stroke-linecap: round; }
.nv-ecg .base { stroke: rgb(251 113 133 / 0.14); stroke-width: 1.2; }
.nv-ecg .pulse {
	stroke: #fb7185;
	stroke-width: 2;
	stroke-dasharray: 0.16 0.84;
	filter: drop-shadow(0 0 6px #e11d48);
	animation: nv-ecg 2.6s linear infinite;
}
@keyframes nv-ecg {
	from { stroke-dashoffset: 0.16; }
	to { stroke-dashoffset: -0.84; }
}

/* ── Nouvel An ────────────────────────────────────────────── */
html[data-nv-theme='nouvelan'] {
	--nv-violet: 231 186 84;     /* or (primaire) */
	--nv-indigo: 161 118 36;
	--nv-cyan: 165 180 252;      /* argent bleuté (secondaire) */
	--nv-pink: 253 230 138;      /* champagne */
	--nv-amber: 253 230 138;
	--nv-ink: #04040a;
	--nv-surface: 12 12 22;
	--nv-surface-2: 17 17 31;
	--nv-text: #f8f5ec;
	--nv-muted: #9d99b0;
	--theme-bg-page-rgb: 4 4 10;
	--theme-primary: rgb(231 186 84); --bs-primary: rgb(231 186 84); --bs-primary-rgb: 231, 186, 84;
	--theme-secondary: rgb(165 180 252); --bs-secondary: rgb(165 180 252); --bs-secondary-rgb: 165, 180, 252;
	--theme-bg-page: #04040a; --theme-bg-primary: rgb(12 12 22); --theme-bg-secondary: rgb(8 8 15);
	--nv-title-gradient: linear-gradient(96deg, #fffbeb 0%, #fde68a 24%, rgb(231 186 84) 46%, #fffbeb 62%, rgb(165 180 252) 82%, #fffbeb 100%);
}
html[data-nv-theme='nouvelan'] .nv-bg {
	background:
		radial-gradient(120% 90% at 50% -20%, #111633 0%, transparent 60%),
		radial-gradient(70% 50% at 50% 110%, rgb(231 186 84 / 0.08), transparent 70%),
		var(--nv-ink);
}
/* Ciel étoilé : deux trames de points à pas différents, qui scintillent */
html[data-nv-theme='nouvelan'] .nv-bg::after {
	content: '';
	position: absolute;
	inset: 0;
	background-image:
		radial-gradient(1px 1px at 23px 41px, rgb(255 255 255 / 0.9), transparent 60%),
		radial-gradient(1px 1px at 137px 89px, rgb(253 230 138 / 0.8), transparent 60%),
		radial-gradient(1.5px 1.5px at 201px 17px, rgb(255 255 255 / 0.7), transparent 60%),
		radial-gradient(1px 1px at 71px 173px, rgb(165 180 252 / 0.8), transparent 60%),
		radial-gradient(1px 1px at 311px 131px, rgb(255 255 255 / 0.6), transparent 60%);
	background-size: 347px 223px;
	-webkit-mask-image: linear-gradient(to bottom, #000 30%, transparent 85%);
	mask-image: linear-gradient(to bottom, #000 30%, transparent 85%);
	animation: nv-stars 4.5s ease-in-out infinite alternate;
}
@keyframes nv-stars { from { opacity: 0.45; } to { opacity: 1; } }
html[data-nv-theme='nouvelan'] .title-main { filter: drop-shadow(0 0 28px rgb(231 186 84 / 0.4)); }
html[data-nv-theme='nouvelan'] .btn-primary,
html[data-nv-theme='nouvelan'] .nv-theme-card__badge { color: #1a1204; }
html[data-nv-theme='nouvelan'] .nv-progress {
	background: linear-gradient(90deg, #a17624, #e7ba54 45%, #fffbeb 60%, #e7ba54 75%, #a5b4fc);
	box-shadow: 0 0 14px rgb(231 186 84 / 0.8);
}
html[data-nv-theme='nouvelan'] .parallax::after {
	background: linear-gradient(to right, transparent, rgb(231 186 84 / 0.9), #fffbeb, rgb(231 186 84 / 0.9), transparent);
	box-shadow: 0 0 40px 6px rgb(231 186 84 / 0.35);
}
html[data-nv-theme='nouvelan'] .card:hover {
	box-shadow: 0 0 0 1px rgb(231 186 84 / 0.4), 0 26px 60px -28px rgb(231 186 84 / 0.45), var(--nv-glow);
}

/* L'année qui arrive, en chiffres détourés géants, avec un reflet qui passe */
.nv-year {
	position: absolute;
	left: 50%;
	top: 50%;
	transform: translate(-50%, -50%);
	pointer-events: none;
	user-select: none;
	white-space: nowrap;
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: clamp(7rem, 30vw, 24rem);
	line-height: 1;
	letter-spacing: -0.05em;
	color: transparent;
	-webkit-text-stroke: 1px rgb(231 186 84 / 0.32);
	background: linear-gradient(100deg, transparent 42%, rgb(255 240 200 / 0.55) 50%, transparent 58%) 150% 0 / 250% 100% no-repeat;
	-webkit-background-clip: text;
	background-clip: text;
	animation: nv-year-glint 7s linear infinite;
}
@keyframes nv-year-glint {
	from { background-position: 150% 0; }
	to { background-position: -150% 0; }
}
.nv-clock--year {
	color: #f5d88a;
	text-shadow: 0 0 12px rgb(231 186 84 / 0.55);
	background: rgb(4 4 10 / 0.72);
	border-color: rgb(231 186 84 / 0.35);
	letter-spacing: 0.14em;
}
.nv-clock--year b { color: #fffbeb; font-weight: 700; }



/* ============================================================================
   30. Ambiances claires (Fête de l'Humanité, Lore)
   Le thème est sombre par construction : une cinquantaine de blancs et
   quelques fonds noirs sont codés en dur. Cette couche les rebranche sur
   les jetons pour toute ambiance à fond clair. Chaque ambiance claire ne
   définit ensuite que ses couleurs et ses moments signature.
   ========================================================================= */

html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) ::selection {
	background: rgb(var(--nv-violet) / 0.25);
	color: var(--nv-text);
}
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) ::-webkit-scrollbar { background-color: var(--nv-ink); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) ::-webkit-scrollbar-thumb { border-color: var(--nv-ink); }

html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) body.nv-scrolled .navbar.navbar-primary {
	background: rgb(var(--nv-surface) / 0.84) !important;
	box-shadow: 0 12px 40px -24px rgb(var(--nv-line) / 0.35);
}
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .navbar-brand {
	background: linear-gradient(100deg, var(--nv-text), rgb(var(--nv-violet)) 55%, rgb(var(--nv-cyan)));
	-webkit-background-clip: text;
	background-clip: text;
}
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .navbar .nav-link:hover,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .navbar .nav-link.active,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .navbar-secondary .nav-link.active,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .navbar-secondary .nav-link:hover { color: var(--nv-text) !important; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .navbar-toggler-icon { filter: invert(0.8); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .navbar-secondary { background: rgb(var(--nv-surface) / 0.82) !important; }

html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .dropdown-menu,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .dropdown-menu-dark {
	background: rgb(var(--nv-surface) / 0.97);
	border-color: rgb(var(--nv-line) / 0.12);
	box-shadow: 0 24px 60px -26px rgb(var(--nv-line) / 0.4);
	color: var(--nv-text);
}
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .dropdown-item,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .dropdown-menu-dark .dropdown-item { color: rgb(var(--nv-line) / 0.8); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .dropdown-item:hover,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .dropdown-item:focus,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .dropdown-menu-dark .dropdown-item:hover { color: var(--nv-text); }

html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-hero-veil {
	background:
		radial-gradient(120% 90% at 50% 50%, transparent 45%, rgb(var(--nv-ink-rgb) / 0.8) 100%),
		linear-gradient(to bottom, transparent 60%, var(--nv-ink) 100%);
}
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .card { box-shadow: 0 18px 40px -26px rgb(var(--nv-line) / 0.35); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .card:hover { border-color: rgb(var(--nv-violet) / 0.45); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-ripple { background: rgb(var(--nv-line) / 0.14); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .form-control:focus,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .form-select:focus { color: var(--nv-text); }

/* Titres et textes forts posés en blanc pur */
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) :is(
	.card .card-title, .card h3.card-title, .nv-order__name, .nv-portal-card__glyph, .nv-portal-card__title,
	.nv-prose h2, .nv-prose h3, .nv-demand__title, .nv-panel__title, .nv-strong, .nv-theme-card__name,
	.nv-stat strong, .nv-rulebook-card__title, .nv-rulebook__title, .nv-rulebook__section-title, .nv-article__title,
	.nv-lineage__name, .nv-lore-h2, .nv-lore-timeline h3, .nv-lore-chapter__title, .nv-lore-chapter h4,
	.nv-lore-chapter p strong, .nv-lore-fold summary, .nv-lore-toc__item.is-active, .nv-clock b,
	.footer a:hover, .nav-pills .nav-link:hover, .nv-admin-hint:hover, .nv-chip:hover, .nv-chip.is-active,
	.nv-rulebook__toc button:hover, .nv-lore-toc__item:hover, .nv-lore-jump a:hover,
	.btn-outline-custom, .btn-outline-custom:hover, .nv-rulebook-card__cta, .nv-rulebook__tag
) { color: var(--nv-text); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-panel__badge { color: rgb(var(--nv-violet)); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .page-header h1,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .alternatebg > .title,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) h1.title,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .title:not(.title-main) {
	color: var(--nv-text);
	-webkit-text-fill-color: var(--nv-text);
	background-image: none;
	text-shadow: none;
}
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-rulebook-card__icon { color: rgb(var(--nv-card-tint)); }

/* Bandeau de promotion de la boutique : bande sombre lisible sur fond clair */
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) div.text-center.text-white[style*='background'] {
	background: rgb(var(--nv-line) / 0.9) !important;
}

/* Badges et messages : teintes claires sur fond sombre → teintes profondes */
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-badge--delivered,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-badge--accepted,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-flash--ok { color: #166534; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-badge--refunded,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-badge--pending,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-refund__title,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-refund-form__warn { color: #9a3412; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-badge--refused,
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-flash--error { color: #991b1b; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-refund-form__lead { color: #155e75; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-btn-ghost:hover { color: #be123c; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-lore-secret {
	background:
		repeating-linear-gradient(-45deg, rgb(190 18 60 / 0.05) 0 12px, transparent 12px 24px),
		rgb(var(--nv-surface) / 0.9);
}
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-lore .nv-lore-secret p { color: var(--nv-text); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-lore-secret__label { color: #be123c; }

/* Curseur : point sombre, halo dans la couleur primaire */
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-cursor-dot { background: var(--nv-text); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-cursor-halo {
	border-color: rgb(var(--nv-violet) / 0.55);
	background: radial-gradient(circle, rgb(var(--nv-violet) / 0.12), transparent 70%);
}

/* Carte d'aperçu dans Admin → Thèmes : titre lisible sur fond clair */
.nv-theme-card.is-light .nv-theme-card__title {
	background: linear-gradient(96deg, #1f2733, var(--s1) 45%, var(--s2) 75%, #1f2733);
	-webkit-background-clip: text;
	background-clip: text;
}

/* ── Fête de l'Humanité : blanc de papier, bleu de ciel, rameau ─────────── */
html[data-nv-theme='humanite'] {
	--nv-violet: 91 127 166;     /* bleu de ciel voilé (primaire) */
	--nv-indigo: 64 96 132;
	--nv-cyan: 143 160 124;      /* rameau d'olivier (secondaire) */
	--nv-pink: 201 168 106;      /* fil doré */
	--nv-amber: 201 168 106;
	--nv-ink: #f6f3ee;
	--nv-ink-rgb: 246 243 238;
	--nv-surface: 255 255 255;
	--nv-surface-2: 255 255 255;
	--nv-line: 31 39 51;
	--nv-text: #1f2733;
	--nv-muted: #6b7380;
	--nv-glow: 0 0 0 1px rgb(31 39 51 / 0.05), 0 18px 40px -16px rgb(31 39 51 / 0.22), 0 0 60px -30px rgb(91 127 166 / 0.5);
	--theme-bg-page-rgb: 246 243 238;
	--theme-primary: rgb(91 127 166); --bs-primary: rgb(91 127 166); --bs-primary-rgb: 91, 127, 166;
	--theme-secondary: rgb(143 160 124); --bs-secondary: rgb(143 160 124); --bs-secondary-rgb: 143, 160, 124;
	--theme-bg-page: #f6f3ee; --theme-bg-primary: #ffffff; --theme-bg-secondary: #efebe3;
	--theme-focus-box-shadow: 0 0 0 3px rgb(91 127 166 / 0.3);
	--bs-link-color: rgb(64 96 132); --bs-link-hover-color: rgb(91 127 166);
	--nv-title-gradient: linear-gradient(96deg, #1f2733 0%, #3b4a63 28%, rgb(91 127 166) 52%, rgb(143 160 124) 78%, #1f2733 100%);
}
html[data-nv-theme='humanite'] .nv-bg {
	background:
		radial-gradient(120% 90% at 50% -20%, #ffffff 0%, transparent 60%),
		radial-gradient(60% 45% at 100% 100%, rgb(201 168 106 / 0.12), transparent 70%),
		var(--nv-ink);
}
html[data-nv-theme='humanite'] .nv-blob { opacity: 0.28; }
html[data-nv-theme='humanite'] .nv-grid { display: none; }
html[data-nv-theme='humanite'] .nv-grain { opacity: 0.05; }
html[data-nv-theme='humanite'] .parallax {
	background:
		radial-gradient(70% 55% at 50% 0%, rgb(255 255 255 / 0.95), transparent 60%),
		radial-gradient(90% 60% at 50% 100%, rgb(91 127 166 / 0.16), transparent 62%),
		linear-gradient(to bottom, #ffffff, var(--nv-ink));
}
html[data-nv-theme='humanite'] .nv-hero-glow {
	background: radial-gradient(320px circle at var(--nv-mx, 50%) var(--nv-my, 50%), rgb(201 168 106 / 0.16), transparent 70%);
}
html[data-nv-theme='humanite'] .title-main { filter: drop-shadow(0 12px 30px rgb(91 127 166 / 0.18)); }
html[data-nv-theme='humanite'] .nv-progress {
	background: linear-gradient(90deg, rgb(91 127 166), rgb(201 168 106) 60%, rgb(143 160 124));
	box-shadow: 0 0 12px rgb(91 127 166 / 0.4);
}
/* Un fil d'or au pied du héros, comme un ruban de souvenir */
html[data-nv-theme='humanite'] .parallax::after {
	background: linear-gradient(to right, transparent, rgb(201 168 106 / 0.9), rgb(201 168 106 / 0.9), transparent);
	box-shadow: 0 0 24px 2px rgb(201 168 106 / 0.35);
}
html[data-nv-theme='humanite'] .card:hover {
	box-shadow: 0 0 0 1px rgb(91 127 166 / 0.25), 0 26px 50px -30px rgb(91 127 166 / 0.55), var(--nv-glow);
}

/* La colombe apparaît derrière le titre, en contour, puis respire lentement */
.nv-dove {
	position: absolute;
	left: 50%;
	top: 50%;
	font-size: min(52vmin, 480px);
	line-height: 1;
	pointer-events: none;
	transform: translate(-50%, -56%);
	color: rgb(255 255 255 / 0.7);
	-webkit-text-stroke: 2px rgb(91 127 166 / 0.55);
	filter: drop-shadow(0 14px 30px rgb(91 127 166 / 0.28));
	clip-path: inset(100% 0 0 0);
	animation: nv-dove-reveal 2.6s var(--nv-ease-out) 0.3s forwards, nv-breathe-dove 7s ease-in-out 3s infinite;
	will-change: transform, clip-path;
}
@keyframes nv-dove-reveal {
	to { clip-path: inset(-10% 0 0 0); }
}
@keyframes nv-breathe-dove {
	0%, 100% { transform: translate(-50%, -56%) scale(1); }
	50% { transform: translate(-50%, -57%) scale(1.025); }
}
/* Rais de lumière qui tombent du haut du héros */
.nv-rays {
	position: absolute;
	inset: 0;
	overflow: hidden;
	pointer-events: none;
}
.nv-rays i {
	position: absolute;
	top: -12%;
	left: var(--x);
	width: 9vw;
	height: 125%;
	margin-left: -4.5vw;
	transform-origin: 50% 0;
	transform: rotate(var(--r));
	background: linear-gradient(to bottom, rgb(201 168 106 / 0.3), rgb(201 168 106 / 0.08) 40%, transparent 72%);
	filter: blur(8px);
	animation: nv-ray var(--t) ease-in-out var(--dl) infinite alternate;
	will-change: opacity;
}
.nv-rays i:nth-child(1) { --x: 30%; --r: -14deg; --t: 9s;  --dl: -1s; }
.nv-rays i:nth-child(2) { --x: 44%; --r: -5deg;  --t: 12s; --dl: -5s; }
.nv-rays i:nth-child(3) { --x: 58%; --r: 6deg;   --t: 10s; --dl: -3s; }
.nv-rays i:nth-child(4) { --x: 72%; --r: 15deg;  --t: 13s; --dl: -7s; }
@keyframes nv-ray {
	from { opacity: 0.35; }
	to { opacity: 1; }
}
/* Brume blanche au pied du héros */
.nv-mist {
	position: absolute;
	left: -15%;
	right: -15%;
	bottom: -10%;
	height: 45%;
	pointer-events: none;
}
.nv-mist i {
	position: absolute;
	inset: 0;
	background: radial-gradient(55% 55% at 50% 65%, rgb(255 255 255 / 0.9), transparent 70%);
	animation: nv-fog 28s ease-in-out infinite alternate;
	will-change: transform;
}
.nv-mist i:nth-child(2) { background: radial-gradient(50% 50% at 30% 60%, rgb(255 255 255 / 0.7), transparent 70%); animation-duration: 36s; animation-delay: -11s; }
.nv-mist i:nth-child(3) { background: radial-gradient(45% 50% at 72% 70%, rgb(201 168 106 / 0.14), transparent 70%); animation-duration: 31s; animation-delay: -19s; }

/* ── Lore : vieux parchemin fracturé ─────────────────────────────────────── */
html[data-nv-theme='lore'] {
	--nv-violet: 107 74 43;      /* encre brune (primaire) */
	--nv-indigo: 74 50 28;
	--nv-cyan: 42 143 138;       /* cyan délavé, le signal qui déraille (secondaire) */
	--nv-pink: 160 40 110;       /* magenta délavé */
	--nv-amber: 184 134 60;
	--nv-ink: #e6d7b4;
	--nv-ink-rgb: 230 215 180;
	--nv-surface: 243 233 208;
	--nv-surface-2: 248 240 220;
	--nv-line: 58 42 22;
	--nv-text: #3a2a16;
	--nv-muted: #7a6242;
	--nv-glow: 0 0 0 1px rgb(58 42 22 / 0.08), 0 18px 40px -16px rgb(58 42 22 / 0.3), 0 0 60px -30px rgb(107 74 43 / 0.5);
	--theme-bg-page-rgb: 230 215 180;
	--theme-primary: rgb(107 74 43); --bs-primary: rgb(107 74 43); --bs-primary-rgb: 107, 74, 43;
	--theme-secondary: rgb(42 143 138); --bs-secondary: rgb(42 143 138); --bs-secondary-rgb: 42, 143, 138;
	--theme-bg-page: #e6d7b4; --theme-bg-primary: rgb(243 233 208); --theme-bg-secondary: #dccaa0;
	--theme-focus-box-shadow: 0 0 0 3px rgb(107 74 43 / 0.3);
	--bs-link-color: rgb(74 50 28); --bs-link-hover-color: rgb(42 143 138);
	--nv-title-gradient: linear-gradient(96deg, #3a2a16 0%, #6b4a2b 34%, #3a2a16 54%, rgb(42 143 138) 72%, #3a2a16 100%);
}
/* Papier taché, bords brûlés */
html[data-nv-theme='lore'] .nv-bg {
	background:
		radial-gradient(120% 90% at 50% -20%, #f2e7c9 0%, transparent 60%),
		radial-gradient(38% 30% at 12% 82%, rgb(120 85 40 / 0.18), transparent 70%),
		radial-gradient(30% 26% at 90% 28%, rgb(120 85 40 / 0.14), transparent 70%),
		radial-gradient(22% 18% at 70% 90%, rgb(120 85 40 / 0.12), transparent 70%),
		var(--nv-ink);
}
html[data-nv-theme='lore'] .nv-bg::after {
	content: '';
	position: absolute;
	inset: 0;
	background: radial-gradient(115% 100% at 50% 50%, transparent 60%, rgb(90 60 20 / 0.42) 100%);
}
html[data-nv-theme='lore'] .nv-blob { opacity: 0.16; }
html[data-nv-theme='lore'] .nv-grid { display: none; }
html[data-nv-theme='lore'] .nv-grain { opacity: 0.13; }
/* Scanlines sépia : le signal passe à travers le papier */
html[data-nv-theme='lore'] body::after {
	background: repeating-linear-gradient(to bottom, rgb(58 42 22 / 0.06) 0 1px, transparent 1px 4px);
	mix-blend-mode: multiply;
}
html[data-nv-theme='lore'] .parallax {
	background:
		radial-gradient(60% 45% at 50% 0%, rgb(248 240 220 / 0.9), transparent 60%),
		radial-gradient(40% 40% at 8% 90%, rgb(120 85 40 / 0.18), transparent 70%),
		radial-gradient(35% 35% at 92% 80%, rgb(120 85 40 / 0.14), transparent 70%),
		linear-gradient(to bottom, rgb(220 200 160 / 0.5), transparent 40%, var(--nv-ink) 99%);
}
html[data-nv-theme='lore'] .nv-hero-glow {
	background: radial-gradient(320px circle at var(--nv-mx, 50%) var(--nv-my, 50%), rgb(184 134 60 / 0.18), transparent 70%);
}
/* Trait d'encre au pied du héros, doublé d'un fantôme cyan et magenta */
html[data-nv-theme='lore'] .parallax::after {
	background: linear-gradient(to right, transparent, rgb(58 42 22 / 0.85), rgb(58 42 22 / 0.85), transparent);
	box-shadow: 0 2px 0 rgb(42 143 138 / 0.45), 0 -2px 0 rgb(160 40 110 / 0.45);
}
html[data-nv-theme='lore'] .nv-progress {
	background: linear-gradient(90deg, #6b4a2b, #3a2a16 50%, rgb(42 143 138));
	box-shadow: 0 0 10px rgb(58 42 22 / 0.5);
}
html[data-nv-theme='lore'] .title-main {
	filter: none;
	animation: nv-rift-split-old 4.2s steps(1, end) infinite;
}
@keyframes nv-rift-split-old {
	0%, 66%, 100% { text-shadow: 0 1px 0 rgb(58 42 22 / 0.15); }
	68% { text-shadow: -3px 0 rgb(42 143 138 / 0.85), 3px 0 rgb(160 40 110 / 0.85); }
	70% { text-shadow: 3px 0 rgb(42 143 138 / 0.85), -3px 0 rgb(160 40 110 / 0.85); }
	72% { text-shadow: -1px 0 rgb(42 143 138 / 0.85), 1px 0 rgb(160 40 110 / 0.85); }
	74% { text-shadow: 0 1px 0 rgb(58 42 22 / 0.15); }
}
/* Cartes : feuilles de parchemin, bord irrégulier au survol */
html[data-nv-theme='lore'] .card {
	border-color: rgb(58 42 22 / 0.18);
	background: linear-gradient(rgb(248 240 220 / 0.95), rgb(240 228 198 / 0.95));
}
html[data-nv-theme='lore'] .card:hover {
	box-shadow: -3px 0 0 rgb(42 143 138 / 0.5), 3px 0 0 rgb(160 40 110 / 0.5), var(--nv-glow);
}
/* Fissure : l'encre s'écarte, le signal passe dans la fente */
html[data-nv-theme='lore'] .nv-crack .cyan { stroke: rgb(42 143 138); filter: drop-shadow(0 0 4px rgb(42 143 138 / 0.8)); }
html[data-nv-theme='lore'] .nv-crack .mag { stroke: rgb(160 40 110); filter: drop-shadow(0 0 4px rgb(160 40 110 / 0.8)); opacity: 0.85; }
/* Horloge : un cachet sur le papier, aux chiffres qui se brouillent */
html[data-nv-theme='lore'] .nv-clock {
	color: #3a2a16;
	text-shadow: 1px 0 rgb(160 40 110 / 0.6), -1px 0 rgb(42 143 138 / 0.6);
	background: rgb(243 233 208 / 0.92);
	border: 1px solid rgb(58 42 22 / 0.45);
	border-radius: 3px;
	box-shadow: 2px 2px 0 rgb(58 42 22 / 0.25);
	transform: rotate(-1.5deg);
}

body.nv-lite .nv-rays i,
body.nv-lite .nv-mist i,
body.nv-lite .nv-dove,
body.nv-lite .nv-year,
body.nv-lite .nv-heart,
body.nv-lite .nv-ecg .pulse,
body.nv-lite .nv-bg::after { animation: none; }

/* ============================================================================
   28. Règlements RP / PvP
   Écran de sélection en deux grandes cartes, puis un livre à la fois avec
   sommaire collant, articles numérotés et recherche.
   ========================================================================= */

.nv-rules-pick__lead {
	max-width: 60ch;
	color: var(--nv-muted);
	margin: 0 0 1.5rem;
}
.nv-rules-pick__grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
	gap: 1.25rem;
}
.nv-rulebook-card {
	position: relative;
	overflow: hidden;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 0.75rem;
	min-height: 320px;
	padding: 2rem;
	text-align: left;
	color: var(--nv-text);
	font: inherit;
	border-radius: var(--nv-radius);
	border: 1px solid rgb(var(--nv-line) / 0.08);
	background:
		radial-gradient(90% 70% at 100% 0%, rgb(var(--nv-card-tint) / 0.2), transparent 65%),
		linear-gradient(rgb(var(--nv-surface-2) / 0.9), rgb(var(--nv-surface) / 0.95));
	transition: transform 0.5s var(--nv-ease), border-color 0.5s var(--nv-ease), box-shadow 0.5s var(--nv-ease);
	--nv-card-tint: var(--nv-violet);
}
.nv-rulebook-card--pvp { --nv-card-tint: var(--nv-cyan); }
.nv-rulebook-card:hover,
.nv-rulebook-card:focus-visible {
	transform: translateY(-6px);
	border-color: rgb(var(--nv-card-tint) / 0.55);
	box-shadow: 0 30px 60px -30px rgb(var(--nv-card-tint) / 0.7), var(--nv-glow);
	outline: none;
}
/* Le sigle géant en filigrane : RP ou PvP */
.nv-rulebook-card__glyph {
	position: absolute;
	right: -0.05em;
	bottom: -0.22em;
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: 11rem;
	line-height: 1;
	letter-spacing: -0.06em;
	color: transparent;
	-webkit-text-stroke: 1px rgb(var(--nv-card-tint) / 0.28);
	pointer-events: none;
	transition: transform 0.7s var(--nv-ease), -webkit-text-stroke-color 0.5s;
}
.nv-rulebook-card:hover .nv-rulebook-card__glyph {
	transform: translate(-10px, -6px);
	-webkit-text-stroke-color: rgb(var(--nv-card-tint) / 0.55);
}
.nv-rulebook-card__icon {
	display: grid;
	place-items: center;
	width: 52px;
	height: 52px;
	border-radius: 14px;
	font-size: 1.3rem;
	color: #fff;
	background: rgb(var(--nv-card-tint) / 0.18);
	border: 1px solid rgb(var(--nv-card-tint) / 0.4);
	box-shadow: 0 0 30px -8px rgb(var(--nv-card-tint) / 0.8);
}
.nv-rulebook-card__title {
	font-family: var(--nv-font-display);
	font-size: 1.6rem;
	font-weight: 700;
	letter-spacing: -0.02em;
	color: #fff;
}
.nv-rulebook-card__intro {
	position: relative;
	max-width: 46ch;
	font-size: 0.94rem;
	line-height: 1.6;
	color: var(--nv-muted);
}
.nv-rulebook-card__foot {
	position: relative;
	margin-top: auto;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.75rem 1.25rem;
}
.nv-rulebook-card__meta {
	font-size: 0.78rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--nv-muted);
}
.nv-rulebook-card__cta {
	display: inline-flex;
	align-items: center;
	padding: 0.5rem 1.1rem;
	border-radius: 999px;
	font-weight: 600;
	font-size: 0.9rem;
	color: #fff;
	background: rgb(var(--nv-card-tint) / 0.22);
	border: 1px solid rgb(var(--nv-card-tint) / 0.5);
	transition: background 0.4s var(--nv-ease);
}
.nv-rulebook-card:hover .nv-rulebook-card__cta { background: rgb(var(--nv-card-tint) / 0.4); }

.nv-rulebook { animation: nv-book-in 0.5s var(--nv-ease-out); }
@keyframes nv-book-in {
	from { opacity: 0; transform: translateY(12px); }
	to { opacity: 1; transform: none; }
}
.nv-rulebook__bar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 0.75rem;
	margin-bottom: 1.75rem;
}
.nv-rulebook__back { margin-top: 0; }
.nv-rulebook__search { flex: 0 1 320px; }
.nv-rulebook__head {
	padding: 1.75rem 0 1.5rem;
	margin-bottom: 1.5rem;
	border-bottom: 1px solid rgb(var(--nv-line) / 0.08);
}
.nv-rulebook__tag {
	display: inline-block;
	padding: 0.2em 0.7em;
	border-radius: 6px;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: #fff;
	background: rgb(var(--nv-violet) / 0.25);
	border: 1px solid rgb(var(--nv-violet) / 0.5);
}
.nv-rulebook--pvp .nv-rulebook__tag {
	background: rgb(var(--nv-cyan) / 0.18);
	border-color: rgb(var(--nv-cyan) / 0.5);
}
.nv-rulebook__title {
	margin: 0.6rem 0 0.5rem;
	font-family: var(--nv-font-display);
	font-size: clamp(1.8rem, 3.5vw, 2.6rem);
	font-weight: 700;
	letter-spacing: -0.02em;
	color: #fff;
}
.nv-rulebook__intro { max-width: 70ch; color: var(--nv-muted); margin: 0; }

.nv-rulebook__layout {
	display: grid;
	grid-template-columns: 240px minmax(0, 1fr);
	gap: 2.5rem;
	align-items: start;
}
.nv-rulebook__toc {
	position: sticky;
	top: 90px;
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
}
.nv-rulebook__toc .nv-label { margin-bottom: 0.5rem; }
.nv-rulebook__toc button {
	display: flex;
	gap: 0.7rem;
	padding: 0.5rem 0.7rem;
	border: 0;
	border-left: 2px solid rgb(var(--nv-line) / 0.08);
	background: none;
	color: var(--nv-muted);
	font: inherit;
	font-size: 0.9rem;
	text-align: left;
	transition: color 0.3s, border-color 0.3s, background 0.3s;
}
.nv-rulebook__toc button span {
	font-family: var(--nv-font-display);
	font-variant-numeric: tabular-nums;
	color: rgb(var(--nv-violet));
}
.nv-rulebook__toc button:hover {
	color: #fff;
	border-left-color: rgb(var(--nv-violet));
	background: rgb(var(--nv-line) / 0.03);
}
.nv-rulebook__section { scroll-margin-top: 90px; margin-bottom: 2.5rem; }
.nv-rulebook__section-title {
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
	margin: 0 0 1rem;
	font-family: var(--nv-font-display);
	font-size: 1.35rem;
	font-weight: 700;
	color: #fff;
}
.nv-rulebook__section-title span {
	font-size: 0.72rem;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: rgb(var(--nv-cyan));
}
.nv-article {
	display: grid;
	grid-template-columns: 5.5rem minmax(0, 1fr);
	gap: 1.25rem;
	padding: 1.1rem 1.25rem;
	margin-bottom: 0.6rem;
	border-radius: var(--nv-radius-sm);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.7), rgb(var(--nv-surface) / 0.8));
	border: 1px solid rgb(var(--nv-line) / 0.06);
	transition: border-color 0.3s var(--nv-ease), transform 0.3s var(--nv-ease);
}
.nv-article:hover {
	border-color: rgb(var(--nv-violet) / 0.35);
	transform: translateX(4px);
}
.nv-article__num {
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: 0.9rem;
	letter-spacing: 0.02em;
	color: rgb(var(--nv-violet));
	white-space: nowrap;
	padding-top: 0.1rem;
}
.nv-article__title { margin: 0 0 0.3rem; font-size: 1.02rem; font-weight: 600; color: #fff; }
.nv-article__text { margin: 0; color: var(--nv-text); opacity: 0.82; line-height: 1.65; }
.nv-rulebook--pvp .nv-article__num,
.nv-rulebook--pvp .nv-rulebook__toc button span { color: rgb(var(--nv-cyan)); }
.nv-rulebook--pvp .nv-article:hover { border-color: rgb(var(--nv-cyan) / 0.35); }

@media (max-width: 991.98px) {
	.nv-rulebook__layout { grid-template-columns: 1fr; gap: 1rem; }
	.nv-rulebook__toc {
		position: static;
		flex-direction: row;
		overflow-x: auto;
		padding-bottom: 0.5rem;
	}
	.nv-rulebook__toc .nv-label { display: none; }
	.nv-rulebook__toc button { white-space: nowrap; border-left: 0; border-bottom: 2px solid rgb(var(--nv-line) / 0.08); }
}
@media (max-width: 575.98px) {
	.nv-article { grid-template-columns: 1fr; gap: 0.3rem; }
	.nv-rulebook-card { padding: 1.5rem; min-height: 0; }
	.nv-rulebook-card__glyph { font-size: 7rem; }
}

/* ============================================================================
   29. Lore — Les Neuf Lignées
   Archive : héros à anneaux, frise chronologique, lecteur de chapitres,
   dossiers des lignées, volets du Nen. Suit les jetons de l'ambiance active.
   ========================================================================= */

.nv-lore { --nv-gold: 200 174 114; }

.nv-lore-hero {
	position: relative;
	overflow: hidden;
	min-height: min(88vh, 820px);
	display: flex;
	align-items: flex-end;
	padding: 7rem 0 4.5rem;
	border-bottom: 1px solid rgb(var(--nv-line) / 0.08);
	background:
		radial-gradient(60% 70% at 75% 0%, rgb(var(--nv-violet) / 0.22), transparent 70%),
		radial-gradient(40% 50% at 10% 100%, rgb(var(--nv-cyan) / 0.08), transparent 70%);
}
.nv-lore-hero__rings {
	position: absolute;
	right: -12vmin;
	top: -16vmin;
	width: 78vmin;
	height: 78vmin;
	pointer-events: none;
}
.nv-lore-hero__rings i {
	position: absolute;
	inset: 0;
	border-radius: 50%;
	border: 1px solid rgb(var(--nv-line) / 0.07);
}
.nv-lore-hero__rings i:nth-child(2) {
	inset: 11%;
	border: 1px dashed rgb(var(--nv-violet) / 0.3);
	animation: nv-ring-turn 90s linear infinite;
}
.nv-lore-hero__rings i:nth-child(3) {
	inset: 24%;
	border-color: rgb(var(--nv-gold) / 0.18);
	box-shadow: inset 0 0 80px rgb(var(--nv-violet) / 0.12);
}
@keyframes nv-ring-turn { to { transform: rotate(360deg); } }
.nv-lore-hero__inner { position: relative; }
.nv-lore-kicker,
.nv-lore-eyebrow {
	display: inline-block;
	font-size: 0.72rem;
	font-weight: 600;
	letter-spacing: 0.3em;
	text-transform: uppercase;
}
.nv-lore-kicker { color: rgb(var(--nv-violet)); }
.nv-lore-eyebrow { color: rgb(var(--nv-gold)); }
.nv-lore-hero__title {
	margin: 1.1rem 0 1.25rem;
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: clamp(3.2rem, 9vw, 7.5rem);
	line-height: 0.9;
	letter-spacing: -0.045em;
	text-transform: uppercase;
	background: var(--nv-title-gradient, linear-gradient(96deg, #fff 0%, #fff 40%, rgb(var(--nv-violet)) 70%, rgb(var(--nv-cyan)) 100%));
	-webkit-background-clip: text;
	background-clip: text;
	-webkit-text-fill-color: transparent;
}
.nv-lore-hero__lead {
	max-width: 58ch;
	font-size: 1.08rem;
	line-height: 1.75;
	color: rgb(var(--nv-line) / 0.7);
}
.nv-lore-jump {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
	margin-top: 2rem;
}
.nv-lore-jump a {
	display: inline-flex;
	align-items: baseline;
	gap: 0.55rem;
	padding: 0.55rem 1rem;
	border-radius: 999px;
	font-size: 0.88rem;
	color: var(--nv-text);
	text-decoration: none;
	background: rgb(var(--nv-line) / 0.04);
	border: 1px solid rgb(var(--nv-line) / 0.12);
	transition: border-color 0.3s, background 0.3s;
}
.nv-lore-jump a span { font-size: 0.7rem; color: rgb(var(--nv-gold)); letter-spacing: 0.1em; }
.nv-lore-jump a:hover { color: #fff; border-color: rgb(var(--nv-violet) / 0.6); background: rgb(var(--nv-violet) / 0.12); }
.nv-lore-stamp {
	position: absolute;
	right: 7vw;
	bottom: 4.5rem;
	padding: 0.7rem 1rem;
	font-size: 0.68rem;
	letter-spacing: 0.3em;
	text-transform: uppercase;
	color: rgb(var(--nv-violet) / 0.85);
	border: 1px solid rgb(var(--nv-violet) / 0.35);
	transform: rotate(-4deg);
}

.nv-lore-section {
	padding: 6rem 0;
	border-bottom: 1px solid rgb(var(--nv-line) / 0.06);
	scroll-margin-top: 56px;
}
.nv-lore-head {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 1rem 3rem;
	margin-bottom: 3rem;
}
.nv-lore-h2 {
	margin: 0.5rem 0 0;
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: clamp(2rem, 4vw, 2.9rem);
	letter-spacing: -0.03em;
	color: #fff;
}
.nv-lore-intro { max-width: 52ch; margin: 0; color: var(--nv-muted); }

/* Frise */
.nv-lore-timeline {
	position: relative;
	list-style: none;
	margin: 0;
	padding: 0 0 0 3rem;
	display: grid;
	gap: 2.25rem;
}
.nv-lore-timeline::before {
	content: '';
	position: absolute;
	left: 0.7rem;
	top: 0.5rem;
	bottom: 0.5rem;
	width: 1px;
	background: linear-gradient(rgb(var(--nv-violet) / 0.8), rgb(var(--nv-cyan) / 0.5) 60%, rgb(var(--nv-gold) / 0.8));
}
.nv-lore-timeline li { position: relative; max-width: 70ch; }
.nv-lore-timeline li::before {
	content: '';
	position: absolute;
	left: calc(-3rem + 0.7rem - 7px);
	top: 0.35rem;
	width: 15px;
	height: 15px;
	border-radius: 50%;
	background: var(--nv-ink);
	border: 2px solid rgb(var(--nv-violet));
	box-shadow: 0 0 14px rgb(var(--nv-violet) / 0.6);
}
.nv-lore-timeline li.is-dark::before { border-color: #e11d48; box-shadow: 0 0 14px rgb(225 29 72 / 0.7); }
.nv-lore-timeline li.is-now::before {
	border-color: rgb(var(--nv-gold));
	background: rgb(var(--nv-gold));
	animation: nv-now 2.4s ease-in-out infinite;
}
@keyframes nv-now {
	0%, 100% { box-shadow: 0 0 0 0 rgb(var(--nv-gold) / 0.6); }
	50% { box-shadow: 0 0 0 10px rgb(var(--nv-gold) / 0); }
}
.nv-lore-era { font-size: 0.72rem; letter-spacing: 0.2em; text-transform: uppercase; color: rgb(var(--nv-violet)); }
.nv-lore-timeline li.is-dark .nv-lore-era { color: #fb7185; }
.nv-lore-timeline li.is-now .nv-lore-era { color: rgb(var(--nv-gold)); }
.nv-lore-timeline h3 { margin: 0.3rem 0 0.35rem; font-size: 1.3rem; font-weight: 600; color: #fff; }
.nv-lore-timeline p { margin: 0; color: var(--nv-muted); }

/* Lecteur de chapitres */
.nv-lore-reader {
	display: grid;
	grid-template-columns: 280px minmax(0, 1fr);
	gap: 3rem;
	align-items: start;
}
.nv-lore-toc {
	position: sticky;
	top: 90px;
	display: flex;
	flex-direction: column;
	gap: 0.25rem;
}
.nv-lore-toc__item {
	display: grid;
	grid-template-columns: 2.6rem 1fr;
	align-items: baseline;
	padding: 0.6rem 0.75rem;
	border: 0;
	border-left: 2px solid rgb(var(--nv-line) / 0.08);
	background: none;
	color: var(--nv-muted);
	font: inherit;
	font-size: 0.9rem;
	text-align: left;
	transition: color 0.3s, border-color 0.3s, background 0.3s;
}
.nv-lore-toc__num { font-family: var(--nv-font-display); font-weight: 700; color: rgb(var(--nv-gold) / 0.8); }
.nv-lore-toc__item:hover { color: #fff; background: rgb(var(--nv-line) / 0.03); }
.nv-lore-toc__item.is-active {
	color: #fff;
	border-left-color: rgb(var(--nv-violet));
	background: linear-gradient(90deg, rgb(var(--nv-violet) / 0.16), transparent);
}
.nv-lore-pages { min-width: 0; }
.nv-lore-chapter { max-width: 72ch; animation: nv-book-in 0.45s var(--nv-ease-out); }
.nv-lore-chapter__meta { font-size: 0.72rem; letter-spacing: 0.22em; text-transform: uppercase; color: rgb(var(--nv-gold)); }
.nv-lore-chapter__title {
	margin: 0.6rem 0 1.75rem;
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: clamp(2rem, 4.2vw, 3.1rem);
	line-height: 1.05;
	letter-spacing: -0.03em;
	color: #fff;
}
.nv-lore-chapter p { font-size: 1.05rem; line-height: 1.85; color: var(--nv-text); opacity: 0.86; margin: 0 0 1.3rem; }
.nv-lore-chapter p strong { color: #fff; opacity: 1; }
.nv-lore-chapter h4 {
	display: flex;
	align-items: center;
	gap: 0.8rem;
	margin: 2.5rem 0 0.9rem;
	font-family: var(--nv-font-display);
	font-size: 1.35rem;
	font-weight: 600;
	color: #fff;
}
.nv-lore-chapter h4::before {
	content: '';
	width: 1.6rem;
	height: 1px;
	background: rgb(var(--nv-violet));
	box-shadow: 0 0 10px rgb(var(--nv-violet));
}
.nv-lore-chapter p.nv-lore-whisper {
	font-style: italic;
	color: rgb(var(--nv-gold));
	opacity: 1;
	padding-left: 1rem;
	border-left: 2px solid rgb(var(--nv-gold) / 0.5);
}
.nv-lore-pager {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	max-width: 72ch;
	margin-top: 2.5rem;
	padding-top: 1.5rem;
	border-top: 1px solid rgb(var(--nv-line) / 0.08);
}
.nv-lore-pager .nv-btn-ghost { margin-top: 0; }
.nv-lore-pager .btn:disabled { opacity: 0.3; }
.nv-lore-pager__count { font-family: var(--nv-font-display); color: var(--nv-muted); font-variant-numeric: tabular-nums; }

/* Dossier classé */
.nv-lore-secret {
	position: relative;
	margin-top: 2.25rem;
	padding: 1.75rem 1.75rem 1.25rem;
	border-radius: var(--nv-radius-sm);
	border: 1px solid rgb(225 29 72 / 0.35);
	background:
		repeating-linear-gradient(-45deg, rgb(225 29 72 / 0.05) 0 12px, transparent 12px 24px),
		linear-gradient(145deg, rgb(40 12 20 / 0.9), rgb(14 10 14 / 0.9));
	overflow: hidden;
}
.nv-lore-secret::before {
	content: '';
	position: absolute;
	inset: 0 0 auto 0;
	height: 3px;
	background: repeating-linear-gradient(90deg, #e11d48 0 18px, transparent 18px 26px);
}
.nv-lore-secret__label {
	display: inline-block;
	margin-bottom: 0.9rem;
	font-size: 0.7rem;
	font-weight: 700;
	letter-spacing: 0.24em;
	text-transform: uppercase;
	color: #fb7185;
}
.nv-lore .nv-lore-secret p { color: #e9d5da; opacity: 1; font-size: 1rem; margin-bottom: 0.8rem; }

/* Lignées */
.nv-lore-lineages {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
	gap: 1rem;
}
.nv-lineage {
	position: relative;
	overflow: hidden;
	min-height: 230px;
	padding: 1.75rem;
	border-radius: var(--nv-radius);
	border: 1px solid rgb(var(--nv-line) / 0.07);
	background: linear-gradient(145deg, rgb(var(--nv-surface-2) / 0.9), rgb(var(--nv-surface) / 0.95));
	scroll-margin-top: 90px;
	transition: transform 0.5s var(--nv-ease), border-color 0.5s var(--nv-ease), box-shadow 0.5s var(--nv-ease);
}
.nv-lineage::before {
	content: '';
	position: absolute;
	inset: 0 auto 0 0;
	width: 3px;
	background: linear-gradient(rgb(var(--nv-violet)), rgb(var(--nv-cyan)));
	opacity: 0.55;
}
.nv-lineage:hover {
	transform: translateY(-5px);
	border-color: rgb(var(--nv-violet) / 0.4);
	box-shadow: 0 26px 50px -30px rgb(var(--nv-violet) / 0.8);
}
.nv-lineage__index {
	position: absolute;
	top: 1.2rem;
	right: 1.4rem;
	font-family: var(--nv-font-display);
	font-size: 0.75rem;
	letter-spacing: 0.15em;
	color: rgb(var(--nv-line) / 0.25);
}
.nv-lineage__sigil {
	display: grid;
	place-items: center;
	width: 56px;
	height: 56px;
	margin-bottom: 1.1rem;
	border-radius: 50%;
	font-size: 1.6rem;
	line-height: 1;
	color: rgb(var(--nv-violet));
	border: 1px solid rgb(var(--nv-violet) / 0.35);
	background: radial-gradient(circle, rgb(var(--nv-violet) / 0.18), transparent 70%);
	text-shadow: 0 0 14px rgb(var(--nv-violet) / 0.8);
	transition: transform 0.6s var(--nv-ease);
}
.nv-lineage:hover .nv-lineage__sigil { transform: rotate(-12deg) scale(1.08); }
.nv-lineage__name { margin: 0 0 0.3rem; font-family: var(--nv-font-display); font-size: 1.3rem; font-weight: 700; color: #fff; }
.nv-lineage__leader { display: block; font-size: 0.7rem; letter-spacing: 0.18em; text-transform: uppercase; color: rgb(var(--nv-gold)); }
.nv-lineage__text { margin: 0.9rem 0 0; font-size: 0.92rem; line-height: 1.6; color: var(--nv-muted); }
.nv-lineage.is-sealed { border-style: dashed; }
.nv-lineage.is-sealed .nv-lineage__leader { color: var(--nv-muted); }
.nv-lineage.is-sealed .nv-lineage__sigil { color: var(--nv-muted); border-color: rgb(var(--nv-line) / 0.15); text-shadow: none; background: none; }

/* Volets du Nen */
.nv-lore-nen { max-width: 860px; }
.nv-lore-fold { border-top: 1px solid rgb(var(--nv-line) / 0.08); }
.nv-lore-fold:last-of-type { border-bottom: 1px solid rgb(var(--nv-line) / 0.08); }
.nv-lore-fold summary {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	padding: 1.35rem 0;
	list-style: none;
	cursor: pointer;
	font-family: var(--nv-font-display);
	font-size: 1.25rem;
	font-weight: 600;
	color: #fff;
}
.nv-lore-fold summary::-webkit-details-marker { display: none; }
.nv-lore-fold summary::after {
	content: '';
	flex: 0 0 auto;
	width: 14px;
	height: 14px;
	background:
		linear-gradient(rgb(var(--nv-violet)), rgb(var(--nv-violet))) center / 100% 2px no-repeat,
		linear-gradient(rgb(var(--nv-violet)), rgb(var(--nv-violet))) center / 2px 100% no-repeat;
	transition: transform 0.4s var(--nv-ease);
}
.nv-lore-fold[open] summary::after { transform: rotate(45deg); }
.nv-lore-fold p { margin: 0 0 1.4rem; max-width: 70ch; color: var(--nv-muted); line-height: 1.8; }

@media (max-width: 991.98px) {
	.nv-lore-reader { grid-template-columns: 1fr; gap: 1.5rem; }
	.nv-lore-toc {
		position: static;
		flex-direction: row;
		overflow-x: auto;
		padding-bottom: 0.5rem;
	}
	.nv-lore-toc__item {
		grid-template-columns: auto;
		white-space: nowrap;
		border-left: 0;
		border-bottom: 2px solid rgb(var(--nv-line) / 0.08);
	}
	.nv-lore-toc__item.is-active { border-bottom-color: rgb(var(--nv-violet)); background: none; }
	.nv-lore-toc__name { display: none; }
	.nv-lore-stamp { display: none; }
	.nv-lore-section { padding: 4rem 0; }
}
@media (prefers-reduced-motion: reduce) {
	.nv-lore-hero__rings i,
	.nv-lore-timeline li.is-now::before { animation: none; }
}

/* ============================================================================
   31. Offres de la boutique : grille, overlay d'achat, codes promo
   ========================================================================= */

.nv-offers__filters { margin: 0.5rem 0 1.5rem; }
.nv-offers__grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
	gap: 1.25rem;
}
.nv-offer-card {
	position: relative;
	display: flex;
	flex-direction: column;
	overflow: hidden;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.9), rgb(var(--nv-surface) / 0.95));
	border: 1px solid rgb(var(--nv-line) / 0.08);
	box-shadow: 0 20px 45px -30px rgb(0 0 0 / 0.8);
	cursor: pointer;
	transition: transform 0.5s var(--nv-ease), border-color 0.5s var(--nv-ease), box-shadow 0.5s var(--nv-ease);
}
.nv-offer-card:hover,
.nv-offer-card:focus-within {
	transform: translateY(-6px);
	border-color: rgb(var(--nv-violet) / 0.5);
	box-shadow: 0 30px 60px -30px rgb(var(--nv-violet) / 0.6), var(--nv-glow);
}
/* Bouton invisible qui couvre la carte : accessible au clavier */
.nv-offer-card__hit {
	position: absolute;
	inset: 0;
	z-index: 2;
	border: 0;
	background: none;
	cursor: pointer;
}
.nv-offer-card__hit:focus-visible { outline: 2px solid rgb(var(--nv-cyan)); outline-offset: -4px; border-radius: var(--nv-radius); }
.nv-offer-card__media {
	position: relative;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background:
		radial-gradient(70% 80% at 20% 100%, rgb(var(--nv-violet) / 0.35), transparent 60%),
		radial-gradient(60% 60% at 90% 0%, rgb(var(--nv-cyan) / 0.25), transparent 60%),
		rgb(var(--nv-surface) / 0.8);
}
.nv-offer-card__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.8s var(--nv-ease);
}
.nv-offer-card:hover .nv-offer-card__media img { transform: scale(1.05); }
.nv-offer-card__media::after {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(to top, rgb(var(--nv-surface) / 0.85), transparent 55%);
	pointer-events: none;
}
.nv-offer-card__glyph {
	position: absolute;
	inset: 0;
	display: grid;
	place-items: center;
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: 4.5rem;
	letter-spacing: -0.05em;
	color: rgb(var(--nv-line) / 0.14);
}
.nv-offer-card__sale,
.nv-offer-card__owned {
	position: absolute;
	top: 0.8rem;
	left: 0.8rem;
	z-index: 1;
	padding: 0.3em 0.75em;
	border-radius: 999px;
	font-size: 0.74rem;
	font-weight: 700;
	letter-spacing: 0.06em;
	color: #fff;
	background: rgb(var(--nv-violet));
	box-shadow: 0 8px 20px -8px rgb(var(--nv-violet));
}
.nv-offer-card__owned { left: auto; right: 0.8rem; background: #16a34a; box-shadow: none; }
.nv-offer-card__body { padding: 1.1rem 1.2rem 0.6rem; display: flex; flex-direction: column; gap: 0.35rem; }
.nv-offer-card__cat {
	font-size: 0.7rem;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: rgb(var(--nv-cyan));
}
.nv-offer-card__name {
	margin: 0;
	font-family: var(--nv-font-display);
	font-size: 1.25rem;
	font-weight: 700;
	letter-spacing: -0.02em;
	color: var(--nv-text);
}
.nv-offer-card__short { font-size: 0.9rem; line-height: 1.5; color: var(--nv-muted); }
.nv-offer-card__short p:last-child { margin-bottom: 0; }
.nv-offer-card__foot {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 0.75rem;
	padding: 0.6rem 1.2rem 1.1rem;
	margin-top: auto;
}
.nv-offer-card__price { display: flex; align-items: baseline; gap: 0.5rem; font-family: var(--nv-font-display); }
.nv-offer-card__price s { color: var(--nv-muted); font-size: 0.88rem; }
.nv-offer-card__price strong { font-size: 1.35rem; color: var(--nv-text); }
.nv-offer-card__meta { font-size: 0.78rem; color: var(--nv-muted); white-space: nowrap; }
.nv-offer-card__cta {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0.85rem;
	font-weight: 600;
	font-size: 0.9rem;
	color: var(--nv-text);
	background: rgb(var(--nv-violet) / 0.14);
	border-top: 1px solid rgb(var(--nv-violet) / 0.25);
	transition: background 0.4s var(--nv-ease);
}
.nv-offer-card:hover .nv-offer-card__cta { background: rgb(var(--nv-violet) / 0.3); }
.nv-offer-card.is-owned .nv-offer-card__cta { background: rgb(var(--nv-line) / 0.05); border-color: rgb(var(--nv-line) / 0.08); }

/* Overlay */
html.nv-offer-open { overflow: hidden; }
.nv-offer {
	position: fixed;
	inset: 0;
	z-index: 1040;
	display: grid;
	place-items: center;
	padding: 1rem;
	opacity: 0;
	transition: opacity 0.25s var(--nv-ease);
}
.nv-offer.is-open { opacity: 1; }
.nv-offer__backdrop {
	position: absolute;
	inset: 0;
	background: rgb(0 0 0 / 0.6);
	backdrop-filter: blur(14px) saturate(140%);
	-webkit-backdrop-filter: blur(14px) saturate(140%);
}
.nv-offer__dialog {
	position: relative;
	width: min(920px, 100%);
	max-height: calc(100vh - 2rem);
	display: grid;
	grid-template-columns: 5fr 7fr;
	overflow: hidden;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.98), rgb(var(--nv-surface) / 0.99));
	border: 1px solid rgb(var(--nv-line) / 0.12);
	box-shadow: 0 50px 120px -40px rgb(0 0 0 / 0.9), var(--nv-glow);
	outline: none;
	transform: translateY(16px) scale(0.98);
	transition: transform 0.35s var(--nv-ease-out);
}
.nv-offer.is-open .nv-offer__dialog { transform: none; }
.nv-offer__close {
	position: absolute;
	top: 0.8rem;
	right: 0.8rem;
	z-index: 3;
	width: 38px;
	height: 38px;
	border-radius: 50%;
	border: 1px solid rgb(var(--nv-line) / 0.15);
	background: rgb(var(--nv-surface) / 0.8);
	color: var(--nv-text);
	font-size: 1rem;
	display: grid;
	place-items: center;
	transition: transform 0.3s var(--nv-ease), background 0.3s;
}
.nv-offer__close:hover { transform: rotate(90deg); background: rgb(var(--nv-violet) / 0.25); }
.nv-offer__media {
	position: relative;
	min-height: 260px;
	overflow: hidden;
	background:
		radial-gradient(70% 80% at 20% 100%, rgb(var(--nv-violet) / 0.45), transparent 60%),
		radial-gradient(60% 60% at 90% 0%, rgb(var(--nv-cyan) / 0.3), transparent 60%),
		rgb(var(--nv-surface) / 0.8);
}
.nv-offer__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.nv-offer__media::after {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(to right, transparent 70%, rgb(var(--nv-surface-2) / 0.9));
	pointer-events: none;
}
.nv-offer__glyph {
	position: absolute;
	inset: 0;
	display: grid;
	place-items: center;
	font-family: var(--nv-font-display);
	font-weight: 700;
	font-size: 8rem;
	letter-spacing: -0.05em;
	color: rgb(var(--nv-line) / 0.14);
}
.nv-offer__tag,
.nv-offer__sale {
	position: absolute;
	top: 1rem;
	left: 1rem;
	z-index: 1;
	padding: 0.32em 0.8em;
	border-radius: 999px;
	font-size: 0.72rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: #fff;
	background: rgb(0 0 0 / 0.45);
	border: 1px solid rgb(255 255 255 / 0.2);
	backdrop-filter: blur(6px);
}
.nv-offer__sale { top: auto; bottom: 1rem; background: rgb(var(--nv-violet)); border-color: transparent; text-transform: none; letter-spacing: 0.04em; font-size: 0.85rem; }
.nv-offer__content {
	display: flex;
	flex-direction: column;
	gap: 1.1rem;
	padding: 2rem 2rem 1.75rem;
	overflow-y: auto;
}
.nv-offer__kicker { font-size: 0.72rem; letter-spacing: 0.16em; text-transform: uppercase; color: rgb(var(--nv-cyan)); }
.nv-offer__title {
	margin: 0.25rem 0 0;
	font-family: var(--nv-font-display);
	font-size: clamp(1.5rem, 3vw, 2.1rem);
	font-weight: 700;
	letter-spacing: -0.02em;
	color: var(--nv-text);
	padding-right: 2.5rem;
}
.nv-offer__price { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.35rem 0.8rem; font-family: var(--nv-font-display); }
.nv-offer__price-base { color: var(--nv-muted); font-size: 1rem; }
.nv-offer__price-now { font-size: 2rem; font-weight: 700; color: var(--nv-text); letter-spacing: -0.02em; }
.nv-offer__price-note {
	flex-basis: 100%;
	font-family: var(--nv-font-body);
	font-size: 0.84rem;
	color: rgb(var(--nv-cyan));
}
.nv-offer__desc { font-size: 0.95rem; line-height: 1.65; color: var(--nv-text); opacity: 0.9; }
.nv-offer__desc :is(h1, h2, h3, h4) { font-size: 1.05rem; margin: 1rem 0 0.4rem; color: var(--nv-text); }
.nv-offer__desc p:last-child { margin-bottom: 0; }
.nv-offer__desc img { max-width: 100%; border-radius: 10px; }
.nv-offer__promo {
	padding: 1rem 1.1rem;
	border-radius: var(--nv-radius-sm);
	background: rgb(var(--nv-line) / 0.03);
	border: 1px dashed rgb(var(--nv-line) / 0.18);
}
.nv-offer__promo-row { display: flex; gap: 0.5rem; margin-top: 0.4rem; }
.nv-offer__promo-row .form-control { flex: 1; text-transform: uppercase; }
.nv-offer__promo-row .nv-btn-ghost { margin-top: 0; }
.nv-offer__promo-msg { margin: 0.6rem 0 0; font-size: 0.86rem; }
.nv-offer__promo-msg.is-ok { color: #4ade80; }
.nv-offer__promo-msg.is-error { color: #fb7185; }
.nv-offer__pay { display: flex; flex-direction: column; gap: 0.75rem; margin-top: auto; padding-top: 0.5rem; }
.nv-offer__methods { display: flex; flex-wrap: wrap; gap: 0.45rem; }
.nv-offer__method {
	padding: 0.5rem 0.95rem;
	border-radius: 999px;
	font-size: 0.86rem;
	font-weight: 600;
	color: var(--nv-muted);
	background: rgb(var(--nv-line) / 0.04);
	border: 1px solid rgb(var(--nv-line) / 0.12);
	transition: color 0.3s, border-color 0.3s, background 0.3s;
}
.nv-offer__method:hover { color: var(--nv-text); border-color: rgb(var(--nv-line) / 0.3); }
.nv-offer__method.is-active { color: var(--nv-text); background: rgb(var(--nv-violet) / 0.2); border-color: rgb(var(--nv-violet) / 0.7); }
.nv-offer__buy { width: 100%; font-weight: 700; }
.nv-offer__buy.is-confirm { background: rgb(var(--nv-cyan)) !important; border-color: transparent; color: #05050a; }
.nv-offer__buy.is-done { background: #16a34a; border-color: transparent; color: #fff; }
.nv-offer__note { margin: 0; font-size: 0.86rem; color: var(--nv-muted); text-align: center; }
@media (max-width: 767.98px) {
	.nv-offer { padding: 0; align-items: end; }
	.nv-offer__dialog { grid-template-columns: 1fr; max-height: 96vh; border-radius: var(--nv-radius) var(--nv-radius) 0 0; }
	.nv-offer__media { min-height: 180px; aspect-ratio: 16 / 9; }
	.nv-offer__media::after { background: linear-gradient(to top, rgb(var(--nv-surface-2) / 0.95), transparent 60%); }
	.nv-offer__content { padding: 1.25rem 1.25rem 1.5rem; }
}
@media (prefers-reduced-motion: reduce) {
	.nv-offer, .nv-offer__dialog, .nv-offer-card, .nv-offer-card__media img { transition: none; }
}
/* Ambiances claires : lisibilité des messages et pastilles */
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-offer__promo-msg.is-ok { color: #166534; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-offer__promo-msg.is-error { color: #991b1b; }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-offer__backdrop { background: rgb(31 39 51 / 0.45); }

/* Admin → Codes promo */
.nv-promo-form { margin-top: 1.25rem; }
.nv-promo-form__grid { margin-top: 1.1rem; }
.nv-promo-admin__subtitle {
	margin: 2.25rem 0 1rem;
	font-family: var(--nv-font-display);
	font-size: 1.3rem;
	font-weight: 700;
	color: var(--nv-text);
}
.nv-promo-row {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: 0.5rem 1rem;
	padding: 1rem 1.25rem;
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
	border-radius: var(--nv-radius);
}
.nv-promo-row.is-off, .nv-promo-row.is-over, .nv-promo-row.is-exhausted { opacity: 0.65; }
.nv-promo-row__main { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem; }
.nv-promo-row__code {
	font-size: 1.05rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	color: var(--nv-text);
	background: rgb(var(--nv-line) / 0.06);
	border: 1px dashed rgb(var(--nv-line) / 0.3);
	padding: 0.25em 0.7em;
	border-radius: 8px;
}
.nv-promo-row__discount { font-family: var(--nv-font-display); font-weight: 700; font-size: 1.1rem; color: rgb(var(--nv-cyan)); }
.nv-promo-row__details { grid-column: 1; display: flex; flex-wrap: wrap; gap: 0.3rem 1.2rem; font-size: 0.84rem; color: var(--nv-muted); }
.nv-promo-row__actions { grid-column: 2; grid-row: 1 / span 2; display: flex; align-items: center; gap: 0.5rem; }
.nv-promo-row__actions .nv-btn-ghost { margin-top: 0; }
.nv-btn-ghost--danger:hover { border-color: rgb(244 63 94 / 0.5); color: #fda4af; }
.nv-badge--live { background: rgb(34 197 94 / 0.14); color: #86efac; border: 1px solid rgb(34 197 94 / 0.28); }
.nv-badge--off, .nv-badge--over, .nv-badge--exhausted { background: rgb(var(--nv-line) / 0.06); color: var(--nv-muted); border: 1px solid rgb(var(--nv-line) / 0.12); }
.nv-badge--soon { background: rgb(var(--nv-cyan) / 0.12); color: rgb(var(--nv-cyan)); border: 1px solid rgb(var(--nv-cyan) / 0.3); }
html:is([data-nv-theme='humanite'], [data-nv-theme='lore']) .nv-badge--live { color: #166534; }
@media (max-width: 767.98px) {
	.nv-promo-row { grid-template-columns: 1fr; }
	.nv-promo-row__actions { grid-column: 1; grid-row: auto; }
}

/* ============================================================================
   32. Menu Gestion
   Recopie de l'écran en jeu : bandeau, colonne d'onglets, page, joueurs.
   Les cartes reprennent le filigrane d'icône et le liseré d'accent au survol.
   ========================================================================= */

.nv-gestion { padding: 1.5rem 0 4rem; }
.nv-gestion__head {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 1rem;
	padding-bottom: 1.1rem;
	margin-bottom: 1.25rem;
	border-bottom: 1px solid rgb(var(--nv-line) / 0.1);
}
.nv-gestion__eyebrow {
	font-size: 0.72rem;
	font-weight: 600;
	letter-spacing: 0.24em;
	text-transform: uppercase;
	color: rgb(var(--nv-violet));
}
.nv-gestion__title {
	margin: 0.3rem 0 0;
	font-family: var(--nv-font-display);
	font-size: clamp(1.8rem, 4vw, 2.6rem);
	font-weight: 700;
	letter-spacing: -0.03em;
	color: var(--nv-text);
}
.nv-gestion__head-right { display: flex; flex-wrap: wrap; align-items: stretch; gap: 0.75rem; }
.nv-gtarget, .nv-gslot, .nv-gserver {
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
	min-width: 190px;
	padding: 0.7rem 0.9rem;
	border-radius: var(--nv-radius-sm);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.08);
}
.nv-gtarget.is-set { border-color: rgb(var(--nv-violet) / 0.6); }
.nv-gtarget__name { font-weight: 600; color: var(--nv-muted); }
.nv-gtarget.is-set .nv-gtarget__name { color: rgb(var(--nv-violet)); }
.nv-gtarget__id {
	font-family: var(--nv-font-mono);
	font-size: 0.74rem;
	color: var(--nv-muted);
}
.nv-gslot__row { display: flex; gap: 0.4rem; margin-top: 0.2rem; }
.nv-gslot__btn {
	flex: 1;
	padding: 0.35rem 0.6rem;
	border-radius: 8px;
	font-size: 0.76rem;
	font-weight: 700;
	letter-spacing: 0.06em;
	color: var(--nv-muted);
	background: rgb(var(--nv-line) / 0.05);
	border: 1px solid rgb(var(--nv-line) / 0.1);
	transition: color 0.3s, background 0.3s, border-color 0.3s;
}
.nv-gslot__btn.is-active {
	color: var(--nv-text);
	background: rgb(var(--nv-violet) / 0.22);
	border-color: rgb(var(--nv-violet) / 0.7);
}

.nv-gestion__layout {
	display: grid;
	grid-template-columns: 230px minmax(0, 1fr) 290px;
	gap: 1.5rem;
	align-items: start;
}
.nv-gside { display: flex; flex-direction: column; gap: 0.3rem; position: sticky; top: 80px; }
.nv-gside__label { margin-bottom: 0.2rem; }
.nv-gside__label--sep { margin-top: 1.4rem; }
.nv-gside__note { margin: 0.4rem 0 0; font-size: 0.72rem; }
.nv-gtab {
	position: relative;
	display: flex;
	align-items: center;
	padding: 0.7rem 0.9rem;
	border: 0;
	border-radius: 10px;
	background: none;
	color: var(--nv-muted);
	font: inherit;
	font-weight: 600;
	font-size: 0.86rem;
	letter-spacing: 0.04em;
	text-align: left;
	transition: color 0.3s var(--nv-ease), background 0.3s var(--nv-ease);
}
.nv-gtab:hover { color: var(--nv-text); background: rgb(var(--nv-line) / 0.05); }
.nv-gtab.is-active {
	color: var(--nv-text);
	background: rgb(var(--nv-violet) / 0.16);
}
.nv-gtab.is-active::before {
	content: '';
	position: absolute;
	left: 0;
	top: 0.55rem;
	bottom: 0.55rem;
	width: 3px;
	border-radius: 0 3px 3px 0;
	background: rgb(var(--nv-violet));
}
.nv-gtab--flat { font-size: 0.8rem; font-weight: 500; }
.nv-gtab.is-disabled { opacity: 0.4; cursor: not-allowed; }

.nv-gpage { display: none; }
.nv-gpage.is-active { display: block; animation: nv-book-in 0.35s var(--nv-ease-out); }
.nv-gpage__head { margin-bottom: 1.4rem; }
.nv-gpage__eyebrow { font-size: 0.7rem; letter-spacing: 0.2em; color: rgb(var(--nv-violet)); }
.nv-gpage__title {
	margin: 0.2rem 0 0;
	font-family: var(--nv-font-display);
	font-size: 1.6rem;
	font-weight: 700;
	letter-spacing: -0.02em;
	color: var(--nv-text);
}
.nv-gsection {
	display: flex;
	align-items: center;
	gap: 0.7rem;
	margin: 1.8rem 0 0.9rem;
	font-size: 0.74rem;
	font-weight: 700;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--nv-muted);
}
.nv-gsection::after {
	content: '';
	flex: 1;
	height: 1px;
	background: linear-gradient(to right, rgb(var(--nv-line) / 0.16), transparent);
}
.nv-ggrid { display: grid; gap: 0.7rem; }
.nv-ggrid--2 { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
.nv-ggrid--3 { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); }

/* Carte : filigrane d'icône à droite, presque effacé au repos, qui s'allume
   au survol — le rôle que tenait la grande icône dans le menu en jeu. */
.nv-gcard {
	position: relative;
	overflow: hidden;
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
	min-height: 92px;
	padding: 0.85rem 1rem;
	text-align: left;
	border-radius: var(--nv-radius-sm);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
	color: var(--nv-text);
	font: inherit;
	transition: transform 0.35s var(--nv-ease), border-color 0.35s var(--nv-ease), box-shadow 0.35s var(--nv-ease);
	--nv-gtone: var(--nv-violet);
}
.nv-gcard.is-danger { --nv-gtone: 244 63 94; }
.nv-gcard.is-good { --nv-gtone: 34 197 94; }
.nv-gcard.is-gold { --nv-gtone: 251 191 36; }
.nv-gcard:hover {
	transform: translateY(-3px);
	border-color: rgb(var(--nv-gtone) / 0.55);
	box-shadow: 0 18px 40px -26px rgb(var(--nv-gtone) / 0.9);
}
.nv-gcard::before {
	content: '';
	position: absolute;
	left: 0;
	top: 0.7rem;
	bottom: 0.7rem;
	width: 3px;
	border-radius: 0 3px 3px 0;
	background: rgb(var(--nv-gtone));
	opacity: 0;
	transition: opacity 0.35s var(--nv-ease);
}
.nv-gcard:hover::before { opacity: 1; }
.nv-gcard__mark {
	position: absolute;
	right: 0.5rem;
	top: 50%;
	transform: translateY(-50%);
	font-size: 2.6rem;
	color: rgb(var(--nv-gtone) / 0.09);
	transition: color 0.35s var(--nv-ease), transform 0.35s var(--nv-ease);
	pointer-events: none;
}
.nv-gcard:hover .nv-gcard__mark { color: rgb(var(--nv-gtone) / 0.3); transform: translate(-4px, -50%); }
.nv-gcard__num {
	position: relative;
	font-size: 0.66rem;
	letter-spacing: 0.14em;
	color: rgb(var(--nv-line) / 0.35);
}
.nv-gcard__title { position: relative; font-weight: 600; font-size: 1rem; color: var(--nv-text); }
.nv-gcard__sub {
	position: relative;
	margin-top: auto;
	font-size: 0.68rem;
	letter-spacing: 0.06em;
	line-height: 1.4;
	color: var(--nv-muted);
	padding-right: 2.2rem;
}
.nv-gcard.is-busy { opacity: 0.5; pointer-events: none; }

.nv-gbox {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	gap: 0.7rem;
	padding: 1rem 1.1rem;
	margin-bottom: 0.7rem;
	border-radius: var(--nv-radius-sm);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.7), rgb(var(--nv-surface) / 0.8));
	border: 1px solid rgb(var(--nv-line) / 0.07);
}
.nv-gbox label { display: flex; flex-direction: column; gap: 0.3rem; flex: 1 1 200px; margin: 0; }
.nv-gbox__small { flex: 0 0 110px !important; }
.nv-gbox__wide { flex: 1 1 320px !important; }
.nv-gbox__actions { display: flex; gap: 0.5rem; flex-wrap: wrap; }
.nv-gbox__actions .nv-btn-ghost { margin-top: 0; }
.nv-greason { display: flex; flex-direction: column; gap: 0.3rem; margin-bottom: 0.7rem; }

.nv-gplayers {
	position: sticky;
	top: 80px;
	display: flex;
	flex-direction: column;
	gap: 0.6rem;
	padding: 1rem;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.7), rgb(var(--nv-surface) / 0.85));
	border: 1px solid rgb(var(--nv-line) / 0.07);
	max-height: calc(100vh - 110px);
}
.nv-gplayers__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	font-weight: 700;
	font-size: 0.8rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--nv-text);
}
.nv-gplayers__count { color: #4ade80; font-size: 0.74rem; }
.nv-gplayers__list { display: flex; flex-direction: column; gap: 0.35rem; overflow-y: auto; }
.nv-gplayers__note { margin: 0; font-size: 0.7rem; }
.nv-gplayer {
	display: flex;
	align-items: center;
	gap: 0.6rem;
	padding: 0.5rem 0.6rem;
	border-radius: 10px;
	border: 1px solid transparent;
	background: rgb(var(--nv-line) / 0.03);
	color: var(--nv-text);
	font: inherit;
	text-align: left;
	transition: border-color 0.3s, background 0.3s;
}
.nv-gplayer:hover { background: rgb(var(--nv-line) / 0.07); }
.nv-gplayer.is-active { border-color: rgb(var(--nv-violet) / 0.7); background: rgb(var(--nv-violet) / 0.14); }
.nv-gplayer__pic {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	width: 32px;
	height: 32px;
	border-radius: 9px;
	font-weight: 700;
	font-size: 0.86rem;
	color: var(--nv-muted);
	background: rgb(var(--nv-line) / 0.08);
}
.nv-gplayer__body { display: flex; flex-direction: column; min-width: 0; line-height: 1.25; }
.nv-gplayer__name, .nv-gplayer__id { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nv-gplayer__name { font-size: 0.88rem; }
.nv-gplayer__id { font-family: var(--nv-font-mono); font-size: 0.68rem; color: var(--nv-muted); }
.nv-gplayer__ping { margin-left: auto; font-size: 0.7rem; color: var(--nv-muted); }

/* Retour d'action : la LIGNE envoyée, pas un message maison. Le menu reste
   vérifiable au lieu d'être une boîte noire. */
.nv-gtoast {
	position: fixed;
	left: 50%;
	bottom: 1.5rem;
	z-index: 1035;
	transform: translateX(-50%);
	display: flex;
	gap: 0.8rem;
	max-width: min(760px, calc(100vw - 2rem));
	padding: 0.8rem 1.1rem;
	border-radius: var(--nv-radius-sm);
	background: rgb(var(--nv-surface) / 0.97);
	border: 1px solid rgb(var(--nv-line) / 0.14);
	box-shadow: 0 24px 60px -24px rgb(0 0 0 / 0.9);
	animation: nv-book-in 0.3s var(--nv-ease-out);
}
.nv-gtoast__bar { flex: 0 0 3px; border-radius: 3px; background: #22c55e; }
.nv-gtoast.is-error .nv-gtoast__bar { background: #f43f5e; }
.nv-gtoast code {
	display: block;
	font-size: 0.8rem;
	color: var(--nv-text);
	word-break: break-word;
}
.nv-gtoast span[data-gtoast-reply] { display: block; margin-top: 0.2rem; font-size: 0.8rem; color: var(--nv-muted); white-space: pre-line; }

@media (max-width: 1199.98px) {
	.nv-gestion__layout { grid-template-columns: 200px minmax(0, 1fr); }
	.nv-gplayers { grid-column: 1 / -1; position: static; max-height: 420px; }
}
@media (max-width: 767.98px) {
	.nv-gestion__layout { grid-template-columns: 1fr; }
	.nv-gside { position: static; flex-direction: row; overflow-x: auto; padding-bottom: 0.4rem; }
	.nv-gside__label, .nv-gside__note { display: none; }
	.nv-gtab { white-space: nowrap; }
}

/* ============================================================================
   33. Annonce serveur et patch notes
   ========================================================================= */

/* Bandeau d'annonce : même famille que les bandeaux de thème, mais ton
   variable selon l'urgence. */
.nv-announce {
	position: relative;
	z-index: 1;
	color: #fff;
	border-bottom: 1px solid rgb(255 255 255 / 0.12);
	--nv-ann: var(--nv-violet);
}
.nv-announce--info { --nv-ann: 56 189 248; }
.nv-announce--success { --nv-ann: 34 197 94; }
.nv-announce--warning { --nv-ann: 251 146 60; }
.nv-announce--alert { --nv-ann: 244 63 94; }
.nv-announce__inner {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.5rem 1rem;
	padding: 0.7rem 1rem;
}
.nv-announce {
	background:
		linear-gradient(90deg, rgb(var(--nv-ann) / 0.28), rgb(var(--nv-ann) / 0.1) 60%, transparent),
		rgb(var(--nv-surface) / 0.96);
	border-top: 1px solid rgb(var(--nv-ann) / 0.5);
	border-bottom-color: rgb(var(--nv-ann) / 0.35);
}
.nv-announce__icon { color: rgb(var(--nv-ann)); font-size: 1.05rem; }
.nv-announce__text {
	flex: 1 1 280px;
	margin: 0;
	font-size: 0.93rem;
	line-height: 1.5;
	color: var(--nv-text);
}
.nv-announce__link {
	font-weight: 600;
	font-size: 0.88rem;
	color: rgb(var(--nv-ann));
	text-decoration: none;
	white-space: nowrap;
	border-bottom: 1px solid currentColor;
}
.nv-announce__close {
	margin-left: auto;
	width: 30px;
	height: 30px;
	border: 0;
	border-radius: 50%;
	background: rgb(var(--nv-line) / 0.06);
	color: var(--nv-muted);
	transition: color 0.3s, background 0.3s, transform 0.3s var(--nv-ease);
}
.nv-announce__close:hover { color: var(--nv-text); background: rgb(var(--nv-line) / 0.12); transform: rotate(90deg); }
.nv-announce--static { border-radius: var(--nv-radius-sm); border: 1px solid rgb(var(--nv-ann) / 0.4); }
.nv-announce-admin__toggle { margin: 1.1rem 0 0.6rem; }
.nv-check { display: flex; align-items: center; gap: 0.5rem; font-size: 0.92rem; color: var(--nv-text); cursor: pointer; }
.nv-check .form-check-input { margin: 0; }

/* Patch notes : page publique */
.nv-pn__lead { max-width: 62ch; color: var(--nv-muted); margin-bottom: 1.5rem; }
.nv-pn-note {
	position: relative;
	padding: 1.75rem;
	margin-bottom: 1.5rem;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.08);
	scroll-margin-top: 90px;
}
.nv-pn-note__head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.6rem 1rem;
	padding-bottom: 0.9rem;
	margin-bottom: 1rem;
	border-bottom: 1px solid rgb(var(--nv-line) / 0.08);
}
.nv-pn-note__version, .nv-pn-row__version {
	padding: 0.2em 0.65em;
	border-radius: 999px;
	font-family: var(--nv-font-display);
	font-size: 0.78rem;
	font-weight: 700;
	letter-spacing: 0.04em;
	color: #fff;
	background: rgb(var(--nv-violet) / 0.3);
	border: 1px solid rgb(var(--nv-violet) / 0.6);
}
.nv-pn-note__title {
	margin: 0;
	font-family: var(--nv-font-display);
	font-size: clamp(1.35rem, 3vw, 1.9rem);
	font-weight: 700;
	letter-spacing: -0.02em;
	color: var(--nv-text);
}
.nv-pn-note__date { margin-left: auto; font-size: 0.82rem; color: var(--nv-muted); }
.nv-pn-note__summary { max-width: 70ch; color: var(--nv-text); opacity: 0.88; line-height: 1.7; }
.nv-pn-note__image { width: 100%; border-radius: var(--nv-radius-sm); margin: 0.5rem 0 1.25rem; }

.nv-pn-nature { margin-top: 1.5rem; --nv-nat: var(--nv-violet); }
.nv-pn-nature.is-add { --nv-nat: 34 197 94; }
.nv-pn-nature.is-change { --nv-nat: 56 189 248; }
.nv-pn-nature.is-fix { --nv-nat: 251 146 60; }
.nv-pn-nature__title {
	display: inline-flex;
	align-items: center;
	margin: 0 0 0.8rem;
	padding: 0.32em 0.9em;
	border-radius: 999px;
	font-size: 0.8rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: rgb(var(--nv-nat));
	background: rgb(var(--nv-nat) / 0.12);
	border: 1px solid rgb(var(--nv-nat) / 0.35);
}
.nv-pn-group { margin: 0 0 0.9rem; padding-left: 0.9rem; border-left: 2px solid rgb(var(--nv-nat) / 0.3); }
.nv-pn-group.is-staff { border-left-color: rgb(251 191 36 / 0.6); }
.nv-pn-group__label {
	display: block;
	margin-bottom: 0.35rem;
	font-size: 0.74rem;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--nv-muted);
}
.nv-pn-group.is-staff .nv-pn-group__label { color: #fbbf24; }
.nv-pn-lines { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.3rem; }
.nv-pn-lines li {
	display: flex;
	align-items: flex-start;
	gap: 0.6rem;
	font-size: 0.95rem;
	line-height: 1.6;
	color: var(--nv-text);
	opacity: 0.9;
}
.nv-pn-lines li::before {
	content: '›';
	color: rgb(var(--nv-nat));
	font-weight: 700;
	line-height: 1.5;
}
.nv-pn-remove {
	margin-left: auto;
	width: 22px;
	height: 22px;
	border: 0;
	border-radius: 6px;
	background: rgb(var(--nv-line) / 0.06);
	color: var(--nv-muted);
	font-size: 0.7rem;
	transition: color 0.3s, background 0.3s;
}
.nv-pn-remove:hover { color: #fda4af; background: rgb(244 63 94 / 0.15); }

/* Patch notes : admin */
.nv-pn-add { margin-top: 1.25rem; }
.nv-pn-list { margin-top: 0.5rem; }
.nv-pn-row {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: 0.5rem 1rem;
	padding: 1rem 1.25rem;
	border-radius: var(--nv-radius);
	background: linear-gradient(rgb(var(--nv-surface-2) / 0.86), rgb(var(--nv-surface) / 0.92));
	border: 1px solid rgb(var(--nv-line) / 0.07);
}
.nv-pn-row.is-live { border-color: rgb(34 197 94 / 0.35); }
.nv-pn-row__main { display: flex; flex-wrap: wrap; align-items: center; gap: 0.7rem; }
.nv-pn-row__title { font-weight: 600; font-size: 1.05rem; color: var(--nv-text); text-decoration: none; }
.nv-pn-row__title:hover { color: rgb(var(--nv-violet)); }
.nv-pn-row__details { grid-column: 1; display: flex; flex-wrap: wrap; gap: 0.3rem 1.2rem; font-size: 0.82rem; color: var(--nv-muted); }
.nv-pn-row__actions { grid-column: 2; grid-row: 1 / span 2; display: flex; align-items: center; gap: 0.5rem; }
.nv-pn-row__actions .nv-btn-ghost { margin-top: 0; }
.nv-pn-publish {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 1rem;
	margin: 2rem 0 1rem;
	padding: 1.25rem;
	border-radius: var(--nv-radius);
	background: rgb(var(--nv-violet) / 0.08);
	border: 1px solid rgb(var(--nv-violet) / 0.3);
}
.nv-pn-publish .nv-help { flex: 1 1 320px; margin: 0; }
.nv-badge--off { background: rgb(var(--nv-line) / 0.06); color: var(--nv-muted); border: 1px solid rgb(var(--nv-line) / 0.12); }
@media (max-width: 767.98px) {
	.nv-pn-row { grid-template-columns: 1fr; }
	.nv-pn-row__actions { grid-column: 1; grid-row: auto; }
}

/* ============================================================================
   34. Typographies par ambiance
   Une ambiance ne change pas que ses couleurs : elle a ses polices et sa
   façon de composer (graisse, chasse, capitales, ornement sous les titres,
   forme des boutons). La base (sections 1 à 9) ne lit que des jetons ; ici
   chaque ambiance les redéfinit puis ajoute ses moments de composition.
   Les polices sont chargées par partials/_style.twig d'après
   NovaThemes::fontsUrl() : seulement celles de l'ambiance active.
   ========================================================================= */

/* Deux familles d'étiquettes : les petites (badges, aides, libellés de
   formulaire) suivent --nv-font-label ; les accroches au-dessus des titres
   (kickers, sur-titres) suivent --nv-font-kicker. Par défaut : texte et
   titre, donc rien ne bouge pour VYX Original. */
:root {
	--nv-font-kicker: var(--nv-font-display);
}
:is(.nv-label, .nv-help, .nv-hero-scroll, .nv-badge, .nv-chip, .badge, .nv-rulebook__tag, .nv-offer__tag,
	.nv-pn-group__label, .nv-pn-note__date, .nv-rulebook-card__meta, .nv-gside__label, .nv-lore-secret__label) {
	font-family: var(--nv-font-label);
}
:is(.nv-gpage__eyebrow, .nv-gestion__eyebrow, .nv-offer__kicker, .nv-offer-card__cat, .nv-lore-chapter__meta,
	.nv-lore-eyebrow, .nv-lore-kicker, .nv-pn-note__version, .nv-article__num) {
	font-family: var(--nv-font-kicker);
}

/* Admin → Thèmes : les polices de chaque carte, écrites dans leur police */
.nv-theme-card__type {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.2rem 0.55rem;
	margin-top: 0.35rem;
	font-size: 1.02rem;
	line-height: 1.3;
	color: var(--nv-text);
}
.nv-theme-card__type b { font-weight: 500; }
.nv-theme-card__type i { font-style: normal; color: var(--nv-muted); }
.nv-theme-card__note { font-size: 0.8rem; line-height: 1.45; color: var(--nv-muted); }
.nv-theme-card__title { transition: none; }

/* ── Nouvel An : Bodoni Moda et Jost, l'affiche d'un gala ────────────────── */
html[data-nv-theme='nouvelan'] {
	--nv-font-display: 'Bodoni Moda', 'Didot', 'Playfair Display', Georgia, serif;
	--nv-font-body: 'Jost', 'Futura', 'Inter', system-ui, sans-serif;
	--nv-font-accent: 'Bodoni Moda', Georgia, serif;
	--nv-font-label: 'Jost', system-ui, sans-serif;
	--nv-font-kicker: 'Jost', system-ui, sans-serif;
	--nv-body-features: normal;
	--nv-body-tracking: 0.012em;
	--nv-title-weight: 500;
	--nv-title-tracking: 0.08em;
	--nv-title-transform: uppercase;
	--nv-hero-weight: 500;
	--nv-hero-tracking: 0.03em;
	--nv-hero-leading: 1;
	--nv-hero-style: italic;
	--nv-nav-font: 'Jost', system-ui, sans-serif;
	--nv-nav-weight: 500;
	--nv-nav-size: 0.8rem;
	--nv-nav-tracking: 0.18em;
	--nv-nav-transform: uppercase;
	--nv-btn-font: 'Jost', system-ui, sans-serif;
	--nv-btn-weight: 500;
	--nv-btn-radius: 3px;
	--nv-btn-tracking: 0.16em;
	--nv-btn-transform: uppercase;
	--nv-radius: 8px;
	--nv-radius-sm: 4px;
}
html[data-nv-theme='nouvelan'] .title-main { font-size: clamp(3rem, 10vw, 8rem); }
html[data-nv-theme='nouvelan'] .navbar-brand { font-style: italic; font-weight: 500; letter-spacing: 0.04em; font-size: 1.5rem; }
/* Slogan en petites capitales très espacées, comme une ligne de programme */
html[data-nv-theme='nouvelan'] .parallax .middle h5 {
	font-family: 'Jost', system-ui, sans-serif;
	font-weight: 400;
	font-size: 0.84rem;
	letter-spacing: 0.3em;
	text-transform: uppercase;
	margin-top: 1.9rem;
}
/* Titres de section : deux filets doubles dorés de part et d'autre */
html[data-nv-theme='nouvelan'] :is(.alternatebg > .title, .page-header h1) { padding-inline: 3rem; padding-bottom: 0.25em; }
html[data-nv-theme='nouvelan'] :is(.alternatebg > .title, .page-header h1)::before,
html[data-nv-theme='nouvelan'] :is(.alternatebg > .title, .page-header h1)::after {
	content: '';
	position: absolute;
	left: 0;
	right: auto;
	top: calc(50% - 0.12em);
	bottom: auto;
	width: 2rem;
	height: 5px;
	border-radius: 0;
	background: none;
	box-shadow: none;
	border-top: 1px solid rgb(231 186 84 / 0.85);
	border-bottom: 1px solid rgb(231 186 84 / 0.85);
	transform: translateY(-50%);
	transition: none;
}
html[data-nv-theme='nouvelan'] :is(.alternatebg > .title, .page-header h1)::after { left: auto; right: 0; }
/* Cadre déco : un second filet doré en retrait, sur les cartes et les boutons */
html[data-nv-theme='nouvelan'] .card { outline: 1px solid rgb(231 186 84 / 0.16); outline-offset: -6px; }
html[data-nv-theme='nouvelan'] .card:hover { outline-color: rgb(231 186 84 / 0.45); }
html[data-nv-theme='nouvelan'] .btn { outline: 1px solid rgb(231 186 84 / 0.3); outline-offset: 3px; }
html[data-nv-theme='nouvelan'] .btn:hover { outline-color: rgb(231 186 84 / 0.7); }
html[data-nv-theme='nouvelan'] .card-title { font-weight: 500; letter-spacing: 0.01em; }
html[data-nv-theme='nouvelan'] :is(.nv-offer__price-now, .nv-offer-card__price, .alternatebg .card .fs-2) { font-weight: 500; letter-spacing: 0; }
/* Le millésime géant passe en Bodoni italique, le compte à rebours en Jost tracké */
html[data-nv-theme='nouvelan'] .nv-year { font-family: 'Bodoni Moda', Georgia, serif; font-weight: 400; font-style: italic; letter-spacing: 0; }
html[data-nv-theme='nouvelan'] .nv-clock--year { font-family: 'Jost', system-ui, sans-serif; letter-spacing: 0.24em; font-size: 0.7rem; }

/* ── Hiver : Raleway maigre, Manrope, fin comme du givre ─────────────────── */
html[data-nv-theme='hiver'] {
	--nv-font-display: 'Raleway', 'Inter', system-ui, sans-serif;
	--nv-font-body: 'Manrope', 'Inter', system-ui, sans-serif;
	--nv-font-accent: 'Raleway', system-ui, sans-serif;
	--nv-font-label: 'Raleway', system-ui, sans-serif;
	--nv-font-kicker: 'Raleway', system-ui, sans-serif;
	--nv-body-features: normal;
	--nv-body-tracking: 0;
	--nv-title-weight: 300;
	--nv-title-tracking: 0.24em;
	--nv-title-transform: uppercase;
	--nv-hero-weight: 200;
	--nv-hero-tracking: 0.14em;
	--nv-hero-leading: 1;
	--nv-hero-transform: uppercase;
	--nv-nav-font: 'Raleway', system-ui, sans-serif;
	--nv-nav-weight: 500;
	--nv-nav-size: 0.8rem;
	--nv-nav-tracking: 0.16em;
	--nv-nav-transform: uppercase;
	--nv-btn-font: 'Raleway', system-ui, sans-serif;
	--nv-btn-weight: 600;
	--nv-btn-radius: 999px;
	--nv-btn-tracking: 0.14em;
	--nv-btn-transform: uppercase;
}
html[data-nv-theme='hiver'] .title-main { font-size: clamp(2.5rem, 9vw, 7rem); padding-left: 0.14em; }
html[data-nv-theme='hiver'] .navbar-brand { font-weight: 300; letter-spacing: 0.32em; text-transform: uppercase; font-size: 1.05rem; padding-left: 0.32em; }
html[data-nv-theme='hiver'] .parallax .middle h5 { font-family: 'Raleway', system-ui, sans-serif; font-weight: 300; letter-spacing: 0.08em; }
html[data-nv-theme='hiver'] .card-title { font-weight: 500; letter-spacing: 0.05em; }
html[data-nv-theme='hiver'] .btn { font-size: 0.82rem; padding: 0.65rem 1.5rem; }
/* Sous les titres : un fil de givre sur toute la largeur du mot, un cristal au centre */
html[data-nv-theme='hiver'] :is(.alternatebg > .title, .page-header h1) { padding-bottom: 0.55em; }
html[data-nv-theme='hiver'] :is(.alternatebg > .title, .page-header h1)::after {
	width: 100%;
	height: 1px;
	border-radius: 0;
	background: linear-gradient(to right, transparent, rgb(186 230 253 / 0.9) 35%, rgb(186 230 253 / 0.9) 65%, transparent);
	box-shadow: 0 0 18px rgb(56 189 248 / 0.7);
}
html[data-nv-theme='hiver'] :is(.alternatebg > .title, .page-header h1)::before {
	content: '✦';
	position: absolute;
	left: 50%;
	bottom: -0.22em;
	transform: translateX(-50%);
	font-size: 0.42em;
	letter-spacing: 0;
	line-height: 1;
	color: #e0f2fe;
	text-shadow: 0 0 14px rgb(56 189 248);
}
html[data-nv-theme='hiver'] :is(.nv-offer__price-now, .nv-offer-card__price, .alternatebg .card .fs-2) { font-weight: 300; letter-spacing: 0.02em; }

/* ── Saint-Valentin : Playfair Display en italique, Parisienne, Mulish ───── */
html[data-nv-theme='valentin'] {
	--nv-font-display: 'Playfair Display', 'Georgia', serif;
	--nv-font-body: 'Mulish', 'Inter', system-ui, sans-serif;
	--nv-font-accent: 'Parisienne', 'Playfair Display', cursive;
	--nv-font-label: 'Mulish', system-ui, sans-serif;
	--nv-font-kicker: 'Parisienne', cursive;
	--nv-body-features: normal;
	--nv-body-tracking: 0;
	--nv-title-weight: 600;
	--nv-title-tracking: -0.01em;
	--nv-title-style: italic;
	--nv-hero-weight: 700;
	--nv-hero-tracking: -0.02em;
	--nv-hero-leading: 0.95;
	--nv-hero-style: italic;
	--nv-nav-font: 'Mulish', system-ui, sans-serif;
	--nv-nav-weight: 600;
	--nv-nav-size: 0.92rem;
	--nv-btn-font: 'Mulish', system-ui, sans-serif;
	--nv-btn-weight: 700;
	--nv-btn-tracking: 0.02em;
	--nv-radius: 22px;
	--nv-radius-sm: 14px;
}
html[data-nv-theme='valentin'] :is(h1, h2, h3, .title, .card-title, .title-main) { font-variant-ligatures: common-ligatures discretionary-ligatures; }
html[data-nv-theme='valentin'] .title-main { padding-right: 0.08em; }
html[data-nv-theme='valentin'] .navbar-brand { font-style: italic; font-weight: 700; font-size: 1.42rem; }
/* Le slogan devient une ligne manuscrite, comme la signature d'une lettre */
html[data-nv-theme='valentin'] .parallax .middle h5 {
	font-family: var(--nv-font-accent);
	font-size: clamp(1.6rem, 3.2vw, 2.5rem);
	letter-spacing: 0.01em;
	color: #fecdd3;
	margin-top: 0.5rem;
	max-width: none;
	text-shadow: 0 2px 22px rgb(225 29 72 / 0.45);
}
/* Un petit cœur sous les titres, à la place du filet */
html[data-nv-theme='valentin'] :is(.alternatebg > .title, .page-header h1)::after {
	content: '♥';
	width: auto;
	height: auto;
	bottom: -0.12em;
	border-radius: 0;
	background: none;
	box-shadow: none;
	font-family: var(--nv-font-body);
	font-style: normal;
	font-size: 0.48em;
	line-height: 1;
	letter-spacing: 0;
	color: #fb7185;
	text-shadow: 0 0 16px rgb(225 29 72 / 0.95);
	transition: none;
}
html[data-nv-theme='valentin'] .card-title { font-style: italic; font-weight: 600; }
html[data-nv-theme='valentin'] :is(.nv-offer__price-now, .nv-offer-card__price, .alternatebg .card .fs-2) { font-style: italic; }
/* Les accroches passent en écriture manuscrite, en plus grand */
html[data-nv-theme='valentin'] :is(.nv-offer__kicker, .nv-gpage__eyebrow, .nv-gestion__eyebrow, .nv-lore-eyebrow, .nv-lore-kicker, .nv-offer-card__cat) {
	text-transform: none;
	letter-spacing: 0;
	font-size: 1.35em;
	font-weight: 400;
}

/* ── Fête de l'Humanité : Fraunces, Source Sans, Courier Prime ───────────── */
html[data-nv-theme='humanite'] {
	--nv-font-display: 'Fraunces', 'Georgia', serif;
	--nv-font-body: 'Source Sans 3', 'Inter', system-ui, sans-serif;
	--nv-font-accent: 'Fraunces', 'Georgia', serif;
	--nv-font-label: 'Courier Prime', 'Courier New', monospace;
	--nv-font-kicker: 'Courier Prime', 'Courier New', monospace;
	--nv-font-mono: 'Courier Prime', 'Courier New', monospace;
	--nv-body-features: normal;
	--nv-body-size: 1.04rem;
	--nv-body-leading: 1.7;
	--nv-body-tracking: 0;
	--nv-title-weight: 400;
	--nv-title-tracking: -0.015em;
	--nv-hero-weight: 300;
	--nv-hero-tracking: -0.025em;
	--nv-hero-leading: 1;
	--nv-nav-font: 'Courier Prime', 'Courier New', monospace;
	--nv-nav-weight: 400;
	--nv-nav-size: 0.82rem;
	--nv-nav-tracking: 0.1em;
	--nv-nav-transform: uppercase;
	--nv-btn-font: 'Courier Prime', 'Courier New', monospace;
	--nv-btn-weight: 700;
	--nv-btn-radius: 4px;
	--nv-btn-tracking: 0.12em;
	--nv-btn-transform: uppercase;
	--nv-radius: 10px;
	--nv-radius-sm: 6px;
}
/* L'axe « soft » de Fraunces : des empattements arrondis, sans angles */
html[data-nv-theme='humanite'] :is(h1, h2, h3, .title, .card-title, .title-main, .navbar-brand) {
	font-variation-settings: 'SOFT' 100, 'WONK' 0;
	font-optical-sizing: auto;
}
html[data-nv-theme='humanite'] .navbar-brand { font-weight: 400; font-style: italic; letter-spacing: 0; font-size: 1.35rem; }
html[data-nv-theme='humanite'] .card-title { font-weight: 500; }
/* Slogan en italique léger, comme une inscription */
html[data-nv-theme='humanite'] .parallax .middle h5 {
	font-family: var(--nv-font-display);
	font-style: italic;
	font-weight: 300;
	font-size: clamp(1.15rem, 2vw, 1.55rem);
	letter-spacing: 0;
	color: #4b5563;
}
/* Boutons plats, sans dégradé ni reflet : un aplat d'encre */
html[data-nv-theme='humanite'] .btn-primary { background: #1f2733; box-shadow: none; color: #f6f3ee; }
html[data-nv-theme='humanite'] .btn.btn-primary:hover { background: rgb(91 127 166); box-shadow: none; background-position: 0 0; }
html[data-nv-theme='humanite'] .btn::before { display: none; }
html[data-nv-theme='humanite'] .btn { font-size: 0.86rem; }
/* Sous les titres : un simple trait d'encre */
html[data-nv-theme='humanite'] :is(.alternatebg > .title, .page-header h1)::after {
	height: 1px;
	border-radius: 0;
	background: rgb(31 39 51 / 0.6);
	box-shadow: none;
}
html[data-nv-theme='humanite'] :is(.alternatebg.nv-in > .title, .page-header.nv-in h1)::after { width: 3.5rem; }
html[data-nv-theme='humanite'] .nv-hero-scroll { letter-spacing: 0.24em; }
html[data-nv-theme='humanite'] :is(.nv-offer__kicker, .nv-gpage__eyebrow, .nv-gestion__eyebrow, .nv-lore-eyebrow, .nv-lore-kicker) { letter-spacing: 0.16em; font-weight: 400; }

/* ── Halloween : Grenze Gotisch et Grenze, une gothique moderne ──────────── */
html[data-nv-theme='halloween'] {
	--nv-font-display: 'Grenze Gotisch', 'Grenze', Georgia, serif;
	--nv-font-body: 'Grenze', 'Georgia', serif;
	--nv-font-accent: 'Grenze Gotisch', Georgia, serif;
	--nv-font-label: 'Grenze', Georgia, serif;
	--nv-font-kicker: 'Grenze Gotisch', Georgia, serif;
	--nv-body-features: normal;
	--nv-body-size: 1.06rem;
	--nv-body-leading: 1.55;
	--nv-body-tracking: 0;
	--nv-title-weight: 600;
	--nv-title-tracking: 0.01em;
	--nv-hero-weight: 700;
	--nv-hero-tracking: 0;
	--nv-hero-leading: 0.95;
	--nv-nav-font: 'Grenze', Georgia, serif;
	--nv-nav-weight: 500;
	--nv-nav-size: 1.02rem;
	--nv-nav-tracking: 0.05em;
	--nv-nav-transform: uppercase;
	--nv-btn-font: 'Grenze Gotisch', Georgia, serif;
	--nv-btn-weight: 500;
	--nv-btn-radius: 6px;
	--nv-btn-tracking: 0.05em;
	--nv-radius: 10px;
	--nv-radius-sm: 6px;
}
html[data-nv-theme='halloween'] .btn { font-size: 1.08em; padding-block: 0.45rem; }
html[data-nv-theme='halloween'] .title-main { filter: drop-shadow(0 0 24px rgb(249 115 22 / 0.5)); }
html[data-nv-theme='halloween'] .navbar-brand { font-size: 1.6rem; font-weight: 600; letter-spacing: 0.02em; }
html[data-nv-theme='halloween'] .parallax .middle h5 { font-family: 'Grenze', Georgia, serif; font-style: italic; font-size: clamp(1.1rem, 1.8vw, 1.35rem); letter-spacing: 0.02em; }
html[data-nv-theme='halloween'] .card-title { font-weight: 600; }
/* Étiquettes en petites capitales, comme sur une étiquette de fiole */
html[data-nv-theme='halloween'] :is(.nv-label, .nv-badge, .nv-chip, .badge, .nv-offer__tag, .nv-rulebook__tag, .nv-help) { font-variant-caps: small-caps; letter-spacing: 0.06em; }
/* Sous les titres : des griffures orange */
html[data-nv-theme='halloween'] :is(.alternatebg > .title, .page-header h1)::after {
	height: 7px;
	border-radius: 0;
	background: repeating-linear-gradient(135deg, rgb(249 115 22) 0 2px, transparent 2px 7px);
	box-shadow: none;
}
html[data-nv-theme='halloween'] :is(.alternatebg.nv-in > .title, .page-header.nv-in h1)::after { width: 120px; }
/* Lettrine en tête des articles et des chapitres */
html[data-nv-theme='halloween'] :is(.nv-lore-chapter, .nv-article__body, .nv-prose) > p:first-of-type::first-letter {
	font-family: 'Grenze Gotisch', Georgia, serif;
	font-weight: 600;
	font-size: 3.4em;
	float: left;
	line-height: 0.8;
	padding: 0.08em 0.12em 0 0;
	color: rgb(249 115 22);
	text-shadow: 0 0 14px rgb(249 115 22 / 0.6);
}

/* ── Noël : Yeseva One, Berkshire Swash, Alegreya Sans ───────────────────── */
html[data-nv-theme='noel'] {
	--nv-font-display: 'Yeseva One', 'Georgia', serif;
	--nv-font-body: 'Alegreya Sans', 'Inter', system-ui, sans-serif;
	--nv-font-accent: 'Berkshire Swash', 'Yeseva One', cursive;
	--nv-font-label: 'Alegreya Sans', system-ui, sans-serif;
	--nv-font-kicker: 'Berkshire Swash', cursive;
	--nv-body-features: normal;
	--nv-body-size: 1.05rem;
	--nv-body-leading: 1.55;
	--nv-body-tracking: 0;
	--nv-title-weight: 400;
	--nv-title-tracking: 0.01em;
	--nv-hero-weight: 400;
	--nv-hero-tracking: 0;
	--nv-hero-leading: 1;
	--nv-nav-font: 'Alegreya Sans', system-ui, sans-serif;
	--nv-nav-weight: 700;
	--nv-nav-size: 1.02rem;
	--nv-nav-tracking: 0.02em;
	--nv-btn-font: 'Alegreya Sans', system-ui, sans-serif;
	--nv-btn-weight: 700;
	--nv-btn-tracking: 0.04em;
	--nv-btn-transform: uppercase;
	--nv-radius: 16px;
}
html[data-nv-theme='noel'] .btn { font-size: 0.92rem; }
html[data-nv-theme='noel'] .navbar-brand { font-size: 1.4rem; font-weight: 400; }
html[data-nv-theme='noel'] .card-title { font-weight: 400; letter-spacing: 0.01em; }
/* Le slogan en calligraphie de carte de vœux */
html[data-nv-theme='noel'] .parallax .middle h5 {
	font-family: var(--nv-font-accent);
	font-size: clamp(1.6rem, 3.2vw, 2.5rem);
	letter-spacing: 0.01em;
	color: #fde68a;
	margin-top: 0.4rem;
	max-width: none;
	text-shadow: 0 2px 18px rgb(251 191 36 / 0.4);
}
/* Deux étoiles dorées de part et d'autre des titres */
html[data-nv-theme='noel'] :is(.alternatebg > .title, .page-header h1) { padding-inline: 2.2rem; padding-bottom: 0.25em; }
html[data-nv-theme='noel'] :is(.alternatebg > .title, .page-header h1)::before,
html[data-nv-theme='noel'] :is(.alternatebg > .title, .page-header h1)::after {
	content: '✦';
	position: absolute;
	left: 0;
	right: auto;
	top: 0.12em;
	bottom: auto;
	width: auto;
	height: auto;
	border-radius: 0;
	background: none;
	box-shadow: none;
	transform: none;
	transition: none;
	font-size: 0.5em;
	line-height: 1;
	letter-spacing: 0;
	color: #fbbf24;
	text-shadow: 0 0 14px rgb(251 191 36 / 0.9);
}
html[data-nv-theme='noel'] :is(.alternatebg > .title, .page-header h1)::after { left: auto; right: 0; }
html[data-nv-theme='noel'] :is(.nv-offer__kicker, .nv-gpage__eyebrow, .nv-gestion__eyebrow, .nv-lore-eyebrow, .nv-lore-kicker, .nv-offer-card__cat) {
	text-transform: none;
	letter-spacing: 0;
	font-size: 1.3em;
	font-weight: 400;
}
html[data-nv-theme='noel'] :is(.nv-offer__price-now, .nv-offer-card__price, .alternatebg .card .fs-2) { letter-spacing: 0; }

/* ── Palestine : Changa et Cairo, une typographie d'affiche ──────────────── */
html[data-nv-theme='palestine'] {
	--nv-font-display: 'Changa', 'Cairo', 'Inter', system-ui, sans-serif;
	--nv-font-body: 'Cairo', 'Inter', system-ui, sans-serif;
	--nv-font-accent: 'Changa', system-ui, sans-serif;
	--nv-font-label: 'Changa', system-ui, sans-serif;
	--nv-font-kicker: 'Changa', system-ui, sans-serif;
	--nv-body-features: normal;
	--nv-body-leading: 1.6;
	--nv-body-tracking: 0;
	--nv-title-weight: 800;
	--nv-title-tracking: 0.01em;
	--nv-title-transform: uppercase;
	--nv-hero-weight: 800;
	--nv-hero-tracking: -0.01em;
	--nv-hero-leading: 0.9;
	--nv-hero-transform: uppercase;
	--nv-nav-font: 'Cairo', system-ui, sans-serif;
	--nv-nav-weight: 700;
	--nv-nav-size: 0.9rem;
	--nv-nav-tracking: 0.06em;
	--nv-nav-transform: uppercase;
	--nv-btn-font: 'Changa', system-ui, sans-serif;
	--nv-btn-weight: 600;
	--nv-btn-radius: 6px;
	--nv-btn-tracking: 0.08em;
	--nv-btn-transform: uppercase;
	--nv-radius: 8px;
	--nv-radius-sm: 4px;
}
html[data-nv-theme='palestine'] .navbar-brand { font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em; }
html[data-nv-theme='palestine'] .card-title { text-transform: uppercase; letter-spacing: 0.02em; font-weight: 700; }
html[data-nv-theme='palestine'] .parallax .middle h5 { font-family: 'Cairo', system-ui, sans-serif; font-weight: 600; font-size: 1.05rem; letter-spacing: 0.06em; text-transform: uppercase; }
/* Sous les titres : les trois bandes du drapeau, en trait épais */
html[data-nv-theme='palestine'] :is(.alternatebg > .title, .page-header h1)::after {
	height: 5px;
	border-radius: 0;
	background: linear-gradient(90deg, #111 0 33.3%, #fff 33.3% 66.6%, #16a34a 66.6%);
	box-shadow: 0 0 0 1px rgb(255 255 255 / 0.12);
}
html[data-nv-theme='palestine'] :is(.alternatebg.nv-in > .title, .page-header.nv-in h1)::after { width: 96px; }
html[data-nv-theme='palestine'] .card { border-left: 4px solid rgb(22 163 74); }
html[data-nv-theme='palestine'] .nv-solidarity__text strong { font-family: 'Changa', system-ui, sans-serif; text-transform: uppercase; letter-spacing: 0.06em; font-weight: 700; }
html[data-nv-theme='palestine'] :is(.nv-label, .nv-badge, .nv-chip, .badge) { text-transform: uppercase; letter-spacing: 0.06em; }

/* ── Lore — Déchirure : Cinzel gravée, IM Fell English, Share Tech Mono ──── */
html[data-nv-theme='lore'] {
	--nv-font-display: 'Cinzel', 'Trajan Pro', 'Georgia', serif;
	--nv-font-body: 'IM Fell English', 'Iowan Old Style', 'Georgia', serif;
	--nv-font-accent: 'Cinzel', 'Georgia', serif;
	--nv-font-label: 'Share Tech Mono', 'SFMono-Regular', ui-monospace, monospace;
	--nv-font-kicker: 'Share Tech Mono', 'SFMono-Regular', ui-monospace, monospace;
	--nv-font-mono: 'Share Tech Mono', 'SFMono-Regular', ui-monospace, monospace;
	--nv-body-features: normal;
	--nv-body-size: 1.08rem;
	--nv-body-leading: 1.65;
	--nv-body-tracking: 0;
	--nv-title-weight: 700;
	--nv-title-tracking: 0.1em;
	--nv-title-transform: uppercase;
	--nv-hero-weight: 700;
	--nv-hero-tracking: 0.08em;
	--nv-hero-leading: 1;
	--nv-hero-transform: uppercase;
	--nv-nav-font: 'Cinzel', 'Georgia', serif;
	--nv-nav-weight: 600;
	--nv-nav-size: 0.78rem;
	--nv-nav-tracking: 0.14em;
	--nv-nav-transform: uppercase;
	--nv-btn-font: 'Cinzel', 'Georgia', serif;
	--nv-btn-weight: 700;
	--nv-btn-radius: 2px;
	--nv-btn-tracking: 0.14em;
	--nv-btn-transform: uppercase;
	--nv-radius: 4px;
	--nv-radius-sm: 2px;
}
html[data-nv-theme='lore'] .title-main { font-size: clamp(2.7rem, 9.5vw, 7.5rem); padding-left: 0.08em; }
html[data-nv-theme='lore'] .navbar-brand { font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; font-size: 1.05rem; }
html[data-nv-theme='lore'] .card-title { font-weight: 600; letter-spacing: 0.05em; }
html[data-nv-theme='lore'] .btn { font-size: 0.8rem; padding: 0.65rem 1.4rem; }
/* Slogan en italique du XVIIe, l'encre un peu passée */
html[data-nv-theme='lore'] .parallax .middle h5 {
	font-family: var(--nv-font-body);
	font-style: italic;
	font-size: clamp(1.15rem, 2.2vw, 1.6rem);
	letter-spacing: 0;
	color: rgb(58 42 22 / 0.82);
}
/* Boutons : un cachet d'encre posé sur le papier */
html[data-nv-theme='lore'] .btn-primary { background: rgb(58 42 22); color: #f3e9d0; box-shadow: 3px 3px 0 rgb(58 42 22 / 0.25); }
html[data-nv-theme='lore'] .btn.btn-primary:hover { background: rgb(107 74 43); background-position: 0 0; box-shadow: 4px 4px 0 rgb(42 143 138 / 0.5), -2px -2px 0 rgb(160 40 110 / 0.4); }
html[data-nv-theme='lore'] .btn::before { display: none; }
/* Sous les titres : un filet double et un losange, comme un cul-de-lampe */
html[data-nv-theme='lore'] :is(.alternatebg > .title, .page-header h1) { padding-bottom: 0.6em; }
html[data-nv-theme='lore'] :is(.alternatebg > .title, .page-header h1)::after {
	height: 5px;
	border-radius: 0;
	background: none;
	border-top: 1px solid rgb(58 42 22 / 0.7);
	border-bottom: 1px solid rgb(58 42 22 / 0.7);
	box-shadow: none;
}
html[data-nv-theme='lore'] :is(.alternatebg.nv-in > .title, .page-header.nv-in h1)::after { width: 150px; }
html[data-nv-theme='lore'] :is(.alternatebg > .title, .page-header h1)::before {
	content: '◆';
	position: absolute;
	left: 50%;
	bottom: -0.02em;
	z-index: 1;
	transform: translateX(-50%);
	padding-inline: 0.55em;
	font-size: 0.4em;
	line-height: 1.1;
	letter-spacing: 0;
	color: rgb(58 42 22);
	background: var(--nv-ink);
}
/* Étiquettes : le signal qui traverse le papier, en mono, doublé cyan et magenta */
html[data-nv-theme='lore'] :is(.nv-label, .nv-offer__kicker, .nv-gpage__eyebrow, .nv-gestion__eyebrow, .nv-lore-eyebrow, .nv-lore-kicker, .nv-lore-chapter__meta, .nv-hero-scroll, .nv-offer-card__cat, .nv-pn-note__version) {
	letter-spacing: 0.18em;
	text-transform: uppercase;
	text-shadow: 1px 0 rgb(160 40 110 / 0.45), -1px 0 rgb(42 143 138 / 0.45);
}
html[data-nv-theme='lore'] .card { box-shadow: 3px 3px 0 rgb(58 42 22 / 0.12); }
/* Lettrine enluminée en tête des chapitres et des articles */
html[data-nv-theme='lore'] :is(.nv-lore-chapter, .nv-article__body, .nv-prose) > p:first-of-type::first-letter {
	font-family: 'Cinzel', 'Georgia', serif;
	font-weight: 700;
	font-size: 3.6em;
	float: left;
	line-height: 0.78;
	padding: 0.1em 0.14em 0 0;
	color: rgb(107 74 43);
	text-shadow: 2px 0 rgb(42 143 138 / 0.5), -2px 0 rgb(160 40 110 / 0.5);
}

/* Les titres de page (boutique, règlements, lore, gestion, patch notes) ont
   leur propre chasse serrée dans la base. Les ambiances qui composent leurs
   titres espacés et en capitales les reprennent avec elles. */
html:is([data-nv-theme='nouvelan'], [data-nv-theme='hiver'], [data-nv-theme='lore'], [data-nv-theme='palestine'])
	:is(.nv-lore-hero__title, .nv-lore-h2, .nv-gpage__title, .nv-gestion__title, .nv-offer__title, .nv-rulebook__title, .nv-pn-note__title) {
	letter-spacing: var(--nv-title-tracking);
	text-transform: var(--nv-title-transform);
	font-weight: var(--nv-title-weight);
}
html[data-nv-theme='hiver'] :is(.nv-lore-hero__title, .nv-gpage__title, .nv-offer__title, .nv-rulebook__title) { letter-spacing: 0.12em; }
html:is([data-nv-theme='valentin'], [data-nv-theme='noel'], [data-nv-theme='halloween'], [data-nv-theme='humanite'])
	:is(.nv-lore-hero__title, .nv-lore-h2, .nv-gpage__title, .nv-gestion__title, .nv-offer__title, .nv-rulebook__title, .nv-pn-note__title) {
	letter-spacing: var(--nv-title-tracking);
	font-weight: var(--nv-title-weight);
	font-style: var(--nv-title-style);
}

/* ============================================================================
   35. Administration
   Les pages /admin ont leur propre habillage, indépendant de l'ambiance
   choisie dans Admin → Thèmes : ViewMiddleware pose data-nv-theme="admin"
   sur <html> pour ces routes. Un outil, pas une vitrine : fond graphite,
   un seul accent, IBM Plex, aucun effet animé, et une barre latérale qui
   regroupe toutes les pages d'administration (templates/app.twig).
   ========================================================================= */

html[data-nv-theme='admin'] {
	--nv-violet: 91 140 255;     /* accent (primaire) */
	--nv-indigo: 61 106 214;
	--nv-cyan: 45 212 191;       /* secondaire */
	--nv-pink: 250 204 21;       /* avertissement */
	--nv-amber: 250 204 21;
	--nv-ink: #0b0d12;
	--nv-surface: 19 22 30;
	--nv-surface-2: 24 28 38;
	--nv-line: 255 255 255;
	--nv-text: #e8ecf3;
	--nv-muted: #8b95a7;
	--nv-radius: 12px;
	--nv-radius-sm: 8px;
	--nv-glow: 0 0 0 1px rgb(255 255 255 / 0.06), 0 12px 30px -18px rgb(0 0 0 / 0.8);
	--theme-bg-page-rgb: 11 13 18;
	--theme-primary: rgb(91 140 255); --bs-primary: rgb(91 140 255); --bs-primary-rgb: 91, 140, 255;
	--theme-secondary: rgb(45 212 191); --bs-secondary: rgb(45 212 191); --bs-secondary-rgb: 45, 212, 191;
	--theme-bg-page: #0b0d12; --theme-bg-primary: rgb(19 22 30); --theme-bg-secondary: rgb(15 17 24);
	--theme-gradient: linear-gradient(110deg, rgb(91 140 255), rgb(61 106 214));
	--theme-focus-box-shadow: 0 0 0 3px rgb(91 140 255 / 0.35);
	--bs-link-color: rgb(130 168 255); --bs-link-hover-color: #ffffff;
	--nv-title-gradient: linear-gradient(90deg, #ffffff, #ffffff);
	--nv-font-display: 'IBM Plex Sans', 'Inter', system-ui, sans-serif;
	--nv-font-body: 'IBM Plex Sans', 'Inter', system-ui, sans-serif;
	--nv-font-accent: 'IBM Plex Sans', system-ui, sans-serif;
	--nv-font-label: 'IBM Plex Mono', ui-monospace, Menlo, monospace;
	--nv-font-kicker: 'IBM Plex Mono', ui-monospace, Menlo, monospace;
	--nv-font-mono: 'IBM Plex Mono', ui-monospace, Menlo, monospace;
	--nv-body-features: normal;
	--nv-body-size: 0.95rem;
	--nv-body-leading: 1.5;
	--nv-body-tracking: 0;
	--nv-title-weight: 600;
	--nv-title-tracking: -0.02em;
	--nv-hero-weight: 600;
	--nv-hero-tracking: -0.02em;
	--nv-hero-leading: 1.1;
	--nv-nav-font: 'IBM Plex Sans', system-ui, sans-serif;
	--nv-nav-weight: 500;
	--nv-nav-size: 0.9rem;
	--nv-btn-font: 'IBM Plex Sans', system-ui, sans-serif;
	--nv-btn-weight: 600;
	--nv-btn-radius: 8px;
	--nv-btn-tracking: 0;
}

/* Rien d'animé : ni toile, ni curseur, ni particules, ni grain, ni révélations */
html[data-nv-theme='admin'] :is(.nv-web, .nv-fx, .nv-cursor-dot, .nv-cursor-halo, .nv-blob, .nv-grid, .nv-grain, .nv-hero-glow, .nv-progress) { display: none !important; }
html[data-nv-theme='admin'] .nv-bg { background: radial-gradient(90% 40% at 50% -10%, #151a26 0%, transparent 60%), var(--nv-ink); }
/* Curseur système en admin, même si le curseur personnalisé a été monté :
   body.nv-cursor-on * pose cursor:none !important, on le rend, puis on redonne
   la main aux éléments cliquables. */
html[data-nv-theme='admin'] body,
html[data-nv-theme='admin'] body.nv-cursor-on,
html[data-nv-theme='admin'] body.nv-cursor-on * { cursor: auto !important; }
html[data-nv-theme='admin'] body.nv-cursor-on :is(a, button, .btn, [role='button'], label, select, summary, .nav-link, .dropdown-item, .nv-theme-card, input[type='checkbox'], input[type='radio'], input[type='submit']) { cursor: pointer !important; }
html[data-nv-theme='admin'] body.nv-cursor-on :is(input:not([type='checkbox']):not([type='radio']):not([type='submit']), textarea) { cursor: text !important; }
html[data-nv-theme='admin'] .nv-reveal { opacity: 1; transform: none; transition: none; }
html[data-nv-theme='admin'] [data-aos] { opacity: 1 !important; transform: none !important; transition: none !important; }

/* Barre du haut : opaque, discrète, marquée « admin » */
html[data-nv-theme='admin'] .navbar.navbar-primary,
html[data-nv-theme='admin'] body.nv-scrolled .navbar.navbar-primary {
	background: rgb(11 13 18 / 0.94) !important;
	border-bottom-color: rgb(255 255 255 / 0.08);
	backdrop-filter: blur(10px);
	padding-block: 0.55rem;
}
html[data-nv-theme='admin'] .navbar-brand { background: none; -webkit-text-fill-color: currentColor; color: #fff; font-weight: 600; letter-spacing: -0.01em; }
html[data-nv-theme='admin'] .navbar-brand:hover { filter: none; }
html[data-nv-theme='admin'] .navbar-brand::after {
	content: '/ admin';
	margin-left: 0.4rem;
	font-family: var(--nv-font-mono);
	font-size: 0.72rem;
	letter-spacing: 0.08em;
	font-weight: 400;
	color: var(--nv-muted);
}
html[data-nv-theme='admin'] .navbar .nav-link::after { display: none; }
html[data-nv-theme='admin'] .navbar .nav-link.active { color: #fff !important; }

/* Cartes, boutons, titres : plats, nets, sans lumière */
html[data-nv-theme='admin'] .card {
	background: rgb(var(--nv-surface));
	border: 1px solid rgb(255 255 255 / 0.08);
	box-shadow: none;
	transform: none !important;
}
html[data-nv-theme='admin'] .card::before,
html[data-nv-theme='admin'] .card::after { display: none; }
html[data-nv-theme='admin'] .card:hover { box-shadow: none; border-color: rgb(255 255 255 / 0.14); }
html[data-nv-theme='admin'] .card-header { background: rgb(255 255 255 / 0.03); font-weight: 600; }
html[data-nv-theme='admin'] .hoverscale:hover { transform: none; }
html[data-nv-theme='admin'] .btn::before { display: none; }
html[data-nv-theme='admin'] .btn { padding: 0.45rem 1rem; font-size: 0.9rem; border-color: rgb(255 255 255 / 0.12); }
html[data-nv-theme='admin'] .btn:hover { transform: none; }
html[data-nv-theme='admin'] .btn-primary { background: rgb(var(--nv-violet)); box-shadow: none; }
html[data-nv-theme='admin'] .btn.btn-primary:hover { background: rgb(var(--nv-indigo)); box-shadow: none; background-position: 0 0; }
html[data-nv-theme='admin'] :is(.btn-dark, .btn-secondary, .btn-light, .btn-outline-primary) { background: rgb(255 255 255 / 0.05); }
html[data-nv-theme='admin'] :is(.btn-dark, .btn-secondary, .btn-light, .btn-outline-primary):hover { background: rgb(255 255 255 / 0.1); border-color: rgb(255 255 255 / 0.22); }
html[data-nv-theme='admin'] :is(.page-header h1, .alternatebg > .title, h1.title, .title:not(.title-main), .nv-panel__title) {
	color: #fff;
	-webkit-text-fill-color: #fff;
	background-image: none;
	text-shadow: none;
}
html[data-nv-theme='admin'] :is(.alternatebg > .title, .page-header h1)::after,
html[data-nv-theme='admin'] :is(.alternatebg > .title, .page-header h1)::before { display: none; }
html[data-nv-theme='admin'] .page-header { padding-block: 0 0.5rem; margin-bottom: 1rem; text-align: left; }
html[data-nv-theme='admin'] .page-header h1 { margin-inline: 0; font-size: 1.3rem; padding-bottom: 0; }
html[data-nv-theme='admin'] h1.title.mt-4 { margin-top: 0 !important; font-size: 1.3rem; }
html[data-nv-theme='admin'] .table > thead th {
	font-family: var(--nv-font-mono);
	font-size: 0.7rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--nv-muted);
}
html[data-nv-theme='admin'] :is(.form-control, .form-select) { background: rgb(0 0 0 / 0.25); border-color: rgb(255 255 255 / 0.1); }
html[data-nv-theme='admin'] .nv-panel { background: rgb(var(--nv-surface)); border: 1px solid rgb(255 255 255 / 0.08); box-shadow: none; }
html[data-nv-theme='admin'] .nv-theme-card { transition: border-color 0.3s; }
html[data-nv-theme='admin'] .nv-theme-card:hover { transform: none; }
html[data-nv-theme='admin'] .navbar-secondary { background: rgb(19 22 30 / 0.9) !important; border-radius: 10px; }
html[data-nv-theme='admin'] .alternatebg + .alternatebg::before { display: none; }
html[data-nv-theme='admin'] .footer { border-top: 1px solid rgb(255 255 255 / 0.07); }
html[data-nv-theme='admin'] .footer::before { display: none; }

/* ── Coque : barre latérale + volet principal ───────────────────────────── */
.nv-admin {
	display: grid;
	grid-template-columns: 252px minmax(0, 1fr);
	flex: 1 1 auto;
	min-height: 0;
}
.nv-admin__side {
	position: sticky;
	top: 56px;
	align-self: start;
	height: calc(100vh - 56px);
	overflow-y: auto;
	padding: 1.1rem 0.9rem 2rem;
	border-right: 1px solid rgb(255 255 255 / 0.07);
	background: rgb(13 15 21 / 0.85);
	backdrop-filter: blur(8px);
	scrollbar-width: thin;
}
.nv-admin__brand {
	display: flex;
	align-items: center;
	gap: 0.65rem;
	padding: 0.2rem 0.5rem 1rem;
	color: #fff;
	font-weight: 600;
	line-height: 1.15;
}
.nv-admin__brand > i {
	width: 34px;
	height: 34px;
	display: grid;
	place-items: center;
	border-radius: 9px;
	background: rgb(var(--nv-violet) / 0.16);
	color: rgb(var(--nv-violet));
	font-size: 0.95rem;
}
.nv-admin__brand small {
	display: block;
	margin-top: 0.15rem;
	font-family: var(--nv-font-mono);
	font-size: 0.64rem;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--nv-muted);
	font-weight: 400;
}
.nv-admin__search { position: relative; display: block; margin: 0 0.25rem 0.6rem; }
.nv-admin__search > i {
	position: absolute;
	left: 0.75rem;
	top: 50%;
	transform: translateY(-50%);
	color: var(--nv-muted);
	font-size: 0.78rem;
	pointer-events: none;
}
.nv-admin__search input {
	width: 100%;
	padding: 0.5rem 2.2rem 0.5rem 2.15rem;
	border-radius: 8px;
	border: 1px solid rgb(255 255 255 / 0.1);
	background: rgb(0 0 0 / 0.3);
	color: var(--nv-text);
	font-size: 0.86rem;
	font-family: var(--nv-font-body);
}
.nv-admin__search input::placeholder { color: rgb(255 255 255 / 0.35); }
.nv-admin__search input:focus { outline: none; border-color: rgb(var(--nv-violet) / 0.7); box-shadow: var(--theme-focus-box-shadow); }
.nv-admin__search kbd {
	position: absolute;
	right: 0.6rem;
	top: 50%;
	transform: translateY(-50%);
	font-family: var(--nv-font-mono);
	font-size: 0.62rem;
	color: var(--nv-muted);
	border: 1px solid rgb(255 255 255 / 0.14);
	border-radius: 4px;
	padding: 0.05em 0.4em;
	background: none;
}
.nv-admin__group { margin-top: 0.95rem; }
.nv-admin__group[hidden] { display: none; }
.nv-admin__group-label {
	display: block;
	padding: 0 0.6rem;
	margin-bottom: 0.3rem;
	font-family: var(--nv-font-mono);
	font-size: 0.62rem;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--nv-muted);
}
.nv-admin__link {
	position: relative;
	display: flex;
	align-items: center;
	gap: 0.6rem;
	padding: 0.46rem 0.6rem;
	border-radius: 8px;
	color: rgb(255 255 255 / 0.74);
	text-decoration: none;
	font-size: 0.88rem;
	font-weight: 500;
	transition: background 0.2s var(--nv-ease), color 0.2s var(--nv-ease);
}
.nv-admin__link[hidden] { display: none; }
.nv-admin__link > i { width: 1.15rem; text-align: center; color: var(--nv-muted); font-size: 0.84rem; transition: color 0.2s; }
.nv-admin__link:hover { background: rgb(255 255 255 / 0.05); color: #fff; }
.nv-admin__link:hover > i { color: rgb(var(--nv-violet)); }
.nv-admin__link.is-active { background: rgb(var(--nv-violet) / 0.14); color: #fff; }
.nv-admin__link.is-active > i { color: rgb(var(--nv-violet)); }
.nv-admin__link.is-active::before {
	content: '';
	position: absolute;
	left: -0.9rem;
	top: 0.5rem;
	bottom: 0.5rem;
	width: 3px;
	border-radius: 0 3px 3px 0;
	background: rgb(var(--nv-violet));
}
.nv-admin__badge {
	margin-left: auto;
	min-width: 1.35rem;
	padding: 0.1em 0.45em;
	border-radius: 999px;
	background: rgb(var(--nv-violet) / 0.2);
	color: #cfe0ff;
	font-family: var(--nv-font-mono);
	font-size: 0.66rem;
	text-align: center;
}
.nv-admin__empty { padding: 0.8rem 0.6rem; color: var(--nv-muted); font-size: 0.84rem; }
.nv-admin__empty[hidden] { display: none; }
.nv-admin__main { min-width: 0; padding: 1.4rem 1.7rem 3rem; }
.nv-admin__head {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 0.8rem 1.2rem;
	margin-bottom: 1.3rem;
	padding-bottom: 1rem;
	border-bottom: 1px solid rgb(255 255 255 / 0.07);
}
.nv-admin__crumbs {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	margin-bottom: 0.3rem;
	font-family: var(--nv-font-mono);
	font-size: 0.68rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--nv-muted);
}
.nv-admin__crumbs a { color: inherit; text-decoration: none; }
.nv-admin__crumbs a:hover { color: #fff; }
.nv-admin__crumbs i { font-size: 0.5rem; }
.nv-admin__title { margin: 0; font-size: 1.55rem; font-weight: 600; color: #fff; letter-spacing: -0.02em; }
.nv-admin__actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.nv-admin__actions .btn { font-size: 0.84rem; padding: 0.42rem 0.9rem; }
.nv-admin__toggle { display: none; }
/* Les pages Ember posent leur contenu dans .container : en admin, le volet fait la largeur */
.nv-admin__main .container { max-width: none; padding-inline: 0; }
@media (max-width: 991.98px) {
	.nv-admin { display: block; }
	.nv-admin__side {
		position: fixed;
		z-index: 1030;
		top: 56px;
		left: 0;
		width: min(86vw, 320px);
		transform: translateX(-102%);
		transition: transform 0.3s var(--nv-ease);
	}
	.nv-admin.is-open .nv-admin__side { transform: none; box-shadow: 0 0 0 100vmax rgb(0 0 0 / 0.55); }
	.nv-admin__main { padding: 1rem 1rem 2.5rem; }
	.nv-admin__toggle { display: inline-flex; }
}

/* ── Tableau de bord ─────────────────────────────────────────────────────── */
.nv-dash { display: grid; gap: 1.1rem; }
.nv-dash__tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(165px, 1fr)); gap: 0.8rem; }
.nv-tile {
	display: flex;
	flex-direction: column;
	gap: 0.35rem;
	padding: 0.95rem 1rem;
	border-radius: var(--nv-radius);
	background: rgb(var(--nv-surface));
	border: 1px solid rgb(255 255 255 / 0.08);
	color: inherit;
	text-decoration: none;
	transition: border-color 0.2s var(--nv-ease), background 0.2s var(--nv-ease);
}
a.nv-tile:hover { border-color: rgb(var(--nv-violet) / 0.6); background: rgb(var(--nv-surface-2)); color: inherit; }
.nv-tile__label { font-family: var(--nv-font-mono); font-size: 0.64rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--nv-muted); }
.nv-tile__value { font-size: 1.75rem; font-weight: 600; line-height: 1; color: #fff; font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }
.nv-tile__value small { margin-left: 0.25rem; font-size: 0.8rem; font-weight: 500; color: var(--nv-muted); letter-spacing: 0; }
.nv-tile__hint { font-size: 0.76rem; color: var(--nv-muted); }
.nv-tile--warn { border-color: rgb(250 204 21 / 0.45); }
.nv-tile--warn .nv-tile__value { color: #fde047; }
.nv-dash__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(330px, 1fr)); gap: 1rem; align-items: start; }
.nv-dash__panel { padding: 1rem 1.15rem 1.1rem; border-radius: var(--nv-radius); background: rgb(var(--nv-surface)); border: 1px solid rgb(255 255 255 / 0.08); }
.nv-dash__panel--wide { grid-column: 1 / -1; }
.nv-dash__panel h2 { display: flex; align-items: center; gap: 0.5rem; margin: 0 0 0.75rem; font-size: 0.95rem; font-weight: 600; color: #fff; letter-spacing: 0; }
.nv-dash__panel h2 > i { color: rgb(var(--nv-violet)); font-size: 0.85rem; }
.nv-dash__panel h2 a { margin-left: auto; font-size: 0.76rem; font-weight: 500; }
.nv-check { display: flex; align-items: flex-start; gap: 0.65rem; padding: 0.5rem 0; border-top: 1px solid rgb(255 255 255 / 0.06); font-size: 0.87rem; }
.nv-check:first-of-type { border-top: 0; }
.nv-check > i { margin-top: 0.2rem; font-size: 0.8rem; width: 1rem; text-align: center; }
.nv-check--ok > i { color: #34d399; }
.nv-check--warn > i { color: #fde047; }
.nv-check--bad > i { color: #f87171; }
.nv-check--info > i { color: rgb(var(--nv-violet)); }
.nv-check__text { flex: 1; min-width: 0; }
.nv-check__text small { display: block; color: var(--nv-muted); }
.nv-check > a { white-space: nowrap; font-size: 0.78rem; }
.nv-dash__list { list-style: none; margin: 0; padding: 0; }
.nv-dash__list li { display: flex; align-items: center; gap: 0.7rem; padding: 0.48rem 0; border-top: 1px solid rgb(255 255 255 / 0.06); font-size: 0.86rem; min-width: 0; }
.nv-dash__list li:first-child { border-top: 0; }
.nv-dash__list img { width: 26px; height: 26px; border-radius: 50%; object-fit: cover; flex: 0 0 auto; }
.nv-dash__list .nv-dash__what { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nv-dash__list .nv-dash__what b { font-weight: 600; color: #fff; }
.nv-dash__meta { margin-left: auto; font-family: var(--nv-font-mono); font-size: 0.68rem; color: var(--nv-muted); white-space: nowrap; }
.nv-dash__pill { display: inline-block; padding: 0.1em 0.5em; border-radius: 999px; font-family: var(--nv-font-mono); font-size: 0.64rem; letter-spacing: 0.06em; text-transform: uppercase; background: rgb(255 255 255 / 0.07); color: var(--nv-muted); }
.nv-dash__pill--created { background: rgb(52 211 153 / 0.15); color: #6ee7b7; }
.nv-dash__pill--updated { background: rgb(91 140 255 / 0.15); color: #bcd0ff; }
.nv-dash__pill--deleted { background: rgb(248 113 113 / 0.15); color: #fca5a5; }
.nv-dash__actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.nv-dash__actions .btn { font-size: 0.84rem; }
.nv-dash__empty { margin: 0; color: var(--nv-muted); font-size: 0.86rem; }

/* Pack réservé aux comptes Discord liés : étiquette sur la carte, ligne dans les conditions */
.nv-offer-card__cat--discord { margin-left: 0.4rem; color: #c7d2fe; background: rgb(88 101 242 / 0.22); border-color: rgb(88 101 242 / 0.45); }
.nv-switch { display: inline-flex; align-items: center; gap: 0.5rem; cursor: pointer; margin: 0; font-size: 0.9rem; }
.nv-switch input { margin: 0; }
.nv-conditions td, .nv-conditions th { vertical-align: middle; }

/* ═══════════════════════════════════════════════════════════════════════════
   36. ICÔNES — sprite SVG (public/img/vyx-icons.svg, fonction Twig nv_icon)
   Tracés fins et uniformes, à la place des pictogrammes Font Awesome dans les
   gabarits ; elles héritent de la couleur du texte comme une lettre.
   ═══════════════════════════════════════════════════════════════════════════ */
.nv-ic {
	display: inline-block;
	width: 1em;
	height: 1em;
	vertical-align: -0.14em;
	flex: 0 0 auto;
	stroke-width: 2;
	overflow: visible;
}
.nv-ic--fw { width: 1.25em; }
.nv-ic--xs { width: 0.75em; height: 0.75em; }
.nv-ic--sm { width: 0.875em; height: 0.875em; }
.nv-ic--lg { width: 1.25em; height: 1.25em; vertical-align: -0.2em; }
.nv-ic--2x { width: 2em; height: 2em; }
.nv-ic--3x { width: 3em; height: 3em; stroke-width: 1.6; }
.nv-ic--6x { width: 6em; height: 6em; stroke-width: 1.2; }
.nv-ic--spin { animation: nv-ic-spin 1.4s linear infinite; }
@keyframes nv-ic-spin { to { transform: rotate(360deg); } }
.btn .nv-ic, .nav-link .nv-ic, .dropdown-item .nv-ic, .nv-admin__link .nv-ic { vertical-align: -0.18em; }
.nv-panel__badge .nv-ic { width: 1.2em; height: 1.2em; }
.nv-banform__actions--links { display: flex; flex-wrap: wrap; gap: 0.6rem; }
.nv-gcard__mark.nv-ic { width: 1.4em; height: 1.4em; }

/* ═══════════════════════════════════════════════════════════════════════════
   37. PARCOURS DU JOUEUR — rejoindre le serveur, connexion, pied de page,
   retour en haut, message bref, achat sur téléphone, confort tactile.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Lien d'évitement (clavier) */
.nv-skip {
	position: fixed;
	top: 0.5rem;
	left: 0.5rem;
	z-index: 2000;
	padding: 0.5rem 0.9rem;
	border-radius: var(--nv-radius-sm);
	background: rgb(var(--nv-violet));
	color: #fff;
	font-weight: 600;
	transform: translateY(-160%);
	transition: transform 0.2s var(--nv-ease);
}
.nv-skip:focus { transform: none; color: #fff; text-decoration: none; }

/* Anneau de focus visible au clavier, partout */
:where(a, button, .btn, input, select, textarea, [tabindex]):focus-visible {
	outline: 2px solid rgb(var(--nv-cyan));
	outline-offset: 2px;
}

/* ── Bloc « Rejoindre » ─────────────────────────────────────────────────── */
.nv-join { display: flex; flex-direction: column; align-items: center; gap: 0.85rem; }
.nv-join--hero { margin-top: 2rem; }
.nv-join__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem; }
.nv-join__play { display: inline-flex; align-items: center; white-space: nowrap; }
.nv-join__ip,
.nv-join__discord {
	display: inline-flex;
	align-items: center;
	background: rgb(var(--nv-line) / 0.06);
	border: 1px solid rgb(var(--nv-line) / 0.16);
	color: var(--nv-text);
	white-space: nowrap;
}
.nv-join--hero .nv-join__ip,
.nv-join--hero .nv-join__discord { padding: 0.5rem 1.15rem; font-size: 1.05rem; }
.nv-join__ip:hover,
.nv-join__discord:hover { background: rgb(var(--nv-line) / 0.11); border-color: rgb(var(--nv-line) / 0.3); color: var(--nv-text); }
.nv-join__ip-text { font-family: ui-monospace, 'JetBrains Mono', Menlo, monospace; font-size: 0.92em; letter-spacing: -0.01em; }
.nv-join__ip.is-copied { border-color: rgb(34 197 94 / 0.6); color: #4ade80; }
.nv-join__status[hidden] { display: none; }
.nv-join__status {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	margin: 0;
	font-size: 0.9rem;
	color: var(--nv-muted);
}
.nv-join__status.is-up { color: var(--nv-text); }
.nv-join__dot {
	width: 8px;
	height: 8px;
	flex: 0 0 auto;
	border-radius: 50%;
	background: rgb(var(--nv-line) / 0.3);
}
.nv-join__dot.is-up { background: #22c55e; box-shadow: 0 0 0 4px rgb(34 197 94 / 0.18); }

.nv-join--compact { align-items: flex-start; gap: 0.6rem; }
.nv-join--compact .nv-join__actions { justify-content: flex-start; }
.nv-join--compact .btn { padding: 0.45rem 0.95rem; font-size: 0.9rem; }

/* Pastille « Jouer » de la barre du haut */
.nv-play-pill {
	align-items: center;
	gap: 0.5rem;
	margin-right: 0.75rem;
	padding: 0.34rem 0.85rem;
	border-radius: 999px;
	border: 1px solid rgb(var(--nv-line) / 0.16);
	background: rgb(var(--nv-line) / 0.05);
	color: var(--nv-text);
	font-size: 0.88rem;
	font-weight: 600;
	text-decoration: none;
	transition: background 0.25s var(--nv-ease), border-color 0.25s var(--nv-ease);
}
.nv-play-pill:hover { background: rgb(var(--nv-violet) / 0.2); border-color: rgb(var(--nv-violet) / 0.55); color: var(--nv-text); text-decoration: none; }
.nv-play-pill__count { font-family: ui-monospace, Menlo, monospace; font-size: 0.8rem; font-weight: 500; color: var(--nv-muted); }

/* Bouton de connexion */
.nv-signin-link { text-decoration: none; }
.nv-signin {
	display: inline-flex;
	align-items: center;
	padding: 0.4rem 0.95rem;
	background: rgb(var(--nv-line) / 0.06);
	border: 1px solid rgb(var(--nv-line) / 0.18);
	color: var(--nv-text);
	font-size: 0.9rem;
	white-space: nowrap;
}
.nv-signin-link:hover .nv-signin { background: rgb(var(--nv-violet) / 0.22); border-color: rgb(var(--nv-violet) / 0.55); color: var(--nv-text); }

/* Compte verrouillé : seuls les liens encore ouverts restent dans le menu */
.nv-nav--locked .navbar-nav > .nav-item:not(.nv-nav-keep) { display: none; }

/* ── Pied de page ───────────────────────────────────────────────────────── */
.nv-footer { padding-block: 3rem 2.2rem; }
.nv-footer__grid {
	position: relative;
	display: grid;
	grid-template-columns: minmax(0, 1.4fr) repeat(2, minmax(0, 1fr)) minmax(0, 1.5fr);
	gap: 2rem 2.5rem;
	text-align: left;
}
.nv-footer__logo {
	font-family: var(--nv-font-display);
	font-size: 1.5rem;
	font-weight: 700;
	color: var(--nv-text) !important;
	text-decoration: none;
}
.nv-footer__slogan { margin: 0.5rem 0 0; color: var(--nv-muted); font-size: 0.9rem; max-width: 30ch; white-space: normal; }
.nv-footer__col { display: flex; flex-direction: column; align-items: flex-start; gap: 0.5rem; }
.nv-footer__col a { font-size: 0.92rem; text-decoration: none; }
.nv-footer__title {
	margin-bottom: 0.25rem;
	font-size: 0.72rem;
	font-weight: 600;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--nv-muted);
}
.nv-footer .nv-join__status { font-size: 0.84rem; }

/* ── Retour en haut ─────────────────────────────────────────────────────── */
.nv-top {
	position: fixed;
	right: 1.1rem;
	bottom: 1.1rem;
	z-index: 900;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: 50%;
	border: 1px solid rgb(var(--nv-line) / 0.18);
	background: rgb(var(--nv-surface-2) / 0.92);
	color: var(--nv-text);
	opacity: 0;
	transform: translateY(12px);
	pointer-events: none;
	transition: opacity 0.25s var(--nv-ease), transform 0.25s var(--nv-ease), border-color 0.25s var(--nv-ease);
}
.nv-top.is-on { opacity: 1; transform: none; pointer-events: auto; }
.nv-top:hover { border-color: rgb(var(--nv-violet) / 0.6); }
html.nv-offer-open .nv-top { display: none; }

/* ── Message bref (copie de l'IP…) ──────────────────────────────────────── */
.nv-toast {
	position: fixed;
	left: 50%;
	bottom: 1.4rem;
	z-index: 2100;
	padding: 0.6rem 1.1rem;
	border-radius: 999px;
	border: 1px solid rgb(34 197 94 / 0.45);
	background: rgb(var(--nv-surface-2) / 0.96);
	color: var(--nv-text);
	font-size: 0.9rem;
	font-weight: 600;
	box-shadow: 0 14px 40px -18px rgb(0 0 0 / 0.8);
	opacity: 0;
	transform: translate(-50%, 14px);
	pointer-events: none;
	transition: opacity 0.22s var(--nv-ease), transform 0.22s var(--nv-ease);
}
.nv-toast.is-on { opacity: 1; transform: translate(-50%, 0); }

/* ── Page introuvable ───────────────────────────────────────────────────── */
.nv-error-links { margin-top: 2rem; }
.nv-error-links__row { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.5rem; margin-top: 0.6rem; }
.nv-error-links .nv-btn-ghost { margin-top: 0; }
.nv-error-links .nv-btn-ghost:hover { border-color: rgb(var(--nv-violet) / 0.55); color: var(--nv-text); }

/* ── Offre : la colonne de contenu défile vraiment ──────────────────────────
   La grille n'avait pas de hauteur de rangée : sur un écran de 768 px de haut,
   une longue description poussait le code promo et le bouton d'achat hors de la
   fenêtre, sans défilement possible. */
.nv-offer__dialog { grid-template-rows: minmax(0, 1fr); }
.nv-offer__media, .nv-offer__content { min-height: 0; }

/* ── Offre : barre d'achat collante (téléphone) ─────────────────────────── */
.nv-offer__bar { display: none; }

/* ── Liste des joueurs : nom au-dessus, rôle en dessous, jamais collés ──── */
.hoverscale .col-9 { flex-direction: column; align-items: flex-start; justify-content: center; }
.hoverscale .col-9 > h5, .hoverscale .col-9 > h6 { display: block; margin: 0; }
.hoverscale .col-9 > h6 { margin-top: 0.2rem; font-size: 0.88rem; }

@media (max-width: 991.98px) {
	/* Menu : cibles tactiles confortables, et il défile s'il dépasse l'écran */
	#navbar_primary_collapse { max-height: calc(100vh - 72px); overflow-y: auto; overscroll-behavior: contain; }
	#navbar_primary_collapse .nav-link { min-height: 44px; display: flex; align-items: center; }
	#navbar_primary_collapse .dropdown-item { min-height: 42px; display: flex; align-items: center; }
	.nv-nav-join { margin-top: 0.6rem; padding: 0.9rem 0.75rem 0.4rem; border-top: 1px solid rgb(var(--nv-line) / 0.1); }
	.navbar-toggler-custom { display: inline-flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; }

	.nv-footer__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.nv-footer__brand, .nv-footer__col--play { grid-column: 1 / -1; }
}

@media (max-width: 767.98px) {
	.nv-join--hero .nv-join__actions { flex-direction: column; align-items: stretch; width: min(100%, 320px); }
	.nv-join--hero .btn { justify-content: center; }

	/* Sur téléphone, c'est toute la fiche qui défile (visuel compris) : avant,
	   rien ne défilait et le bouton d'achat restait hors d'atteinte. */
	.nv-offer__dialog {
		display: flex;
		flex-direction: column;
		overflow-y: auto;
		overscroll-behavior: contain;
		-webkit-overflow-scrolling: touch;
	}
	.nv-offer__media { flex: 0 0 auto; }
	.nv-offer__content { flex: 0 0 auto; overflow: visible; }
	.nv-offer__close {
		position: sticky;
		top: 0.7rem;
		flex: 0 0 auto;
		align-self: flex-end;
		margin: 0.7rem 0.7rem -45px 0;
	}

	/* Barre d'achat : collée en bas de la fiche tant que le paiement est hors écran */
	.nv-offer__bar:not([hidden]) {
		position: sticky;
		bottom: 0;
		z-index: 4;
		order: 99;
		flex: 0 0 auto;
		display: flex;
		align-items: center;
		justify-content: space-between;
		gap: 0.75rem;
		padding: 0.7rem 1rem calc(0.7rem + env(safe-area-inset-bottom, 0px));
		background: rgb(var(--nv-surface) / 0.97);
		border-top: 1px solid rgb(var(--nv-line) / 0.12);
	}
	.nv-offer__bar-price { font-family: var(--nv-font-display); font-size: 1.2rem; }

	/* Description d'offre : les longues lignes décoratives ne débordent plus */
	.nv-offer__desc { overflow-x: hidden; overflow-wrap: anywhere; }

	.nv-top { right: 0.8rem; bottom: 0.8rem; }
}

@media (max-width: 575.98px) {
	.nv-footer__grid { grid-template-columns: 1fr; }

	/* Filtres des listes (joueurs, bans) : deux par ligne, les menus ne sont plus tronqués */
	form.mb-2 > .d-flex.flex-wrap > fieldset[class*='col-4'] { flex: 0 0 50%; max-width: 50%; }
	form.mb-2 > .d-flex.flex-wrap > fieldset:last-child { flex: 0 0 100%; max-width: 100%; }
	form.mb-2 > .d-flex.flex-wrap > fieldset:last-child .btn { width: 100%; justify-content: center; }
}
