File size: 2,731 Bytes
7599506
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""
theme.py — Sistema de diseño de la nueva interfaz.

Un único lugar para los colores de marca y UNA plantilla Plotly reutilizable.
Antes cada figura se estilizaba inline y se repetían colores; aquí se centraliza.
"""
import plotly.graph_objects as go
import plotly.io as pio

# ------------------------------------------------------------------
# Tokens de color (marca CHRONOFLUX / Rizek)
# ------------------------------------------------------------------
PALETTE = {
    "brand":        "#AF1E2D",   # rojo de marca
    "brand_dark":   "#901924",
    "ink":          "#0F172A",   # texto/encabezados
    "ink_soft":     "#1E293B",
    "slate":        "#334155",
    "slate_500":    "#64748B",
    "slate_400":    "#94A3B8",
    "line":         "#E2E8F0",   # bordes/grillas
    "surface":      "#FFFFFF",
    "surface_2":    "#F1F5F9",
    "page":         "#F8FAFC",
    # Semánticos (riesgo)
    "ok":           "#16A34A",
    "ok_soft":      "#BBF7D0",
    "warn":         "#D97706",
    "warn_soft":    "#FDE2B4",
    "danger":       "#AF1E2D",
    "danger_soft":  "#F8B4B4",
    "info":         "#0EA5E9",
    "info_soft":    "#F0F9FF",
}

# Mapa semántico de categorías del Gantt (encoda significado, no secuencia)
RISK_COLORS = {
    "Crítica":   PALETTE["brand"],     # ruta crítica
    "Impactada": PALETTE["warn"],      # con impacto pero con holgura
    "Normal":    PALETTE["slate_400"],
}

FONT_FAMILY = "Inter, -apple-system, Segoe UI, Roboto, sans-serif"


def _make_template() -> go.layout.Template:
    t = go.layout.Template()
    t.layout = go.Layout(
        font=dict(family=FONT_FAMILY, size=13, color=PALETTE["slate"]),
        paper_bgcolor="rgba(0,0,0,0)",
        plot_bgcolor="rgba(0,0,0,0)",
        colorway=[
            PALETTE["brand"], PALETTE["info"], PALETTE["slate_500"],
            PALETTE["warn"], PALETTE["ok"], PALETTE["ink"],
        ],
        margin=dict(l=10, r=10, t=40, b=10),
        title=dict(font=dict(size=16, color=PALETTE["ink"]), x=0.01, xanchor="left"),
        xaxis=dict(gridcolor=PALETTE["line"], zeroline=False, linecolor=PALETTE["line"],
                   tickfont=dict(color=PALETTE["slate_500"])),
        yaxis=dict(gridcolor=PALETTE["line"], zeroline=False, linecolor=PALETTE["line"],
                   tickfont=dict(color=PALETTE["slate_500"])),
        legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1,
                    font=dict(color=PALETTE["slate_500"])),
        hoverlabel=dict(font=dict(family=FONT_FAMILY, size=12)),
    )
    return t


# Registrar y fijar como plantilla por defecto del proceso.
pio.templates["chronoflux"] = _make_template()
pio.templates.default = "chronoflux"

TEMPLATE = "chronoflux"