tokiospg commited on
Commit
b0f3dfb
·
verified ·
1 Parent(s): df88c55

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +30 -60
  2. style.css +621 -206
app.py CHANGED
@@ -22,6 +22,7 @@ load_dotenv()
22
  st.set_page_config(page_title="Proyelec Sourcing Pro", layout="wide", page_icon="💎", initial_sidebar_state="expanded")
23
 
24
  # --- CACHE DE ESTILOS PARA EVITAR PARPADEO ---
 
25
  def get_css():
26
  try:
27
  with open('style.css', 'r', encoding='utf-8') as f:
@@ -237,8 +238,14 @@ if not st.session_state.logged_in:
237
  # --- NAVBAR RENDER ---
238
  st.markdown(f"""
239
  <div class="top-navbar">
240
- <div style="font-size: 20px; font-weight: 800; color: #58A6FF; letter-spacing: -0.5px;">💎 PROYELEC <span style="color:white; font-weight:300;">SOURCING PRO</span></div>
241
- <div style="font-size: 13px; color: #8B949E;">Usuario: <b style="color:#F0F6FC;">{st.session_state.username}</b> &nbsp;<span style="background:#1E2A3A;color:#58A6FF;padding:2px 8px;border-radius:10px;font-size:11px;">{st.session_state.role}</span> &nbsp;| {datetime.now().strftime("%d/%m/%Y")}</div>
 
 
 
 
 
 
242
  </div>
243
  <div class="main-content-spacer"></div>
244
  """, unsafe_allow_html=True)
@@ -405,11 +412,11 @@ with st.sidebar:
405
  try:
406
  _r = requests.get(f"{API_URL_BASE.replace('/api/v1','')}/", timeout=2, headers=API_HEADERS)
407
  if _r.status_code == 200:
408
- st.markdown("<div style='background:#1a3a1a;border:1px solid #238636;border-radius:8px;padding:8px 12px;font-size:12px;color:#3fb950;margin-bottom:10px;'>🟢 Motor IA <b>Activo</b></div>", unsafe_allow_html=True)
409
  else:
410
- st.markdown("<div style='background:#3a1a1a;border:1px solid #f85149;border-radius:8px;padding:8px 12px;font-size:12px;color:#f85149;margin-bottom:10px;'>🔴 Motor IA <b>Sin respuesta</b></div>", unsafe_allow_html=True)
411
  except Exception:
412
- st.markdown("<div style='background:#3a1a1a;border:1px solid #f85149;border-radius:8px;padding:8px 12px;font-size:12px;color:#f85149;margin-bottom:10px;'>🔴 Motor IA <b>Apagado</b>Ejecuta run.bat</div>", unsafe_allow_html=True)
413
 
414
  if st.session_state.role == "Gerencia":
415
  with st.expander("⚙️ Configuración y Llaves", expanded=False):
@@ -1128,81 +1135,44 @@ with tab_main:
1128
  total_reng = int(df_hist_kpi['Renglones'].sum()) if not df_hist_kpi.empty and 'Renglones' in df_hist_kpi.columns else 0
1129
  ultima_act = df_hist_kpi['Fecha Proceso'].iloc[0][:10] if not df_hist_kpi.empty else "Sin actividad"
1130
 
1131
- st.markdown("<br><br>", unsafe_allow_html=True)
1132
  st.markdown(f"""
1133
- <div style='text-align:center; margin-bottom: 12px;'>
1134
- <span style='font-size:12px; color:#58A6FF; font-weight:700; letter-spacing:3px; text-transform:uppercase;'>MOTOR DE INTELIGENCIA DE SOURCING</span>
1135
  </div>
1136
- <h1 style='text-align:center; margin:0 0 8px 0; font-weight:800; font-size: 38px;' class='premium-gradient-text'>PROYELEC SOURCING PRO</h1>
1137
- <p style='text-align:center; color:#8B949E; margin-bottom:32px; font-size:15px; font-family:"Inter",sans-serif;'>
1138
- Bienvenido, <b style="color:#F0F6FC;">{st.session_state.username}</b> &nbsp;|&nbsp; Gestión automatizada de procura para el Canal de Panamá
1139
- </p>
1140
  """, unsafe_allow_html=True)
1141
 
1142
  k1, k2, k3, k4 = st.columns(4)
1143
-
1144
- # Métrica 1
1145
- with k1:
1146
- st.markdown(f"""
1147
- <div style="background:#161B22; border:1px solid #1E2A3A; padding:18px; border-radius:12px;">
1148
- <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em;">Licitaciones Procesadas</div>
1149
- <div style="font-size:28px; color:#E6EDF3; font-weight:800; margin-top:4px;">{total_lic}</div>
1150
- </div>
1151
- """, unsafe_allow_html=True)
1152
-
1153
- # Métrica 2
1154
- with k2:
1155
- st.markdown(f"""
1156
- <div style="background:#161B22; border:1px solid #1E2A3A; padding:18px; border-radius:12px;">
1157
- <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em;">Renglones Analizados</div>
1158
- <div style="font-size:28px; color:#E6EDF3; font-weight:800; margin-top:4px;">{total_reng}</div>
1159
- </div>
1160
- """, unsafe_allow_html=True)
1161
-
1162
- # Métrica 3
1163
- with k3:
1164
- st.markdown(f"""
1165
- <div style="background:#161B22; border:1px solid #1E2A3A; padding:18px; border-radius:12px;">
1166
- <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em;">Última Actividad</div>
1167
- <div style="font-size:20px; color:#E6EDF3; font-weight:800; margin-top:11px;">{ultima_act}</div>
1168
- </div>
1169
- """, unsafe_allow_html=True)
1170
-
1171
- # Métrica 4 (Glow Animation)
1172
- with k4:
1173
- st.markdown(f"""
1174
- <div style="background:#161B22; border:1px solid #1E2A3A; padding:16px 18px; border-radius:12px; height:100%; display:flex; flex-direction:column; justify-content:center;">
1175
- <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em; margin-bottom:8px;">Motor de IA Central</div>
1176
- <div class="active-pulse-container">
1177
- <span class="pulse-dot"></span>
1178
- <b style="font-size:12px; color:#3FB950;">Gemini 2.5 Flash Activo</b>
1179
- </div>
1180
- </div>
1181
- """, unsafe_allow_html=True)
1182
 
