/* ==========================================================================
   OvniShell - theme de navigation lateral pour Dolibarr
   Bleu marine #0A1E78 et orange #F76500 par defaut (reglables dans la configuration du module).

   Organisation de la feuille :
     1. Palette et correspondance avec les variables du theme de base
     2. Typographie
     3. Habillage des composants Dolibarr (titres, tableaux, boutons, champs, bandeaux)
     4. Coque : barre laterale, barre d'onglets du haut, zone de contenu
     5. Adaptation aux petits ecrans et a l'impression

   Les regles de la coque sont toutes prefixees par `html.ovs-js` : cette classe n'est posee que si la page affiche
   un menu (script d'en-tete du module), donc une fenetre sans menu garde sa mise en page d'origine.
   ========================================================================== */

/* --- 1. Palette ----------------------------------------------------------- */
:root {
	--ovs-navy: #0A1E78;
	--ovs-navy-dark: #061247;
	--ovs-navy-deep: #04113F;
	--ovs-accent: #F76500;
	--ovs-accent-ink: #9C4000;
	--ovs-accent-soft: #FFF1E6;

	--ovs-ink: #12182B;
	--ovs-ink-muted: #4E5769;
	--ovs-paper: #FFFFFF;
	--ovs-surface: #F4F6FB;
	--ovs-surface-alt: #EAEEF7;
	--ovs-border: #D3DAE8;
	--ovs-border-strong: #B4BFD4;
	--ovs-on-navy: #FFFFFF;
	--ovs-on-navy-muted: #C3CCF0;

	--ovs-ok: #0B6E3F;
	--ovs-ok-soft: #E7F5ED;
	--ovs-warn: #8A5200;
	--ovs-warn-soft: #FDF3E2;
	--ovs-danger: #A81C16;
	--ovs-danger-soft: #FBEBEA;
	--ovs-info: #0A4E8A;
	--ovs-info-soft: #E8F1FA;
	--ovs-disabled-soft: #EEF1F7;
	--ovs-disabled-ink: #5A6478;

	--ovs-font: 'Roboto', system-ui, -apple-system, 'Segoe UI', sans-serif;
	--ovs-radius: 6px;
	--ovs-radius-lg: 10px;
	--ovs-shadow: 0 1px 2px rgba(6, 18, 71, .06), 0 2px 8px rgba(6, 18, 71, .06);
	--ovs-shadow-pop: 0 18px 44px rgba(6, 18, 71, .20), 0 2px 8px rgba(6, 18, 71, .08);
	--ovs-halo: 0 0 0 3px rgba(10, 30, 120, .14);

	--ovs-side-w: 248px;
	--ovs-topbar-h: 56px;

	/* Variables du theme de base reaffectees a la charte : c'est ce bloc qui rhabille l'application. */
	--colorbackhmenu1: var(--ovs-paper);
	--colortextbackhmenu: var(--ovs-ink-muted);
	--colorbackvmenu1: var(--ovs-surface);
	--colortextbackvmenu: var(--ovs-ink);
	--colorbacktitle1: var(--ovs-surface-alt);
	--colortexttitle: var(--ovs-navy);
	--colortexttitlelink: var(--ovs-navy);
	--colortexttitlenotab: var(--ovs-navy);
	--colortexttitlenotab2: var(--ovs-navy);
	--colorbacktabcard1: var(--ovs-paper);
	--colorbacktabactive: var(--ovs-paper);
	--colortextbacktab: var(--ovs-ink);
	--colorbacklineimpair1: var(--ovs-paper);
	--colorbacklineimpair2: var(--ovs-paper);
	--colorbacklinepair1: var(--ovs-surface);
	--colorbacklinepair2: var(--ovs-surface);
	--colorbacklinepairhover: var(--ovs-surface-alt);
	--colorbacklinepairchecked: var(--ovs-accent-soft);
	--colorbacklinebreak: var(--ovs-surface-alt);
	--colorbackbody: var(--ovs-paper);
	--colorbackgrey: var(--ovs-surface);
	--colorbackmobilemenu: var(--ovs-surface);
	--colortext: var(--ovs-ink);
	--colortextlink: var(--ovs-navy);
	--colortopbordertitle1: var(--ovs-navy);
	--colorboxstatsborder: var(--ovs-border);
	--colorboxiconbg: var(--ovs-surface-alt);
	--inputbordercolor: var(--ovs-border);
	--oddevencolor: var(--ovs-ink);
	--listetotal: var(--ovs-ink-muted);
	--refidnocolor: var(--ovs-ink-muted);
	--tableforfieldcolor: var(--ovs-ink-muted);
	--fieldrequiredcolor: var(--ovs-accent-ink);
	--amountremaintopaycolor: var(--ovs-danger);
	--amountpaymentcomplete: var(--ovs-ok);
	--tablevalidbgcolor: var(--ovs-warn-soft);
	--tooltipbgcolor: var(--ovs-navy-dark);
	--tooltipfontcolor: var(--ovs-on-navy);
	--infoboxmoduleenabledbgcolor: var(--ovs-ok-soft);
	--butactionbg: var(--ovs-navy);
	--textbutaction: var(--ovs-on-navy);
	--butactiondeletebg: var(--ovs-danger-soft);
}

/* --- 2. Typographie : une seule fonte, servie par le module ---------------- */
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 300 700;
	font-display: swap;
	src: url(../fonts/roboto-latin-ext.woff2) format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Roboto';
	font-style: normal;
	font-weight: 300 700;
	font-display: swap;
	src: url(../fonts/roboto-latin.woff2) format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

body,
body * {
	font-family: var(--ovs-font) !important;
}
body {
	font-size: 14px;
	color: var(--ovs-ink);
	background: var(--ovs-paper);
	-webkit-font-smoothing: antialiased;
}
/* Les icones gardent leur propre fonte. */
.fa, .fas, .far, .fab, .fal, .fad, .fa-solid, .fa-regular, .fa-brands,
[class^="fa-"], [class*=" fa-"],
.fa::before, .fas::before, .far::before, .fab::before,
[class^="fa-"]::before, [class*=" fa-"]::before,
.dropdown-toggle::after, .dropdown-item::before, .a-filter::before, .a-mesure::before {
	font-family: "Font Awesome 5 Free" !important;
}
.fab, .fab::before { font-family: "Font Awesome 5 Brands" !important; }

/* --- 3. Habillage des composants ------------------------------------------ */
div.fiche { background: var(--ovs-paper); }

.titre, .nowraponall .titre, div.titre, span.titre {
	color: var(--ovs-navy);
	font-weight: 500;
}

div.tabBar {
	background: var(--ovs-paper);
	border: 1px solid var(--ovs-border);
	border-radius: var(--ovs-radius-lg);
	box-shadow: var(--ovs-shadow);
}
a.tab, a.tabactive, span.tab { border-radius: var(--ovs-radius) var(--ovs-radius) 0 0; }
a.tabactive, a.tab#active {
	color: var(--ovs-navy) !important;
	border-bottom: 3px solid var(--ovs-accent) !important;
	font-weight: 500;
}

tr.liste_titre, tr.liste_titre_filter, .liste_titre {
	background: var(--ovs-surface-alt);
	color: var(--ovs-navy);
	font-weight: 500;
}
table.liste, table.noborder {
	border-collapse: separate;
	border-spacing: 0;
	border: 1px solid var(--ovs-border);
	border-radius: var(--ovs-radius-lg);
	overflow: clip;   /* arrondit les angles sans devenir un cadre de defilement (sinon l'entete ne peut plus se figer) */
}
tr.oddeven:hover td { background: var(--ovs-surface-alt); }

/* Infobulles : fond marine, tout leur contenu doit y rester lisible. */
div.ui-tooltip.mytooltip,
div.ui-tooltip.mytooltip * { color: var(--ovs-on-navy) !important; }
div.ui-tooltip.mytooltip .opacitymedium,
div.ui-tooltip.mytooltip .opacitymedium * { color: var(--ovs-on-navy-muted) !important; }
div.ui-tooltip.mytooltip a,
div.ui-tooltip.mytooltip a:link, div.ui-tooltip.mytooltip a:visited,
div.ui-tooltip.mytooltip a:hover, div.ui-tooltip.mytooltip a:active,
div.ui-tooltip.mytooltip a * { color: var(--ovs-accent) !important; }
div.ui-tooltip.mytooltip a:hover { text-decoration: underline; }

/* Boutons : les selecteurs sont aussi precis que ceux du theme de base (btn.inc.php), sinon ils perdent. */
.butAction,
a.butAction:link, a.butAction:visited, a.butAction:hover, a.butAction:active, a.butAction:focus,
span.butAction, input.butAction, button.butAction,
.button:not(.bordertransp):not(.buttonpayment),
a.button:not(.bordertransp):not(.buttonpayment),
input.button:not(.bordertransp):not(.buttonpayment),
button.button:not(.bordertransp):not(.buttonpayment) {
	background: var(--ovs-navy);
	background-image: none;
	color: var(--ovs-on-navy);
	border: 1px solid var(--ovs-navy);
	border-radius: var(--ovs-radius);
	box-shadow: none;
	text-transform: none;
	font-weight: 500;
	text-shadow: none;
}
.butAction:hover,
a.butAction:link:hover, a.butAction:visited:hover, a.butAction:hover, a.butAction:active,
button.butAction:hover, input.butAction:hover,
.button:not(.bordertransp):not(.buttonpayment):hover,
a.button:not(.bordertransp):not(.buttonpayment):hover,
input.button:not(.bordertransp):not(.buttonpayment):hover,
button.button:not(.bordertransp):not(.buttonpayment):hover {
	background: var(--ovs-navy-dark);
	background-image: none;
	border-color: var(--ovs-navy-dark);
	color: var(--ovs-on-navy);
	box-shadow: none;
}

.butActionDelete,
a.butActionDelete:link, a.butActionDelete:visited, a.butActionDelete:active, a.butActionDelete:focus,
span.butActionDelete, input.butActionDelete, button.butActionDelete,
.buttonDelete, a.buttonDelete:link, a.buttonDelete:visited, input.buttonDelete, button.buttonDelete {
	background: var(--ovs-danger-soft) !important;
	background-image: none !important;
	color: var(--ovs-danger) !important;
	border: 1px solid var(--ovs-danger);
	border-radius: var(--ovs-radius);
	box-shadow: none;
	text-transform: none;
	font-weight: 500;
	text-shadow: none;
}
.butActionDelete:hover, .butActionDelete:focus-visible,
a.butActionDelete:link:hover, a.butActionDelete:visited:hover, a.butActionDelete:hover,
input.butActionDelete:hover, button.butActionDelete:hover,
.buttonDelete:hover, a.buttonDelete:hover, input.buttonDelete:hover, button.buttonDelete:hover {
	background: var(--ovs-danger) !important;
	background-image: none !important;
	color: var(--ovs-on-navy) !important;
	border-color: var(--ovs-danger);
}

div.tabsAction a.butActionNew:link, div.tabsAction a.butActionNew:visited,
div.tabsAction a.butActionNew:hover, div.tabsAction a.butActionNew:active, div.tabsAction a.butActionNew:focus {
	background: var(--ovs-accent-soft);
	background-image: none;
	color: var(--ovs-accent-ink);
	border: 1px solid var(--ovs-accent-ink);
	border-radius: var(--ovs-radius);
	box-shadow: none;
	text-transform: none;
	font-weight: 500;
	text-shadow: none;
}
div.tabsAction a.butActionNew:link:hover, div.tabsAction a.butActionNew:visited:hover, div.tabsAction a.butActionNew:hover {
	background: var(--ovs-accent);
	color: var(--ovs-navy-deep);
	border-color: var(--ovs-accent);
}

