# Re100X · Fábrica de Carruseles — Contexto para Claude Code ## ¿Qué es este proyecto? Fábrica automatizada de carruseles LinkedIn para el programa **Re100X · EmpowerLabs** de Victor Heredia. Cada carrusel = 7 slides, formato 1080×1080px, exportado como PDF. --- ## Archivos del sistema | Archivo | Rol | |---|---| | `factory_re100x.py` | Motor principal — contiene piezas, temas, CSS, renderer | | `test_re100x.py` | Test rápido — genera Pieza 01 en navy/dark/light | | `PDF-Export/` | Output — todos los PDFs generados | **Todos los archivos están en esta misma carpeta.** Ejecutar siempre desde aquí: ```bash cd "IB-EL-EmpowerLabs/PB-EL-Project-Bank/PB-DEMANDGEN-EmpowerLabs" ``` **Dependencia requerida:** WeasyPrint. Verificar con `weasyprint --version`. Si no está: `pip install weasyprint --break-system-packages` **Paletas activas:** `dark`, `light`, `navy` (orange y yellow existen pero no se usan en Fase 1) --- ## Cómo generar carruseles ### Caso 1 — Regenerar piezas existentes (una o varias) con paletas sólidas ```bash python3 factory_re100x.py --pieces 01 05 --palettes navy dark ``` Argumentos opcionales: - `--pieces 01 02 03` → solo esas piezas (default: todas las 12) - `--palettes navy dark orange` → solo esas paletas (default: las 5) ### Caso 2 — Generar con paletas alternadas (slide por slide) El flag `--alternate PAL1 PAL2` alterna dos paletas en los 7 slides: slide 1 = PAL1, slide 2 = PAL2, slide 3 = PAL1, slide 4 = PAL2… y así hasta el 7. ```bash python3 factory_re100x.py --pieces 13 --alternate dark light ``` Output: `Re100X-13-Solucion-dark-light.pdf` (un solo PDF por pieza, no se combina con `--palettes`). **Paleta oficial Fase 1:** `dark-light` (alternancia negro/blanco — ritmo editorial fuerte). El flag acepta cualquier par válido (`--alternate navy light`, etc.). ### Caso 3 — Agregar una pieza nueva 1. Abrir `factory_re100x.py` 2. Localizar la lista `PIECES = [...]` 3. Agregar el nuevo dict de pieza al final de la lista (antes del `]` de cierre) 4. Correr: `python3 factory_re100x.py --pieces [NUM] --palettes [PALETA]` --- ## Estructura de una pieza (dict Python) ```python { "num": "15", # Número de 2 dígitos — el siguiente disponible "slug": "MiTema", # CamelCase, sin espacios, sin tildes "hashtags": "#Reinventa100X #EmpowerLabs", "cover": { "headline": "Línea 1\nLínea 2\n[accent]Frase clave.[/accent]", "sub": "Una línea de contexto que aparece bajo el headline." }, "problema": { "label": "El nombre de la tensión", "body": "[dim]Texto atenuado[/dim]\nTexto normal\n[punch]Remate en acento itálica.[/punch]" }, "puntos": [ { "label": "Punto 01 · El Nombre", "headline": "[hi]Concepto acento[/hi]\n[dim]contraste atenuado[/dim]", "big": False, # True si el slide tiene poco texto — fuente más grande "visual": { ... } # Ver catálogo de visuales abajo }, # Punto 02, 03, 04 — misma estructura ], "cierre": { "tag": "// Etiqueta del cierre", "q": "¿Pregunta\ncorta\nen varias líneas?", "ans": "Respuesta en 1-2 líneas.\n[b]Remate en negrita.[/b]" } } ``` ### Markup de texto | Tag | Efecto | |---|---| | `[hi]...[/hi]` | Color acento (primario de la paleta) | | `[dim]...[/dim]` | Color atenuado (secundario) | | `[accent]...[/accent]` | Color acento en bloque — usar en cover headline para la frase clave | | `[punch]...[/punch]` | Acento + itálica — remate del problema | | `[b]...[/b]` | Negrita — remate del cierre | | `\n` | Salto de línea | --- ## Catálogo de elementos visuales Cada punto define su `"visual"` con uno de estos tipos: ### `data_comparison` — Dos cajas métrica (lo = atenuado, hi = acento) ```python {"type": "data_comparison", "lo": {"label": "descripción izq", "value": "+12%"}, "hi": {"label": "descripción der", "value": "10×"}} ``` ### `timeline` — Dos bloques temporales ```python {"type": "timeline", "now": {"label": "Hoy", "value": "10×", "note": "nota descriptiva"}, "later": {"label": "2027", "value": "tarde", "note": "nota", "late": True}} ``` *(`late: True` aplica color atenuado al valor — para señalar tardanza/riesgo)* ### `rules` — Lista de flechas: concepto + descripción ```python {"type": "rules", "items": [ ("Concepto A", "descripción A."), ("Concepto B", "descripción B."), ("Concepto C", "descripción C.") ]} ``` ### `chart_exponential` — Curva exponencial vs lineal (SVG) ```python {"type": "chart_exponential", "label_lo": "// Etiqueta línea baja", "label_hi": "// Etiqueta curva alta"} ``` ### `stat_highlight` — Número o dato grande centrado ```python {"type": "stat_highlight", "value": "80%", "label": "Descripción del dato en 1–2 líneas."} ``` ### `comparison_two` — Dos columnas lado a lado ```python {"type": "comparison_two", "a": {"header": "// Columna A", "body": "Texto columna izquierda"}, "b": {"header": "// Columna B", "body": "Texto columna derecha"}} ``` ### `process_steps` — Pasos numerados horizontales (2–4 pasos) ```python {"type": "process_steps", "steps": ["Paso uno", "Paso dos", "Paso tres"]} ``` ### `layers_stack` — Capas apiladas (para arquitecturas) ```python {"type": "layers_stack", "layers": ["Capa 1 — base", "Capa 2 — medio", "Capa 3 — top"]} ``` ### `quote_block` — Cita con borde acento ```python {"type": "quote_block", "text": "El texto de la cita o insight principal.", "sub": "// Fuente o subtítulo"} ``` --- ## Paletas disponibles ### Paletas sólidas (un PDF = una paleta) | Key | Fondo | Acento | Secundario | |---|---|---|---| | `dark` | #0C0C0C negro | #FFFFFF blanco | #C8C8C8 gris claro | | `light` | #F4F1EC crema | #000000 negro | #0D1B2A navy | | `navy` | #0D1B2A navy | #C9A84C oro | #7A8FA0 azul-gris | | `orange` | #0D0A07 negro | #E87020 naranja | #C9A030 mostaza | | `yellow` | #09080A negro | #F0C800 amarillo | #5A9FD4 azul medio | ### Paletas alternadas (slide por slide) Vía `--alternate PAL1 PAL2`. Cada slide del PDF usa una paleta distinta, alternando. | Key (sufijo del PDF) | Patrón | |---|---| | `dark-light` | slide 1 dark · 2 light · 3 dark · 4 light · 5 dark · 6 light · 7 dark | `dark-light` es la paleta alternada oficial de Fase 1. Cualquier otro par válido también funciona (`navy light`, `dark navy`, etc.) y se nombra `PAL1-PAL2` en el archivo de salida. --- ## Gráficos automáticos en los slides El sistema ya incluye dos tipos de elementos gráficos generados automáticamente: 1. **Cover**: Arcos concéntricos SVG en esquina inferior-derecha (marca visual de identidad) 2. **Puntos 03–06**: Ícono SVG en la esquina superior-derecha del label, específico para cada tipo de visual No es necesario configurar nada — se aplican solos según el tipo de visual definido en la pieza. --- ## Flujo típico en Claude Code ``` # Victor describe una nueva pieza en lenguaje natural # Claude Code: # 1. Traduce el contenido al dict Python con markup correcto # 2. Elige el visual más apropiado para cada punto # 3. Agrega la pieza a PIECES en factory_re100x.py # 4. Corre el script con la pieza y paleta indicadas # 5. Confirma con el path del PDF generado ``` **Comando rápido para una pieza nueva (num=15, paleta navy):** ```bash python3 factory_re100x.py --pieces 15 --palettes navy ``` **Comando para regenerar todo:** ```bash python3 factory_re100x.py ``` *(Genera 12 piezas × 5 paletas = 60 PDFs — tarda ~3 min, mejor correr en background)* --- ## Output location Todos los PDFs van a: ``` IB-EL-EmpowerLabs/PB-EL-Project-Bank/PB-DEMANDGEN-EmpowerLabs/PDF-Export/ ``` Formato de nombre: `Re100X-[NUM]-[Slug]-[paleta].pdf` --- *CLAUDE.md · Re100X Carousel Factory · EmpowerLabs · Mayo 2026*