Tienda web estática con catálogo filtrable, favoritos, carrito y checkout con cupones/envío/pagos simulados, modo oscuro y datos JSON en localStorage.
Proyecto académico de e-commerce sin framework (HTML/CSS/JS puro) servido por Apache (XAMPP/WAMP/LAMP).
Datos en JSON y estado con localStorage. UI con Bootstrap 5 + modo claro/oscuro.
Construir un mini-marketplace funcional (catálogo → detalle → carrito → checkout) cumpliendo la rúbrica:
fetch sobre http://.data/*.json; sesión/estado en localStorage./ (raíz del sitio en Apache: htdocs/mini-amazon)
mini-amazon/
├── index.html
├── catalogo.html
├── producto.html
├── cart.html
├── checkout.html
├── favoritos.html
├── orders.html
├── css/
│ └── styles.css
├── js/
│ ├── app.js
│ ├── api.js
│ ├── catalogo.js
│ ├── producto.js
│ ├── cart.js
│ ├── favoritos.js
│ ├── orders.js
│ ├── tienda.js
│ └── checkout.js
├── data/
│ ├── categorias.json
│ ├── cupones.json
│ ├── envios.json
│ ├── localidades.json
│ ├── productos.json
│ └── reviews.json
└── img/
├── placeholder.png
├── bancoestado.svg
├── apay.svg
├── gpay.svg
├── paypal.svg
├── prod1001-1.png
├── prod1001-2.png
├── prod1002-1.png
├── prod1003-1.png
├── prod1004-1.png
├── prod1005-1.png
└── prod1006-1.png
C:\xampp\htdocs\mini-amazon (Windows) o /Applications/XAMPP/xamppfiles/htdocs/mini-amazon (macOS).http://localhost/mini-amazon/.200.index.html): hero + 3 destacados.catalogo.html): búsqueda con sugerencias (datalist), filtros (acordeón), ordenamiento, “Quick View”.producto.html): galería, qty con límite por stock, tabla de especificaciones, relacionados.cart.html): cantidades (±), subtotales, IVA, total, vaciar con modal.checkout.html): datos, región/comuna (JSON), envío (select y costo bloqueado), cupones (fixed/percent/ship), métodos de pago (tarjeta/transferencia) + pago rápido (PayPal/ BancoEstado /Amazon/GPay), captcha y confirmación de orden.normalizeProduct): acepta claves ES/EN (titulo/name, imagenes/images, categoria/category).max; toasts de error si supera.fixed, percent, ship; base imponible = subtotal - descuento; IVA = 19%; ENVIOGRATIS → ship=0.localStorage.data/productos.json: catálogo (incluye specs por producto).data/localidades.json: regiones/comunas.data/envios.json: opciones de envío { id, name, cost }.data/cupones.json: { code, type: fixed|percent|ship, value }.is-invalid y mensajes visibles.+ y dígitos (+569…).main (estable), feature/*, fix/*, docs/*.feat|fix|refactor|docs|chore(scope): mensaje.localStoragedocs/screens/home.pngdocs/screens/catalogo.pngdocs/screens/producto.pngdocs/screens/checkout-cupon.pngMIT — Uso académico.
Lukas Flores (@Raizexs)