/* Boutons de changement de statut d'un ticket (a.butAction.butStatus) : le theme de base impose `a.butStatus { color: ... !important }`,
   ce qui rendait le libelle sombre sur le fond marine du bouton (illisible). Le point de statut, etire en barre par le style des pastilles,
   redevient un point. */
a.butAction.butStatus, a.butAction.butStatus:link, a.butAction.butStatus:visited, a.butAction.butStatus:hover, a.butAction.butStatus:active, a.butAction.butStatus:focus {
	color: var(--ovs-on-navy) !important;
}
html.ovs-js span.badge.badge-dot {
	width: 9px; height: 9px; min-width: 9px; padding: 0; border-radius: 50%; vertical-align: middle;
	background: currentColor !important; border: 1px solid rgba(255, 255, 255, .75) !important;
}

.butActionRefused, .butActionNewRefused, .buttonRefused,
a.butActionRefused:link, a.butActionRefused:visited, a.butActionRefused:hover, a.butActionRefused:active, a.butActionRefused:focus,
a.butActionNewRefused:link, a.butActionNewRefused:visited, a.butActionNewRefused:hover,
span.butActionRefused, input.butActionRefused, button.butActionRefused,
.button:disabled, .buttonDelete:disabled, .button.disabled, .buttonDelete.disabled,
input.button:disabled, button.button:disabled,
.butAction[disabled], .butActionDelete[disabled] {
	background: var(--ovs-disabled-soft) !important;
	background-image: none !important;
	color: var(--ovs-disabled-ink) !important;
	border: 1px solid var(--ovs-border);
	border-radius: var(--ovs-radius);
	box-shadow: none;
	text-transform: none;
	font-weight: 500 !important;
	text-shadow: none;
	text-decoration: none !important;
	cursor: not-allowed !important;
	opacity: 1;
}

.button.buttonreset, a.button.buttonreset:link, a.button.buttonreset:visited,
a.button.buttonreset:hover, a.button.buttonreset:active, a.button.buttonreset:focus {
	background: var(--ovs-paper);
	background-image: none;
	color: var(--ovs-ink);
	border: 1px solid var(--ovs-border-strong);
}

.butAction:focus-visible, .butActionDelete:focus-visible, .butActionRefused:focus-visible, .butActionNew:focus-visible,
.button:focus-visible, .buttonDelete:focus-visible,
a.butAction:focus-visible, a.butActionDelete:focus-visible, a.butActionNew:focus-visible,
a.button:focus-visible, input.button:focus-visible, button.button:focus-visible {
	outline: 2px solid var(--ovs-navy);
	outline-offset: 2px;
	box-shadow: none;
}

input[type=text], input[type=password], input[type=email], input[type=number],
input[type=search], input[type=date], textarea, select, .select2-selection {
	border: 1px solid var(--ovs-border) !important;
	border-radius: var(--ovs-radius) !important;
	background: var(--ovs-paper);
	color: var(--ovs-ink);
}
input:focus, textarea:focus, select:focus {
	outline: none;
	border-color: var(--ovs-navy) !important;
	box-shadow: var(--ovs-halo);
}

a, a:link, a:visited { color: var(--ovs-navy); }
a:hover { color: var(--ovs-accent-ink); }

div.ok, .ok { color: var(--ovs-ok); }
div.warning, .warning { color: var(--ovs-warn); }
div.error, .error { color: var(--ovs-danger); }
div.info, div.mesgs, div.jnotify-notification-info {
	background: var(--ovs-info-soft) !important;
	color: var(--ovs-ink) !important;
	border-left: 3px solid var(--ovs-info) !important;
	border-radius: var(--ovs-radius);
}
div.error, div.errors, div.jnotify-notification-error {
	background: var(--ovs-danger-soft) !important;
	color: var(--ovs-ink) !important;
	border-left: 3px solid var(--ovs-danger) !important;
	border-radius: var(--ovs-radius);
}

/* --- 4. Coque : barre laterale + barre d'onglets -------------------------- */

/* 4.1 Mise en page generale. L'ancienne colonne de gauche est gardee dans la page (le script y lit les entrees)
   mais masquee, ainsi que la liste horizontale d'origine. */
html.ovs-js body { padding-left: var(--ovs-side-w); background: var(--ovs-paper); }
html.ovs-js.ovs-collapsed { --ovs-side-w: 76px; }
html.ovs-js #id-left,
html.ovs-js #id-top #tmenu_tooltip,
html.ovs-js .ovni-brand,
html.ovs-js .ovni-rail { display: none !important; }
html.ovs-js #id-container { display: block; width: auto; }
html.ovs-js #id-right {
	display: block;
	width: auto;
	padding: 20px 24px 36px;
	box-sizing: border-box;
}
html.ovs-js .side-nav { display: none; }
/* Les marges laterales de Dolibarr (42 px et 38 px) supposaient une colonne de gauche : la barre laterale les remplace. */
html.ovs-js div.fiche { margin-left: 0; margin-right: 0; }
@media (min-width: 901px) {
	html.ovs-js body, html.ovs-js #id-sidebar-anim { transition: padding-left .2s ease; }
}

/* 4.2 Barre du haut : onglets a gauche, outils a droite. */
html.ovs-js #id-top {
	position: sticky;
	top: 0;
	z-index: 1050;
	display: flex;
	align-items: stretch;
	gap: 8px;
	height: var(--ovs-topbar-h);
	padding: 0 20px 0 12px;
	background: var(--ovs-paper) !important;
	border-bottom: 1px solid var(--ovs-border);
	box-shadow: 0 1px 3px rgba(6, 18, 71, .05);
	box-sizing: border-box;
}
html.ovs-js div.login_block {
	position: static;
	display: flex;
	align-items: center;
	flex: 0 0 auto;
	gap: 4px;
	margin-left: auto;
	height: 100%;
	max-width: none;
	min-width: 0;
	width: auto;
	padding: 0;
	line-height: 1.2;
	text-align: left;
	background: transparent;
	transition: none;
}
html.ovs-js div.login_block .login_block_other,
html.ovs-js div.login_block .login_block_user {
	display: flex;
	align-items: center;
	gap: 2px;
	height: 100%;
}
html.ovs-js div.login_block .login_block_other > .inline-block { display: flex; align-items: center; }
html.ovs-js div.login_block .login_block_user > .login_block_elem { display: flex !important; align-items: center; width: auto !important; }
html.ovs-js div.login_block .login_block_elem { padding: 0 !important; margin: 0; }
html.ovs-js div.login_block a,
html.ovs-js div.login_block a:link,
html.ovs-js div.login_block a:visited { color: var(--ovs-ink-muted); }
html.ovs-js div.login_block a:hover { color: var(--ovs-navy); }
html.ovs-js div.login_block span.aversion { color: var(--ovs-ink-muted); filter: none; opacity: .8; margin: 0 4px; }
html.ovs-js div.login_block .atoplogin,
html.ovs-js div.login_block a > .fa,
html.ovs-js div.login_block a > .fas {
	color: var(--ovs-ink-muted);
	font-size: 16px;
	padding: 8px;
	border-radius: 8px;
	transition: background .15s, color .15s;
}
html.ovs-js div.login_block a:hover .atoplogin,
html.ovs-js div.login_block a:hover > .fa,
html.ovs-js div.login_block a:hover > .fas { background: var(--ovs-surface-alt); color: var(--ovs-navy); }
html.ovs-js div.login_block .userimg a.dropdown-toggle {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 4px 8px 4px 4px;
	border-radius: 999px;
	color: var(--ovs-ink);
}
html.ovs-js div.login_block .userimg a.dropdown-toggle:hover { background: var(--ovs-surface-alt); }
html.ovs-js div.login_block .userimg img.photouserphoto { width: 32px; height: 32px; margin: 0; }
/* Le nom de l'utilisateur n'est pas affiche dans la barre (il reste dans le menu de l'avatar et pour les lecteurs d'ecran). */
html.ovs-js div.login_block .atoploginusername {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
}
html.ovs-js div.login_block .userimg a.dropdown-toggle { gap: 0; padding: 4px; }
html.ovs-js div.login_block .dropdown-menu {
	right: 0;
	left: auto;
	top: calc(100% + 6px);
	margin-top: 0 !important;
	border: 1px solid var(--ovs-border);
	border-radius: 12px !important;
	box-shadow: var(--ovs-shadow-pop);
	overflow: hidden;
	z-index: 1300;
}
html.ovs-js div.login_block .logout-btn { display: none; }
html.ovs-js div.login_block.usedropdown .logout-btn { display: none; }

/* Recherche globale deplacee du menu de gauche vers la barre du haut. */
html.ovs-js .ovs-search { display: flex; align-items: center; flex: 0 0 auto; margin: 0 6px; }
html.ovs-js .ovs-search .blockvmenusearch { padding: 0; margin: 0; width: auto; }
html.ovs-js .ovs-search .select2-container { width: clamp(140px, 12vw, 230px) !important; }
html.ovs-js .ovs-search .select2-selection { height: 36px; background: var(--ovs-surface); border-radius: 999px !important; display: flex; align-items: center; }
html.ovs-js .ovs-search .select2-selection__rendered { line-height: 34px; padding-left: 14px; }
html.ovs-js .ovs-search .select2-selection__arrow { height: 34px; }

/* 4.3 Onglets : liste horizontale, defilable sur ecran etroit. */
html.ovs-js #ovs-tabs {
	display: flex;
	align-items: stretch;
	flex: 1 1 auto;
	min-width: 0;
	gap: 2px;
	overflow: hidden;
	margin: 0;
	padding: 0;
	list-style: none;
}
html.ovs-js #ovs-tabs > li.is-hidden, html.ovs-js #ovs-tabs > li[hidden] { display: none !important; }
html.ovs-js #ovs-tabs > li { display: flex; flex: 0 0 auto; margin: 0; padding: 0; }
.ovs-tab {
	position: relative;
	display: flex;
	align-items: center;
	gap: 7px;
	padding: 0 14px;
	color: var(--ovs-ink-muted) !important;
	font-size: 14px;
	font-weight: 500;
	text-decoration: none !important;
	white-space: nowrap;
	border-bottom: 3px solid transparent;
	box-sizing: border-box;
	transition: color .15s, background .15s, border-color .15s;
}
.ovs-tab:hover, .ovs-tab.is-open { color: var(--ovs-navy) !important; background: var(--ovs-surface); }
.ovs-tab.is-active { color: var(--ovs-navy) !important; font-weight: 600; border-bottom-color: var(--ovs-accent); }
.ovs-tab:focus-visible { outline: 2px solid var(--ovs-navy); outline-offset: -3px; border-radius: 8px; }
.ovs-tab .ovs-tab-ico, .ovs-tab .ovs-tab-ico * { color: inherit !important; font-size: 14px; opacity: .85; margin: 0 !important; }
.ovs-caret { font-size: 9px !important; opacity: .55; transition: transform .15s; margin-left: 1px; }
.ovs-tab.is-open .ovs-caret { transform: rotate(180deg); opacity: .9; }

