- Nombre de la app: Prompts Estudio.
- Tipo: aplicación web estática (frontend puro, sin backend propio).
- Objetivo: explorar y reutilizar plantillas de prompts educativos con IA, organizadas por fases del aprendizaje.
- Público: alumnado, familias y personas colaboradoras del contenido.
- Idioma principal: español (
lang: es).
La app permite:
- Navegar ejemplos por fase del aprendizaje.
- Buscar ejemplos por texto (título y resumen) con coincidencia difusa.
- Abrir detalle de ejemplo con:
- Resumen de uso.
- Plantilla editable.
- Ajustes rápidos (si existen).
- Copiar la plantilla al portapapeles.
- Compartir sugerencias de mejora por email/redes/Telegram.
- Abrir enlaces profundos mediante URL (
phase,example,tab). - Instalar la app como PWA cuando el navegador lo permita.
No incluye:
- autenticación,
- persistencia de edición en servidor,
- base de datos,
- panel admin.
- Arquitectura: cliente estático.
- Tecnologías:
- HTML (
app/index.html) - CSS (
app/styles.css) - JavaScript ES modules (
app/script.js,app/collab-config.js) - Web App Manifest (
app/manifest.webmanifest) - Service Worker (
app/service-worker.js)
- HTML (
- Dependencias externas en runtime:
- Google Fonts (Manrope, Space Grotesk)
- Font Awesome vía CDN
- Datos de contenido:
content/phases.jsoncontent/examples/index.jsoncontent/examples/*.md
Objeto raíz:
phases: Phase[]
Modelo Phase:
id: string(único)name: stringicon: string(emoji u otro)description: stringexamples: string[](lista deexample.id)
Reglas:
- Un mismo ejemplo puede aparecer en varias fases.
- Si una fase referencia IDs inexistentes, se ignoran en render.
Objeto raíz:
examples: Example[]
Modelo Example:
id: string(único)title: stringsummary: stringimage?: string(ruta relativa)file?: string(ruta markdown)status?: string(valor especial soportado:under-construction)
Reglas:
- Un ejemplo es cargable si tiene
filey sustatusno esunder-construction. - Si
statusesunder-construction, la tarjeta se muestra deshabilitada.
Formato esperado:
# Título## Cuándo usarlo## Qué consigues## Prompt plantilla(normalmente dentro de bloque```text)## Ajustes rápidos
Comportamiento de parseo:
- Si faltan secciones de resumen, se muestra
No definido. - La plantilla se extrae desde sección
Prompt plantilla; si no existe, se usa el texto completo. - Si la plantilla repetida aparece concatenada, se intenta colapsar automáticamente.
- Fases: 7
- Ejemplos totales: 34
- Ejemplos cargables (con detalle): 20
- Ejemplos en construcción: 14
- Carga concurrente de
phases.jsonyindex.json. - Render de filtros de fase:
- radio chips (desktop)
- select (mobile)
- Aplicación de estado inicial desde URL (
phase,example,tab).
- Seleccionar una fase filtra la galería y actualiza título/descripción.
- Pulsar de nuevo la fase activa en radios limpia el filtro (vuelve a “todas”).
- Campo de búsqueda global por título/resumen.
- Normalización diacrítica (
á=a) y minúsculas. - Coincidencia difusa:
- substring exacta prioritaria,
- comparación por palabras,
- similitud Levenshtein con umbral ~0.55.
- Ordenado de resultados:
- ejemplos cargables primero,
- mayor score después.
- Si no hay resultados: mensaje contextual y acción para quitar filtro de fase.
- Si hay más coincidencias fuera de la fase activa: aviso “Ver todas las fases”.
- Click en tarjeta cargable.
- Fetch del markdown.
- Render de cabecera + pestañas:
ResumenPlantilla
- Mostrar barra de colaboración.
- Mostrar panel de detalle y desplazamiento suave al panel.
textareaeditable para la plantilla.- Botón “Copiar plantilla” usa Clipboard API.
- Feedback visual en éxito/error.
Query params soportados:
phase=<id>example=<id>tab=summary|prompt
Reglas:
- Si
tabinválida, cae asummary. - Si
exampleno pertenece a la fase pedida, se intenta la primera fase que sí lo contenga. - Si el ejemplo no es cargable, se limpia estado de detalle.
- Soporta navegación atrás/adelante (
popstate).
- Hero superior con:
- botón “Sobre la app”,
- buscador,
- filtros de fase.
- Galería principal de tarjetas en footer grande.
- Panel derecho de detalle ocultable.
- Modal “Sobre esta app”.
- Tarjeta normal: imagen (si existe), título, resumen.
- Sin imagen: placeholder de texto.
- En construcción:
- estado gris/deshabilitado,
- chip “En construcción”.
- Siempre se añade una tarjeta especial de colaboración (“¿Echas en falta alguna?”).
- Uso de
aria-label,aria-live, roles (radiogroup,dialog, etc.). - Navegación por teclado con cierre de modal/tooltips por
Escape. - Feedback de copiado e instalación anunciado en zonas de estado.
Configuración en app/collab-config.js:
emailtelegramUsernamesocial.linkedinsocial.blueskysocial.x- (
instagramytiktokse guardan en config, pero no tienen intent activo en UI)
Comportamiento:
- Email genera
mailto:con asunto y cuerpo pre-rellenados. - Redes generan enlaces de publicación para X, LinkedIn y Bluesky.
- Telegram abre mensaje precompuesto a
t.me/<usuario>. - Si falta configuración, se muestran estados informativos.
La app actualiza dinámicamente:
document.titlemeta[name=description]og:type,og:title,og:description,og:image,og:urltwitter:title,twitter:description,twitter:image,twitter:card
Criterio:
- Sin selección: metadatos globales.
- Con fase: metadatos de fase.
- Con ejemplo: metadatos de ejemplo.
display: standalone- iconos
192y512(maskable) start_url: ./index.html
- Gestión de
beforeinstallpromptyappinstalled. - Dos puntos de entrada: barra superior y modal “Sobre la app”.
- Persistencia local en
localStorage:prompts-estudio.install-hello-dismissedprompts-estudio.install-completed
- Estrategia principal:
cache-firstpara origen propio. - Precarga de app shell y JSON base.
- Versionado de caché:
prompts-estudio-v2. - Limpieza de cachés antiguas en
activate. - Fallback en error de red a
./index.html.
Limitación:
- Recursos de terceros (fuentes/CDN) no se cachean en este SW al filtrar por mismo origen.
- La app debe servirse por HTTP/HTTPS (no abrir
file://) por uso defetch. - Debe funcionar en navegadores modernos con soporte ES modules.
- Debe degradar de forma segura si fallan APIs opcionales (clipboard, SW, storage).
- Debe mantener tiempos de carga bajos al ser estática y sin build.
- Workflow:
.github/workflows/pages.yml - Evento: push a
main(y manualworkflow_dispatch). - Estrategia: publicar el repositorio completo como artifact en GitHub Pages.
- Variables recomendadas en prompts:
[TEMA],[EDAD/NIVEL],[CURSO],[OBJETIVO],[CONTEXTO]. - Se priorizan plantillas adaptables frente a prompts cerrados.
- Se permite publicar ejemplos “en construcción” sin archivo markdown.
- Se pueden cargar fases y ejemplos desde JSON sin build.
- La búsqueda devuelve coincidencias útiles incluso con variaciones ortográficas simples.
- Los ejemplos en construcción no abren detalle.
- El detalle permite editar y copiar la plantilla.
- La URL refleja fase/ejemplo/pestaña y permite recarga/deep link.
- La app puede instalarse como PWA cuando el navegador lo soporta.
- La app sigue siendo usable aunque fallen SW/clipboard/localStorage.