diff --git a/src/app/globals.css b/src/app/globals.css index c93cee5..9946d08 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -238,6 +238,47 @@ background: rgba(0, 0, 0, 0.18); } +/* ── Défilement de la Grille ── + La règle ci-dessus (8 px, rail transparent, pouce très pâle) convient aux + panneaux où l'ascenseur est accessoire. Dans la Grille, le tableau fait + ~2600 px de large : l'ascenseur HORIZONTAL est l'outil de navigation + principal, et un rail invisible ne dit pas qu'il reste des colonnes à + droite. On lui donne donc un rail dessiné et un pouce saisissable. + `scrollbar-*` couvre Firefox, que les sélecteurs -webkit- ignorent. */ +.grid-scroll { + scrollbar-width: auto; + scrollbar-color: var(--text-muted) var(--bg-elevated); +} + +.grid-scroll::-webkit-scrollbar { + width: 10px; + height: 14px; +} + +.grid-scroll::-webkit-scrollbar-track:horizontal { + background: var(--bg-elevated); + border-top: 1px solid var(--border); +} + +.grid-scroll::-webkit-scrollbar-thumb { + background: var(--text-muted); + border-radius: 99px; + /* Bordure transparente + background-clip : le pouce garde de l'air dans son + rail sans qu'on ait à jouer sur des marges, impossibles ici. */ + border: 3px solid transparent; + background-clip: padding-box; +} + +.grid-scroll::-webkit-scrollbar-thumb:hover { + background: var(--text-secondary); + background-clip: padding-box; +} + +/* Le coin entre les deux ascenseurs, sinon laissé en blanc par le navigateur. */ +.grid-scroll::-webkit-scrollbar-corner { + background: var(--bg-elevated); +} + /* ── Heatmap cells ── */ .heatmap-zero { background: var(--bg-elevated); diff --git a/src/features/grid/components/bulk-action-toolbar.tsx b/src/features/grid/components/bulk-action-toolbar.tsx index c2d3cdd..7515515 100644 --- a/src/features/grid/components/bulk-action-toolbar.tsx +++ b/src/features/grid/components/bulk-action-toolbar.tsx @@ -32,7 +32,7 @@ export function BulkActionToolbar({ selectedCodeins, onClearSelection }: BulkAct }; return ( -
+
{selectedCodeins.length} sélectionné{selectedCodeins.length > 1 ? "s" : ""} diff --git a/src/features/grid/components/floating-summary-bar.tsx b/src/features/grid/components/floating-summary-bar.tsx index dbf5b7d..1cd521f 100644 --- a/src/features/grid/components/floating-summary-bar.tsx +++ b/src/features/grid/components/floating-summary-bar.tsx @@ -19,9 +19,12 @@ function Stat({ label, value, sub }: { label: string; value: string; sub?: strin // Determine color based on label to match the prototype const valColor = label.includes("CA") || label.includes("Marge") ? "text-emerald-600 dark:text-emerald-400" : "text-slate-900 dark:text-white"; return ( -
- {label} - {value} + // Barre maintenant dans le flux : chaque pixel de hauteur est pris au + // tableau. Ces chiffres sont déjà repris en gros dans l'en-tête de page, + // ils n'ont pas besoin d'y être une seconde fois en 20 px. +
+ {label} + {value} {sub && {sub}}
); @@ -153,7 +156,20 @@ export function FloatingSummaryBar() { return (
m.code === magasin)?.nom || "National (Total)"; return ( -
+
{/* Header — chrome raffiné (eyebrow teal + fournisseur héro + pastilles métriques) */}
diff --git a/src/features/grid/components/grid-filter-bar.tsx b/src/features/grid/components/grid-filter-bar.tsx index 38f2942..bc5cdbf 100644 --- a/src/features/grid/components/grid-filter-bar.tsx +++ b/src/features/grid/components/grid-filter-bar.tsx @@ -134,7 +134,7 @@ export function GridFilterBar({ fournisseurs, magasins }: GridFilterBarProps) { fournisseurs={fournisseurs} selectedCode={searchParams.get("fournisseur")} onSelect={handleSupplierSelect} - className="w-[280px]" + className="w-[200px] xl:w-[280px]" /> {/* Store Selector */} @@ -142,7 +142,7 @@ export function GridFilterBar({ fournisseurs, magasins }: GridFilterBarProps) { magasins={magasins} selectedCode={activeMagasin === "TOTAL" ? null : activeMagasin} onSelect={handleStoreSelect} - className="w-[220px]" + className="w-[170px] xl:w-[220px]" /> {/* Search */} @@ -156,12 +156,19 @@ export function GridFilterBar({ fournisseurs, magasins }: GridFilterBarProps) { placeholder="Rechercher (code, désignation...)" value={searchValue} onChange={(e) => setSearchValue(e.target.value)} - className="apple-input w-72 pr-8" + // La croix native de `type="search"` (WebKit/Blink) est masquée : + // ce champ a déjà son propre bouton d'effacement juste à droite, + // et les deux apparaissaient côte à côte. On garde `type="search"` + // pour la sémantique ; le masquage est local, la recherche de + // l'en-tête n'ayant pas de bouton maison, elle garde le sien. + className="apple-input w-52 xl:w-72 pr-8 [&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-cancel-button]:hidden" style={{ paddingLeft: "32px" }} /> {searchValue && (