/* Sous-entrees : fenetre flottante positionnee par le script (jamais rognee par la barre defilante). */
#ovs-pop {
	position: fixed;
	z-index: 1250;
	display: none;
	min-width: 230px;
	max-width: min(360px, calc(100vw - 16px));
	max-height: calc(100vh - var(--ovs-topbar-h) - 20px);
	overflow-y: auto;
	overscroll-behavior: contain;
	padding: 8px;
	background: var(--ovs-paper);
	border: 1px solid var(--ovs-border);
	border-radius: 14px;
	box-shadow: var(--ovs-shadow-pop);
	box-sizing: border-box;
	opacity: 0;
	transform: translateY(-4px);
	transition: opacity .12s ease, transform .12s ease;
}
#ovs-pop.is-shown { display: block; }
#ovs-pop.is-visible { opacity: 1; transform: none; }
#ovs-pop a, #ovs-pop span.ovs-pop-off {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 8px 12px 8px calc(12px + var(--lvl, 0) * 18px);
	border-radius: 9px;
	color: var(--ovs-ink) !important;
	font-size: 14px;
	line-height: 1.25;
	text-decoration: none !important;
}
#ovs-pop a:hover, #ovs-pop a:focus-visible { background: var(--ovs-surface-alt); color: var(--ovs-navy) !important; outline: none; }
#ovs-pop a.is-current { background: var(--ovs-accent-soft); color: var(--ovs-accent-ink) !important; font-weight: 500; }
#ovs-pop a.is-lvl::before, #ovs-pop span.is-lvl::before {
	content: "";
	flex: 0 0 auto;
	width: 6px;
	height: 6px;
	border-radius: 50%;
	background: var(--ovs-border-strong);
}
#ovs-pop a.is-lvl, #ovs-pop span.is-lvl { font-size: 13px; color: var(--ovs-ink-muted) !important; }
#ovs-pop a.is-lvl:hover { color: var(--ovs-navy) !important; }
#ovs-pop span.ovs-pop-off { color: var(--ovs-disabled-ink) !important; cursor: not-allowed; }
#ovs-pop .ovs-pop-head {
	padding: 4px 12px 8px;
	margin-bottom: 4px;
	border-bottom: 1px solid var(--ovs-border);
	color: var(--ovs-ink-muted);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: .08em;
	text-transform: uppercase;
}
#ovs-pop a.ovs-pop-head { display: block; text-decoration: none; cursor: pointer; }
#ovs-pop a.ovs-pop-head:hover { color: var(--ovs-navy); }

/* 4.4 Barre laterale. */
#ovs-sidebar {
	position: fixed;
	z-index: 1100;
	top: 0;
	bottom: 0;
	left: 0;
	width: var(--ovs-side-w);
	display: flex;
	flex-direction: column;
	background: linear-gradient(180deg, var(--ovs-navy) 0%, var(--ovs-navy-dark) 100%);
	color: var(--ovs-on-navy);
	box-sizing: border-box;
	transition: width .2s ease, transform .22s ease;
}
.ovs-brand {
	display: flex;
	align-items: center;
	gap: 11px;
	flex: 0 0 auto;
	height: var(--ovs-topbar-h);
	padding: 0 16px;
	border-bottom: 1px solid rgba(255, 255, 255, .10);
	color: var(--ovs-on-navy) !important;
	text-decoration: none !important;
	overflow: hidden;
	box-sizing: border-box;
}
.ovs-brand-logo {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	height: 34px;
	max-width: 150px;
	padding: 3px 8px;
	background: #fff;
	border-radius: 9px;
	box-sizing: border-box;
}
.ovs-brand-logo img { display: block; max-width: 100%; max-height: 28px; width: auto; height: auto; }
.ovs-brand-logo--square { display: none; width: 40px; padding: 3px; }
/* Logo OvniSoft livre avec le module : blanc sur la barre foncee, sans pastille. */
.ovs-brand-logo--bare { height: 38px; max-width: 190px; padding: 0; background: none; border-radius: 0; }
.ovs-brand-logo--bare img { max-height: 38px; }
.ovs-brand-logo--square.ovs-brand-logo--bare { width: 38px; }
.ovs-brand-name {
	min-width: 0;
	overflow: hidden;
	font-size: 15px;
	font-weight: 700;
	letter-spacing: .01em;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.ovs-brand-mark {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 34px;
	height: 34px;
	border-radius: 9px;
	background: var(--ovs-accent);
	color: var(--ovs-navy-deep);
	font-weight: 800;
	font-size: 16px;
}
#ovs-nav {
	flex: 1 1 auto;
	min-height: 0;
	overflow-x: hidden;
	overflow-y: auto;
	padding: 14px 10px;
	scrollbar-width: thin;
	scrollbar-color: rgba(255, 255, 255, .25) transparent;
}
#ovs-nav ul { display: flex; flex-direction: column; gap: 3px; margin: 0; padding: 0; list-style: none; }
#ovs-nav li { margin: 0; padding: 0; }
.ovs-link {
	position: relative;
	display: flex;
	align-items: center;
	gap: 13px;
	height: 42px;
	padding: 0 12px;
	border-radius: 10px;
	color: var(--ovs-on-navy-muted) !important;
	font-size: 14px;
	font-weight: 500;
	text-decoration: none !important;
	white-space: nowrap;
	box-sizing: border-box;
	transition: background .15s, color .15s;
}
.ovs-link:hover { background: rgba(255, 255, 255, .09); color: #fff !important; }
.ovs-link:focus-visible { outline: 2px solid #fff; outline-offset: -2px; }
.ovs-link.is-active { background: rgba(255, 255, 255, .15); color: #fff !important; }
.ovs-link.is-active::before {
	content: "";
	position: absolute;
	left: -10px;
	top: 9px;
	bottom: 9px;
	width: 4px;
	border-radius: 0 4px 4px 0;
	background: var(--ovs-accent);
}
.ovs-ico { display: flex; align-items: center; justify-content: center; flex: 0 0 22px; width: 22px; height: 22px; font-size: 17px; }
.ovs-ico, .ovs-ico * { color: inherit !important; }
.ovs-ico .mainmenu, .ovs-ico .topmenuimage {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	margin: 0;
	padding: 0;
	float: none;
	position: static;
	background-size: contain;
	background-repeat: no-repeat;
	background-position: center;
}
.ovs-ico img, .ovs-ico .mainmenu:not(:has(span)) { filter: brightness(0) invert(1); opacity: .85; }
.ovs-ico span { margin: 0 !important; padding: 0 !important; font-size: 17px; line-height: 1; }
.ovs-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ovs-foot { flex: 0 0 auto; padding: 10px; border-top: 1px solid rgba(255, 255, 255, .10); }
.ovs-collapse {
	display: flex;
	align-items: center;
	gap: 13px;
	width: 100%;
	height: 40px;
	padding: 0 12px;
	border: 0;
	border-radius: 10px;
	background: transparent;
	color: var(--ovs-on-navy-muted);
	font-size: 13px;
	font-weight: 500;
	cursor: pointer;
	transition: background .15s, color .15s;
	box-sizing: border-box;
}
.ovs-collapse:hover { background: rgba(255, 255, 255, .09); color: #fff; }
.ovs-collapse:focus-visible { outline: 2px solid #fff; outline-offset: -2px; }
.ovs-collapse .ovs-ico i { transition: transform .2s; }
html.ovs-collapsed .ovs-collapse .ovs-ico i { transform: rotate(180deg); }

/* Barre reduite : icones seules, le libelle devient l'infobulle de l'entree. */
html.ovs-collapsed .ovs-label,
html.ovs-collapsed .ovs-brand-name,
html.ovs-collapsed .ovs-brand-logo--wide { display: none; }
html.ovs-collapsed .ovs-brand-logo--square { display: flex; }
html.ovs-collapsed .ovs-brand { justify-content: center; padding: 0; }
html.ovs-collapsed .ovs-link, html.ovs-collapsed .ovs-collapse { justify-content: center; padding: 0; gap: 0; }
html.ovs-collapsed .ovs-link.is-active::before { left: -10px; }

/* Bouton du menu (petits ecrans) et fond sombre. */
.ovs-burger {
	display: none;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	align-self: center;
	width: 40px;
	height: 40px;
	border: 0;
	border-radius: 10px;
	background: transparent;
	color: var(--ovs-navy);
	font-size: 18px;
	cursor: pointer;
}
.ovs-burger:hover { background: var(--ovs-surface-alt); }
.ovs-burger:focus-visible { outline: 2px solid var(--ovs-navy); }
#ovs-overlay {
	position: fixed;
	z-index: 1090;
	inset: 0;
	display: none;
	background: rgba(4, 17, 63, .5);
	opacity: 0;
	transition: opacity .2s;
}

/* --- 5. Petits ecrans et impression --------------------------------------- */
@media (max-width: 900px) {
	html.ovs-js body { padding-left: 0; }
	html.ovs-js #id-right { padding: 8px 14px 28px; }
	html.ovs-js #id-top {
		flex-wrap: wrap;
		align-content: flex-start;
		height: auto;
		padding: 0 10px;
		gap: 0 4px;
	}
	html.ovs-js .ovs-burger { display: flex; margin-top: 8px; margin-bottom: 8px; }
	html.ovs-js div.login_block { height: var(--ovs-topbar-h); margin-left: auto; }
	html.ovs-js #ovs-tabs {
		order: 3;
		flex: 1 0 100%;
		height: 46px;
		margin: 0 -10px;
		padding: 0 6px;
		border-top: 1px solid var(--ovs-border);
		background: var(--ovs-surface);
	}
	html.ovs-js .ovs-tab { padding: 0 12px; }
	#ovs-sidebar { width: min(300px, 86vw); transform: translateX(-102%); box-shadow: none; }
	html.ovs-drawer #ovs-sidebar { transform: none; box-shadow: 8px 0 32px rgba(4, 17, 63, .35); }
	html.ovs-drawer #ovs-overlay { display: block; opacity: 1; }
	html.ovs-drawer body { overflow: hidden; }
	/* La barre reduite n'a pas de sens sur un tiroir : libelles toujours visibles. */
	html.ovs-collapsed .ovs-label, html.ovs-collapsed .ovs-brand-name, html.ovs-collapsed .ovs-brand-logo--wide { display: revert; }
	html.ovs-collapsed .ovs-brand-logo--square { display: none; }
	html.ovs-collapsed .ovs-brand { justify-content: flex-start; padding: 0 16px; }
	html.ovs-collapsed .ovs-link, html.ovs-collapsed .ovs-collapse { justify-content: flex-start; padding: 0 12px; gap: 13px; }
	.ovs-collapse { display: none; }
	html.ovs-js .ovs-search .select2-container { width: 150px !important; }
}
@media (max-width: 640px) {
	html.ovs-js div.login_block .login_block_other > .inline-block:not(:has(.logout-btn)) { display: none; }
	html.ovs-js .ovs-search { display: none; }
	html.ovs-js div.login_block .atoploginusername { display: none; }
}
@media (prefers-reduced-motion: reduce) {
	#ovs-sidebar, #ovs-pop, .ovs-link, .ovs-tab, html.ovs-js body { transition: none !important; }
}
@media print {
	#ovs-sidebar, #ovs-overlay, #ovs-pop { display: none !important; }
	html.ovs-js body { padding-left: 0; }
	html.ovs-js #id-top { display: none; }
}

/* --- 6. Finitions ---------------------------------------------------------- */
/* Le numero de version de Dolibarr n'a pas sa place dans une barre d'outils. */
html.ovs-js div.login_block span.aversion { display: none; }

/* Entree « Plus » et regroupements de la fenetre flottante. */
html.ovs-js #ovs-tabs .ovs-more .ovs-tab { cursor: pointer; }
#ovs-pop .is-group { margin-top: 6px; border-top: 1px solid var(--ovs-border); border-radius: 0 0 9px 9px; padding-top: 11px; font-weight: 600; }
#ovs-pop .ovs-pop-head + .is-group { margin-top: 0; border-top: 0; padding-top: 8px; border-radius: 9px; }
#ovs-pop .is-group:hover { border-radius: 9px; }

/* --- 7. Listes et formulaires ---------------------------------------------- */

/* En-tete de colonnes fige : la liste defile dans son propre cadre, de la hauteur de l'ecran, et la ligne des titres reste
   visible. Seulement sur les pages de liste (classe bodyforlist de Dolibarr) : ailleurs, un cadre de defilement
   surprendrait. */
html.ovs-js body.bodyforlist div.div-table-responsive {
	max-height: calc(100vh - var(--ovs-topbar-h) - 150px);
	overflow: auto;
}
html.ovs-js body.bodyforlist table.liste tr.liste_titre:not(.liste_titre_filter) > th,
html.ovs-js body.bodyforlist table.liste tr.liste_titre:not(.liste_titre_filter) > td {
	position: sticky;
	top: 0;
	z-index: 3;
	background: var(--ovs-surface-alt);
	box-shadow: 0 1px 0 var(--ovs-border);
}

/* Titres de colonnes : petits, en capitales espacees, sans bruit. */
html.ovs-js table.liste tr.liste_titre > th,
html.ovs-js table.liste tr.liste_titre > td {
	padding-top: 11px;
	padding-bottom: 11px;
	font-size: 12px;
	font-weight: 600;
	letter-spacing: .03em;
	text-transform: uppercase;
	color: var(--ovs-navy);
}
html.ovs-js table.liste tr.liste_titre_filter > td,
html.ovs-js table.liste tr.liste_titre_filter > th { padding-top: 8px; padding-bottom: 8px; }

/* Lignes plus aerees, separees par un filet. */
html.ovs-js table.liste tr.oddeven > td,
html.ovs-js table.liste tr.pair > td,
html.ovs-js table.liste tr.impair > td {
	padding-top: 10px;
	padding-bottom: 10px;
	border-bottom: 1px solid var(--ovs-surface-alt);
}
html.ovs-js table.liste tr.oddeven:last-child > td { border-bottom: 0; }

/* Fiches : etiquettes discretes, valeurs lisibles, filets doux. */
html.ovs-js div.tabBar table.border > tbody > tr > td,
html.ovs-js div.tabBar .fichecenter div.border div div.tagtd,
html.ovs-js div.tabBar div.border div div.tagtd { border-bottom: 1px solid var(--ovs-surface-alt); padding-top: 6px; padding-bottom: 6px; }
html.ovs-js td.titlefield, html.ovs-js td.titlefieldcreate, html.ovs-js td.titlefieldmiddle, html.ovs-js .fieldrequired {
	color: var(--ovs-ink-muted);
	font-weight: 500;
}

/* Champs : meme hauteur partout, anneau de focus de la charte. */
html.ovs-js body:not(.ox-editor-body) input[type=text], html.ovs-js body:not(.ox-editor-body) input[type=password], html.ovs-js body:not(.ox-editor-body) input[type=email],
html.ovs-js body:not(.ox-editor-body) input[type=number], html.ovs-js body:not(.ox-editor-body) input[type=search], html.ovs-js body:not(.ox-editor-body) input[type=date],
html.ovs-js body:not(.ox-editor-body) select { min-height: 32px; padding: 4px 10px; box-sizing: border-box; }
html.ovs-js body:not(.ox-editor-body) textarea { padding: 8px 10px; }

/* Barre d'actions des fiches : boutons de meme taille, espaces regulierement, a droite. */
html.ovs-js div.tabsAction {
	display: flex;
	flex-wrap: wrap;
	justify-content: flex-end;
	gap: 8px;
	margin: 16px 0 12px;
	padding: 0;
}
html.ovs-js div.tabsAction > .inline-block, html.ovs-js div.tabsAction > a, html.ovs-js div.tabsAction > span { margin: 0 !important; }
html.ovs-js div.tabsAction .butAction, html.ovs-js div.tabsAction .butActionDelete,
html.ovs-js div.tabsAction .butActionRefused, html.ovs-js div.tabsAction .butActionNew {
	display: inline-flex;
	align-items: center;
	min-height: 36px;
	padding: 0 16px;
	margin: 0;
	box-sizing: border-box;
}
/* Boutons d'action de formulaire (Enregistrer, Annuler...). */
html.ovs-js div.center > input.button, html.ovs-js div.center > .button { min-height: 36px; padding: 0 18px; }

/* --- 8. Fil d'Ariane -------------------------------------------------------- */
#ovs-crumb {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 4px 8px;
	margin: 0 0 14px;
	padding: 0;
	color: var(--ovs-ink-muted);
	font-size: 13px;
	line-height: 1.3;
	list-style: none;
}
#ovs-crumb li { display: flex; align-items: center; gap: 8px; margin: 0; padding: 0; }
#ovs-crumb li + li::before {
	content: "\f054";
	font-family: "Font Awesome 5 Free" !important;
	font-weight: 900;
	font-size: 9px;
	color: var(--ovs-border-strong);
}
#ovs-crumb a, #ovs-crumb a:link, #ovs-crumb a:visited { color: var(--ovs-ink-muted); text-decoration: none; }
#ovs-crumb a:hover { color: var(--ovs-navy); text-decoration: underline; }
#ovs-crumb li:last-child, #ovs-crumb li:last-child a { color: var(--ovs-ink); font-weight: 500; }

