EduPets has no frontend build step, no bundler, and no JavaScript framework. Each HTML page is a standalone Jinja2 template that includes one or twoDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/Edupets-Studio/Edu-pets/llms.txt
Use this file to discover all available pages before exploring further.
<script> tags pointing at plain vanilla JS files in static/js/. The only reason Jinja2 is involved at all is to resolve {{ url_for('static', ...) }} expressions into correct absolute paths at render time — everything else the browser handles on its own.
Template system
Jinja2 templates in EduPets are used exclusively for one purpose: generating correct URLs for static assets viaurl_for('static', path='...'). There is no template inheritance ({% extends %}), no {% block %} system, and no dynamic data passed from Python into the template context. Every page is essentially a static HTML file where the asset paths are filled in at request time.
Here is how the home page (index.html) uses url_for:
templates/index.html
{{ url_for('static', path='Estilos/index.css') }} becomes /static/Estilos/index.css. This keeps asset references working correctly in both local development and on Vercel without hardcoding paths.
JavaScript files
Each page loads exactly one JS file responsible for all the interactivity on that page. Files are not shared between pages. The info pages (/que-es, /por-que, /equipo) load no JavaScript.
| File | Used on | Purpose |
|---|---|---|
Fondo.js | / (index) | Animated canvas particle background — draws floating mathematical symbols |
Login.js | /login | Client-side login form handling; calls Google Apps Script via fetch |
registro.js | /registro | Client-side registration form handling; also draws animated canvas background |
mascota.js | /mascota | Pet stats display, passive stat decay timer, task generation, and pet name editing |
Suma.js | /ejercicio1 | Addition exercise game logic — 10 questions, 3 lives, stat boost on completion |
resta.js | /ejercicio2 | Subtraction exercise game logic |
multiplicacion.js | /ejercicio3 | Multiplication exercise game logic |
division.js | /ejercicio4 | Division exercise game logic |
Examen.js | /examenes | Mixed exam mode — randomly cycles through all four operation types, 5 questions, 2 lives |
CSS stylesheets
Each page links its own stylesheet fromstatic/Estilos/. There is no global stylesheet or CSS reset shared across all pages.
| File | Used on |
|---|---|
index.css | Home page (/) |
Mascota.css | Pet dashboard (/mascota) |
Ejercicios.css | All exercise pages (/ejercicio1–/ejercicio4) and exam mode (/examenes) |
Tienda.css | Store (/tienda) |
login.css | Login page (/login) |
registro.css | Registration page (/registro) |
informacion.css | Info pages (/que-es, /por-que, /equipo) |
Background music player
The/player route renders a minimal HTML page containing an audio element with autoplay. Most pages embed it as a hidden <iframe>:
allow="autoplay" attribute grants the iframe permission to start audio without a direct user interaction on the parent frame.
Canvas animation
Fondo.js draws an animated floating-symbol background on a full-screen <canvas id="symbols"> element. It spawns 30 particles, each carrying a random mathematical or special symbol, and moves them across the canvas at a slow drift speed, bouncing off the edges.
static/js/Fondo.js
resize event so it always covers the entire background. The aria-hidden="true" attribute on the <canvas> element keeps the decorative animation invisible to screen readers.
