iatoolkit 0.71.4__py3-none-any.whl → 1.4.2__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.
Files changed (114) hide show
  1. iatoolkit/__init__.py +19 -7
  2. iatoolkit/base_company.py +1 -71
  3. iatoolkit/cli_commands.py +9 -21
  4. iatoolkit/common/exceptions.py +2 -0
  5. iatoolkit/common/interfaces/__init__.py +0 -0
  6. iatoolkit/common/interfaces/asset_storage.py +34 -0
  7. iatoolkit/common/interfaces/database_provider.py +38 -0
  8. iatoolkit/common/model_registry.py +159 -0
  9. iatoolkit/common/routes.py +53 -32
  10. iatoolkit/common/util.py +17 -12
  11. iatoolkit/company_registry.py +55 -14
  12. iatoolkit/{iatoolkit.py → core.py} +102 -72
  13. iatoolkit/infra/{mail_app.py → brevo_mail_app.py} +15 -37
  14. iatoolkit/infra/llm_providers/__init__.py +0 -0
  15. iatoolkit/infra/llm_providers/deepseek_adapter.py +278 -0
  16. iatoolkit/infra/{gemini_adapter.py → llm_providers/gemini_adapter.py} +11 -17
  17. iatoolkit/infra/{openai_adapter.py → llm_providers/openai_adapter.py} +41 -7
  18. iatoolkit/infra/llm_proxy.py +235 -134
  19. iatoolkit/infra/llm_response.py +5 -0
  20. iatoolkit/locales/en.yaml +134 -4
  21. iatoolkit/locales/es.yaml +293 -162
  22. iatoolkit/repositories/database_manager.py +92 -22
  23. iatoolkit/repositories/document_repo.py +7 -0
  24. iatoolkit/repositories/filesystem_asset_repository.py +36 -0
  25. iatoolkit/repositories/llm_query_repo.py +36 -22
  26. iatoolkit/repositories/models.py +86 -95
  27. iatoolkit/repositories/profile_repo.py +64 -13
  28. iatoolkit/repositories/vs_repo.py +31 -28
  29. iatoolkit/services/auth_service.py +1 -1
  30. iatoolkit/services/branding_service.py +1 -1
  31. iatoolkit/services/company_context_service.py +96 -39
  32. iatoolkit/services/configuration_service.py +329 -67
  33. iatoolkit/services/dispatcher_service.py +51 -227
  34. iatoolkit/services/document_service.py +10 -1
  35. iatoolkit/services/embedding_service.py +9 -6
  36. iatoolkit/services/excel_service.py +50 -2
  37. iatoolkit/services/file_processor_service.py +0 -5
  38. iatoolkit/services/history_manager_service.py +208 -0
  39. iatoolkit/services/jwt_service.py +1 -1
  40. iatoolkit/services/knowledge_base_service.py +412 -0
  41. iatoolkit/services/language_service.py +8 -2
  42. iatoolkit/services/license_service.py +82 -0
  43. iatoolkit/{infra/llm_client.py → services/llm_client_service.py} +42 -29
  44. iatoolkit/services/load_documents_service.py +18 -47
  45. iatoolkit/services/mail_service.py +171 -25
  46. iatoolkit/services/profile_service.py +69 -36
  47. iatoolkit/services/{prompt_manager_service.py → prompt_service.py} +136 -25
  48. iatoolkit/services/query_service.py +229 -203
  49. iatoolkit/services/sql_service.py +116 -34
  50. iatoolkit/services/tool_service.py +246 -0
  51. iatoolkit/services/user_feedback_service.py +18 -6
  52. iatoolkit/services/user_session_context_service.py +121 -51
  53. iatoolkit/static/images/iatoolkit_core.png +0 -0
  54. iatoolkit/static/images/iatoolkit_logo.png +0 -0
  55. iatoolkit/static/js/chat_feedback_button.js +1 -1
  56. iatoolkit/static/js/chat_help_content.js +4 -4
  57. iatoolkit/static/js/chat_main.js +61 -9
  58. iatoolkit/static/js/chat_model_selector.js +227 -0
  59. iatoolkit/static/js/chat_onboarding_button.js +1 -1
  60. iatoolkit/static/js/chat_reload_button.js +4 -1
  61. iatoolkit/static/styles/chat_iatoolkit.css +59 -3
  62. iatoolkit/static/styles/chat_public.css +28 -0
  63. iatoolkit/static/styles/documents.css +598 -0
  64. iatoolkit/static/styles/landing_page.css +223 -7
  65. iatoolkit/static/styles/llm_output.css +34 -1
  66. iatoolkit/system_prompts/__init__.py +0 -0
  67. iatoolkit/system_prompts/query_main.prompt +28 -3
  68. iatoolkit/system_prompts/sql_rules.prompt +47 -12
  69. iatoolkit/templates/_company_header.html +30 -5
  70. iatoolkit/templates/_login_widget.html +3 -3
  71. iatoolkit/templates/base.html +13 -0
  72. iatoolkit/templates/chat.html +45 -3
  73. iatoolkit/templates/forgot_password.html +3 -2
  74. iatoolkit/templates/onboarding_shell.html +1 -2
  75. iatoolkit/templates/signup.html +3 -0
  76. iatoolkit/views/base_login_view.py +8 -3
  77. iatoolkit/views/change_password_view.py +1 -1
  78. iatoolkit/views/chat_view.py +76 -0
  79. iatoolkit/views/forgot_password_view.py +9 -4
  80. iatoolkit/views/history_api_view.py +3 -3
  81. iatoolkit/views/home_view.py +4 -2
  82. iatoolkit/views/init_context_api_view.py +1 -1
  83. iatoolkit/views/llmquery_api_view.py +4 -3
  84. iatoolkit/views/load_company_configuration_api_view.py +49 -0
  85. iatoolkit/views/{file_store_api_view.py → load_document_api_view.py} +15 -11
  86. iatoolkit/views/login_view.py +25 -8
  87. iatoolkit/views/logout_api_view.py +10 -2
  88. iatoolkit/views/prompt_api_view.py +1 -1
  89. iatoolkit/views/rag_api_view.py +216 -0
  90. iatoolkit/views/root_redirect_view.py +22 -0
  91. iatoolkit/views/signup_view.py +12 -4
  92. iatoolkit/views/static_page_view.py +27 -0
  93. iatoolkit/views/users_api_view.py +33 -0
  94. iatoolkit/views/verify_user_view.py +1 -1
  95. iatoolkit-1.4.2.dist-info/METADATA +268 -0
  96. iatoolkit-1.4.2.dist-info/RECORD +133 -0
  97. iatoolkit-1.4.2.dist-info/licenses/LICENSE_COMMUNITY.md +15 -0
  98. iatoolkit/repositories/tasks_repo.py +0 -52
  99. iatoolkit/services/history_service.py +0 -37
  100. iatoolkit/services/search_service.py +0 -55
  101. iatoolkit/services/tasks_service.py +0 -188
  102. iatoolkit/templates/about.html +0 -13
  103. iatoolkit/templates/index.html +0 -145
  104. iatoolkit/templates/login_simulation.html +0 -45
  105. iatoolkit/views/external_login_view.py +0 -73
  106. iatoolkit/views/index_view.py +0 -14
  107. iatoolkit/views/login_simulation_view.py +0 -93
  108. iatoolkit/views/tasks_api_view.py +0 -72
  109. iatoolkit/views/tasks_review_api_view.py +0 -55
  110. iatoolkit-0.71.4.dist-info/METADATA +0 -276
  111. iatoolkit-0.71.4.dist-info/RECORD +0 -122
  112. {iatoolkit-0.71.4.dist-info → iatoolkit-1.4.2.dist-info}/WHEEL +0 -0
  113. {iatoolkit-0.71.4.dist-info → iatoolkit-1.4.2.dist-info}/licenses/LICENSE +0 -0
  114. {iatoolkit-0.71.4.dist-info → iatoolkit-1.4.2.dist-info}/top_level.txt +0 -0