/* --- 9. Page de connexion ---------------------------------------------------- */
body.bodylogin { margin: 0; background: var(--ovs-navy-deep); }
body.bodylogin .login_center {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 100vh;
	padding: 24px 16px;
	box-sizing: border-box;
	overflow: hidden;
	background:
		radial-gradient(60% 55% at 12% 8%, rgba(255, 255, 255, .10), transparent 70%),
		radial-gradient(45% 50% at 92% 96%, color-mix(in srgb, var(--ovs-accent) 38%, transparent), transparent 72%),
		linear-gradient(160deg, var(--ovs-navy) 0%, var(--ovs-navy-dark) 55%, var(--ovs-navy-deep) 100%) !important;
}
body.bodylogin .login_vertical_align {
	position: relative;
	width: min(420px, 100%);
	padding: 0;
	margin: 0;
	height: auto;
}
body.bodylogin form#login {
	margin: 0;
	padding: 34px 34px 26px;
	background: var(--ovs-paper);
	border-radius: 20px;
	box-shadow: 0 30px 80px rgba(4, 17, 63, .45), 0 2px 6px rgba(4, 17, 63, .2);
	box-sizing: border-box;
}
body.bodylogin .login_table_title { display: none; }
body.bodylogin .login_table { width: 100%; max-width: none; margin: 0; padding: 0; background: transparent; border: 0; box-shadow: none; }
body.bodylogin #login_line1 { display: block; }
body.bodylogin #login_left { display: flex; justify-content: center; align-items: center; width: auto; float: none; margin: 0 0 6px; padding: 0; }
body.bodylogin #login_left img#img_logo { display: block; max-width: 220px; max-height: 72px; width: auto; height: auto; }
body.bodylogin #login_right { width: auto; float: none; margin: 14px 0 0; padding: 0; }
body.bodylogin .ovs-login-brand {
	margin: 0 0 4px;
	text-align: center;
	color: var(--ovs-navy);
	font-size: 24px;
	font-weight: 700;
	letter-spacing: -.01em;
}
body.bodylogin .ovs-login-sub { margin: 0 0 6px; text-align: center; color: var(--ovs-ink-muted); font-size: 14px; }
body.bodylogin br { display: none; }
body.bodylogin .trinputlogin { margin: 0 0 12px; }
body.bodylogin .tdinputlogin { position: relative; display: block; width: auto; padding: 0; text-align: left; }
body.bodylogin .tdinputlogin > span.fa, body.bodylogin .tdinputlogin > span[class*="fa-"] {
	position: absolute;
	left: 14px;
	top: 50%;
	transform: translateY(-50%);
	color: var(--ovs-ink-muted);
	font-size: 15px;
	pointer-events: none;
}
body.bodylogin input#username, body.bodylogin input#password,
body.bodylogin .tdinputlogin input[type=text], body.bodylogin .tdinputlogin input[type=password] {
	display: block;
	width: 100%;
	min-width: 0;
	height: 46px;
	margin: 0;
	padding: 0 14px 0 42px;
	background: var(--ovs-surface);
	border: 1px solid var(--ovs-border) !important;
	border-radius: 11px !important;
	color: var(--ovs-ink);
	font-size: 15px;
	box-sizing: border-box;
}
body.bodylogin input#username:focus, body.bodylogin input#password:focus {
	background: var(--ovs-paper);
	border-color: var(--ovs-navy) !important;
	box-shadow: var(--ovs-halo);
}
body.bodylogin #login_line2 { margin: 6px 0 0; clear: both; }
body.bodylogin #login-submit-wrapper { margin: 8px 0 0; text-align: center; }
body.bodylogin #login-submit-wrapper input.button {
	width: 100%;
	height: 48px;
	padding: 0;
	border-radius: 11px;
	font-size: 15px;
	font-weight: 600;
	cursor: pointer;
	box-shadow: 0 6px 16px rgba(10, 30, 120, .25);
}
body.bodylogin #login_line2 .center { margin-top: 16px !important; font-size: 13px; }
body.bodylogin a.alogin, body.bodylogin a.alogin:link, body.bodylogin a.alogin:visited { color: var(--ovs-ink-muted); text-decoration: none; }
body.bodylogin a.alogin:hover { color: var(--ovs-navy); text-decoration: underline; }
body.bodylogin div.error, body.bodylogin #errorMessage, body.bodylogin .login_main_message {
	margin: 0 0 14px;
	padding: 10px 14px;
	text-align: left;
	border-radius: 10px;
}
body.bodylogin .login_main_home { max-width: 420px; margin: 16px auto 0; color: var(--ovs-on-navy-muted); }
@media (max-width: 480px) {
	body.bodylogin .login_center { align-items: flex-start; padding-top: 8vh; }
	body.bodylogin form#login { padding: 28px 22px 22px; border-radius: 16px; }
}
body.bodylogin #login_right .tagtable, body.bodylogin #login_right .trinputlogin { display: block; width: 100%; }
body.bodylogin #login_right { display: block; width: 100%; }
body.bodylogin #login-submit-wrapper input.button { margin: 0; display: block; }

/* --- 10. Barre du fil d'Ariane et favori ------------------------------------ */
#ovs-crumbbar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	min-height: 24px;
	margin: 0 0 6px;
}
#ovs-crumbbar #ovs-crumb { margin: 0; }
.ovs-star {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 26px;
	height: 26px;
	border: 0;
	border-radius: 8px;
	background: transparent;
	color: var(--ovs-ink-muted);
	font-size: 15px;
	cursor: pointer;
	transition: background .15s, color .15s;
}
.ovs-star:hover { background: var(--ovs-surface-alt); color: var(--ovs-navy); }
.ovs-star:focus-visible { outline: 2px solid var(--ovs-navy); }
.ovs-star.is-on, .ovs-star.is-on i { color: var(--ovs-accent) !important; }

