tokiospg commited on
Commit
7c72406
·
verified ·
1 Parent(s): 1b5ada7

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +56 -19
  2. style.css +186 -239
app.py CHANGED
@@ -25,7 +25,7 @@ st.set_page_config(page_title="Proyelec Sourcing Pro", layout="wide", page_icon=
25
  @st.cache_data
26
  def get_css():
27
  try:
28
- with open('style.css', 'r', encoding='utf-8') as f:
29
  return f'<style>{f.read()}</style>'
30
  except:
31
  return ""
@@ -1129,44 +1129,81 @@ with tab_main:
1129
  total_reng = int(df_hist_kpi['Renglones'].sum()) if not df_hist_kpi.empty and 'Renglones' in df_hist_kpi.columns else 0
1130
  ultima_act = df_hist_kpi['Fecha Proceso'].iloc[0][:10] if not df_hist_kpi.empty else "Sin actividad"
1131
 
1132
- st.markdown("<br>", unsafe_allow_html=True)
1133
  st.markdown(f"""
1134
- <div style='text-align:center; margin-bottom: 8px;'>
1135
- <span style='font-size:13px; color:#58A6FF; font-weight:600; letter-spacing:2px; text-transform:uppercase;'>Centro de Mando</span>
1136
  </div>
1137
- <h2 style='text-align:center; color:#F0F6FC; margin:0 0 6px 0; font-weight:800;'>Bienvenido, {st.session_state.username}</h2>
1138
- <p style='text-align:center; color:#8B949E; margin-bottom:28px; font-size:14px;'>Sistema de Inteligencia de Sourcing — Proyelec</p>
 
 
1139
  """, unsafe_allow_html=True)
1140
 
1141
  k1, k2, k3, k4 = st.columns(4)
1142
- k1.metric("Licitaciones Procesadas", total_lic)
1143
- k2.metric("Renglones Analizados", total_reng)
1144
- k3.metric("Ultima Actividad", ultima_act)
1145
- k4.metric("Motor IA", "Gemini 2.5 Flash")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1146
 
1147
- st.markdown("<br>", unsafe_allow_html=True)
1148
- 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)
1149
 
1150
  c1, c2, c3 = st.columns(3)
1151
  with c1:
1152
  st.markdown("""
1153
- <div class='step-card'>
1154
  <div class='step-icon'>📄</div>
1155
- <h4>1. Carga el Pliego</h4>
1156
- <p style='color:#8B949E; font-size:14px;'>Sube el PDF oficial de la licitacion. Soporta pliego principal y anexos tecnicos simultaneamente.</p>
1157
  </div>
1158
  """, unsafe_allow_html=True)
1159
  with c2:
1160
  st.markdown("""
1161
- <div class='step-card'>
1162
  <div class='step-icon'>🧠</div>
1163
- <h4>2. Analisis con IA</h4>
1164
- <p style='color:#8B949E; font-size:14px;'>Gemini extrae renglones, codigos, cantidades y cruza automaticamente con el historico de precios.</p>
1165
  </div>
1166
  """, unsafe_allow_html=True)
1167
  with c3:
1168
  st.markdown("""
1169
- <div class='step-card'>
1170
  <div class='step-icon'>🎯</div>
1171
  <h4>3. Sourcing Global</h4>
1172
  <p style='color:#8B949E; font-size:14px;'>Busca los mejores proveedores, genera RFQs y organiza cotizaciones en tu bandeja inteligente.</p>
 
25
  @st.cache_data
26
  def get_css():
27
  try:
28
+ with open('style_aesthetic_test.css', 'r', encoding='utf-8') as f:
29
  return f'<style>{f.read()}</style>'
30
  except:
31
  return ""
 
1129
  total_reng = int(df_hist_kpi['Renglones'].sum()) if not df_hist_kpi.empty and 'Renglones' in df_hist_kpi.columns else 0
1130
  ultima_act = df_hist_kpi['Fecha Proceso'].iloc[0][:10] if not df_hist_kpi.empty else "Sin actividad"
1131
 
1132
+ st.markdown("<br><br>", unsafe_allow_html=True)
1133
  st.markdown(f"""
1134
+ <div style='text-align:center; margin-bottom: 12px;'>
1135
+ <span style='font-size:12px; color:#58A6FF; font-weight:700; letter-spacing:3px; text-transform:uppercase;'>MOTOR DE INTELIGENCIA DE SOURCING</span>
1136
  </div>
1137
+ <h1 style='text-align:center; margin:0 0 8px 0; font-weight:800; font-size: 38px;' class='premium-gradient-text'>PROYELEC SOURCING PRO</h1>
1138
+ <p style='text-align:center; color:#8B949E; margin-bottom:32px; font-size:15px; font-family:"Inter",sans-serif;'>
1139
+ Bienvenido, <b style="color:#F0F6FC;">{st.session_state.username}</b> &nbsp;|&nbsp; Gestión automatizada de procura para el Canal de Panamá
1140
+ </p>
1141
  """, unsafe_allow_html=True)
1142
 
1143
  k1, k2, k3, k4 = st.columns(4)
1144
+
1145
+ # Métrica 1
1146
+ with k1:
1147
+ st.markdown(f"""
1148
+ <div style="background:#161B22; border:1px solid #1E2A3A; padding:18px; border-radius:12px;">
1149
+ <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em;">Licitaciones Procesadas</div>
1150
+ <div style="font-size:28px; color:#E6EDF3; font-weight:800; margin-top:4px;">{total_lic}</div>
1151
+ </div>
1152
+ """, unsafe_allow_html=True)
1153
+
1154
+ # Métrica 2
1155
+ with k2:
1156
+ st.markdown(f"""
1157
+ <div style="background:#161B22; border:1px solid #1E2A3A; padding:18px; border-radius:12px;">
1158
+ <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em;">Renglones Analizados</div>
1159
+ <div style="font-size:28px; color:#E6EDF3; font-weight:800; margin-top:4px;">{total_reng}</div>
1160
+ </div>
1161
+ """, unsafe_allow_html=True)
1162
+
1163
+ # Métrica 3
1164
+ with k3:
1165
+ st.markdown(f"""
1166
+ <div style="background:#161B22; border:1px solid #1E2A3A; padding:18px; border-radius:12px;">
1167
+ <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em;">Última Actividad</div>
1168
+ <div style="font-size:20px; color:#E6EDF3; font-weight:800; margin-top:11px;">{ultima_act}</div>
1169
+ </div>
1170
+ """, unsafe_allow_html=True)
1171
+
1172
+ # Métrica 4 (Glow Animation)
1173
+ with k4:
1174
+ st.markdown(f"""
1175
+ <div style="background:#161B22; border:1px solid #1E2A3A; padding:16px 18px; border-radius:12px; height:100%; display:flex; flex-direction:column; justify-content:center;">
1176
+ <div style="font-size:11px; color:#8B949E; text-transform:uppercase; letter-spacing:0.05em; margin-bottom:8px;">Motor de IA Central</div>
1177
+ <div class="active-pulse-container">
1178
+ <span class="pulse-dot"></span>
1179
+ <b style="font-size:12px; color:#3FB950;">Gemini 2.5 Flash Activo</b>
1180
+ </div>
1181
+ </div>
1182
+ """, unsafe_allow_html=True)
1183
 
1184
+ st.markdown("<br><br>", unsafe_allow_html=True)
1185
+ 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)
1186
 
1187
  c1, c2, c3 = st.columns(3)
1188
  with c1:
1189
  st.markdown("""
1190
+ <div class='glass-card'>
1191
  <div class='step-icon'>📄</div>
1192
+ <h4 style="color:#58A6FF; font-size:16px; margin: 0 0 10px 0; font-weight:700;">1. Carga el Pliego</h4>
1193
+ <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>
1194
  </div>
1195
  """, unsafe_allow_html=True)
1196
  with c2:
1197
  st.markdown("""
1198
+ <div class='glass-card'>
1199
  <div class='step-icon'>🧠</div>
1200
+ <h4 style="color:#3FB950; font-size:16px; margin: 0 0 10px 0; font-weight:700;">2. Análisis con IA</h4>
1201
+ <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>
1202
  </div>
1203
  """, unsafe_allow_html=True)
1204
  with c3:
1205
  st.markdown("""
1206
+ <div class='glass-card'>
1207
  <div class='step-icon'>🎯</div>
1208
  <h4>3. Sourcing Global</h4>
1209
  <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,162 +1,192 @@
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
- /* ===== MÉTRICAS ===== */
35
- div[data-testid="metric-container"] {
36
- background: linear-gradient(135deg, #161B22 0%, #0D1117 100%);
37
- border: 1px solid #1E2A3A;
38
- padding: 18px;
39
- border-radius: 14px;
40
- transition: transform 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
41
- }
42
- div[data-testid="metric-container"]:hover {
43
- transform: translateY(-4px);
44
- border-color: #58A6FF;
45
- box-shadow: 0 8px 25px rgba(88, 166, 255, 0.15);
46
- }
47
-
48
- /* ===== CARDS ===== */
49
- .detail-card {
50
- background: linear-gradient(135deg, #161B22 0%, #0D1117 100%);
51
- padding: 25px;
52
- border-radius: 16px;
53
- border-top: 3px solid #58A6FF;
54
- border-left: 1px solid #1E2A3A;
55
- border-right: 1px solid #1E2A3A;
56
- border-bottom: 1px solid #1E2A3A;
57
- margin-top: 20px;
58
- animation: fadeInUp 0.3s ease;
59
- }
60
- .provider-card {
61
- border: 1px solid #1E2A3A;
62
- border-radius: 14px;
63
- padding: 20px;
64
- background: linear-gradient(135deg, #0D1117 0%, #0A0E1A 100%);
65
- border-left: 3px solid #58A6FF;
66
- height: 100%;
67
- transition: all 0.25s ease;
68
- margin-top: 15px;
69
- }
70
- .provider-card:hover {
71
- border-left-color: #10B981;
72
- transform: translateY(-4px);
73
- box-shadow: 0 10px 30px rgba(16, 185, 129, 0.15);
74
- }
75
- .email-card {
76
- background: linear-gradient(135deg, #161B22 0%, #0D1117 100%);
77
- border-left: 3px solid #10B981;
78
- padding: 18px;
79
- border-radius: 12px;
80
- margin-bottom: 12px;
81
- border-top: 1px solid #1E2A3A;
82
- border-right: 1px solid #1E2A3A;
83
- border-bottom: 1px solid #1E2A3A;
84
- transition: all 0.2s ease;
85
- animation: fadeInUp 0.3s ease;
86
- }
87
- .email-card:hover {
88
- border-left-color: #58A6FF;
89
- box-shadow: 0 4px 20px rgba(88, 166, 255, 0.1);
90
- }
91
- .step-card {
92
- background: linear-gradient(135deg, #161B22 0%, #0D1117 100%);
93
- border: 1px solid #1E2A3A;
94
- padding: 30px 20px;
95
- border-radius: 18px;
96
- text-align: center;
97
- height: 100%;
98
- transition: all 0.3s ease;
99
- animation: fadeInUp 0.4s ease;
100
- }
101
- .step-card:hover {
102
- border-color: #58A6FF;
103
- transform: translateY(-5px);
104
- box-shadow: 0 15px 40px rgba(88, 166, 255, 0.12);
105
- }
106
- .step-icon { font-size: 44px; margin-bottom: 15px; display: block; }
107
-
108
- /* ===== BADGES ===== */
109
- .tag-badge {
110
- background: linear-gradient(90deg, #1a3a1a, #238636);
111
- color: #3fb950;
112
- border: 1px solid #238636;
113
- padding: 3px 10px;
114
- border-radius: 20px;
115
- font-size: 11px;
116
- font-weight: 600;
117
- letter-spacing: 0.5px;
118
- margin-right: 4px;
119
- }
120
-
121
- /* ===== BOTONES LEGACY ===== */
122
- .action-btn {
123
- display: inline-block;
124
- margin-top: 10px; margin-right: 10px;
125
- background: linear-gradient(90deg, #238636, #2ea043);
126
- color: white !important;
127
- padding: 10px 18px;
128
- border-radius: 8px;
129
- text-decoration: none;
130
- font-weight: 700;
131
- font-size: 13px;
132
- transition: all 0.25s ease;
133
- box-shadow: 0 2px 8px rgba(35, 134, 54, 0.3);
134
- }
135
- .action-btn:hover {
136
- transform: translateY(-2px);
137
- box-shadow: 0 8px 20px rgba(35, 134, 54, 0.4);
138
- }
139
-
140
- /* ===== ANIMACIONES ===== */
141
- @keyframes fadeInUp {
142
- from { opacity: 0; transform: translateY(12px); }
143
- to { opacity: 1; transform: translateY(0); }
144
- }
145
- @keyframes pulse-blue {
146
- 0%, 100% { box-shadow: 0 0 0 0 rgba(88, 166, 255, 0.3); }
147
- 50% { box-shadow: 0 0 0 8px rgba(88, 166, 255, 0); }
148
- }
149
-
150
- /* ===== SCROLLBAR ===== */
151
- ::-webkit-scrollbar { width: 6px; height: 6px; }
152
- ::-webkit-scrollbar-track { background: #0A0E1A; }
153
- ::-webkit-scrollbar-thumb { background: #1E2A3A; border-radius: 4px; }
154
- ::-webkit-scrollbar-thumb:hover { background: #58A6FF; }
155
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  /* ===== DATAFRAME ===== */
157
  [data-testid="stDataFrame"] { border-radius: 12px; overflow: hidden; }
158
 
159
- /* ===== OPERATIONS UI REFRESH ===== */
160
  :root {
161
  --bg-main: #080C12;
162
  --surface-1: #0F141C;
@@ -172,38 +202,18 @@ div[data-testid="metric-container"]:hover {
172
  --gray: #748091;
173
  }
174
 
175
- div[data-testid="metric-container"] {
176
- background: var(--surface-1);
177
- border: 1px solid var(--line-soft);
178
- border-radius: 8px;
179
- box-shadow: none;
180
- }
181
-
182
- div[data-testid="metric-container"]:hover {
183
- transform: none;
184
- border-color: #344255;
185
- box-shadow: none;
186
- }
187
-
188
  .section-title {
189
  margin: 2px 0 12px 0;
190
  color: var(--text-main);
191
  font-size: 18px;
192
  font-weight: 750;
193
  }
194
-
195
  .section-subtitle {
196
  margin: -8px 0 16px 0;
197
  color: var(--text-muted);
198
  font-size: 13px;
199
  }
200
 
201
- .monitor-list {
202
- display: flex;
203
- flex-direction: column;
204
- gap: 10px;
205
- }
206
-
207
  .monitor-row {
208
  background: var(--surface-1);
209
  border: 1px solid var(--line-soft);
@@ -211,21 +221,18 @@ div[data-testid="metric-container"]:hover {
211
  border-radius: 8px;
212
  padding: 12px 14px;
213
  }
214
-
215
  .monitor-row-head {
216
  display: flex;
217
  align-items: flex-start;
218
  justify-content: space-between;
219
  gap: 14px;
220
  }
221
-
222
  .monitor-id {
223
  color: var(--text-main);
224
  font-size: 16px;
225
  font-weight: 800;
226
  line-height: 1.2;
227
  }
228
-
229
  .monitor-owner {
230
  color: var(--text-muted);
231
  font-size: 11px;
@@ -233,14 +240,12 @@ div[data-testid="metric-container"]:hover {
233
  letter-spacing: 0.04em;
234
  margin-bottom: 3px;
235
  }
236
-
237
  .monitor-object {
238
  color: #B8C2D0;
239
  font-size: 12px;
240
  line-height: 1.35;
241
  margin-top: 5px;
242
  }
243
-
244
  .monitor-meta {
245
  display: flex;
246
  justify-content: flex-end;
@@ -248,7 +253,6 @@ div[data-testid="metric-container"]:hover {
248
  gap: 6px;
249
  margin-top: 8px;
250
  }
251
-
252
  .status-badge {
253
  display: inline-flex;
254
  align-items: center;
@@ -262,14 +266,12 @@ div[data-testid="metric-container"]:hover {
262
  font-weight: 700;
263
  white-space: nowrap;
264
  }
265
-
266
  .status-dot {
267
  width: 7px;
268
  height: 7px;
269
  border-radius: 50%;
270
  background: var(--status-color, var(--blue));
271
  }
272
-
273
  .mini-pill {
274
  background: #0B1017;
275
  border: 1px solid var(--line-soft);
@@ -288,7 +290,6 @@ div[data-testid="metric-container"]:hover {
288
  border-radius: 8px;
289
  padding: 10px 12px;
290
  }
291
-
292
  .sli-summary-title {
293
  color: var(--amber);
294
  font-size: 11px;
@@ -297,65 +298,12 @@ div[data-testid="metric-container"]:hover {
297
  text-transform: uppercase;
298
  margin-bottom: 4px;
299
  }
300
-
301
  .sli-summary-body {
302
  color: #D9E2EF;
303
  font-size: 12px;
304
  line-height: 1.35;
305
  }
306
 
307
- .work-panel {
308
- background: var(--surface-1);
309
- border: 1px solid var(--line-soft);
310
- border-radius: 8px;
311
- padding: 14px;
312
- }
313
-
314
- .info-grid {
315
- display: grid;
316
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
317
- gap: 8px;
318
- margin-bottom: 14px;
319
- }
320
-
321
- .info-tile {
322
- background: var(--surface-1);
323
- border: 1px solid var(--line-soft);
324
- border-radius: 8px;
325
- padding: 12px;
326
- }
327
-
328
- .info-label {
329
- color: var(--text-muted);
330
- font-size: 10px;
331
- text-transform: uppercase;
332
- letter-spacing: 0.05em;
333
- margin-bottom: 5px;
334
- }
335
-
336
- .info-value {
337
- color: var(--text-main);
338
- font-size: 13px;
339
- font-weight: 650;
340
- line-height: 1.3;
341
- }
342
-
343
- .detail-card {
344
- background: var(--surface-1);
345
- border: 1px solid var(--line-soft);
346
- border-left: 4px solid var(--blue);
347
- border-radius: 8px;
348
- padding: 18px;
349
- box-shadow: none;
350
- }
351
-
352
- .provider-card, .email-card, .step-card {
353
- border-radius: 8px;
354
- background: var(--surface-1);
355
- border-color: var(--line-soft);
356
- box-shadow: none;
357
- }
358
-
359
  .stButton > button,
360
  .stDownloadButton > button,
361
  [data-testid="stBaseButton-secondary"],
@@ -364,7 +312,6 @@ div[data-testid="metric-container"]:hover {
364
  min-height: 36px;
365
  font-weight: 650;
366
  }
367
-
368
  .stButton > button[kind="primary"],
369
  [data-testid="stBaseButton-primary"] {
370
  background: #2F7FD8 !important;
 
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;
 
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);
 
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;
 
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;
 
253
  gap: 6px;
254
  margin-top: 8px;
255
  }
 
256
  .status-badge {
257
  display: inline-flex;
258
  align-items: center;
 
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);
 
290
  border-radius: 8px;
291
  padding: 10px 12px;
292
  }
 
293
  .sli-summary-title {
294
  color: var(--amber);
295
  font-size: 11px;
 
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"],
 
312
  min-height: 36px;
313
  font-weight: 650;
314
  }
 
315
  .stButton > button[kind="primary"],
316
  [data-testid="stBaseButton-primary"] {
317
  background: #2F7FD8 !important;