/**
 * LE WIDGET — l'invitation posée dans un coin de la page.
 *
 * Une feuille à part, chargée seulement quand un widget est allumé : le
 * visiteur d'un site qui ne s'en sert pas ne télécharge rien.
 *
 * Tout se règle par trois variables — la couleur, et les deux distances au
 * bord. Le reste est fixe, et c'est volontaire : une bulle qui se règle en
 * quinze réglages est une bulle qu'on ne règle jamais.
 */

.bkl-lift {
	position: fixed;
	z-index: 99990;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 12px;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
	line-height: 1.45;
	--bkl-lift-paper: #fff;
	--bkl-lift-ink: #16233a;
	--bkl-lift-soft: #64748b;
	--bkl-lift-edge: rgba( 15, 30, 55, .1 );
}

.bkl-lift--right {
	right: var( --bkl-lift-x, 24px );
}

.bkl-lift--left {
	left: var( --bkl-lift-x, 24px );
	align-items: flex-start;
}

/* L'ANCRAGE VERTICAL, ET CE QU'IL RETOURNE.
 *
 * En bas, le rond est le point d'appui et la carte sort au-dessus de lui. En
 * haut, l'ordre s'inverse : une carte qui sortirait vers le haut depuis un rond
 * collé au plafond sortirait de l'écran. `column-reverse` retourne la pile
 * sans toucher au balisage — c'est la même règle que pour les dispositions. */

/* LA DISTANCE SAISIE EST LA DISTANCE OBTENUE. RIEN NE S'Y AJOUTE.
 *
 * Il y a eu ici un « plancher » et un « plafond » : deux variables qui, dans
 * l'écran de réglage seulement, écartaient l'épingle de la barre
 * d'enregistrement et de la barre d'outils de WordPress. L'intention était de
 * garder ces barres atteignables ; l'effet était qu'un aperçu déplaçait ce
 * qu'on lui demandait de montrer — « 0 px du bas » donnait soixante-huit
 * pixels. Elles ont été retirées, et rien ne doit les faire revenir : ce qui
 * doit rester atteignable se relève AU-DESSUS de l'épingle, dans la feuille
 * d'administration. */

.bkl-lift--bottom {
	bottom: var( --bkl-lift-y, 24px );
}

.bkl-lift--top {
	top: var( --bkl-lift-y, 24px );
	flex-direction: column-reverse;
}

.bkl-lift--dark {
	--bkl-lift-paper: #131b2b;
	--bkl-lift-ink: #eef2f8;
	--bkl-lift-soft: #9aa8bd;
	--bkl-lift-edge: rgba( 255, 255, 255, .12 );
}

/* ------------------------------------------------------------- Le lanceur. */

/* TROIS TAILLES, ET UNE SEULE VARIABLE.
 *
 * Le rond porte tout : sa hauteur, sa largeur, son icône. Sans réglage, une
 * bulle de 58 pixels écrase un site sobre et disparaît sur un site chargé —
 * et c'est le seul élément du widget que le visiteur voit en permanence. */

.bkl-lift--sm { --bkl-lift-ball: 46px; }
.bkl-lift--md { --bkl-lift-ball: 58px; }
.bkl-lift--lg { --bkl-lift-ball: 70px; }