/* --- 11. Favoris et recents dans la barre laterale -------------------------- */
#ovs-side-lists { margin-top: 10px; }
.ovs-sec { margin-top: 14px; padding-top: 12px; border-top: 1px solid rgba(255, 255, 255, .10); }
.ovs-sec-title {
	padding: 0 12px 6px;
	color: var(--ovs-on-navy-muted);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: .09em;
	text-transform: uppercase;
	opacity: .8;
}
.ovs-sec ul { display: flex; flex-direction: column; gap: 1px; margin: 0; padding: 0; list-style: none; }
.ovs-sec li { position: relative; margin: 0; padding: 0; }
.ovs-mini {
	display: flex;
	align-items: center;
	height: 32px;
	padding: 0 30px 0 12px;
	border-radius: 8px;
	color: var(--ovs-on-navy-muted) !important;
	font-size: 13px;
	text-decoration: none !important;
	white-space: nowrap;
	transition: background .15s, color .15s;
}
.ovs-mini:hover { background: rgba(255, 255, 255, .09); color: #fff !important; }
.ovs-mini-x {
	position: absolute;
	right: 4px;
	top: 4px;
	display: none;
	align-items: center;
	justify-content: center;
	width: 24px;
	height: 24px;
	border: 0;
	border-radius: 6px;
	background: transparent;
	color: var(--ovs-on-navy-muted);
	font-size: 11px;
	cursor: pointer;
}
.ovs-sec li:hover .ovs-mini-x, .ovs-mini-x:focus-visible { display: flex; }
.ovs-mini-x:hover { background: rgba(255, 255, 255, .15); color: #fff; }
html.ovs-collapsed #ovs-side-lists { display: none; }

/* --- 12. Bouton de recherche et palette ------------------------------------- */
.ovs-search-trigger { display: flex; align-items: center; flex: 0 0 auto; margin: 0 6px; }
.ovs-search-btn {
	display: flex;
	align-items: center;
	gap: 9px;
	justify-content: center;
	width: 36px;
	height: 36px;
	padding: 0;
	border: 1px solid var(--ovs-border);
	border-radius: 999px;
	background: var(--ovs-surface);
	color: var(--ovs-ink-muted);
	font-size: 14px;
	cursor: pointer;
	transition: border-color .15s, background .15s;
	box-sizing: border-box;
}
.ovs-search-btn:hover { background: var(--ovs-paper); border-color: var(--ovs-border-strong); }
.ovs-search-btn:focus-visible { outline: 2px solid var(--ovs-navy); outline-offset: 1px; }
.ovs-search-btn-lab, .ovs-search-btn kbd { display: none; }
.ovs-search-btn kbd, .ovs-pal-input kbd {
	flex: 0 0 auto;
	padding: 2px 6px;
	border: 1px solid var(--ovs-border);
	border-radius: 6px;
	background: var(--ovs-paper);
	color: var(--ovs-ink-muted);
	font-size: 11px;
	line-height: 1.4;
}

#ovs-palette { position: fixed; z-index: 1400; inset: 0; display: flex; align-items: flex-start; justify-content: center; padding: 11vh 16px 16px; box-sizing: border-box; }
#ovs-palette[hidden] { display: none; }
.ovs-pal-back { position: absolute; inset: 0; background: rgba(4, 17, 63, .52); backdrop-filter: blur(2px); }
.ovs-pal-box {
	position: relative;
	display: flex;
	flex-direction: column;
	width: min(660px, 100%);
	max-height: min(72vh, 620px);
	background: var(--ovs-paper);
	border-radius: 16px;
	box-shadow: 0 30px 80px rgba(4, 17, 63, .45);
	overflow: hidden;
	animation: ovs-pal-in .14s ease-out;
}
@keyframes ovs-pal-in { from { opacity: 0; transform: translateY(-8px) scale(.985); } to { opacity: 1; transform: none; } }
.ovs-pal-input { display: flex; align-items: center; gap: 12px; flex: 0 0 auto; padding: 0 16px; height: 58px; border-bottom: 1px solid var(--ovs-border); }
.ovs-pal-input > i { color: var(--ovs-ink-muted); font-size: 16px; }
.ovs-pal-input input {
	flex: 1 1 auto;
	min-width: 0;
	height: 100%;
	padding: 0;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent;
	color: var(--ovs-ink);
	font-size: 17px;
	box-shadow: none !important;
}
.ovs-pal-input input:focus { outline: none; box-shadow: none !important; }
#ovs-pal-list { flex: 1 1 auto; min-height: 0; margin: 0; padding: 6px 8px 8px; overflow-y: auto; list-style: none; }
.ovs-pal-group { padding: 12px 10px 5px; color: var(--ovs-ink-muted); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
.ovs-pal-row { margin: 0; padding: 0; }
.ovs-pal-row a {
	position: relative;
	display: flex;
	align-items: center;
	gap: 12px;
	min-height: 42px;
	padding: 6px 12px;
	border-radius: 10px;
	color: var(--ovs-ink) !important;
	font-size: 14.5px;
	text-decoration: none !important;
}
.ovs-pal-row.is-sel a { background: var(--ovs-surface-alt); color: var(--ovs-navy) !important; }
.ovs-pal-row.is-sel a::before { content: ""; position: absolute; left: 0; top: 9px; bottom: 9px; width: 3px; border-radius: 0 3px 3px 0; background: var(--ovs-accent); }
.ovs-pal-ico { display: flex; align-items: center; justify-content: center; flex: 0 0 30px; width: 30px; height: 30px; border-radius: 8px; background: var(--ovs-surface); color: var(--ovs-navy); font-size: 13px; }
.ovs-pal-row.is-sel .ovs-pal-ico { background: var(--ovs-paper); }
.ovs-pal-lab { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ovs-pal-sub { flex: 0 1 auto; min-width: 0; max-width: 45%; overflow: hidden; color: var(--ovs-ink-muted); font-size: 12.5px; text-overflow: ellipsis; white-space: nowrap; }
.ovs-pal-empty { padding: 28px 12px; color: var(--ovs-ink-muted); text-align: center; }
.ovs-pal-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex: 0 0 auto; padding: 9px 16px; border-top: 1px solid var(--ovs-border); background: var(--ovs-surface); color: var(--ovs-ink-muted); font-size: 12px; }
.ovs-pal-status { color: var(--ovs-accent-ink); }
html.ovs-pal-open body { overflow: hidden; }

/* --- 13. Densite des tableaux ------------------------------------------------ */
.ovs-density {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	align-self: center;
	width: 34px;
	height: 34px;
	margin-right: 2px;
	border: 0;
	border-radius: 9px;
	background: transparent;
	color: var(--ovs-ink-muted);
	font-size: 15px;
	cursor: pointer;
	transition: background .15s, color .15s;
}
.ovs-density:hover { background: var(--ovs-surface-alt); color: var(--ovs-navy); }
.ovs-density:focus-visible { outline: 2px solid var(--ovs-navy); }
html.ovs-compact table.liste tr.oddeven > td,
html.ovs-compact table.liste tr.pair > td,
html.ovs-compact table.liste tr.impair > td { padding-top: 3px; padding-bottom: 3px; font-size: 13px; }
html.ovs-compact table.liste tr.liste_titre > th,
html.ovs-compact table.liste tr.liste_titre > td { padding-top: 6px; padding-bottom: 6px; font-size: 11.5px; }
html.ovs-compact table.liste tr.liste_titre_filter > td,
html.ovs-compact table.liste tr.liste_titre_filter > th { padding-top: 4px; padding-bottom: 4px; }
html.ovs-compact table.liste input[type=text], html.ovs-compact table.liste select { min-height: 26px; padding-top: 2px; padding-bottom: 2px; }

@media (max-width: 900px) {
	.ovs-search-trigger { margin: 0 2px 0 auto; }
	.ovs-search-btn { width: 40px; height: 40px; padding: 0; justify-content: center; border-radius: 12px; }
	.ovs-search-btn-lab, .ovs-search-btn kbd { display: none; }
	html.ovs-js div.login_block { margin-left: 0; }
	#ovs-palette { padding-top: 8vh; }
	.ovs-pal-sub { display: none; }
}
@media (max-width: 640px) {
	.ovs-density { display: none; }
}
.ovs-pal-input input, .ovs-pal-input input:focus { border: 0 !important; border-bottom: 0 !important; box-shadow: none !important; background-image: none !important; }

/* --- 14. Listes : barre d'outils, filtres, colonnes, lignes ------------------ */
.ovs-colhide, .ovs-rowhide { display: none !important; }
table.ovs-nofilter tr.liste_titre_filter { display: none; }

#ovs-listbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin: 0 0 10px;
}
.ovs-lb-btn {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 34px;
	padding: 0 12px;
	border: 1px solid var(--ovs-border);
	border-radius: 10px;
	background: var(--ovs-paper);
	color: var(--ovs-ink);
	font-size: 13.5px;
	font-weight: 500;
	cursor: pointer;
	transition: background .15s, border-color .15s, color .15s;
}
.ovs-lb-btn:hover { background: var(--ovs-surface); border-color: var(--ovs-border-strong); }
.ovs-lb-btn.is-on { background: var(--ovs-surface-alt); border-color: var(--ovs-navy); color: var(--ovs-navy); }
.ovs-lb-btn:focus-visible { outline: 2px solid var(--ovs-navy); outline-offset: 1px; }
.ovs-lb-btn i { color: var(--ovs-ink-muted); font-size: 12px; }
.ovs-lb-count {
	min-width: 18px;
	padding: 1px 6px;
	border-radius: 999px;
	background: var(--ovs-navy);
	color: var(--ovs-on-navy);
	font-size: 11px;
	font-weight: 700;
	line-height: 1.5;
	text-align: center;
}
.ovs-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
.ovs-chip {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	max-width: 260px;
	height: 28px;
	padding: 0 4px 0 11px;
	border: 1px solid var(--ovs-border);
	border-radius: 999px;
	background: var(--ovs-surface-alt);
	color: var(--ovs-navy);
	font-size: 12.5px;
	font-weight: 500;
}
.ovs-chip > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ovs-chip button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	border: 0;
	border-radius: 50%;
	background: transparent;
	color: var(--ovs-ink-muted);
	font-size: 10px;
	cursor: pointer;
}
.ovs-chip button:hover { background: var(--ovs-navy); color: var(--ovs-on-navy); }
.ovs-chip-clear { padding: 0 6px; border: 0; background: transparent; color: var(--ovs-ink-muted); font-size: 12.5px; text-decoration: underline; cursor: pointer; }
.ovs-chip-clear:hover { color: var(--ovs-navy); }
.ovs-lb-spacer { flex: 1 1 auto; }
.ovs-lb-find {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 34px;
	padding: 0 10px;
	border: 1px solid var(--ovs-border);
	border-radius: 10px;
	background: var(--ovs-surface);
	color: var(--ovs-ink-muted);
}
.ovs-lb-find i { font-size: 12px; }
.ovs-lb-find input {
	width: 160px;
	min-height: 0 !important;
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent;
	font-size: 13.5px;
	box-shadow: none !important;
}
.ovs-lb-find:focus-within { border-color: var(--ovs-navy); background: var(--ovs-paper); }
.ovs-lb-find input:focus { outline: none; box-shadow: none !important; }


/* Ligne entiere cliquable */
tr.ovs-rowlink { cursor: pointer; }
html.ovs-js table.liste tr.ovs-rowlink:hover > td { background: var(--ovs-surface-alt); }

/* Statuts en pastilles */
html.ovs-js .badge, html.ovs-js a.badge, html.ovs-js span.badge {
	display: inline-block;
	padding: 3px 11px;
	border: 1px solid transparent;
	border-radius: 999px;
	font-size: 12px;
	font-weight: 500;
	line-height: 1.45;
	letter-spacing: 0;
	text-transform: none;
	box-shadow: none;
}
html.ovs-js .badge-status0 { background: var(--ovs-surface-alt) !important; color: var(--ovs-ink-muted) !important; border-color: var(--ovs-border); }
html.ovs-js .badge-status1, html.ovs-js .badge-status2 { background: var(--ovs-info-soft) !important; color: var(--ovs-info) !important; border-color: #cfe1f3; }
html.ovs-js .badge-status3, html.ovs-js .badge-status7 { background: var(--ovs-warn-soft) !important; color: var(--ovs-warn) !important; border-color: #f2dcb4; }
html.ovs-js .badge-status4 { background: var(--ovs-ok-soft) !important; color: var(--ovs-ok) !important; border-color: #bfe3cf; }
html.ovs-js .badge-status5, html.ovs-js .badge-status6 { background: var(--ovs-disabled-soft) !important; color: var(--ovs-disabled-ink) !important; border-color: var(--ovs-border); }
html.ovs-js .badge-status8, html.ovs-js .badge-status9 { background: var(--ovs-danger-soft) !important; color: var(--ovs-danger) !important; border-color: #f0c9c6; }

@media (max-width: 700px) {
	.ovs-lb-find { flex: 1 1 100%; }
	.ovs-lb-find input { width: 100%; }
	.ovs-lb-spacer { display: none; }
}

/* --- 15. Formulaires et listes : ergonomie ---------------------------------- */

/* Champs : une seule hauteur confortable, des coins arrondis, un anneau de focus net. */
html.ovs-js body:not(.ox-editor-body) input[type=text], html.ovs-js body:not(.ox-editor-body) input[type=password], html.ovs-js body:not(.ox-editor-body) input[type=email], html.ovs-js body:not(.ox-editor-body) input[type=number],
html.ovs-js body:not(.ox-editor-body) input[type=search], html.ovs-js body:not(.ox-editor-body) input[type=date], html.ovs-js body:not(.ox-editor-body) input[type=tel], html.ovs-js body:not(.ox-editor-body) input[type=url],
html.ovs-js body:not(.ox-editor-body) select { min-height: 38px; padding: 7px 12px; border-radius: 10px !important; font-size: 14px; }
html.ovs-js body:not(.ox-editor-body) textarea { padding: 9px 12px; border-radius: 10px !important; font-size: 14px; line-height: 1.45; }
html.ovs-js body:not(.ox-editor-body) input[type=checkbox], html.ovs-js body:not(.ox-editor-body) input[type=radio] { accent-color: var(--ovs-navy); width: 16px; height: 16px; }
html.ovs-js body:not(.ox-editor-body) input::placeholder, html.ovs-js body:not(.ox-editor-body) textarea::placeholder { color: var(--ovs-ink-muted); opacity: .7; }
html.ovs-js body:not(.ox-editor-body) input:disabled, html.ovs-js body:not(.ox-editor-body) select:disabled, html.ovs-js body:not(.ox-editor-body) textarea:disabled { background: var(--ovs-surface); color: var(--ovs-ink-muted); cursor: not-allowed; }

/* Listes deroulantes (select2) alignees sur les champs. */
html.ovs-js body:not(.ox-editor-body) .select2-container .select2-selection--single { height: 38px; }
html.ovs-js body:not(.ox-editor-body) .select2-container .select2-selection--single .select2-selection__rendered { line-height: 36px; padding-left: 12px; }
html.ovs-js body:not(.ox-editor-body) .select2-container .select2-selection--single .select2-selection__arrow { height: 36px; }
html.ovs-js body:not(.ox-editor-body) .select2-container--default .select2-selection--multiple { min-height: 38px; }
html.ovs-js .select2-dropdown { border: 1px solid var(--ovs-border) !important; border-radius: 12px !important; box-shadow: var(--ovs-shadow-pop); overflow: hidden; }
html.ovs-js .select2-results__option--highlighted[aria-selected], html.ovs-js .select2-results__option--highlighted.select2-results__option--selectable { background: var(--ovs-surface-alt) !important; color: var(--ovs-navy) !important; }
html.ovs-js .select2-container--default .select2-results__option[aria-selected=true] { background: var(--ovs-accent-soft); }
/* Dans les filtres de liste, des champs plus compacts. */
html.ovs-js table.liste input[type=text], html.ovs-js table.liste input[type=search], html.ovs-js table.liste input[type=date],
html.ovs-js table.liste input[type=number], html.ovs-js table.liste select { min-height: 30px; padding: 3px 8px; border-radius: 8px !important; font-size: 13px; }
html.ovs-js table.liste .select2-container .select2-selection--single { height: 30px; }
html.ovs-js table.liste .select2-container .select2-selection--single .select2-selection__rendered { line-height: 28px; padding-left: 8px; }
html.ovs-js table.liste .select2-container .select2-selection--single .select2-selection__arrow { height: 28px; }

/* Formulaire de creation ou de modification : une carte, des lignes separees par un filet doux. */
.ovs-formcard {
	background: var(--ovs-paper);
	border: 1px solid var(--ovs-border) !important;
	border-radius: 14px;
	box-shadow: var(--ovs-shadow);
	padding: 6px 14px;
	overflow: clip;
}
.ovs-formcard > tbody > tr > td, .ovs-formcard > tr > td { padding-top: 9px; padding-bottom: 9px; border-bottom: 1px solid var(--ovs-surface-alt); vertical-align: middle; }
.ovs-formcard > tbody > tr:last-child > td { border-bottom: 0; }
.ovs-formcard td.titlefieldcreate, .ovs-formcard td.titlefield, .ovs-formcard td.fieldrequired { color: var(--ovs-ink-muted); font-weight: 500; }
.ovs-formcard td.fieldrequired, .ovs-formcard .fieldrequired { color: var(--ovs-ink-muted); }
.ovs-formcard td.fieldrequired::after, .ovs-formcard span.fieldrequired::after { content: " *"; color: var(--ovs-danger); font-weight: 700; }
.ovs-formcard td.tdtop { vertical-align: top; padding-top: 14px; }

/* Barre d'enregistrement : reste en bas de la fenetre, boutons a droite. */
.ovs-actionbar {
	position: sticky;
	bottom: 0;
	z-index: 40;
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: 10px;
	margin: 18px -24px -36px;
	padding: 12px 24px;
	background: rgba(255, 255, 255, .94);
	border-top: 1px solid var(--ovs-border);
	-webkit-backdrop-filter: blur(6px);
	backdrop-filter: blur(6px);
}
.ovs-actionbar .button, .ovs-actionbar input.button { min-height: 38px; padding: 0 20px; margin: 0; }
html.ovs-js .button-cancel, html.ovs-js input.button-cancel:not(.bordertransp), html.ovs-js a.button-cancel {
	background: var(--ovs-paper) !important;
	background-image: none !important;
	color: var(--ovs-ink) !important;
	border: 1px solid var(--ovs-border-strong) !important;
	box-shadow: none !important;
}
html.ovs-js .button-cancel:hover { background: var(--ovs-surface) !important; }

/* Titre de page, bouton de creation, bascule liste / kanban. */
html.ovs-js table.table-fiche-title { margin-bottom: 12px; }
html.ovs-js table.table-fiche-title .titre { font-size: 20px; font-weight: 600; color: var(--ovs-navy); letter-spacing: -.01em; }
html.ovs-js table.table-fiche-title .totalnboflines { font-size: 14px; font-weight: 400; color: var(--ovs-ink-muted); }
html.ovs-js a.btnTitlePlus, html.ovs-js a.btnTitlePlus:link, html.ovs-js a.btnTitlePlus:visited {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 38px;
	padding: 0 16px 0 13px;
	border-radius: 10px;
	background: var(--ovs-navy);
	color: var(--ovs-on-navy) !important;
	font-size: 14px;
	font-weight: 500;
	text-decoration: none;
	box-shadow: 0 4px 12px rgba(10, 30, 120, .22);
	transition: background .15s, transform .15s;
}
html.ovs-js a.btnTitlePlus:hover { background: var(--ovs-navy-dark); transform: translateY(-1px); }
html.ovs-js a.btnTitlePlus .btnTitle-icon, html.ovs-js a.btnTitlePlus .fa { color: var(--ovs-on-navy) !important; font-size: 14px; }
html.ovs-js a.btnTitlePlus.ovs-no-label { padding: 0 12px; }
html.ovs-js a.btnTitle.reposition, html.ovs-js a.btnTitle:not(.btnTitlePlus) {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 38px;
	height: 38px;
	border: 1px solid var(--ovs-border);
	background: var(--ovs-paper);
	color: var(--ovs-ink-muted);
}
html.ovs-js a.btnTitle:not(.btnTitlePlus):hover { background: var(--ovs-surface); }
html.ovs-js a.btnTitleSelected:not(.btnTitlePlus) { background: var(--ovs-surface-alt) !important; border-color: var(--ovs-navy) !important; color: var(--ovs-navy) !important; }

/* Pagination. */
html.ovs-js div.pagination ul { display: inline-flex; align-items: center; gap: 4px; margin: 0; padding: 0; list-style: none; }
html.ovs-js div.pagination li { margin: 0; padding: 0; }
html.ovs-js div.pagination li a, html.ovs-js div.pagination li.pagination span.active, html.ovs-js div.pagination li.noborder a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 34px;
	height: 34px;
	padding: 0 8px;
	border: 1px solid transparent;
	border-radius: 9px;
	color: var(--ovs-ink-muted);
	text-decoration: none;
	transition: background .15s, color .15s;
}
html.ovs-js div.pagination li a:hover { background: var(--ovs-surface-alt); color: var(--ovs-navy); }
html.ovs-js div.pagination li.pagination .active, html.ovs-js div.pagination li.pagination a.active, html.ovs-js div.pagination .page-link.active { background: var(--ovs-navy); color: var(--ovs-on-navy); }

/* Liste : carte arrondie, ligne de titres plus nette, pied de tableau (totaux) discret. */
html.ovs-js body.bodyforlist div.div-table-responsive { border: 1px solid var(--ovs-border); border-radius: 14px; background: var(--ovs-paper); box-shadow: var(--ovs-shadow); }
html.ovs-js body.bodyforlist table.liste { border: 0; border-radius: 0; box-shadow: none; }
html.ovs-js table.liste tr.liste_total > td, html.ovs-js table.liste tr.liste_total > th { background: var(--ovs-surface); color: var(--ovs-ink); font-weight: 600; border-top: 1px solid var(--ovs-border); }
html.ovs-js table.liste a.reposition { color: inherit; }
html.ovs-js table.liste th.liste_titre_sel a, html.ovs-js table.liste th.liste_titre_sel { color: var(--ovs-navy); }

/* Barre d'actions groupees des listes. */
html.ovs-js div.massactionbar, html.ovs-js .massactionbar { border-radius: 12px; }

/* Messages (succes, erreurs) : plus lisibles. */
html.ovs-js div.ok, html.ovs-js div.jnotify-notification-success { background: var(--ovs-ok-soft) !important; color: var(--ovs-ink) !important; border-left: 3px solid var(--ovs-ok) !important; border-radius: var(--ovs-radius); padding: 10px 14px; }
html.ovs-js div.warning, html.ovs-js div.jnotify-notification-warning { background: var(--ovs-warn-soft) !important; color: var(--ovs-ink) !important; border-left: 3px solid var(--ovs-warn) !important; border-radius: var(--ovs-radius); padding: 10px 14px; }

/* Fiches : onglets d'objet en forme de pastilles. */
html.ovs-js div.tabs { display: flex; flex-wrap: wrap; gap: 2px 4px; padding: 0; margin: 0 0 12px; border-bottom: 1px solid var(--ovs-border); }
html.ovs-js div.tabs .inline-block { margin: 0; }
html.ovs-js div.tabs a.tab, html.ovs-js div.tabs a.tabunactive, html.ovs-js div.tabs a.tabactive {
	display: inline-block;
	padding: 10px 14px 9px;
	border: 0 !important;
	border-bottom: 3px solid transparent !important;
	border-radius: 8px 8px 0 0;
	background: transparent !important;
	color: var(--ovs-ink-muted) !important;
	font-weight: 500;
	text-decoration: none;
	transition: color .15s, background .15s;
}
html.ovs-js div.tabs a.tab:hover, html.ovs-js div.tabs a.tabunactive:hover { background: var(--ovs-surface) !important; color: var(--ovs-navy) !important; }
html.ovs-js div.tabs a.tabactive, html.ovs-js div.tabs a.tab#active { color: var(--ovs-navy) !important; border-bottom: 3px solid var(--ovs-accent) !important; font-weight: 600; }
html.ovs-js div.tabs a.tab .badge { margin-left: 4px; }

@media (max-width: 900px) {
	.ovs-actionbar { margin: 14px -14px -28px; padding: 10px 14px; }
	html.ovs-js a.btnTitlePlus .ovs-btn-label { display: none; }
}
/* Champs de formulaire sans largeur imposee : une largeur commune, pour que les colonnes de saisie soient alignees. */
html.ovs-js div.tabBar table.border input[type=text]:not([class*="width"]):not([size]):not([type=hidden]), html.ovs-js div.tabBar table.border input[type=email]:not([class*="width"]), html.ovs-js div.tabBar table.border input[type=tel]:not([class*="width"]) { width: 260px; }
@media (max-width: 900px) {
	html.ovs-js textarea { max-width: 100%; box-sizing: border-box; }
}

/* --- 16. En-tete de liste regroupe, pied collant, formulaires en grille ------ */
.ovs-hidden { display: none !important; }

#ovs-listhead {
	margin: 0 0 12px;
	padding: 14px 16px 14px;
	background: var(--ovs-paper);
	border: 1px solid var(--ovs-border);
	border-radius: 14px;
	box-shadow: var(--ovs-shadow);
}
.ovs-lh-top { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-bottom: 12px; }
.ovs-lh-title { display: flex; align-items: center; gap: 12px; min-width: 0; }
.ovs-lh-title .pictotitle { font-size: 22px; }
.ovs-lh-title .titre { font-size: 22px; line-height: 1.2; }
.ovs-lh-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ovs-seg { display: inline-flex; border: 1px solid var(--ovs-border); border-radius: 10px; overflow: hidden; background: var(--ovs-paper); }
html.ovs-js .ovs-seg a.btnTitle { width: 38px; height: 36px; margin: 0; border: 0 !important; border-radius: 0; }
html.ovs-js .ovs-seg a.btnTitle + a.btnTitle { border-left: 1px solid var(--ovs-border) !important; }
#ovs-listhead #ovs-listbar { margin: 0; padding-top: 12px; border-top: 1px solid var(--ovs-surface-alt); }

/* Filtres : le bandeau natif (commerciaux, categories...) apparait avec le bouton Filtres. */
#ovs-filterpanel { margin-top: 12px; }
#ovs-filterpanel:empty { display: none; }
#ovs-listhead.ovs-filters-closed #ovs-filterpanel { display: none; }
#ovs-filterpanel .liste_titre_bydiv {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px 18px;
	margin: 0;
	padding: 10px 12px;
	background: var(--ovs-surface) !important;
	border: 1px solid var(--ovs-border) !important;
	border-radius: 10px;
}
#ovs-filterpanel .divsearchfield { display: inline-flex; align-items: center; gap: 8px; margin: 0; padding: 0; float: none; }

/* Pied : actions groupees a gauche, pagination et taille de page a droite, colle au bas de la fenetre. */
#ovs-listfoot {
	position: sticky;
	bottom: 0;
	z-index: 35;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	margin-top: 12px;
	padding: 8px 12px;
	background: rgba(255, 255, 255, .95);
	border: 1px solid var(--ovs-border);
	border-radius: 12px;
	box-shadow: var(--ovs-shadow);
	-webkit-backdrop-filter: blur(6px);
	backdrop-filter: blur(6px);
}
#ovs-listfoot .ovs-lf-left { display: flex; align-items: center; gap: 10px; min-width: 0; }
#ovs-listfoot .ovs-lf-left:empty { display: none; }
#ovs-listfoot div.pagination { margin-left: auto; }
#ovs-listfoot div.pagination ul { gap: 8px; }
#ovs-listfoot .paginationcombolimit select { min-height: 34px; }

/* Formulaires en grille : etiquette au-dessus du champ, deux colonnes (une seule sur petit ecran). */
html.ovs-js table.ovs-formgrid { display: block; width: 100%; border: 0; box-shadow: none; background: transparent; }
html.ovs-js table.ovs-formgrid > tbody, html.ovs-js table.ovs-formgrid > tr {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	grid-auto-flow: row dense;
	gap: 0 36px;
	padding: 6px 4px;
}
html.ovs-js table.ovs-formgrid > tbody > tr { border: 0; background: transparent !important; }
html.ovs-js table.ovs-formgrid tr.ovs-r1 { display: grid; grid-auto-flow: column; grid-template-rows: auto auto; grid-auto-columns: minmax(0, 1fr); gap: 4px 0; padding: 10px 0; border-bottom: 1px solid var(--ovs-surface-alt); }
html.ovs-js table.ovs-formgrid tr.ovs-r2 { display: grid; grid-column: 1 / -1; grid-auto-flow: column; grid-template-rows: auto auto; grid-auto-columns: minmax(0, 1fr); gap: 4px 36px; padding: 10px 0; border-bottom: 1px solid var(--ovs-surface-alt); }
html.ovs-js table.ovs-formgrid tr.ovs-rfull { display: block; grid-column: 1 / -1; padding: 10px 0; border-bottom: 1px solid var(--ovs-surface-alt); }
html.ovs-js table.ovs-formgrid tr.ovs-rfull > td, html.ovs-js table.ovs-formgrid tr.ovs-rfull > th { display: block; }
html.ovs-js table.ovs-formgrid tr[style*="display: none"], html.ovs-js table.ovs-formgrid tr.hideobject { display: none !important; }
html.ovs-js table.ovs-formgrid > tbody > tr > td, html.ovs-js table.ovs-formgrid > tbody > tr > th {
	display: block;
	width: auto !important;
	padding: 0 !important;
	border: 0 !important;
	text-align: left;
	background: transparent;
}
/* Etiquette : petite, discrete, juste au-dessus du champ. */
html.ovs-js table.ovs-formgrid > tbody > tr > td.titlefieldcreate, html.ovs-js table.ovs-formgrid > tbody > tr > td.titlefield, html.ovs-js table.ovs-formgrid > tbody > tr > td.titlefieldmiddle,
html.ovs-js table.ovs-formgrid tr.ovs-r1 > td:first-child, html.ovs-js table.ovs-formgrid tr.ovs-r2 > td:nth-child(odd) {
	align-self: end;
	margin-bottom: 4px;
	color: var(--ovs-ink-muted);
	font-size: 12.5px;
	font-weight: 600;
	letter-spacing: .01em;
}
/* Champ : occupe toute la largeur de sa colonne, icone et saisie sur la meme ligne. */
html.ovs-js table.ovs-formgrid tr.ovs-r1 > td:last-child, html.ovs-js table.ovs-formgrid tr.ovs-r2 > td:nth-child(even) { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; min-width: 0; }
html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=text]:not([class*="maxwidth"]), html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=email], html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=tel],
html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=url], html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=number], html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=password],
html.ovs-js table.ovs-formgrid > tbody > tr > td > textarea { flex: 1 1 180px; width: auto !important; min-width: 0; max-width: 100%; box-sizing: border-box; }
html.ovs-js table.ovs-formgrid > tbody > tr > td > select:not([class*="select2"]) { flex: 1 1 180px; min-width: 0; max-width: 100%; }
html.ovs-js table.ovs-formgrid > tbody > tr > td > .select2-container { flex: 1 1 180px; min-width: 0; width: auto !important; max-width: 100%; }
html.ovs-js table.ovs-formgrid > tbody > tr > td > textarea { flex-basis: 100%; }
html.ovs-js table.ovs-formgrid > tbody > tr > td > .fa, html.ovs-js table.ovs-formgrid > tbody > tr > td > .fas, html.ovs-js table.ovs-formgrid > tbody > tr > td > .far { flex: 0 0 auto; }
@media (max-width: 900px) {
	html.ovs-js table.ovs-formgrid > tbody, html.ovs-js table.ovs-formgrid > tr { grid-template-columns: minmax(0, 1fr); }
	html.ovs-js table.ovs-formgrid tr.ovs-r2 { grid-auto-flow: row; grid-template-rows: none; gap: 10px 0; }
	#ovs-listhead { padding: 12px; }
	#ovs-listfoot { flex-wrap: wrap; }
}
#ovs-listfoot div.pagination input[type=text], #ovs-listfoot div.pagination input[type=number], #ovs-listfoot div.pagination input.pageplusone { width: 3.4em !important; min-height: 34px !important; padding: 0 4px !important; text-align: center; }
html.ovs-js table.ovs-formgrid > tbody > tr > td, html.ovs-js table.ovs-formgrid > tbody > tr > th, html.ovs-js table.ovs-formgrid > tbody > tr { height: auto !important; min-height: 0; }
/* Dans la grille, tous les champs texte remplissent leur colonne (les largeurs maximales de Dolibarr visaient l ancienne mise en page en tableau). */
html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=text][class*="maxwidth"], html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=number][class*="maxwidth"] { max-width: 100% !important; flex: 1 1 140px; width: auto !important; }
html.ovs-js table.ovs-formgrid > tbody > tr > td > input[type=text][class*="maxwidth"]:not(:only-child) { flex: 1 1 120px; }
html.ovs-js table.ovs-formgrid tr.ovs-wide { grid-column: 1 / -1; }
/* Bouton de creation dont la page fournit deja le libelle (produits, services...). */
html.ovs-js a.btnTitlePlus .btnTitle-label { display: inline; margin: 0; color: inherit !important; font-size: 14px; }

