prd / index.html
xSerpicoxx's picture
Crea una app web que sirva para elaborar el menú semanaluna dieta equilibrada basada en la dieta de Judy Morgan para perros. Podrá distinguir entre perros pequeños, medianos y grandes. Energía alta, media y baja. Actividad diaria alta, media y baja. Macho y hembra. Cachorro, adolescente adulto y anciano. Calculará el equilibrio de nutrientes en función de las selecciones del usuario y establecerá las recetas del menú semanal contando con eso. UI sencilla con desplegables - Follow Up Deployment
b0109f5 verified
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dieta Canina Judy Morgan</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.fade-in {
animation: fadeIn 0.5s ease-in-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.nutrient-bar {
transition: width 0.5s ease-in-out;
}
</style>
</head>
<body class="bg-gray-50 min-h-screen">
<div class="container mx-auto px-4 py-8 max-w-4xl">
<header class="text-center mb-8">
<h1 class="text-3xl md:text-4xl font-bold text-indigo-800 mb-2">
<i class="fas fa-paw mr-2"></i>Dieta Canina Judy Morgan
</h1>
<p class="text-gray-600">Crea un menú semanal equilibrado para tu perro</p>
</header>
<div class="bg-white rounded-lg shadow-md p-6 mb-8">
<h2 class="text-xl font-semibold text-indigo-700 mb-4">Datos de tu perro</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<!-- Tamaño del perro -->
<div>
<label class="block text-gray-700 mb-2">Tamaño</label>
<select id="size" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-200 focus:border-indigo-500">
<option value="" disabled selected>Selecciona el tamaño</option>
<option value="small">Pequeño (1-10 kg)</option>
<option value="medium">Mediano (11-25 kg)</option>
<option value="large">Grande (26+ kg)</option>
</select>
</div>
<!-- Edad del perro -->
<div>
<label class="block text-gray-700 mb-2">Etapa de vida</label>
<select id="age" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-200 focus:border-indigo-500">
<option value="" disabled selected>Selecciona la edad</option>
<option value="puppy">Cachorro (0-1 año)</option>
<option value="teen">Adolescente (1-2 años)</option>
<option value="adult">Adulto (2-7 años)</option>
<option value="senior">Anciano (7+ años)</option>
</select>
</div>
<!-- Nivel de energía -->
<div>
<label class="block text-gray-700 mb-2">Nivel de energía</label>
<select id="energy" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-200 focus:border-indigo-500">
<option value="" disabled selected>Selecciona el nivel</option>
<option value="high">Alta</option>
<option value="medium">Media</option>
<option value="low">Baja</option>
</select>
</div>
<!-- Actividad diaria -->
<div>
<label class="block text-gray-700 mb-2">Actividad diaria</label>
<select id="activity" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-200 focus:border-indigo-500">
<option value="" disabled selected>Selecciona el nivel</option>
<option value="high">Alta (2+ horas ejercicio)</option>
<option value="medium">Media (1-2 horas ejercicio)</option>
<option value="low">Baja (menos de 1 hora)</option>
</select>
</div>
<!-- Sexo del perro -->
<div>
<label class="block text-gray-700 mb-2">Sexo</label>
<select id="gender" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-200 focus:border-indigo-500">
<option value="" disabled selected>Selecciona el sexo</option>
<option value="male">Macho</option>
<option value="female">Hembra</option>
</select>
</div>
<!-- Condiciones especiales -->
<div>
<label class="block text-gray-700 mb-2">Condiciones especiales</label>
<select id="conditions" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-200 focus:border-indigo-500">
<option value="none" selected>Ninguna</option>
<option value="allergies">Alergias alimentarias</option>
<option value="overweight">Sobrepeso</option>
<option value="kidney">Problemas renales</option>
<option value="joint">Problemas articulares</option>
</select>
</div>
</div>
<div class="mt-6 text-center">
<button id="calculateBtn" class="bg-indigo-600 hover:bg-indigo-700 text-white font-medium py-3 px-6 rounded-lg transition duration-300 transform hover:scale-105">
<i class="fas fa-calculator mr-2"></i>Calcular Menú
</button>
</div>
</div>
<!-- Resultados - Oculto inicialmente -->
<div id="results" class="hidden bg-white rounded-lg shadow-md p-6 mb-8 fade-in">
<h2 class="text-xl font-semibold text-indigo-700 mb-4">Recomendaciones nutricionales</h2>
<div class="mb-6">
<h3 class="text-lg font-medium text-gray-800 mb-3">Balance nutricional ideal</h3>
<div class="space-y-4">
<div>
<div class="flex justify-between mb-1">
<span class="text-sm font-medium text-gray-700">Proteínas</span>
<span id="protein-percent" class="text-sm font-medium text-gray-700">--%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2.5">
<div id="protein-bar" class="nutrient-bar h-2.5 rounded-full bg-blue-600" style="width: 0%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span class="text-sm font-medium text-gray-700">Grasas</span>
<span id="fat-percent" class="text-sm font-medium text-gray-700">--%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2.5">
<div id="fat-bar" class="nutrient-bar h-2.5 rounded-full bg-yellow-500" style="width: 0%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span class="text-sm font-medium text-gray-700">Carbohidratos</span>
<span id="carbs-percent" class="text-sm font-medium text-gray-700">--%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2.5">
<div id="carbs-bar" class="nutrient-bar h-2.5 rounded-full bg-green-500" style="width: 0%"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-1">
<span class="text-sm font-medium text-gray-700">Fibra</span>
<span id="fiber-percent" class="text-sm font-medium text-gray-700">--%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2.5">
<div id="fiber-bar" class="nutrient-bar h-2.5 rounded-full bg-purple-500" style="width: 0%"></div>
</div>
</div>
</div>
</div>
<div class="mb-6">
<h3 class="text-lg font-medium text-gray-800 mb-3">Cantidad diaria recomendada</h3>
<div class="bg-indigo-50 p-4 rounded-lg">
<div class="flex items-center">
<i class="fas fa-bowl-food text-2xl text-indigo-600 mr-3"></i>
<div>
<p class="font-medium text-gray-800">Tu perro debería consumir aproximadamente:</p>
<p id="daily-amount" class="text-xl font-bold text-indigo-700">-- gramos por día</p>
</div>
</div>
</div>
</div>
<div>
<h3 class="text-lg font-medium text-gray-800 mb-3">Menú semanal</h3>
<div class="overflow-x-auto">
<table class="min-w-full bg-white border border-gray-200 rounded-lg">
<thead class="bg-gray-100">
<tr>
<th class="py-2 px-4 border-b">Día</th>
<th class="py-2 px-4 border-b">Desayuno</th>
<th class="py-2 px-4 border-b">Cena</th>
</tr>
</thead>
<tbody id="weekly-menu" class="divide-y divide-gray-200">
<!-- Aquí se generará el menú dinámicamente -->
</tbody>
</table>
</div>
<div class="mt-4 bg-yellow-50 p-4 rounded-lg border border-yellow-200">
<div class="flex">
<i class="fas fa-lightbulb text-yellow-500 text-xl mr-3 mt-1"></i>
<div>
<h4 class="font-medium text-yellow-800 mb-1">Consejos de Judy Morgan</h4>
<p id="tips" class="text-yellow-700">Selecciona las características de tu perro para obtener consejos personalizados.</p>
</div>
</div>
</div>
</div>
</div>
<footer class="text-center text-gray-500 text-sm mt-12">
<p>Esta aplicación sigue los principios de la dieta natural para perros de la Dra. Judy Morgan.</p>
<p class="mt-1">Consulta siempre con tu veterinario antes de cambiar la dieta de tu mascota.</p>
</footer>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const calculateBtn = document.getElementById('calculateBtn');
const resultsSection = document.getElementById('results');
calculateBtn.addEventListener('click', function() {
// Validar que todos los campos estén completos
const size = document.getElementById('size').value;
const age = document.getElementById('age').value;
const energy = document.getElementById('energy').value;
const activity = document.getElementById('activity').value;
const gender = document.getElementById('gender').value;
const conditions = document.getElementById('conditions').value;
if (!size || !age || !energy || !activity || !gender) {
alert('Por favor completa todos los campos obligatorios.');
return;
}
// Calcular recomendaciones basadas en las selecciones
calculateRecommendations(size, age, energy, activity, gender, conditions);
// Mostrar resultados con animación
resultsSection.classList.remove('hidden');
resultsSection.classList.add('fade-in');
// Desplazarse suavemente a los resultados
resultsSection.scrollIntoView({ behavior: 'smooth' });
});
function calculateRecommendations(size, age, energy, activity, gender, conditions) {
// Base de datos de recetas
const recipes = {
breakfast: [
{ name: "Pollo con calabaza y espinacas", protein: 40, fat: 20, carbs: 30, fiber: 10 },
{ name: "Pavo con zanahoria y arroz integral", protein: 35, fat: 15, carbs: 40, fiber: 10 },
{ name: "Salmón con boniato y judías verdes", protein: 30, fat: 25, carbs: 35, fiber: 10 },
{ name: "Ternera con quinoa y brócoli", protein: 45, fat: 15, carbs: 30, fiber: 10 },
{ name: "Hígado con patata dulce y guisantes", protein: 35, fat: 20, carbs: 35, fiber: 10 },
{ name: "Pescado blanco con calabacín y mijo", protein: 40, fat: 10, carbs: 40, fiber: 10 },
{ name: "Cordero con col rizada y cebada", protein: 30, fat: 25, carbs: 35, fiber: 10 }
],
dinner: [
{ name: "Pavo con arroz y espárragos", protein: 35, fat: 15, carbs: 40, fiber: 10 },
{ name: "Pollo con patata y zanahoria", protein: 40, fat: 20, carbs: 30, fiber: 10 },
{ name: "Sardinas con quinoa y espinacas", protein: 30, fat: 25, carbs: 35, fiber: 10 },
{ name: "Conejo con calabaza y judías", protein: 45, fat: 15, carbs: 30, fiber: 10 },
{ name: "Pescado azul con boniato y brócoli", protein: 35, fat: 20, carbs: 35, fiber: 10 },
{ name: "Ternera con arroz integral y calabacín", protein: 40, fat: 10, carbs: 40, fiber: 10 },
{ name: "Pollo con lentejas y coliflor", protein: 30, fat: 25, carbs: 35, fiber: 10 }
]
};
// Determinar porcentajes nutricionales basados en las necesidades
let proteinPercent, fatPercent, carbsPercent, fiberPercent;
// Cachorros necesitan más proteína y grasa
if (age === 'puppy') {
proteinPercent = 40;
fatPercent = 25;
carbsPercent = 25;
fiberPercent = 10;
}
// Perros senior necesitan menos grasa y más fibra
else if (age === 'senior') {
proteinPercent = 30;
fatPercent = 15;
carbsPercent = 35;
fiberPercent = 20;
}
// Perros con alta energía y actividad necesitan más carbohidratos
else if (energy === 'high' && activity === 'high') {
proteinPercent = 35;
fatPercent = 20;
carbsPercent = 35;
fiberPercent = 10;
}
// Perros con sobrepeso necesitan menos grasa y carbohidratos
else if (conditions === 'overweight') {
proteinPercent = 40;
fatPercent = 15;
carbsPercent = 25;
fiberPercent = 20;
}
// Perros con problemas renales necesitan menos proteína
else if (conditions === 'kidney') {
proteinPercent = 25;
fatPercent = 25;
carbsPercent = 40;
fiberPercent = 10;
}
// Perros con problemas articulares necesitan más ácidos grasos
else if (conditions === 'joint') {
proteinPercent = 30;
fatPercent = 30;
carbsPercent = 30;
fiberPercent = 10;
}
// Perros normales
else {
proteinPercent = 35;
fatPercent = 20;
carbsPercent = 35;
fiberPercent = 10;
}
// Calcular cantidad diaria basada en tamaño y actividad
let dailyAmount;
if (size === 'small') {
dailyAmount = energy === 'high' ? 150 : (energy === 'medium' ? 120 : 100);
} else if (size === 'medium') {
dailyAmount = energy === 'high' ? 350 : (energy === 'medium' ? 300 : 250);
} else { // large
dailyAmount = energy === 'high' ? 600 : (energy === 'medium' ? 500 : 400);
}
// Ajustar por edad
if (age === 'puppy') dailyAmount *= 1.2;
if (age === 'senior') dailyAmount *= 0.9;
// Ajustar por condiciones
if (conditions === 'overweight') dailyAmount *= 0.8;
// Actualizar la UI con los resultados
updateNutritionBars(proteinPercent, fatPercent, carbsPercent, fiberPercent);
document.getElementById('protein-percent').textContent = proteinPercent + '%';
document.getElementById('fat-percent').textContent = fatPercent + '%';
document.getElementById('carbs-percent').textContent = carbsPercent + '%';
document.getElementById('fiber-percent').textContent = fiberPercent + '%';
document.getElementById('daily-amount').textContent = Math.round(dailyAmount) + ' gramos por día';
// Generar menú semanal
generateWeeklyMenu(recipes);
// Mostrar consejos personalizados
showPersonalizedTips(size, age, energy, activity, gender, conditions);
}
function updateNutritionBars(protein, fat, carbs, fiber) {
setTimeout(() => {
document.getElementById('protein-bar').style.width = protein + '%';
document.getElementById('fat-bar').style.width = fat + '%';
document.getElementById('carbs-bar').style.width = carbs + '%';
document.getElementById('fiber-bar').style.width = fiber + '%';
}, 100);
}
function generateWeeklyMenu(recipes) {
const weeklyMenu = document.getElementById('weekly-menu');
weeklyMenu.innerHTML = '';
const days = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo'];
for (let i = 0; i < 7; i++) {
const row = document.createElement('tr');
const dayCell = document.createElement('td');
dayCell.className = 'py-2 px-4 border-b text-center font-medium';
dayCell.textContent = days[i];
const breakfastCell = document.createElement('td');
breakfastCell.className = 'py-2 px-4 border-b';
breakfastCell.textContent = recipes.breakfast[i].name;
const dinnerCell = document.createElement('td');
dinnerCell.className = 'py-2 px-4 border-b';
dinnerCell.textContent = recipes.dinner[i].name;
row.appendChild(dayCell);
row.appendChild(breakfastCell);
row.appendChild(dinnerCell);
weeklyMenu.appendChild(row);
}
}
function showPersonalizedTips(size, age, energy, activity, gender, conditions) {
const tipsElement = document.getElementById('tips');
let tips = [];
// Tips basados en tamaño
if (size === 'small') {
tips.push("Los perros pequeños tienen metabolismos más rápidos, por lo que necesitan comidas más frecuentes pero en porciones pequeñas.");
} else if (size === 'large') {
tips.push("Los perros grandes son propensos a problemas articulares, considera añadir suplementos de glucosamina y condroitina.");
}
// Tips basados en edad
if (age === 'puppy') {
tips.push("Los cachorros necesitan más proteínas y grasas para su crecimiento. Alimenta 3-4 veces al día.");
} else if (age === 'senior') {
tips.push("Los perros senior se benefician de comidas más fáciles de digerir y con más fibra para la salud intestinal.");
}
// Tips basados en energía y actividad
if (energy === 'high' && activity === 'high') {
tips.push("Para perros muy activos, considera añadir carbohidratos complejos como fuente de energía sostenida.");
} else if (energy === 'low' && activity === 'low') {
tips.push("Los perros con baja actividad necesitan menos calorías para evitar el aumento de peso.");
}
// Tips basados en condiciones especiales
if (conditions === 'allergies') {
tips.push("Para perros con alergias, usa proteínas novedosas como conejo o venado y evita ingredientes comunes como pollo o trigo.");
} else if (conditions === 'overweight') {
tips.push("Para perros con sobrepeso, aumenta la fibra para promover la saciedad y reduce las grasas y carbohidratos.");
} else if (conditions === 'kidney') {
tips.push("Para problemas renales, reduce el fósforo y la proteína, pero mantén la proteína de alta calidad.");
} else if (conditions === 'joint') {
tips.push("Para problemas articulares, aumenta los ácidos grasos omega-3 que tienen propiedades antiinflamatorias.");
}
// Consejo general de Judy Morgan
tips.push("Recuerda variar las proteínas cada 3-4 meses para proporcionar una nutrición equilibrada y prevenir alergias.");
tipsElement.textContent = tips.join(' ');
}
});
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=xSerpicoxx/prd" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>