Plataforma web para crear, editar y exportar documentos legales a partir de plantillas con {{placeholders}}.
Frontend: React + Vite + Tailwind · Backend: Node.js + Express + MongoDB · Auth: JWT · PDF: html2pdf.js.
- Autenticación (registro/login) con JWT.
- Gestión de plantillas (propias y globales).
- Subida de documentos
.txt/.html→ conversión automática a plantilla editable. - Detección de placeholders
{{campo}}y marcado de selección para crear campos. - Formulario dinámico (inputs no controlados → foco estable).
- Vista previa del documento renderizado y exportación a PDF.
- Historial de documentos generados por usuario.
- UI de alto contraste (accesible) y diseño limpio.
- Búsqueda demo de normativa colombiana (mock, lista para conectar a índice real).
Monorepo con dos paquetes:
/frontend
/backend
- Frontend: SPA con React Router, estado con Context (Auth), llamadas API con Axios.
- Backend: API REST Express; modelos con Mongoose; middlewares de seguridad (Helmet, CORS); logging (morgan).
- PDF: html2pdf.js (html2canvas + jsPDF).
- Calidad: ESLint + Prettier; GitHub Actions (lint); Husky + lint-staged (opcional).
/frontend
/src
/assets # Imágenes, logos
/components # Navbar, Stepper
/pages # Home, Login, Register, Dashboard, Upload, Form, Preview, Search
/routes # ProtectedRoute
/services # api.js (Axios + interceptors)
/store # Contexto de Auth
/utils # placeholder: detectar/sustituir
index.html
vite.config.js
tailwind.config.js
postcss.config.js
.eslintrc.cjs
.prettierrc
/backend
/config # db.js (conexión Mongo)
/controllers # auth, template, document
/middlewares # requireAuth (JWT)
/models # User, Template, Document
/routes # /auth, /templates, /documents
/utils # helpers de respuesta
server.js
.env.example
.eslintrc.cjs
.prettierrc
- Node.js 18+
- npm 9+
- MongoDB Atlas (o local)
- Git (opcional)
Backend (/backend/.env)
PORT=4000
MONGODB_URI=mongodb://127.0.0.1:27017/pdflegal # o tu cadena Atlas
JWT_SECRET=super_secret_key
CLIENT_URL=http://localhost:5173
Frontend (/frontend/.env.local)
VITE_API_URL=http://localhost:4000/api
cd backend
cp .env.example .env # edita valores si hace falta
npm install
npm run dev # http://localhost:4000cd frontend
echo "VITE_API_URL=http://localhost:4000/api" > .env.local
npm install
npm run dev # http://localhost:5173- Frontend: Vercel → framework Vite (importa repo, setea
VITE_API_URLcon la URL pública del backend). - Backend: Render o Railway → Node server; configura variables (
PORT,MONGODB_URI,JWT_SECRET,CLIENT_URL). - Base de datos: MongoDB Atlas (free tier).
Recuerda permitir el CORS del dominio del frontend en el backend (variable
CLIENT_URL).
- JWT con expiración de 7 días.
- Contraseñas con bcrypt.
- Helmet para headers, CORS configurado, morgan para logs.
- No subir
.enval repo (usa.env.exampley.gitignore).
- Registro o inicio de sesión.
- Upload: sube
.txt/.htmlo pega texto → se detectan{{placeholders}}automáticamente. - (Opcional) Marca una selección para crear un
{{campo}}si no existe. - Guarda como plantilla → pasa al Form dinámico.
- Completa datos → Preview renderizado.
- Exporta a PDF (html2pdf.js).
Notas de UX
- Inputs del form son no controlados (usamos
defaultValue), con lo que no se pierde el foco al escribir. - Sustitución de placeholders con escape de regex para evitar reemplazos indeseados.
{ name: String, email: String, passwordHash: String }{
userId: ObjectId,
title: String,
description: String,
fields: [{ name, label, type, required }],
content: String // HTML o texto con {{placeholders}}
}{ userId: ObjectId, templateId: ObjectId, data: Object, html: String }POST /register { name, email, password }
POST /login { email, password } -> { token, user }GET / -> { items }
POST / { title, description, fields, content } -> { item }
PUT /:id
DELETE /:idGET / -> { items }
POST / { templateId, data } -> { item }- ESLint + Prettier en frontend y backend.
- GitHub Actions: job de lint en cada push/PR.
- Husky + lint-staged (opcional) para formatear en pre-commit.
- Paleta alto contraste: slate + blue (texto
slate-900/700, botonesblue-600con hoverblue-500, bordesslate-200/300). - Focus visibles:
focus:ring-blue-600. - Tarjetas claras con bordes ligeros; nada de overlays que opaquen el copy.
- Tipografía legible y espaciados cómodos.
- Acepta
.txty.html(puedes ampliar elaccept). - Detector de
{{llaves}}recorre el texto y normaliza nombres ([a-zA-Z0-9_]). - Botón “Marcar selección como campo”: reemplaza el texto seleccionado por
{{nombre}}y agrega el campo al esquema de la plantilla. - Si no hay campos detectados y el usuario intenta guardar, se solicita al menos uno.
- La página Search es un mock listo para conectar a un índice real (ej. IRES, datos abiertos, o tu propio crawler + Elastic/Lite index).
- Integración sugerida:
- Job de ingesta → normaliza título, tipo (Ley/Decreto/Sentencia), fecha, enlace fuente, resumen corto.
- Endpoint
/api/search?q=con ranking simple (BM25) o Elastic. - UI ya lista para mostrar resultados y enlazar fuentes.
- No compila el frontend: revisa versión de Node (18+).
- CORS bloqueado: confirma
CLIENT_URLen backend yVITE_API_URLen frontend. - No conecta a Mongo: valida
MONGODB_URI(Atlas: IP allowlist/Network Access). - PDF vacío: asegúrate de que
state.htmlllega a Preview antes de exportar. - Foco en inputs: el form usa
defaultValue; si lo cambias avalue, controla correctamente el estado.
Si ya subiste
feat/pdflegaly quieres que main = feat/pdflegal:
git checkout main
git pull origin main
git tag backup/main-antes-pdflegal && git push origin backup/main-antes-pdflegal
git reset --hard origin/feat/pdflegal
git push --force-with-lease origin maingit checkout main
git pull --rebase origin main
git merge --no-ff origin/feat/pdflegal
# borra las carpetas viejas que sobren
git rm -r ruta/vieja1 ruta/vieja2
git commit -m "chore: remove legacy project after merge"
git push origin main- Commits:
feat:,fix:,chore:,docs:,refactor:. - Ramas:
feat/xxx,fix/xxx,chore/xxx. - Pull Requests: descripción breve + checklist de pruebas manuales.
MIT (o la que prefieras).
- Crea una rama desde
main. - Cambios + tests manuales.
- Lint pasa en local (
npm run linten cada paquete). - PR y revisión.
- Editor WYSIWYG con placeholders (contenteditable + toolbar).
- Firmas y sellos (canvas/imagen).
- Versionado de plantillas y control de acceso por rol (admin).
- Auditoría y estadísticas (uso por plantilla). ( listo el codigo)
- Índice real para normativa colombiana (con fuente oficial). (listo el codigo)
- Exportación adicional a DOCX (con
docxtemplateren Node). (en proceso)