/* Ligne qui contient un tableau ou un widget imbrique (onglets d'un module, par exemple) : pleine largeur, sans retouche de l'interieur. */
html.ovs-js table.ovs-formgrid tr.ovs-nest > td:last-child { display: block; }
/* Ligne ajoutee apres coup par un module (donc non classee par le script) : pleine largeur. */
html.ovs-js table.ovs-formgrid > tbody > tr:not(.ovs-r1):not(.ovs-r2):not(.ovs-rfull) { grid-column: 1 / -1; display: block; padding: 10px 0; }
/* Boutons de creation dans un titre de section (evenements, contacts...) : plus petits que celui de l en-tete de liste. */
html.ovs-js table.table-fiche-title a.btnTitlePlus, html.ovs-js table.table-fiche-title a.btnTitlePlus:link { height: 32px; padding: 0 12px 0 10px; font-size: 13px; box-shadow: none; }
/* Petit ecran : le libelle du bouton de creation (parfois long : « Nouvelle commande fournisseur ») ne doit jamais faire deborder l en-tete. */
.ovs-lh-actions { min-width: 0; max-width: 100%; }
html.ovs-js a.btnTitlePlus { max-width: 100%; box-sizing: border-box; }
html.ovs-js a.btnTitlePlus .btnTitle-label, html.ovs-js a.btnTitlePlus .ovs-btn-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
@media (max-width: 700px) {
	html.ovs-js a.btnTitlePlus .btnTitle-label, html.ovs-js a.btnTitlePlus .ovs-btn-label { display: none !important; }
	html.ovs-js a.btnTitlePlus, html.ovs-js a.btnTitlePlus:link { width: 40px; height: 40px; padding: 0; justify-content: center; }
	.ovs-lh-top { flex-wrap: nowrap; }
	.ovs-lh-title { flex: 1 1 auto; }
	.ovs-lh-title .titre { font-size: 18px; overflow: hidden; text-overflow: ellipsis; }
}
@media (max-width: 700px) {
	.ovs-lh-actions { flex: 0 0 auto; flex-wrap: nowrap; }
	.ovs-lh-title { flex: 1 1 0; min-width: 0; }
}
/* Au survol, Dolibarr reduit le bouton de creation a 24 px de large (max-width: 24px dans btnTitlePlus:hover), prevu pour un bouton sans texte : avec un libelle, le texte etait coupe des que la souris passait dessus. */
html.ovs-js a.btnTitlePlus:hover, html.ovs-js .btnTitlePlus:hover { max-width: 100% !important; max-height: none !important; min-width: 0; border: 0 !important; border-radius: 10px !important; font-size: 14px !important; text-align: left !important; }
html.ovs-js a.btnTitlePlus:hover .btnTitle-label, html.ovs-js a.btnTitlePlus:hover .ovs-btn-label { color: inherit !important; }
html.ovs-js a.btnTitle:not(.btnTitlePlus):hover { border-radius: 0 !important; font-size: inherit !important; }

