iatoolkit 0.4.2__py3-none-any.whl → 0.66.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 (123) hide show
  1. iatoolkit/__init__.py +13 -35
  2. iatoolkit/base_company.py +74 -8
  3. iatoolkit/cli_commands.py +15 -23
  4. iatoolkit/common/__init__.py +0 -0
  5. iatoolkit/common/exceptions.py +46 -0
  6. iatoolkit/common/routes.py +141 -0
  7. iatoolkit/common/session_manager.py +24 -0
  8. iatoolkit/common/util.py +348 -0
  9. iatoolkit/company_registry.py +7 -8
  10. iatoolkit/iatoolkit.py +169 -96
  11. iatoolkit/infra/__init__.py +5 -0
  12. iatoolkit/infra/call_service.py +140 -0
  13. iatoolkit/infra/connectors/__init__.py +5 -0
  14. iatoolkit/infra/connectors/file_connector.py +17 -0
  15. iatoolkit/infra/connectors/file_connector_factory.py +57 -0
  16. iatoolkit/infra/connectors/google_cloud_storage_connector.py +53 -0
  17. iatoolkit/infra/connectors/google_drive_connector.py +68 -0
  18. iatoolkit/infra/connectors/local_file_connector.py +46 -0
  19. iatoolkit/infra/connectors/s3_connector.py +33 -0
  20. iatoolkit/infra/gemini_adapter.py +356 -0
  21. iatoolkit/infra/google_chat_app.py +57 -0
  22. iatoolkit/infra/llm_client.py +429 -0
  23. iatoolkit/infra/llm_proxy.py +139 -0
  24. iatoolkit/infra/llm_response.py +40 -0
  25. iatoolkit/infra/mail_app.py +145 -0
  26. iatoolkit/infra/openai_adapter.py +90 -0
  27. iatoolkit/infra/redis_session_manager.py +122 -0
  28. iatoolkit/locales/en.yaml +144 -0
  29. iatoolkit/locales/es.yaml +140 -0
  30. iatoolkit/repositories/__init__.py +5 -0
  31. iatoolkit/repositories/database_manager.py +110 -0
  32. iatoolkit/repositories/document_repo.py +33 -0
  33. iatoolkit/repositories/llm_query_repo.py +91 -0
  34. iatoolkit/repositories/models.py +336 -0
  35. iatoolkit/repositories/profile_repo.py +123 -0
  36. iatoolkit/repositories/tasks_repo.py +52 -0
  37. iatoolkit/repositories/vs_repo.py +139 -0
  38. iatoolkit/services/__init__.py +5 -0
  39. iatoolkit/services/auth_service.py +193 -0
  40. {services → iatoolkit/services}/benchmark_service.py +6 -6
  41. iatoolkit/services/branding_service.py +149 -0
  42. {services → iatoolkit/services}/dispatcher_service.py +39 -99
  43. {services → iatoolkit/services}/document_service.py +5 -5
  44. {services → iatoolkit/services}/excel_service.py +27 -21
  45. {services → iatoolkit/services}/file_processor_service.py +5 -5
  46. iatoolkit/services/help_content_service.py +30 -0
  47. {services → iatoolkit/services}/history_service.py +8 -16
  48. iatoolkit/services/i18n_service.py +104 -0
  49. {services → iatoolkit/services}/jwt_service.py +18 -27
  50. iatoolkit/services/language_service.py +77 -0
  51. {services → iatoolkit/services}/load_documents_service.py +19 -14
  52. {services → iatoolkit/services}/mail_service.py +5 -5
  53. iatoolkit/services/onboarding_service.py +43 -0
  54. {services → iatoolkit/services}/profile_service.py +155 -89
  55. {services → iatoolkit/services}/prompt_manager_service.py +26 -11
  56. {services → iatoolkit/services}/query_service.py +142 -104
  57. {services → iatoolkit/services}/search_service.py +21 -5
  58. {services → iatoolkit/services}/sql_service.py +24 -6
  59. {services → iatoolkit/services}/tasks_service.py +10 -10
  60. iatoolkit/services/user_feedback_service.py +103 -0
  61. iatoolkit/services/user_session_context_service.py +143 -0
  62. iatoolkit/static/images/fernando.jpeg +0 -0
  63. iatoolkit/static/js/chat_feedback_button.js +80 -0
  64. iatoolkit/static/js/chat_filepond.js +85 -0
  65. iatoolkit/static/js/chat_help_content.js +124 -0
  66. iatoolkit/static/js/chat_history_button.js +112 -0
  67. iatoolkit/static/js/chat_logout_button.js +36 -0
  68. iatoolkit/static/js/chat_main.js +364 -0
  69. iatoolkit/static/js/chat_onboarding_button.js +97 -0
  70. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  71. iatoolkit/static/js/chat_reload_button.js +35 -0
  72. iatoolkit/static/styles/chat_iatoolkit.css +592 -0
  73. iatoolkit/static/styles/chat_modal.css +169 -0
  74. iatoolkit/static/styles/chat_public.css +107 -0
  75. iatoolkit/static/styles/landing_page.css +182 -0
  76. iatoolkit/static/styles/llm_output.css +115 -0
  77. iatoolkit/static/styles/onboarding.css +169 -0
  78. iatoolkit/system_prompts/query_main.prompt +5 -15
  79. iatoolkit/templates/_company_header.html +20 -0
  80. iatoolkit/templates/_login_widget.html +42 -0
  81. iatoolkit/templates/about.html +13 -0
  82. iatoolkit/templates/base.html +65 -0
  83. iatoolkit/templates/change_password.html +66 -0
  84. iatoolkit/templates/chat.html +287 -0
  85. iatoolkit/templates/chat_modals.html +181 -0
  86. iatoolkit/templates/error.html +51 -0
  87. iatoolkit/templates/forgot_password.html +50 -0
  88. iatoolkit/templates/index.html +145 -0
  89. iatoolkit/templates/login_simulation.html +34 -0
  90. iatoolkit/templates/onboarding_shell.html +104 -0
  91. iatoolkit/templates/signup.html +76 -0
  92. iatoolkit/views/__init__.py +5 -0
  93. iatoolkit/views/base_login_view.py +92 -0
  94. iatoolkit/views/change_password_view.py +117 -0
  95. iatoolkit/views/external_login_view.py +73 -0
  96. iatoolkit/views/file_store_api_view.py +65 -0
  97. iatoolkit/views/forgot_password_view.py +72 -0
  98. iatoolkit/views/help_content_api_view.py +54 -0
  99. iatoolkit/views/history_api_view.py +56 -0
  100. iatoolkit/views/home_view.py +61 -0
  101. iatoolkit/views/index_view.py +14 -0
  102. iatoolkit/views/init_context_api_view.py +73 -0
  103. iatoolkit/views/llmquery_api_view.py +57 -0
  104. iatoolkit/views/login_simulation_view.py +81 -0
  105. iatoolkit/views/login_view.py +153 -0
  106. iatoolkit/views/logout_api_view.py +49 -0
  107. iatoolkit/views/profile_api_view.py +46 -0
  108. iatoolkit/views/prompt_api_view.py +37 -0
  109. iatoolkit/views/signup_view.py +94 -0
  110. iatoolkit/views/tasks_api_view.py +72 -0
  111. iatoolkit/views/tasks_review_api_view.py +55 -0
  112. iatoolkit/views/user_feedback_api_view.py +60 -0
  113. iatoolkit/views/verify_user_view.py +62 -0
  114. {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/METADATA +2 -2
  115. iatoolkit-0.66.2.dist-info/RECORD +119 -0
  116. {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/top_level.txt +0 -1
  117. iatoolkit/system_prompts/arquitectura.prompt +0 -32
  118. iatoolkit-0.4.2.dist-info/RECORD +0 -32
  119. services/__init__.py +0 -5
  120. services/api_service.py +0 -75
  121. services/user_feedback_service.py +0 -67
  122. services/user_session_context_service.py +0 -85
  123. {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/WHEEL +0 -0
@@ -0,0 +1,592 @@
1
+ /* Customización de variables de Bootstrap */
2
+ :root {
3
+ --bs-tooltip-bg: #495057; /* Gris carbón, más claro y profesional */
4
+ --bs-tooltip-opacity: 0.95; /* Ligeramente más opaco para mejor legibilidad */
5
+ }
6
+
7
+ h1, h2, h3, h4, h5, h6 {
8
+ font-family: var(--font-family-sans);
9
+ font-weight: var(--weight-semibold);
10
+ line-height: var(--lh-title);
11
+ margin: 0 0 0.6em;
12
+ /* Se define un color base usando la nueva variable de branding */
13
+ color: var(--brand-text-heading-color);
14
+ }
15
+
16
+ ul {
17
+ padding-left: 1.5rem; /* ~24px de indentación para la lista */
18
+ margin-bottom: 1rem; /* Espacio después de que termina la lista */
19
+ }
20
+
21
+ li {
22
+ margin-bottom: 0.5rem;
23
+ padding-left: 0.25rem; /* Pequeño espacio extra entre la viñeta y el texto */
24
+ }
25
+
26
+ /* Estilo para la viñeta (el punto) de cada elemento de la lista */
27
+ li::marker {
28
+ color: var(--brand-primary-color); /* La viñeta usa el color principal de la marca */
29
+ font-size: 1.1em; /* Ligeramente más grande para que sea más visible */
30
+ }
31
+
32
+ .text-muted {
33
+ color: #64748b;
34
+ }
35
+
36
+ .chat-layout-container {
37
+ display: flex;
38
+ flex-direction: column;
39
+ height: 100dvh;
40
+ overflow: hidden;
41
+ padding-top: 1rem;
42
+ padding-bottom: 0.2rem;
43
+ }
44
+
45
+ /* Esta parte para el prompt-assistant sigue siendo correcta */
46
+ main.chat-layout-container.prompt-assistant-open {
47
+ height: auto;
48
+ overflow: visible;
49
+ }
50
+
51
+
52
+ /* CSS para el chat principal */
53
+ /* esta clase defines los atributos de cada bloque */
54
+ .chat-block {
55
+ padding: 1rem;
56
+ border: 1px solid #dee2e6;
57
+ border-radius: 0.375rem; /* Borde redondeado estándar de Bootstrap */
58
+ box-shadow: 0 2px 8px rgba(0,0,0,0.06); /* Sombra suave y unificada */
59
+ }
60
+
61
+ /* sección del encabezado en el chat principal */
62
+ .company-section {
63
+ border-radius: 0.375rem; /* Mismo radio que .chat-block para consistencia */
64
+ background-color: var(--brand-header-bg);
65
+ color: var(--brand-header-text);
66
+ }
67
+
68
+ /* Estilos para el contenedor del chat y mensajes para que exista scroll */
69
+ #chat-container {
70
+ flex-grow: 1;
71
+ overflow-y: auto;
72
+ display: flex;
73
+ flex-direction: column;
74
+ background-color: #fff; /* Fondo blanco para el contenedor del chat */
75
+ }
76
+
77
+ /* La caja principal que envuelve toda el área de entrada */
78
+ .input-area {
79
+ background-color: var(--brand-prompt-assistant-bg, #f8f9fa);
80
+ }
81
+
82
+ /* La barra "cápsula" que envuelve el texto y los iconos */
83
+ .chat-input-bar {
84
+ background-color: #ffffff;
85
+ border: 1px solid #dee2e6;
86
+ border-radius: 1rem;
87
+ padding: 0.1rem 0.5rem;
88
+ transition: all 0.2s ease-in-out;
89
+ }
90
+
91
+ /* Efecto de foco para toda la barra */
92
+ .chat-input-bar:focus-within {
93
+ border-color: #86b7fe;
94
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
95
+ }
96
+
97
+ #question {
98
+ width: 100%;
99
+ font-size: 15px;
100
+ background: #f8f9fa;
101
+ color: #202123;
102
+ border: 1px solid #d1d5db;
103
+ transition: all 0.3s ease-in-out;
104
+ }
105
+
106
+ #question:focus {
107
+ outline: none;
108
+ border-color: #80bdff;
109
+ box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);
110
+ }
111
+
112
+ .answer-section, .error-section {
113
+ max-width: 100%;
114
+ word-wrap: break-word;
115
+ margin-bottom: 10px;
116
+ }
117
+
118
+ /* Estilo del mensaje ingresado por el usuario */
119
+ #chat-container .message {
120
+ max-width: 75%;
121
+ min-width: fit-content;
122
+ width: fit-content;
123
+ border-radius: 12px 12px 0px 12px;
124
+ word-wrap: break-word;
125
+ display: inline-flex;
126
+ align-items: center;
127
+ align-self: flex-end;
128
+ text-align: left;
129
+ padding-left: 0.5em;
130
+ color: #202123;
131
+ font-family: Arial, sans-serif;
132
+ font-size: 15px;
133
+ line-height: 1.6;
134
+ background-color: #f7f7f8;
135
+ }
136
+
137
+ .answer-section {
138
+ align-self: flex-start;
139
+ max-width: 75%;
140
+ padding: 10px 15px;
141
+ font-family: "Inter", Arial, sans-serif;
142
+ font-size: 15px;
143
+ line-height: 1.6;
144
+ word-wrap: break-word;
145
+ }
146
+
147
+ .error-section {
148
+ align-self: flex-start;
149
+ max-width: 75%;
150
+ min-width: 250px;
151
+
152
+ color: var(--brand-danger-text, #842029); /* Color de texto de error de la marca */
153
+ background-color: var(--brand-danger-bg, #f8d7da); /* Fondo de error de la marca */
154
+ border: 1px solid var(--brand-danger-border, #f5c2c7); /* Borde de error de la marca */
155
+ font-style: italic;
156
+ font-size: 0.9rem;
157
+ display: flex;
158
+ align-items: center;
159
+ justify-content: start;
160
+ margin: 10px 0;
161
+ padding: 10px 15px; /* Un poco más de padding lateral */
162
+ opacity: 0.9;
163
+ border-radius: 8px; /* Bordes redondeados */
164
+ word-wrap: break-word; /* Asegura que el texto no se desborde */
165
+ }
166
+
167
+ .error-section i {
168
+ color: var(--brand-danger-color, #dc3545); /* Color del icono, el rojo principal */
169
+ font-size: 1.2rem; /* Tamaño del icono */
170
+ margin-right: 10px; /* Espacio entre el icono y el texto */
171
+ flex-shrink: 0; /* Evita que el icono se encoja */
172
+ }
173
+
174
+ /* Estilo para mensajes sutiles del sistema (ej. abortado) */
175
+ .system-message {
176
+ color: var(--brand-secondary-color, #6c757d); /* Usa el color secundario o un gris por defecto */
177
+ font-style: italic;
178
+ font-size: 0.9rem;
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: start;
182
+ margin: 10px 0;
183
+ padding: 10px;
184
+ opacity: 0.8;
185
+ }
186
+
187
+
188
+ /* Spinner */
189
+ .spinning {
190
+ animation: spin 1s linear infinite;
191
+ font-size: 15px; /* Tamaño del ícono */
192
+ display: inline-block;
193
+ }
194
+ #spinner .spinner-border {
195
+ color: var(--brand-primary-color);
196
+ }
197
+
198
+
199
+ @keyframes spin {
200
+ 0% { transform: rotate(0deg); }
201
+ 100% { transform: rotate(360deg); }
202
+ }
203
+
204
+
205
+ /* Estilos para el modal de archivos y ordenar icono */
206
+ .list-group-item {
207
+ display: flex;
208
+ justify-content: space-between;
209
+ align-items: center;
210
+
211
+ border: none;
212
+ /* separador sutil solo en la parte inferior */
213
+ border-bottom: 1px solid #e9ecef; /* Un gris muy claro estándar */
214
+ padding: 0.5rem 0.75rem;
215
+
216
+ /* animación suave para el cambio de fondo */
217
+ transition: background-color 0.2s ease-in-out;
218
+ }
219
+
220
+ /* Al pasar el ratón, cambiamos el fondo para dar feedback */
221
+ .list-group-item:hover {
222
+ background-color: #f8f9fa; /* Un gris de fondo muy sutil */
223
+ }
224
+
225
+ /* Eliminamos el borde del último elemento para un acabado limpio */
226
+ .list-group-item:last-child {
227
+ border-bottom: none;
228
+ }
229
+
230
+ .file-name-modal {
231
+ flex: 1;
232
+ margin-right: 10px;
233
+ }
234
+ .remove-file-btn {
235
+ flex-shrink: 0;
236
+ }
237
+
238
+
239
+
240
+ /* Estos estilos son para las paginas publicas: home, signup, olvide la clave, etc */
241
+
242
+ /* --- Encabezado (top) de company --- */
243
+ .custom-company-header {
244
+ height: 78px;
245
+ margin-bottom: 20px;
246
+ padding: 0 1.5rem; /* Padding interno para que el texto no toque los bordes */
247
+ border-radius: 0.375rem; /* Bordes redondeados para que coincida con los formularios */
248
+
249
+ /* Los estilos de color y sombra se mantienen */
250
+ background-color: var(--brand-header-bg);
251
+ color: var(--brand-header-text);
252
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); /* Sombra ligeramente más suave */
253
+ }
254
+
255
+ /* Estilo específico para el nombre de la marca en el encabezado (Letra más grande) */
256
+ .custom-company-header .brand-name {
257
+ font-size: 1.8rem; /* Tamaño de fuente aumentado */
258
+ font-weight: 600;
259
+ color: inherit;
260
+ text-decoration: none;
261
+ transition: opacity 0.2s ease-in-out;
262
+ }
263
+
264
+ /* Efecto hover para el enlace del nombre de la marca */
265
+ .custom-company-header .brand-name:hover {
266
+ opacity: 0.85;
267
+ }
268
+
269
+ /* Estilo para el texto "Powered by" --- */
270
+ .custom-company-header .powered-by {
271
+ font-size: 0.9rem;
272
+ font-weight: 400;
273
+ opacity: 0.75; /* Menos prominente que el nombre de la marca */
274
+ color: inherit;
275
+ }
276
+
277
+ /* --- Estilo para el enlace de IAToolkit --- */
278
+ .custom-company-header .iatoolkit-link {
279
+ color: inherit; /* Hereda el color del texto padre */
280
+ text-decoration: none; /* ¡Elimina el subrayado! */
281
+ font-weight: 600; /* Un poco más de peso para diferenciarlo */
282
+ transition: opacity 0.2s ease-in-out;
283
+ }
284
+
285
+ .custom-company-header .form-container {
286
+ display: flex;
287
+ flex-direction: column;
288
+ gap: 1rem;
289
+ }
290
+
291
+ /* titulo en home */
292
+ .home-title {
293
+ font-size: 3.2rem;
294
+ font-weight: 800;
295
+ line-height: 1.2;
296
+ color: var(--brand-primary-color);
297
+ }
298
+ .list-example {
299
+ display: block; /* Coloca el ejemplo en su propia línea */
300
+ font-size: 0.9rem; /* Lo hace ligeramente más pequeño */
301
+ color: #6c757d; /* Color gris (muted) para texto secundario */
302
+ font-style: italic; /* Cursiva para diferenciarlo */
303
+ padding-left: 1.75rem; /* Lo indenta para alinearlo con el texto del tema */
304
+ margin-top: 0.25rem; /* Pequeño espacio superior */
305
+ }
306
+
307
+ .text-brand-primary {
308
+ font-weight: 800;
309
+ color: var(--brand-primary-color);
310
+ }
311
+
312
+ /* contenedor de formularios: login, signup, forgot password, etc. */
313
+ .branded-form-container {
314
+ background-color: #ffffff;
315
+ border: 1px solid #dee2e6;
316
+ border-top: 4px solid #adb5bd;
317
+ border-radius: 0.375rem;
318
+ padding: 2rem;
319
+ box-shadow: 0 4px 12px rgba(0,0,0,0.08);
320
+ }
321
+
322
+ .branded-form-label {
323
+ font-size: 0.85rem;
324
+ font-weight: 600;
325
+ color: #495057; /* Un gris oscuro profesional */
326
+ text-transform: uppercase;
327
+ letter-spacing: 0.05em; /* Un poco de espacio extra entre letras */
328
+ margin-bottom: 0.3rem;
329
+ display: block;
330
+ }
331
+
332
+ .branded-form-title {
333
+ color: var(--brand-primary-color);
334
+ font-size: 1.75rem; /* Un tamaño más prominente */
335
+ font-weight: 700; /* Equivalente a fw-bold de Bootstrap */
336
+ text-align: center;
337
+ margin-bottom: 1.5rem; /* Espacio consistente debajo del título */
338
+ }
339
+
340
+
341
+ /* Aplica el color secundario de la marca al icono de ver archivos */
342
+ #view-files-button i {
343
+ color: var(--brand-secondary-color, #6c757d);
344
+ }
345
+
346
+ #prompt-assistant-collapse .card {
347
+ border-radius: 1rem; /* Mismo radio que el chat-input-bar */
348
+ border: 1px solid var(--brand-prompt-assistant-border, #dee2e6); /* Mismo borde que el chat-input-bar */
349
+ box-shadow: none; /* Eliminamos la sombra por defecto del card */
350
+ }
351
+
352
+ #prompt-assistant-collapse.show .card {
353
+ margin-bottom: 12px !important; /* Anula el mb-2 (8px) para añadir un poco más de espacio */
354
+ }
355
+
356
+ /* 4. El textarea "invisible" en el centro */
357
+ .chat-textarea {
358
+ flex-grow: 1;
359
+ background: transparent !important;
360
+ border: none !important;
361
+ box-shadow: none !important;
362
+ resize: none;
363
+ max-height: 150px;
364
+ min-height: 38px;
365
+ }
366
+
367
+ /* Estilo UNIFICADO para los enlaces de iconos de acción */
368
+ .action-icon-style {
369
+ color: #6c757d; /* Color gris estándar por defecto */
370
+ transition: opacity 0.2s ease-in-out;
371
+ }
372
+ .action-icon-style:hover {
373
+ opacity: 0.75; /* Efecto hover sutil */
374
+ }
375
+ .action-icon-style i {
376
+ font-size: 1.5rem;
377
+ vertical-align: middle;
378
+ }
379
+
380
+ /* Aplica a los iconos de la barra de entrada inferior */
381
+ .chat-input-bar .d-flex a i {
382
+ font-size: 1.5rem;
383
+ vertical-align: middle;
384
+ color: #6c757d;
385
+ transition: color 0.2s ease-in-out;
386
+ }
387
+
388
+ /* Anulación específica para el icono de la varita mágica */
389
+ .chat-input-bar a[href="#prompt-assistant-collapse"] i {
390
+ color: var(--brand-prompt-assistant-icon-color, #6c757d);
391
+ }
392
+
393
+ .chat-input-bar .d-flex a:hover i {
394
+ color: #343a40;
395
+ }
396
+
397
+ /* 6. Anulación específica para el botón de ENVIAR usando su ID (Máxima Prioridad) */
398
+ #send-button i {
399
+ font-size: 1.7rem; /* Ligeramente más grande */
400
+ }
401
+ #send-button:hover i {
402
+ filter: brightness(85%); /* Efecto hover genérico que funciona con cualquier color */
403
+ }
404
+
405
+ /* 7. Estilo para el botón de enviar cuando está deshabilitado */
406
+ .send-button-icon.disabled {
407
+ opacity: 0.4;
408
+ pointer-events: none; /* Lo hace no-clicable */
409
+ }
410
+
411
+ .filepond--credits {
412
+ display: none; /* Ocultar créditos de FilePond */
413
+ }
414
+
415
+ /* Estilo para el input de datos específicos cuando tiene contenido */
416
+ .specific-data-input.has-content {
417
+ background-color: #e9f3ed !important;
418
+ border-color: #198754 !important;
419
+ border-width: 2px !important;
420
+ color: #0a5833 !important;
421
+ font-weight: 500 !important;
422
+ box-shadow: 0 1px 4px rgba(25, 135, 84, 0.2) !important;
423
+ }
424
+
425
+ /* Ajuste para la etiqueta flotante */
426
+ .specific-data-input.has-content + label {
427
+ color: #0a5833 !important;
428
+ }
429
+
430
+ /* Estilo para el botón de limpiar */
431
+ .clear-specific-data-button {
432
+ position: absolute;
433
+ top: 50%;
434
+ right: 15px;
435
+ transform: translateY(-50%);
436
+ z-index: 5;
437
+ padding: 0.25rem 0.5rem;
438
+ color: #6c757d;
439
+ background-color: transparent;
440
+ border: none;
441
+ }
442
+
443
+ .clear-specific-data-button:hover {
444
+ color: #212529;
445
+ }
446
+
447
+ .dropdown-menu-soft {
448
+ background-color: var(--brand-prompt-assistant-dropdown-bg, #f8f9fa);
449
+ border-color: var(--brand-prompt-assistant-border, #dee2e6);
450
+ }
451
+
452
+ .dropdown-menu-soft .dropdown-item {
453
+ transition: all 0.15s ease-in-out;
454
+ }
455
+
456
+ .dropdown-menu-soft .dropdown-item:hover,
457
+ .dropdown-menu-soft .dropdown-item:focus {
458
+ color: var(--brand-prompt-assistant-item-hover-text, #ffffff);
459
+ background-color: var(--brand-prompt-assistant-item-hover-bg, #495057);
460
+ padding-left: 1.5rem;
461
+ transition: all 0.15s ease-in-out;
462
+ }
463
+
464
+ .dropdown-menu-soft .dropdown-header {
465
+ background-color: var(--brand-prompt-assistant-header-bg, #495057);
466
+ color: var(--brand-prompt-assistant-header-text, #ffffff);
467
+ font-weight: 600;
468
+ margin: 4px;
469
+ padding: 0.4rem 1rem;
470
+ border-radius: 4px;
471
+ font-size: 0.85rem;
472
+ text-transform: none;
473
+ letter-spacing: normal;
474
+ border-bottom: none;
475
+ }
476
+
477
+ .prompt-select-button {
478
+ /* Estado por defecto: Estilo "outline" sutil */
479
+ background-color: var(--brand-primary-color);
480
+ color: var(--brand-text-on-primary);
481
+ border: 1px solid var(--brand-primary-color); /* Borde fino con el color primario */
482
+
483
+ /* Estilos de botón estándar */
484
+ border-radius: 0.25rem;
485
+ padding: 0.5rem 1rem;
486
+ cursor: pointer;
487
+ text-align: center;
488
+ font-weight: 500; /* Un poco más de peso para el texto */
489
+
490
+ /* Transición suave para el cambio en hover */
491
+ transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
492
+ }
493
+
494
+ .prompt-select-button:hover {
495
+ /* Estado hover: Se rellena para dar feedback claro */
496
+ background-color: transparent;
497
+ color: var(--brand-primary-color);
498
+ }
499
+
500
+
501
+ #clear-selection-button {
502
+ position: absolute;
503
+ top: 50%;
504
+ right: 45px;
505
+ transform: translateY(-50%);
506
+ z-index: 5;
507
+ padding: 0.25rem 0.5rem;
508
+ color: #6c757d;
509
+ background-color: transparent;
510
+ }
511
+
512
+ #clear-selection-button:hover {
513
+ color: #212529;
514
+ }
515
+
516
+ #send-button i {
517
+ color: var(--brand-send-button-color);
518
+ }
519
+
520
+ /* Estilos personalizados para Toastr usando las variables de Branding */
521
+
522
+ /* --- Toast de Información (Usa el color primario de la marca) --- */
523
+ .toast-info {
524
+ /* ¡Importante! Usamos las variables CSS de tu BrandingService */
525
+ background-color: var(--brand-primary-color) !important;
526
+ color: var(--brand-text-on-primary) !important;
527
+ opacity: 0.95 !important;
528
+ }
529
+ .toast-info .toast-progress {
530
+ /* Usamos un color ligeramente más oscuro o una variante,
531
+ pero para simplificar, podemos empezar con el mismo */
532
+ background-color: rgba(0, 0, 0, 0.2) !important;
533
+ }
534
+
535
+ /* --- Toast de Éxito (Usa el verde por defecto o uno de marca si lo defines) --- */
536
+ .toast-success {
537
+ background-color: #198754 !important; /* Puedes crear una variable --brand-success-color si quieres */
538
+ color: #ffffff !important;
539
+ opacity: 0.95 !important;
540
+ }
541
+ .toast-success .toast-progress {
542
+ background-color: rgba(0, 0, 0, 0.2) !important;
543
+ }
544
+
545
+ /* --- Toast de Error (Usa el color de peligro de la marca) --- */
546
+ .toast-error{
547
+ background-color: var(--brand-danger-color) !important;
548
+ color: var(--brand-text-on-primary) !important; /* Asumimos texto blanco sobre el color de peligro */
549
+ opacity: 0.95 !important;
550
+ }
551
+ .toast-error .toast-progress {
552
+ background-color: rgba(0, 0, 0, 0.2) !important;
553
+ }
554
+
555
+ /* Opcional: Estilo para el botón de cierre para que contraste bien */
556
+ .toast-close-button {
557
+ color: var(--brand-text-on-primary) !important;
558
+ text-shadow: none !important;
559
+ }
560
+ .toast-close-button:hover {
561
+ opacity: 0.8;
562
+ }
563
+
564
+ .alert-branded-danger {
565
+ background-color: var(--brand-danger-bg);
566
+ color: var(--brand-danger-text);
567
+ border-color: var(--brand-danger-border);
568
+ }
569
+ /* Asegura que el texto fuerte y los enlaces dentro de la alerta también tomen el color correcto */
570
+ .alert-branded-danger strong,
571
+ .alert-branded-danger .alert-link {
572
+ color: inherit;
573
+ }
574
+
575
+ .edit-pencil {
576
+ color: var(--brand-secondary-color, #6c757d); /* Color secundario por defecto */
577
+ cursor: pointer;
578
+ opacity: 0.6;
579
+ text-decoration: none;
580
+ /* Transición suave para todos los cambios (color, opacidad, tamaño) */
581
+ transition: all 0.25s ease-in-out;
582
+ }
583
+
584
+ .edit-pencil:hover {
585
+ opacity: 1;
586
+ transform: scale(1.2);
587
+ color: var(--brand-primary-color, #4C6A8D);
588
+ cursor: pointer;
589
+ }
590
+
591
+
592
+