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,135 @@
1
+ /* Estos estilos son para las paginas publicas: home, signup, olvide la clave, etc */
2
+
3
+ /* --- Encabezado (top) de company --- */
4
+ .custom-company-header {
5
+ height: 78px;
6
+ margin-bottom: 20px;
7
+ padding: 0 1.5rem; /* Padding interno para que el texto no toque los bordes */
8
+ border-radius: 0.375rem; /* Bordes redondeados para que coincida con los formularios */
9
+
10
+ /* Los estilos de color y sombra se mantienen */
11
+ background-color: var(--brand-header-bg);
12
+ color: var(--brand-header-text);
13
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); /* Sombra ligeramente más suave */
14
+ }
15
+
16
+ /* Estilo específico para el nombre de la marca en el encabezado (Letra más grande) */
17
+ .custom-company-header .brand-name {
18
+ font-size: 1.8rem; /* Tamaño de fuente aumentado */
19
+ font-weight: 600;
20
+ color: inherit;
21
+ text-decoration: none;
22
+ transition: opacity 0.2s ease-in-out;
23
+ }
24
+
25
+ /* Efecto hover para el enlace del nombre de la marca */
26
+ .custom-company-header .brand-name:hover {
27
+ opacity: 0.85;
28
+ }
29
+
30
+ /* Estilo para el texto "Powered by" --- */
31
+ .custom-company-header .powered-by {
32
+ font-size: 0.9rem;
33
+ font-weight: 400;
34
+ opacity: 0.75; /* Menos prominente que el nombre de la marca */
35
+ color: inherit;
36
+ }
37
+
38
+ /* --- Estilo para el enlace de IAToolkit --- */
39
+ .custom-company-header .iatoolkit-link {
40
+ color: inherit; /* Hereda el color del texto padre */
41
+ text-decoration: none; /* ¡Elimina el subrayado! */
42
+ font-weight: 600; /* Un poco más de peso para diferenciarlo */
43
+ transition: opacity 0.2s ease-in-out;
44
+ }
45
+
46
+ .custom-company-header .form-container {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 1rem;
50
+ }
51
+
52
+ /* titulo en home */
53
+ .home-title {
54
+ font-size: 3.2rem;
55
+ font-weight: 800;
56
+ line-height: 1.2;
57
+ color: var(--brand-primary-color);
58
+ }
59
+ .list-example {
60
+ display: block; /* Coloca el ejemplo en su propia línea */
61
+ font-size: 0.9rem; /* Lo hace ligeramente más pequeño */
62
+ color: #6c757d; /* Color gris (muted) para texto secundario */
63
+ font-style: italic; /* Cursiva para diferenciarlo */
64
+ padding-left: 1.75rem; /* Lo indenta para alinearlo con el texto del tema */
65
+ margin-top: 0.25rem; /* Pequeño espacio superior */
66
+ }
67
+
68
+ .text-brand-primary {
69
+ font-weight: 800;
70
+ color: var(--brand-primary-color);
71
+ }
72
+
73
+ /* contenedor de formularios: login, signup, forgot password, etc. */
74
+ .branded-form-container {
75
+ background-color: #ffffff;
76
+ border: 1px solid #dee2e6;
77
+ border-top: 4px solid #adb5bd;
78
+ border-radius: 0.375rem;
79
+ padding: 2rem;
80
+ box-shadow: 0 4px 12px rgba(0,0,0,0.08);
81
+ }
82
+
83
+ .branded-form-label {
84
+ font-size: 0.85rem;
85
+ font-weight: 600;
86
+ color: #495057; /* Un gris oscuro profesional */
87
+ text-transform: uppercase;
88
+ letter-spacing: 0.05em; /* Un poco de espacio extra entre letras */
89
+ margin-bottom: 0.3rem;
90
+ display: block;
91
+ }
92
+
93
+ /* Efecto de foco brandeado para todos los form-control */
94
+ .form-control:focus {
95
+ border-color: var(--brand-primary-color);
96
+ box-shadow: 0 0 0 0.25rem rgba(var(--brand-primary-color-rgb), 0.25); /* Usa la variable RGB para el shadow */
97
+ }
98
+
99
+ .branded-form-title {
100
+ color: var(--brand-primary-color);
101
+ font-size: 1.75rem; /* Un tamaño más prominente */
102
+ font-weight: 700; /* Equivalente a fw-bold de Bootstrap */
103
+ text-align: center;
104
+ margin-bottom: 1.5rem; /* Espacio consistente debajo del título */
105
+ }
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
+
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
+ }