UNPKG

gentelella

Version:

Gentelella v4 — free admin template. 60 pages, 20 chart variants, fully interactive inbox & kanban, live theme generator, component playground, PWA-ready. Vite 8, vanilla JS, no Bootstrap, no jQuery.

95 lines (85 loc) 4.3 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Products | Gentelella 2026 v4</title> <link rel="icon" href="../images/favicon.svg" type="image/svg+xml"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <script type="module" src="/src/main-v4.js"></script> </head> <body data-shell="admin" data-page="pages" data-breadcrumb="Home > E-commerce > Products"> <main class="main"> <div class="page-wrapper"> <div class="page-header"> <div class="page-header-row"> <div> <div class="page-pretitle">Catalog</div> <h1 class="page-title">Products</h1> </div> <div class="page-actions"> <button class="btn btn-outline">Categories</button> <button class="btn btn-primary"> <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M4 8h8M8 4v8"/></svg> Add product </button> </div> </div> </div> <!-- Filter bar --> <div class="card" style="margin-bottom:16px"> <div class="card-body" style="display:flex;gap:8px;flex-wrap:wrap;align-items:center;padding:12px 16px"> <span style="font-size:12px;color:var(--text-muted);font-weight:var(--font-weight-medium)">Filter:</span> <span class="chip chip-primary active">Apparel<button type="button" class="chip-close" aria-label="Remove Apparel">×</button></span> <span class="chip">Accessories</span> <span class="chip">Electronics</span> <span class="chip">Home</span> <span class="chip">In stock</span> <span class="chip chip-yellow active">On sale<button type="button" class="chip-close" aria-label="Remove On sale">×</button></span> <span style="margin-left:auto;font-size:12px;color:var(--text-muted)">128 results</span> <select class="form-control" style="width:140px;height:32px" aria-label="Sort orders"> <option>Sort: Newest</option> <option>Sort: Price ↑</option> <option>Sort: Price ↓</option> <option>Sort: Best-selling</option> </select> </div> </div> <div class="row col-3" id="products-grid"></div> </div> </main> <script type="module"> import { PRODUCT_IMAGES } from '/src/v4/product-images.js'; const products = [ ['Aurora hoodie', 'Apparel', 49, 65, 'Sale', 'red', '★★★★☆ 4.6 (128)', 'hoodie'], ['Linen field shirt', 'Apparel', 89, null,'New', 'green', '★★★★★ 4.9 (42)', 'shirt'], ['Trail runner sneakers', 'Footwear', 129,159, 'Sale', 'red', '★★★★☆ 4.4 (231)', 'sneakers'], ['Canvas weekend bag', 'Accessories', 79, null,null, null, '★★★★☆ 4.5 (76)', 'bag'], ['Wireless earbuds Pro', 'Electronics', 149,null,'Hot', 'yellow', '★★★★★ 5.0 (892)', 'earbuds'], ['Ceramic pour-over set', 'Home', 54, null,null, null, '★★★★☆ 4.7 (61)', 'pourover'], ['Standing desk mat', 'Home', 39, 49, 'Sale', 'red', '★★★★☆ 4.3 (158)', 'mat'], ['Mechanical keyboard', 'Electronics', 189,null,'New', 'green', '★★★★★ 4.8 (304)', 'keyboard'], ['Merino base layer', 'Apparel', 69, null,null, null, '★★★★☆ 4.6 (97)', 'baselayer'] ]; document.getElementById('products-grid').innerHTML = products.map(([name, cat, price, oldPrice, badge, badgeCls, stars, slug]) => ` <a class="product-card" href="product_detail.html"> <div class="product-thumb"> ${badge ? `<span class="product-badge"><span class="chip chip-${badgeCls}">${badge}</span></span>` : ''} ${PRODUCT_IMAGES[slug] || ''} </div> <div class="product-info"> <div class="name">${name}</div> <div class="category">${cat}</div> <div class="price-row"> <span class="price">$${price}</span> ${oldPrice ? `<span class="price-old">$${oldPrice}</span>` : ''} </div> <div class="stars">${stars}</div> </div> </a> `).join(''); </script> </body> </html>