1183
- st.markdown("<br><br>", unsafe_allow_html=True)
1184
- st.markdown("<p style='text-align:center;color:#8B949E;font-size:13.5px;margin-bottom:28px;'>Para comenzar, sube el pliego en el panel izquierdo y presiona <b style='color:#58A6FF'>🚀 Procesar con IA</b></p>", unsafe_allow_html=True)
1185
 
1186
  c1, c2, c3 = st.columns(3)
1187
  with c1:
1188
  st.markdown("""
1189
- <div class='glass-card'>
1190
  <div class='step-icon'>📄</div>
1191
- <h4 style="color:#58A6FF; font-size:16px; margin: 0 0 10px 0; font-weight:700;">1. Carga el Pliego</h4>
1192
- <p style='color:#8B949E; font-size:13px; line-height:1.5; margin:0;'>Sube el PDF oficial de la licitación. Soporta pliego principal y anexos técnicos simultáneamente.</p>
1193
  </div>
1194
  """, unsafe_allow_html=True)
1195
  with c2:
1196
  st.markdown("""
1197
- <div class='glass-card'>
1198
  <div class='step-icon'>🧠</div>
1199
- <h4 style="color:#3FB950; font-size:16px; margin: 0 0 10px 0; font-weight:700;">2. Análisis con IA</h4>
1200
- <p style='color:#8B949E; font-size:13px; line-height:1.5; margin:0;'>Gemini extrae renglones, códigos, cantidades y cruza automáticamente con el histórico de precios.</p>
1201
  </div>
1202
  """, unsafe_allow_html=True)
1203
  with c3:
