# DataTable — pagination « aller à la page » — Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Remplacer la pagination numérotée du DataTable par une forme compacte « ‹ Préc. Page [n] / N Suiv. › » avec saut de page (debounce 400 ms, Entrée immédiat, clamp). **Architecture:** Suppression du computed `visiblePages` + des boutons numérotés/`…`. Ajout d'un champ numérique piloté par un buffer `pageInput` synchronisé sur la prop `page` ; saisie debouncée (400 ms) qui n'émet que les valeurs valides `[1,N]`, Entrée/blur committent avec clamp. Le contrat `v-model:page` est inchangé. **Tech Stack:** Nuxt 4 layer, Vue 3 ``) par : ```ts function changePage(page: number) { if (page >= 1 && page <= totalPages.value && page !== props.page) { emit('update:page', page) } } function onPageInput() { pageInput.value = pageInput.value.replace(/[^0-9]/g, '') if (debounceTimer) clearTimeout(debounceTimer) if (pageInput.value === '') return const n = Number(pageInput.value) if (n >= 1 && n <= totalPages.value) { debounceTimer = setTimeout(() => changePage(n), PAGE_JUMP_DEBOUNCE) } } function commitPageInput() { if (debounceTimer) clearTimeout(debounceTimer) const raw = pageInput.value.trim() const n = Number(raw) if (raw === '' || n === 0 || Number.isNaN(n)) { pageInput.value = String(props.page) return } const clamped = Math.min(Math.max(1, Math.round(n)), totalPages.value) changePage(clamped) pageInput.value = String(clamped) } ``` - [ ] **Step 4 : Mettre à jour le bouton Préc.** Dans le `