iatoolkit 0.3.9__py3-none-any.whl → 0.107.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of iatoolkit might be problematic. Click here for more details.

Files changed (150) hide show
  1. iatoolkit/__init__.py +27 -35
  2. iatoolkit/base_company.py +3 -35
  3. iatoolkit/cli_commands.py +18 -47
  4. iatoolkit/common/__init__.py +0 -0
  5. iatoolkit/common/exceptions.py +48 -0
  6. iatoolkit/common/interfaces/__init__.py +0 -0
  7. iatoolkit/common/interfaces/asset_storage.py +34 -0
  8. iatoolkit/common/interfaces/database_provider.py +39 -0
  9. iatoolkit/common/model_registry.py +159 -0
  10. iatoolkit/common/routes.py +138 -0
  11. iatoolkit/common/session_manager.py +26 -0
  12. iatoolkit/common/util.py +353 -0
  13. iatoolkit/company_registry.py +66 -29
  14. iatoolkit/core.py +514 -0
  15. iatoolkit/infra/__init__.py +5 -0
  16. iatoolkit/infra/brevo_mail_app.py +123 -0
  17. iatoolkit/infra/call_service.py +140 -0
  18. iatoolkit/infra/connectors/__init__.py +5 -0
  19. iatoolkit/infra/connectors/file_connector.py +17 -0
  20. iatoolkit/infra/connectors/file_connector_factory.py +57 -0
  21. iatoolkit/infra/connectors/google_cloud_storage_connector.py +53 -0
  22. iatoolkit/infra/connectors/google_drive_connector.py +68 -0
  23. iatoolkit/infra/connectors/local_file_connector.py +46 -0
  24. iatoolkit/infra/connectors/s3_connector.py +33 -0
  25. iatoolkit/infra/google_chat_app.py +57 -0
  26. iatoolkit/infra/llm_providers/__init__.py +0 -0
  27. iatoolkit/infra/llm_providers/deepseek_adapter.py +278 -0
  28. iatoolkit/infra/llm_providers/gemini_adapter.py +350 -0
  29. iatoolkit/infra/llm_providers/openai_adapter.py +124 -0
  30. iatoolkit/infra/llm_proxy.py +268 -0
  31. iatoolkit/infra/llm_response.py +45 -0
  32. iatoolkit/infra/redis_session_manager.py +122 -0
  33. iatoolkit/locales/en.yaml +222 -0
  34. iatoolkit/locales/es.yaml +225 -0
  35. iatoolkit/repositories/__init__.py +5 -0
  36. iatoolkit/repositories/database_manager.py +187 -0
  37. iatoolkit/repositories/document_repo.py +33 -0
  38. iatoolkit/repositories/filesystem_asset_repository.py +36 -0
  39. iatoolkit/repositories/llm_query_repo.py +105 -0
  40. iatoolkit/repositories/models.py +279 -0
  41. iatoolkit/repositories/profile_repo.py +171 -0
  42. iatoolkit/repositories/vs_repo.py +150 -0
  43. iatoolkit/services/__init__.py +5 -0
  44. iatoolkit/services/auth_service.py +193 -0
  45. {services → iatoolkit/services}/benchmark_service.py +7 -7
  46. iatoolkit/services/branding_service.py +153 -0
  47. iatoolkit/services/company_context_service.py +214 -0
  48. iatoolkit/services/configuration_service.py +375 -0
  49. iatoolkit/services/dispatcher_service.py +134 -0
  50. {services → iatoolkit/services}/document_service.py +20 -8
  51. iatoolkit/services/embedding_service.py +148 -0
  52. iatoolkit/services/excel_service.py +156 -0
  53. {services → iatoolkit/services}/file_processor_service.py +36 -21
  54. iatoolkit/services/history_manager_service.py +208 -0
  55. iatoolkit/services/i18n_service.py +104 -0
  56. iatoolkit/services/jwt_service.py +80 -0
  57. iatoolkit/services/language_service.py +89 -0
  58. iatoolkit/services/license_service.py +82 -0
  59. iatoolkit/services/llm_client_service.py +438 -0
  60. iatoolkit/services/load_documents_service.py +174 -0
  61. iatoolkit/services/mail_service.py +213 -0
  62. {services → iatoolkit/services}/profile_service.py +200 -101
  63. iatoolkit/services/prompt_service.py +303 -0
  64. iatoolkit/services/query_service.py +467 -0
  65. iatoolkit/services/search_service.py +55 -0
  66. iatoolkit/services/sql_service.py +169 -0
  67. iatoolkit/services/tool_service.py +246 -0
  68. iatoolkit/services/user_feedback_service.py +117 -0
  69. iatoolkit/services/user_session_context_service.py +213 -0
  70. iatoolkit/static/images/fernando.jpeg +0 -0
  71. iatoolkit/static/images/iatoolkit_core.png +0 -0
  72. iatoolkit/static/images/iatoolkit_logo.png +0 -0
  73. iatoolkit/static/js/chat_feedback_button.js +80 -0
  74. iatoolkit/static/js/chat_filepond.js +85 -0
  75. iatoolkit/static/js/chat_help_content.js +124 -0
  76. iatoolkit/static/js/chat_history_button.js +110 -0
  77. iatoolkit/static/js/chat_logout_button.js +36 -0
  78. iatoolkit/static/js/chat_main.js +401 -0
  79. iatoolkit/static/js/chat_model_selector.js +227 -0
  80. iatoolkit/static/js/chat_onboarding_button.js +103 -0
  81. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  82. iatoolkit/static/js/chat_reload_button.js +38 -0
  83. iatoolkit/static/styles/chat_iatoolkit.css +559 -0
  84. iatoolkit/static/styles/chat_modal.css +133 -0
  85. iatoolkit/static/styles/chat_public.css +135 -0
  86. iatoolkit/static/styles/documents.css +598 -0
  87. iatoolkit/static/styles/landing_page.css +398 -0
  88. iatoolkit/static/styles/llm_output.css +148 -0
  89. iatoolkit/static/styles/onboarding.css +176 -0
  90. iatoolkit/system_prompts/__init__.py +0 -0
  91. iatoolkit/system_prompts/query_main.prompt +30 -23
  92. iatoolkit/system_prompts/sql_rules.prompt +47 -12
  93. iatoolkit/templates/_company_header.html +45 -0
  94. iatoolkit/templates/_login_widget.html +42 -0
  95. iatoolkit/templates/base.html +78 -0
  96. iatoolkit/templates/change_password.html +66 -0
  97. iatoolkit/templates/chat.html +337 -0
  98. iatoolkit/templates/chat_modals.html +185 -0
  99. iatoolkit/templates/error.html +51 -0
  100. iatoolkit/templates/forgot_password.html +51 -0
  101. iatoolkit/templates/onboarding_shell.html +106 -0
  102. iatoolkit/templates/signup.html +79 -0
  103. iatoolkit/views/__init__.py +5 -0
  104. iatoolkit/views/base_login_view.py +96 -0
  105. iatoolkit/views/change_password_view.py +116 -0
  106. iatoolkit/views/chat_view.py +76 -0
  107. iatoolkit/views/embedding_api_view.py +65 -0
  108. iatoolkit/views/forgot_password_view.py +75 -0
  109. iatoolkit/views/help_content_api_view.py +54 -0
  110. iatoolkit/views/history_api_view.py +56 -0
  111. iatoolkit/views/home_view.py +63 -0
  112. iatoolkit/views/init_context_api_view.py +74 -0
  113. iatoolkit/views/llmquery_api_view.py +59 -0
  114. iatoolkit/views/load_company_configuration_api_view.py +49 -0
  115. iatoolkit/views/load_document_api_view.py +65 -0
  116. iatoolkit/views/login_view.py +170 -0
  117. iatoolkit/views/logout_api_view.py +57 -0
  118. iatoolkit/views/profile_api_view.py +46 -0
  119. iatoolkit/views/prompt_api_view.py +37 -0
  120. iatoolkit/views/root_redirect_view.py +22 -0
  121. iatoolkit/views/signup_view.py +100 -0
  122. iatoolkit/views/static_page_view.py +27 -0
  123. iatoolkit/views/user_feedback_api_view.py +60 -0
  124. iatoolkit/views/users_api_view.py +33 -0
  125. iatoolkit/views/verify_user_view.py +60 -0
  126. iatoolkit-0.107.4.dist-info/METADATA +268 -0
  127. iatoolkit-0.107.4.dist-info/RECORD +132 -0
  128. iatoolkit-0.107.4.dist-info/licenses/LICENSE +21 -0
  129. iatoolkit-0.107.4.dist-info/licenses/LICENSE_COMMUNITY.md +15 -0
  130. {iatoolkit-0.3.9.dist-info → iatoolkit-0.107.4.dist-info}/top_level.txt +0 -1
  131. iatoolkit/iatoolkit.py +0 -413
  132. iatoolkit/system_prompts/arquitectura.prompt +0 -32
  133. iatoolkit-0.3.9.dist-info/METADATA +0 -252
  134. iatoolkit-0.3.9.dist-info/RECORD +0 -32
  135. services/__init__.py +0 -5
  136. services/api_service.py +0 -75
  137. services/dispatcher_service.py +0 -351
  138. services/excel_service.py +0 -98
  139. services/history_service.py +0 -45
  140. services/jwt_service.py +0 -91
  141. services/load_documents_service.py +0 -212
  142. services/mail_service.py +0 -62
  143. services/prompt_manager_service.py +0 -172
  144. services/query_service.py +0 -334
  145. services/search_service.py +0 -32
  146. services/sql_service.py +0 -42
  147. services/tasks_service.py +0 -188
  148. services/user_feedback_service.py +0 -67
  149. services/user_session_context_service.py +0 -85
  150. {iatoolkit-0.3.9.dist-info → iatoolkit-0.107.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,398 @@
1
+ /* static/styles/landing_page.css */
2
+
3
+ /* --- Variables y Estilos Globales --- */
4
+ :root {
5
+ --website-primary-color: #4A55A2;
6
+ --website-primary-color-dark: #3A448A;
7
+ --website-gradient-start: #4A55A2;
8
+ --website-gradient-end: #7895CB;
9
+ --website-dark-text: #212529;
10
+ --website-light-bg: #f8f9fa;
11
+ --website-muted-text: #6c757d;
12
+ }
13
+
14
+ body {
15
+ background-color: #fff;
16
+ color: var(--website-dark-text);
17
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
18
+ }
19
+
20
+ /* --- Encabezado Propio (sin usar .navbar) --- */
21
+ .website-header {
22
+ margin-top: 1rem;
23
+ padding: 1rem 1.5rem; /* Padding vertical y horizontal */
24
+ border-radius: 0.5rem;
25
+ display: flex;
26
+ align-items: center;
27
+
28
+ /* Estilos de color (se mantienen) */
29
+ background-color: var(--website-primary-color);
30
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
31
+ }
32
+
33
+ .website-brand {
34
+ font-weight: 700;
35
+ font-size: 1.75rem;
36
+ color: #ffffff;
37
+ }
38
+
39
+ /* --- Header & Link Styles --- */
40
+ .website-header .website-brand,
41
+ .website-header a.website-brand,
42
+ .website-header a.website-brand:hover {
43
+ text-decoration: none; /* Elimina el subrayado de los enlaces */
44
+ }
45
+
46
+
47
+ /* --- Sección Principal (Hero) --- */
48
+ .hero-section {
49
+ }
50
+
51
+ .hero-title {
52
+ font-size: 3rem;
53
+ font-weight: 800;
54
+ line-height: 1.2;
55
+ margin-bottom: 1.5rem;
56
+ }
57
+ .gradient-text {
58
+ background: linear-gradient(90deg, var(--website-gradient-start), var(--website-gradient-end));
59
+ -webkit-background-clip: text;
60
+ -webkit-text-fill-color: transparent;
61
+ background-clip: text;
62
+ text-fill-color: transparent;
63
+ }
64
+
65
+ .hero-bullets {
66
+ list-style: none;
67
+ padding-left: 0;
68
+ font-size: 1.25rem;
69
+ line-height: 1.5;
70
+ margin-top: 1.5rem;
71
+ }
72
+
73
+ .hero-bullets li {
74
+ display: flex;
75
+ align-items: flex-start; /* necesario para alinear texto superior */
76
+ gap: 1rem;
77
+ margin-bottom: 1.4rem;
78
+ color: var(--website-muted-text);
79
+ }
80
+
81
+ .hero-bullets .bi {
82
+ font-size: 2rem;
83
+ color: var(--website-primary-color);
84
+ flex-shrink: 0;
85
+ line-height: 1; /* evita que el ícono genere espacio extra */
86
+ margin-top: 0.35rem; /* ESTE valor alinea perfecto el ícono con el texto */
87
+ }
88
+
89
+ /* --- Botón de Llamada a la Acción (CTA) --- */
90
+ .hero-section .btn-primary {
91
+ background-color: var(--website-primary-color);
92
+ border-color: var(--website-primary-color);
93
+ transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out;
94
+ }
95
+ .hero-section .btn-primary:hover {
96
+ background-color: var(--website-primary-color-dark);
97
+ border-color: var(--website-primary-color-dark);
98
+ }
99
+
100
+ .bg-light h3 {
101
+ color: var(--website-primary-color);
102
+ }
103
+
104
+ .features-section {
105
+ padding: 2rem 1rem;
106
+ background-color: var(--website-light-bg);
107
+ }
108
+ .feature-item {
109
+ background-color: #fff;
110
+ padding: 2rem;
111
+ border-radius: 0.75rem;
112
+ border: 1px solid #e9ecef;
113
+ height: 100%;
114
+ transition: all 0.3s ease;
115
+ }
116
+ .feature-item:hover {
117
+ transform: translateY(-5px);
118
+ box-shadow: 0 8px 25px rgba(0,0,0,0.08);
119
+ }
120
+ .feature-icon {
121
+ font-size: 2.5rem;
122
+ margin-bottom: 1rem;
123
+ color: var(--website-primary-color);
124
+ }
125
+ .feature-item h3 {
126
+ font-weight: 600;
127
+ margin-bottom: 0.5rem;
128
+ }
129
+ .feature-item p {
130
+ color: var(--website-muted-text);
131
+ }
132
+
133
+ /* Estilo especial para la caja de Open Source */
134
+ .opensource-box {
135
+ background: var(--website-dark-text);
136
+ color: #fff;
137
+ padding: 2rem;
138
+ border-radius: 0.75rem;
139
+ height: 100%;
140
+ display: flex;
141
+ flex-direction: column;
142
+ justify-content: space-between;
143
+ border: 1px solid transparent;
144
+ transition: all 0.3s ease;
145
+ }
146
+ .opensource-box:hover {
147
+ transform: translateY(-5px);
148
+ box-shadow: 0 8px 25px rgba(0,0,0,0.15);
149
+ }
150
+ .opensource-icon .bi-github {
151
+ font-size: 2.5rem;
152
+ margin-bottom: 1rem;
153
+ }
154
+ .opensource-box h3 {
155
+ font-weight: 600;
156
+ }
157
+ .opensource-box p {
158
+ color: #ced4da;
159
+ margin-bottom: 1.5rem;
160
+ }
161
+
162
+ .article-footer {
163
+ margin-top: 4rem;
164
+ padding-top: 2rem;
165
+ border-top: 1px solid #e9ecef; /* Separador visual */
166
+ }
167
+
168
+ /* --- Sección del Autor --- */
169
+ .author-section {
170
+ background-color: #fff;
171
+ }
172
+ .author-card {
173
+ background-color: var(--website-light-bg);
174
+ border-radius: 0.75rem;
175
+ border: 1px solid #e9ecef;
176
+ }
177
+ .author-card h5 {
178
+ color: var(--website-primary-color);
179
+ font-weight: 600;
180
+ }
181
+ .author-bio {
182
+ color: var(--website-muted-text);
183
+ line-height: 1.6;
184
+ }
185
+ .author-linkedin {
186
+ text-decoration: none;
187
+ color: #0077b5;
188
+ font-weight: 500;
189
+ transition: opacity 0.2s;
190
+ }
191
+ .author-linkedin:hover {
192
+ opacity: 0.8;
193
+ }
194
+ .author-box {
195
+ display: flex;
196
+ align-items: center;
197
+ gap: 25px;
198
+ background-color: #f8f9fa;
199
+ padding: 25px;
200
+ border-radius: 12px;
201
+ }
202
+
203
+ .author-avatar img {
204
+ width: 90px;
205
+ height: 90px;
206
+ border-radius: 50%;
207
+ object-fit: cover;
208
+ border: 3px solid #fff;
209
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
210
+ }
211
+
212
+ .author-details {
213
+ line-height: 1.4; /* Reduce el espacio entre líneas */
214
+ }
215
+
216
+ .author-details p {
217
+ margin: 0; /* Elimina los márgenes por defecto de los párrafos */
218
+ }
219
+
220
+ .author-name {
221
+ font-weight: 600;
222
+ font-size: 1.25rem;
223
+ color: #212529;
224
+ }
225
+
226
+ .author-title {
227
+ font-size: 1rem;
228
+ color: #6c757d;
229
+ margin-top: 2px; /* Pequeño espacio después del nombre */
230
+ font-style: normal;
231
+ }
232
+
233
+ .author-social-link {
234
+ display: inline-block;
235
+ margin-top: 8px; /* Espacio reducido antes del enlace */
236
+ font-size: 0.95rem;
237
+ color: #007bff;
238
+ text-decoration: none;
239
+ font-weight: 500;
240
+ }
241
+
242
+ .author-social-link:hover {
243
+ text-decoration: underline;
244
+ }
245
+
246
+ .author-social-link i {
247
+ margin-right: 5px;
248
+ }
249
+
250
+ /* --- Footer --- */
251
+ .landing-footer {
252
+ background-color: var(--website-light-bg);
253
+ color: var(--website-muted-text);
254
+ padding: 2rem 0;
255
+ text-align: center;
256
+ margin-top: 4rem;
257
+ border-top: 1px solid #e9ecef;
258
+ }
259
+
260
+
261
+ /* Language Switcher within header */
262
+ .language-switcher {
263
+ display: flex;
264
+ align-items: center;
265
+ font-size: 0.9rem;
266
+ /* margen izquierdo auto no es necesario si usas justify-content-between,
267
+ pero no molesta si el header cambia en el futuro */
268
+ margin-left: auto;
269
+ }
270
+
271
+ /* Links de idioma sobre fondo azul */
272
+ .language-link {
273
+ text-decoration: none;
274
+ color: #ffffff; /* texto blanco */
275
+ padding: 2px 8px;
276
+ font-weight: 500;
277
+ border-radius: 4px;
278
+ transition: background-color 0.2s ease;
279
+ }
280
+
281
+ /* Separador | puede heredar color blanco */
282
+ .language-switcher .mx-1 {
283
+ color: #ffffff;
284
+ }
285
+
286
+ /* Hover: blanco translúcido encima del azul */
287
+ .language-link:hover {
288
+ background-color: rgba(255, 255, 255, 0.25);
289
+ }
290
+
291
+ /* Idioma activo: un poco más marcado */
292
+ .language-link.active {
293
+ background-color: rgba(255, 255, 255, 0.35);
294
+ font-weight: 700;
295
+ color: #ffffff;
296
+ }
297
+
298
+ .btn-outline-website {
299
+ border: 2px solid var(--website-primary-color);
300
+ color: var(--website-primary-color);
301
+ background-color: transparent;
302
+ font-weight: 600;
303
+ transition: 0.2s ease-in-out;
304
+ }
305
+
306
+ .btn-outline-website:hover {
307
+ background-color: var(--website-primary-color);
308
+ color: #fff;
309
+ }
310
+
311
+ /* ------- Editions Section (Community vs Enterprise) ------- */
312
+ .edition-box {
313
+ background: #ffffff;
314
+ border: 1px solid rgba(0,0,0,0.08);
315
+ border-radius: 12px;
316
+ padding: 2rem;
317
+ text-align: left;
318
+ box-shadow: 0 4px 12px rgba(0,0,0,0.04);
319
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
320
+ }
321
+
322
+ .edition-box h3 {
323
+ font-weight: 600;
324
+ font-size: 1.4rem;
325
+ margin-bottom: 0.5rem;
326
+ color: var(--website-primary-color);
327
+ }
328
+
329
+ .edition-box p {
330
+ margin-bottom: 1.2rem;
331
+ color: var(--website-muted-text);
332
+ }
333
+
334
+ .edition-box ul {
335
+ padding-left: 0;
336
+ list-style: none;
337
+ margin: 0;
338
+ }
339
+
340
+ .edition-box ul li {
341
+ margin-bottom: 0.4rem;
342
+ font-size: 1rem;
343
+ display: flex;
344
+ align-items: center;
345
+ gap: 0.5rem;
346
+ }
347
+
348
+ .edition-box ul li::before {
349
+ content: "✔";
350
+ font-weight: bold;
351
+ color: var(--website-primary-color);
352
+ font-size: 1rem;
353
+ }
354
+
355
+ /* Hover effect (solo desktop) */
356
+ @media (hover: hover) {
357
+ .edition-box:hover {
358
+ transform: translateY(-6px);
359
+ box-shadow: 0 8px 20px rgba(0,0,0,0.08);
360
+ }
361
+ }
362
+
363
+ /* Enterprise highlighting */
364
+ .edition-box.enterprise {
365
+ background: var(--website-light-bg);
366
+ border: 1px solid rgba(0,0,0,0.12);
367
+ }
368
+
369
+ /* Section title & spacing */
370
+ .editions-section h2 {
371
+ color: var(--website-dark-text);
372
+ font-weight: 700;
373
+ }
374
+
375
+ .editions-section .edition-box {
376
+ min-height: 100%;
377
+ }
378
+
379
+ .trusted-subtitle {
380
+ font-size: 0.9rem;
381
+ font-weight: 500;
382
+ color: var(--website-primary-color-dark);
383
+ opacity: 0.8;
384
+ text-align: center;
385
+ margin-top: -0.5rem;
386
+ margin-bottom: 1.2rem;
387
+ }
388
+
389
+ /* Estilo del link dentro del badge */
390
+ .trusted-link {
391
+ color: var(--website-primary-color-dark);
392
+ text-decoration: none;
393
+ font-weight: 600;
394
+ }
395
+
396
+ .trusted-link:hover {
397
+ text-decoration: underline;
398
+ }
@@ -0,0 +1,148 @@
1
+ /* BLOQUE GENERAL */
2
+ .llm-output {
3
+ margin: 0;
4
+ padding: 14px;
5
+ font-family: Arial, sans-serif;
6
+ font-size: 16px;
7
+ line-height: 1.5;
8
+ color: #333;
9
+ }
10
+
11
+
12
+ /* estilo especial para desplegar a ancho completo */
13
+ .llm-output-full-width {
14
+ max-width: 100%; /* Anula cualquier max-width anterior como 70% o 75% */
15
+ width: 100%;
16
+ align-self: center; /* Se asegura que se centre en el contenedor flex */
17
+ box-sizing: border-box; /* Para que el padding y borde no afecten el ancho total */
18
+ }
19
+
20
+
21
+ /* BLOQUES de categorías */
22
+ .llm-output .categoria {
23
+ margin-bottom: 40px;
24
+ }
25
+
26
+ /* TÍTULO del bloque de categoría */
27
+ .llm-output .categoria h4 {
28
+ font-size: 15px; /* tamaño consistente */
29
+ color: #337ab7; /* azul Bootstrap 3 */
30
+ margin-top: 0;
31
+ margin-bottom: 10px;
32
+ font-weight: bold;
33
+ border-bottom: 2px solid #337ab7; /* línea azul más visible */
34
+ padding-bottom: 5px;
35
+ }
36
+
37
+ /* TEXTOS normales dentro */
38
+ .llm-output p {
39
+ margin-bottom: 10px;
40
+ }
41
+
42
+ /* LISTAS */
43
+ .llm-output ul {
44
+ padding-left: 0;
45
+ margin: 0 0 10px 0;
46
+ list-style: none;
47
+ }
48
+
49
+ .llm-output ul li {
50
+ margin-bottom: 8px;
51
+ }
52
+
53
+ .llm-output li strong {
54
+ display: inline-block;
55
+ margin-right: 8px;
56
+ font-weight: bold;
57
+ color: #333;
58
+ min-width: 0;
59
+ white-space: nowrap;
60
+ }
61
+
62
+ /* TABLAS */
63
+ .llm-output table {
64
+ width: 100%;
65
+ border-collapse: collapse;
66
+ font-size: 14px;
67
+ }
68
+
69
+ .llm-output th,
70
+ .llm-output td {
71
+ padding: 6px 10px;
72
+ border: 1px solid #ddd;
73
+ text-align: left !important;
74
+ vertical-align: middle;
75
+ }
76
+
77
+ .llm-output thead {
78
+ background-color: #f5f5f5;
79
+ }
80
+
81
+ .llm-output .table-striped tbody tr:nth-of-type(odd) {
82
+ background-color: #f9f9f9;
83
+ }
84
+
85
+ .llm-output .table-hover tbody tr:hover {
86
+ background-color: #f5f5f5;
87
+ }
88
+
89
+ .llm-output .tabla-licitaciones-container {
90
+ width: 100%;
91
+ overflow-x: auto; /* Añade scroll horizontal si la tabla no cabe */
92
+ margin-bottom: 15px; /* Espacio extra debajo */
93
+ border: 1px solid #ddd; /* Opcional: un borde sutil alrededor */
94
+ }
95
+
96
+ .llm-output .tabla-licitaciones th,
97
+ .llm-output .tabla-licitaciones td {
98
+ vertical-align: top;
99
+ }
100
+
101
+ .llm-output .tabla-licitaciones tbody tr:hover {
102
+ background-color: #f5f5f5; /* Mismo color que el hover genérico */
103
+ }
104
+
105
+ .text-center {
106
+ text-align: center !important;
107
+ }
108
+
109
+ .text-right {
110
+ text-align: right !important;
111
+ }
112
+
113
+ .nowrap {
114
+ white-space: nowrap;
115
+ }
116
+
117
+ /* =========================================================
118
+ REASONING BLOCK (LLM)
119
+ ========================================================= */
120
+
121
+ .reasoning-block {
122
+ }
123
+
124
+ /* Botón de mostrar razonamiento */
125
+ .reasoning-toggle {
126
+ font-size: 13px;
127
+ color: #6c757d; /* text-secondary */
128
+ }
129
+
130
+ .reasoning-toggle:hover {
131
+ color: #495057;
132
+ text-decoration: underline;
133
+ }
134
+
135
+ /* Contenedor del reasoning */
136
+ .reasoning-card {
137
+ background-color: #f8f9fa; /* bg-light */
138
+ border-left: 3px solid #6c757d; /* border-secondary */
139
+ padding: 10px 14px;
140
+ font-size: 14px; /* consistente con llm-output */
141
+ line-height: 1.5;
142
+ color: #555;
143
+ white-space: pre-wrap;
144
+ max-height: 300px;
145
+ overflow-y: auto;
146
+ font-family: inherit; /* 👈 clave: usa la misma fuente base */
147
+ }
148
+
@@ -0,0 +1,176 @@
1
+ /* static/css/onboarding.css */
2
+
3
+ /* Fuente base para ambos contextos */
4
+ .ob-root {
5
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
6
+ }
7
+
8
+ /* Tarjeta */
9
+ .ob-card {
10
+ background-color: #fff;
11
+ border-radius: 12px;
12
+ box-shadow: 0 4px 20px rgba(0,0,0,0.1);
13
+ padding: 30px;
14
+ width: 90%;
15
+ max-width: 450px;
16
+ text-align: center;
17
+ transition: opacity 0.3s ease-in-out;
18
+ margin: 0 auto;
19
+ }
20
+
21
+ /* Contenido de tarjeta */
22
+ .ob-icon {
23
+ font-size: 40px;
24
+ color: var(--brand-primary-color, #FF5100);
25
+ margin-bottom: 15px;
26
+ }
27
+ .ob-title {
28
+ font-size: 1.25rem;
29
+ color: #333;
30
+ margin-bottom: 10px;
31
+ }
32
+ .ob-text {
33
+ font-size: 0.95rem;
34
+ color: #666;
35
+ line-height: 1.5;
36
+ min-height: 60px;
37
+ }
38
+
39
+ .ob-example {
40
+ font-size: 0.95rem;
41
+ color: #444;
42
+ line-height: 1.5;
43
+ min-height: 60px;
44
+ }
45
+
46
+ /* Navegación */
47
+ .ob-nav {
48
+ display: flex;
49
+ justify-content: space-between;
50
+ align-items: center;
51
+ margin-top: 20px;
52
+ }
53
+ .ob-btn {
54
+ background-color: var(--brand-secondary-color, #06326B);
55
+ border: none;
56
+ color: var(--brand-text-on-secondary, #FFFFFF);
57
+ border-radius: 50%;
58
+ width: 40px;
59
+ height: 40px;
60
+ cursor: pointer;
61
+ transition: opacity 0.2s;
62
+ display: inline-flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ }
66
+ .ob-btn:hover { opacity: 0.85; }
67
+
68
+ /* Dots */
69
+ .ob-dots {
70
+ display: flex;
71
+ gap: 8px;
72
+ }
73
+ .ob-dots > div {
74
+ width: 10px;
75
+ height: 10px;
76
+ border-radius: 50%;
77
+ background-color: #ddd;
78
+ transition: background-color 0.3s;
79
+ }
80
+ .ob-dots > div.active {
81
+ background-color: var(--brand-primary-color, #FF5100);
82
+ }
83
+
84
+ /* Encabezado reutilizable (si se usa) */
85
+ .ob-brand-header {
86
+ font-size: 2rem;
87
+ font-weight: 700;
88
+ margin-bottom: 24px;
89
+ color: var(--brand-secondary-color, #06326B);
90
+ text-align: center;
91
+ }
92
+ .ob-brand-header .brand-name {
93
+ color: var(--brand-primary-color, #FF5100);
94
+ }
95
+
96
+ /* Utilidades */
97
+ .ob-fade {
98
+ transition: opacity 0.5s ease-in-out;
99
+ }
100
+
101
+ /* Responsivo */
102
+ @media (max-width: 420px) {
103
+ .ob-card { padding: 24px; }
104
+ .ob-icon { font-size: 34px; }
105
+ }
106
+
107
+ /* Overlay a pantalla completa */
108
+ .onboarding-shell-root {
109
+ position: relative;
110
+ height: calc(100vh - 0px);
111
+ }
112
+
113
+ /* Centrado vertical y horizontal del contenido del loader */
114
+ #loader-wrapper {
115
+ position: absolute; inset: 0;
116
+ background-color: #f4f7f6;
117
+ z-index: 1000;
118
+ display: flex; align-items: center; justify-content: center;
119
+ padding: 20px; box-sizing: border-box;
120
+ transition: opacity 0.5s ease-in-out;
121
+ }
122
+
123
+ /* Pila vertical: header + tarjeta + banda de carga */
124
+ .ob-stack {
125
+ width: 100%;
126
+ max-width: 520px; /* ligeramente más que la tarjeta para respiración */
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: stretch; /* la tarjeta ocupa el ancho */
130
+ gap: 16px;
131
+ }
132
+
133
+ /* Header de marca consistente */
134
+ .ob-brand-header {
135
+ font-size: 2rem;
136
+ font-weight: 700;
137
+ margin: 0;
138
+ color: var(--brand-secondary-color, #06326B);
139
+ text-align: center;
140
+ }
141
+ .ob-brand-header .brand-name {
142
+ color: var(--brand-primary-color, #FF5100);
143
+ }
144
+
145
+ /* Banda de estado integrada visualmente con la tarjeta */
146
+ .ob-loading-band {
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ gap: 12px;
151
+ padding: 12px 14px;
152
+ background: #ffffff;
153
+ border-radius: 12px;
154
+ box-shadow: 0 4px 20px rgba(0,0,0,0.08);
155
+ }
156
+
157
+ /* Spinner */
158
+ .spinner {
159
+ width: 28px; height: 28px;
160
+ border: 4px solid rgba(0,0,0,0.1);
161
+ border-top-color: var(--brand-primary-color, #FF5100);
162
+ border-radius: 50%;
163
+ animation: spin 1s linear infinite;
164
+ }
165
+ @keyframes spin { to { transform: rotate(360deg); } }
166
+
167
+ #loading-status p {
168
+ font-size: 0.95rem;
169
+ font-weight: 500;
170
+ color: #555;
171
+ margin: 0;
172
+ }
173
+
174
+ /* Iframe contenedor */
175
+ #content-container { width: 100%; height: 100%; }
176
+ #content-container iframe { width: 100%; height: 100%; border: none; }
File without changes