1204
  st.markdown("""
1205
- <div class='glass-card'>
1206
  <div class='step-icon'>🎯</div>
1207
  <h4>3. Sourcing Global</h4>
1208
  <p style='color:#8B949E; font-size:14px;'>Busca los mejores proveedores, genera RFQs y organiza cotizaciones en tu bandeja inteligente.</p>
 
22
  st.set_page_config(page_title="Proyelec Sourcing Pro", layout="wide", page_icon="💎", initial_sidebar_state="expanded")
23
 
24
  # --- CACHE DE ESTILOS PARA EVITAR PARPADEO ---
25
+ @st.cache_data
26
  def get_css():
27
  try:
28
  with open('style.css', 'r', encoding='utf-8') as f:
 
238
  # --- NAVBAR RENDER ---
239
  st.markdown(f"""
240
  <div class="top-navbar">
241
+ <div class="top-navbar-logo">
242
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>
243
+ PROYELEC &nbsp;<span style="color:var(--text-muted); font-weight:300;">Sourcing Pro</span>
244
+ </div>
245
+ <div class="top-navbar-meta">
246
+ <span style="color:var(--text-muted);">{datetime.now().strftime("%d %b %Y")}</span>
247
+ <span class="user-badge">{st.session_state.username} · {st.session_state.role}</span>
248
+ </div>
249
  </div>
250
  <div class="main-content-spacer"></div>
251
  """, unsafe_allow_html=True)
 
412
  try:
413
  _r = requests.get(f"{API_URL_BASE.replace('/api/v1','')}/", timeout=2, headers=API_HEADERS)
414
  if _r.status_code == 200:
415
+ st.markdown("<div class='ia-status-on' style='margin-bottom:10px;'>Motor IA activo</div>", unsafe_allow_html=True)
416
  else:
417
+ st.markdown("<div class='ia-status-off' style='margin-bottom:10px;'>Motor IA sin respuesta</div>", unsafe_allow_html=True)
418
  except Exception:
419
+ st.markdown("<div class='ia-status-off' style='margin-bottom:10px;'>Motor IA apagadoejecuta run.bat</div>", unsafe_allow_html=True)
420
 
421
  if st.session_state.role == "Gerencia":
422
  with st.expander("⚙️ Configuración y Llaves", expanded=False):
 
1135
  total_reng = int(df_hist_kpi['Renglones'].sum()) if not df_hist_kpi.empty and 'Renglones' in df_hist_kpi.columns else 0
1136
  ultima_act = df_hist_kpi['Fecha Proceso'].iloc[0][:10] if not df_hist_kpi.empty else "Sin actividad"
1137
 
1138
+ st.markdown("<br>", unsafe_allow_html=True)
1139
  st.markdown(f"""
1140
+ <div style='text-align:center; margin-bottom: 8px;'>
1141
+ <span style='font-size:13px; color:#58A6FF; font-weight:600; letter-spacing:2px; text-transform:uppercase;'>Centro de Mando</span>
1142
  </div>
1143
+ <h2 style='text-align:center; color:#F0F6FC; margin:0 0 6px 0; font-weight:800;'>Bienvenido, {st.session_state.username}</h2>
1144
+ <p style='text-align:center; color:#8B949E; margin-bottom:28px; font-size:14px;'>Sistema de Inteligencia de Sourcing — Proyelec</p>
 
 
1145
  """, unsafe_allow_html=True)
1146
 
1147
  k1, k2, k3, k4 = st.columns(4)
1148
+ k1.metric("Licitaciones Procesadas", total_lic)
1149
+ k2.metric("Renglones Analizados", total_reng)
1150
+ k3.metric("Ultima Actividad", ultima_act)
1151
+ k4.metric("Motor IA", "Gemini 2.5 Flash")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1152
 
1153
+ st.markdown("<br>", unsafe_allow_html=True)
1154
+ st.markdown("<p style='text-align:center;color:#484f58;font-size:13px;margin-bottom:20px;'>Para comenzar, sube el pliego en el panel izquierdo y presiona <b style=\'color:#58A6FF\'>Procesar con IA</b></p>", unsafe_allow_html=True)
1155
 
1156
  c1, c2, c3 = st.columns(3)
1157
  with c1:
1158
  st.markdown("""
1159
+ <div class='step-card'>
1160
  <div class='step-icon'>📄</div>
1161
+ <h4>1. Carga el Pliego</h4>
1162
+ <p style='color:#8B949E; font-size:14px;'>Sube el PDF oficial de la licitacion. Soporta pliego principal y anexos tecnicos simultaneamente.</p>
1163
  </div>
1164
  """, unsafe_allow_html=True)
1165
  with c2:
1166
  st.markdown("""
1167
+ <div class='step-card'>
1168
  <div class='step-icon'>🧠</div>
1169
+ <h4>2. Analisis con IA</h4>
1170
+ <p style='color:#8B949E; font-size:14px;'>Gemini extrae renglones, codigos, cantidades y cruza automaticamente con el historico de precios.</p>
1171
  </div>
1172
  """, unsafe_allow_html=True)
1173
  with c3:
1174
  st.markdown("""
1175
+ <div class='step-card'>
1176
  <div class='step-icon'>🎯</div>
1177
  <h4>3. Sourcing Global</h4>
1178
  <p style='color:#8B949E; font-size:14px;'>Busca los mejores proveedores, genera RFQs y organiza cotizaciones en tu bandeja inteligente.</p>
style.css CHANGED
@@ -1,319 +1,734 @@
1
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
2
 
3
- /* ===== BASE ===== */
4
- html, body, [data-testid="stAppViewContainer"] {
5
- background-color: #0A0E1A;
6
- color: #E0E6F0;
7
- font-family: 'Inter', sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  [data-testid="stSidebar"] {
10
- background: linear-gradient(180deg, #0D1117 0%, #0A0E1A 100%);
11
- border-right: 1px solid #1E2A3A;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  }
13
- [data-testid="stHeader"] { background-color: transparent !important; }
14
- [data-testid="stAppViewBlockContainer"] { padding-top: 10px; }
 
 
 
 
 
 
 
15
 
16
  /* ===== NAVBAR ===== */
17
  .top-navbar {
18
  position: fixed;
19
  top: 0; left: 0;
20
  width: 100%;
21
- background: rgba(13, 17, 23, 0.85);
22
- backdrop-filter: blur(12px);
23
- -webkit-backdrop-filter: blur(12px);
24
- padding: 14px 60px;
25
- border-bottom: 1px solid rgba(88, 166, 255, 0.3);
 
26
  display: flex;
27
  justify-content: space-between;
28
  align-items: center;
29
  z-index: 9999;
30
- box-shadow: 0 4px 30px rgba(0, 0, 0, 0.5);
31
  }
32
- .main-content-spacer { margin-top: 65px; }
33
 
34
- /* ===== GRADIENTE DE TEXTO PREMIUM ===== */
35
- .premium-gradient-text {
36
- background: linear-gradient(135deg, #58A6FF 0%, #10B981 100%);
37
- -webkit-background-clip: text;
38
- -webkit-text-fill-color: transparent;
39
- font-weight: 800;
40
- letter-spacing: -1px;
 
41
  }
42
 
43
- /* ===== MÉTRICAS ===== */
44
- div[data-testid="metric-container"] {
45
- background: linear-gradient(135deg, #161B22 0%, #0D1117 100%);
46
- border: 1px solid #1E2A3A;
47
- padding: 18px;
48
- border-radius: 14px;
49
- transition: transform 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
50
  }
51
- div[data-testid="metric-container"]:hover {
52
- transform: translateY(-4px);
53
- border-color: #58A6FF;
54
- box-shadow: 0 8px 25px rgba(88, 166, 255, 0.15);
55
- }
56
-
57
- /* ===== CARDS CON EFECTO VIDRIO (GLASSMORPHISM) ===== */
58
- .glass-card {
59
- background: rgba(22, 27, 34, 0.55) !important;
60
- backdrop-filter: blur(12px) !important;
61
- -webkit-backdrop-filter: blur(12px) !important;
62
- border: 1px solid rgba(88, 166, 255, 0.15) !important;
63
- border-radius: 16px !important;
64
- padding: 28px 22px !important;
65
- text-align: center;
66
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
67
- box-shadow: 0 10px 30px rgba(0,0,0,0.3) !important;
68
- height: 100%;
69
  }
70
- .glass-card:hover {
71
- border-color: rgba(88, 166, 255, 0.4) !important;
72
- transform: translateY(-6px) !important;
73
- box-shadow: 0 15px 35px rgba(88, 166, 255, 0.15) !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  }
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  .detail-card {
77
- background: var(--surface-1);
78
- border: 1px solid var(--line-soft);
79
- border-left: 4px solid var(--blue);
80
- border-radius: 8px;
81
- padding: 18px;
82
- box-shadow: none;
 
 
 
 
 
 
 
 
 
83
  }
 
 
84
  .provider-card {
85
- border-radius: 10px;
86
- background: #161B22;
87
- border: 1px solid #30363D;
88
- padding: 20px;
89
  height: 180px;
90
  display: flex;
91
  flex-direction: column;
92
  justify-content: space-between;
93
- transition: all 0.3s ease;
94
  overflow: hidden;
 
 
 
 
95
  }
 
 
 
 
 
 
 
 
 
 
96
  .provider-card:hover {
97
- transform: translateY(-3px);
98
- border-color: #58A6FF;
99
- box-shadow: 0 4px 12px rgba(0,0,0,0.5);
 
100
  }
 
101
  .provider-card h4 {
102
- color: #58A6FF;
103
- margin-top: 0;
104
- margin-bottom: 10px;
105
- font-size: 16px;
106
- line-height: 1.3;
 
107
  display: -webkit-box;
108
  -webkit-line-clamp: 2;
109
  -webkit-box-orient: vertical;
110
  overflow: hidden;
111
  }
 
112
  .provider-card p {
113
- font-size: 13px;
114
- color: #8B949E;
115
- line-height: 1.4;
116
  flex-grow: 1;
117
  display: -webkit-box;
118
  -webkit-line-clamp: 3;
119
  -webkit-box-orient: vertical;
120
  overflow: hidden;
121
- margin-bottom: 10px;
122
  }
 
123
  .provider-card a {
124
- color: #3FB950;
125
- font-weight: 700;
126
  text-decoration: none;
127
- font-size: 13px;
128
- display: inline-block;
129
- }
130
- .provider-card a:hover {
131
- text-decoration: underline;
132
- }
133
-
134
- .email-card, .step-card {
135
- border-radius: 8px;
136
- background: var(--surface-1);
137
- border-color: var(--line-soft);
138
- box-shadow: none;
139
- }
140
- .step-icon { font-size: 44px; margin-bottom: 15px; display: block; }
141
-
142
- /* ===== PULSO DE IA ACTIVO (GLOW ANIMATION) ===== */
143
- .active-pulse-container {
144
- background: rgba(35, 134, 54, 0.15);
145
- border: 1px solid rgba(57, 185, 80, 0.3);
146
- border-radius: 20px;
147
- padding: 8px 16px;
148
  font-size: 12px;
149
- color: #3FB950;
150
  display: inline-flex;
151
  align-items: center;
152
- gap: 8px;
153
- box-shadow: 0 0 15px rgba(57, 185, 80, 0.1);
154
- }
155
- .pulse-dot {
156
- width: 8px;
157
- height: 8px;
158
- background-color: #3FB950;
159
- border-radius: 50%;
160
- display: inline-block;
161
- box-shadow: 0 0 0 0 rgba(57, 185, 80, 0.7);
162
- animation: active-glow 1.8s infinite;
163
  }
164
 
165
- @keyframes active-glow {
166
- 0% {
167
- transform: scale(0.95);
168
- box-shadow: 0 0 0 0 rgba(57, 185, 80, 0.7);
169
- }
170
- 70% {
171
- transform: scale(1);
172
- box-shadow: 0 0 0 6px rgba(57, 185, 80, 0);
173
- }
174
- 100% {
175
- transform: scale(0.95);
176
- box-shadow: 0 0 0 0 rgba(57, 185, 80, 0);
177
- }
178
  }
179
 
180
- /* ===== SCROLLBAR ===== */
181
- ::-webkit-scrollbar { width: 6px; height: 6px; }
182
- ::-webkit-scrollbar-track { background: #0A0E1A; }
183
- ::-webkit-scrollbar-thumb { background: #1E2A3A; border-radius: 4px; }
184
- ::-webkit-scrollbar-thumb:hover { background: #58A6FF; }
185
 
186
- /* ===== DATAFRAME ===== */
187
- [data-testid="stDataFrame"] { border-radius: 12px; overflow: hidden; }
 
 
 
 
 
 
 
 
 
 
 
188
 
189
- /* ===== CONFIG VARIABLES ===== */
190
- :root {
191
- --bg-main: #080C12;
192
- --surface-1: #0F141C;
193
- --surface-2: #151B24;
194
- --line-soft: #242C38;
195
- --text-main: #E8EDF5;
196
- --text-muted: #8C98A8;
197
- --blue: #4F9CF9;
198
- --green: #31C48D;
199
- --amber: #F6B44B;
200
- --orange: #F08A3C;
201
- --red: #EF5B5B;
202
- --gray: #748091;
203
  }
204
 
205
- .section-title {
206
- margin: 2px 0 12px 0;
207
- color: var(--text-main);
208
- font-size: 18px;
209
- font-weight: 750;
 
 
210
  }
211
- .section-subtitle {
212
- margin: -8px 0 16px 0;
213
- color: var(--text-muted);
214
- font-size: 13px;
 
 
215
  }
216
 
 
217
  .monitor-row {
218
- background: var(--surface-1);
219
- border: 1px solid var(--line-soft);
220
- border-left: 4px solid var(--status-color, var(--blue));
221
- border-radius: 8px;
222
- padding: 12px 14px;
 
 
 
 
 
 
 
 
223
  }
 
224
  .monitor-row-head {
225
  display: flex;
226
  align-items: flex-start;
227
  justify-content: space-between;
228
  gap: 14px;
229
  }
 
230
  .monitor-id {
231
- color: var(--text-main);
232
- font-size: 16px;
233
- font-weight: 800;
 
234
  line-height: 1.2;
235
  }
 
236
  .monitor-owner {
237
  color: var(--text-muted);
238
- font-size: 11px;
239
  text-transform: uppercase;
240
- letter-spacing: 0.04em;
241
- margin-bottom: 3px;
 
242
  }
 
243
  .monitor-object {
244
- color: #B8C2D0;
245
  font-size: 12px;
246
- line-height: 1.35;
247
- margin-top: 5px;
248
  }
 
249
  .monitor-meta {
250
  display: flex;
251
  justify-content: flex-end;
252
  flex-wrap: wrap;
253
  gap: 6px;
254
- margin-top: 8px;
255
  }
 
 
256
  .status-badge {
257
  display: inline-flex;
258
  align-items: center;
259
- gap: 6px;
260
- background: color-mix(in srgb, var(--status-color, var(--blue)) 14%, transparent);
261
- color: var(--status-color, var(--blue));
262
- border: 1px solid color-mix(in srgb, var(--status-color, var(--blue)) 42%, transparent);
263
- border-radius: 999px;
264
- padding: 3px 9px;
265
  font-size: 11px;
266
- font-weight: 700;
267
  white-space: nowrap;
 
268
  }
 
269
  .status-dot {
270
- width: 7px;
271
- height: 7px;
272
  border-radius: 50%;
273
- background: var(--status-color, var(--blue));
 
274
  }
 
 
275
  .mini-pill {
276
- background: #0B1017;
277
- border: 1px solid var(--line-soft);
278
- border-radius: 999px;
279
  color: var(--text-muted);
280
- padding: 3px 9px;
281
  font-size: 11px;
282
  white-space: nowrap;
 
283
  }
284
 
 
285
  .sli-summary {
286
- margin: 8px 0 10px 0;
287
- background: #0B1017;
288
- border: 1px solid var(--line-soft);
289
- border-left: 3px solid var(--amber);
290
- border-radius: 8px;
291
- padding: 10px 12px;
292
  }
 
293
  .sli-summary-title {
294
- color: var(--amber);
295
- font-size: 11px;
296
- font-weight: 800;
297
- letter-spacing: 0.04em;
298
  text-transform: uppercase;
299
- margin-bottom: 4px;
300
  }
 
301
  .sli-summary-body {
302
- color: #D9E2EF;
303
  font-size: 12px;
304
- line-height: 1.35;
305
  }
306
 
307
- .stButton > button,
308
- .stDownloadButton > button,
309
- [data-testid="stBaseButton-secondary"],
310
- [data-testid="stBaseButton-primary"] {
311
- border-radius: 7px !important;
312
- min-height: 36px;
313
- font-weight: 650;
314
  }
315
- .stButton > button[kind="primary"],
316
- [data-testid="stBaseButton-primary"] {
317
- background: #2F7FD8 !important;
318
- border-color: #2F7FD8 !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319
  }
 
1
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
2
 
3
+ /* =====================================================
4
+ PROCURA AI — Vercel-Inspired Design System
5
+ Paleta: Negro absoluto + Blanco/gris ultrafino
6
+ ===================================================== */
7
+
8
+ /* ===== DESIGN TOKENS ===== */
9
+ :root {
10
+ --bg: #000000;
11
+ --bg-raised: #0a0a0a;
12
+ --bg-surface: #111111;
13
+ --bg-hover: #1a1a1a;
14
+ --border: rgba(255, 255, 255, 0.08);
15
+ --border-hover: rgba(255, 255, 255, 0.18);
16
+ --border-focus: rgba(255, 255, 255, 0.35);
17
+
18
+ --text-primary: #ededed;
19
+ --text-secondary: #888888;
20
+ --text-muted: #555555;
21
+
22
+ --accent: #ffffff;
23
+ --accent-blue: #0070f3;
24
+ --accent-green: #50e3c2;
25
+ --accent-amber: #f5a623;
26
+ --accent-red: #ff4444;
27
+ --accent-orange: #f97316;
28
+
29
+ --blue-dim: rgba(0, 112, 243, 0.12);
30
+ --green-dim: rgba(80, 227, 194, 0.12);
31
+ --amber-dim: rgba(245, 166, 35, 0.12);
32
+ --red-dim: rgba(255, 68, 68, 0.12);
33
+
34
+ --radius-sm: 6px;
35
+ --radius-md: 8px;
36
+ --radius-lg: 12px;
37
+ --radius-xl: 16px;
38
+ --radius-pill: 999px;
39
+
40
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.8);
41
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.6);
42
+ --shadow-lg: 0 8px 30px rgba(0,0,0,0.5);
43
+ --shadow-glow-blue: 0 0 20px rgba(0, 112, 243, 0.25);
44
+
45
+ --transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
46
+ --transition-slow: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
47
  }
48
+
49
+ /* ===== RESET & BASE ===== */
50
+ *, *::before, *::after { box-sizing: border-box; }
51
+
52
+ html, body,
53
+ [data-testid="stAppViewContainer"],
54
+ [data-testid="stApp"] {
55
+ background-color: var(--bg) !important;
56
+ color: var(--text-primary) !important;
57
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
58
+ -webkit-font-smoothing: antialiased;
59
+ -moz-osx-font-smoothing: grayscale;
60
+ }
61
+
62
+ [data-testid="stAppViewBlockContainer"] {
63
+ padding-top: 12px;
64
+ }
65
+
66
+ /* ===== SIDEBAR ===== */
67
  [data-testid="stSidebar"] {
68
+ background-color: var(--bg-raised) !important;
69
+ border-right: 1px solid var(--border) !important;
70
+ }
71
+
72
+ [data-testid="stSidebar"] > div {
73
+ background-color: transparent !important;
74
+ }
75
+
76
+ /* ===== HEADER / TOOLBAR ===== */
77
+ [data-testid="stHeader"] {
78
+ background-color: transparent !important;
79
+ border-bottom: none !important;
80
+ }
81
+
82
+ /* ===== STREAMLIT OVERRIDES ===== */
83
+ [data-testid="stMarkdown"] p {
84
+ color: var(--text-secondary);
85
+ line-height: 1.6;
86
+ font-size: 14px;
87
+ }
88
+
89
+ .stCaption { color: var(--text-muted) !important; font-size: 12px !important; }
90
+ .stDivider { border-color: var(--border) !important; }
91
+ label { color: var(--text-secondary) !important; font-size: 13px !important; }
92
+
93
+ /* ===== INPUTS ===== */
94
+ [data-testid="stTextInput"] input,
95
+ [data-testid="stTextArea"] textarea,
96
+ [data-baseweb="select"] {
97
+ background-color: var(--bg-surface) !important;
98
+ border: 1px solid var(--border) !important;
99
+ border-radius: var(--radius-md) !important;
100
+ color: var(--text-primary) !important;
101
+ font-family: 'Inter', sans-serif !important;
102
+ font-size: 14px !important;
103
+ transition: var(--transition) !important;
104
+ }
105
+
106
+ [data-testid="stTextInput"] input:focus,
107
+ [data-testid="stTextArea"] textarea:focus {
108
+ border-color: var(--border-focus) !important;
109
+ box-shadow: 0 0 0 1px rgba(255,255,255,0.12) !important;
110
+ outline: none !important;
111
+ }
112
+
113
+ /* ===== BUTTONS ===== */
114
+ .stButton > button,
115
+ .stDownloadButton > button,
116
+ [data-testid="stBaseButton-secondary"],
117
+ [data-testid="stBaseButton-primary"] {
118
+ background-color: var(--bg-surface) !important;
119
+ border: 1px solid var(--border) !important;
120
+ border-radius: var(--radius-md) !important;
121
+ color: var(--text-primary) !important;
122
+ font-family: 'Inter', sans-serif !important;
123
+ font-size: 13px !important;
124
+ font-weight: 500 !important;
125
+ padding: 6px 16px !important;
126
+ min-height: 34px !important;
127
+ transition: var(--transition) !important;
128
+ box-shadow: none !important;
129
+ letter-spacing: 0 !important;
130
+ cursor: pointer !important;
131
+ }
132
+
133
+ .stButton > button:hover,
134
+ .stDownloadButton > button:hover,
135
+ [data-testid="stBaseButton-secondary"]:hover {
136
+ background-color: var(--bg-hover) !important;
137
+ border-color: var(--border-hover) !important;
138
+ color: var(--accent) !important;
139
+ }
140
+
141
+ /* Botón primario — Vercel usa blanco sobre negro */
142
+ .stButton > button[kind="primary"],
143
+ [data-testid="stBaseButton-primary"] {
144
+ background-color: var(--accent) !important;
145
+ border-color: var(--accent) !important;
146
+ color: #000000 !important;
147
+ font-weight: 600 !important;
148
+ }
149
+
150
+ .stButton > button[kind="primary"]:hover,
151
+ [data-testid="stBaseButton-primary"]:hover {
152
+ background-color: #e0e0e0 !important;
153
+ border-color: #e0e0e0 !important;
154
+ }
155
+
156
+ /* ===== TABS ===== */
157
+ [data-testid="stTabs"] [role="tablist"] {
158
+ background: transparent !important;
159
+ border-bottom: 1px solid var(--border) !important;
160
+ gap: 0 !important;
161
+ }
162
+
163
+ [data-testid="stTabs"] button[role="tab"] {
164
+ background: transparent !important;
165
+ border: none !important;
166
+ color: var(--text-muted) !important;
167
+ font-family: 'Inter', sans-serif !important;
168
+ font-size: 13px !important;
169
+ font-weight: 500 !important;
170
+ padding: 10px 16px !important;
171
+ border-radius: 0 !important;
172
+ transition: var(--transition) !important;
173
+ }
174
+
175
+ [data-testid="stTabs"] button[role="tab"]:hover {
176
+ color: var(--text-primary) !important;
177
+ }
178
+
179
+ [data-testid="stTabs"] button[role="tab"][aria-selected="true"] {
180
+ color: var(--text-primary) !important;
181
+ border-bottom: 2px solid var(--accent) !important;
182
+ font-weight: 600 !important;
183
+ }
184
+
185
+ /* ===== EXPANDER ===== */
186
+ [data-testid="stExpander"] {
187
+ background-color: var(--bg-surface) !important;
188
+ border: 1px solid var(--border) !important;
189
+ border-radius: var(--radius-md) !important;
190
+ }
191
+
192
+ [data-testid="stExpander"] summary {
193
+ color: var(--text-secondary) !important;
194
+ font-size: 13px !important;
195
+ font-weight: 500 !important;
196
+ }
197
+
198
+ /* ===== METRICS ===== */
199
+ div[data-testid="metric-container"] {
200
+ background-color: var(--bg-surface);
201
+ border: 1px solid var(--border);
202
+ border-radius: var(--radius-md);
203
+ padding: 16px 20px;
204
+ transition: var(--transition);
205
+ }
206
+
207
+ div[data-testid="metric-container"]:hover {
208
+ border-color: var(--border-hover);
209
+ background-color: var(--bg-hover);
210
+ }
211
+
212
+ div[data-testid="metric-container"] [data-testid="stMetricLabel"] {
213
+ color: var(--text-muted) !important;
214
+ font-size: 11px !important;
215
+ text-transform: uppercase;
216
+ letter-spacing: 0.07em;
217
+ font-weight: 500;
218
+ }
219
+
220
+ div[data-testid="metric-container"] [data-testid="stMetricValue"] {
221
+ color: var(--text-primary) !important;
222
+ font-size: 24px !important;
223
+ font-weight: 700 !important;
224
+ letter-spacing: -0.03em;
225
+ }
226
+
227
+ /* ===== DATAFRAME ===== */
228
+ [data-testid="stDataFrame"] {
229
+ border: 1px solid var(--border);
230
+ border-radius: var(--radius-md);
231
+ overflow: hidden;
232
+ }
233
+
234
+ /* ===== ALERTS / INFO / WARNING / ERROR ===== */
235
+ [data-testid="stAlert"] {
236
+ border-radius: var(--radius-md) !important;
237
+ border: 1px solid var(--border) !important;
238
+ font-size: 13px !important;
239
+ }
240
+
241
+ /* ===== SCROLLBAR ===== */
242
+ ::-webkit-scrollbar { width: 4px; height: 4px; }
243
+ ::-webkit-scrollbar-track { background: var(--bg); }
244
+ ::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 4px; }
245
+ ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.2); }
246
+
247
+ /* ===== ANIMATIONS ===== */
248
+ @keyframes fadeIn {
249
+ from { opacity: 0; transform: translateY(6px); }
250
+ to { opacity: 1; transform: translateY(0); }
251
+ }
252
+
253
+ @keyframes shimmer {
254
+ 0% { background-position: -200% center; }
255
+ 100% { background-position: 200% center; }
256
  }
257
+
258
+ @keyframes pulse-dot {
259
+ 0%, 100% { opacity: 1; }
260
+ 50% { opacity: 0.4; }
261
+ }
262
+
263
+ /* =====================================================
264
+ COMPONENTES CUSTOM DE PROCURA AI
265
+ ===================================================== */
266
 
267
  /* ===== NAVBAR ===== */
268
  .top-navbar {
269
  position: fixed;
270
  top: 0; left: 0;
271
  width: 100%;
272
+ height: 52px;
273
+ background: rgba(0, 0, 0, 0.85);
274
+ backdrop-filter: saturate(180%) blur(20px);
275
+ -webkit-backdrop-filter: saturate(180%) blur(20px);
276
+ padding: 0 24px;
277
+ border-bottom: 1px solid var(--border);
278
  display: flex;
279
  justify-content: space-between;
280
  align-items: center;
281
  z-index: 9999;
 
282
  }
 
283
 
284
+ .top-navbar-logo {
285
+ font-size: 14px;
286
+ font-weight: 700;
287
+ color: var(--text-primary);
288
+ letter-spacing: -0.02em;
289
+ display: flex;
290
+ align-items: center;
291
+ gap: 8px;
292
  }
293
 
294
+ .top-navbar-meta {
295
+ font-size: 12px;
296
+ color: var(--text-muted);
297
+ display: flex;
298
+ align-items: center;
299
+ gap: 10px;
 
300
  }
301
+
302
+ .main-content-spacer { margin-top: 60px; }
303
+
304
+ /* ===== BADGE DE USUARIO ===== */
305
+ .user-badge {
306
+ background: var(--bg-surface);
307
+ border: 1px solid var(--border);
308
+ border-radius: var(--radius-pill);
309
+ padding: 3px 10px;
310
+ font-size: 11px;
311
+ font-weight: 600;
312
+ color: var(--text-secondary);
313
+ letter-spacing: 0.02em;
 
 
 
 
 
314
  }
315
+
316
+ /* ===== STATUS BADGE ONLINE ===== */
317
+ .status-online {
318
+ display: inline-flex;
319
+ align-items: center;
320
+ gap: 6px;
321
+ font-size: 11px;
322
+ color: var(--accent-green);
323
+ font-weight: 500;
324
+ }
325
+
326
+ .status-online::before {
327
+ content: '';
328
+ display: inline-block;
329
+ width: 6px;
330
+ height: 6px;
331
+ background: var(--accent-green);
332
+ border-radius: 50%;
333
+ animation: pulse-dot 2s ease-in-out infinite;
334
  }
335
 
336
+ /* ===== SECTION TITLES ===== */
337
+ .section-title {
338
+ font-size: 16px;
339
+ font-weight: 600;
340
+ color: var(--text-primary);
341
+ letter-spacing: -0.02em;
342
+ margin: 0 0 4px 0;
343
+ }
344
+
345
+ .section-subtitle {
346
+ font-size: 13px;
347
+ color: var(--text-muted);
348
+ margin: 0 0 20px 0;
349
+ font-weight: 400;
350
+ }
351
+
352
+ /* ===== CARDS ===== */
353
  .detail-card {
354
+ background: var(--bg-surface);
355
+ border: 1px solid var(--border);
356
+ border-radius: var(--radius-lg);
357
+ padding: 20px;
358
+ animation: fadeIn 0.2s ease;
359
+ transition: var(--transition);
360
+ }
361
+
362
+ .detail-card:hover {
363
+ border-color: var(--border-hover);
364
+ }
365
+
366
+ /* Acento azul izquierdo */
367
+ .detail-card-accent {
368
+ border-left: 2px solid var(--accent-blue);
369
  }
370
+
371
+ /* ===== PROVIDER CARDS ===== */
372
  .provider-card {
373
+ background: var(--bg-surface);
374
+ border: 1px solid var(--border);
375
+ border-radius: var(--radius-lg);
376
+ padding: 18px;
377
  height: 180px;
378
  display: flex;
379
  flex-direction: column;
380
  justify-content: space-between;
 
381
  overflow: hidden;
382
+ transition: var(--transition);
383
+ animation: fadeIn 0.2s ease;
384
+ cursor: pointer;
385
+ position: relative;
386
  }
387
+
388
+ .provider-card::after {
389
+ content: '';
390
+ position: absolute;
391
+ inset: 0;
392
+ border-radius: var(--radius-lg);
393
+ background: linear-gradient(135deg, rgba(255,255,255,0.02) 0%, transparent 60%);
394
+ pointer-events: none;
395
+ }
396
+
397
  .provider-card:hover {
398
+ border-color: var(--border-hover);
399
+ background: var(--bg-hover);
400
+ transform: translateY(-2px);
401
+ box-shadow: var(--shadow-md);
402
  }
403
+
404
  .provider-card h4 {
405
+ color: var(--text-primary);
406
+ margin: 0 0 8px 0;
407
+ font-size: 14px;
408
+ font-weight: 600;
409
+ line-height: 1.4;
410
+ letter-spacing: -0.01em;
411
  display: -webkit-box;
412
  -webkit-line-clamp: 2;
413
  -webkit-box-orient: vertical;
414
  overflow: hidden;
415
  }
416
+
417
  .provider-card p {
418
+ font-size: 12px;
419
+ color: var(--text-secondary);
420
+ line-height: 1.5;
421
  flex-grow: 1;
422
  display: -webkit-box;
423
  -webkit-line-clamp: 3;
424
  -webkit-box-orient: vertical;
425
  overflow: hidden;
426
+ margin: 0 0 10px 0;
427
  }
428
+
429
  .provider-card a {
430
+ color: var(--accent-blue);
431
+ font-weight: 500;
432
  text-decoration: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
433
  font-size: 12px;
 
434
  display: inline-flex;
435
  align-items: center;
436
+ gap: 4px;
437
+ transition: var(--transition);
 
 
 
 
 
 
 
 
 
438
  }
439
 
440
+ .provider-card a:hover { text-decoration: underline; }
441
+
442
+ /* ===== EMAIL CARD ===== */
443
+ .email-card {
444
+ background: var(--bg-surface);
445
+ border: 1px solid var(--border);
446
+ border-left: 2px solid var(--accent-green);
447
+ border-radius: var(--radius-md);
448
+ padding: 14px 16px;
449
+ margin-bottom: 8px;
450
+ transition: var(--transition);
451
+ animation: fadeIn 0.2s ease;
 
452
  }
453
 
454
+ .email-card:hover {
455
+ border-color: var(--border-hover);
456
+ border-left-color: var(--accent-blue);
457
+ background: var(--bg-hover);
458
+ }
459
 
460
+ /* ===== STEP CARDS ===== */
461
+ .step-card {
462
+ background: var(--bg-surface);
463
+ border: 1px solid var(--border);
464
+ border-radius: var(--radius-lg);
465
+ padding: 28px 20px;
466
+ text-align: center;
467
+ height: 100%;
468
+ transition: var(--transition-slow);
469
+ animation: fadeIn 0.3s ease;
470
+ position: relative;
471
+ overflow: hidden;
472
+ }
473
 
474
+ .step-card::before {
475
+ content: '';
476
+ position: absolute;
477
+ top: 0; left: 0; right: 0;
478
+ height: 1px;
479
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent);
480
+ transform: translateX(-100%);
481
+ transition: transform 0.5s ease;
 
 
 
 
 
 
482
  }
483
 
484
+ .step-card:hover::before { transform: translateX(100%); }
485
+
486
+ .step-card:hover {
487
+ border-color: var(--border-hover);
488
+ background: var(--bg-hover);
489
+ transform: translateY(-3px);
490
+ box-shadow: var(--shadow-lg);
491
  }
492
+
493
+ .step-icon {
494
+ font-size: 36px;
495
+ margin-bottom: 12px;
496
+ display: block;
497
+ filter: grayscale(20%);
498
  }
499
 
500
+ /* ===== MONITOR ROW ===== */
501
  .monitor-row {
502
+ background: var(--bg-surface);
503
+ border: 1px solid var(--border);
504
+ border-left: 2px solid var(--status-color, var(--accent-blue));
505
+ border-radius: var(--radius-md);
506
+ padding: 14px 16px;
507
+ transition: var(--transition);
508
+ margin-bottom: 2px;
509
+ }
510
+
511
+ .monitor-row:hover {
512
+ border-color: var(--border-hover);
513
+ border-left-color: var(--status-color, var(--accent-blue));
514
+ background: var(--bg-hover);
515
  }
516
+
517
  .monitor-row-head {
518
  display: flex;
519
  align-items: flex-start;
520
  justify-content: space-between;
521
  gap: 14px;
522
  }
523
+
524
  .monitor-id {
525
+ color: var(--text-primary);
526
+ font-size: 15px;
527
+ font-weight: 700;
528
+ letter-spacing: -0.02em;
529
  line-height: 1.2;
530
  }
531
+
532
  .monitor-owner {
533
  color: var(--text-muted);
534
+ font-size: 10px;
535
  text-transform: uppercase;
536
+ letter-spacing: 0.08em;
537
+ font-weight: 500;
538
+ margin-bottom: 2px;
539
  }
540
+
541
  .monitor-object {
542
+ color: var(--text-secondary);
543
  font-size: 12px;
544
+ line-height: 1.4;
545
+ margin-top: 4px;
546
  }
547
+
548
  .monitor-meta {
549
  display: flex;
550
  justify-content: flex-end;
551
  flex-wrap: wrap;
552
  gap: 6px;
553
+ margin-top: 10px;
554
  }
555
+
556
+ /* ===== STATUS BADGE ===== */
557
  .status-badge {
558
  display: inline-flex;
559
  align-items: center;
560
+ gap: 5px;
561
+ background: color-mix(in srgb, var(--status-color, var(--accent-blue)) 10%, transparent);
562
+ color: var(--status-color, var(--accent-blue));
563
+ border: 1px solid color-mix(in srgb, var(--status-color, var(--accent-blue)) 30%, transparent);
564
+ border-radius: var(--radius-pill);
565
+ padding: 3px 8px;
566
  font-size: 11px;
567
+ font-weight: 600;
568
  white-space: nowrap;
569
+ letter-spacing: 0.01em;
570
  }
571
+
572
  .status-dot {
573
+ width: 6px;
574
+ height: 6px;
575
  border-radius: 50%;
576
+ background: var(--status-color, var(--accent-blue));
577
+ flex-shrink: 0;
578
  }
579
+
580
+ /* ===== MINI PILL ===== */
581
  .mini-pill {
582
+ background: transparent;
583
+ border: 1px solid var(--border);
584
+ border-radius: var(--radius-pill);
585
  color: var(--text-muted);
586
+ padding: 2px 8px;
587
  font-size: 11px;
588
  white-space: nowrap;
589
+ font-weight: 400;
590
  }
591
 
592
+ /* ===== SLI SUMMARY ===== */
593
  .sli-summary {
594
+ margin: 10px 0;
595
+ background: var(--bg-raised);
596
+ border: 1px solid var(--border);
597
+ border-left: 2px solid var(--accent-amber);
598
+ border-radius: var(--radius-md);
599
+ padding: 10px 14px;
600
  }
601
+
602
  .sli-summary-title {
603
+ color: var(--accent-amber);
604
+ font-size: 10px;
605
+ font-weight: 700;
606
+ letter-spacing: 0.07em;
607
  text-transform: uppercase;
608
+ margin-bottom: 5px;
609
  }
610
+
611
  .sli-summary-body {
612
+ color: var(--text-secondary);
613
  font-size: 12px;
614
+ line-height: 1.5;
615
  }
616
 
617
+ /* ===== WORK PANEL ===== */
618
+ .work-panel {
619
+ background: var(--bg-surface);
620
+ border: 1px solid var(--border);
621
+ border-radius: var(--radius-md);
622
+ padding: 16px;
 
623
  }
624
+
625
+ /* ===== INFO GRID / TILES ===== */
626
+ .info-grid {
627
+ display: grid;
628
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
629
+ gap: 8px;
630
+ margin-bottom: 14px;
631
+ }
632
+
633
+ .info-tile {
634
+ background: var(--bg-raised);
635
+ border: 1px solid var(--border);
636
+ border-radius: var(--radius-md);
637
+ padding: 12px 14px;
638
+ }
639
+
640
+ .info-label {
641
+ color: var(--text-muted);
642
+ font-size: 10px;
643
+ text-transform: uppercase;
644
+ letter-spacing: 0.07em;
645
+ font-weight: 500;
646
+ margin-bottom: 4px;
647
+ }
648
+
649
+ .info-value {
650
+ color: var(--text-primary);
651
+ font-size: 13px;
652
+ font-weight: 600;
653
+ line-height: 1.3;
654
+ letter-spacing: -0.01em;
655
+ }
656
+
657
+ /* ===== TAG BADGE ===== */
658
+ .tag-badge {
659
+ display: inline-block;
660
+ background: var(--bg-surface);
661
+ border: 1px solid var(--border);
662
+ color: var(--text-secondary);
663
+ padding: 2px 8px;
664
+ border-radius: var(--radius-pill);
665
+ font-size: 11px;
666
+ font-weight: 500;
667
+ margin-right: 4px;
668
+ letter-spacing: 0.01em;
669
+ }
670
+
671
+ /* ===== ACTION BUTTON LEGACY ===== */
672
+ .action-btn {
673
+ display: inline-flex;
674
+ align-items: center;
675
+ gap: 6px;
676
+ margin-top: 10px;
677
+ margin-right: 8px;
678
+ background: var(--bg-surface);
679
+ border: 1px solid var(--border);
680
+ color: var(--text-primary) !important;
681
+ padding: 8px 16px;
682
+ border-radius: var(--radius-md);
683
+ text-decoration: none;
684
+ font-weight: 500;
685
+ font-size: 13px;
686
+ transition: var(--transition);
687
+ }
688
+
689
+ .action-btn:hover {
690
+ background: var(--bg-hover);
691
+ border-color: var(--border-hover);
692
+ }
693
+
694
+ /* ===== SHIMMER TEXT (para títulos premium) ===== */
695
+ .shimmer-text {
696
+ background: linear-gradient(
697
+ 90deg,
698
+ var(--text-secondary) 0%,
699
+ var(--text-primary) 30%,
700
+ var(--text-secondary) 60%,
701
+ var(--text-primary) 100%
702
+ );
703
+ background-size: 200% auto;
704
+ -webkit-background-clip: text;
705
+ -webkit-text-fill-color: transparent;
706
+ animation: shimmer 4s linear infinite;
707
+ }
708
+
709
+ /* ===== MOTOR IA STATUS ===== */
710
+ .ia-status-on {
711
+ display: inline-flex;
712
+ align-items: center;
713
+ gap: 6px;
714
+ background: rgba(80, 227, 194, 0.06);
715
+ border: 1px solid rgba(80, 227, 194, 0.2);
716
+ border-radius: var(--radius-pill);
717
+ padding: 5px 12px;
718
+ font-size: 12px;
719
+ color: var(--accent-green);
720
+ font-weight: 500;
721
+ }
722
+
723
+ .ia-status-off {
724
+ display: inline-flex;
725
+ align-items: center;
726
+ gap: 6px;
727
+ background: rgba(255, 68, 68, 0.06);
728
+ border: 1px solid rgba(255, 68, 68, 0.2);
729
+ border-radius: var(--radius-pill);
730
+ padding: 5px 12px;
731
+ font-size: 12px;
732
+ color: var(--accent-red);
733
+ font-weight: 500;
734
  }