/* Gestion de Tournois — écran public de gestion des joueurs et des tables */

.gt-management, .gt-round-select, .gt-access-denied, .gt-results {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	max-width: 1400px;
	margin: 0 auto;
}

/* v0.1.0 (build 337) : bannière « structure de paiement/écran manquant » —
 * à la demande de l'utilisateur, sur TOUTE LA LARGEUR DE LA PAGE (pas
 * seulement celle de `.gt-management`, plafonnée à 1400px ci-dessus) —
 * technique de "full-bleed" classique (`width: 100vw` + décalage par
 * `left`/`margin-left` de moitié de la largeur de l'écran) pour sortir du
 * conteneur centré quel que soit le thème du site. Voir renderSetupAlert()
 * dans public-management.js et GT_Management::dismissSetupAlert().
 *
 * v0.1.0 (build 338) : deux variantes — à la demande de l'utilisateur,
 * l'écran manquant est OBLIGATOIRE (`--critical`, rouge, jamais de croix),
 * contrairement à la structure de paiement, restée facultative (`--warning`,
 * ambre, fermeture définitive possible). Les deux peuvent s'empiler
 * (chacune garde son propre "full-bleed"). */
.gt-setup-alert {
	position: relative;
	left: 50%;
	width: 100vw;
	margin-left: -50vw;
	margin-bottom: 16px;
	padding: 12px 20px;
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 16px;
	font-size: 14px;
	font-weight: 600;
	text-align: center;
}

.gt-setup-alert--warning {
	background: #fff3cd;
	color: #664d03;
	border-top: 1px solid #ffe69c;
	border-bottom: 1px solid #ffe69c;
}

.gt-setup-alert--critical {
	background: #f8d7da;
	color: #58151c;
	border-top: 1px solid #f1aeb5;
	border-bottom: 1px solid #f1aeb5;
}

.gt-setup-alert-close {
	flex: 0 0 auto;
	border: none;
	background: transparent;
	color: inherit;
	font-size: 16px;
	font-weight: 700;
	line-height: 1;
	cursor: pointer;
	padding: 4px 6px;
	border-radius: 4px;
}

.gt-setup-alert--warning .gt-setup-alert-close:hover {
	background: rgba( 102, 77, 3, 0.12 );
}

/* v0.1.0 (build 494) : lien « Corriger » de la bannière « écran principal
   sans écran mobile » (voir renderSetupAlert() dans public-management.js) —
   distinct visuellement du simple texte d'alerte, pour signaler une action
   possible plutôt qu'un simple constat. */
.gt-setup-alert-link {
	flex: 0 0 auto;
	color: inherit;
	font-weight: 700;
	text-decoration: underline;
	white-space: nowrap;
}

.gt-setup-alert-link:hover,
.gt-setup-alert-link:focus {
	color: inherit;
	text-decoration: none;
}

/* =====================================================================
 * v0.1.0 (build 603) : refonte visuelle de l'écran de sélection de manche
 * (voir html-gt-public-round-select.php).
 *
 * Deux langages visuels distincts, pour que l'état d'un tournoi se lise
 * d'un coup d'œil :
 *   - « EN DIRECT » (tournoi déjà piloté) = tuile « table de finale sous
 *     les projecteurs » : feutre vert sombre, halo chaud, liseré néon +
 *     grand pictogramme de format en filigrane, ligne d'état facon horloge
 *     de tournoi, bouton « Piloter » en jeton doré. C'est le SEUL bloc
 *     sombre de la page — il doit sauter aux yeux.
 *   - « À PILOTER » (manche disponible) = plaque de table pliée facon
 *     carton de siège : papier mat clair, bandeau supérieur avec le
 *     pictogramme de format dans une pastille colorée, la date en chiffres
 *     à chasse fixe, le nom de la manche en vedette dessous.
 * Format : MTT = indigo + entonnoir (le tableau se resserre vers la table
 * finale) ; SnG = ambre + anneau de sièges avec bouton donneur. La couleur
 * donne la lecture rapide, le pictogramme confirme.
 *
 * Les classes de câblage JS sont conservées telles quelles :
 * `.gt-active-round-list` / `.gt-active-round-item` /
 * `.gt-close-active-round-btn` / `.gt-active-round-close-confirm-btn` /
 * `.gt-active-round-close-cancel-btn` / `.gt-active-round-close-error`
 * (double confirmation inline de « Fermer », voir initRoundSelect() dans
 * public-management.js).
 * ===================================================================== */

.gt-round-select {
	--gt-rs-mtt: #4f46e5;
	--gt-rs-mtt-ink: #3730a3;
	--gt-rs-sng: #d97706;
	--gt-rs-sng-ink: #b45309;
	--gt-rs-paper: #fbfaf7;
	--gt-rs-paper-fold: #f1eee6;
	--gt-rs-line: #e4dfd4;
	--gt-rs-ink: #1b1a17;
	--gt-rs-muted: #8a8578;
	padding: 4px 0 8px;
}

.gt-round-select .gt-rs-section {
	margin-bottom: 34px;
}

.gt-round-select .gt-rs-section:last-of-type {
	margin-bottom: 0;
}

/* Sur-titre de section — monospace espacé + filet, façon habillage
 * d'antenne plutôt que simple <h2>. */
.gt-rs-eyebrow {
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 0 0 16px;
	font-family: ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace;
	font-size: 12px;
	font-weight: 600;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: var(--gt-rs-muted);
}

.gt-rs-eyebrow::after {
	content: "";
	flex: 1;
	height: 1px;
	background: var(--gt-rs-line);
}

/* Pastille verte « en direct » qui pulse (réutilisée dans la ligne d'état
 * des tuiles). */
.gt-rs-live-dot {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: #22c55e;
	box-shadow: 0 0 0 0 rgba( 34, 197, 94, 0.5 );
	animation: gt-rs-pulse 2s infinite;
	flex: 0 0 auto;
}

@keyframes gt-rs-pulse {
	0%   { box-shadow: 0 0 0 0 rgba( 34, 197, 94, 0.5 ); }
	70%  { box-shadow: 0 0 0 9px rgba( 34, 197, 94, 0 ); }
	100% { box-shadow: 0 0 0 0 rgba( 34, 197, 94, 0 ); }
}

/* =========================================================
 * Tuiles « EN DIRECT » — tournois en cours de pilotage
 * ========================================================= */

.gt-rs-feature-grid {
	display: grid;
	grid-template-columns: repeat( auto-fit, minmax( 420px, 1fr ) );
	gap: 18px;
}

.gt-rs-feature {
	--fmt-edge: #6366f1;
	position: relative;
	overflow: hidden;
	box-sizing: border-box;
	padding: 22px 24px 22px 28px;
	border-radius: 14px;
	border: 1px solid rgba( 244, 241, 234, 0.14 );
	background:
		radial-gradient( 135% 95% at 10% -10%, rgba( 255, 240, 205, 0.16 ), transparent 52% ),
		linear-gradient( 160deg, #164836 0%, #0e3627 45%, #08201a 100% );
	background-color: #0c2a20;
	color: #e9ece6;
	box-shadow:
		0 26px 55px -26px rgba( 0, 0, 0, 0.62 ),
		inset 0 1px 0 rgba( 255, 255, 255, 0.06 );
}

.gt-rs-feature.is-mtt { --fmt-edge: #6d67f2; }
.gt-rs-feature.is-sng { --fmt-edge: #f0a54a; }

/* Liseré néon vertical, couleur de format. */
.gt-rs-feature::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	width: 4px;
	background: var( --fmt-edge );
	box-shadow: 0 0 18px var( --fmt-edge );
}

/* Grand pictogramme de format en filigrane, coin haut-droit. */
.gt-rs-feature__wm {
	position: absolute;
	top: -30px;
	right: -26px;
	width: 205px;
	height: 205px;
	color: rgba( 244, 241, 234, 0.05 );
	pointer-events: none;
}

.gt-rs-feature__wm svg {
	width: 100%;
	height: 100%;
	display: block;
}

/* Ligne d'état façon horloge de tournoi. */
.gt-rs-feature__status {
	display: flex;
	align-items: center;
	gap: 9px;
	margin: 0;
	font-family: ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace;
	font-size: 12px;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: #a9d2bd;
}

.gt-rs-feature__fmt {
	color: var( --fmt-edge );
	font-weight: 700;
}

.gt-rs-feature__tournament {
	margin: 15px 0 0;
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: #7ba894;
}

.gt-rs-feature__name {
	margin: 4px 0 0;
	font-size: 26px;
	line-height: 1.15;
	font-weight: 800;
	letter-spacing: -0.02em;
	color: #fff;
}

.gt-rs-feature__meta {
	margin: 7px 0 0;
	font-size: 12.5px;
	color: #93b4a5;
}

.gt-rs-feature__foot {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	margin-top: 20px;
}

/* Bouton « Piloter » = jeton doré ; son ::after étire la zone cliquable à
 * toute la tuile (le bloc « Fermer » repasse au-dessus via z-index). */
.gt-rs-feature .gt-rs-feature__pilot {
	background: #e0a63c;
	border-color: #e0a63c;
	color: #241a06;
	font-weight: 800;
	letter-spacing: 0.02em;
	padding: 10px 22px;
}

.gt-rs-feature .gt-rs-feature__pilot:hover {
	background: #eab54f;
	border-color: #eab54f;
	color: #241a06;
}

.gt-rs-feature__pilot::after {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: 14px;
}

.gt-rs-feature .gt-active-round-actions {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: 4px;
	flex: 0 0 auto;
}

.gt-rs-feature .gt-rs-ghost-btn {
	background: transparent;
	border-color: rgba( 244, 241, 234, 0.32 );
	color: #e7d9d9;
	font-size: 13px;
	padding: 6px 12px;
}

.gt-rs-feature .gt-rs-ghost-btn:hover {
	background: rgba( 214, 54, 56, 0.18 );
	border-color: #e88;
	color: #ffdede;
}

.gt-rs-feature .gt-active-round-close-cancel-btn {
	font-size: 13px;
	color: #d9c7c7;
}

.gt-rs-feature .gt-active-round-close-error {
	position: relative;
	z-index: 1;
	margin: 10px 0 0;
	color: #ffb4b4;
}

/* =========================================================
 * Plaques « À PILOTER » — manches disponibles
 * ========================================================= */

.gt-rs-plaque-grid {
	display: grid;
	/* build 614 : au plus 4 colonnes en grand écran (les tuiles devenaient
	   trop étroites — nom de manche tassé — et le bouton « ⚙️ Paramètres »
	   chevauchait le libellé « Piloter cette manche »). Reste responsive :
	   chaque colonne fait au moins 300px OU un quart de la largeur (moins
	   les 3 gouttières), la plus grande des deux. */
	grid-template-columns: repeat( auto-fill, minmax( max( 300px, calc( ( 100% - 3 * 16px ) / 4 ) ), 1fr ) );
	gap: 16px;
}

/* build 614 : enveloppe d'une tuile — porte le bouton « ⚙️ Paramètres »
   HORS du <a> (pas d'interactif imbriqué). La tuile <a> remplit l'enveloppe. */
.gt-rs-plaque-wrap {
	position: relative;
	display: flex;
}
.gt-rs-plaque-wrap > .gt-rs-plaque {
	flex: 1 1 auto;
}
.gt-rs-plaque__settings {
	position: absolute;
	/* build 614 : aligné sur la ligne du libellé « Piloter cette manche »
	   (CTA à gauche, ce bouton à droite, même ligne). */
	bottom: 10px;
	right: 12px;
	z-index: 2;
	padding: 4px 9px;
	font-size: 11.5px;
	line-height: 1.4;
	background: rgba( 255, 255, 255, 0.92 );
	border: 1px solid var( --gt-rs-line );
	color: var( --gt-rs-muted );
	border-radius: 6px;
	cursor: pointer;
}
.gt-rs-plaque__settings:hover,
.gt-rs-plaque__settings:focus-visible {
	background: #fff;
	color: var( --gt-rs-ink );
	border-color: #c9c2b2;
	outline: none;
}

.gt-rs-plaque {
	--fmt: var( --gt-rs-mtt );
	--fmt-ink: var( --gt-rs-mtt-ink );
	display: flex;
	flex-direction: column;
	box-sizing: border-box;
	border: 1px solid var( --gt-rs-line );
	border-radius: 11px;
	background: var( --gt-rs-paper );
	box-shadow: 0 1px 0 var( --gt-rs-line ), 0 10px 22px -14px rgba( 30, 25, 15, 0.28 );
	text-decoration: none;
	color: var( --gt-rs-ink );
	font-family: inherit;
	text-align: left;
	transition: transform 0.16s ease, box-shadow 0.16s ease, border-color 0.16s ease;
}

/* build 614 : certains thèmes soulignent tout <a> du contenu ; une tuile
   étant un unique <a>, le trait déteignait sur ses 3 lignes de texte. On
   neutralise le soulignement sur la tuile et ses libellés — le seul repère
   visuel de lien reste le trait sous « Piloter cette manche » (::after). */
.gt-round-select a.gt-rs-plaque,
.gt-round-select a.gt-rs-plaque:hover,
.gt-round-select a.gt-rs-plaque:focus,
.gt-round-select a.gt-rs-plaque:focus-visible,
.gt-round-select a.gt-rs-plaque span { text-decoration: none; }

.gt-rs-plaque.is-mtt { --fmt: var( --gt-rs-mtt ); --fmt-ink: var( --gt-rs-mtt-ink ); }
.gt-rs-plaque.is-sng { --fmt: var( --gt-rs-sng ); --fmt-ink: var( --gt-rs-sng-ink ); }

/* Bandeau supérieur = le « pli » du carton de siège. */
.gt-rs-plaque__fold {
	display: flex;
	align-items: center;
	gap: 9px;
	padding: 9px 12px;
	background: var( --gt-rs-paper-fold );
	border-bottom: 1px solid var( --gt-rs-line );
	border-radius: 10px 10px 0 0;
}

.gt-rs-plaque__glyph {
	display: grid;
	place-items: center;
	width: 26px;
	height: 26px;
	border-radius: 7px;
	background: var( --fmt );
	color: #fff;
	flex: 0 0 auto;
}

.gt-rs-plaque__glyph svg {
	width: 17px;
	height: 17px;
	display: block;
}

.gt-rs-plaque__fmt {
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var( --fmt-ink );
}

.gt-rs-plaque__date {
	margin-left: auto;
	font-family: ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace;
	font-size: 11px;
	color: var( --gt-rs-muted );
}

.gt-rs-plaque__body {
	display: flex;
	flex-direction: column;
	padding: 13px 14px 14px;
}

/* build 614 : le libellé « Piloter cette manche » (CTA, à gauche) et le
   bouton « ⚙️ Paramètres » (à droite, en absolu sur l'enveloppe) partagent
   la même ligne — on réserve juste à droite du CTA la place du bouton. */
.gt-rs-plaque-wrap .gt-rs-plaque__cta {
	max-width: calc( 100% - 130px );
}

.gt-rs-plaque__tournament {
	font-size: 10.5px;
	font-weight: 700;
	letter-spacing: 0.13em;
	text-transform: uppercase;
	color: var( --gt-rs-muted );
}

.gt-rs-plaque__name {
	margin-top: 3px;
	font-size: 18px;
	line-height: 1.25;
	font-weight: 700;
	letter-spacing: -0.01em;
	color: var( --gt-rs-ink );
}

.gt-rs-plaque__cta {
	position: relative;
	align-self: flex-start;
	margin-top: 12px;
	padding-bottom: 3px;
	font-size: 12.5px;
	font-weight: 600;
	color: var( --gt-rs-muted );
	transition: color 0.16s ease;
}

/* Trait de couleur de format sous le libellé — court au repos (~2 lettres,
   seul repère de lien de la tuile depuis le build 614), plein au survol. */
.gt-rs-plaque__cta::after {
	content: "";
	position: absolute;
	left: 0;
	right: auto;
	width: 16px;
	bottom: 0;
	height: 2px;
	background: var( --fmt );
	transition: width 0.2s ease;
}

.gt-rs-plaque:hover,
.gt-rs-plaque:focus-visible {
	transform: translateY( -3px );
	box-shadow: 0 2px 0 var( --gt-rs-line ), 0 18px 30px -16px rgba( 30, 25, 15, 0.34 );
	border-color: #d8d1c2;
	outline: none;
}

.gt-rs-plaque:hover .gt-rs-plaque__cta,
.gt-rs-plaque:focus-visible .gt-rs-plaque__cta {
	color: var( --fmt-ink );
}

.gt-rs-plaque:hover .gt-rs-plaque__cta::after,
.gt-rs-plaque:focus-visible .gt-rs-plaque__cta::after {
	width: 100%;
}

/* Plaque « + Créer une nouvelle manche ». */
.gt-rs-plaque--create {
	align-items: center;
	justify-content: center;
	gap: 8px;
	min-height: 148px;
	padding: 18px;
	background: transparent;
	border-style: dashed;
	box-shadow: none;
	color: var( --gt-rs-mtt-ink );
	cursor: pointer;
	text-align: center;
}

.gt-rs-plaque--create:hover,
.gt-rs-plaque--create:focus-visible {
	transform: translateY( -3px );
	background: #f4f2fb;
	border-color: var( --gt-rs-mtt );
	box-shadow: none;
	outline: none;
}

.gt-rs-plaque__plus {
	font-size: 30px;
	font-weight: 300;
	line-height: 1;
}

.gt-rs-plaque__createlabel {
	font-size: 13px;
	font-weight: 600;
}

/* État « aucune manche » et note de redirection. */
.gt-rs-empty {
	margin: 0 0 14px;
	color: #646970;
}

.gt-rs-redirect-note {
	margin-top: 14px;
	font-family: ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace;
	font-size: 12px;
	color: var( --gt-rs-muted );
}

.gt-rs-activation-error {
	margin-bottom: 16px;
}

@media ( prefers-reduced-motion: reduce ) {
	.gt-rs-live-dot { animation: none; }
	.gt-rs-plaque,
	.gt-rs-plaque--create { transition: none; }
	.gt-rs-plaque:hover,
	.gt-rs-plaque:focus-visible,
	.gt-rs-plaque--create:hover,
	.gt-rs-plaque--create:focus-visible { transform: none; }
}

@media ( max-width: 600px ) {
	.gt-rs-feature-grid { grid-template-columns: 1fr; }
	.gt-rs-feature { padding: 20px 18px 20px 22px; }
	.gt-rs-feature__name { font-size: 22px; }
}

/* v0.1.0 (build 180, restylé au build 603) : bandeau affiché quand ce staff
 * pilotait un tournoi fermé entre-temps par un autre membre du staff — voir
 * html-gt-public-round-select.php et le paramètre `gt_kicked`. */
.gt-round-kicked-notice {
	margin-bottom: 20px;
	padding: 12px 16px;
	background: #fcf0f0;
	border: 1px solid #f3c6c6;
	border-left: 4px solid #d63638;
	border-radius: 8px;
	color: #7a1f1f;
	font-size: 14px;
}

.gt-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 10px;
	margin-bottom: 12px;
}

.gt-header-actions {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
}

.gt-btn {
	display: inline-block;
	padding: 8px 14px;
	border: 1px solid #ccc;
	border-radius: 4px;
	background: #f7f7f7;
	color: #222;
	text-decoration: none;
	cursor: pointer;
	font-size: 14px;
}

.gt-btn:hover {
	background: #eee;
}

/* v0.1.0 (build 88) : à la demande de l'utilisateur — un bouton `disabled`
 * (ex. #gt-draw-confirm-btn tant que le tirage n'est pas fait pour chaque
 * classement, voir updateConfirmButtonState() dans public-management.js)
 * n'avait jusqu'ici aucun style dédié : il restait visuellement identique à
 * un bouton actif (le fond `.gt-btn-primary`/`.gt-btn-success` etc. l'emporte
 * sur le grisé par défaut du navigateur), sans aucun signal qu'il est
 * inutilisable. */
.gt-btn:disabled, .gt-btn:disabled:hover {
	background: #ccc;
	border-color: #ccc;
	color: #777;
	cursor: not-allowed;
	opacity: 0.7;
}

.gt-btn-primary {
	background: #2271b1;
	border-color: #2271b1;
	color: #fff;
}

.gt-btn-primary:hover {
	background: #135e96;
	color: #fff;
}

.gt-btn-danger {
	background: #d63638;
	border-color: #d63638;
	color: #fff;
}

.gt-btn-success {
	background: #2e8b3f;
	border-color: #2e8b3f;
	color: #fff;
	font-weight: 700;
}

.gt-btn-success:hover {
	background: #256b32;
	color: #fff;
}

/* v0.1.0 (build 211) : bouton « Pause » du panneau de contrôle de la clock
 * live — voir html-gt-public-management.php. Même orange que la bordure
 * .gt-clock-panel.gt-clock-paused, pour associer visuellement l'action à
 * l'état qu'elle produit. */
.gt-btn-warning {
	background: #dba617;
	border-color: #dba617;
	color: #fff;
}

.gt-btn-warning:hover {
	background: #b8890f;
	color: #fff;
}

.gt-btn-block {
	display: block;
	width: 100%;
	box-sizing: border-box;
	text-align: center;
	margin-top: 10px;
	padding: 10px 14px;
	font-size: 15px;
}

/* v0.1.0 (build 29) : menus déroulants du bandeau d'actions (« Tables »,
 * « Manche ») — à la demande de l'utilisateur, regroupent les boutons
 * d'action de plus en plus nombreux au lieu de les empiler individuellement
 * dans .gt-header-actions. Menu maison (pas un <select>) pour pouvoir
 * contenir des boutons/liens avec leur propre handler JS — voir
 * initLivePhase() dans public-management.js pour l'ouverture/fermeture. */
.gt-menu {
	position: relative;
	display: inline-block;
}

.gt-menu-dropdown {
	position: absolute;
	top: 100%;
	left: 0;
	margin-top: 4px;
	background: #fff;
	border: 1px solid #ccc;
	border-radius: 6px;
	box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
	min-width: 210px;
	z-index: 50;
	display: flex;
	flex-direction: column;
	padding: 6px;
	gap: 2px;
}

/* v0.1.0 (build 372) : « Tournoi » est désormais le dernier menu du bandeau
   (voir html-gt-public-management.php) — aligné à gauche comme les autres
   (par défaut ci-dessus), son dropdown dépassait le bord droit de l'écran.
   Ouvre vers la gauche à la place, comme les menus de fin de rangée
   habituels. */
#gt-tournament-menu .gt-menu-dropdown {
	left: auto;
	right: 0;
}

