iatoolkit 0.59.1__py3-none-any.whl → 0.67.0__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 (93) hide show
  1. iatoolkit/__init__.py +2 -0
  2. iatoolkit/base_company.py +2 -19
  3. iatoolkit/common/routes.py +28 -25
  4. iatoolkit/common/session_manager.py +2 -0
  5. iatoolkit/common/util.py +17 -6
  6. iatoolkit/company_registry.py +1 -2
  7. iatoolkit/iatoolkit.py +54 -20
  8. iatoolkit/locales/en.yaml +167 -0
  9. iatoolkit/locales/es.yaml +163 -0
  10. iatoolkit/repositories/database_manager.py +3 -3
  11. iatoolkit/repositories/document_repo.py +1 -1
  12. iatoolkit/repositories/models.py +3 -4
  13. iatoolkit/repositories/profile_repo.py +0 -4
  14. iatoolkit/services/auth_service.py +44 -32
  15. iatoolkit/services/branding_service.py +35 -27
  16. iatoolkit/services/configuration_service.py +140 -0
  17. iatoolkit/services/dispatcher_service.py +20 -18
  18. iatoolkit/services/document_service.py +5 -2
  19. iatoolkit/services/excel_service.py +15 -11
  20. iatoolkit/services/file_processor_service.py +4 -12
  21. iatoolkit/services/history_service.py +8 -7
  22. iatoolkit/services/i18n_service.py +104 -0
  23. iatoolkit/services/jwt_service.py +7 -9
  24. iatoolkit/services/language_service.py +79 -0
  25. iatoolkit/services/load_documents_service.py +4 -4
  26. iatoolkit/services/mail_service.py +9 -4
  27. iatoolkit/services/onboarding_service.py +10 -4
  28. iatoolkit/services/profile_service.py +59 -38
  29. iatoolkit/services/prompt_manager_service.py +20 -16
  30. iatoolkit/services/query_service.py +15 -14
  31. iatoolkit/services/sql_service.py +6 -2
  32. iatoolkit/services/user_feedback_service.py +70 -29
  33. iatoolkit/static/js/chat_feedback_button.js +80 -0
  34. iatoolkit/static/js/chat_help_content.js +124 -0
  35. iatoolkit/static/js/chat_history_button.js +110 -0
  36. iatoolkit/static/js/chat_logout_button.js +36 -0
  37. iatoolkit/static/js/chat_main.js +32 -184
  38. iatoolkit/static/js/{chat_onboarding.js → chat_onboarding_button.js} +0 -1
  39. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  40. iatoolkit/static/js/chat_reload_button.js +35 -0
  41. iatoolkit/static/styles/chat_iatoolkit.css +251 -205
  42. iatoolkit/static/styles/chat_modal.css +63 -95
  43. iatoolkit/static/styles/chat_public.css +107 -0
  44. iatoolkit/static/styles/landing_page.css +121 -167
  45. iatoolkit/templates/_company_header.html +20 -0
  46. iatoolkit/templates/_login_widget.html +10 -10
  47. iatoolkit/templates/base.html +36 -19
  48. iatoolkit/templates/change_password.html +24 -22
  49. iatoolkit/templates/chat.html +121 -93
  50. iatoolkit/templates/chat_modals.html +113 -74
  51. iatoolkit/templates/error.html +44 -8
  52. iatoolkit/templates/forgot_password.html +17 -15
  53. iatoolkit/templates/index.html +66 -81
  54. iatoolkit/templates/login_simulation.html +16 -5
  55. iatoolkit/templates/onboarding_shell.html +1 -2
  56. iatoolkit/templates/signup.html +22 -20
  57. iatoolkit/views/base_login_view.py +12 -1
  58. iatoolkit/views/change_password_view.py +50 -33
  59. iatoolkit/views/external_login_view.py +5 -11
  60. iatoolkit/views/file_store_api_view.py +7 -9
  61. iatoolkit/views/forgot_password_view.py +21 -19
  62. iatoolkit/views/help_content_api_view.py +54 -0
  63. iatoolkit/views/history_api_view.py +16 -12
  64. iatoolkit/views/home_view.py +61 -0
  65. iatoolkit/views/index_view.py +5 -34
  66. iatoolkit/views/init_context_api_view.py +16 -13
  67. iatoolkit/views/llmquery_api_view.py +38 -28
  68. iatoolkit/views/login_simulation_view.py +14 -2
  69. iatoolkit/views/login_view.py +48 -33
  70. iatoolkit/views/logout_api_view.py +49 -0
  71. iatoolkit/views/profile_api_view.py +46 -0
  72. iatoolkit/views/prompt_api_view.py +8 -8
  73. iatoolkit/views/signup_view.py +27 -25
  74. iatoolkit/views/{tasks_view.py → tasks_api_view.py} +10 -36
  75. iatoolkit/views/tasks_review_api_view.py +55 -0
  76. iatoolkit/views/user_feedback_api_view.py +21 -32
  77. iatoolkit/views/verify_user_view.py +33 -26
  78. {iatoolkit-0.59.1.dist-info → iatoolkit-0.67.0.dist-info}/METADATA +40 -22
  79. iatoolkit-0.67.0.dist-info/RECORD +120 -0
  80. iatoolkit-0.67.0.dist-info/licenses/LICENSE +21 -0
  81. iatoolkit/static/js/chat_context_reload.js +0 -54
  82. iatoolkit/static/js/chat_feedback.js +0 -115
  83. iatoolkit/static/js/chat_history.js +0 -127
  84. iatoolkit/static/styles/chat_info.css +0 -53
  85. iatoolkit/templates/_branding_styles.html +0 -53
  86. iatoolkit/templates/_navbar.html +0 -9
  87. iatoolkit/templates/header.html +0 -31
  88. iatoolkit/templates/test.html +0 -9
  89. iatoolkit/views/chat_token_request_view.py +0 -98
  90. iatoolkit/views/tasks_review_view.py +0 -83
  91. iatoolkit-0.59.1.dist-info/RECORD +0 -111
  92. {iatoolkit-0.59.1.dist-info → iatoolkit-0.67.0.dist-info}/WHEEL +0 -0
  93. {iatoolkit-0.59.1.dist-info → iatoolkit-0.67.0.dist-info}/top_level.txt +0 -0
