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,169 @@
1
+ /* Estilos generales para modales */
2
+
3
+ /* Título del modal */
4
+ .modal-title{
5
+ font-size: 20px;
6
+ font-weight: bold;
7
+ }
8
+
9
+ /* Estilos del header del modal*/
10
+ .modal-header {
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: space-between;
14
+ width: 100%;
15
+ }
16
+
17
+ /* Estilos del título del modal*/
18
+ .modal-header .modal-title {
19
+ margin: 0;
20
+ padding: 0;
21
+ flex: 1;
22
+ color: inherit;
23
+ }
24
+
25
+ /* Estilos del botón de cerrar del modal*/
26
+ .modal-header .close {
27
+ margin: 0;
28
+ padding: 0;
29
+ margin-left: auto;
30
+ }
31
+
32
+ /* Estilos del header del modal con branding */
33
+ .modal-header.branded {
34
+ background-color: var(--brand-modal-header-bg);
35
+ color: var(--brand-modal-header-text);
36
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
37
+ }
38
+ .modal-header.branded .btn-close {
39
+ filter: invert(1) grayscale(100%) brightness(200%); /* Hace el botón de cerrar visible en fondos oscuros */
40
+ }
41
+
42
+ /* Estilos para botones con branding */
43
+ .btn-branded-primary {
44
+ background-color: var(--brand-primary-color);
45
+ border-color: var(--brand-primary-color);
46
+ color: var(--brand-text-on-primary);
47
+ }
48
+ .btn-branded-primary:hover {
49
+ background-color: var(--brand-text-on-primary);
50
+ color: var(--brand-primary-color);
51
+ border-color: var(--brand-primary-color);
52
+ }
53
+
54
+ .btn-branded-secondary {
55
+ background-color: var(--brand-secondary-color);
56
+ border-color: var(--brand-secondary-color);
57
+ color: var(--brand-text-on-secondary);
58
+ }
59
+ .btn-branded-secondary:hover {
60
+ background-color: var(--brand-text-on-secondary);
61
+ color: var(--brand-secondary-color);
62
+ border-color: var(--brand-secondary-color);
63
+ }
64
+
65
+ /* Tabla con el resultado del historial */
66
+ .thead-branded th {
67
+ background-color: #e9ecef; /* Un gris claro estándar de Bootstrap */
68
+ color: #212529; /* El color de texto oscuro por defecto */
69
+ font-size: 16px;
70
+ font-weight: bold;
71
+ }
72
+ .col-icon {
73
+ width: 1%;
74
+ }
75
+
76
+ /* Modal de feedback */
77
+ .rating-stars {
78
+ display: flex;
79
+ justify-content: center;
80
+ gap: 5px;
81
+ margin-bottom: 15px;
82
+ padding-top: 5px;
83
+ }
84
+
85
+ /* Estilos de las estrellas del modal de feedback */
86
+ .star {
87
+ font-size: 3rem;
88
+ color: #ddd;
89
+ cursor: pointer;
90
+ transition: color 0.2s ease;
91
+ margin: 0 2px;
92
+ }
93
+
94
+ .star::before {
95
+ content: '★';
96
+ }
97
+
98
+ .star:hover,
99
+ .star.active,
100
+ .star.hover-active {
101
+ color: var(--brand-primary-color);
102
+ }
103
+
104
+ /* model de help */
105
+ .modal-body .accordion-button:not(.collapsed) {
106
+ background-color: var(--brand-primary-color);
107
+ color: var(--brand-text-on-primary);
108
+ font-weight: 600;
109
+ box-shadow: none;
110
+ }
111
+
112
+ /* 2. Estilo para el anillo de foco, aplicado ÚNICAMENTE cuando el botón está CERRADO y tiene foco. */
113
+ .modal-body .accordion-button.collapsed:focus {
114
+ background-color: #fff; /* Asegura fondo blanco al hacer foco en un item cerrado */
115
+ border-color: transparent; /* Evita bordes no deseados */
116
+ /* La única regla que debe estar aquí es la que dibuja el anillo de foco. */
117
+ box-shadow: 0 0 0 0.25rem rgba(var(--brand-primary-color-rgb), 0.25);
118
+ }
119
+
120
+ .icon-spaced {
121
+ margin-right: 10px;
122
+ }
123
+
124
+ .text-muted{
125
+ font-size:16px;
126
+ text-align: justify;
127
+ }
128
+
129
+ .feedback-text{
130
+ font-size: 16px;
131
+ }
132
+
133
+ /* Modal de listado de archivos */
134
+ /* Estilos del nombre del archivo del modal de archivos y ordenar icono */
135
+ .file-name-modal {
136
+ flex: 1;
137
+ margin-right: 10px;
138
+ }
139
+
140
+ /* Para el icono de eliminar del modal */
141
+ .remove-file-btn i {
142
+ color: #c82333
143
+ }
144
+
145
+ /* Estilos para el modal de archivos y ordenar icono */
146
+ .list-group-item {
147
+ display: flex;
148
+ justify-content: space-between;
149
+ align-items: center;
150
+ }
151
+
152
+ /* Estilos del botón de eliminar del modal de archivos y ordenar icono */
153
+ .remove-file-btn {
154
+ flex-shrink: 0;
155
+ }
156
+
157
+ /* Estilos para alertas generales del chat */
158
+ .alert-branded-info {
159
+ background-color: var(--brand-info-bg);
160
+ color: var(--brand-info-text);
161
+ border-color: var(--brand-info-border);
162
+ }
163
+ .alert-branded-info strong,
164
+ .alert-branded-info .alert-link {
165
+ color: inherit;
166
+ }
167
+ .alert-branded-info .bi { /* Asegura que los iconos también tomen el color */
168
+ color: inherit;
169
+ }
@@ -0,0 +1,107 @@
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
+
@@ -0,0 +1,182 @@
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
+ /* --- Sección Principal (Hero) --- */
40
+ .hero-section {
41
+ padding: 2rem 0 1rem; /* Ajustado: 5rem arriba, 0 a los lados, 2.5rem abajo */
42
+ }
43
+
44
+ .hero-title {
45
+ font-size: 3rem;
46
+ font-weight: 800;
47
+ line-height: 1.2;
48
+ margin-bottom: 1.5rem;
49
+ }
50
+ .gradient-text {
51
+ background: linear-gradient(90deg, var(--website-gradient-start), var(--website-gradient-end));
52
+ -webkit-background-clip: text;
53
+ -webkit-text-fill-color: transparent;
54
+ background-clip: text;
55
+ text-fill-color: transparent;
56
+ }
57
+ .hero-bullets {
58
+ list-style: none;
59
+ padding-left: 0;
60
+ font-size: 1.1rem;
61
+ }
62
+ .hero-bullets li {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 0.75rem;
66
+ margin-bottom: 1rem;
67
+ color: var(--website-muted-text);
68
+ }
69
+ .hero-bullets .bi {
70
+ color: var(--website-primary-color);
71
+ font-size: 1.5rem;
72
+ }
73
+
74
+ /* --- Botón de Llamada a la Acción (CTA) --- */
75
+ .hero-section .btn-primary {
76
+ background-color: var(--website-primary-color);
77
+ border-color: var(--website-primary-color);
78
+ transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out;
79
+ }
80
+ .hero-section .btn-primary:hover {
81
+ background-color: var(--website-primary-color-dark);
82
+ border-color: var(--website-primary-color-dark);
83
+ }
84
+
85
+ .bg-light h3 {
86
+ color: var(--website-primary-color);
87
+ }
88
+
89
+ .features-section {
90
+ padding: 5rem 0;
91
+ background-color: var(--website-light-bg);
92
+ }
93
+ .feature-item {
94
+ background-color: #fff;
95
+ padding: 2rem;
96
+ border-radius: 0.75rem;
97
+ border: 1px solid #e9ecef;
98
+ height: 100%;
99
+ transition: all 0.3s ease;
100
+ }
101
+ .feature-item:hover {
102
+ transform: translateY(-5px);
103
+ box-shadow: 0 8px 25px rgba(0,0,0,0.08);
104
+ }
105
+ .feature-icon {
106
+ font-size: 2.5rem;
107
+ margin-bottom: 1rem;
108
+ color: var(--website-primary-color);
109
+ }
110
+ .feature-item h3 {
111
+ font-weight: 600;
112
+ margin-bottom: 0.5rem;
113
+ }
114
+ .feature-item p {
115
+ color: var(--website-muted-text);
116
+ }
117
+
118
+ /* Estilo especial para la caja de Open Source */
119
+ .opensource-box {
120
+ background: var(--website-dark-text);
121
+ color: #fff;
122
+ padding: 2rem;
123
+ border-radius: 0.75rem;
124
+ height: 100%;
125
+ display: flex;
126
+ flex-direction: column;
127
+ justify-content: space-between;
128
+ border: 1px solid transparent;
129
+ transition: all 0.3s ease;
130
+ }
131
+ .opensource-box:hover {
132
+ transform: translateY(-5px);
133
+ box-shadow: 0 8px 25px rgba(0,0,0,0.15);
134
+ }
135
+ .opensource-icon .bi-github {
136
+ font-size: 2.5rem;
137
+ margin-bottom: 1rem;
138
+ }
139
+ .opensource-box h3 {
140
+ font-weight: 600;
141
+ }
142
+ .opensource-box p {
143
+ color: #ced4da;
144
+ margin-bottom: 1.5rem;
145
+ }
146
+
147
+ /* --- Sección del Autor --- */
148
+ .author-section {
149
+ background-color: #fff;
150
+ }
151
+ .author-card {
152
+ background-color: var(--website-light-bg);
153
+ border-radius: 0.75rem;
154
+ border: 1px solid #e9ecef;
155
+ }
156
+ .author-card h5 {
157
+ color: var(--website-primary-color);
158
+ font-weight: 600;
159
+ }
160
+ .author-bio {
161
+ color: var(--website-muted-text);
162
+ line-height: 1.6;
163
+ }
164
+ .author-linkedin {
165
+ text-decoration: none;
166
+ color: #0077b5;
167
+ font-weight: 500;
168
+ transition: opacity 0.2s;
169
+ }
170
+ .author-linkedin:hover {
171
+ opacity: 0.8;
172
+ }
173
+
174
+ /* --- Footer --- */
175
+ .landing-footer {
176
+ background-color: var(--website-light-bg);
177
+ color: var(--website-muted-text);
178
+ padding: 2rem 0;
179
+ text-align: center;
180
+ margin-top: 4rem;
181
+ border-top: 1px solid #e9ecef;
182
+ }
@@ -0,0 +1,115 @@
1
+ /* BLOQUE GENERAL */
2
+ .llm-output {
3
+ margin: 0;
4
+ padding: 20px;
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
+ }