.gt-menu-item {
	display: block;
	width: 100%;
	text-align: left;
	background: none;
	border: none;
	padding: 8px 10px;
	border-radius: 4px;
	cursor: pointer;
	font-size: 14px;
	color: #23282d;
	text-decoration: none;
	box-sizing: border-box;
	font-family: inherit;
}

/* v0.1.0 (build 91) : à la demande de l'utilisateur — même style de survol
 * que le sous-menu joueur de l'écran de tirage au sort (.gt-player-menu,
 * build 78/80) : fond bleu plein + texte blanc au survol pour une action
 * normale, fond rouge plein + texte blanc pour une action destructrice
 * (.gt-menu-item-danger) — remplace l'ancien survol gris clair/rose pâle,
 * pour une cohérence visuelle entre tous les menus déroulants du plugin
 * (bandeau « Tables »/« Manche »/« Équipes » et sous-menu « Action » d'un
 * siège, qui réutilise .gt-menu-item — voir .gt-chip-action-menu plus bas). */
.gt-menu-item:hover {
	background: #2271b1;
	color: #fff;
}

.gt-menu-item-danger {
	color: #d63638;
}

.gt-menu-item-danger:hover {
	background: #d63638;
	color: #fff;
}

/* v0.1.0 (build 372) : « Terminer le tournoi », déplacé dans le menu
   « Tournoi » depuis un bouton à part (vert) — même principe que
   .gt-menu-item-danger ci-dessus, pour garder cette action visuellement
   mise en avant même repliée dans un menu. */
.gt-menu-item-success {
	color: #00a32a;
	font-weight: 600;
}

.gt-menu-item-success:hover {
	background: #00a32a;
	color: #fff;
}

/* v0.1.0 (build 372) : « Terminer le tournoi » (voir .gt-menu-item-success
   ci-dessus) est désormais un <button class="gt-menu-item"> et non plus un
   <button class="gt-btn"> — reprend le même style désactivé que .gt-btn:disabled
   (voir son commentaire plus haut), sinon il resterait visuellement identique
   à un item actif quand bloqué (joueurs encore actifs, voir
   updateFinishButtonState() dans public-management.js). */
.gt-menu-item:disabled, .gt-menu-item:disabled:hover {
	background: none;
	color: #a7aaad;
	cursor: not-allowed;
	opacity: 0.7;
}

/* v0.1.0 (build 173) : sépare, dans le menu « Manche », les autres tournois
 * actifs (accès direct) du reste des actions — voir
 * html-gt-public-management.php. */
.gt-menu-separator {
	height: 1px;
	background: #e2e2e2;
	margin: 4px 2px;
}

.gt-draw-table-count-field {
	margin-top: 10px;
}

/* v0.1.0 (build 184) : plan des tables en LECTURE SEULE de l'écran de
 * tirage (voir renderDrawTables() dans public-management.js) — même esprit
 * que .gt-tables-grid/.gt-table-card de l'écran de gestion en direct, mais
 * volontairement distinct (pas de glisser-déposer ici) plutôt que de
 * réutiliser ces classes telles quelles. */
.gt-draw-tables-panel {
	margin-top: 20px;
}

/* v0.1.0 (build 185) : « Tables » et « Valider et démarrer la gestion du
 * tournoi » repris DANS le panneau « Tirage au sort initial » lui-même (voir
 * html-gt-public-initial-draw.php) pour la manche standard — cette règle ne
 * s'applique donc qu'au bouton nu (sans son ancien wrapper
 * .gt-start-management-panel) dans ce contexte-là. */
.gt-draw-panel > #gt-start-management-btn {
	margin-top: 20px;
}

.gt-draw-tables-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
	gap: 12px;
}

.gt-draw-table-card {
	border: 1px solid #ddd;
	border-radius: 8px;
	padding: 10px 12px;
	background: #fafafa;
}

.gt-draw-table-card h4 {
	margin: 0 0 8px;
}

/* v0.1.0 (build 198) : à la demande de l'utilisateur — puces retirées (peu
 * d'intérêt ici, le numéro de siège devant chaque nom fait déjà repère). */
.gt-draw-table-card ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

.gt-draw-table-empty {
	color: #777;
	font-style: italic;
}

/* v0.1.0 (build 566) : siège libre au sein d'une table par ailleurs occupée
 * (voir renderDrawTables() dans public-management.js) — même traitement
 * visuel que .gt-draw-table-empty (table entièrement vide) ci-dessus. */
.gt-draw-seat-empty {
	color: #777;
	font-style: italic;
}

/* v0.1.0 (build 183) : bouton « Ajouter des tables » de chaque panneau de
 * tirage — voir html-gt-public-initial-draw.php. */
.gt-open-tables-control {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px;
	margin-bottom: 10px;
}

.gt-open-tables-count {
	width: 55px;
}

.gt-open-tables-error, .gt-open-tables-success {
	flex-basis: 100%;
	margin: 0;
}

.gt-open-tables-success {
	color: #2e8b3f;
}

.gt-format-badge {
	display: inline-block;
	padding: 2px 8px;
	border-radius: 12px;
	font-size: 12px;
	font-weight: 600;
	background: #ddd;
}

.gt-format-mtt { background: #d7e8fc; color: #0a4d9e; }
.gt-format-sng { background: #fde3c9; color: #9a5b00; }

/* --- Bandeau de propositions --- */

.gt-proposals-banner {
	display: none;
	flex-direction: column;
	gap: 6px;
	background: #fff8e1;
	border: 1px solid #f0c14b;
	border-radius: 6px;
	padding: 10px 14px;
	margin-bottom: 14px;
}

.gt-proposals-banner.has-proposals {
	display: flex;
}

/* v0.1.0 (build 60) : message temporaire « Toutes les tables sont déjà
 * équilibrées » (voir showBalancedMessage() dans public-management.js) —
 * même gabarit que .gt-proposals-banner, teinte verte (succès) au lieu de
 * jaune (proposition en attente) pour bien les distinguer. */
.gt-balance-info-banner {
	background: #e6f4ea;
	border: 1px solid #34a853;
	border-radius: 6px;
	padding: 10px 14px;
	margin-bottom: 14px;
	color: #1e7e34;
	font-weight: 600;
}

.gt-proposal-row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	flex-wrap: wrap;
}

.gt-proposal-row .gt-proposal-text {
	flex: 1 1 auto;
}

.gt-proposal-row .gt-proposal-actions {
	display: flex;
	gap: 6px;
}

/* v0.1.0 (build 590) : « Valider tout » — sous les lignes Valider/Ignorer
 * d'une bannière qui en liste plusieurs (voir appendValidateAllRow() dans
 * public-management.js), séparée par un filet pour la distinguer des
 * propositions individuelles ci-dessus. */
.gt-proposal-validate-all-row {
	display: flex;
	justify-content: flex-end;
	padding-top: 6px;
	margin-top: 2px;
	border-top: 1px solid #f0c14b;
}

/* v0.1.0 (build 113) : à la demande de l'utilisateur — en mode
 * multi-classement, #gt-proposals-banner (tête de page) ne montre plus le
 * détail d'une proposition (déplacé dans la bannière DE SON classement,
 * .gt-classement-proposals-banner ci-dessous, même style — voir
 * renderProposals() dans public-management.js), seulement un texte
 * récapitulatif compact. */
.gt-proposals-banner-alert-only {
	padding: 8px 14px;
}

.gt-proposals-alert-text {
	margin: 0;
	font-weight: 600;
	color: #7a5b00;
}

/* Bannière d'équilibrage propre à un classement (même style que
 * .gt-proposals-banner ci-dessus, juste repositionnée sous l'en-tête de la
 * section — voir buildClassementSection() dans public-management.js).
 * v0.1.0 (build 114) : à la demande de l'utilisateur — marge basse ajoutée,
 * la bannière touchait directement la grille de tables juste en dessous. */
.gt-classement-proposals-banner {
	margin: 8px 0 14px;
}

/* --- Plan de tables --- */

.gt-management-layout {
	display: flex;
	gap: 20px;
	align-items: flex-start;
}

.gt-tables-grid {
	flex: 1 1 auto;
	display: grid;
	/* v0.1.0 (build 25) : à la demande de l'utilisateur, au plus 2 tables par
	 * ligne (auparavant jusqu'à 4+ sur un écran large avec auto-fill/220px,
	 * ce qui rendait les numéros de siège illisibles) — voir aussi .gt-seats
	 * ci-dessous (1 siège par ligne au lieu de 2). */
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 16px;
}

.gt-table-card {
	border: 1px solid #ddd;
	border-radius: 8px;
	padding: 10px;
	background: #fafafa;
}

/* v0.1.0 (build 93) : en mode multi-classement, les tables sont regroupées
 * par classement (voir renderTables()/buildClassementSection() dans
 * public-management.js) — `.gt-classement-section` occupe toute la largeur
 * de la grille parente (`grid-column: 1 / -1`, quel que soit son nombre de
 * colonnes) plutôt que de devenir elle-même un item de cette grille, sa
 * propre grille interne (`.gt-classement-tables`, réutilise `.gt-tables-grid`)
 * reprenant alors le même agencement à 2 colonnes que le mode standard. */
.gt-classement-section {
	grid-column: 1 / -1;
}

.gt-classement-section + .gt-classement-section {
	margin-top: 24px;
	padding-top: 20px;
	border-top: 1px solid #ddd;
}

.gt-classement-section-header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 10px;
	margin-bottom: 12px;
}

.gt-classement-section-header h3 {
	margin: 0;
}