@@ -1,37 +1,69 @@
1
- <!-- Modal para mostrar archivos cargados -->
2
- <div class="modal fade" id="uploadedFilesModal" tabindex="-1" aria-labelledby="uploadedFilesModalLabel" aria-hidden="true">
3
- <div class="modal-dialog">
4
- <div class="modal-content">
5
- <div class="modal-header branded">
6
- <h5 class="modal-title" id="uploadedFilesModalLabel">Archivos Cargados</h5>
7
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
8
- </div>
9
- <div class="modal-body">
10
- <ul id="uploaded-files-list" class="list-group">
11
- <!-- Los nombres de los archivos se agregarán aquí por JS -->
12
- </ul>
13
- </div>
14
- <div class="modal-footer">
15
- <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">Cerrar</button>
16
- </div>
1
+
2
+
3
+ <!-- Modal para historial -->
4
+ <div class="modal fade" id="historyModal" tabindex="-1" aria-labelledby="historyModalLabel" aria-hidden="true">
5
+ <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
6
+ <div class="modal-content">
7
+ <div class="modal-header branded">
8
+ <h5 class="modal-title" id="historyModalLabel">
9
+ <i class="bi bi-clock-history me-3"></i>
10
+ {{ t('ui.modals.history_title') }}
11
+ </h5>
12
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
13
+ </div>
14
+ <div class="modal-body">
15
+ <div id="history-loading" style="display: none;" class="text-center p-4">
16
+ <div class="spinner-border text-primary" role="status">
17
+ <span class="visually-hidden">Cargando...</span>
18
+ </div>
19
+ <p class="mt-2">{{ t('ui.modals.loading_history') }}</p>
20
+ </div>
21
+
22
+ <div id="history-content" style="display: none;">
23
+ <div class="table-responsive">
24
+ <table class="table table-striped table-hover">
25
+ <thead class="thead-branded">
26
+ <tr>
27
+ <th scope="col">{{ t('ui.modals.history_table_date') }}</th>
28
+ <th scope="col">{{ t('ui.modals.history_table_query') }}</th>
29
+ <th scope="col" class="col-icon"></th>
30
+ </tr>
31
+ </thead>
32
+ <tbody id="history-table-body">
33
+ <!-- Los datos se cargarán aquí -->
34
+ </tbody>
35
+ </table>
36
+ </div>
37
+ <div id="no-history-message" style="display: none;">
38
+ {{ t('js_messages.no_history_found') }}
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <div class="modal-footer">
43
+ <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
44
+ <i class="bi bi-x-circle me-1"></i>
45
+ {{ t('ui.buttons.cancel') }}
46
+ </button>
47
+ </div>
48
+ </div>
17
49
  </div>
