1 Commits

Author SHA1 Message Date
Juanse Marquez
d505e030c2 Solución ejercicio 7 2026-06-01 18:48:44 -03:00
6 changed files with 79 additions and 323 deletions

View File

@@ -1 +1,46 @@
// Agregar aquí el código javascript const form = document.querySelector("#formulario");
function mostrarError(id, mensaje) {
document.querySelector(id).textContent = mensaje;
}
function limpiarError(id) {
document.querySelector(id).textContent = "";
}
form.addEventListener("submit", (e) => {
e.preventDefault();
const nombre = document.querySelector("#nombre").value.trim();
const edad = document.querySelector("#edad").value.trim();
const password = document.querySelector("#password").value;
// Limpiamos todos los errores antes de volver a validar.
limpiarError("#error-nombre");
limpiarError("#error-edad");
limpiarError("#error-password");
document.querySelector("#exito").textContent = "";
let valido = true;
if (nombre === "") {
mostrarError("#error-nombre", "El nombre no puede estar vacío.");
valido = false;
}
if (edad === "" || parseInt(edad) < 0 || parseInt(edad) > 100) {
mostrarError("#error-edad", "La edad no tiene un formato válido.");
valido = false;
}
if (password.length < 8) {
mostrarError("#error-password", "La contraseña debe tener al menos 8 caracteres.");
valido = false;
}
// Solo mostramos el éxito si todos los campos son válidos.
if (valido) {
document.querySelector("#exito").textContent = "Formulario enviado correctamente.";
form.reset(); // reset() limpia todos los campos del formulario
}
});

View File

@@ -1,2 +1,6 @@
/* Agregar el código CSS necesario para el ejercicio */ /* Agregar el código CSS necesario para el ejercicio */
.error {
color: red;
font-size: 0.5em;
}

View File

@@ -8,6 +8,22 @@
</head> </head>
<body> <body>
<h1>Ejercicio 7</h1> <h1>Ejercicio 7</h1>
<form id="formulario">
<div>
<input type="text" id="nombre" placeholder="Nombre">
<span class="error" id="error-nombre"></span>
</div>
<div>
<input type="number" id="edad" placeholder="Edad">
<span class="error" id="error-edad"></span>
</div>
<div>
<input type="password" id="password" placeholder="Contraseña">
<span class="error" id="error-password"></span>
</div>
<button type="submit">Enviar</button>
<p id="exito"></p>
</form>
<script src="ejercicio7.js"></script> <script src="ejercicio7.js"></script>
</body> </body>

View File

@@ -1,72 +1 @@
const productos = [ // Agregar aquí el código javascript
{ nombre: "Teclado", precio: 8500 },
{ nombre: "Mouse", precio: 4200 },
{ nombre: "Monitor", precio: 62000 },
{ nombre: "Auriculares", precio: 11000 },
{ nombre: "Webcam", precio: 15500 }
];
// El carrito es un array de objetos { nombre, precio, cantidad }, que
// inicializamos vacío fuera de las funciones (para que sea global):
const carrito = [];
const listaProductos = document.querySelector("#productos");
function actualizarCarrito() {
const totalParrafo = document.querySelector("#total");
const listaCarrito = document.querySelector("#carrito");
listaCarrito.innerHTML = "";
// Calculamos el total mientras construimos la lista.
let total = 0;
for (const item of carrito) {
const subtotal = item.precio * item.cantidad;
total += subtotal;
const li = document.createElement("li");
li.textContent = `${item.nombre} x${item.cantidad}$${subtotal.toLocaleString()}`;
listaCarrito.appendChild(li);
}
totalParrafo.textContent = `Total: $${total.toLocaleString()}`;
}
function agregarAlCarrito(producto) {
// Buscamos si el producto ya está en el carrito.
const itemExistente = carrito.find(item => item.nombre === producto.nombre);
if (itemExistente) {
// Si ya existe, solo incrementamos la cantidad.
itemExistente.cantidad++;
} else {
// Si no existe, lo agregamos manualmente con cantidad 1,
// copiando las propiedades una por una.
carrito.push({
nombre: producto.nombre,
precio: producto.precio,
cantidad: 1
});
}
actualizarCarrito();
}
// Construimos la lista de productos con un botón por cada uno.
for (const producto of productos) {
const listaProductos = document.querySelector("#productos");
const card = document.createElement("div");
card.className = "product-card";
card.innerHTML = `
<div>
<p class="product-name">${producto.nombre}</p>
<p class="product-price">$${producto.precio.toLocaleString()}</p>
</div>
<button class="btn-add">+ Agregar</button>
`;
card.querySelector(".btn-add").addEventListener("click", () => agregarAlCarrito(producto));
listaProductos.appendChild(card);
}
actualizarCarrito();