.gt-classement-toolbar {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
}

.gt-table-card h4 {
	margin: 0 0 8px;
	display: flex;
	justify-content: space-between;
	align-items: center;
}

/* v0.1.0 (build 36) : bouton de fermeture manuelle d'une table vide (voir
 * renderTables() dans public-management.js) — affiché à côté du numéro de
 * table, uniquement quand elle est vide. */
.gt-close-table-btn {
	font-size: 11px;
	padding: 2px 8px;
}

/* v0.1.0 (build 39) : en-tête de table cliquable (voir renderTables() dans
 * public-management.js), ouvre la fenêtre de modification de la capacité —
 * reset des styles natifs de <button> pour garder le même rendu visuel que
 * l'ancien <span> inerte, curseur et léger survol pour signaler la
 * cliquabilité. */
.gt-table-title-btn {
	background: none;
	border: none;
	padding: 0;
	margin: 0;
	font: inherit;
	font-weight: 700;
	color: inherit;
	cursor: pointer;
	border-radius: 3px;
}

.gt-table-title-btn:hover {
	background: #e3ecf5;
}

.gt-seats {
	display: grid;
	/* v0.1.0 (build 25) : à la demande de l'utilisateur, les sièges d'une
	 * table sont désormais listés un par ligne (au lieu de 2 par ligne) —
	 * plus lisible avec le numéro de siège maintenant affiché (voir
	 * .gt-seat-number / .gt-chip-seat ci-dessous). */
	grid-template-columns: 1fr;
	gap: 6px;
}

/* v0.1.0 (build 42) : à la demande de l'utilisateur — joueurs éliminés DE
 * CETTE TABLE, affichés sous ses sièges en SnG (voir renderTables() dans
 * public-management.js) : le classement y est propre à chaque table, ce
 * panneau remplace donc le panneau latéral unique « Joueurs éliminés »
 * (masqué pour ce format). */
.gt-table-eliminated {
	margin-top: 8px;
	padding-top: 8px;
	border-top: 1px dashed #ddd;
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.gt-eliminated-chip {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 6px;
	width: 100%;
	min-width: 0;
	background: #d63638;
	color: #fff;
	border-radius: 4px;
	padding: 4px 6px;
	font-size: 13px;
}

/* v0.1.0 (build 515) : même correctif que .gt-eliminated-list li .gt-chip-name
 * ci-dessous (build 52, approfondi au build 85) — sans `flex-basis: 0`, un
 * pseudo long (ex. « TontonFlingueur ») fait passer le bouton « Réintégrer »/
 * « Gain » à la ligne suivante au lieu de tronquer le nom par ellipsis, la
 * puce héritant ici du `flex: 1 1 auto` générique de .gt-chip-name (voir son
 * docblock détaillé plus bas). `title` (voir buildTableCard() dans
 * public-management.js) affiche le pseudo complet au survol. */
.gt-eliminated-chip .gt-chip-name {
	color: #fff;
	flex: 1 1 0;
	min-width: 0;
}

.gt-chip-points {
	flex: 0 0 auto;
	font-weight: 700;
	opacity: 0.9;
	white-space: nowrap;
}

/* v0.1.0 (build 44) : « Éliminé par X (et Y) » — voir eliminatorLabel() dans
 * public-management.js. `flex: 0 0 100%` force ce libellé sur sa propre
 * ligne, sous le nom/les points/le bouton Réintégrer, dans les deux
 * contextes où il apparaît (médaillon d'élimination sous une table SnG,
 * et panneau latéral « Joueurs éliminés » en MTT). */
.gt-chip-ko {
	flex: 0 0 100%;
	font-size: 11px;
	font-style: italic;
	opacity: 0.85;
}

.gt-eliminated-list li .gt-chip-ko {
	color: #666;
}

/* v0.1.0 (build 233) : icône compacte (info-bulle « Éliminé par X — a repris
 * avec un rebuy ») sur un médaillon de joueur resté ACTIF après un rebuy —
 * voir buildPlayerChip() dans public-management.js. `.gt-player-chip` reste
 * en `nowrap` (contrairement à `.gt-eliminated-chip`, voir .gt-chip-ko
 * ci-dessus) : ce badge doit donc rester compact/inline plutôt que forcer
 * une nouvelle ligne. */
.gt-chip-rebuy-ko {
	flex: 0 0 auto;
	background: #b45309;
	color: #fff;
	border-radius: 50%;
	width: 16px;
	height: 16px;
	line-height: 16px;
	text-align: center;
	font-size: 11px;
	cursor: help;
}

/* v0.1.0 (build 591) : icône compacte (info-bulle « A pris un add-on ») sur
 * un médaillon de joueur ayant pris au moins un Add-on — même principe que
 * .gt-chip-rebuy-ko ci-dessus (cumulables sur un même médaillon si le joueur
 * a pris les deux), couleur distincte pour ne pas confondre les deux badges. */
.gt-chip-addon-ko {
	flex: 0 0 auto;
	background: #16a34a;
	color: #fff;
	border-radius: 50%;
	width: 16px;
	height: 16px;
	line-height: 16px;
	text-align: center;
	font-size: 11px;
	font-weight: 700;
	cursor: help;
}

.gt-eliminated-chip .gt-restore-btn {
	flex: 0 0 auto;
	font-size: 11px;
	padding: 1px 6px;
	background: rgba(255,255,255,0.25);
	border: none;
	color: #fff;
	border-radius: 3px;
	cursor: pointer;
}

.gt-seat {
	min-height: 40px;
	border: 1px dashed #bbb;
	border-radius: 4px;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 13px;
	background: #fff;
	padding: 4px;
	/* v0.1.0 (build 24) : empêche un jeton joueur trop large (nom long +
	 * bouton "Éliminer") de déborder du siège et de chevaucher visuellement
	 * les sièges voisins — voir aussi .gt-player-chip/.gt-chip-name
	 * ci-dessous, le vrai correctif (troncature du nom) est là, ceci n'est
	 * qu'un filet de sécurité. */
	overflow: hidden;
	/* v0.1.0 (build 41) : positionnement de référence pour le badge d'alerte
	 * de conflit de siège (.gt-seat-conflict-warning ci-dessous), affiché en
	 * coin. */
	position: relative;
}

.gt-seat.gt-seat-empty {
	color: #999;
	justify-content: flex-start;
	gap: 4px;
}

/* v0.1.0 (build 41) : à la demande de l'utilisateur — un siège où plusieurs
 * joueurs se retrouvent assignés au même numéro (ex. bug de données) est
 * désormais signalé visuellement (fond/bordure rouge clair) au lieu de
 * laisser l'un d'eux invisible sans prévenir (voir renderTables() dans
 * public-management.js). Le bouton d'alerte ouvre #gt-duplicate-seat-modal
 * pour choisir une action par joueur en conflit. */
.gt-seat.gt-seat-conflict {
	border-color: #d63638;
	border-style: solid;
	background: #fcedee;
}

/* v0.1.0 (build 118) : à la demande de l'utilisateur — mode « Tournoi en
 * équipe — joueur en alternance » : plusieurs coéquipiers partagent
 * volontairement le même siège, chacun avec son propre médaillon
 * (buildPlayerChip(), voir renderTables() dans public-management.js) empilé
 * verticalement dans ce même `.gt-seat` (au lieu du fond/bordure rouge de
 * .gt-seat-conflict ci-dessus, réservé à un vrai conflit de données entre
 * joueurs sans équipe commune). */
.gt-seat.gt-seat-shared {
	flex-direction: column;
	align-items: stretch;
	gap: 4px;
	padding: 6px 4px;
}

.gt-seat.gt-seat-shared .gt-player-chip {
	width: 100%;
	box-sizing: border-box;
}

.gt-seat-conflict-warning {
	position: absolute;
	top: 2px;
	right: 2px;
	width: 18px;
	height: 18px;
	line-height: 18px;
	padding: 0;
	border: none;
	border-radius: 50%;
	background: #d63638;
	color: #fff;
	font-size: 11px;
	font-weight: 700;
	cursor: pointer;
	z-index: 1;
}

.gt-seat-conflict-warning:hover {
	background: #a82a2c;
}

/* v0.1.0 (build 63) : à la demande de l'utilisateur — siège libre rendu
 * indisponible (voir toggleSeatBlock() dans public-management.js et
 * GT_Management::toggleSeatBlock()) : hachures grises, distinct à la fois
 * d'un siège libre normal (.gt-seat-empty) et d'un conflit (.gt-seat-conflict,
 * rouge). Ni l'équilibrage automatique ni le glisser-déposer ne peuvent plus
 * y placer quelqu'un (voir accept: function() sur .droppable()). */
.gt-seat.gt-seat-blocked {
	background: repeating-linear-gradient(45deg, #f0f0f0, #f0f0f0 6px, #e2e2e2 6px, #e2e2e2 12px);
	border-style: solid;
	color: #888;
}

.gt-seat-block-toggle {
	flex: 0 0 auto;
	cursor: pointer;
	background: transparent;
	border: 1px solid #bbb;
	border-radius: 3px;
	color: #666;
	font-size: 10px;
	padding: 1px 5px;
	margin-left: auto;
}

.gt-seat-block-toggle:hover {
	background: #eee;
}

/* v0.1.0 (build 25) : numéro de siège — affiché sur chaque siège (libre ou
 * occupé) pour s'y retrouver à table, à la demande de l'utilisateur. Sur un
 * siège occupé, il apparaît dans .gt-player-chip juste avant le pseudo (voir
 * .gt-chip-seat) ; sur un siège libre, directement dans .gt-seat. */
.gt-seat-number {
	font-weight: 700;
	color: #999;
}

.gt-seat.gt-seat-dropover {
	background: #e6f4ea;
	border-color: #34a853;
}

.gt-player-chip {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 6px;
	width: 100%;
	/* v0.1.0 (build 24) : min-width:0 est nécessaire pour qu'un enfant flex
	 * (.gt-chip-name) accepte de se tronquer au lieu de forcer le
	 * conteneur (et donc le siège parent) à déborder — comportement par
	 * défaut de flexbox sinon (min-width implicite = contenu). */
	min-width: 0;
	background: #2271b1;
	color: #fff;
	border-radius: 4px;
	padding: 4px 6px;
	cursor: grab;
}

.gt-chip-name {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	min-width: 0;
	flex: 1 1 auto;
}

/* v0.1.0 (build 25) : numéro de siège inscrit juste avant le pseudo, dans le
 * jeton joueur (voir .gt-seat-number pour l'équivalent sur un siège libre). */
.gt-chip-seat {
	flex: 0 0 auto;
	font-weight: 700;
	opacity: 0.85;
}

/* v0.1.0 (build 51) : place dans le tournoi (« 1er », « 2e »…), à gauche du
 * nom d'un joueur éliminé — voir ordinalLabel() dans public-management.js.
 * Même traitement visuel que .gt-chip-seat ci-dessus. */
.gt-chip-position {
	flex: 0 0 auto;
	font-weight: 700;
	opacity: 0.85;
}

/* v0.1.0 (build 65) : à la demande de l'utilisateur — les trois boutons
 * d'action (Fixer/Retirer/Éliminer), jusqu'ici alignés en permanence sur la
 * puce (fond blanc translucide sur le bleu de la puce), sont désormais
 * regroupés derrière un seul bouton « Action » ouvrant un sous-menu
 * déroulant (voir buildPlayerChip() dans public-management.js) — même
 * gabarit que .gt-menu-dropdown/.gt-menu-item du bandeau (fond blanc, texte
 * sombre), en plus compact et ancré à droite du bouton qui l'ouvre. */
.gt-chip-action {
	position: relative;
	flex: 0 0 auto;
}

.gt-chip-action-btn {
	cursor: pointer;
	background: rgba(255,255,255,0.2);
	border: none;
	border-radius: 3px;
	color: #fff;
	font-size: 11px;
	padding: 1px 5px;
	white-space: nowrap;
}

/* v0.1.0 (build 95) : à la demande de l'utilisateur — largeur/comportement
 * repris du sous-menu joueur de l'écran de tirage au sort (.gt-player-menu,
 * build 78/80) : `width: max-content` + `white-space: nowrap` sur les items
 * (ci-dessous) pour que le texte le plus long (« Fixer le joueur à son
 * siège ») tienne sur une seule ligne au lieu de se replier en boîte à deux
 * lignes ; `min-width` relevé à 220px (au lieu de 130px, trop étroit dès
 * qu'un item passait sur deux lignes). */
/* v0.1.0 (build 207) : bug signalé par l'utilisateur — `position: fixed`
 * plutôt que `position: absolute; top: 100%; right: 0` (ancré sur
 * `.gt-chip-action`, lui-même dans une puce potentiellement au fond d'un
 * conteneur au défilement/rognage limité, ex. `.gt-unseated-list`) :
 * `top`/`right` calculés en JS à l'ouverture depuis les coordonnées du
 * bouton lui-même (voir le handler de clic sur `.gt-chip-action-btn` dans
 * initLivePhase()), un élément `position: fixed` échappant par nature au
 * rognage par `overflow` de N'IMPORTE QUEL ancêtre — sans plus jamais avoir
 * besoin d'un correctif au cas par cas comme l'ancien `.gt-seat`/
 * `.gt-unseated-list.gt-chip-menu-open { overflow: visible }` (retiré à
 * cette occasion : il déclipait toute la liste, pas seulement ce menu — une
 * liste plus longue que sa hauteur max débordait alors elle aussi par-dessus
 * la section suivante dès qu'un menu y était ouvert). */
.gt-chip-action-menu {
	display: none;
	position: fixed;
	background: #fff;
	border: 1px solid #ccc;
	border-radius: 6px;
	box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
	width: max-content;
	min-width: 220px;
	max-width: 320px;
	z-index: 1000;
	flex-direction: column;
	padding: 4px;
	gap: 2px;
	box-sizing: border-box;
}

.gt-chip-action-menu.is-open {
	display: flex;
}

.gt-chip-action-menu .gt-menu-item {
	font-size: 13px;
	padding: 6px 8px;
	white-space: nowrap;
	/* v0.1.0 (build 648) : dans le panneau/chip « Joueurs éliminés », certains
	 * boutons regroupés ici gardent leurs classes d'origine pour leurs
	 * handlers (`.gt-restore-btn`, `.gt-print-gain-ticket-btn`) — mais leur
	 * habillage « bouton sur médaillon » (fond translucide, texte blanc, pensé
	 * pour le chip rouge SnG, voir `.gt-eliminated-chip .gt-restore-btn`)
	 * rendrait le texte illisible sur le fond blanc de ce menu. On réaffirme
	 * ici le rendu `.gt-menu-item` (spécificité égale mais règle plus tardive).
	 * `.gt-eliminate-btn` garde sa couleur rouge (règle plus spécifique
	 * ci-dessous). */
	background: none;
	color: #23282d;
	border: none;
	border-radius: 4px;
}

/* « Éliminer » ressort en rouge, comme .gt-menu-item-danger du bandeau —
 * même survol plein rouge/texte blanc depuis le build 91 (voir plus haut). */
.gt-chip-action-menu .gt-eliminate-btn {
	color: #d63638;
}

.gt-chip-action-menu .gt-eliminate-btn:hover {
	background: #d63638;
	color: #fff;
}

/* v0.1.0 (build 63) : « Fixer »/« Fixé » ressort en doré quand actif, pour
 * signaler l'état sans avoir à ouvrir le sous-menu (voir aussi la bordure de
 * .gt-player-chip-pinned ci-dessous). */
.gt-chip-action-menu .gt-pin-btn[data-pin="0"] {
	color: #a97c0f;
	font-weight: 700;
}

.gt-player-chip.gt-dragging {
	opacity: 0.5;
}

/* v0.1.0 (build 63) : à la demande de l'utilisateur — joueur fixé à son
 * siège (voir togglePlayerPin()/buildPlayerChip() dans
 * public-management.js) : bordure dorée distincte, curseur normal (plus de
 * "grab", ce médaillon n'est plus rendu déplaçable — voir enableDragDrop()).
 * v0.1.0 (build 65) : le bouton « Fixé »/« Fixer » a rejoint le sous-menu
 * Action (voir .gt-chip-action-menu .gt-pin-btn plus haut) — ne reste ici
 * que la bordure de la puce elle-même.
 */
.gt-player-chip.gt-player-chip-pinned {
	box-shadow: 0 0 0 2px #c9971c inset;
	cursor: default;
}

/* v0.1.0 (build 94) : à la demande de l'utilisateur — un joueur de
 * « Joueurs sans siège » sans classement affecté (mode multi-classement,
 * voir buildPlayerChip()/enableDragDrop()) ne peut plus être glissé sur une
 * table : bordure orange en pointillés, distincte du liseré plein de
 * .gt-player-chip-pinned ci-dessus, pour signaler un état « à compléter »
 * plutôt qu'un blocage volontaire. */
.gt-player-chip.gt-player-chip-no-classement {
	box-shadow: 0 0 0 2px #d63638 inset;
	border: 1px dashed #d63638;
	cursor: default;
}

/* v0.1.0 (build 97) : à la demande de l'utilisateur — un joueur ASSIS avec
 * un classement affecté mais n'appartenant à aucune équipe (mode équipe,
 * voir `needsTeam` dans buildPlayerChip()) porte un liseré orange (au lieu
 * du rouge de .gt-player-chip-no-classement ci-dessus, réservé à un joueur
 * qui ne peut carrément pas être assis) — reste déplaçable normalement,
 * seule l'équipe manque. Le bouton « i » ouvre la fenêtre d'affectation en
 * mode équipe uniquement (voir initClassementAssignModal()). */
.gt-player-chip.gt-player-chip-no-team {
	box-shadow: 0 0 0 2px #dba617 inset;
}

/* v0.1.0 (build 128) : à la demande de l'utilisateur — sur un siège
 * partagé (mode « joueur en alternance »), le coéquipier PAS désigné « à
 * table » (voir setPlayerAtTable()/buildPlayerChip() dans
 * public-management.js) s'affiche en plus clair que celui réellement en
 * jeu — simple éclaircissement du bleu habituel de .gt-player-chip, pas une
 * bordure d'alerte (ce n'est pas un état à corriger, juste informatif). */
.gt-player-chip.gt-player-chip-not-at-table {
	background: #7aa7ca;
}

.gt-chip-no-team-info {
	flex: 0 0 auto;
	width: 16px;
	height: 16px;
	line-height: 16px;
	border-radius: 50%;
	background: #dba617;
	color: #fff;
	border: none;
	font-size: 11px;
	font-style: italic;
	font-weight: 700;
	font-family: Georgia, serif;
	cursor: pointer;
	padding: 0;
	margin-right: 4px;
}

/* --- Barre latérale --- */

.gt-sidebar {
	width: 280px;
	flex: 0 0 280px;
	display: flex;
	flex-direction: column;
	gap: 16px;
}

.gt-panel {
	border: 1px solid #ddd;
	border-radius: 8px;
	padding: 12px;
	background: #fff;
}

.gt-panel h3, .gt-panel h4 {
	margin-top: 0;
}

/* v0.1.0 (build 34) : bandeau proposant d'importer l'état actuel depuis
   Classement Poker sur l'écran de tirage au sort, voir
   html-gt-public-initial-draw.php. */
.gt-import-cp-banner {
	border-color: #2271b1;
	background: #f0f6fc;
	margin-bottom: 16px;
}

.gt-import-cp-note {
	font-size: 0.9em;
	color: #666;
	margin-bottom: 0;
}

#gt-player-search {
	width: 100%;
	padding: 6px 8px;
	box-sizing: border-box;
}

.gt-eliminated-list {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	max-height: 220px;
	overflow-y: auto;
}

.gt-eliminated-list li {
	padding: 6px 8px;
	border-bottom: 1px solid #eee;
	display: flex;
	/* flex-wrap reste "wrap" — nécessaire pour que .gt-chip-ko (build 44,
	 * "Éliminé par X") puisse toujours se placer sur sa propre ligne
	 * (flex: 0 0 100%, voir plus bas) sous le nom/bouton. Le bug du build 85
	 * (voir .gt-chip-name ci-dessous) ne vient pas de "wrap" lui-même, mais
	 * du flex-basis:auto de .gt-chip-name — passer "nowrap" ici casserait
	 * cette mise en page dédiée du libellé KO. */
	flex-wrap: wrap;
	justify-content: space-between;
	align-items: center;
	gap: 8px;
}

/* v0.1.0 (build 52) : à la demande de l'utilisateur — un pseudo trop long
 * (ex. « TontonFlingueur ») faisait passer le bouton « Réintégrer » seul sur
 * sa propre ligne, où il se retrouvait aligné à gauche (justify-content:
 * space-between n'a aucun effet sur une ligne flex à un seul élément). Le
 * pseudo est censé être tronqué (ellipsis) plutôt que de pousser le bouton à
 * la ligne.
 *
 * v0.1.0 (build 85) : bug persistant signalé par l'utilisateur — ce
 * correctif ne suffisait pas dès que le nom était VRAIMENT long : avec
 * flex-basis:auto (raccourci "flex: 1 1 auto"), l'algorithme de retour à la
 * ligne de Flexbox répartit d'abord les éléments par ligne en se basant sur
 * leur taille "hypothétique" — pour .gt-chip-name, sa taille de CONTENU
 * complète, pas la taille rétrécie par l'ellipsis, qui n'intervient qu'une
 * fois les éléments déjà assignés à une ligne. Un nom assez long pour
 * dépasser la largeur disponible faisait donc passer le bouton à la ligne
 * suivante AVANT même que l'ellipsis n'ait sa chance de s'appliquer.
 * `flex-basis: 0` (au lieu de `auto`) fait traiter ce nom comme quasi nul
 * pour cette répartition initiale — combiné à flex-grow:1, il grandit
 * ensuite pour occuper l'espace restant sur sa ligne, et se tronque par
 * ellipsis si son contenu réel dépasse — le bouton (et un éventuel libellé
 * KO forcé sur sa propre ligne, voir .gt-chip-ko ci-dessus) reste ainsi
 * toujours sur la bonne ligne. */
.gt-eliminated-list li .gt-chip-name {
	flex: 1 1 0;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* v0.1.0 (build 648) : à la demande de l'utilisateur — les actions d'un joueur
 * éliminé (Réintégrer / ticket de gain / Infos / Modifier l'éliminateur) sont
 * regroupées derrière « Action ▾ » (voir renderEliminated() dans
 * public-management.js), pour que le pseudo redevienne lisible. Le bouton
 * générique `.gt-chip-action-btn` est stylé pour un fond BLEU (médaillon de
 * joueur assis) : sur ce panneau à fond blanc, il lui faut un habillage clair.
 * (Le chip éliminé SnG, lui, est sur fond rouge — le style générique y suffit.) */
.gt-eliminated-list li .gt-chip-action-btn {
	background: #f1f5f9;
	color: #1e293b;
	border: 1px solid #cbd5e1;
	font-size: 12px;
	padding: 3px 8px;
}

.gt-eliminated-list li .gt-chip-action-btn:hover {
	background: #e2e8f0;
}

/* v0.1.0 (build 24) : bouton "Réintégrer" par joueur éliminé — voir
 * GT_Management::restorePlayer(). */
.gt-restore-btn {
	flex: 0 0 auto;
	font-size: 12px;
	padding: 3px 8px;
}

/* v0.1.0 (build 86) : à la demande de l'utilisateur — panneau « Classement
 * d'équipe » (#gt-team-ranking-list, voir renderTeamRankingPanel() dans
 * public-management.js) : les pseudos des membres (souvent un nom combiné
 * long, ex. « S33kShove (415.66 pts) & Magic Mykiss (415.66 pts) », voir
 * describeTeamMembers()) et le total de points passent sur deux lignes
 * distinctes plutôt qu'une seule ligne partagée — sur un panneau étroit, le
 * total (largeur fixe) ne laissait presque plus de place au nom, tronqué à
 * l'excès (ex. « S33k… »). Les pseudos restent sur toute la largeur du
 * panneau (peuvent encore se tronquer par ellipsis si vraiment trop longs,
 * héritée de .gt-chip-name), le total s'affiche en dessous. */
#gt-team-ranking-list li {
	flex-direction: column;
	align-items: flex-start;
	gap: 2px;
}
#gt-team-ranking-list li .gt-chip-name {
	width: 100%;
	flex: 0 0 auto;
}
#gt-team-ranking-list li .gt-chip-points {
	width: 100%;
}