/* --- 17. Personnalisation des onglets : titre de groupe dans « Plus », bouton et fenetre ------------------ */
#ovs-pop .ovs-pop-sub { margin: 8px 0 2px; padding: 6px 12px 2px; color: var(--ovs-accent-ink); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
#ovs-pop .ovs-pop-head + .ovs-pop-sub { margin-top: 0; }
#ovs-pop .ovs-pop-sub + .is-group { margin-top: 0; border-top: 0; padding-top: 8px; }

.ovs-tabedit-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	align-self: center;
	width: 30px;
	height: 30px;
	margin: 0 2px 0 -2px;
	border: 0;
	border-radius: 9px;
	background: transparent;
	color: var(--ovs-ink-muted);
	font-size: 13px;
	cursor: pointer;
	opacity: .55;
	transition: background .15s, color .15s, opacity .15s;
}
.ovs-tabedit-btn:hover, .ovs-tabedit-btn:focus-visible { opacity: 1; background: var(--ovs-surface-alt); color: var(--ovs-navy); }
.ovs-tabedit-btn:focus-visible { outline: 2px solid var(--ovs-navy); }
@media (max-width: 640px) { .ovs-tabedit-btn { display: none; } }

#ovs-tabedit { position: fixed; z-index: 1450; inset: 0; display: flex; align-items: flex-start; justify-content: center; padding: 8vh 16px 16px; box-sizing: border-box; background: rgba(6, 18, 71, .42); }
.ovs-te-box {
	display: flex;
	flex-direction: column;
	width: min(720px, 100%);
	max-height: 84vh;
	background: var(--ovs-paper);
	border: 1px solid var(--ovs-border);
	border-radius: 16px;
	box-shadow: var(--ovs-shadow-pop);
	overflow: hidden;
	color: var(--ovs-ink);
}
.ovs-te-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 18px 20px 6px; }
.ovs-te-title { font-size: 18px; font-weight: 700; color: var(--ovs-navy); }
.ovs-te-sub { margin-top: 2px; color: var(--ovs-ink-muted); font-size: 13px; }
.ovs-te-x { flex: 0 0 auto; width: 32px; height: 32px; border: 0; border-radius: 9px; background: transparent; color: var(--ovs-ink-muted); cursor: pointer; }
.ovs-te-x:hover { background: var(--ovs-surface-alt); color: var(--ovs-navy); }
.ovs-te-help { margin: 0; padding: 4px 20px 12px; color: var(--ovs-ink-muted); font-size: 13px; line-height: 1.45; }
.ovs-te-list { flex: 1 1 auto; min-height: 0; margin: 0; padding: 4px 12px 8px; overflow-y: auto; list-style: none; border-top: 1px solid var(--ovs-border); }
.ovs-te-row {
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 0;
	padding: 9px 8px;
	border-bottom: 1px solid var(--ovs-surface-alt);
}
.ovs-te-row:last-child { border-bottom: 0; }
.ovs-te-row.is-group { background: var(--ovs-surface); border-radius: 10px; border-bottom-color: transparent; margin: 3px 0; }
.ovs-te-cb { flex: 0 0 auto; width: 17px; height: 17px; margin: 0; accent-color: var(--ovs-navy); }
.ovs-te-main { flex: 1 1 auto; min-width: 0; }
.ovs-te-label { font-size: 14px; font-weight: 500; }
.ovs-te-name { width: 100%; max-width: 260px; min-height: 32px !important; padding: 4px 10px !important; font-weight: 600; }
.ovs-te-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.ovs-te-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px 2px 10px; border: 1px solid var(--ovs-border); border-radius: 999px; background: var(--ovs-paper); color: var(--ovs-ink-muted); font-size: 12px; }
.ovs-te-chip button { width: 18px; height: 18px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--ovs-ink-muted); font-size: 9px; cursor: pointer; }
.ovs-te-chip button:hover { background: var(--ovs-surface-alt); color: var(--ovs-danger); }
.ovs-te-row.is-off .ovs-te-main { opacity: .5; }
.ovs-te-seg { display: inline-flex; flex: 0 0 auto; border: 1px solid var(--ovs-border); border-radius: 9px; overflow: hidden; background: var(--ovs-paper); }
.ovs-te-seg button { min-width: 58px; height: 30px; padding: 0 12px; border: 0; background: transparent; color: var(--ovs-ink-muted); font-size: 13px; cursor: pointer; }
.ovs-te-seg button + button { border-left: 1px solid var(--ovs-border); }
.ovs-te-seg button.is-on { background: var(--ovs-navy); color: var(--ovs-on-navy); font-weight: 600; }
.ovs-te-tools { display: flex; flex: 0 0 auto; gap: 2px; }
.ovs-te-ic { width: 30px; height: 30px; border: 0; border-radius: 8px; background: transparent; color: var(--ovs-ink-muted); font-size: 12px; cursor: pointer; }
.ovs-te-ic:hover:not(:disabled) { background: var(--ovs-surface-alt); color: var(--ovs-navy); }
.ovs-te-ic:disabled { opacity: .3; cursor: default; }
.ovs-te-gbar { display: flex; align-items: center; gap: 10px; padding: 10px 20px; border-top: 1px solid var(--ovs-border); background: var(--ovs-accent-soft); }
.ovs-te-gbar[hidden] { display: none; }
.ovs-te-gcount { flex: 0 0 auto; color: var(--ovs-accent-ink); font-size: 13px; font-weight: 600; }
.ovs-te-gname { flex: 1 1 auto; min-width: 0; max-width: 280px; min-height: 34px !important; }
.ovs-te-foot { display: flex; align-items: center; gap: 10px; padding: 12px 20px; border-top: 1px solid var(--ovs-border); background: var(--ovs-surface); }
.ovs-te-spacer { flex: 1 1 auto; }
.ovs-te-primary, .ovs-te-ghost { height: 36px; padding: 0 16px; border-radius: 10px; font-size: 14px; font-weight: 600; cursor: pointer; }
.ovs-te-primary { border: 1px solid var(--ovs-navy); background: var(--ovs-navy); color: var(--ovs-on-navy); }
.ovs-te-primary:hover { filter: brightness(1.12); }
.ovs-te-ghost { border: 1px solid var(--ovs-border-strong); background: var(--ovs-paper); color: var(--ovs-ink); }
.ovs-te-ghost:hover { background: var(--ovs-surface-alt); }
.ovs-te-link { border: 0; background: transparent; color: var(--ovs-ink-muted); font-size: 13px; text-decoration: underline; cursor: pointer; }
.ovs-te-link:hover { color: var(--ovs-navy); }
@media (max-width: 640px) {
	#ovs-tabedit { padding: 0; }
	.ovs-te-box { width: 100%; max-height: 100vh; height: 100%; border-radius: 0; }
	.ovs-te-row { flex-wrap: wrap; }
	.ovs-te-main { flex-basis: calc(100% - 40px); }
	.ovs-te-gbar { flex-wrap: wrap; }
}