@@ -172,7 +172,7 @@ li {
172
172
  max-width: 75%;
173
173
  min-width: 250px;
174
174
 
175
- color: var(--brand-danger-text, #842029); /* Color de texto de error de la marca */
175
+ color: var(--brand-danger-text, #000000); /* Color de texto de error de la marca */
176
176
  background-color: var(--brand-danger-bg, #f8d7da); /* Fondo de error de la marca */
177
177
  border: 1px solid var(--brand-danger-border, #f5c2c7); /* Borde de error de la marca */
178
178
  font-style: italic;
@@ -499,5 +499,61 @@ li {
499
499
  cursor: pointer;
500
500
  }
501
501
 
502
-
503
-
502
+ /* Popup de selección de modelo LLM - versión minimalista, sin branding de fondo */
503
+ .llm-model-popup {
504
+ background-color: #f9fafb; /* Fondo claro neutro */
505
+ border-radius: 0.5rem;
506
+ border: 1px solid #e5e7eb; /* Borde gris muy suave */
507
+ color: #111827; /* Texto principal en gris casi negro */
508
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.12); /* Sombra suave y limpia */
509
+ }
510
+
511
+ .llm-model-popup .card-body {
512
+ padding-left: 0.9rem;
513
+ padding-right: 0.9rem;
514
+ }
515
+
516
+ .llm-model-popup .llm-model-subtitle {
517
+ font-size: 0.8rem;
518
+ color: #6b7280; /* Gris medio para el subtítulo */
519
+ }
520
+
521
+ .llm-model-popup .list-group-item {
522
+ border: none;
523
+ padding-top: 0.4rem;
524
+ padding-bottom: 0.4rem;
525
+ background-color: transparent;
526
+ color: inherit;
527
+ border-radius: 0.35rem;
528
+ transition:
529
+ background-color 0.15s ease-in-out,
530
+ transform 0.1s ease-in-out,
531
+ box-shadow 0.15s ease-in-out;
532
+ }
533
+
534
+ /* Descripción del modelo: mismo color que el nombre, pero un poco más suave */
535
+ .llm-model-popup .list-group-item .text-muted {
536
+ color: currentColor !important;
537
+ opacity: 0.75;
538
+ font-size: 0.8rem;
539
+ }
540
+
541
+ /* Hover más visible, pero manteniendo el estilo minimalista */
542
+ .llm-model-popup .list-group-item:hover {
543
+ background-color: #e5e7eb; /* Gris claro para resaltar bien */
544
+ transform: translateX(2px);
545
+ box-shadow: 0 2px 6px rgba(15, 23, 42, 0.12);
546
+ }
547
+
548
+ /* Item activo: resalta con el primario, pero fondo muy claro */
549
+ .llm-model-popup .list-group-item.active {
550
+ background-color: #eef2ff; /* Azul/gris muy claro tipo focus */
551
+ color: var(--brand-primary-color, #4C6A8D);
552
+ border: 1px solid var(--brand-primary-color, #4C6A8D);
553
+ box-shadow: 0 0 0 1px rgba(37, 99, 235, 0.2);
554
+ }
555
+
556
+ .llm-model-popup .list-group-item.active .text-muted {
557
+ color: currentColor !important;
558
+ opacity: 0.85;
559
+ }
@@ -104,4 +104,32 @@
104
104
  margin-bottom: 1.5rem; /* Espacio consistente debajo del título */
105
105
  }
106
106
 
107
+ /* Links de idioma sobre fondo azul */
108
+ .language-link {
109
+ text-decoration: none;
110
+ color: #ffffff; /* texto blanco */
111
+ padding: 1px 4px;
112
+ font-size: 0.85rem;
113
+ font-weight: 500;
114
+ border-radius: 3px;
115
+ transition: background-color 0.2s ease;
116
+ }
117
+
118
+ /* Separador | puede heredar color blanco */
119
+ .language-switcher .mx-1 {
120
+ color: #ffffff;
121
+ }
122
+
123
+ /* Hover: blanco translúcido encima del azul */
124
+ .language-link:hover {
125
+ background-color: rgba(255, 255, 255, 0.25);
126
+ }
127
+
128
+ /* Idioma activo: un poco más marcado */
129
+ .language-link.active {
130
+ background-color: rgba(255, 255, 255, 0.35);
131
+ font-weight: 700;
132
+ color: #ffffff;
133
+ }
134
+
107
135
 
@@ -0,0 +1,598 @@
1
+ /* === Article Page Styles === */
2
+ .article-container {
3
+ max-width: 800px;
4
+ margin: 40px auto;
5
+ padding: 20px;
6
+ font-family: 'Georgia', serif;
7
+ line-height: 1.8;
8
+ color: #333;
9
+ background-color: #fff;
10
+ }
11
+
12
+ .article-header {
13
+ margin-bottom: 40px;
14
+ border-bottom: 1px solid #eee;
15
+ padding-bottom: 20px;
16
+ }
17
+
18
+ .article-title {
19
+ font-family: 'Helvetica Neue', sans-serif;
20
+ font-weight: 700;
21
+ font-size: 2.5rem;
22
+ color: #111;
23
+ line-height: 1.2;
24
+ }
25
+
26
+ .article-subtitle {
27
+ font-size: 1.25rem;
28
+ color: #666;
29
+ font-style: italic;
30
+ margin-top: 15px;
31
+ }
32
+
33
+ .article-date i {
34
+ margin-right: 0.35rem;
35
+ color: #6c757d;
36
+ font-size: 1rem;
37
+ position: relative;
38
+ top: 1px;
39
+ }
40
+
41
+ .article-content h2 {
42
+ font-family: 'Helvetica Neue', sans-serif;
43
+ font-weight: 600;
44
+ font-size: 1.8rem;
45
+ margin-top: 2.5rem;
46
+ margin-bottom: 1rem;
47
+ color: #222;
48
+ }
49
+
50
+ .article-content h3 {
51
+ font-family: 'Helvetica Neue', sans-serif;
52
+ font-weight: 600;
53
+ font-size: 1.4rem;
54
+ margin-top: 2rem;
55
+ margin-bottom: 0.8rem;
56
+ color: #333;
57
+ }
58
+
59
+ .article-content p {
60
+ margin-bottom: 1.5rem;
61
+ font-size: 1.1rem;
62
+ }
63
+
64
+ .article-content ul {
65
+ list-style: none; /* Quitamos los bullets por defecto */
66
+ padding-left: 0;
67
+ margin-bottom: 1.5rem;
68
+ }
69
+
70
+ .article-content li {
71
+ position: relative; /* Necesario para posicionar el bullet personalizado */
72
+ padding-left: 1.75em; /* Espacio a la izquierda para el nuevo bullet */
73
+ margin-bottom: 0.8rem; /* Un poco más de aire entre elementos */
74
+ font-size: 1.1rem;
75
+ }
76
+
77
+ .article-content li::before {
78
+ content: '•'; /* Este es nuestro nuevo bullet */
79
+ position: absolute;
80
+ left: 0;
81
+ top: -0.05em; /* Ajuste fino de la alineación vertical */
82
+
83
+ font-weight: bold;
84
+ font-size: 1.2em; /* Hacemos el bullet un poco más grande */
85
+ }
86
+
87
+
88
+ .article-content pre {
89
+ background-color: #f8f9fa;
90
+ border: 1px solid #e9ecef;
91
+ border-radius: 4px;
92
+ padding: 15px;
93
+ overflow-x: auto;
94
+ margin-bottom: 1.5rem;
95
+ font-size: 0.9em;
96
+ }
97
+
98
+ .article-content blockquote {
99
+ border-left: 4px solid #ddd;
100
+ padding-left: 15px;
101
+ color: #555;
102
+ font-style: italic;
103
+ margin: 1.5em 0;
104
+ }
105
+
106
+ .article-footer {
107
+ margin-top: 4rem;
108
+ padding-top: 2rem;
109
+ border-top: 1px solid #e9ecef;
110
+ }
111
+
112
+ .article-content code {
113
+ color: #343a40; /* Cambia el color del texto a uno oscuro y neutro */
114
+ background-color: #f1f3f5; /* Fondo gris claro para resaltar */
115
+ padding: 0.2em 0.4em;
116
+ margin: 0;
117
+ font-size: 85%;
118
+ border-radius: 3px;
119
+ font-family: 'Courier New', monospace;
120
+ }
121
+
122
+ /* Stair-style timeline */
123
+ .iat-stair-timeline {
124
+ position: relative;
125
+ margin: 2rem 0 1.5rem;
126
+ min-height: 10rem;
127
+ }
128
+
129
+ .iat-stair-step {
130
+ position: relative;
131
+ max-width: 260px;
132
+ background-color: #f8f9fa;
133
+ border-radius: 10px;
134
+ padding: 0.75rem 1rem;
135
+ box-shadow: 0 2px 8px rgba(0,0,0,0.06);
136
+ }
137
+
138
+ .iat-stair-header {
139
+ display: flex;
140
+ justify-content: flex-start;
141
+ margin-bottom: 0.35rem;
142
+ }
143
+
144
+ .iat-stair-phase-badge {
145
+ display: inline-block;
146
+ background-color: #4A55A2; /* IAToolkit color */
147
+ color: #ffffff;
148
+ font-size: 0.8rem;
149
+ font-weight: 600;
150
+ border-radius: 999px;
151
+ padding: 0.1rem 0.7rem;
152
+ }
153
+
154
+ .iat-stair-title {
155
+ font-size: 0.9rem;
156
+ margin: 0;
157
+ color: #343a40;
158
+ }
159
+
160
+ /* Posiciones escalonadas: hacia la derecha y hacia abajo */
161
+ .iat-stair-step.step-1 {
162
+ left: 0%;
163
+ top: 0;
164
+ }
165
+
166
+ .iat-stair-step.step-2 {
167
+ left: 24%;
168
+ top: 1.2rem;
169
+ }
170
+
171
+ .iat-stair-step.step-3 {
172
+ left: 48%;
173
+ top: 2.4rem;
174
+ }
175
+
176
+ .iat-stair-step.step-4 {
177
+ left: 72%;
178
+ top: 3.6rem;
179
+ }
180
+
181
+ /* Ajuste responsive: en pantallas pequeñas, apilar vertical */
182
+ @media (max-width: 768px) {
183
+ .iat-stair-timeline {
184
+ min-height: auto;
185
+ }
186
+
187
+ .iat-stair-step {
188
+ position: static;
189
+ margin-bottom: 0.75rem;
190
+ max-width: 100%;
191
+ }
192
+ }
193
+
194
+ /* Intelligence bar */
195
+ .iat-intelligence-bar {
196
+ margin: 1.5rem 0 2.5rem;
197
+ }
198
+
199
+ .iat-intelligence-labels {
200
+ display: flex;
201
+ justify-content: space-between;
202
+ font-size: 0.9rem;
203
+ color: #495057;
204
+ margin-bottom: 0.35rem;
205
+ }
206
+
207
+ .iat-intelligence-end {
208
+ font-weight: 500;
209
+ }
210
+
211
+ .iat-intelligence-track {
212
+ position: relative;
213
+ height: 6px;
214
+ border-radius: 999px;
215
+ background: #e2e5f5;
216
+ overflow: hidden;
217
+ margin-bottom: 0.4rem;
218
+ }
219
+
220
+ .iat-intelligence-fill {
221
+ width: 100%;
222
+ height: 100%;
223
+ background: linear-gradient(to right, #cfd3ff, #4A55A2);
224
+ }
225
+
226
+ .iat-intelligence-marks {
227
+ display: flex;
228
+ justify-content: space-between;
229
+ font-size: 0.75rem;
230
+ color: #6c757d;
231
+ }
232
+
233
+
234
+ /* -------- IAToolkit Core Diagram -------- */
235
+
236
+ .iat-core-diagram {
237
+ max-width: 420px;
238
+ margin: 2rem auto;
239
+ padding: 1.5rem 1.75rem;
240
+ border-radius: 18px;
241
+ background: #ffffff;
242
+ box-shadow: 0 4px 18px rgba(0,0,0,0.06);
243
+ font-family: inherit;
244
+ color: #1f2933;
245
+ font-size: 0.9rem;
246
+ }
247
+
248
+ /* Generic box inside Core diagram */
249
+ .iat-core-diagram .core-box {
250
+ border-radius: 10px;
251
+ border: 1px solid rgba(0,0,0,0.08);
252
+ padding: 0.75rem 1rem;
253
+ text-align: center;
254
+ background: #ffffff;
255
+ }
256
+
257
+ /* Titles & subtitles */
258
+ .iat-core-diagram .core-title {
259
+ font-weight: 600;
260
+ margin-bottom: 0.15rem;
261
+ }
262
+
263
+ .iat-core-diagram .core-sub {
264
+ font-size: 0.8rem;
265
+ color: #6c757d;
266
+ }
267
+
268
+ /* Main Core Box */
269
+ .iat-core-diagram .core-main {
270
+ background: #f7f8ff;
271
+ border-color: #d8ddff;
272
+ }
273
+
274
+ .iat-core-diagram .core-main-title {
275
+ font-weight: 700;
276
+ margin-bottom: 0.5rem;
277
+ color: #25316D;
278
+ font-size: 0.95rem;
279
+ }
280
+
281
+ .iat-core-diagram .core-main-layers {
282
+ border-radius: 8px;
283
+ border: 1px solid rgba(0,0,0,0.06);
284
+ overflow: hidden;
285
+ font-size: 0.8rem;
286
+ }
287
+
288
+ .iat-core-diagram .core-layer {
289
+ padding: 0.35rem 0.5rem;
290
+ background: #ffffff;
291
+ }
292
+
293
+ .iat-core-diagram .core-layer + .core-layer {
294
+ border-top: 1px solid rgba(0,0,0,0.05);
295
+ }
296
+
297
+ /* Companies row */
298
+ .iat-core-diagram .core-companies-row {
299
+ display: flex;
300
+ gap: 0.75rem;
301
+ margin-top: 0.75rem;
302
+ margin-bottom: 0.25rem;
303
+ }
304
+
305
+ /* Data box spacing */
306
+ .iat-core-diagram .core-data {
307
+ margin-top: 0.5rem;
308
+ }
309
+
310
+ /* Vertical arrow */
311
+ .iat-core-diagram .core-arrow {
312
+ width: 100%;
313
+ height: 18px;
314
+ position: relative;
315
+ margin: 0.4rem 0;
316
+ }
317
+
318
+ .iat-core-diagram .core-arrow::before {
319
+ content: "";
320
+ position: absolute;
321
+ top: 0;
322
+ left: 50%;
323
+ height: 12px;
324
+ border-left: 1px solid #9ca3af;
325
+ transform: translateX(-50%);
326
+ }
327
+
328
+ .iat-core-diagram .core-arrow::after {
329
+ content: "";
330
+ position: absolute;
331
+ bottom: 0;
332
+ left: 50%;
333
+ border-width: 5px 4px 0 4px;
334
+ border-style: solid;
335
+ border-color: #9ca3af transparent transparent transparent;
336
+ transform: translateX(-50%);
337
+ }
338
+
339
+ /* Split arrow to both companies */
340
+ .iat-core-diagram .core-arrow-split {
341
+ position: relative;
342
+ height: 32px;
343
+ margin-top: 0.4rem;
344
+ }
345
+
346
+ .iat-core-diagram .core-arrow-split .split-line {
347
+ position: absolute;
348
+ top: 0;
349
+ left: 50%;
350
+ height: 16px;
351
+ border-left: 1px solid #9ca3af;
352
+ transform: translateX(-50%);
353
+ }
354
+
355
+ .iat-core-diagram .core-arrow-split .split-arrow-left,
356
+ .iat-core-diagram .core-arrow-split .split-arrow-right {
357
+ position: absolute;
358
+ top: 18px;
359
+ width: 50%;
360
+ height: 12px;
361
+ }
362
+
363
+ /* Línea horizontal */
364
+ .iat-core-diagram .core-arrow-split .split-arrow-left::before,
365
+ .iat-core-diagram .core-arrow-split .split-arrow-right::before {
366
+ content: "";
367
+ position: absolute;
368
+ top: 7px;
369
+ width: 100%;
370
+ border-top: 1px solid #9ca3af;
371
+ }
372
+
373
+ /* Puntita de la flecha */
374
+ .iat-core-diagram .core-arrow-split .split-arrow-left::after,
375
+ .iat-core-diagram .core-arrow-split .split-arrow-right::after {
376
+ content: "";
377
+ position: absolute;
378
+ top: -1px;
379
+ border-width: 5px 4px 0 4px;
380
+ border-style: solid;
381
+ border-color: #9ca3af transparent transparent transparent;
382
+ }
383
+
384
+ .iat-core-diagram .core-arrow-split .split-arrow-left {
385
+ left: 0;
386
+ }
387
+
388
+ .iat-core-diagram .core-arrow-split .split-arrow-left::after {
389
+ left: calc(100% - 4px);
390
+ }
391
+
392
+ .iat-core-diagram .core-arrow-split .split-arrow-right {
393
+ right: 0;
394
+ }
395
+
396
+ .iat-core-diagram .core-arrow-split .split-arrow-right::after {
397
+ right: calc(100% - 4px);
398
+ }
399
+
400
+ /* Dispatcher Diagram container */
401
+ .dispatcher-diagram {
402
+ max-width: 420px;
403
+ margin: 2rem auto;
404
+ padding: 1.5rem 1.75rem;
405
+ border-radius: 18px;
406
+ background: #f8fafc;
407
+ box-shadow: 0 4px 18px rgba(0,0,0,0.06);
408
+ font-family: inherit;
409
+ color: #1f2933;
410
+ font-size: 0.9rem;
411
+ position: relative;
412
+ text-align: center;
413
+ }
414
+
415
+ /* Generic box */
416
+ .disp-box {
417
+ border-radius: 14px;
418
+ border: 1px solid rgba(0,0,0,0.06);
419
+ background: #ffffff;
420
+ padding: 0.75rem 1.2rem;
421
+ display: inline-flex;
422
+ align-items: center;
423
+ justify-content: center;
424
+ gap: 0.5rem;
425
+ }
426
+
427
+ /* Dispatcher main box */
428
+ .disp-main {
429
+ background: #4A55A2;
430
+ border-color: #4A55A2;
431
+ color: #ffffff;
432
+ margin: 0 auto;
433
+ min-width: 240px;
434
+ padding: 1rem 1.25rem; /* ← antes era 0.75rem */
435
+ padding-top: 1.2rem; /* más aire vertical */
436
+ padding-bottom: 1.2rem;
437
+ border-radius: 16px; /* más suave */
438
+ gap: 0.75rem; /* separa mejor ícono-texto */
439
+ }
440
+
441
+ .disp-main-text {
442
+ font-weight: 700;
443
+ font-size: 1.15rem;
444
+ letter-spacing: 0.3px;
445
+ font-family: "Segoe UI", Inter, system-ui, sans-serif;
446
+ }
447
+
448
+ .disp-icon {
449
+ font-size: 1.6rem;
450
+ line-height: 1;
451
+ margin-right: 0.2rem;
452
+ }
453
+
454
+ /* Document icon */
455
+ .disp-doc-icon {
456
+ font-size: 1.1rem;
457
+ color: #4A55A2;
458
+ margin-right: 0.35rem;
459
+ }
460
+
461
+ /* Vertical arrows */
462
+ .disp-arrow-vertical {
463
+ width: 100%;
464
+ height: 24px;
465
+ position: relative;
466
+ margin: 0.4rem 0 0.2rem;
467
+ }
468
+
469
+ .disp-arrow-vertical::before {
470
+ content: "";
471
+ position: absolute;
472
+ top: 0;
473
+ left: 50%;
474
+ height: 16px;
475
+ border-left: 1px solid #9ca3af;
476
+ transform: translateX(-50%);
477
+ }
478
+
479
+ .disp-arrow-vertical::after {
480
+ content: "";
481
+ position: absolute;
482
+ bottom: 0;
483
+ left: 50%;
484
+ border-width: 5px 4px 0 4px;
485
+ border-style: solid;
486
+ border-color: #9ca3af transparent transparent transparent;
487
+ transform: translateX(-50%);
488
+ }
489
+
490
+ .disp-arrow-small {
491
+ height: 20px;
492
+ margin-top: 0.2rem;
493
+ }
494
+
495
+ /* Branch row from Dispatcher to both columns */
496
+ .disp-branch-row {
497
+ position: relative;
498
+ height: 20px;
499
+ margin-bottom: 0.3rem;
500
+ }
501
+
502
+ .disp-branch-line {
503
+ position: absolute;
504
+ top: 10px;
505
+ left: 18%;
506
+ right: 18%;
507
+ border-top: 1px solid #9ca3af;
508
+ }
509
+
510
+ .disp-branch-node {
511
+ position: absolute;
512
+ top: 10px;
513
+ width: 0;
514
+ height: 10px;
515
+ border-left: 1px solid #9ca3af;
516
+ }
517
+
518
+ .disp-branch-node.left {
519
+ left: 30%;
520
+ }
521
+
522
+ .disp-branch-node.right {
523
+ right: 30%;
524
+ }
525
+
526
+ /* Columns: company + resource */
527
+ .disp-companies-row {
528
+ display: flex;
529
+ justify-content: space-between;
530
+ gap: 0.9rem;
531
+ margin-top: 0.2rem;
532
+ }
533
+
534
+ .disp-column {
535
+ flex: 1;
536
+ }
537
+
538
+ /* Company boxes */
539
+ .disp-company {
540
+ background: #f3f4f6;
541
+ border-radius: 14px;
542
+ border-color: rgba(0,0,0,0.04);
543
+ flex-direction: column;
544
+ padding: 0.75rem 0.9rem;
545
+ }
546
+
547
+ /* “Building” icon */
548
+ .disp-company-icon {
549
+ width: 26px;
550
+ height: 18px;
551
+ border-radius: 2px;
552
+ border: 2px solid #4b5563;
553
+ border-bottom-width: 4px;
554
+ margin: 0 auto 0.25rem;
555
+ position: relative;
556
+ }
557
+
558
+ .disp-company-icon::before,
559
+ .disp-company-icon::after {
560
+ content: "";
561
+ position: absolute;
562
+ bottom: -4px;
563
+ width: 6px;
564
+ height: 4px;
565
+ background: #4b5563;
566
+ }
567
+
568
+ .disp-company-icon::before {
569
+ left: 3px;
570
+ }
571
+
572
+ .disp-company-icon::after {
573
+ right: 3px;
574
+ }
575
+
576
+ .disp-company-text {
577
+ font-size: 0.9rem;
578
+ font-weight: 500;
579
+ }
580
+
581
+ /* Resource boxes */
582
+ .disp-resource {
583
+ margin-top: 0.1rem;
584
+ justify-content: flex-start;
585
+ }
586
+
587
+ .disp-resource-text {
588
+ font-size: 0.85rem;
589
+ font-weight: 500;
590
+ }
591
+
592
+ /* Responsive tweak */
593
+ @media (max-width: 480px) {
594
+ .dispatcher-diagram {
595
+ padding: 1.3rem 1.1rem;
596
+ font-size: 0.85rem;
597
+ }
598
+ }