/* v0.1.0 (build 35) : panneau « Joueurs sans siège » (voir
 * html-gt-public-management.php) — les .gt-player-chip qu'elle contient
 * reprennent le style des sièges occupés (voir .gt-seat/.gt-player-chip),
 * juste sans conteneur de siège autour. */
.gt-unseated-list {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	max-height: 220px;
	overflow-y: auto;
	display: flex;
	flex-direction: column;
	gap: 6px;
}

/* v0.1.0 (build 37) : espace de dépôt toujours visible en bas de « Joueurs
 * sans siège » (voir renderUnseated() dans public-management.js), pour
 * glisser-déposer un joueur assis directement ici sans viser un médaillon
 * précis — même gabarit que .gt-seat (siège libre) pour rester cohérent
 * visuellement. */
.gt-unseated-dropzone {
	min-height: 40px;
	border: 1px dashed #bbb;
	border-radius: 4px;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 12px;
	color: #999;
	padding: 4px;
	text-align: center;
}

.gt-unseated-list.gt-unseated-list-dropover {
	background: #e6f4ea;
	border-radius: 6px;
}

/* v0.1.0 (build 205) : en-tête « Classement N » de chaque section de
 * « Joueurs sans siège » (voir renderUnseated() dans public-management.js) —
 * .gt-classement-section (build 93) fournit déjà l'espacement entre
 * sections, il ne manque que le style du titre lui-même dans ce panneau
 * plus étroit (sidebar) que le plan des tables. */
.gt-unseated-section h4 {
	margin: 0 0 8px;
	font-size: 13px;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: #555;
}

/* v0.1.0 (build 37) : clone visuel suivant le curseur pendant un
 * glisser-déposer (voir enableDragDrop() dans public-management.js) — ajouté
 * à <body>, donc jamais rogné par `overflow: hidden` sur `.gt-seat`
 * (contrairement à l'ancien comportement par défaut de jQuery UI, qui
 * déplaçait l'élément original lui-même). Légèrement incliné et ombré, à la
 * demande de l'utilisateur, pour bien le distinguer visuellement du reste
 * de l'écran pendant le déplacement. */
/* v0.1.0 (build 52) : le clone affiche désormais « Table X - siège Y :
 * Pseudo » (voir enableDragDrop() dans public-management.js) — texte presque
 * toujours plus long que le seul pseudo, d'où `width: auto` (au lieu de la
 * largeur figée de la puce d'origine) et la désactivation de la troncature
 * par ellipse de `.gt-chip-name` le temps du glisser. `padding-right`
 * légèrement augmenté (« un peu d'aire » demandé par l'utilisateur) pour que
 * le texte ne colle pas au bord droit du clone. */
.gt-drag-helper {
	width: auto !important;
	transform: rotate(-6deg);
	box-shadow: 0 6px 16px rgba(0, 0, 0, 0.35);
	pointer-events: none;
	cursor: grabbing;
	padding-right: 14px;
}

.gt-drag-helper .gt-chip-name {
	overflow: visible;
	text-overflow: clip;
	white-space: nowrap;
	font-weight: 700;
}

/* v0.1.0 (build 53) : « Table X - siège Y : », devant le pseudo (gras,
 * `.gt-chip-name` ci-dessus) — poids normal pour bien distinguer les deux, à
 * la demande de l'utilisateur. */
.gt-drag-helper-prefix {
	white-space: nowrap;
	font-weight: 400;
}

/* v0.1.0 (build 24) : pastille "Terminé" dans l'en-tête de l'écran de
 * résultats (voir html-gt-public-results.php). */
.gt-finished-badge {
	display: inline-block;
	padding: 2px 8px;
	border-radius: 12px;
	background: #2e8b3f;
	color: #fff;
	font-size: 12px;
	font-weight: 700;
	vertical-align: middle;
}

/* v0.1.0 (build 24) : écran de résultats (classement final, lecture seule)
 * d'une manche terminée — voir html-gt-public-results.php. */
.gt-results-panel {
	max-width: 700px;
}

.gt-results-list {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	counter-reset: none;
}

.gt-results-row {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 10px 8px;
	border-bottom: 1px solid #eee;
}

.gt-results-row:first-child {
	background: #fff8e1;
	border-radius: 6px;
	font-weight: 700;
}

.gt-results-position {
	flex: 0 0 32px;
	text-align: center;
	font-weight: 700;
	color: #2271b1;
}

.gt-results-name {
	flex: 1 1 auto;
}

.gt-results-table {
	flex: 0 0 auto;
	color: #666;
	font-size: 13px;
}

/* v0.1.0 (build 17) : à la demande de l'utilisateur, les noms de « Inscrire
 * des joueurs » et de « Joueurs en attente » ne s'affichent plus en liste de
 * lignes mais sous forme de badges/pastilles (mêmes codes couleur que les
 * jetons joueurs du plan de tables, .gt-player-chip) — plus compact, et les
 * deux listes se ressemblent visuellement puisqu'un joueur passe de l'une à
 * l'autre au clic.
 * v0.1.0 (build 18) : à la demande de l'utilisateur, un seul badge par ligne
 * (plus de plusieurs badges côte à côte sur une même ligne) et plus
 * d'ascenseur interne tant qu'il y a des joueurs — les listes s'étirent en
 * hauteur autant que nécessaire, c'est la page elle-même qui défile.
 * v0.1.0 (build 19) : à la demande de l'utilisateur, chaque médaillon prend
 * toute la largeur de sa colonne (retrait de `align-items: flex-start`, les
 * `<li>` s'étirent alors sur la largeur du conteneur flex par défaut), et le
 * nom du joueur est centré et en gras. */
/* v0.1.0 (build 585) : sélecteur de Buy-in — à la demande de l'utilisateur,
 * masqué (voir initPlayerSearch() dans public-management.js) tant que la
 * structure n'a qu'un seul Buy-in configuré.
 * v0.1.0 (build 623) : à la demande de l'utilisateur (« pas assez visible lors
 * de l'inscription d'un joueur tardif ») — présenté comme un encart mis en
 * avant (fond bleuté, filet d'accent à gauche, libellé plus marqué, <select>
 * pleine largeur sur sa propre ligne) plutôt qu'une simple ligne label +
 * champ. */
.gt-search-buyin-row {
    display: block;
    margin: 0 0 12px;
    padding: 10px 12px;
    background: #f0f6fb;
    border: 1px solid #cfe2f0;
    border-left: 4px solid #2271b1;
    border-radius: 6px;
    font-size: 13px;
}
.gt-search-buyin-row label {
    display: block;
    margin-bottom: 6px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    font-size: 12px;
    color: #135e96;
    white-space: nowrap;
}
.gt-search-buyin-row select {
    display: block;
    width: 100%;
    min-width: 0;
    padding: 7px 10px;
    font-size: 14px;
    font-weight: 600;
    background: #fff;
    border: 1px solid #2271b1;
    border-radius: 5px;
}

/* v0.1.0 (build 626) : champ « Montant du buy-in (€) » d'un Buy-in à montant
 * variable — même habillage d'encart mis en avant que la ligne de sélection
 * ci-dessus (voir updateBuyInAmountRow() dans public-management.js). */
.gt-search-buyin-amount-row {
    margin: 0 0 12px;
    padding: 10px 12px;
    background: #f0f6fb;
    border: 1px solid #cfe2f0;
    border-left: 4px solid #2271b1;
    border-radius: 6px;
}
.gt-search-buyin-amount-row label {
    display: block;
    margin-bottom: 6px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    font-size: 12px;
    color: #135e96;
}
.gt-search-buyin-amount-row input {
    display: block;
    width: 100%;
    box-sizing: border-box;
    padding: 7px 10px;
    font-size: 14px;
    font-weight: 600;
    background: #fff;
    border: 1px solid #2271b1;
    border-radius: 5px;
}
.gt-search-buyin-amount-viz {
    margin: 6px 0 0;
    font-size: 12px;
    font-weight: 600;
    color: #135e96;
}

