send-gift: cuadrícula de objetos 4/fila centrada + paginación

Aplana el catálogo y lo pagina (8 por página = 2 filas de 4) con controles
Atrás / 1 2 3 / Siguiente centrados. Nuevas clases .gift-grid (grid 4 cols,
responsive a 2 en móvil) y .gift-pagination en novawow-style.css.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 13:56:25 +00:00
parent 1a2d40ee9c
commit 9b1f1ecf63
2 changed files with 81 additions and 24 deletions
+46 -24
View File
@@ -65,6 +65,17 @@ export function SendGiftForm({
[cart],
)
// Catálogo aplanado y paginado: 4 objetos por fila, 2 filas (8) por página.
const PAGE_SIZE = 8
const allItems = useMemo(
() => catalog.flatMap((c) => c.items.map((it) => ({ ...it, category: c.name }))),
[catalog],
)
const [page, setPage] = useState(1)
const totalPages = Math.max(1, Math.ceil(allItems.length / PAGE_SIZE))
const currentPage = Math.min(page, totalPages)
const pageItems = allItems.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE)
function addItem(item: GiftItem) {
setCart((prev) => {
const next = new Map(prev)
@@ -158,34 +169,45 @@ export function SendGiftForm({
<SecretInput value={token} onChange={setToken} placeholder="Token de seguridad" />
<hr />
{/* Catálogo de objetos */}
<div className="justified">
{catalog.map((cat) => (
<div key={cat.id}>
<h3 className="first-brown">{cat.name}</h3>
<div>
{cat.items.map((it) => (
<div className="item-box" key={it.id}>
<a
href={`https://www.wowhead.com/wotlk/item=${it.itemId}`}
target="_blank"
rel="noreferrer noopener"
>
<img className="item-img-box" src={it.imageUrl} alt={it.name} />
</a>
<div className="item-name second-brown">{it.name}</div>
<div className="yellow-info">
{it.price} {currency}
</div>
<button type="button" className="store-add-button" onClick={() => addItem(it)}>
Añadir
</button>
</div>
))}
{/* Catálogo de objetos: cuadrícula centrada de 4 por fila + paginación */}
<h3 className="first-brown centered">Objetos disponibles</h3>
<div className="gift-grid">
{pageItems.map((it) => (
<div className="item-box" key={it.id}>
<a href={`https://www.wowhead.com/wotlk/item=${it.itemId}`} target="_blank" rel="noreferrer noopener">
<img className="item-img-box" src={it.imageUrl} alt={it.name} />
</a>
<div className="third-brown" style={{ fontSize: '12px' }}>{it.category}</div>
<div className="item-name second-brown">{it.name}</div>
<div className="yellow-info">
{it.price} {currency}
</div>
<button type="button" className="store-add-button" onClick={() => addItem(it)}>
Añadir
</button>
</div>
))}
</div>
{totalPages > 1 && (
<div className="gift-pagination">
<button type="button" onClick={() => setPage((p) => Math.max(1, Math.min(totalPages, p) - 1))} disabled={currentPage === 1}>
Atrás
</button>
{Array.from({ length: totalPages }, (_, i) => i + 1).map((n) => (
<button
type="button"
key={n}
className={n === currentPage ? 'active-page' : ''}
onClick={() => setPage(n)}
>
{n}
</button>
))}
<button type="button" onClick={() => setPage((p) => Math.min(totalPages, Math.min(totalPages, p) + 1))} disabled={currentPage === totalPages}>
Siguiente
</button>
</div>
)}
<hr />
{/* Carrito */}
@@ -1957,6 +1957,41 @@ th {
display: none;
}
/* Enviar regalo: cuadrícula de objetos (4 por fila) centrada + paginación */
.gift-grid {
display: grid;
grid-template-columns: repeat(4, 160px);
gap: 10px;
justify-content: center;
margin: 0 auto;
}
.gift-grid .item-box {
width: auto;
margin: 0;
}
.gift-pagination {
text-align: center;
margin-top: 12px;
}
.gift-pagination button {
width: auto;
min-width: 34px;
padding: 4px 10px;
margin: 0 3px;
}
.gift-pagination button.active-page {
font-weight: bold;
color: #d79602;
}
@media (max-width: 700px) {
.gift-grid { grid-template-columns: repeat(2, 160px); }
}
/* Font Awesome */
.fa-caret-down {
color: #7e8d09;