18
- </div>
19
50
  </div>
20
51
 
52
+
21
53
  <!-- Modal para feedback -->
22
54
  <div class="modal fade" id="feedbackModal" tabindex="-1" aria-labelledby="feedbackModalLabel" aria-hidden="true">
23
55
  <div class="modal-dialog modal-dialog-centered">
24
56
  <div class="modal-content">
25
57
  <div class="modal-header branded">
26
58
  <h5 class="modal-title" id="feedbackModalLabel">
27
- <i class="bi bi-chat-dots me-3"></i>Tu Opinión es Importante
59
+ <i class="bi bi-chat-dots me-3"></i>
60
+ {{ t('ui.modals.feedback_title') }}
28
61
  </h5>
29
62
  <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
30
63
  </div>
31
64
  <div class="modal-body">
32
- <p class="text-center mb-2"><strong>¿Qué tan útil fue la respuesta del asistente?</strong></p>
65
+ <p class="text-center mb-2"><strong>{{ t('ui.modals.feedback_prompt') }}</strong></p>
33
66
 
34
- <!-- ▼▼▼ ESTE ES EL BLOQUE DE HTML QUE FALTABA ▼▼▼ -->
35
67
  <div class="rating-stars mb-4">
36
68
  <span class="star" data-rating="1" onclick="gfg(1)"></span>
37
69
  <span class="star" data-rating="2" onclick="gfg(2)"></span>
@@ -39,77 +71,32 @@
39
71
  <span class="star" data-rating="4" onclick="gfg(4)"></span>
40
72
  <span class="star" data-rating="5" onclick="gfg(5)"></span>
41
73
  </div>
42
- <!-- ▲▲▲ FIN DEL BLOQUE DE HTML QUE FALTABA ▲▲▲ -->
43
74
 
44
75
  <div class="form-group">
45
- <label for="feedback-text" class="form-label text-muted">Tu comentario nos ayuda a mejorar:</label>
76
+ <label for="feedback-text" class="form-label text-muted">
77
+ {{ t('ui.modals.feedback_comment_label') }}</label>
46
78
  <textarea
47
79
  class="form-control feedback-text"
48
80
  id="feedback-text"
49
81
  rows="4"
50
- placeholder="Escribe aquí tu opinión, sugerencias o comentarios..."
82
+ placeholder="{{ t('ui.modals.feedback_comment_placeholder') }}"
51
83
  style="resize: vertical; min-height: 100px;"></textarea>
52
84
  </div>
53
85
  </div>
54
86
  <div class="modal-footer">
55
87
  <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
56
- <i class="bi bi-x-circle me-1"></i>Cancelar
88
+ <i class="bi bi-x-circle me-1"></i>
89
+ {{ t('ui.buttons.cancel') }}
57
90
  </button>
58
91
  <button type="button" class="btn btn-branded-primary" id="submit-feedback">
59
- <i class="bi bi-send me-1"></i>Enviar
92
+ <i class="bi bi-send me-1"></i>
93
+ {{ t('ui.buttons.send') }}
60
94
  </button>
61
95
  </div>
62
96
  </div>
63
97
  </div>
64
98
  </div>
65
99
 
66
- <!-- Modal para historial -->
67
- <div class="modal fade" id="historyModal" tabindex="-1" aria-labelledby="historyModalLabel" aria-hidden="true">
68
- <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
69
- <div class="modal-content">
70
- <div class="modal-header branded">
71
- <h5 class="modal-title" id="historyModalLabel">
72
- <i class="bi bi-clock-history me-3"></i>Historial de Consultas
73
- </h5>
74
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
75
- </div>
76
- <div class="modal-body">
77
- <div id="history-loading" style="display: none;" class="text-center p-4">
78
- <div class="spinner-border text-primary" role="status">
79
- <span class="visually-hidden">Cargando...</span>
80
- </div>
81
- <p class="mt-2">Cargando historial...</p>
82
- </div>
83
- <div id="history-error" style="display: none;">
84
- <!-- Los errores se mostrarán aquí -->
85
- </div>
86
- <div id="history-content" style="display: none;">
87
-
88
- <div class="table-responsive">
89
- <table class="table table-striped table-hover">
90
- <thead class="thead-branded">
91
- <tr>
92
- <th scope="col" style="width: 5%;">#</th>
93
- <th scope="col">Fecha</th>
94
- <th scope="col">Consulta</th>
95
- <th scope="col" style="width: 5%;"></th>
96
- </tr>
97
- </thead>
98
- <tbody id="history-table-body">
99
- <!-- Los datos se cargarán aquí -->
100
- </tbody>
101
- </table>
102
- </div>
103
- </div>
104
- </div>
105
- <div class="modal-footer">
106
- <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">
107
- <i class="bi bi-x-circle me-1"></i>Cerrar
108
- </button>
109
- </div>
110
- </div>
111
- </div>
112
- </div>
113
100
 
