Guía del servidor visual de Selina
Servidor local en navegador para mostrar sistemas de diseño y opciones visuales durante la fase de dirección de estilo. Funciona como un visual companion para enseñar el catálogo base de Selina, dejar que el usuario fije familia + tipografía + gama de color y cerrar después una ronda final de tres columnas.
Cuándo usar el servidor visual
Siempre que Selina genere opciones de estilo. El servidor es la herramienta principal de Selina: sirve tanto para enseñar la galería de 10 sistemas de diseño base como para el nuevo flujo guiado de selección y la ronda final de 3 propuestas comparables.
Arrancar sesión
visual/scripts/start-server.sh --project-dir /ruta/al/proyecto
Respuesta JSON esperada:
{
"type": "server-started",
"port": 7432,
"url": "http://localhost:7432",
"screen_dir": "/ruta/al/proyecto/.alfred-dev/visual/<pid-timestamp>/content",
"state_dir": "/ruta/al/proyecto/.alfred-dev/visual/<pid-timestamp>/state",
"state": "ready"
}
Guarda screen_dir (directorio donde escribir los HTML de opciones) y state_dir
(directorio donde leer eventos de clic y verificar estado del servidor).
El fichero state_dir/server-info contiene el mismo JSON emitido en el arranque.
Léelo para comprobar que el servidor sigue activo antes de cada operación.
Indica al usuario que abra la URL en el navegador.
El ciclo
- Comprueba que el servidor sigue activo leyendo
STATE_DIR/server-info. - Si aporta contexto, genera primero la galería del catálogo con
python3 visual/scripts/write-style-demo-gallery.py --visual-path "$STATE_DIR". - Flujo guiado recomendado:
python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR"para elegir el sistema base.- lee la elección con
python3 visual/scripts/read-choice.py "$STATE_DIR". python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR" --style-id "<style_id>"para que el usuario elija tipografía + paleta.- vuelve a leer la elección con
python3 visual/scripts/read-choice.py "$STATE_DIR". python3 visual/scripts/write-guided-style-options.py --visual-path "$STATE_DIR"para generar automáticamente la ronda final de 3 variantes a partir de esa selección.
- Flujo directo alternativo: si ya tienes las tres propuestas decididas, genera
screen_dir/style-options.htmlconpython3 visual/scripts/write-style-options.py --visual-path "$STATE_DIR". Si necesitas escribirlo a mano, usa la clase.style-grid. - El sidecar JSON final debe vivir en
screen_dir/style-options.jsonpara poder generar luego el artefacto final sin reinterpretar la pantalla. - Informa al usuario: recuerda la URL, resume qué se muestra, pide que elija una opción.
- En el siguiente turno: lee la elección final con
python3 visual/scripts/read-choice.py "$STATE_DIR"o, si lo prefieres, inspeccionaSTATE_DIR/eventsdirectamente. - Genera
docs/style-direction.mdconpython3 visual/scripts/write-style-direction.py --project-dir "$PWD" --visual-path "$STATE_DIR"o, si necesitas control manual, escribe el artefacto tú misma usando el sidecar JSON. - Escribe
waiting.htmlenscreen_dirpara limpiar el navegador hasta la próxima acción.
Sidecar JSON recomendado
Para que el artefacto final salga con buen nivel, intenta que cada propuesta incluya al menos:
choicenameconceptodescriptionpalettetypographyspacing_densityolayout_densitytoneomoodsample_componentocomponent_examplevisual_principlesodesign_principleslayout_grammarocomposition_grammarsurface_treatmentomaterialityshape_languagemotion_languagesignature_elementsovisual_motifsimplementation_guardrailsoguardrailsprompt_seedodesign_promptrationaleowhynot_this_directionoanti_patternscontext_signals,audienceoconstraints
El writer canónico tolera sidecars incompletos y alias razonables, pero cuanto más específica sea la propuesta, menos genérica será la dirección final.
Regla crítica del flujo guiado
Si el usuario ya ha fijado familia + tipografía + paleta, las tres variantes finales
deben seguir perteneciendo a ese mismo sistema. Lo que puede cambiar entre A / B / C
es la composición, la jerarquía o el grado de expresividad, pero no la gramática base
del sistema elegido.
Cuando generes sidecars manuales:
- reutiliza la
prompt_seeddel sistema como semilla principal - arrastra siempre
visual_principles,layout_grammarysignature_elements - usa
implementation_guardrailspara evitar que la variante se desvíe hacia otra familia - no mezcles referencias de una tendencia distinta solo para “hacerla más bonita”
Writer canónico de opciones
El helper recomendado es:
python3 visual/scripts/write-style-options.py --visual-path "$STATE_DIR"
Este script:
- autodetecta
style-options.json - normaliza aliases comunes del sidecar
- escribe un fragmento HTML compatible con el servidor real
- evita depender de assets externos que no existen en el repo
Si necesitas personalizar el copy de cabecera, acepta --title y --subtitle.
Selector guiado de sistema + tipografía + paleta
Selina ya puede trabajar en tres pasos naturales:
- Sistema base —
python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR" - Tipografía + paleta —
python3 visual/scripts/write-style-selector.py --visual-path "$STATE_DIR" --style-id "<style_id>" - Tres variantes finales —
python3 visual/scripts/write-guided-style-options.py --visual-path "$STATE_DIR"
read-choice.py sigue siendo el lector canónico entre pasos. Si la elección
pertenece al flujo guiado, devolverá además parsed_choice con stage,
style_id, font_pairing_id y palette_mode.
Estructura HTML de las opciones
El servidor ya envuelve fragmentos HTML en su frame propio e inyecta helper.js, así
que no hace falta escribir un documento completo ni enlazar assets extra. Este es el
formato recomendado:
<section class="style-screen">
<div class="style-screen-header">
<p class="style-screen-kicker">Selina propone</p>
<h1>Selecciona una dirección visual</h1>
<p class="style-screen-subtitle">Elige la propuesta que mejor encaja con el producto.</p>
</div>
<div class="style-grid">
<div class="style-option" data-choice="A">
<div class="style-preview" style="background:#1a1a2e;">
<span class="style-letter">A</span>
</div>
<div class="style-meta">
<h2>Oscuro espacial</h2>
<p>Contraste alto, tipografía sans-serif, sensación tecnológica.</p>
<div class="palette">
<span class="swatch" style="background:#1a1a2e;" title="#1a1a2e"></span>
<span class="swatch" style="background:#e94560;" title="#e94560"></span>
<span class="swatch" style="background:#ffffff;" title="#ffffff"></span>
</div>
</div>
</div>
<div class="style-option" data-choice="B">
<div class="style-preview" style="background:#f5f0e8;">
<span class="style-letter">B</span>
</div>
<div class="style-meta">
<h2>Editorial cálido</h2>
<p>Tonos crema, serif clásico, aire de revista de lujo.</p>
<div class="palette">
<span class="swatch" style="background:#f5f0e8;" title="#f5f0e8"></span>
<span class="swatch" style="background:#c8a96e;" title="#c8a96e"></span>
<span class="swatch" style="background:#2c2c2c;" title="#2c2c2c"></span>
</div>
</div>
</div>
<div class="style-option" data-choice="C">
<div class="style-preview" style="background:#0d7377;">
<span class="style-letter">C</span>
</div>
<div class="style-meta">
<h2>Minimalismo vibrante</h2>
<p>Verde azulado saturado, mucho espacio negativo, tipografía condensada.</p>
<div class="palette">
<span class="s