/* Configuration du module : organisation des onglets par defaut, une ligne par section. */
.ovs-adm-tabs { display: flex; flex-direction: column; max-width: 640px; border: 1px solid var(--ovs-border); border-radius: 12px; overflow: hidden; background: var(--ovs-paper); }
.ovs-adm-row { display: flex; align-items: center; gap: 12px; padding: 8px 12px; border-bottom: 1px solid var(--ovs-surface-alt); }
.ovs-adm-row:last-child { border-bottom: 0; }
.ovs-adm-name { flex: 0 0 170px; font-weight: 600; color: var(--ovs-ink); }
.ovs-adm-state { flex: 1 1 auto; min-width: 0; color: var(--ovs-ink-muted); font-size: 13px; }
.ovs-adm-state.is-custom { color: var(--ovs-accent-ink); font-weight: 600; }
.ovs-adm-btn { height: 32px; padding: 0 14px; }
@media (max-width: 640px) { .ovs-adm-row { flex-wrap: wrap; } .ovs-adm-name { flex-basis: 100%; } }

/* Barre laterale : groupes choisis par l'utilisateur et entree « Plus ». */
#ovs-nav button.ovs-link { width: 100%; border: 0; background: transparent; font-family: inherit; text-align: left; cursor: pointer; }
.ovs-group .ovs-caret2 { margin-left: auto; font-size: 10px; opacity: .6; transition: transform .15s; }
.ovs-grp.is-open > .ovs-group .ovs-caret2 { transform: rotate(180deg); }
.ovs-group.is-active-group { color: #fff !important; }
#ovs-nav ul.ovs-sub { display: none; margin: 2px 0 6px 21px; padding: 0 0 0 9px; gap: 2px; border-left: 1px solid rgba(255, 255, 255, .16); }
#ovs-nav li.is-open > ul.ovs-sub { display: flex; }
.ovs-sublink { height: 37px; font-size: 13.5px; }
.ovs-sub-title { padding: 8px 12px 2px; color: var(--ovs-on-navy-muted); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; opacity: .8; }
.ovs-sideedit .ovs-ico i { transform: none !important; }
/* Barre reduite : les groupes se deplient d'office, en icones seules. */
html.ovs-collapsed .ovs-group, html.ovs-collapsed .ovs-sub-title { display: none; }
html.ovs-collapsed #ovs-nav ul.ovs-sub { display: flex; margin: 0; padding: 0; border: 0; }
html.ovs-collapsed .ovs-sublink { height: 42px; }
@media (max-width: 900px) {
	html.ovs-collapsed .ovs-group { display: flex; }
	html.ovs-collapsed .ovs-sub-title { display: block; }
	html.ovs-collapsed #ovs-nav ul.ovs-sub { display: none; margin: 2px 0 6px 21px; padding: 0 0 0 9px; border-left: 1px solid rgba(255, 255, 255, .16); }
	html.ovs-collapsed #ovs-nav li.is-open > ul.ovs-sub { display: flex; }
	html.ovs-collapsed .ovs-sublink { height: 37px; }
	.ovs-collapse.ovs-sideedit { display: flex; }
}
.ovs-adm-row.is-side { background: var(--ovs-surface); }

/* Formulaires en grille : Dolibarr reporte la classe de largeur du champ (width75...) sur la zone visible d'une liste a choix ; elle doit suivre la largeur du conteneur. */
html.ovs-js table.ovs-formgrid tr:not(.ovs-nest) .select2-container .select2-selection { width: 100% !important; max-width: 100% !important; box-sizing: border-box; }
/* Une liste a choix dans un conteneur intermediaire (div) ne doit jamais depasser sa cellule. */
html.ovs-js table.ovs-formgrid tr:not(.ovs-nest) .select2-container { max-width: 100%; }
html.ovs-js table.ovs-formgrid tr.ovs-r1 > td:last-child > div, html.ovs-js table.ovs-formgrid tr.ovs-r2 > td:nth-child(even) > div { min-width: 0; max-width: 100%; }

/* Barre d'onglets : masquee jusqu'a sa premiere mesure (image suivante), pour ne pas montrer des onglets qui debordent. */
html.ovs-js #ovs-tabs.is-pending { visibility: hidden; }

/* Listes : un long texte (champ complementaire multi-lignes, adresse) tient sur deux lignes au plus ; le texte entier s'affiche au survol. */
.ovs-clamp {
	max-width: 32em;
	max-height: 2.6em;
	line-height: 1.3;
	overflow: hidden;
	word-break: break-word;
}
.ovs-clamp > * { margin: 0; line-height: inherit; }

/* --- Tableaux de reglages sur telephone : defilement horizontal plutot qu'une colonne rognee --------------------------------------- */
@media (max-width: 700px) {
	html.ovs-js form > table.noborder.centpercent { display: block; max-width: 100%; overflow-x: auto; }
}
tr.ovs-rowlink td:has(input[type="checkbox"]) { cursor: default; }