/* v0.1.0 (build 626) : indication en ligne (rake calculé) — fenêtres
 * « Ajouter un tapis » et « Élimination », tapis à montant variable. */
.gt-inline-hint {
    display: inline-block;
    font-size: 12px;
    font-weight: 600;
    color: #135e96;
}

/* v0.1.0 (build 626) : ligne dépliée d'un tapis « à montant variable » dans
 * « Ajouter un tapis » — saisie du montant + bouton « Ajouter ». */
.gt-add-stack-amount {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-top: 6px;
}
.gt-add-stack-amount .gt-add-stack-amount-input {
    width: 120px;
    padding: 6px 8px;
    font-size: 14px;
    border: 1px solid #2271b1;
    border-radius: 5px;
}
#gt-eliminate-rebuy-amount {
    padding: 6px 8px;
    font-size: 14px;
    border: 1px solid #2271b1;
    border-radius: 5px;
}

.gt-search-wrap {
    position: relative;
    margin-top: 8px;
}
.gt-search-wrap #gt-player-search {
    width: 100%;
    box-sizing: border-box;
    padding: 8px 34px 8px 14px;
    border: 1px solid #dcdcdc;
    border-radius: 20px;
    font-size: 13px;
    line-height: 1.4;
    outline: none;
    transition: border-color 0.15s ease;
}
.gt-search-wrap #gt-player-search:focus {
    border-color: #2271b1;
}
.gt-search-icon {
    position: absolute;
    top: 50%;
    right: 12px;
    transform: translateY(-50%);
    color: #888;
    display: flex;
    align-items: center;
    pointer-events: none;
}
.gt-search-clear {
    position: absolute;
    top: 50%;
    right: 30px;
    transform: translateY(-50%);
    display: none;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    padding: 0;
    border: none;
    background: none;
    color: #888;
    font-size: 16px;
    line-height: 1;
    cursor: pointer;
}
.gt-search-clear:hover {
    color: #333;
}

.gt-search-results, .gt-waiting-list {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.gt-search-results li, .gt-waiting-list li {
	padding: 6px 10px;
	border-radius: 14px;
	background: #e8eef5;
	border: 1px solid #cddbe8;
	font-size: 13px;
	line-height: 1.4;
	text-align: center;
	font-weight: 700;
	box-sizing: border-box;
}

.gt-search-results li {
	cursor: pointer;
}

.gt-search-results li:hover {
	background: #2271b1;
	border-color: #2271b1;
	color: #fff;
}

/* v0.1.0 (build 39) : item « + Nouvelle table » de la fenêtre « Asseoir sur
 * une nouvelle table » (#gt-seat-new-table-modal, voir public-management.js)
 * — même liste que les tables fermées (.gt-search-results), couleur verte
 * (comme .gt-btn-success) pour se distinguer visuellement des tables
 * fermées listées à côté. */
.gt-new-table-option {
	background: #e6f4ea;
	border-color: #bfe3c8;
	color: #256b32;
}

.gt-new-table-option:hover {
	background: #2e8b3f;
	border-color: #2e8b3f;
	color: #fff;
}

/**
 * v0.1.0 (build 561) : CORRECTIF — bug signalé par l'utilisateur (capture
 * d'écran : le chiffre du champ quantité devient invisible au survol de
 * « + Ouvrir X nouvelle(s) table(s) ») — `.gt-search-results li:hover`/
 * `.gt-new-table-option:hover` (ci-dessus) posent `color: #fff` sur le
 * `<li>`, hérité par le texte de l'`<input>` qu'il contient (voir
 * html-gt-public-management.php, build 559) ; son propre fond reste blanc
 * (style natif du navigateur, jamais redéfini) — texte blanc sur fond
 * blanc, invisible. Couleur/fond posés explicitement sur le champ
 * lui-même (sélecteur ID, plus spécifique que les règles `:hover`
 * ci-dessus quel que soit l'état de survol du `<li>` parent) pour qu'il
 * reste lisible dans tous les cas.
 */
#gt-reopen-table-count {
	color: #1d2327;
	background: #fff;
}

/* v0.1.0 (build 355) : fenêtre « Choisir une table ouverte »
 * (#gt-seat-open-table-modal, voir openSeatOpenTableModal() dans
 * public-management.js) — même agencement que la fenêtre « Déplacer » de la
 * télécommande de gestion (.gt-remote-move-*, voir public-remote.css), dont
 * elle est la contrepartie pour un joueur pas encore assis. */
#gt-seat-open-table-list {
	max-height: 60vh;
	overflow-y: auto;
	margin-bottom: 8px;
}

.gt-open-table-label {
	font-size: 13px;
	font-weight: 700;
	color: #555;
	margin: 12px 0 6px;
}

.gt-open-table-label:first-child {
	margin-top: 0;
}

.gt-open-table-seats {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

.gt-open-table-seat-btn {
	flex: 0 0 auto;
	min-width: 64px;
	text-align: center;
}

.gt-open-table-empty {
	font-size: 14px;
	color: #777;
	margin: 0;
}

/* v0.1.0 (build 168, déplacé en tête de liste au build 629) : « + Nouveau
 * joueur », toujours en PREMIER dans la liste de recherche de joueurs
 * (#gt-player-search-results, voir renderResults() dans public-management.js)
 * — même traitement visuel que .gt-new-table-option ci-dessus (vert, même
 * famille de « créer un nouvel élément » dans une liste cliquable de ce
 * plugin). */
.gt-player-search-create {
	background: #e6f4ea;
	border-color: #bfe3c8;
	color: #256b32;
}

.gt-player-search-create:hover {
	background: #2e8b3f;
	border-color: #2e8b3f;
	color: #fff;
}

/* v0.1.0 (build 30) : verrou anti-double-ajout (voir isAdding/setAdding()
 * dans initPlayerSearch(), public-management.js) — grise la liste et bloque
 * les clics pendant qu'un ajout est déjà en cours (ex. juste après avoir
 * validé la fenêtre de confirmation d'inscription tardive, le temps que
 * l'appel AJAX gt_add_player aboutisse). */
.gt-search-results-disabled {
	opacity: 0.5;
	pointer-events: none;
}

.gt-waiting-list li {
	background: #dff0d8;
	border-color: #b9dba3;
	color: #2f5b1e;
}

/* v0.1.0 (build 32) : à la demande de l'utilisateur, un clic sur un joueur
 * de la liste « Joueurs en attente » annule désormais son inscription (voir
 * initDrawPhase() dans public-management.js) — curseur et survol (rouge,
 * pour se distinguer du survol bleu « ajouter » de .gt-search-results li)
 * signalent que l'action ici retire le joueur plutôt que d'en ajouter un.
 * `.gt-waiting-list-disabled` grise la liste le temps de l'appel AJAX
 * `gt_remove_waiting_player`, même principe que `.gt-search-results-disabled`
 * ci-dessus. */
.gt-waiting-list li {
	cursor: pointer;
}

.gt-waiting-list li:hover {
	background: #d63638;
	border-color: #d63638;
	color: #fff;
}

.gt-waiting-list-disabled {
	opacity: 0.5;
	pointer-events: none;
}

/* v0.1.0 (build 111) : à la demande de l'utilisateur — chaque joueur de
 * « Joueurs en attente » portait un liseré orange + un badge « i » signalant
 * l'absence de classement.
 * v0.1.0 (build 112) : déplacé dans les colonnes « Classements » (mode
 * équipe uniquement, voir renderPlayerBucket()/teamedIds dans
 * public-management.js) — retiré de « Joueurs en attente », redondant
 * là-bas (tous les joueurs y sont par construction sans classement). Signale
 * désormais plutôt quel joueur, déjà affecté à SON classement, n'a pas
 * encore d'équipe — même couleur/style que .gt-chip-no-team-info de l'écran
 * de gestion en direct (mais classe distincte, notion différente — voir son
 * docblock). Badge positionné en absolu (plutôt qu'en flex comme
 * .gt-chip-no-team-info) : ces médaillons sont des pastilles centrées pleine
 * largeur (voir .gt-search-results li/.gt-waiting-list li ci-dessus), pas des
 * lignes flex. */
.gt-classement-list li.gt-classement-no-team {
	position: relative;
	box-shadow: 0 0 0 2px #dba617 inset;
	padding-right: 26px;
}

.gt-classement-no-team-info {
	position: absolute;
	top: 50%;
	right: 8px;
	transform: translateY(-50%);
	width: 16px;
	height: 16px;
	line-height: 16px;
	border-radius: 50%;
	background: #dba617;
	color: #fff;
	font-size: 11px;
	font-style: italic;
	font-weight: 700;
	font-family: Georgia, serif;
}

.gt-form-error {
	color: #d63638;
}

/* v0.1.0 (build 615) : confirmation « Modifications enregistrées ✓ » des
   panneaux de la fenêtre « ⚙️ Paramètres » — ces boutons n'y ferment plus la
   fenêtre au clic, ce message vert prend le relais du feedback. */
.gt-form-success {
	color: #1a7f37;
	font-weight: 600;
}

/* v0.1.0 (build 50) : un champ « Éliminateur N » par ligne, ajoutés
 * dynamiquement (voir addEliminatorRow() dans public-management.js). */
.gt-eliminate-ko-row {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 6px 0;
}

.gt-eliminate-ko-row label {
	flex: 0 0 auto;
}

.gt-eliminate-ko-row select {
	flex: 1 1 auto;
	min-width: 0;
}

/* v0.1.0 (build 611) : petit lien sous les champs d'éliminateur — révèle les
   joueurs des autres tables (voir openEliminateModal() dans
   public-management.js). */
.gt-eliminate-show-all {
	display: inline-block;
	margin: 2px 0 6px;
	font-size: 12px;
	color: #2271b1;
	text-decoration: underline;
	cursor: pointer;
}

.gt-eliminate-show-all:hover {
	color: #135e96;
}

/* --- Écran de tirage initial --- */

.gt-draw-layout {
	display: flex;
	gap: 20px;
	flex-wrap: wrap;
}

/* v0.1.0 (build 182) : « Valider et démarrer la gestion du tournoi », seul
 * bouton qui fait basculer vers l'écran de gestion en direct — voir
 * html-gt-public-initial-draw.php. */
.gt-start-management-panel {
	margin-top: 20px;
	max-width: 400px;
}

.gt-inscribe-panel, .gt-waiting-panel, .gt-draw-panel, .gt-classements-panel {
	flex: 1 1 260px;
	border: 1px solid #ddd;
	border-radius: 8px;
	padding: 14px;
	background: #fff;
}

/* v0.1.0 (build 78) : à la demande de l'utilisateur — panneau « Classements »
 * de l'écran de tirage au sort initial (mode multi-classement, remplace
 * l'ancien panneau « Équipes »/.gt-teams-draw-panel de cet écran, retiré),
 * boutons « Configurer le mode »/« Former les équipes » empilés comme le
 * reste des actions de cet écran, puis un sous-panneau par classement
 * (.gt-classement-block) empilé verticalement en dessous. */
.gt-classements-panel .gt-btn {
	margin-bottom: 8px;
}
.gt-classements-panel .gt-btn:last-child {
	margin-bottom: 8px;
}

.gt-classement-block {
	margin-top: 14px;
	padding-top: 10px;
	border-top: 1px solid #eee;
}
.gt-classement-block:first-of-type {
	margin-top: 8px;
}

.gt-classement-block h4 {
	margin: 0 0 6px;
	font-size: 13px;
	color: #444;
}

/* v0.1.0 (build 78) : tirage au sort par classement — un sous-panneau
 * (.gt-draw-block) empilé par classement à l'intérieur de .gt-draw-panel-multi,
 * même principe visuel que .gt-classement-block ci-dessus. */
.gt-draw-block {
	margin-top: 14px;
	padding-top: 10px;
	border-top: 1px solid #eee;
}
.gt-draw-block:first-of-type {
	margin-top: 0;
	padding-top: 0;
	border-top: none;
}

.gt-draw-block h4 {
	margin: 0 0 6px;
	font-size: 13px;
	color: #444;
}

#gt-draw-confirm-btn {
	margin-top: 14px;
}

/* v0.1.0 (build 88) : à la demande de l'utilisateur — explique pourquoi
 * #gt-draw-confirm-btn ci-dessus ne réagit pas au clic, affiché/masqué en
 * même temps que son état désactivé (voir updateConfirmButtonState() dans
 * public-management.js). Neutre (gris), pas une erreur — .gt-form-error
 * reste réservé aux vrais messages d'échec. */
.gt-draw-confirm-hint {
	margin: 6px 0 0;
	font-size: 12px;
	color: #666;
	text-align: center;
}

/* v0.1.0 (build 78) : sous-menu (popover) ouvert au clic sur un joueur des
 * colonnes « Joueurs en attente »/« Classements » en mode multi-classement
 * (voir openPlayerMenu() dans public-management.js) — remplace la
 * désinscription directe au clic (réservée à la manche standard). */
/* v0.1.0 (build 80) : bug signalé par l'utilisateur (capture d'écran) — le
 * menu s'étirait sur toute la largeur de la page au lieu de rester une
 * petite liste près du joueur cliqué. Cause : ajouté directement à <body>
 * (voir openPlayerMenu()), il hérite du style par défaut d'un <ul> du thème
 * du site (`width: 100%` ou apparenté), qu'aucune règle de ce plugin ne
 * neutralisait jusqu'ici — `width: max-content` force la largeur à s'ajuster
 * au contenu quel que soit ce style hérité. */
/* v0.1.0 (build 194) : `.gt-add-choice-menu` — voir docblock
 * d'openAddChoiceMenu() dans public-management.js — même apparence que
 * `.gt-player-menu`, listée séparément ici pour ne rien devoir dupliquer. */
.gt-player-menu, .gt-add-choice-menu {
	list-style: none;
	margin: 0;
	padding: 4px;
	background: #fff;
	border: 1px solid #ccc;
	border-radius: 6px;
	box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
	width: max-content;
	min-width: 220px;
	max-width: 320px;
	box-sizing: border-box;
}

.gt-player-menu li, .gt-add-choice-menu li {
	padding: 7px 10px;
	font-size: 13px;
	font-weight: 600;
	border-radius: 4px;
	cursor: pointer;
	white-space: nowrap;
}

.gt-player-menu li:hover, .gt-add-choice-menu li:hover {
	background: #2271b1;
	color: #fff;
}

.gt-player-menu li.gt-player-menu-danger:hover {
	background: #d63638;
}

/* v0.1.0 (build 78) : en mode multi-classement, cliquer un joueur ouvre
 * désormais le sous-menu ci-dessus plutôt que de désinscrire directement
 * (comportement conservé sur une manche standard, voir build 32) — survol
 * neutre (bleu, comme .gt-search-results) plutôt que rouge, qui suggérait à
 * tort une suppression immédiate. */
.gt-draw-layout-multi .gt-waiting-list li:hover {
	background: #2271b1;
	border-color: #2271b1;
	color: #fff;
}

/* v0.1.0 (build 16) : à la demande de l'utilisateur, « Inscrire des
 * joueurs » (liste complète cliquable, la recherche ne fait que la
 * filtrer — voir build 15), « Joueurs en attente » et « Tirage au sort
 * initial » sont désormais trois colonnes indépendantes côte à côte dans
 * .gt-draw-layout (au lieu d'un panneau « Inscrire des joueurs » contenant
 * lui-même deux colonnes imbriquées). « Joueurs en attente » garde un fond
 * légèrement teinté pour rester visuellement distinct des deux autres. */
.gt-waiting-panel {
	background: #f7f9fb;
}

.gt-waiting-panel h3 {
	margin-top: 0;
}