View File

@@ -1,215 +1,2 @@
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } /* Agregar el código CSS necesario para el ejercicio */
body {
font-family: system-ui, sans-serif;
background: #f5f4f0;
color: #1a1a1a;
min-height: 100vh;
padding: 2rem;
}
h1 {
font-size: 1.1rem;
font-weight: 500;
color: #555;
margin-bottom: 1.5rem;
}
.layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
max-width: 820px;
}
.section-label {
font-size: 0.7rem;
font-weight: 500;
color: #888;
text-transform: uppercase;
letter-spacing: 0.06em;
margin-bottom: 0.75rem;
}
/* ── Productos ── */
.product-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.product-card {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 14px;
background: #fff;
border: 0.5px solid #ddd;
border-radius: 8px;
}
.product-name {
font-size: 0.875rem;
font-weight: 500;
color: #1a1a1a;
}
.product-price {
font-size: 0.75rem;
color: #888;
margin-top: 2px;
}
.btn-add {
display: flex;
align-items: center;
gap: 4px;
padding: 6px 12px;
font-size: 0.75rem;
font-weight: 500;
background: transparent;
border: 0.5px solid #ccc;
border-radius: 6px;
color: #1a1a1a;
cursor: pointer;
transition: background 0.15s;
}
.btn-add:hover { background: #f0efeb; }
/* ── Carrito ── */
.cart-panel {
background: #edecea;
border: 0.5px solid #ddd;
border-radius: 12px;
padding: 1rem 1.25rem;
display: flex;
flex-direction: column;
gap: 10px;
}
.cart-header {
display: flex;
align-items: center;
justify-content: space-between;
}
.badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 18px;
height: 18px;
padding: 0 5px;
background: #fde8e8;
color: #a32d2d;
border-radius: 9px;
font-size: 0.625rem;
font-weight: 500;
margin-left: 4px;
}
.cart-empty {
font-size: 0.8rem;
color: #aaa;
text-align: center;
padding: 1.5rem 0;
}
.cart-items {
display: flex;
flex-direction: column;
gap: 8px;
}
.cart-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 10px;
background: #fff;
border: 0.5px solid #ddd;
border-radius: 8px;
}
.cart-item-name {
font-size: 0.8rem;
font-weight: 500;
color: #1a1a1a;
}
.cart-item-sub {
font-size: 0.7rem;
color: #888;
margin-top: 2px;
}
.cart-item-right {
display: flex;
align-items: center;
gap: 10px;
}
.cart-item-total {
font-size: 0.8rem;
font-weight: 500;
color: #1a1a1a;
min-width: 64px;
text-align: right;
}
.qty-controls {
display: flex;
align-items: center;
gap: 4px;
}
.qty-btn {
width: 22px;
height: 22px;
border: 0.5px solid #ccc;
border-radius: 4px;
background: transparent;
color: #1a1a1a;
cursor: pointer;
font-size: 0.875rem;
display: flex;
align-items: center;
justify-content: center;
line-height: 1;
}
.qty-btn:hover { background: #f0efeb; }
.qty-val {
font-size: 0.8rem;
font-weight: 500;
min-width: 16px;
text-align: center;
color: #1a1a1a;
}
.divider {
border: none;
border-top: 0.5px solid #ccc;
}
.cart-total {
display: flex;
justify-content: space-between;
align-items: baseline;
}
.cart-total-label {
font-size: 0.8rem;
color: #888;
}
.cart-total-amount {
font-size: 1.25rem;
font-weight: 500;
color: #1a1a1a;
}

View File

@@ -1,38 +1,13 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="es"> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width">
<title>Ejercicio 8 — Carrito de compras</title> <title>Ejercicio 8</title>
<style></style>
<link rel="stylesheet" href="estilo.css"> <link rel="stylesheet" href="estilo.css">
</head> </head>
<body> <body>
<h1>Ejercicio 8</h1>
<h1>Ejercicio 8 — Carrito de compras</h1>
<div class="layout">
<div>
<p class="section-label">Productos</p>
<div class="product-list" id="productos"></div>
</div>
<div class="cart-panel">
<div class="cart-header">
<p class="section-label" style="margin:0">
Carrito
</p>
</div>
<div class="cart-items" id="carrito">
<p class="cart-empty" id="empty-msg">El carrito está vacío.</p>
</div>
<hr class="divider">
<div class="cart-total">
<span class="cart-total-label">Total</span>
<span class="cart-total-amount" id="total">$0</span>
</div>
</div>
</div>
<script src="ejercicio8.js"></script> <script src="ejercicio8.js"></script>
</body> </body>