114
101
  <!-- Modal de Onboarding -->
115
102
  <div class="modal fade" id="onboardingModal" tabindex="-1" aria-labelledby="onboardingModalLabel" aria-hidden="true">
@@ -117,7 +104,7 @@
117
104
  <div class="modal-content" style="border-radius:12px;">
118
105
  <div class="modal-header">
119
106
  <h5 class="modal-title w-100 text-center" id="onboardingModalLabel" style="color: var(--brand-primary-color, #FF5100);">
120
- Bienvenido a {{ branding.name }}
107
+ {{ branding.name }}
121
108
  </h5>
122
109
  <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Cerrar"></button>
123
110
  </div>
@@ -137,9 +124,61 @@
137
124
 
138
125
  <div class="modal-footer">
139
126
  <button id="ob-close" type="button" class="btn btn-branded-primary" data-bs-dismiss="modal">
140
- Cerrar
127
+ {{ t('ui.buttons.cancel') }}
141
128
  </button>
142
129
  </div>
143
130
  </div>
144
131
  </div>
132
+ </div>
133
+
134
+ <!-- Modal de Guía de Uso / Ayuda -->
135
+ <div class="modal fade" id="helpModal" tabindex="-1" aria-labelledby="helpModalLabel" aria-hidden="true">
136
+ <div class="modal-dialog modal-lg modal-dialog-scrollable">
137
+ <div class="modal-content">
138
+ <div class="modal-header branded">
139
+ <h5 class="modal-title" id="helpModalLabel">
140
+ <i class="bi bi-info-circle me-2"></i>
141
+ {{ t('ui.modals.help_title') }}
142
+ </h5>
143
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
144
+ </div>
145
+ <div class="modal-body">
146
+ <!-- El acordeón con el contenido de ayuda se inyectará aquí dinámicamente -->
147
+ <div id="help-spinner" class="text-center p-5" style="display: none;">
148
+ <div class="spinner-border text-primary" role="status">
149
+ <span class="visually-hidden">Cargando...</span>
150
+ </div>
151
+ </div>
152
+ <div class="accordion" id="help-accordion-container">
153
+ <!-- Contenido generado por JS -->
154
+ </div>
155
+ </div>
156
+ <div class="modal-footer">
157
+ <button type="button" class="btn btn-branded-secondary"
158
+ data-bs-dismiss="modal">
159
+ {{ t('ui.buttons.cancel') }}
160
+ </button>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+
166
+ <!-- Modal para mostrar archivos cargados -->
167
+ <div class="modal fade" id="uploadedFilesModal" tabindex="-1" aria-labelledby="uploadedFilesModalLabel" aria-hidden="true">
168
+ <div class="modal-dialog">
169
+ <div class="modal-content">
170
+ <div class="modal-header branded">
171
+ <h5 class="modal-title" id="uploadedFilesModalLabel">Archivos Cargados</h5>
172
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
173
+ </div>
174
+ <div class="modal-body">
175
+ <ul id="uploaded-files-list" class="list-group">
176
+ <!-- Los nombres de los archivos se agregarán aquí por JS -->
177
+ </ul>
178
+ </div>
179
+ <div class="modal-footer">
180
+ <button type="button" class="btn btn-branded-secondary" data-bs-dismiss="modal">Cerrar</button>
181
+ </div>
182
+ </div>
183
+ </div>
145
184
  </div>