/* v0.1.0 (build 19) : à la demande de l'utilisateur, plusieurs propositions
 * de répartition (« 2 tables de 6 joueurs », « 3 tables de 5 joueurs », etc.)
 * s'affichent sous forme de médaillons cliquables sous le champ « Nombre de
 * tables » — cliquer sur l'un d'eux préremplit ce champ, qui reste modifiable
 * à la main. Voir computeTableCountOptions()/renderTableCountOptions() côté
 * JS. Style neutre (gris) pour bien les distinguer des médaillons joueurs. */
/* v0.1.0 (build 21) : à la demande de l'utilisateur, les médaillons de
 * répartition de tables prennent toute la largeur de leur colonne, un par
 * ligne, comme les médaillons joueurs (voir build 19) — même principe
 * (flex-direction: column, pas d'align-items pour laisser le stretch par
 * défaut étirer chaque <li> sur la largeur du conteneur), texte centré et
 * en gras. Couleur neutre (gris) conservée pour rester bien distincte des
 * médaillons joueurs (bleu/vert). */
.gt-table-count-options {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
}

.gt-table-count-options li {
	padding: 6px 10px;
	border-radius: 14px;
	background: #f0f0f0;
	border: 1px solid #ddd;
	font-size: 12px;
	line-height: 1.4;
	text-align: center;
	font-weight: 700;
	box-sizing: border-box;
	cursor: pointer;
}

.gt-table-count-options li:hover {
	background: #e0e0e0;
	border-color: #ccc;
}

.gt-table-count-options li.is-selected {
	background: #2271b1;
	border-color: #2271b1;
	color: #fff;
}

/* v0.1.0 (build 190) : message « aucune nouvelle table nécessaire » (voir
 * renderTableCountOptions() dans public-management.js) — texte informatif,
 * pas une option cliquable : distingué des médaillons ci-dessus (fond
 * transparent, pas de curseur pointeur, texte normal). */
.gt-table-count-options li.gt-table-count-options-hint {
	background: transparent;
	border: none;
	cursor: default;
	font-weight: 400;
	font-style: italic;
	color: #666;
	text-align: left;
	padding: 2px 0;
}

.gt-draw-preview-tables {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
	gap: 10px;
	margin: 10px 0;
}

.gt-draw-preview-table {
	border: 1px solid #ddd;
	border-radius: 6px;
	padding: 8px;
	background: #fafafa;
}

.gt-draw-preview-table ul {
	margin: 6px 0 0;
	padding-left: 18px;
}

/* v0.1.0 (build 122) : numéro de siège devant chaque joueur de l'aperçu du
 * tirage (voir renderPreview() dans public-management.js) — atténué, simple
 * repère visuel, pas la donnée principale de la ligne. */
.gt-draw-preview-seat {
	color: #767676;
}

/* v0.1.0 (build 5) : combobox « <select> + bouton » pour choisir une manche.
 * v0.1.0 (build 603) : l'écran de sélection de manche
 * (html-gt-public-round-select.php) est passé à des tuiles/plaques
 * (`.gt-rs-feature` / `.gt-rs-plaque`, voir plus haut) et n'utilise plus
 * `.gt-round-pick-form` — ces règles restent en place pour l'écran
 * intermédiaire « Choisir une structure » (html-gt-public-choose-structure.php),
 * qui garde ce même formulaire GET simple. */
.gt-round-pick-form {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	margin-bottom: 20px;
}

.gt-round-pick-form label {
	font-weight: 600;
}

.gt-round-pick-form select {
	flex: 1 1 420px;
	max-width: 600px;
	padding: 6px 8px;
	font-size: 14px;
}

/* --- Popup de création de manche (v0.1.0 build 8) ---
 * Le formulaire de création n'est plus affiché en permanence sous la
 * combobox : il vit dans une popup modale ouverte par le bouton
 * #gt-open-create-round-btn (voir html-gt-public-round-select.php et
 * public-management.js). */
.gt-modal-overlay {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	background: rgba(0, 0, 0, 0.5);
	display: flex;
	align-items: center;
	justify-content: center;
	z-index: 1000;
	padding: 20px;
	box-sizing: border-box;
}

.gt-modal {
	position: relative;
	background: #fff;
	border-radius: 8px;
	padding: 24px;
	width: 100%;
	max-width: 560px;
	max-height: 90vh;
	overflow-y: auto;
	box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
}

/* v0.1.0 (build 9) : champ Nom nettement plus large que la largeur par
 * défaut d'un <input> (occupe toute la largeur disponible de la popup), et
 * ligne Tournoi + Format côte à côte.
 * v0.1.0 (build 11) : Nom partage désormais sa ligne avec Date (Date à
 * droite, largeur fixe raisonnable ; Nom occupe le reste — sa largeur
 * s'aligne ainsi sur celle de la ligne Tournoi + Format en dessous), et
 * Buy-in est repositionné juste après cette ligne Tournoi + Format. */
.gt-form-row {
	display: flex;
	gap: 16px;
}

.gt-form-row > p {
	flex: 1 1 0;
	margin-top: 0;
}

.gt-form-row select,
.gt-form-row input {
	width: 100%;
	box-sizing: border-box;
}

.gt-field-grow {
	flex: 1 1 auto;
}

.gt-field-date {
	flex: 0 0 160px;
}

/* v0.1.0 (build 12) : astérisque rouge sur les champs obligatoires (label),
 * plus une note « Champs obligatoires » sous chaque formulaire — même
 * convention que le plugin Poker Wallet. */
.gt-required-mark {
	color: #d63638;
	font-weight: 700;
	margin-left: 2px;
}

.gt-required-note {
	font-size: 12px;
	color: #666;
	margin: 8px 0 4px;
}

.gt-required-note .gt-required-mark {
	margin-left: 0;
	margin-right: 4px;
}

/* v0.1.0 (build 450, revu au build 451) : fenêtre « ⚙️ Options » (voir
 * #gt-round-options-modal) — une case à cocher par type de ticket. */
#gt-round-options-skip-confirm-list {
	list-style: none;
	margin: 4px 0 12px;
	padding: 0;
}
#gt-round-options-skip-confirm-list li {
	padding: 4px 0;
	border-bottom: 1px solid #eee;
}

/* v0.1.0 (build 450) : « Options avancées » repliée (fenêtre de création
 * d'une manche, voir html-gt-public-round-select.php) — élément natif
 * <details>, seule la puce/le curseur du <summary> sont personnalisés. */
.gt-advanced-options {
	margin: 10px 0;
	border: 1px solid #dcdcde;
	border-radius: 4px;
	padding: 6px 10px;
}
.gt-advanced-options summary {
	cursor: pointer;
	font-weight: 600;
	font-size: 13px;
}
.gt-advanced-options p {
	margin: 8px 0 2px;
}

/* v0.1.0 (build 596) : liste « Écrans annexes » — voir sa section dans
 * html-gt-public-round-select.php. */
.gt-create-round-annex-screen {
	display: inline-block;
	margin: 2px 0;
}

.gt-modal h3 {
	margin-top: 0;
}

/* v0.1.0 (build 369) : panneau « Historique » (module « Historique de
   tournoi », voir GT_History) — liste chronologique dense, scrollable. */
.gt-history-filter {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0 0 12px;
}

.gt-history-filter select {
	flex: 1;
}

.gt-history-list {
	max-height: 60vh;
	overflow-y: auto;
	border: 1px solid #e2e2e2;
	border-radius: 4px;
}

.gt-history-item {
	display: flex;
	align-items: baseline;
	gap: 10px;
	padding: 8px 12px;
	border-bottom: 1px solid #f0f0f0;
	font-size: 13px;
}

.gt-history-item:last-child {
	border-bottom: none;
}

.gt-history-time {
	flex: 0 0 auto;
	color: #888;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

.gt-history-desc {
	flex: 1 1 auto;
}

.gt-history-author {
	flex: 0 0 auto;
	color: #888;
	font-style: italic;
	white-space: nowrap;
}

/* v0.1.0 (build 384) : badge d'origine — mêmes classes/couleurs que la page
   admin Historique (voir .gt-history-origin-badge dans admin-common.css),
   dupliquées ici (variables --gt-blue-* non partagées avec ce fichier). */
.gt-history-origin-badge {
	display: inline-block;
	margin-left: 6px;
	padding: 1px 7px;
	border-radius: 10px;
	font-size: 10px;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: .02em;
	vertical-align: middle;
}
.gt-history-origin-user {
	background: #eaf1fd;
	color: #14357a;
}
/* v0.1.0 (build 534) : badge « Joueur » — voir même commentaire dans
   admin-common.css. */
.gt-history-origin-player {
	background: #e9f7ef;
	color: #1e7e42;
}
.gt-history-origin-automatic {
	background: #fdeaea;
	color: #b32d2e;
}

.gt-modal-close {
	position: absolute;
	top: 10px;
	right: 14px;
	background: none;
	border: none;
	font-size: 24px;
	line-height: 1;
	cursor: pointer;
	color: #666;
	padding: 4px;
}

.gt-modal-close:hover {
	color: #222;
}

/* v0.1.0 (build 28) : fenêtre de confirmation « Confirmer l'inscription »
 * (#gt-late-reg-confirm-modal), ouverte par-dessus la modale de recherche
 * « Inscription tardive » — plus petite (pas de champ de recherche à
 * afficher), avec une ligne d'actions Valider/Annuler en pied de fenêtre. */
.gt-modal-small {
	max-width: 400px;
}

/* v0.1.0 (build 108) : à la demande de l'utilisateur — fenêtre « Équipes »
 * (#gt-team-modal) élargie à 80% de la largeur du conteneur, plutôt que la
 * largeur par défaut de .gt-modal (max-width: 560px), trop étroite pour ses
 * colonnes « Sans équipe — Classement N » côte à côte dès que le nombre de
 * classements grandit.
 * v0.1.0 (build 109) : ce 80% CSS ci-dessous ne sert plus que de REPLI —
 * .gt-modal-overlay étant en position: fixed (plein écran), il se rapportait
 * en réalité au viewport entier, pas au conteneur de contenu du thème du
 * site (.page-area) visé par l'utilisateur. La largeur réelle (80% de
 * .page-area) est désormais calculée en JS et appliquée en `max-width`
 * inline — voir applyTeamModalWidth() dans public-management.js. */
.gt-modal-wide {
	max-width: 80%;
}

.gt-confirm-seat-text {
	font-size: 15px;
	line-height: 1.5;
}

/* v0.1.0 (build 167) : une ligne par joueur nouvellement placé dans
 * #gt-placement-modal (voir showPlacementModal() dans
 * public-management.js) — même esprit que .gt-duplicate-seat-row
 * ci-dessous, en plus simple (pas de sélecteur d'action). */
.gt-placement-list {
	list-style: none;
	margin: 0 0 16px;
	padding: 0;
	max-height: 300px;
	overflow-y: auto;
}

.gt-placement-list li {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	padding: 8px 0;
	border-bottom: 1px solid #eee;
	font-size: 15px;
}

.gt-placement-list li:last-child {
	border-bottom: none;
}

/* v0.1.0 (build 373) : bouton d'impression manuelle par ligne (voir
 * placementPrintCallback dans public-management.js) — absent (donc pas de
 * flex-shrink à prévoir) sur l'écran de tirage au sort initial. */
.gt-placement-print-btn {
	flex: 0 0 auto;
	background: none;
	border: 1px solid #ccc;
	border-radius: 4px;
	padding: 2px 8px;
	cursor: pointer;
	font-size: 14px;
	line-height: 1.6;
}

.gt-placement-print-btn:hover {
	background: #2271b1;
	border-color: #2271b1;
}

/* v0.1.0 (build 41) : une ligne par joueur en conflit dans
 * #gt-duplicate-seat-modal (voir openDuplicateSeatModal() dans
 * public-management.js) — pseudo à gauche, sélecteur d'action à droite. */
.gt-duplicate-seat-row {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 8px 0;
	border-bottom: 1px solid #eee;
}

.gt-duplicate-seat-row:last-child {
	border-bottom: none;
}

.gt-duplicate-seat-name {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.gt-duplicate-seat-action {
	flex: 0 0 auto;
	max-width: 100%;
}

.gt-modal-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	justify-content: flex-end;
	margin-top: 20px;
}

/* v0.1.0 (build 73) : mode multi-sous-tournoi MTT (parallèle/équipe) — voir
 * Gestion-de-Tournois-Brainstorm.md, section « Cadrage — mode équipe en
 * MTT », et html-gt-public-management.php/public-management.js. */

/* En-tête « Sous-tournoi A »/« Sous-tournoi B » séparant les deux groupes
 * dans le panneau « Joueurs éliminés » (voir renderEliminated()) — même
 * liste que .gt-eliminated-list, un simple séparateur visuel plutôt qu'un
 * joueur. */
.gt-eliminated-list li.gt-subgroup-header {
	display: block;
	background: none;
	border: none;
	padding: 10px 4px 4px;
	font-weight: 700;
	font-size: 12px;
	text-transform: uppercase;
	color: #666;
}
.gt-eliminated-list li.gt-subgroup-header:first-child {
	padding-top: 0;
}

/* Fenêtre « Affecter les classements » (#gt-subgroup-modal) — un joueur par
 * ligne, avec un bouton par classement (1..N) + « — » (voir
 * renderSubgroupModal() dans public-management.js).
 * v0.1.0 (build 94) : #gt-assign-classement-team-list (fenêtre « Affecter
 * [joueur] ») rejoint ce même groupe de sélecteurs — une équipe incomplète
 * par ligne, avec un bouton par classement encore libre dans cette équipe
 * (voir initClassementAssignModal() dans public-management.js).
 * v0.1.0 (build 96) : #gt-assign-classement-unteamed-list rejoint également
 * ce groupe — un joueur sans équipe par ligne (voir même fenêtre).
 * v0.1.0 (build 324) : #gt-remote-qr-classement-team-list/
 * #gt-remote-qr-classement-unteamed-list rejoignent le groupe — même
 * fenêtre « affecter un classement », version télécommande (fenêtre de
 * scan QR, voir renderClassementPicker() dans public-remote.js). Ce
 * fichier (public-management.css) est chargé sur /gt-remote/ en
 * dépendance (voir class-gt-remote-public.php), d'où son rôle partagé. */
#gt-subgroup-list, .gt-team-columns ul, #gt-team-list, #gt-assign-classement-team-list, #gt-assign-classement-unteamed-list, #gt-remote-qr-classement-team-list, #gt-remote-qr-classement-unteamed-list {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
}
/* v0.1.0 (build 85) : à la demande de l'utilisateur — même comportement que
 * .gt-eliminated-list li ci-dessus (nowrap + troncature du nom plutôt que
 * retour à la ligne du bouton), notamment utile pour #gt-team-list dont les
 * noms combinés (« Nom1 (X pts) & Nom2 (Y pts) », voir describeTeamMembers()
 * dans public-management.js) sont plus longs que ceux des autres listes. */
#gt-subgroup-list li, .gt-team-columns li, #gt-team-list li, #gt-assign-classement-team-list li, #gt-assign-classement-unteamed-list li, #gt-remote-qr-classement-team-list li, #gt-remote-qr-classement-unteamed-list li {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	padding: 6px 8px;
	border-bottom: 1px solid #eee;
}

.gt-subgroup-btn {
	font-size: 12px;
	padding: 3px 10px;
	min-width: 32px;
}

/* v0.1.0 (build 94) : boutons « → Classement N » (un par classement encore
 * libre dans l'équipe, voir #gt-assign-classement-team-list ci-dessus) et
 * texte d'état vide (« Aucune équipe incomplète pour l'instant. »).
 * v0.1.0 (build 96) : « Former une équipe » (un joueur sans équipe, voir
 * #gt-assign-classement-unteamed-list ci-dessus) reprend le même style. */
.gt-assign-classement-team-btn, .gt-assign-classement-unteamed-btn {
	font-size: 12px;
	padding: 3px 10px;
}
#gt-assign-classement-team-list li.gt-empty-hint, #gt-assign-classement-unteamed-list li.gt-empty-hint,
#gt-remote-qr-classement-team-list li.gt-empty-hint, #gt-remote-qr-classement-unteamed-list li.gt-empty-hint {
	color: #777;
	font-style: italic;
	border-bottom: none;
}