.bkl-lift__ball {
	position: relative;
	width: var( --bkl-lift-ball, 58px );
	height: var( --bkl-lift-ball, 58px );
	flex: 0 0 var( --bkl-lift-ball, 58px );
	border: 0;
	border-radius: 50%;
	padding: 0;
	cursor: pointer;
	color: #fff;
	background: var( --bkl-lift-grad, var( --bkl-lift-tint, #1e3a5f ) );
	box-shadow: 0 10px 26px rgba( 12, 25, 45, .28 );
	display: flex;
	align-items: center;
	justify-content: center;
	transition: transform .18s ease, box-shadow .18s ease;
}

.bkl-lift__ball:hover {
	transform: translateY( -2px ) scale( 1.04 );
	box-shadow: 0 14px 30px rgba( 12, 25, 45, .34 );
}

/* L'ANNEAU NE BAT QUE TANT QUE PERSONNE N'A RÉPONDU.
 *
 * Une pastille qui pulse indéfiniment devient un clignotant : on cesse de la
 * voir, puis elle agace. Elle s'arrête dès que la carte s'est ouverte une
 * fois — le message est passé. */
.bkl-lift__ball::after {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: 50%;
	border: 2px solid var( --bkl-lift-tint, #1e3a5f );
	animation: bkl-lift-ring 2.6s ease-out infinite;
}

.bkl-lift.is-open .bkl-lift__ball::after,
.bkl-lift.is-done .bkl-lift__ball::after {
	display: none;
}

@keyframes bkl-lift-ring {
	0% { transform: scale( 1 ); opacity: .5; }
	70% { transform: scale( 1.55 ); opacity: 0; }
	100% { transform: scale( 1.55 ); opacity: 0; }
}

@media ( prefers-reduced-motion: reduce ) {
	.bkl-lift__ball::after { animation: none; opacity: 0; }
}

/* LA PASTILLE, ET LE REBOND.
 *
 * Un message qui attend se signale comme un message qui attend : un point
 * rouge et un chiffre. Le rebond ne dure que trois secousses — une pastille
 * qui saute en permanence n'est plus une notification, c'est une enseigne. */

.bkl-lift__badge {
	position: absolute;
	top: -2px;
	right: -2px;
	min-width: 20px;
	height: 20px;
	padding: 0 5px;
	box-sizing: border-box;
	border-radius: 10px;
	background: #ef4444;
	color: #fff;
	font-size: 11.5px;
	font-weight: 700;
	line-height: 20px;
	text-align: center;
	border: 2px solid #fff;
}

.bkl-lift--dark .bkl-lift__badge {
	border-color: #131b2b;
}

.bkl-lift.is-hailing .bkl-lift__ball {
	animation: bkl-lift-hop .55s ease 3;
}

@keyframes bkl-lift-hop {
	0%, 100% { transform: translateY( 0 ); }
	30% { transform: translateY( -7px ); }
	55% { transform: translateY( 0 ); }
	72% { transform: translateY( -3px ); }
}

/* ------------------------------------------------------------- LE MOT.
 *
 * Il sort à côté du rond, pas à la place : le rond reste le point d'appui, et
 * l'on doit pouvoir refuser le mot sans refuser le widget. */

.bkl-lift__peek {
	display: flex;
	align-items: flex-end;
	gap: 8px;
	max-width: 300px;
	position: relative;
	cursor: pointer;
}

.bkl-lift--left .bkl-lift__peek {
	flex-direction: row;
}

.bkl-lift__peekface {
	width: 34px;
	height: 34px;
	flex: 0 0 34px;
	border-radius: 50%;
}

.bkl-lift__peekface img {
	width: 34px;
	height: 34px;
	border-radius: 50%;
	object-fit: cover;
	display: block;
}

.bkl-lift__bubble {
	position: relative;
	padding: 11px 14px;
	border-radius: 16px 16px 4px 16px;
	background: var( --bkl-lift-paper );
	color: var( --bkl-lift-ink );
	border: 1px solid var( --bkl-lift-edge );
	box-shadow: 0 12px 26px rgba( 12, 25, 45, .16 );
	font-size: 13.5px;
	line-height: 1.4;
	animation: bkl-lift-in .24s cubic-bezier( .2, .9, .3, 1.1 ) both;
}

.bkl-lift--left .bkl-lift__bubble {
	border-radius: 16px 16px 16px 4px;
}

/* Les points de saisie : trois, décalés, et rien d'autre. */

.bkl-lift__dots {
	display: flex;
	gap: 4px;
	align-items: center;
	height: 8px;
	padding: 3px 4px;
}

.bkl-lift__dots i {
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: var( --bkl-lift-soft );
	animation: bkl-lift-say 1.2s ease-in-out infinite;
}

.bkl-lift__dots i:nth-child( 2 ) {
	animation-delay: .16s;
}

.bkl-lift__dots i:nth-child( 3 ) {
	animation-delay: .32s;
}

@keyframes bkl-lift-say {
	0%, 60%, 100% { opacity: .3; transform: translateY( 0 ); }
	30% { opacity: 1; transform: translateY( -3px ); }
}

.bkl-lift__peekx {
	position: absolute;
	top: -7px;
	right: -7px;
	width: 20px;
	height: 20px;
	border: 1px solid var( --bkl-lift-edge );
	border-radius: 50%;
	background: var( --bkl-lift-paper );
	color: var( --bkl-lift-soft );
	display: grid;
	place-items: center;
	line-height: 0;
	cursor: pointer;
	padding: 0;
	opacity: 0;
	transition: opacity .15s ease;
}

.bkl-lift__peek:hover .bkl-lift__peekx {
	opacity: 1;
}

@media ( prefers-reduced-motion: reduce ) {
	.bkl-lift__dots i,
	.bkl-lift.is-hailing .bkl-lift__ball {
		animation: none;
	}

	.bkl-lift__dots i {
		opacity: .6;
	}
}

/* ---------------------------------------------------------------- La carte. */

.bkl-lift__card {
	position: relative;
	/* LA LARGEUR SE MULTIPLIE, ELLE NE SE REMPLACE PAS.
	 *
	 * Un pourcentage appliqué à la taille naturelle laisse toutes les formes
	 * garder leurs proportions relatives — la bannière reste plus large que la
	 * bulle, la fenêtre centrale entre les deux — et le plafond `100vw - 32px`
	 * continue de protéger les téléphones quoi qu'on règle. */
	width: calc( 342px * var( --bkl-lift-cardw, 1 ) );
	max-width: calc( 100vw - 32px );
	box-sizing: border-box;
	/* LA HAUTEUR MULTIPLIE L'AIR, PAS LA BOÎTE.
	 *
	 * Une hauteur fixée en pixels donnerait un grand vide sous une carte de
	 * deux lignes et n'aurait aucun effet sur une carte de dix. Le réglage
	 * agit donc sur les marges intérieures : la carte grandit en respirant, et
	 * ce qu'elle contient reste collé à ce qui le précède. */
	padding: calc( 20px * var( --bkl-lift-cardh, 1 ) ) 20px calc( 18px * var( --bkl-lift-cardh, 1 ) );
	border-radius: 20px;
	background: var( --bkl-lift-paper );
	color: var( --bkl-lift-ink );
	border: 1px solid var( --bkl-lift-edge );
	box-shadow: 0 22px 48px rgba( 12, 25, 45, .22 );
	animation: bkl-lift-in .26s cubic-bezier( .2, .9, .3, 1.1 ) both;
}

/* LA CARTE PORTE TOUJOURS TOUTES SES PIÈCES : celles qu'on n'a pas remplies
 * sont marquées `hidden`. Sans cette règle, les blocs en `display:flex`
 * ignoreraient l'attribut et s'afficheraient vides — c'est le comportement
 * par défaut du navigateur, et il ne pardonne pas. */
.bkl-lift [hidden] {
	display: none !important;
}

@keyframes bkl-lift-in {
	from { opacity: 0; transform: translateY( 14px ) scale( .97 ); }
	to { opacity: 1; transform: none; }
}

@media ( prefers-reduced-motion: reduce ) {
	.bkl-lift__card { animation: none; }
}

.bkl-lift__x {
	position: absolute;
	top: 10px;
	right: 10px;
	width: 26px;
	height: 26px;
	border: 0;
	border-radius: 50%;
	background: transparent;
	color: var( --bkl-lift-soft );
	display: grid;
	place-items: center;
	padding: 0;
	line-height: 0;
	cursor: pointer;
	transition: background .15s ease, color .15s ease;
}

.bkl-lift__x:hover {
	background: var( --bkl-lift-edge );
	color: var( --bkl-lift-ink );
}

/* Qui parle. */

.bkl-lift__who {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0 0 12px;
	padding-right: 22px;
}

.bkl-lift__face {
	position: relative;
	width: 42px;
	height: 42px;
	flex: 0 0 42px;
	border-radius: 50%;
	overflow: visible;
}

.bkl-lift__face img {
	width: 42px;
	height: 42px;
	border-radius: 50%;
	object-fit: cover;
	display: block;
}

/* La pastille verte dit « quelqu'un répond », pas « je suis à mon bureau » :
 * elle accompagne une invitation à prendre rendez-vous, jamais une promesse
 * de présence immédiate. */
.bkl-lift__face.is-live::after {
	content: "";
	position: absolute;
	right: -1px;
	bottom: -1px;
	width: 12px;
	height: 12px;
	border-radius: 50%;
	background: #22c55e;
	border: 2px solid var( --bkl-lift-paper );
}

.bkl-lift__id {
	display: flex;
	flex-direction: column;
	min-width: 0;
}

.bkl-lift__id strong {
	font-size: 14px;
	font-weight: 650;
}

.bkl-lift__id span {
	font-size: 12px;
	color: var( --bkl-lift-soft );
}

/* Ce qu'elle dit. */

.bkl-lift__title {
	margin: 0 22px 6px 0;
	font-size: 16px;
	font-weight: 700;
	letter-spacing: -.01em;
}

.bkl-lift__text {
	margin: 0 0 14px;
	font-size: 13.5px;
	color: var( --bkl-lift-soft );
}

/* Le minuteur. */

.bkl-lift__rush {
	margin: 0 0 14px;
}

.bkl-lift__bar {
	display: block;
	height: 4px;
	border-radius: 4px;
	background: var( --bkl-lift-edge );
	overflow: hidden;
}

.bkl-lift__bar i {
	display: block;
	height: 100%;
	width: 100%;
	border-radius: 4px;
	background: var( --bkl-lift-cta, var( --bkl-lift-grad, var( --bkl-lift-tint, #1e3a5f ) ) );
	transition: width 1s linear;
}

.bkl-lift__rushrow {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 10px;
	margin-top: 6px;
	font-size: 12px;
	color: var( --bkl-lift-soft );
}

.bkl-lift__rushrow b {
	font-variant-numeric: tabular-nums;
	color: var( --bkl-lift-ink );
	font-size: 13px;
}

/* Les jours. */

.bkl-lift__days {
	display: flex;
	gap: 6px;
	margin: 0 0 14px;
}

.bkl-lift__day {
	flex: 1 1 0;
	min-width: 0;
	border: 1px solid var( --bkl-lift-edge );
	border-radius: 11px;
	background: transparent;
	color: var( --bkl-lift-ink );
	padding: 7px 2px 6px;
	cursor: pointer;
	text-align: center;
	transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.bkl-lift__day:hover {
	border-color: var( --bkl-lift-tint, #1e3a5f );
	transform: translateY( -1px );
}

.bkl-lift__day i {
	display: block;
	font-style: normal;
	font-size: 10px;
	text-transform: uppercase;
	letter-spacing: .04em;
	color: var( --bkl-lift-soft );
}

.bkl-lift__day b {
	display: block;
	font-size: 15px;
	font-weight: 650;
	font-variant-numeric: tabular-nums;
}

/* Les boutons. */

.bkl-lift__go {
	display: block;
	width: 100%;
	box-sizing: border-box;
	text-align: center;
	padding: 12px 14px;
	border-radius: 12px;
	background: var( --bkl-lift-cta, var( --bkl-lift-grad, var( --bkl-lift-tint, #1e3a5f ) ) );
	color: #fff;
	font-size: 14px;
	font-weight: 650;
	text-decoration: none;
	box-shadow: 0 6px 16px rgba( 12, 25, 45, .18 );
	transition: transform .15s ease, filter .15s ease;
}

.bkl-lift__go:hover {
	color: #fff;
	transform: translateY( -1px );
	filter: brightness( 1.06 );
}

.bkl-lift__go2 {
	display: block;
	margin-top: 9px;
	text-align: center;
	font-size: 12.5px;
	color: var( --bkl-lift-soft );
	text-decoration: none;
}

.bkl-lift__go2:hover {
	color: var( --bkl-lift-ink );
	text-decoration: underline;
}

/* ------------------------------------------------------ L’écran d’accès, par-dessus.
 *
 * Le calendrier s'ouvre SUR la page, pas à sa place : quelqu'un qui lisait un
 * article et qui referme la fenêtre doit retrouver son paragraphe, à sa ligne.
 * L'emmener sur une autre page pour un rendez-vous qu'il n'a pas encore pris
 * est le meilleur moyen de perdre les deux. */

.bkl-liftwall-on .bkl-lift {
	display: none;
}

/* ── LA FENÊTRE PASSE DEVANT TOUT, SANS EXCEPTION ──────────────────────────

   Cent mille paraissait beaucoup. Les bandeaux de consentement, les bulles de
   discussion et les barres d'annonce montent, eux, jusqu'au dernier rang que
   le navigateur accepte — et une icône de cookies restait posée par-dessus la
   fenêtre de réservation, à la vue du visiteur, cliquable pendant qu'il
   saisissait son adresse.

   La fenêtre prend donc le dernier rang elle aussi. À rang égal, c'est
   l'ordre d'écriture qui tranche : elle est posée en toute fin de page, donc
   après. Ce qui viserait quand même ce rang-là est effacé le temps de la
   fenêtre, puis remis exactement comme il était. */
.bkl-liftwall {
	position: fixed;
	inset: 0;
	z-index: 2147483647;
	background: rgba( 10, 18, 32, .62 );
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 24px;
	box-sizing: border-box;
	animation: bkl-liftwall-in .2s ease both;
}

@keyframes bkl-liftwall-in {
	from { opacity: 0; }
	to { opacity: 1; }
}

.bkl-liftwall__sheet {
	position: relative;
	width: min( 1080px, 100% );
	height: min( 760px, 100% );
	background: #fff;
	border-radius: 18px;
	overflow: hidden;
	box-shadow: 0 30px 70px rgba( 8, 16, 30, .45 );
}

.bkl-liftwall__sheet iframe {
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}

/* LA CROIX SE RANGE DANS L'ANGLE, ET S'EFFACE.
 *
 * Un disque noir de trente-quatre pixels posé à dix pixels du bord tirait
 * l'œil avant le formulaire : la première chose qu'on voyait de la fenêtre
 * était le moyen de la fermer. Elle perd un tiers de sa taille, l'essentiel
 * de son contraste, et se range dans le coin.
 *
 * ELLE EST CENTRÉE PAR LA MISE EN PAGE, PAS PAR LA POLICE. Le « × »
 * typographique se posait sur la ligne de base de la police du THÈME : sa
 * hauteur dans le bouton changeait d'un site à l'autre, et elle tombait
 * visiblement trop bas. Deux traits en SVG, une boîte en `grid`, et le centre
 * du bouton est le centre du dessin — partout. */
.bkl-liftwall__x {
	position: absolute;
	top: 4px;
	right: 4px;
	z-index: 2;
	display: grid;
	place-items: center;
	width: 22px;
	height: 22px;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: rgba( 12, 22, 40, .26 );
	color: #fff;
	line-height: 0;
	cursor: pointer;
	transition: background .15s ease;
}

.bkl-liftwall__x svg {
	display: block;
	width: 13px;
	height: 13px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2.4;
	stroke-linecap: round;
}

.bkl-liftwall__x:hover,
.bkl-liftwall__x:focus-visible {
	background: rgba( 12, 22, 40, .72 );
}

/* --------------------------------------------------------- Petits écrans.
 *
 * La carte prend la largeur, moins une gouttière : à 342px fixes elle
 * dépassait du téléphone, et un bouton qu'on ne voit qu'à moitié ne se clique
 * pas. */

@media ( max-width: 480px ) {
	.bkl-lift {
		left: 12px;
		right: 12px;
		align-items: flex-end;
	}

	.bkl-lift--left {
		align-items: flex-start;
	}

	.bkl-lift__card {
		width: 100%;
	}

	.bkl-liftwall {
		padding: 0;
	}

	.bkl-liftwall__sheet {
		width: 100%;
		height: 100%;
		border-radius: 0;
	}
}


/* L'icône suit la taille du rond : une petite bulle avec un gros pictogramme
   ressemble à une erreur d'affichage. */

.bkl-lift--sm .bkl-lift__ball svg { width: 21px; height: 21px; }
.bkl-lift--lg .bkl-lift__ball svg { width: 31px; height: 31px; }

/* ═════════════════════════════════════════════ LES QUATRE DISPOSITIONS.
 *
 * Le balisage est le MÊME dans les quatre cas — c'est ce qui permet à
 * l'aperçu de changer de forme sans qu'une ligne de PHP ne s'exécute, et
 * c'est ce qui garantit qu'aucune des quatre ne dérive des trois autres.
 * Ce qui change ici, c'est où la carte se pose et comment ses pièces se
 * rangent. Rien d'autre.
 *
 * Le lanceur reste dans son coin quelle que soit la forme : c'est le seul
 * élément permanent du widget, et le déplacer selon la disposition ferait
 * disparaître le moyen de rouvrir ce qu'on vient de fermer. */

/* Le voile n'existe que pour la fenêtre centrale, et seulement ouverte. */
.bkl-lift__veil {
	display: none;
}

/* ------------------------------------------------------- La bannière large.
 *
 * La carte devient une rangée : le visage, la phrase, le bouton. Elle tient
 * dans le coin comme la bulle, mais se lit d'un balayage horizontal — c'est
 * la forme d'un bandeau de cookies, en beaucoup plus aimable. */

.bkl-lift--slab .bkl-lift__card {
	width: min( calc( 620px * var( --bkl-lift-cardw, 1 ) ), calc( 100vw - 32px ) );
}

/* --------------------------------------------------------- Le bandeau bas.
 *
 * Il sort du flux du lanceur : pleine largeur, collé au bas de la fenêtre. Le
 * rembourrage latéral suit la largeur de l'écran de façon à ce que le texte
 * reste dans la même colonne que le contenu du site sur les grands écrans. */

.bkl-lift--bar .bkl-lift__card {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	width: 100%;
	max-width: none;
	border-radius: 0;
	border-width: 1px 0 0;
	padding: 16px max( 20px, calc( ( 100vw - 1120px ) / 2 ) );
	box-shadow: 0 -14px 34px rgba( 12, 25, 45, .16 );
}

/* Ancrée en haut, la barre se colle au plafond et son filet change de côté. */
.bkl-lift--bar.bkl-lift--top .bkl-lift__card {
	bottom: auto;
	top: 0;
	border-width: 0 0 1px;
	box-shadow: 0 14px 34px rgba( 12, 25, 45, .16 );
}

/* LE LANCEUR S'EFFACE DERRIÈRE CE QUI LE RECOUVRE.
 *
 * Un bandeau au bas de l'écran passe pile sur le rond, et une fenêtre centrale
 * le laisse flotter par-dessus son propre voile. Dans les deux cas il n'a plus
 * rien à ouvrir : il revient dès que la carte se referme. */
.bkl-lift--bar.is-open .bkl-lift__ball,
.bkl-lift--spot.is-open .bkl-lift__ball,
.bkl-lift--bar.is-open .bkl-lift__peek,
.bkl-lift--spot.is-open .bkl-lift__peek {
	display: none;
}

/* ---------------------------------------------------- La fenêtre centrale.
 *
 * Elle arrête la lecture, et c'est tout son propos. On ne l'adoucit pas : un
 * voile à moitié transparent qui laisserait croire qu'on peut continuer à lire
 * serait un mensonge de plus dans un geste déjà coûteux. */

/* ELLE N'A JAMAIS ÉTÉ CENTRÉE, ET PERSONNE NE L'AVAIT VU.
 *
 * Elle se centrait par `top: 50%; left: 50%` puis `translate(-50%, -50%)` —
 * la recette habituelle. Or la carte porte une animation d'entrée dont la
 * dernière image est `transform: none`, avec `animation-fill-mode: both` : dès
 * la fin de l'animation, ce `none` écrase la translation de centrage. La
 * fenêtre restait donc décalée d'une demi-largeur vers la droite et le bas, en
 * permanence, sur tous les sites.
 *
 * **Deux mécanismes qui écrivent la même propriété finissent toujours par se
 * marcher dessus.** On centre donc sans `transform` : `inset: 0` plus des
 * marges automatiques placent une boîte de largeur et de hauteur connues au
 * milieu de son conteneur, et laissent la propriété `transform` entièrement à
 * l'animation. */
.bkl-lift--spot .bkl-lift__card {
	position: fixed;
	inset: 0;
	margin: auto;
	height: max-content;
	max-height: calc( 100vh - 32px );
	overflow: auto;
	width: min( calc( 420px * var( --bkl-lift-cardw, 1 ) ), calc( 100vw - 32px ) );
	z-index: 1;
}

.bkl-lift--spot.is-open .bkl-lift__veil {
	display: block;
	position: fixed;
	inset: 0;
	background: rgba( 10, 18, 32, .58 );
	animation: bkl-liftwall-in .2s ease both;
}

/* ------------------------------------- Les rangées : bandeau et bannière.
 *
 * Les mêmes pièces, mises côte à côte. Le bloc de texte prend ce qui reste,
 * le bouton garde sa largeur, et tout retombe en colonne sous 720 pixels —
 * une rangée de quatre morceaux sur un téléphone n'est plus une rangée. */

.bkl-lift--bar .bkl-lift__card,
.bkl-lift--slab .bkl-lift__card {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 14px 20px;
}

.bkl-lift--bar .bkl-lift__who,
.bkl-lift--slab .bkl-lift__who,
.bkl-lift--bar .bkl-lift__say,
.bkl-lift--slab .bkl-lift__say,
.bkl-lift--bar .bkl-lift__rush,
.bkl-lift--slab .bkl-lift__rush,
.bkl-lift--bar .bkl-lift__days,
.bkl-lift--slab .bkl-lift__days {
	margin: 0;
	padding-right: 0;
}

.bkl-lift--bar .bkl-lift__say,
.bkl-lift--slab .bkl-lift__say {
	flex: 1 1 220px;
	min-width: 0;
}

.bkl-lift--bar .bkl-lift__title,
.bkl-lift--slab .bkl-lift__title {
	margin: 0;
}

.bkl-lift--bar .bkl-lift__text,
.bkl-lift--slab .bkl-lift__text {
	margin: 3px 0 0;
}

.bkl-lift--bar .bkl-lift__acts,
.bkl-lift--slab .bkl-lift__acts {
	flex: 0 0 auto;
	text-align: center;
}

.bkl-lift--bar .bkl-lift__go,
.bkl-lift--slab .bkl-lift__go {
	width: auto;
	padding: 12px 24px;
	white-space: nowrap;
}

.bkl-lift--bar .bkl-lift__days,
.bkl-lift--slab .bkl-lift__days {
	flex: 0 0 auto;
	width: 210px;
}

/* LA CROIX NE CHANGE JAMAIS DE PLACE — EN HAUT À DROITE, QUELLE QUE SOIT LA
 * FORME.
 *
 * Elle passait au bout de la rangée dans le bandeau et la bannière, « pour ne
 * pas couvrir le texte ». C'était résoudre un problème de mise en page au prix
 * d'un problème d'apprentissage : le geste pour fermer changeait d'endroit
 * selon une forme que le visiteur n'a pas choisie et ne connaît pas. **On
 * ferme une fenêtre en haut à droite depuis quarante ans** ; c'est un des
 * rares endroits où l'habitude vaut mieux que l'optimisation.
 *
 * Le texte, lui, s'écarte : la rangée réserve la place de la croix à droite. */
.bkl-lift--bar .bkl-lift__card,
.bkl-lift--slab .bkl-lift__card {
	padding-right: 46px;
}

.bkl-lift--bar .bkl-lift__rush,
.bkl-lift--slab .bkl-lift__rush {
	flex: 0 0 170px;
}

/* ══════════ « ÉTROIT » EST UNE CLASSE, PLUS UNE REQUÊTE DE MÉDIA.
 *
 * CE QUE ÇA RÉPARE. Ces règles répondaient à la largeur de la FENÊTRE. Dans le
 * cadre téléphone de l'administration, la fenêtre fait mille cinq cents pixels
 * — elles ne se déclenchaient donc jamais, et le bandeau s'y affichait en
 * version bureau, serré dans trois cent soixante-dix pixels. On ne pouvait pas
 * voir sur quoi on travaillait.
 *
 * POURQUOI PAS UNE COPIE POUR LE CADRE. Parce qu'une deuxième copie de ces
 * quarante lignes, c'est deux vérités : le jour où l'une se corrige, l'autre
 * ment. La règle du dossier depuis le début.
 *
 * POURQUOI PAS UNE REQUÊTE DE CONTENEUR. Il faudrait déclarer un conteneur sur
 * la page du client — `contain: inline-size` sur son `body` — pour une épingle
 * qui n'est pas censée toucher à la mise en page de son hôte. Trop cher pour ce
 * qu'on y gagne.
 *
 * Reste la classe : posée par le script sur la largeur RÉELLEMENT disponible —
 * la fenêtre sur le site, le cadre dans l'aperçu. Un seul jeu de règles, deux
 * endroits qui la déclenchent, et la même vérité aux deux endroits. */

.bkl-lift--narrow.bkl-lift--bar .bkl-lift__card,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__card {
	display: block;
}

.bkl-lift--narrow.bkl-lift--slab .bkl-lift__card {
	width: 342px;
	max-width: calc( 100vw - 32px );
}

.bkl-lift--narrow.bkl-lift--bar .bkl-lift__say,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__say,
.bkl-lift--narrow.bkl-lift--bar .bkl-lift__who,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__who,
.bkl-lift--narrow.bkl-lift--bar .bkl-lift__days,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__days,
.bkl-lift--narrow.bkl-lift--bar .bkl-lift__rush,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__rush {
	width: auto;
	margin: 0 0 12px;
}

.bkl-lift--narrow.bkl-lift--bar .bkl-lift__go,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__go {
	width: 100%;
}

/* LE BANDEAU SUR TÉLÉPHONE : IL RESPIRE, ET IL NE MANGE PAS L'ÉCRAN.
 *
 * Empilé sur cinq blocs, il occupait la moitié de la hauteur visible d'un
 * téléphone — et comme il est collé en bas, il recouvrait précisément la
 * zone du pouce. Trois corrections, toutes de mesure :
 *
 * — Les marges reviennent à celles d'une carte : la réserve de 46 px pour
 *   la croix n'a plus lieu d'être une fois les blocs empilés.
 * — Il ne peut pas dépasser les trois quarts de la fenêtre, et défile à
 *   l'intérieur au-delà. Un bandeau plus haut que l'écran est une fenêtre
 *   qui ne dit pas son nom.
 * — Les cinq jours passent en grille : quatre-vingt-dix pixels par jour en
 *   ligne, cela fait quatre cent cinquante — soit plus large que le
 *   téléphone, donc un débordement horizontal. */
.bkl-lift--narrow.bkl-lift--bar .bkl-lift__card {
	padding: 16px 16px 18px;
	max-height: 76vh;
	overflow: auto;
}

.bkl-lift--narrow.bkl-lift--bar .bkl-lift__x,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__x {
	top: 8px;
	right: 8px;
}

.bkl-lift--narrow.bkl-lift--bar .bkl-lift__say,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__say {
	padding-right: 30px;
}

.bkl-lift--narrow.bkl-lift--bar .bkl-lift__days,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__days {
	display: grid;
	grid-template-columns: repeat( 5, minmax( 0, 1fr ) );
	gap: 6px;
}

.bkl-lift--narrow.bkl-lift--bar .bkl-lift__rushrow,
.bkl-lift--narrow.bkl-lift--slab .bkl-lift__rushrow {
	gap: 10px;
}

/* ------------------------------------------- La quatrième taille, et l'image.
 *
 * Une taille de plus parce que 70 pixels disparaissent encore sur un site
 * chargé d'images. Et le pictogramme maison, qui suit la taille du rond comme
 * les tracés : une image à taille fixe dans un rond réglable finit par en
 * déborder ou par flotter au milieu. */

.bkl-lift--xl { --bkl-lift-ball: 84px; }
.bkl-lift--xl .bkl-lift__ball svg { width: 37px; height: 37px; }

.bkl-lift__pic {
	width: 56%;
	height: 56%;
	object-fit: contain;
	display: block;
}


/* ═══════════════════════════════════ DANS L'ÉCRAN DE RÉGLAGE.
 *
 * L'APERÇU N'EST PLUS UNE VIGNETTE, C'EST L'ÉPINGLE.
 *
 * Il a vécu dans un cadre de trois cent quatre-vingts pixels, à droite des
 * réglages. Le cadre était honnête — même balisage, même feuille — et il
 * mentait quand même, par sa taille : une carte de trois cent quarante pixels
 * y en faisait deux cents, un bandeau « pleine largeur » y tenait sur deux
 * cent trente, et les dispositions qui se jugent à leur EMPRISE sur la page ne
 * s'y jugeaient pas du tout.
 *
 * Elle est donc posée sur l'écran d'administration, `position: fixed`, à sa
 * vraie taille, dans son vrai coin, avec sa vraie forme. Il ne reste presque
 * rien à écrire ici, et c'est le but : une feuille « pour l'aperçu » est une
 * deuxième vérité, et le jour où l'une des deux se corrige, l'autre ment.
 *
 * Trois choses seulement, et chacune protège l'écran qui l'héberge. */

/* UN CRAN SOUS CE QUI PERMET DE SORTIR.
 *
 * La fenêtre centrale voile la page, celle-ci comprise. Le plancher et le
 * plafond écartent l'épingle des deux barres, et ce cran de moins la range
 * derrière tout ce qui, dans l'administration, sert à s'en aller. */
.bkl-lift--demo {
	z-index: 99989;
}

/* Le conteneur ne prend aucune place dans le flux : il n'existe que pour
   porter le repère du script et disparaître avec l'onglet. */
.bkl-liftlive {
	display: contents;
}

/* Les boutons ne mènent nulle part — le script les neutralise, le curseur le
   dit. Personne ne doit quitter des réglages non enregistrés en cliquant sur
   son propre aperçu. */
.bkl-lift--demo .bkl-lift__go,
.bkl-lift--demo .bkl-lift__go2,
.bkl-lift--demo .bkl-lift__day {
	cursor: default;
}

/* LE VOILE VA JUSQU'EN BAS, COMME CHEZ LE VISITEUR.
 *
 * Il s'arrêtait au « plancher » — les soixante-huit pixels dont l'aperçu
 * écartait l'épingle pour dégager la barre d'enregistrement. Ce plancher a
 * disparu le jour où les distances sont devenues exactes : ce qui doit rester
 * atteignable est désormais relevé AU-DESSUS du voile plutôt que soustrait de
 * la page. La fenêtre centrale assombrit donc tout l'écran, comme elle le fera
 * chez le visiteur, et le bouton « Enregistrer » reste lisible par-dessus. */

/* ══════════════════ LA COULEUR EST UNE IMAGE, SAUF LÀ OÙ ELLE NE PEUT PAS.
 *
 * `--bkl-lift-grad` porte le dégradé complet du rond, `--bkl-lift-cta` celui
 * du bouton large — tous deux calculés en PHP et en JavaScript, jamais
 * recomposés ici : une feuille de style qui assemblerait un `linear-gradient()`
 * à partir de cinq variables ne saurait pas quoi faire d'une valeur manquante.
 *
 * `--bkl-lift-tint` reste, en couleur PLEINE, pour tout ce qui ne peut pas
 * prendre d'image de fond : l'anneau qui bat (une bordure), le survol d'un
 * jour, un filet. C'est la première teinte, celle d'où part le dégradé — donc
 * la plus proche de ce que l'œil retient du bouton. */

/* ══════════════════════ UNE ÉPINGLE NE FLOTTE PAS AU-DESSUS DE SON PROPRE MUR.
 *
 * Le rond servait à ouvrir le calendrier ; le calendrier est ouvert ; le rond
 * n'a plus rien à ouvrir. L'y laisser, c'est poser un bouton de soixante-dix
 * pixels par-dessus les créneaux — exactement ce qu'on demandait au visiteur
 * de venir choisir.
 *
 * DEUX MURS, ET IL A FALLU LES DEUX. Celui que l'épingle ouvre elle-même
 * (`.bkl-liftwall`, qui pose déjà sa classe sur `<html>`), et celui du bloc
 * « ouvrir l’écran d’accès » posé dans la page (`.bkl-open__veil`), qui ne savait rien
 * de l'épingle. Une règle par écran d’accès aurait laissé le troisième passer ; celle-ci
 * dit la chose une fois : un voile plein écran est ouvert, donc l'épingle se
 * tait. */

html:has( .bkl-open__veil:not( [hidden] ) ) .bkl-lift {
	display: none;
}

/* ET LA MÊME RÈGLE DANS L'ADMINISTRATION, POUR LA MÊME RAISON.
 *
 * L'aperçu de l’écran d’accès s'ouvre ici en fenêtre modale, et l'épingle de
 * démonstration — posée en `position: fixed` sur cet écran — continuait de
 * flotter par-dessus, jusqu'à venir se poser sur le calendrier qu'on est en
 * train de regarder. C'est le même défaut que sur le site, à l'endroit où on
 * le remarque le plus : dans l'écran qui sert justement à juger le rendu. */
body:has( .bkl-modal:not( [hidden] ) ) .bkl-lift--demo {
	display: none;
}

/* ═══════ LE VOILE NE PREND JAMAIS LE POINTEUR DANS L'ADMINISTRATION.
 *
 * La fenêtre centrale pose un voile `fixed; inset: 0` par-dessus toute la
 * page — donc par-dessus l'écran de réglage qui l'héberge. Il assombrit ce
 * qu'il doit assombrir, et c'est très bien : on juge la disposition la plus
 * forte à ce qu'elle coûte. Mais s'il capte aussi la souris, le premier clic
 * sur n'importe quel champ est mangé par le voile, et l'on croit l'écran
 * bloqué.
 *
 * Sur le site, il garde le pointeur : c'est ainsi qu'on referme la fenêtre en
 * cliquant à côté. Ici, la carte a sa croix et le rond son clic. */
.bkl-lift--demo .bkl-lift__veil {
	pointer-events: none;
}

/* ═════════════════════ QUAND L'IMAGE EST LE BOUTON, LE DISQUE DISPARAÎT.
 *
 * Le pictogramme personnel posait une image DANS le rond ; celui-ci remplace
 * le rond. La différence n'est pas décorative : un logo rond, un badge, un
 * personnage détouré ont déjà leur forme, et les enfermer dans un disque bleu
 * revient à les mettre en médaillon — c'est-à-dire à en faire l'illustration
 * de quelque chose d'autre plutôt que la chose elle-même.
 *
 * On enlève donc tout ce qui faisait le disque : le fond, l'ombre, et
 * l'anneau qui bat. Ne reste que la taille, qui elle continue de valoir — un
 * bouton de quatre-vingt-quatre pixels reste un bouton de quatre-vingt-quatre
 * pixels, quelle que soit l'image qu'on y met.
 *
 * `contain` et non `cover` : on ne recadre pas l'image de quelqu'un d'autre. */

.bkl-lift--own .bkl-lift__ball {
	background: none;
	box-shadow: none;
	border-radius: 0;
}

.bkl-lift--own .bkl-lift__ball::after {
	display: none;
}

.bkl-lift__whole {
	width: 100%;
	height: 100%;
	object-fit: contain;
	display: block;
}

/* L'ombre portée suit le dessin de l'image plutôt que celui d'un carré : sans
   elle, un logo détouré paraît collé sur la page au lieu d'y flotter. */
.bkl-lift--own .bkl-lift__whole {
	filter: drop-shadow( 0 8px 18px rgba( 12, 25, 45, .3 ) );
}

.bkl-lift--own .bkl-lift__ball:hover .bkl-lift__whole {
	filter: drop-shadow( 0 12px 22px rgba( 12, 25, 45, .36 ) );
}

/* ══════════ SUR TÉLÉPHONE, LA FENÊTRE CENTRALE RESTE CENTRÉE.
 *
 * Elle devenait un tiroir montant du bas — mon idée, pas une demande, et le
 * client l'a vue comme un défaut : « la fenêtre n'est pas centrée au centre du
 * mobile ». Il a raison sur le principe. Une forme qui s'appelle « fenêtre
 * centrale » et qui ne se centre pas sur la moitié des écrans n'est plus la
 * même forme ; elle devient une seconde disposition que personne n'a choisie.
 *
 * Elle reste donc au milieu partout, et se borne : jamais plus haute que
 * l'écran moins deux marges, et elle défile à l'intérieur si son contenu
 * déborde. Le reproche d'interstitiel intrusif que Google adresse aux panneaux
 * mobiles demeure — c'est un arbitrage commercial, pas un défaut technique, et
 * il appartient à celui qui choisit la forme. */

.bkl-lift--phone.bkl-lift--spot .bkl-lift__card {
	max-height: calc( 100vh - 24px );
}

/* ══════════ LE VOILE DE LA FENÊTRE CENTRALE ATTEND QU'ON LE DEMANDE.
 *
 * Dans l'écran de réglage, l'aperçu suit le champ qu'on modifie : chaque
 * lettre tapée dans le titre rouvrait la scène, donc rallumait le voile, donc
 * éteignait l'écran qu'on est en train de remplir. On ne pouvait plus toucher
 * aux options tant que la fenêtre centrale était choisie.
 *
 * La carte reste montrée — c'est bien elle qu'on règle. Seul ce qui INTERROMPT
 * attend un geste : un clic sur le rond lève le voile, une frappe au clavier
 * ne le lève pas. Sur le site, rien ne change : `is-quiet` n'existe que dans
 * l'aperçu. */

.bkl-lift--demo.is-quiet .bkl-lift__veil {
	display: none;
}

/* ═══════════════ LA LIGNE DE RARETÉ — DISCRÈTE, PARCE QU'ELLE EST VRAIE.
 *
 * Un chiffre qui vient du calendrier n'a pas besoin d'être crié : c'est un
 * fait, et un fait se pose. Les phrases d'urgence qui hurlent en rouge sont
 * celles qui n'ont rien derrière elles — la nôtre en a, et se contente donc du
 * ton du reste de la carte, avec un point coloré pour l'ancrer.
 *
 * Elle se range juste au-dessus des jours parce qu'elle les qualifie : « il
 * reste trois créneaux », puis les jours où les prendre. */

/* ───────────────────────────── LA RARETÉ, ET SES DEUX FAÇONS DE SE DIRE.
 *
 * `--bkl-lift-left` n'est posée que si l'on a choisi une couleur : sans elle,
 * le repli est la teinte de l'épingle pour la pastille et le gris doux du
 * thème pour le texte — c'est-à-dire exactement ce que faisait l'ancienne
 * version. **Un réglage ajouté ne doit rien changer tant qu'on n'y touche
 * pas.**
 *
 * Deux formes, parce que la phrase n'a pas le même poids selon ce qu'elle
 * annonce. « Il reste 3 créneaux » se murmure ; « il reste 12 places sur 350 »
 * se montre. La discrète est le défaut : une carte qui crie partout ne crie
 * plus nulle part. */
.bkl-lift__left {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0 0 10px;
	font-size: var( --bkl-lift-leftsize, 12.5px );
	font-weight: 600;
	color: var( --bkl-lift-left, var( --bkl-lift-soft ) );
}

.bkl-lift__left::before {
	content: "";
	width: .55em;
	height: .55em;
	border-radius: 50%;
	flex: 0 0 .55em;
	background: var( --bkl-lift-left, var( --bkl-lift-tint, #1e3a5f ) );
}

/* LA PASTILLE A DEUX COULEURS, ET C'EST TOUT L'INTÉRÊT.
 *
 * Elles étaient une seule : le fond prenait la teinte et le texte était blanc,
 * en dur. Un fond blanc donnait donc du blanc sur blanc, sans aucun moyen d'en
 * sortir. Le fond suit `--bkl-lift-leftbg`, le texte `--bkl-lift-left` — et
 * faute de l'une ou de l'autre, chacune retombe sur son propre défaut plutôt
 * que sur celle de l'autre.
 *
 * Le point disparaît : il faisait doublon avec le fond qu'il annonçait. */
.bkl-lift__left--badge {
	align-self: flex-start;
	padding: .42em .85em;
	border-radius: 999px;
	background: var( --bkl-lift-leftbg, var( --bkl-lift-tint, #1e3a5f ) );
	color: var( --bkl-lift-left, #fff );
}

.bkl-lift__left--badge::before {
	display: none;
}

/* ─────────────────── LES CROIX SONT DES DESSINS, PAS DES CARACTÈRES.
 *
 * Un « × » typographique se pose sur la ligne de base de la police du THÈME :
 * sa hauteur dans le bouton dépendait donc d'une police que nous ne
 * choisissons pas, et elle tombait visiblement trop bas. Deux traits centrés
 * sur leur boîte tombent au même endroit sur tous les sites. */
.bkl-lift__cross {
	display: block;
	width: 12px;
	height: 12px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2.2;
	stroke-linecap: round;
}

.bkl-lift__peekx .bkl-lift__cross {
	width: 9px;
	height: 9px;
	stroke-width: 2.6;
}

/* ═══════════ CE QU'ELLE DEVIENT SUR UN TÉLÉPHONE
 *
 * Sur un écran de bureau, l'épingle occupe un vingtième de la surface. Sur un
 * téléphone tenu à la main, un huitième — et elle se pose exactement là où le
 * pouce remonte la page. Le réglage propose donc trois réponses, et ces deux
 * règles sont les deux qui ne valent pas « la même ».
 *
 * Le seuil est écrit ici, une seule fois, et il n'est pas réglable : un site
 * qui aurait besoin du sien a d'autres problèmes que cette bulle. */
@media ( max-width: 640px ) {
	/* Plus petite ET plus près du bord : rapetisser sans rapprocher laisse un
	   trou de vingt-quatre pixels qui, sur trois cent soixante de large, se
	   voit plus que la bulle elle-même. */
	.bkl-lift--phsmall {
		--bkl-lift-ball: 44px;
		--bkl-lift-x: 14px;
		--bkl-lift-y: 14px;
	}

	.bkl-lift--phsmall .bkl-lift__ball svg {
		width: 20px;
		height: 20px;
	}

	/* `display: none` et non `visibility` : la carte, le compte à rebours et
	   le salut ne doivent pas seulement être invisibles, ils ne doivent pas
	   travailler. Une animation qu'on ne voit pas consomme la même batterie. */
	.bkl-lift--phoff {
		display: none !important;
	}
}