@@ -1,15 +1,51 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}Error - IAToolkit{% endblock %}
3
+ {% block title %}Error {% endblock %}
4
+
5
+ {% block styles %}
6
+ {# Carga las variables de CSS personalizadas de la empresa #}
7
+ {% if branding %}
8
+ <style>
9
+ {{ branding.css_variables | safe }}
10
+ </style>
11
+ {% endif %}
12
+ {# Enlace a los iconos de Bootstrap para el icono de error #}
13
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
14
+ {% endblock %}
4
15
 
5
16
  {% block content %}
6
- <div class="container vh-100 d-flex justify-content-center align-items-center">
7
- <div class="text-center col-11 col-md-8 col-lg-6 border rounded p-4 shadow-sm bg-light">
8
- <h1 class="text-danger fw-bold">¡Ups! Ha ocurrido un error</h1>
9
- <p class="mt-3 text-muted">
10
- {{ message }}
11
- </p>
12
- <a href="{{ url_for('index', company_short_name=company_short_name) }}" class="btn btn-primary mt-4">Volver al Inicio</a>
17
+ <div class="container mt-4">
18
+
19
+ {% include '_company_header.html' %}
20
+
21
+ {# Contenedor principal para el mensaje de error #}
22
+ <div class="container mt-5">
23
+ <div class="row justify-content-center">
24
+ <div class="col-md-8 col-lg-6">
25
+
26
+ {# Usamos una tarjeta para enmarcar el contenido del error #}
27
+ <div class="card shadow-sm text-center border-danger">
28
+ <div class="card-body p-4 p-md-5">
29
+
30
+ {# Icono de error grande y visible #}
31
+ <i class="bi bi-exclamation-triangle-fill text-danger" style="font-size: 4rem;"></i>
32
+
33
+ <h4 class="card-title mt-4">Ha Ocurrido un Error</h4>
34
+ <h5 class="card-title mt-4">Empresa: {{ company_short_name }} </h5>
35
+
36
+ {# El mensaje de error dinámico que se pasa desde la vista #}
37
+ <p class="text-muted mt-3 mb-4">
38
+ {{ message | default('Lo sentimos, algo salió mal. Por favor, inténtalo de nuevo más tarde.') }}
39
+ </p>
40
+
41
+ <a href="javascript:history.back()"
42
+ class="btn btn-branded-primary px-4">
43
+ Volver
44
+ </a>
45
+ </div>
46
+ </div>
47
+ </div>
13
48
  </div>
14
49
  </div>
50
+ </div>
15
51
  {% endblock %}
@@ -1,43 +1,43 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}Recuperar Contraseña - {{ company.name }}{% endblock %}
3
+ {% block title %}{{ t('ui.forgot_password.title') }} - {{ branding.name }}{% endblock %}
4
4
 
5
- {% block content %}
6
- <!-- 1. Incluimos los estilos de branding reutilizables -->
7
- {% include '_branding_styles.html' %}
5
+ {% block styles %}
6
+ <style>{{ branding.css_variables | safe }}</style>
7
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/chat_public.css') }}">
8
+ {% endblock %}
8
9
 
9
- <!-- Enlazamos la hoja de estilos de la landing page para reutilizar estilos -->
10
- <link rel="stylesheet" href="{{ iatoolkit_base_url }}/static/styles/landing_page.css">
10
+ {% block content %}
11
+ <div class="container mt-4">
11
12
 
12
- <!-- 2. Incluimos la barra de navegación reutilizable -->
13
- {% include '_navbar.html' %}
13
+ {% include '_company_header.html' %}
14
14
 
15
15
  <!-- 3. Sección contenedora para centrar el contenido -->
16
16
  <section class="hero-section">
17
17
  <div class="container">
18
18
  <div class="row justify-content-center">
19
19
  <div class="col-lg-6 col-md-8">
20
- <div class="border rounded p-4 p-md-5 shadow-sm bg-light">
21
- <h4 class="form-title fw-bold mb-3 text-center">Recuperar Contraseña</h4>
20
+ <div class="branded-form-container">
21
+ <h4 class="branded-form-title">{{ t('ui.forgot_password.title') }}</h4>
22
22
 
23
23
  <p class="text-muted text-center mb-4">
24
- Ingresa tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.
24
+ {{ t('ui.forgot_password.subtitle') }}
25
25
  </p>
26
26
 
27
27
  <form action="{{ url_for('forgot_password', company_short_name=company_short_name) }}" method="post">
28
28
  <div class="mb-3">
29
- <label for="email" class="form-label text-secondary">Correo Electrónico</label>
29
+ <label for="email" class="form-label text-secondary">{{ t('ui.signup.email_label') }}</label>
30
30
  <input type="email" id="email" name="email"
31
31
  class="form-control"
32
32
  required value="{{ form_data.email if form_data else '' }}">
33
33
  </div>
34
34
 
35
- <button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2 mt-3">Enviar Enlace</button>
35
+ <button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2 mt-3">{{ t('ui.forgot_password.submit_button') }}</button>
36
36
  </form>
37
37
 
38
38
  <div class="text-center mt-4 pt-3" style="border-top: 1px solid #e0e0e0;">
39
- <a href="{{ url_for('index', company_short_name=company_short_name) }}" class="text-muted text-decoration-none fw-semibold">
40
- <i class="bi bi-arrow-left me-1"></i>Volver al inicio
39
+ <a href="{{ url_for('home', company_short_name=company_short_name) }}" class="text-muted text-decoration-none fw-semibold">
40
+ <i class="bi bi-arrow-left me-1"></i>{{ t('ui.forgot_password.back_to_login') }}
41
41
  </a>
42
42
  </div>
43
43
  </div>
@@ -45,4 +45,6 @@
45
45
  </div>
46
46
  </div>
47
47
  </section>
48
+ </div>
49
+
48
50
  {% endblock %}
@@ -1,71 +1,73 @@
1
1
  {% extends "base.html" %}
2
2
 
3
- {% block title %}IAToolkit{% endblock %}
3
+ {% block title %}IAToolkit - Framework de IA{% endblock %}
4
4
 
5
- {% block content %}
5
+ {% block styles %}
6
+ {# Enlazamos la hoja de estilos del website y los iconos de Bootstrap #}
7
+ <link rel="stylesheet" href="{{ url_for('static', filename='styles/landing_page.css') }}">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
9
+ {% endblock %}
6
10
 
7
- <!-- Incluimos los estilos de branding reutilizables -->
8
- {% include '_branding_styles.html' %}
9
11
 
10
- <!-- Enlazamos la hoja de estilos de la landing page -->
11
- <link rel="stylesheet" href="{{ iatoolkit_base_url }}/static/styles/landing_page.css">
12
+ {% block content %}
13
+ <div class="container mt-4">
12
14
 
13
- <!-- 1. Barra de Navegación (sin cambios) -->
14
- <nav class="navbar landing-navbar">
15
- <div class="container-fluid">
16
- <span class="navbar-brand">IAToolkit</span>
17
- </div>
18
- </nav>
15
+ <!-- 1. Encabezado con una clase 100% propia y única -->
16
+ <header class="website-header container">
17
+ <span class="website-brand">IAToolkit</span>
18
+ </header>
19
19
 
20
- <!-- 2. Sección Principal (sin cambios) -->
20
+ <!-- 2. Sección Principal (Hero) -->
21
21
  <section class="hero-section">
22
22
  <div class="container">
23
- <div class="row align-items-center">
23
+ <div class="row align-items-center g-5 py-5">
24
24
  <div class="col-lg-7">
25
- <div class="value-proposition">
26
- <h1 class="hero-title gradient-text">IA que entiende tu <span class="text-dark">negocio</span> desde el primer día.</h1>
27
-
28
- </div>
29
- <ul class="hero-bullets">
30
- <li><i class="bi bi-database"></i> Conecta tus bases de datos, APIs y documentos.</li>
31
- <li><i class="bi bi-chat-dots"></i> Construye un asistente que entiende el lenguaje de tu empresa.</li>
32
- <li><i class="bi bi-rocket-takeoff"></i> Despliega donde quieras, con tu marca y tus reglas.</li>
33
- </ul>
25
+ <h1 class="hero-title gradient-text">Framework de IA Open Source</h1>
26
+ <ul class="hero-bullets mt-4">
27
+ <li><i class="bi bi-hdd-stack"></i>Integra tus bases de datos SQL y documentos para dar contexto real a tus asistentes.</li>
28
+ <li><i class="bi bi-code-slash"></i>Crea un repositorio de prompts validados por tu equipo para estandarizar y acelerar las tareas de IA.</li>
29
+ <li><i class="bi bi-shield-lock"></i> Monta la plataforma en tu propia infraestructura con control total sobre el LLM, garantizando la privacidad de los datos.</li> </ul>
34
30
  </div>
35
31
  <div class="col-lg-5">
36
- {% include '_login_widget.html' %}
32
+ <div class="border rounded-3 p-4 p-md-5 shadow-sm bg-light">
33
+ <h3 class="fw-bold text-center mb-3">Prueba la Plataforma</h3>
34
+ <p class="text-muted mb-4">
35
+ Descubre nuestra demo interactiva, configurada con datos de una empresa de muestra. Explora las funcionalidades de la plataforma en un entorno práctico.<br>
36
+ </p>
37
+ <div class="d-grid">
38
+ {# Este botón usa la clase .btn-primary, que es estilizada por .hero-section .btn-primary en el CSS #}
39
+ <a href="{{ url_for('home', company_short_name='sample_company') }}"
40
+ target="_blank"
41
+ rel="noopener noreferrer"
42
+ class="btn btn-primary btn-lg fw-bold">
43
+ Acceder
44
+ </a>
45
+ </div>
46
+ </div>
37
47
  </div>
38
48
  </div>
39
49
  </div>
40
50
  </section>
41
51
 
42
- <!-- 3. Sección de Características con 6 recuadros -->
52
+ <!-- 3. Sección de Características -->
43
53
  <section class="features-section">
44
54
  <div class="container">
45
- <!-- Primera Fila de Características -->
46
55
  <div class="row g-4">
47
- <!-- Feature 1: GitHub / Open Source -->
48
56
  <div class="col-lg-4 d-flex align-items-stretch">
49
57
  <div class="opensource-box">
50
58
  <div>
51
59
  <div class="opensource-icon"><i class="bi bi-github"></i></div>
52
- <div class="opensource-content">
53
- <h3>100% Open Source</h3>
54
- <p>Construido en Python, IAToolkit te da control total. Audita el código, adáptalo y contribuye a una comunidad en crecimiento.</p>
55
-
56
- <a href="https://github.com/flibedinsky/iatoolkit" target="_blank" class="btn btn-light">
57
- <i class="bi bi-github me-2"></i>Ir a GitHub
58
- {% if iatoolkit_version %}
59
- <span class="badge bg-dark ms-2">{{ iatoolkit_version }}</span>
60
- {% endif %}
61
- </a>
62
- </div>
60
+ <h3>100% Open Source</h3>
61
+ <p>Construido en Python, IAToolkit te da control total. Audita el código, adáptalo y contribuye a una comunidad en crecimiento.</p>
63
62
  </div>
64
-
63
+ <a href="https://github.com/flibedinsky/iatoolkit" target="_blank" class="btn btn-light mt-auto">
64
+ <i class="bi bi-github me-2"></i>Ir a GitHub
65
+ {% if iatoolkit_version %}
66
+ <span class="badge bg-dark ms-2">{{ iatoolkit_version }}</span>
67
+ {% endif %}
68
+ </a>
65
69
  </div>
66
70
  </div>
67
-
68
- <!-- Feature 4: Conectividad -->
69
71
  <div class="col-lg-4 d-flex align-items-stretch">
70
72
  <div class="feature-item">
71
73
  <div class="feature-icon"><i class="bi bi-hdd-stack"></i></div>
@@ -73,8 +75,6 @@
73
75
  <p>Integra tus bases de datos SQL, documentos (PDFs, TXT) y otros sistemas para que el asistente tenga un contexto real de tu negocio.</p>
74
76
  </div>
75
77
  </div>
76
-
77
- <!-- Feature 2: Multi-LLM -->
78
78
  <div class="col-lg-4 d-flex align-items-stretch">
79
79
  <div class="feature-item">
80
80
  <div class="feature-icon"><i class="bi bi-gem"></i></div>
@@ -82,10 +82,7 @@
82
82
  <p>No te ates a un solo proveedor. IAToolkit está diseñado para funcionar con diferentes modelos, incluyendo Gemini y OpenAI (GPT).</p>
83
83
  </div>
84
84
  </div>
85
-
86
85
  </div>
87
-
88
- <!-- Segunda Fila de Características -->
89
86
  <div class="row g-4 mt-4">
90
87
  <div class="col-lg-4 d-flex align-items-stretch">
91
88
  <div class="feature-item">
@@ -94,17 +91,13 @@
94
91
  <p>Crea, gestiona y comparte una librería de prompts personalizados para tu empresa, optimizando las tareas repetitivas.</p>
95
92
  </div>
96
93
  </div>
97
- <!-- Feature 6: Personalización -->
98
94
  <div class="col-lg-4 d-flex align-items-stretch">
99
95
  <div class="feature-item">
100
96
  <div class="feature-icon"><i class="bi bi-palette"></i></div>
101
97
  <h3>100% Personalizable</h3>
102
- <p>Desde la apariencia visual hasta las capacidades y herramientas del asistente,
103
- adapta cada aspecto para que se alinee con la identidad de tu marca.</p>
98
+ <p>Adapta cada aspecto, desde la apariencia visual hasta las capacidades y herramientas del asistente, para que se alinee con la identidad de tu marca.</p>
104
99
  </div>
105
100
  </div>
106
-
107
- <!-- Feature 5: Seguridad -->
108
101
  <div class="col-lg-4 d-flex align-items-stretch">
109
102
  <div class="feature-item">
110
103
  <div class="feature-icon"><i class="bi bi-shield-lock"></i></div>
@@ -112,49 +105,41 @@
112
105
  <p>Despliega IAToolkit en tus propios servidores. Tus datos y consultas nunca son compartidos con terceros, garantizando la máxima confidencialidad.</p>
113
106
  </div>
114
107
  </div>
115
-
116
108
  </div>
117
109
  </div>
118
110
  </section>
119
111
 
120
112
  <!-- 3.5 Sobre el Autor -->
121
113
  <section class="author-section py-5">
122
- <div class="container">
123
- <div class="author-card p-4">
124
- <div class="row align-items-center g-4">
125
- <!-- Columna para la Imagen -->
126
- <div class="col-md-2 text-center">
127
- <img src="{{ url_for('static', filename='images/fernando.jpeg') }}" alt="Foto de Fernando Libedinsky" class="img-fluid rounded-circle" style="max-width: 120px;">
128
- </div>
129
- <!-- Columna para el Texto -->
130
- <div class="col-md-10">
131
- <div class="d-flex flex-wrap align-items-center mb-2">
132
- <h5 class="mb-0 me-3" style="color: var(--brand-primary-color);">Sobre el autor</h5>
133
- <a href="https://www.linkedin.com/in/fernandolibedinsky" target="_blank" rel="noopener" class="author-linkedin ms-auto">
134
- <i class="bi bi-linkedin me-1"></i> LinkedIn
135
- </a>
136
- </div>
137
- <p class="author-bio mb-0">
138
- Soy <strong>Fernando Libedinsky</strong>, ingeniero de software y creador de <strong>IAToolkit</strong>.
139
- <br>Tras una extensa trayectoria en el desarrollo de software, sigo movido por la misma curiosidad que me llevó a programar por primera vez: aprender, explorar y construir cosas nuevas.
140
- <br>IAToolkit es la continuación de ese impulso, una plataforma creada para conectar rapidamente empresas con la inteligencia artificial.
141
- </p>
114
+ <div class="container">
115
+ <div class="author-card p-4">
116
+ <div class="row align-items-center g-4">
117
+ <div class="col-md-2 text-center">
118
+ <img src="{{ url_for('static', filename='images/fernando.jpeg') }}" alt="Foto de Fernando Libedinsky" class="img-fluid rounded-circle" style="max-width: 120px;">
119
+ </div>
120
+ <div class="col-md-10">
121
+ <div class="d-flex flex-wrap align-items-center mb-2">
122
+ <h5 class="mb-0 me-3">Sobre el autor</h5>
123
+ <a href="https://www.linkedin.com/in/fernandolibedinsky" target="_blank" rel="noopener" class="author-linkedin ms-auto">
124
+ <i class="bi bi-linkedin me-1"></i> LinkedIn
125
+ </a>
142
126
  </div>
127
+ <p class="author-bio mb-0">
128
+ Soy <strong>Fernando Libedinsky</strong>, ingeniero de software y creador de <strong>IAToolkit</strong>.
129
+ <br>Tras una extensa trayectoria en el desarrollo de software, sigo movido por la misma curiosidad que me llevó a programar por primera vez: aprender, explorar y construir cosas nuevas.
130
+ <br>IAToolkit es la continuación de ese impulso, una plataforma creada para conectar rapidamente empresas con la IA.
131
+ </p>
143
132
  </div>
144
133
  </div>
145
134
  </div>
146
- </section>
147
-
135
+ </div>
136
+ </section>
148
137
 
149
- <!-- 4. Footer (sin cambios) -->
138
+ <!-- 4. Footer -->
150
139
  <footer class="landing-footer">
151
140
  <div class="container">
152
- &copy; IAToolkit - Proyecto Open Source
141
+ &copy; 2024 IAToolkit - Proyecto Open Source
153
142
  </div>
154
143
  </footer>
155
-
156
- {% endblock %}
157
-
158
- {% block scripts %}
159
- <!-- No se necesita JavaScript aquí para la funcionalidad de la página -->
144
+ </div>
160
145
  {% endblock %}