/* Fenêtre « Former les équipes » (#gt-team-modal) — une colonne par
 * classement (générée dynamiquement, voir renderTeamModal() dans
 * public-management.js) de joueurs encore sans équipe, côte à côte. */
.gt-team-columns {
	display: flex;
	gap: 20px;
	flex-wrap: wrap;
}
.gt-team-columns > div {
	flex: 1 1 220px;
	min-width: 0;
}

/* Joueur sélectionné en attente de former une équipe (sélection multi-
 * colonnes, voir public-management.js). */
.gt-team-columns li.is-selected {
	background: #eaf3ff;
	border-color: #2271b1;
	cursor: pointer;
}
.gt-team-columns li {
	cursor: pointer;
}
/* v0.1.0 (build 107) : à la demande de l'utilisateur — un nom long (ex.
 * « TontonFlingueur ») poussait le bouton « Tirer au sort » à la ligne
 * suivante (`flex-wrap: wrap` hérité du groupe de sélecteurs partagé plus
 * haut, #gt-subgroup-list li, ...). Même principe que #gt-team-list li
 * ci-dessous (build 99) : nom/bouton restent sur une seule ligne, le nom se
 * tronque par ellipsis (title="" restitue le nom complet au survol, voir
 * renderTeamModal() dans public-management.js) plutôt que le bouton. */
.gt-team-columns li {
	flex-wrap: nowrap;
}
.gt-team-columns li .gt-chip-name {
	flex: 1 1 0;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.gt-team-columns li .gt-team-random-btn {
	flex: 0 0 auto;
}

/* v0.1.0 (build 83) : à la demande de l'utilisateur — édition d'une équipe
 * déjà formée (cliquer une équipe de « Équipes formées » puis un joueur d'un
 * classement manquant, voir renderTeamModal()/editingTeamId dans
 * public-management.js). Le classement DÉJÀ couvert par l'équipe en cours
 * d'édition passe en fond rouge et devient inerte (pas de curseur pointeur,
 * clic sans effet), pour visualiser en un coup d'œil dans quel(s)
 * classement(s) restant(s) choisir le membre manquant. */
.gt-team-column-covered {
	background: #fbe9e9;
	border-radius: 6px;
	padding: 4px;
}
.gt-team-column-covered li {
	cursor: not-allowed;
	opacity: 0.6;
}

/* Équipe actuellement en cours d'édition, dans « Équipes formées ». */
#gt-team-list li.is-editing {
	background: #eaf3ff;
	border-color: #2271b1;
}
/* v0.1.0 (build 99) : à la demande de l'utilisateur — pseudos, points et
 * bouton « Dissoudre » doivent rester sur UNE SEULE ligne, même avec des
 * noms d'équipe combinés longs (ex. « Delgres (0 pts) & Cesttoilepluscon
 * (0 pts) »), qui poussaient jusqu'ici « Dissoudre » à la ligne suivante
 * (`flex-wrap: wrap` hérité du groupe de sélecteurs partagé plus haut).
 * Même principe que .gt-eliminated-list li .gt-chip-name ci-dessus : le nom
 * (flex-basis: 0, grandit ensuite pour occuper l'espace restant) se tronque
 * par ellipsis plutôt que de forcer un retour à la ligne ; points/bouton
 * gardent leur largeur naturelle (flex: 0 0 auto). */
#gt-team-list li {
	cursor: pointer;
	flex-wrap: nowrap;
}
#gt-team-list li .gt-chip-name {
	flex: 1 1 0;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
#gt-team-list li .gt-chip-points,
#gt-team-list li .gt-team-dissolve-btn {
	flex: 0 0 auto;
	white-space: nowrap;
}

/* v0.1.0 (build 140) : à la demande de l'utilisateur — le pilotage d'un
 * tournoi n'est pas praticable sur un téléphone (glisser-déposer, plans de
 * table denses…) : au-dessus de 767px (ordinateur/tablette), le contenu
 * normal de l'écran (`.gt-desktop-only`, voir GT_Public::render_shortcode())
 * s'affiche normalement et ce bloc reste masqué ; sous 767px, l'inverse —
 * voir html-gt-public-mobile-block.php pour le contenu et son docblock pour
 * le raisonnement complet (CSS uniquement, pas de détection d'appareil côté
 * serveur). */
.gt-mobile-block {
	display: none;
}

@media (max-width: 767px) {
	.gt-desktop-only {
		display: none !important;
	}

	.gt-mobile-block {
		display: flex;
		min-height: 70vh;
		align-items: center;
		justify-content: center;
		padding: 24px 16px;
		font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	}
}

.gt-mobile-block-card {
	max-width: 420px;
	width: 100%;
	text-align: center;
	background: #fff;
	border: 1px solid #ddd;
	border-radius: 12px;
	padding: 32px 24px;
	box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
}

.gt-mobile-block-suits {
	font-size: 32px;
	letter-spacing: 8px;
	margin-bottom: 12px;
}

.gt-mobile-block-card h2 {
	margin: 0 0 12px;
	font-size: 22px;
	color: #1d2327;
}

.gt-mobile-block-card p {
	margin: 0 0 14px;
	color: #444;
	line-height: 1.5;
}

.gt-mobile-block-cta {
	font-size: 15px;
	color: #1d2327;
}

.gt-mobile-block-card .gt-btn {
	margin-top: 6px;
	width: 100%;
}

/* v0.1.0 (build 208) : panneau de contrôle de la clock live (module « Clock
 * live multi-écrans ») — voir GT_Clock et renderClock() dans
 * public-management.js. Bordure de couleur selon l'état, comme les badges de
 * format (.gt-format-badge) : gris tant que pas démarrée, vert en cours,
 * orange en pause, bleu en phase de fin de structure (compte croissant, pas
 * une alerte — distinct du orange « en attente »).
 */
.gt-clock-panel {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 16px;
	border: 2px solid #ccc;
	border-radius: 8px;
	padding: 12px 16px;
	margin-bottom: 14px;
	background: #fff;
}

.gt-clock-panel.gt-clock-running {
	border-color: #2e8b3f;
}

/* v0.1.0 (build 229) : aperçu (lecture seule) de la répartition des gains —
   voir renderPayout() dans public-management.js.
   v0.1.0 (build 272) : à la demande de l'utilisateur — déplacé tout en haut
   de l'écran (avant le titre de la manche) et rendu repliable (encadré
   cliquable, `.gt-payout-panel-toggle` / `.gt-payout-panel-body`) pour ne
   pas prendre de place quand il n'est pas consulté. */
.gt-payout-panel {
	border: 2px solid #ccc;
	border-radius: 8px;
	margin-bottom: 14px;
	background: #fff;
	overflow: hidden;
}

.gt-payout-panel-toggle {
	display: flex;
	align-items: center;
	justify-content: space-between;
	width: 100%;
	padding: 12px 16px;
	border: none;
	background: none;
	cursor: pointer;
	font: inherit;
	text-align: left;
}

.gt-payout-panel-toggle:hover {
	background: #f5f5f5;
}

.gt-payout-panel-title {
	font-weight: 600;
}

.gt-payout-panel-chevron {
	transition: transform 0.15s ease;
}

.gt-payout-panel-toggle.is-open .gt-payout-panel-chevron {
	transform: rotate(-180deg);
}

/**
 * v0.1.0 (build 273) : à la demande de l'utilisateur — hauteur limitée à une
 * dizaine de lignes une fois l'encadré ouvert (au lieu de repousser tout le
 * reste de l'écran sur une longue structure, ex. 21 places) — le contenu
 * au-delà défile dans l'encadré lui-même (ascenseur).
 */
.gt-payout-panel-body {
	padding: 0 16px 14px;
	max-height: 320px;
	overflow-y: auto;
}

#gt-payout-breakdown-table {
	width: 100%;
	border-collapse: collapse;
}

#gt-payout-breakdown-table th,
#gt-payout-breakdown-table td {
	text-align: left;
	padding: 4px 10px 4px 0;
}

.gt-clock-panel.gt-clock-paused {
	border-color: #dba617;
}

.gt-clock-panel.gt-clock-overtime {
	border-color: #2271b1;
}

.gt-clock-level-info {
	display: flex;
	flex-direction: column;
	min-width: 160px;
	/* v0.1.0 (build 217) : à la demande de l'utilisateur — la clock
	 * (.gt-clock-time ci-dessous) doit être centrée dans le cadre du
	 * panneau, pas simplement collée après ce bloc. `flex-shrink: 0` garde
	 * sa largeur fixée à son contenu pendant que .gt-clock-time devient
	 * flexible (flex: 1) pour occuper tout l'espace restant et centrer son
	 * texte à l'intérieur. */
	flex-shrink: 0;
}

/* v0.1.0 (build 218) : à la demande de l'utilisateur — niveau en cours et
 * blinds agrandis (15px/14px → 22px/19px), pour ressortir davantage face au
 * reste du panneau ; l'aperçu du prochain palier (.gt-clock-next-info,
 * ci-dessous) garde volontairement sa taille d'origine, plus discrète. */
#gt-clock-level-label {
	font-weight: 700;
	font-size: 22px;
	color: #1d2327;
}

/* v0.1.0 (build 544) : conteneur en ligne pour garder le voyant de connexion
 * et le niveau sur une seule ligne malgré le `flex-direction: column` de
 * .gt-clock-level-info (voir html-gt-public-management.php). Nommé
 * différemment de .gt-clock-level-row (liste « Sélectionner un autre
 * niveau », plus bas dans ce fichier) pour éviter toute collision de style
 * (fond bleu/hover hérité par erreur, corrigé après signalement de
 * l'utilisateur). */
.gt-clock-current-level-row {
	display: flex;
	align-items: center;
}

/* v0.1.0 (build 214) : ciblage par id plutôt que `span:last-child` — ce
 * dernier visait #gt-clock-blinds tant qu'il restait le dernier <span> de
 * .gt-clock-level-info, mais #gt-clock-next-info (aperçu du prochain
 * palier, ajouté après lui) en est désormais un troisième, qui aurait
 * sinon hérité à tort de ce style au lieu du sien ci-dessous. */
#gt-clock-blinds {
	font-size: 19px;
	font-weight: 700;
	color: #444;
}

/* Aperçu du prochain palier — plus discret que le niveau en cours
 * (#gt-clock-level-label/#gt-clock-blinds), affiché seulement s'il y en a
 * un (voir renderClock() dans public-management.js). */
.gt-clock-next-info {
	display: none;
	font-size: 12px;
	color: #777;
}

/* v0.1.0 (build 544) : voyant vert/rouge de connexion temps réel — à la
 * demande de l'utilisateur (Réglages → Structures & écrans, « Voyant de
 * connexion »). `display: none` par défaut : le réglage d'affichage peut
 * être coché sans que le relais lui-même le soit (l'élément existe alors
 * dans le DOM, voir html-gt-public-management.php, mais doit rester
 * invisible) — seule la classe `.is-visible`, posée par initClockRealtime()
 * dans public-management.js UNIQUEMENT si `gtManagement.realtimeEnabled`
 * est vrai, le fait apparaître. */
.gt-rt-indicator {
	display: none;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	margin-right: 6px;
	vertical-align: middle;
	background: #ccc;
}
.gt-rt-indicator.is-visible {
	display: inline-block;
}
.gt-rt-indicator[data-state="green"] {
	background: #46b450;
	box-shadow: 0 0 4px rgba(70, 180, 80, .7);
}
.gt-rt-indicator[data-state="red"] {
	background: #dc3232;
	box-shadow: 0 0 4px rgba(220, 50, 50, .7);
}

/* v0.1.0 (build 220) : colonne centrée regroupant le chrono et le badge
 * « Messages prévus » (voir html-gt-public-management.php) — porte
 * désormais le `flex: 1 1 auto` qui occupait auparavant .gt-clock-time
 * directement (voir son commentaire ci-dessous), pour que le badge suive le
 * chrono au centre du cadre plutôt que de rester accroché aux infos de
 * niveau à gauche. */
.gt-clock-time-wrap {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 6px;
	flex: 1 1 auto;
}

/* v0.1.0 (build 219) : bouton « Messages prévus » — visible seulement si la
 * structure active a des messages programmés (voir GT_Clock::
 * describeLevels(), champ `messages`), ouvre #gt-clock-messages-modal.
 * v0.1.0 (build 220) : à la demande de l'utilisateur — repris en pastille
 * orange, même esprit que `.gt-format-badge`/`.gt-format-sng`, plutôt qu'un
 * simple lien texte. */
.gt-clock-messages-badge {
	display: inline-block;
	padding: 3px 10px;
	border: none;
	border-radius: 12px;
	background: #fde3c9;
	color: #9a5b00;
	font-size: 12px;
	font-weight: 600;
	cursor: pointer;
}

.gt-clock-messages-badge:hover {
	background: #f9d2a3;
}

/* v0.1.0 (build 220) : à la demande de l'utilisateur (« fenêtre plus
 * lisible ») — libellés courts au-dessus du texte et des occurrences,
 * texte du message agrandi (14px → 15px, interligne plus large). */
.gt-clock-message-detail-label {
	display: block;
	margin: 14px 0 4px;
	font-size: 12px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: #777;
}

.gt-clock-message-detail-label:first-of-type {
	margin-top: 0;
}

.gt-clock-message-detail-text {
	white-space: pre-wrap;
	background: #f6f7f7;
	border: 1px solid #dcdcde;
	border-radius: 6px;
	padding: 12px 14px;
	font-size: 15px;
	line-height: 1.5;
}

.gt-clock-message-occurrences {
	list-style: disc;
	margin: 4px 0 0 20px;
	padding: 0;
	font-size: 14px;
	line-height: 1.6;
	color: #444;
}

.gt-clock-time {
	font-size: 34px;
	font-weight: 700;
	font-variant-numeric: tabular-nums;
	color: #1d2327;
	min-width: 110px;
	text-align: center;
}

.gt-clock-panel.gt-clock-paused .gt-clock-time {
	color: #dba617;
}

.gt-clock-panel.gt-clock-overtime .gt-clock-time {
	color: #2271b1;
}

/* v0.1.0 (build 215) : à la demande de l'utilisateur — deux rangées de
 * boutons empilées (voir html-gt-public-management.php) plutôt qu'une seule
 * rangée qui s'enroulait de façon peu lisible dès que la clock était
 * démarrée (7 boutons potentiels).
 * v0.1.0 (build 217) : `margin-left: auto` retiré — devenu inutile depuis
 * que .gt-clock-time est flexible (flex: 1, voir son commentaire) : elle
 * pousse déjà ce conteneur à droite en occupant tout l'espace restant.
 * `flex-shrink: 0` gardé pour que ce conteneur ne rétrécisse jamais lui
 * (largeur fixée à celle de ses boutons). */
.gt-clock-controls-wrap {
	display: flex;
	flex-direction: column;
	gap: 8px;
	flex-shrink: 0;
}

.gt-clock-controls {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
	justify-content: flex-end;
}

/* v0.1.0 (build 604) : hors « Mode main par main », la rangée 2 est vide
   (voir applyClockLayout() dans public-management.js) — la masquer pour
   qu'elle ne laisse pas un espace vertical entre les deux autres rangées. */
.gt-clock-controls:empty {
	display: none;
}

/* v0.1.0 (build 604) : « Mode main par main » (à la demande de l'utilisateur).
   Bandeau d'information non fermable, en pleine largeur au-dessus de la clock
   (le panneau est un conteneur flex qui s'enroule : `flex-basis: 100%` +
   `order: -1` le placent seul sur la première ligne, avant les infos de
   niveau, le chrono et les boutons). */
.gt-clock-hbh-banner {
	flex: 0 0 100%;
	order: -1;
	box-sizing: border-box;
	margin: -4px 0 2px;
	padding: 8px 14px;
	border-radius: 6px;
	background: #efe6ff;
	border: 1px solid #c9b3f2;
	color: #4b2e83;
	font-weight: 700;
	font-size: 14px;
	letter-spacing: 0.02em;
	text-align: center;
	text-transform: uppercase;
}

