Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)
Python 69.3%
TypeScript 16.7%
CSS 7.9%
JavaScript 4.7%
HTML 1.4%
1// ==============================================================================2// Author: Simon-Pierre Boucher <contact@spboucher.ai>3// File: components/Pager.tsx4// Desc: Pagination numérotée en bas des résultats (fenêtre 1 … n-1 n n+1 … N)5// pour ne jamais surcharger une page — style éditorial sharp.6// ==============================================================================78export default function Pager({ page, pageCount, onPage }: {9 page: number; // page courante, base 010 pageCount: number;11 onPage: (p: number) => void;12}) {13 if (pageCount <= 1) return null;1415 const nums: (number | "…")[] = [];16 const push = (n: number | "…") => {17 if (nums[nums.length - 1] !== n) nums.push(n);18 };19 for (let i = 0; i < pageCount; i++) {20 if (i === 0 || i === pageCount - 1 || Math.abs(i - page) <= 1) push(i);21 else push("…");22 }2324 const go = (p: number) => {25 onPage(p);26 window.scrollTo({ top: 0 });27 };2829 return (30 <nav className="pager" aria-label="Pagination">31 <button className="pg-btn" disabled={page === 0} onClick={() => go(page - 1)}32 aria-label="Page précédente">←</button>33 {nums.map((n, i) =>34 n === "…" ? (35 <span className="pg-ellipsis" key={`e${i}`}>…</span>36 ) : (37 <button38 key={n}39 className={`pg-btn pg-num ${n === page ? "on" : ""}`}40 aria-current={n === page ? "page" : undefined}41 onClick={() => go(n)}42 >43 {n + 1}44 </button>45 ))}46 <button className="pg-btn" disabled={page >= pageCount - 1} onClick={() => go(page + 1)}47 aria-label="Page suivante">→</button>48 </nav>49 );50}51