/* Bordure violette du panneau quand le mode est actif, pour le distinguer
   au premier coup d'œil (comme le vert `.gt-clock-running` / l'orange
   `.gt-clock-paused`). */
.gt-clock-panel.gt-clock-hbh {
	border-color: #7c3aed;
}

/* Boutons « ◀ Main précédente » / « Main suivante ▶ » — couleur distincte
   (violet) de tous les autres boutons du panneau, à la demande de
   l'utilisateur. */
.gt-btn.gt-btn-hbh {
	background: #7c3aed;
	border-color: #7c3aed;
	color: #fff;
}

.gt-btn.gt-btn-hbh:hover {
	background: #6d28d9;
	border-color: #6d28d9;
	color: #fff;
}

.gt-btn.gt-btn-hbh:disabled {
	opacity: 0.6;
	cursor: default;
}

/* Toggle « Mode main par main », sous les boutons de navigation entre
   paliers. Aligné à droite comme les rangées de boutons du panneau. */
.gt-clock-hbh-toggle-wrap {
	display: flex;
	justify-content: flex-end;
	width: 100%;
}

.gt-clock-hbh-toggle-btn {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 4px 10px 4px 4px;
	border: 1px solid #c9b3f2;
	border-radius: 999px;
	background: #f6f2ff;
	color: #4b2e83;
	font: inherit;
	font-size: 13px;
	font-weight: 600;
	cursor: pointer;
}

.gt-clock-hbh-toggle-btn:hover {
	background: #ece3ff;
}

.gt-clock-hbh-toggle-track {
	position: relative;
	display: inline-block;
	width: 34px;
	height: 18px;
	border-radius: 999px;
	background: #c9c9d4;
	transition: background 0.15s ease;
	flex-shrink: 0;
}

.gt-clock-hbh-toggle-knob {
	position: absolute;
	top: 2px;
	left: 2px;
	width: 14px;
	height: 14px;
	border-radius: 50%;
	background: #fff;
	box-shadow: 0 1px 2px rgba( 0, 0, 0, 0.3 );
	transition: transform 0.15s ease;
}

.gt-clock-hbh-toggle-btn.is-on .gt-clock-hbh-toggle-track {
	background: #7c3aed;
}

.gt-clock-hbh-toggle-btn.is-on .gt-clock-hbh-toggle-knob {
	transform: translateX( 16px );
}

.gt-clock-edit-time-fields {
	display: flex;
	gap: 12px;
}

.gt-clock-edit-time-fields input {
	width: 80px;
}

/* v0.1.0 (build 210/211) : fenêtre « Sélectionner un autre niveau » — voir
 * openClockSelectLevelModal()/buildClockLevelItem() dans
 * public-management.js. Liste dédiée (pas .gt-search-results, dont le fond
 * bleu au survol couvrirait aussi le panneau de dépliage une fois ouvert). */
.gt-clock-level-list {
	list-style: none;
	margin: 8px 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 6px;
	max-height: 60vh;
	overflow-y: auto;
}

/* v0.1.0 (build 212) : bug signalé par l'utilisateur (capture d'écran) — sans
 * `flex-shrink: 0`, un flex-container en colonne (.gt-clock-level-list
 * ci-dessus) rétrécit ses enfants pour tenir dans `max-height` AVANT de
 * recourir à son `overflow-y: auto` — un palier déplié, plus haut que les
 * autres, se retrouvait donc comprimé sous sa hauteur de contenu réelle par
 * tous les autres <li> (qui rétrécissaient eux aussi, à peine, pour
 * compenser), rognant silencieusement le bas de son panneau déplié (boutons
 * de validation) via `overflow: hidden` ci-dessous plutôt que de faire
 * apparaître la barre de défilement attendue. */
.gt-clock-level-list li {
	border: 1px solid #cddbe8;
	border-radius: 8px;
	overflow: hidden;
	flex-shrink: 0;
}

/* v0.1.0 (build 221) : titre de section (« Ce niveau »/« Niveau suivant »)
 * de la fenêtre « Messages prévus » (voir openClockMessagesModal() dans
 * public-management.js) — un <li> de la même liste, mais sans la bordure/
 * le fond en pilule des messages cliquables ci-dessus : simple texte, non
 * cliquable. */
.gt-clock-messages-section-title {
	border: none;
	padding: 4px 2px 0;
	font-size: 12px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: #777;
}

.gt-clock-messages-section-title:first-child {
	padding-top: 0;
}

.gt-clock-level-row {
	padding: 8px 12px;
	background: #e8eef5;
	font-size: 13px;
	font-weight: 700;
	cursor: pointer;
}

.gt-clock-level-row:hover {
	background: #2271b1;
	color: #fff;
}

/* Palier courant — reste cliquable (redémarre son temps restant à sa durée
 * complète par défaut, modifiable comme n'importe quel autre palier). */
.gt-clock-level-row.gt-clock-level-current {
	background: #eaf2fa;
	border-left: 3px solid #2271b1;
}

.gt-clock-level-row.gt-clock-level-current:hover {
	background: #2271b1;
	color: #fff;
}

/* v0.1.0 (build 236) : ligne d'un tapis déjà pris (Rebuy/Add-on), dans la
 * fenêtre « Ajouter un tapis » — voir openAddStackModal() dans
 * public-management.js. Réutilise .gt-clock-level-row (même liste, même
 * fond/bordure) mais SANS son curseur/survol cliquable : ici seul le bouton
 * « × » agit, pas la ligne entière. */
.gt-add-stack-taken-row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
	cursor: default;
}

.gt-add-stack-taken-row:hover {
	background: #e8eef5;
	color: inherit;
}

.gt-remove-stack-btn {
	flex: 0 0 auto;
	border: none;
	background: transparent;
	color: #d63638;
	font-size: 16px;
	line-height: 1;
	cursor: pointer;
	padding: 0 4px;
}

.gt-remove-stack-btn:hover {
	color: #fff;
	background: #d63638;
	border-radius: 3px;
}

.gt-clock-level-expand {
	padding: 10px 12px;
	background: #fff;
	border-top: 1px solid #cddbe8;
}

.gt-clock-level-expand-actions {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
	margin-top: 8px;
}

/* v0.1.0 (build 223) : fenêtre « Configurer les écrans » (menu « Manche »,
 * module Écrans de tournoi) — réutilise .gt-clock-level-list (bordure/
 * espacement de la liste) pour ses <li>, avec une ligne interne dédiée
 * (poignée + case à cocher) plutôt que le contenu dépliable des paliers de
 * clock. Voir openScreensModal() dans public-management.js. */
.gt-screens-row {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 12px;
	background: #e8eef5;
	font-size: 13px;
}

.gt-screens-handle {
	cursor: grab;
	color: #777;
}

.gt-screens-row label {
	display: flex;
	align-items: center;
	gap: 6px;
	cursor: pointer;
	font-weight: 700;
}

/* v0.1.0 (build 223) : ligne en cours de glisser-déposer — même traitement
 * visuel que les listes admin de ce plugin (voir assets/css/
 * admin-structures.css), première utilisation côté public. */
.gt-row-dragging {
	opacity: 0.4;
	background: #f0f0f1;
}

/* v0.1.0 (build 374) : bug signalé par l'utilisateur (capture d'écran) —
 * ouverte depuis le bouton 🖨️ de #gt-placement-modal (build 373), cette
 * fenêtre s'ouvrait DERRIÈRE lui plutôt que devant : les deux partagent le
 * même z-index (.gt-modal-overlay, 1000), qui départage alors par ordre
 * d'apparition dans le DOM (#gt-placement-modal vient après dans
 * html-gt-public-management.php) plutôt que par ordre d'ouverture réel. Un
 * z-index dédié, plus élevé, la fait toujours passer au-dessus — sans
 * incidence sur son usage normal (seule fenêtre ouverte, la plupart du
 * temps). */
#gt-ticket-print-modal {
	z-index: 1001;
}

/* v0.1.0 (build 593) : #gt-remove-stack-modal s'ouvre PAR-DESSUS
 * #gt-add-stack-modal (voir son docblock dans public-management.js) — même
 * raison/solution que #gt-ticket-print-modal ci-dessus (build 374). */
#gt-remove-stack-modal {
	z-index: 1001;
}

/* v0.1.0 (build 354) : fenêtre « Ticket de caisse » (#gt-ticket-print-modal)
 * — aperçu du ticket avant impression, voir openTicketPrintModal() dans
 * public-management.js. Même esprit que .gt-ticket-preview-frame-wrap côté
 * admin (assets/css/admin-tickets.css), copié ici plutôt que partagé (deux
 * feuilles de style chargées sur des écrans différents, admin/public). */
.gt-ticket-print-frame-wrap {
	background: #e9e9ec;
	border-radius: 6px;
	padding: 16px 0;
	display: flex;
	justify-content: center;
	margin-top: 10px;
}

#gt-ticket-print-frame {
	background: #fff;
	border: 1px solid #dcdcde;
	box-shadow: 0 1px 4px rgba(0, 0, 0, .08);
	min-height: 45vh;
}

/* ==========================================================================
 * v0.1.0 (build 613) : module « Champs personnalisés de manche »
 * (GT_Custom_Field) — modal « ⚙️ Paramètres » à onglets, éditeur de
 * définitions et formulaire « Renseigner les informations » d'un joueur.
 * ========================================================================== */

/* Le modal « Paramètres » reste SOUS les fenêtres legacy (structure/paiement/
 * écrans/options) qu'il déclenche, et SOUS le formulaire joueur. */
#gt-round-settings-modal { z-index: 999; }
#gt-player-custom-values-modal { z-index: 1001; }

.gt-modal.gt-settings-modal { max-width: 780px; }

.gt-settings-layout {
	display: flex;
	gap: 20px;
	margin-top: 12px;
}

.gt-settings-tabs {
	display: flex;
	flex-direction: column;
	gap: 4px;
	flex: 0 0 190px;
	border-right: 1px solid #e0e0e0;
	padding-right: 12px;
}

.gt-settings-tab {
	text-align: left;
	background: none;
	border: 1px solid transparent;
	border-radius: 6px;
	padding: 8px 10px;
	cursor: pointer;
	font-size: 13px;
	color: #1d2327;
}

.gt-settings-tab:hover { background: #f0f0f1; }

.gt-settings-tab.is-active {
	background: #2271b1;
	color: #fff;
}

.gt-settings-panes {
	flex: 1 1 auto;
	min-width: 0;
}

.gt-settings-hint { color: #646970; }

/* build 614 : les 4 réglages « legacy » (Structure de blinds / de paiement,
   Écrans, Options de la manche) sont désormais des panneaux de cette fenêtre
   plutôt qu'une seconde modale — cadrage des titres déplacés. */
.gt-settings-pane > h4:first-child { margin-top: 0; }
.gt-settings-pane h5 { margin: 14px 0 4px; }

/* --- Éditeur de définitions --- */

.gt-cf-row {
	border: 1px solid #dcdcde;
	border-radius: 8px;
	padding: 8px 12px;
	margin-bottom: 8px;
	background: #fbfbfc;
}

/* build 615 : chaque champ est un panneau pliable — en-tête cliquable
   (libellé du champ) à gauche, actions monter/descendre/supprimer à droite ;
   la grille d'édition (.gt-cf-row-grid) n'est visible que si .is-open. */
.gt-cf-row-head {
	display: flex;
	align-items: center;
	gap: 8px;
	justify-content: space-between;
}

.gt-cf-row.is-open .gt-cf-row-head {
	margin-bottom: 10px;
}

.gt-cf-row-toggle {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 4px 0;
	border: 0;
	background: none;
	font: inherit;
	font-weight: 600;
	color: #1d2327;
	text-align: left;
	cursor: pointer;
}

.gt-cf-row-caret {
	flex: 0 0 auto;
	font-size: 11px;
	color: #646970;
	transition: transform .15s ease;
}

.gt-cf-row.is-open .gt-cf-row-caret {
	transform: rotate( 90deg );
}

.gt-cf-row-title {
	overflow: hidden;
	white-space: nowrap;
	text-overflow: ellipsis;
}

.gt-cf-row-title.is-empty {
	font-weight: 400;
	font-style: italic;
	color: #8c8f94;
}

.gt-cf-row-actions {
	flex: 0 0 auto;
	display: flex;
	gap: 4px;
}

.gt-cf-row:not( .is-open ) .gt-cf-row-grid {
	display: none;
}

.gt-cf-mini {
	border: 1px solid #c3c4c7;
	background: #fff;
	border-radius: 4px;
	width: 26px;
	height: 26px;
	line-height: 1;
	cursor: pointer;
}

.gt-cf-mini-danger { color: #b32d2e; border-color: #f0c0c0; }

.gt-cf-row-grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 10px 14px;
}

.gt-cf-field { display: flex; flex-direction: column; font-size: 12px; }
.gt-cf-field > span { font-weight: 600; margin-bottom: 3px; color: #3c434a; }
.gt-cf-field input[type="text"],
.gt-cf-field select,
.gt-cf-field textarea { width: 100%; box-sizing: border-box; }

.gt-cf-options-wrap { grid-column: 1 / -1; }
.gt-cf-req { display: flex; align-items: center; gap: 6px; font-size: 12px; }
.gt-cf-req-hint { grid-column: 1 / -1; margin: -2px 0 0; font-style: italic; }

.gt-cf-copy-row {
	display: flex;
	align-items: flex-end;
	gap: 10px;
	margin: 14px 0;
	flex-wrap: wrap;
}
.gt-cf-copy-row label { font-size: 12px; }
.gt-cf-copy-row select { min-width: 220px; }

.gt-cf-danger {
	margin-top: 16px;
	padding-top: 12px;
	border-top: 1px dashed #e0a0a0;
}


/* --- Formulaire « Renseigner les informations » --- */

.gt-cf-pv-field { margin-bottom: 14px; }
.gt-cf-pv-field > label { display: block; }
.gt-cf-pv-label { display: block; font-weight: 600; margin-bottom: 3px; }
.gt-cf-pv-desc { display: block; font-weight: 400; font-size: 12px; color: #646970; margin-bottom: 4px; }
.gt-cf-pv-field .gt-cf-pv-input:not([type="checkbox"]):not([type="radio"]) { width: 100%; box-sizing: border-box; }
.gt-cf-pv-choices { display: flex; flex-direction: column; gap: 4px; }
.gt-cf-pv-choice { display: flex; align-items: center; gap: 6px; font-weight: 400; }

/* build 628 : bloc « Buy-in » en tête du formulaire (sélecteur + montant
   variable), séparé des champs personnalisés par un filet. */
.gt-cf-pv-buyin { margin-bottom: 14px; padding-bottom: 12px; border-bottom: 1px solid #dcdcde; }
.gt-cf-pv-buyin > label { display: block; }
.gt-cf-pv-buyin .gt-cf-pv-input { width: 100%; box-sizing: border-box; }
.gt-cf-pv-buyin-amount-wrap { display: block; margin-top: 8px; }

/* Toggle : case + libellé sur une seule ligne, description en dessous. */
.gt-cf-pv-field[data-type="toggle"] > label { display: flex; align-items: center; gap: 8px; }
.gt-cf-pv-field[data-type="toggle"] .gt-cf-pv-label { display: inline; margin: 0; }
.gt-cf-pv-field[data-type="toggle"] .gt-cf-pv-input { margin: 0; flex: 0 0 auto; }
.gt-cf-pv-field[data-type="toggle"] .gt-cf-pv-desc { margin: 3px 0 0; }

/* --- Petit bouton « 📝 Infos » des joueurs éliminés --- */
.gt-cf-edit-btn { white-space: nowrap; }

@media (max-width: 640px) {
	.gt-settings-layout { flex-direction: column; }
	.gt-settings-tabs {
		flex-direction: row;
		flex-wrap: wrap;
		border-right: none;
		border-bottom: 1px solid #e0e0e0;
		padding-right: 0;
		padding-bottom: 10px;
	}
	.gt-cf-row-grid { grid-template-columns: 1fr; }
}
