django-lucy-assist 1.2.6__py3-none-any.whl → 1.2.7__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.
@@ -1,425 +1,179 @@
1
1
  {% load static %}
2
2
 
3
3
  {# Composant Lucy Assist - Sidebar Chatbot #}
4
- {# Ce template est autonome et inclut ses propres ressources CSS/JS #}
4
+ {# 100% autonome : CSS, JS vanilla et icones SVG inline, zero dependance externe #}
5
5
 
6
6
  {% if lucy_assist_enabled %}
7
- {# CSS Lucy Assist #}
8
7
  <link href="{% static 'lucy_assist/css/lucy-assist.css' %}" rel="stylesheet">
9
8
 
10
- {# Script Lucy Assist - doit etre charge avant d'utiliser le composant Alpine #}
11
- <script src="{% static 'lucy_assist/js/lucy-assist.js' %}"></script>
12
-
13
- <div x-data="lucyAssist()" x-init="init()" @keydown.window="handleKeydown($event)">
14
- {# Bouton flottant - masque quand le chat est ouvert #}
15
- <button
16
- x-show="!isOpen"
17
- @click="toggleSidebar()"
18
- class="lucy-float-btn"
19
- x-bind:class="{ 'animate-pulse': hasNewMessage }"
20
- title="Ouvrir Lucy (Ctrl+K)"
21
- >
22
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
23
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z" />
9
+ <div id="lucy-assist-root">
10
+ {# Bouton flottant #}
11
+ <button id="lucy-float-btn" class="lucy-float-btn" title="Ouvrir Lucy (Ctrl+K)">
12
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
13
+ <path stroke-linecap="round" stroke-linejoin="round" d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z"/>
24
14
  </svg>
25
15
  </button>
26
16
 
27
17
  {# Sidebar #}
28
- <div
29
- x-show="isOpen"
30
- x-transition:enter="transition ease-out duration-300"
31
- x-transition:enter-start="transform translate-x-full"
32
- x-transition:enter-end="transform translate-x-0"
33
- x-transition:leave="transition ease-in duration-200"
34
- x-transition:leave-start="transform translate-x-0"
35
- x-transition:leave-end="transform translate-x-full"
36
- class="lucy-sidebar"
37
- x-bind:class="{ 'hidden': !isOpen, 'expanded': isExpanded }"
38
- style="display: none;"
39
- x-cloak
40
- >
18
+ <div id="lucy-sidebar" class="lucy-sidebar hidden" style="display:none;">
41
19
  {# Header #}
42
20
  <div class="lucy-header">
43
21
  <span class="lucy-header-title">Lucy Assist</span>
44
22
  <div class="lucy-header-actions">
45
- {# Bouton Agrandir/Reduire #}
46
- <button
47
- @click="toggleExpanded()"
48
- class="lucy-header-btn"
49
- x-bind:class="{ 'active': isExpanded }"
50
- x-bind:title="isExpanded ? 'Reduire la fenetre' : 'Agrandir la fenetre'"
51
- >
52
- <i class="fa-solid" x-bind:class="isExpanded ? 'fa-compress' : 'fa-expand'"></i>
23
+ <button id="lucy-btn-expand" class="lucy-header-btn" title="Agrandir/Reduire">
24
+ <svg class="lucy-icon-expand" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5v-4m0 4h-4m4 0l-5-5"/></svg>
53
25
  </button>
54
-
55
- {# Bouton Historique #}
56
- <button
57
- @click="showHistory = !showHistory; showDoc = false"
58
- class="lucy-header-btn"
59
- x-bind:class="{ 'active': showHistory }"
60
- title="Historique des conversations"
61
- >
62
- <i class="fa-solid fa-clock-rotate-left"></i>
26
+ <button id="lucy-btn-history" class="lucy-header-btn" title="Historique">
27
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
63
28
  </button>
64
-
65
- {# Bouton Nouvelle conversation #}
66
- <button
67
- @click="newConversation()"
68
- class="lucy-header-btn"
69
- title="Nouvelle conversation"
70
- >
71
- <i class="fa-solid fa-plus"></i>
29
+ <button id="lucy-btn-new" class="lucy-header-btn" title="Nouvelle conversation">
30
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/></svg>
72
31
  </button>
73
-
74
- {# Bouton Documentation #}
75
- <button
76
- @click="showDoc = !showDoc; showHistory = false"
77
- class="lucy-header-btn"
78
- x-bind:class="{ 'active': showDoc }"
79
- title="Documentation"
80
- >
81
- <i class="fa-solid fa-book"></i>
32
+ <button id="lucy-btn-doc" class="lucy-header-btn" title="Documentation">
33
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>
82
34
  </button>
83
-
84
- {# Bouton Fermer #}
85
- <button
86
- @click="closeSidebar()"
87
- class="lucy-header-btn"
88
- title="Fermer (Echap)"
89
- >
90
- <i class="fa-solid fa-xmark"></i>
35
+ <button id="lucy-btn-close" class="lucy-header-btn" title="Fermer (Echap)">
36
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/></svg>
91
37
  </button>
92
38
  </div>
93
39
  </div>
94
40
 
95
- {# Indicateur de credits #}
41
+ {# Credits #}
96
42
  <div class="lucy-credits-bar">
97
- <span>
98
- <i class="fa-solid fa-coins"></i>
99
- <span x-text="formatTokens(tokensDisponibles)"></span> credits
100
- </span>
101
- <button
102
- x-show="tokensDisponibles < 100000"
103
- @click="showBuyCredits = true"
104
- class="lucy-btn-warning"
105
- >
106
- <i class="fa-solid fa-cart-plus"></i>
107
- Acheter
108
- </button>
43
+ <span><span id="lucy-tokens">0</span> credits</span>
44
+ <button id="lucy-btn-buy-credits" class="lucy-btn-warning" style="display:none;">🛒 Acheter</button>
109
45
  </div>
110
46
 
111
47
  {# Contenu principal #}
112
48
  <div class="lucy-content">
113
49
  {# Vue Historique #}
114
- <template x-if="showHistory">
115
- <div class="lucy-history">
116
- <h3>Historique des conversations</h3>
117
- <template x-if="conversations.length === 0">
118
- <p class="lucy-history-empty">Aucune conversation</p>
119
- </template>
120
- <div class="lucy-history-list">
121
- <template x-for="conv in conversations" :key="conv.id">
122
- <div
123
- @click="loadConversation(conv.id)"
124
- class="lucy-history-item"
125
- x-bind:class="{ 'active': currentConversationId === conv.id }"
126
- >
127
- <div class="lucy-history-item-title" x-text="conv.titre"></div>
128
- <div class="lucy-history-item-meta">
129
- <span x-text="formatDate(conv.created_date)"></span>
130
- <span style="margin-left: 0.5rem;">
131
- <i class="fa-solid fa-coins"></i>
132
- <span x-text="conv.total_tokens"></span> tokens | <span x-text="formatTokenCost(conv.total_tokens)"></span>
133
- </span>
134
- </div>
135
- <button
136
- @click.stop="deleteConversation(conv.id)"
137
- class="lucy-btn-delete"
138
- >
139
- <i class="fa-solid fa-trash"></i> Supprimer
140
- </button>
141
- </div>
142
- </template>
143
- </div>
144
- </div>
145
- </template>
50
+ <div id="lucy-view-history" class="lucy-history" style="display:none;">
51
+ <h3>Historique des conversations</h3>
52
+ <div id="lucy-history-list" class="lucy-history-list"></div>
53
+ </div>
146
54
 
147
55
  {# Vue Documentation #}
148
- <template x-if="showDoc">
149
- <div class="lucy-doc">
150
- {% include "lucy_assist/partials/documentation_content.html" %}
151
- </div>
152
- </template>
56
+ <div id="lucy-view-doc" class="lucy-doc" style="display:none;">
57
+ {% include "lucy_assist/partials/documentation_content.html" %}
58
+ </div>
153
59
 
154
60
  {# Vue Chat #}
155
- <template x-if="!showHistory && !showDoc">
156
- <div class="lucy-chat">
157
- {# Zone de messages #}
158
- <div
159
- x-ref="messagesContainer"
160
- class="lucy-messages"
161
- >
162
- {# Message de bienvenue / Suggestions #}
163
- <template x-if="messages.length === 0">
164
- <div class="lucy-welcome">
165
- <div class="lucy-welcome-icon">
166
- <img src="{% static 'lucy_assist/image/icon-lucy.png' %}" alt="Lucy">
167
- </div>
168
- <h3>Bonjour ! Je suis Lucy</h3>
169
- <p>Comment puis-je vous aider aujourd'hui ?</p>
170
-
171
- {# Suggestions #}
172
- <div class="lucy-suggestions">
173
- <template x-for="suggestion in suggestions" :key="suggestion">
174
- <button
175
- @click="sendMessage(suggestion)"
176
- class="lucy-suggestion-btn"
177
- >
178
- <i class="fa-solid fa-lightbulb"></i>
179
- <span x-text="suggestion"></span>
180
- </button>
181
- </template>
182
- </div>
183
- </div>
184
- </template>
185
-
186
- {# Messages #}
187
- <template x-for="(msg, index) in messages" :key="msg.id || index">
188
- <div
189
- class="lucy-message"
190
- x-bind:class="msg.repondant === 'UTILISATEUR' ? 'user' : 'bot'"
191
- >
192
- <div class="lucy-message-avatar">
193
- <template x-if="msg.repondant === 'UTILISATEUR'">
194
- {% if lucy_assist_config.avatar_url %}
195
- <img src="{{ lucy_assist_config.avatar_url }}" alt="Utilisateur">
196
- {% else %}
197
- <i class="fa-solid fa-user"></i>
198
- {% endif %}
199
- </template>
200
- <template x-if="msg.repondant !== 'UTILISATEUR'">
201
- <img src="{% static 'lucy_assist/image/icon-lucy.png' %}" alt="Lucy">
202
- </template>
203
- </div>
204
- <div class="lucy-message-content">
205
- <div class="lucy-message-bubble">
206
- <template x-if="msg.contenu">
207
- <span x-html="formatMessage(msg.contenu)"></span>
208
- </template>
209
- <template x-if="!msg.contenu">
210
- <span class="lucy-loading-dots">
211
- <span></span>
212
- <span></span>
213
- <span></span>
214
- </span>
215
- </template>
216
- </div>
217
- <div class="lucy-message-time" x-text="formatTime(msg.created_date)"></div>
218
- </div>
219
- </div>
220
- </template>
221
- </div>
222
-
223
- {# Bouton Feedback - Lucy n'a pas compris #}
224
- <template x-if="lucyDidNotUnderstand && messages.length > 0">
225
- <div class="lucy-feedback-bar info">
226
- <button
227
- @click="openFeedback()"
228
- class="lucy-feedback-btn info"
229
- >
230
- <i class="fa-solid fa-headset"></i>
231
- Contacter le chef de projet Revolucy
232
- </button>
61
+ <div id="lucy-view-chat" class="lucy-chat">
62
+ <div id="lucy-messages" class="lucy-messages"
63
+ data-avatar-url="{% if lucy_assist_config.avatar_url %}{{ lucy_assist_config.avatar_url }}{% endif %}"
64
+ data-lucy-icon="{% static 'lucy_assist/image/icon-lucy.png' %}">
65
+ {# Bienvenue #}
66
+ <div id="lucy-welcome" class="lucy-welcome">
67
+ <div class="lucy-welcome-icon">
68
+ <img src="{% static 'lucy_assist/image/icon-lucy.png' %}" alt="Lucy">
233
69
  </div>
234
- </template>
70
+ <h3>Bonjour ! Je suis Lucy</h3>
71
+ <p>Comment puis-je vous aider aujourd'hui ?</p>
72
+ <div id="lucy-suggestions" class="lucy-suggestions"></div>
73
+ </div>
74
+ </div>
235
75
 
236
- {# Bouton Feedback - Erreur technique #}
237
- <template x-if="hasError && !lucyDidNotUnderstand && messages.length > 0">
238
- <div class="lucy-feedback-bar warning">
239
- <button
240
- @click="openFeedback()"
241
- class="lucy-feedback-btn warning"
242
- >
243
- <i class="fa-solid fa-comment-medical"></i>
244
- Souhaites-tu que j'informe Revolucy ?
245
- </button>
246
- </div>
247
- </template>
76
+ {# Feedback bars #}
77
+ <div id="lucy-feedback-contact" class="lucy-feedback-bar info" style="display:none;">
78
+ <button id="lucy-btn-feedback-contact" class="lucy-feedback-btn info">
79
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z"/></svg>
80
+ Contacter le chef de projet Revolucy
81
+ </button>
82
+ </div>
83
+ <div id="lucy-feedback-error" class="lucy-feedback-bar warning" style="display:none;">
84
+ <button id="lucy-btn-feedback-error" class="lucy-feedback-btn warning">
85
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"/></svg>
86
+ Souhaites-tu que j'informe Revolucy ?
87
+ </button>
88
+ </div>
248
89
 
249
- {# Zone de saisie #}
250
- <div class="lucy-input-area">
251
- <div class="lucy-input-wrapper">
252
- <textarea
253
- x-model="currentMessage"
254
- x-ref="messageInput"
255
- x-bind:disabled="isLoading"
256
- @keydown.ctrl.enter.prevent="sendCurrentMessage()"
257
- @keydown.meta.enter.prevent="sendCurrentMessage()"
258
- placeholder="Tapez votre message..."
259
- class="lucy-input"
260
- rows="1"
261
- @input="$el.style.height = 'auto'; $el.style.height = Math.min($el.scrollHeight, 128) + 'px'"
262
- ></textarea>
263
- <button
264
- type="button"
265
- @click="sendCurrentMessage()"
266
- x-bind:disabled="isLoading || !currentMessage.trim()"
267
- class="lucy-send-btn"
268
- >
269
- <i class="fa-solid fa-paper-plane"></i>
270
- </button>
271
- </div>
272
- <p class="lucy-input-hint">Ctrl+Entree pour envoyer</p>
90
+ {# Zone de saisie #}
91
+ <div class="lucy-input-area">
92
+ <div class="lucy-input-wrapper">
93
+ <textarea id="lucy-input" placeholder="Tapez votre message..." class="lucy-input" rows="1"></textarea>
94
+ <button id="lucy-btn-send" class="lucy-send-btn" disabled>
95
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"/></svg>
96
+ </button>
273
97
  </div>
98
+ <p class="lucy-input-hint">Ctrl+Entree pour envoyer</p>
274
99
  </div>
275
- </template>
100
+ </div>
276
101
  </div>
277
102
  </div>
278
103
 
279
104
  {# Modal Achat de credits #}
280
- <template x-if="showBuyCredits">
281
- <div class="lucy-modal-overlay" @keydown.escape="showBuyCredits = false">
282
- <div class="lucy-modal">
283
- <div class="lucy-modal-header">
284
- <i class="fa-solid fa-cart-plus"></i>
285
- Acheter des credits
105
+ <div id="lucy-modal-buy" class="lucy-modal-overlay" style="display:none;">
106
+ <div class="lucy-modal">
107
+ <div class="lucy-modal-header">🛒 Acheter des credits</div>
108
+ <div class="lucy-modal-body">
109
+ <div class="lucy-form-group">
110
+ <label class="lucy-form-label">Montant (EUR HT)</label>
111
+ <input id="lucy-buy-amount" type="number" value="10" min="10" step="10" class="lucy-form-input"/>
286
112
  </div>
287
-
288
- <div class="lucy-modal-body">
289
- <div class="lucy-form-group">
290
- <label class="lucy-form-label">Montant (EUR HT)</label>
291
- <input
292
- type="number"
293
- x-model.number="buyAmount"
294
- min="10"
295
- step="10"
296
- class="lucy-form-input"
297
- />
298
- </div>
299
-
300
- <div class="lucy-stats-box">
301
- <div class="lucy-stats-row">
302
- <span class="lucy-stats-label">Tokens a recevoir</span>
303
- <span class="lucy-stats-value" x-text="formatTokens(calculateTokens(buyAmount))"></span>
304
- </div>
305
- <div class="lucy-stats-row">
306
- <span class="lucy-stats-label">Conversations estimees</span>
307
- <span class="lucy-stats-value" x-text="Math.floor(calculateTokens(buyAmount) / 2000)"></span>
308
- </div>
113
+ <div class="lucy-stats-box">
114
+ <div class="lucy-stats-row">
115
+ <span class="lucy-stats-label">Tokens a recevoir</span>
116
+ <span id="lucy-buy-tokens" class="lucy-stats-value">1.0M</span>
309
117
  </div>
310
-
311
- <div class="lucy-info-box">
312
- <i class="fa-solid fa-info-circle"></i>
313
- <span>10 EUR = 1 million de tokens = ~500 conversations</span>
118
+ <div class="lucy-stats-row">
119
+ <span class="lucy-stats-label">Conversations estimees</span>
120
+ <span id="lucy-buy-convs" class="lucy-stats-value">500</span>
314
121
  </div>
315
122
  </div>
316
-
317
- <div class="lucy-modal-footer">
318
- <button @click="showBuyCredits = false" class="lucy-btn lucy-btn-ghost">
319
- Annuler
320
- </button>
321
- <button @click="buyCredits()" class="lucy-btn lucy-btn-primary" x-bind:disabled="buyAmount < 10">
322
- <i class="fa-solid fa-credit-card"></i>
323
- Acheter
324
- </button>
325
- </div>
123
+ <div class="lucy-info-box">ℹ️ <span>10 EUR = 1 million de tokens = ~500 conversations</span></div>
124
+ </div>
125
+ <div class="lucy-modal-footer">
126
+ <button id="lucy-buy-cancel" class="lucy-btn lucy-btn-ghost">Annuler</button>
127
+ <button id="lucy-buy-confirm" class="lucy-btn lucy-btn-primary">💳 Acheter</button>
326
128
  </div>
327
129
  </div>
328
- </template>
130
+ </div>
329
131
 
330
132
  {# Modal Feedback #}
331
- <template x-if="showFeedback">
332
- <div class="lucy-modal-overlay" @keydown.escape="closeFeedback()">
333
- <div class="lucy-modal">
334
- <div class="lucy-modal-header">
335
- <i class="fa-solid fa-comment-medical" style="color: var(--lucy-warning);"></i>
336
- Signaler un probleme
337
- </div>
338
-
339
- <div class="lucy-modal-body">
340
- <div class="lucy-info-box">
341
- <i class="fa-solid fa-info-circle"></i>
342
- <span>Votre conversation sera envoyée à l'équipe Revolucy pour analyse et amélioration de Lucy Assist.</span>
343
- </div>
344
-
345
- <div class="lucy-form-group">
346
- <label class="lucy-form-label">Description du probleme (optionnel)</label>
347
- <textarea
348
- x-model="feedbackDescription"
349
- class="lucy-form-textarea"
350
- placeholder="Decrivez ce qui n'a pas fonctionne ou ce que vous attendiez..."
351
- ></textarea>
352
- </div>
353
- </div>
354
-
355
- <div class="lucy-modal-footer">
356
- <button @click="closeFeedback()" class="lucy-btn lucy-btn-ghost" x-bind:disabled="feedbackSending">
357
- Annuler
358
- </button>
359
- <button
360
- @click="sendFeedback()"
361
- class="lucy-btn lucy-btn-warning-solid"
362
- x-bind:disabled="feedbackSending"
363
- >
364
- <template x-if="!feedbackSending">
365
- <span>
366
- <i class="fa-solid fa-paper-plane"></i>
367
- Envoyer le feedback
368
- </span>
369
- </template>
370
- <template x-if="feedbackSending">
371
- <span class="lucy-spinner"></span>
372
- </template>
373
- </button>
133
+ <div id="lucy-modal-feedback" class="lucy-modal-overlay" style="display:none;">
134
+ <div class="lucy-modal">
135
+ <div class="lucy-modal-header">⚠️ Signaler un probleme</div>
136
+ <div class="lucy-modal-body">
137
+ <div class="lucy-info-box">ℹ️ <span>Votre conversation sera envoyée à l'équipe Revolucy pour analyse et amélioration de Lucy Assist.</span></div>
138
+ <div class="lucy-form-group">
139
+ <label class="lucy-form-label">Description du probleme (optionnel)</label>
140
+ <textarea id="lucy-feedback-desc" class="lucy-form-textarea" placeholder="Decrivez ce qui n'a pas fonctionne ou ce que vous attendiez..."></textarea>
374
141
  </div>
375
142
  </div>
143
+ <div class="lucy-modal-footer">
144
+ <button id="lucy-feedback-cancel" class="lucy-btn lucy-btn-ghost">Annuler</button>
145
+ <button id="lucy-feedback-confirm" class="lucy-btn lucy-btn-warning-solid">
146
+ <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" style="display:inline-block;vertical-align:middle;margin-right:4px"><path stroke-linecap="round" stroke-linejoin="round" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"/></svg>
147
+ Envoyer le feedback
148
+ </button>
149
+ </div>
376
150
  </div>
377
- </template>
151
+ </div>
378
152
 
379
- {# Guide interactif (premier lancement) #}
380
- <template x-if="showGuide">
381
- <div class="lucy-guide-overlay">
382
- <div
383
- x-show="guideStep === 1"
384
- class="lucy-guide-modal center"
385
- >
386
- <h3 class="lucy-guide-title">
387
- <i class="fa-solid fa-hand-wave"></i>
388
- Bienvenue sur Lucy Assist !
389
- </h3>
390
- <p class="lucy-guide-text">
391
- Je suis votre assistant intelligent.<br>Je peux vous aider à :
392
- </p>
393
- <ul class="lucy-guide-list">
394
- <li>Naviguer dans l'application</li>
395
- <li>Rechercher des informations</li>
396
- <li>Créer et modifier des elements</li>
397
- <li>Comprendre les fonctionnalités</li>
398
- </ul>
399
- <div class="lucy-guide-actions">
400
- <button @click="skipGuide()" class="lucy-btn lucy-btn-ghost">
401
- Passer
402
- </button>
403
- <button @click="nextGuideStep()" class="lucy-btn lucy-btn-primary">
404
- Suivant
405
- </button>
406
- </div>
153
+ {# Guide interactif #}
154
+ <div id="lucy-guide-overlay" class="lucy-guide-overlay" style="display:none;">
155
+ <div id="lucy-guide-step1" class="lucy-guide-modal center">
156
+ <h3 class="lucy-guide-title">👋 Bienvenue sur Lucy Assist !</h3>
157
+ <p class="lucy-guide-text">Je suis votre assistant intelligent.<br>Je peux vous aider à :</p>
158
+ <ul class="lucy-guide-list">
159
+ <li>Naviguer dans l'application</li>
160
+ <li>Rechercher des informations</li>
161
+ <li>Créer et modifier des elements</li>
162
+ <li>Comprendre les fonctionnalités</li>
163
+ </ul>
164
+ <div class="lucy-guide-actions">
165
+ <button id="lucy-guide-skip" class="lucy-btn lucy-btn-ghost">Passer</button>
166
+ <button id="lucy-guide-next" class="lucy-btn lucy-btn-primary">Suivant</button>
407
167
  </div>
408
-
409
- <div
410
- x-show="guideStep === 2"
411
- class="lucy-guide-modal bottom-right"
412
- >
413
- <p class="lucy-guide-text">
414
- Cliquez sur ce bouton ou utilisez <span class="lucy-kbd">Ctrl+K</span> pour ouvrir Lucy Assist a tout moment.
415
- </p>
416
- <div class="lucy-guide-actions">
417
- <button @click="finishGuide()" class="lucy-btn lucy-btn-primary">
418
- Compris !
419
- </button>
420
- </div>
168
+ </div>
169
+ <div id="lucy-guide-step2" class="lucy-guide-modal bottom-right" style="display:none;">
170
+ <p class="lucy-guide-text">Cliquez sur ce bouton ou utilisez <span class="lucy-kbd">Ctrl+K</span> pour ouvrir Lucy Assist a tout moment.</p>
171
+ <div class="lucy-guide-actions">
172
+ <button id="lucy-guide-finish" class="lucy-btn lucy-btn-primary">Compris !</button>
421
173
  </div>
422
174
  </div>
423
- </template>
175
+ </div>
424
176
  </div>
177
+
178
+ <script src="{% static 'lucy_assist/js/lucy-assist.js' %}"></script>
425
179
  {% endif %}
@@ -1,16 +1,14 @@
1
- {# Contenu de la documentation Lucy Assist #}
1
+ {# Contenu de la documentation Lucy Assist - 100% autonome, sans Font Awesome #}
2
2
 
3
3
  <div class="prose prose-sm max-w-none">
4
4
  <h3 class="text-lg font-bold mb-4">
5
- <i class="fa-solid fa-book mr-2 text-primary"></i>
6
- Guide Lucy
5
+ 📖 Guide Lucy
7
6
  </h3>
8
7
 
9
8
  <div class="collapse collapse-arrow bg-base-200 mb-2">
10
9
  <input type="checkbox" checked />
11
10
  <div class="collapse-title font-medium">
12
- <i class="fa-solid fa-compass mr-2"></i>
13
- Aide contextuelle
11
+ 🧭 Aide contextuelle
14
12
  </div>
15
13
  <div class="collapse-content text-sm">
16
14
  <p>Lucy détecte automatiquement la page où vous vous trouvez pour vous proposer une aide ciblée.</p>
@@ -20,8 +18,7 @@
20
18
  <div class="collapse collapse-arrow bg-base-200 mb-2">
21
19
  <input type="checkbox" />
22
20
  <div class="collapse-title font-medium">
23
- <i class="fa-solid fa-search mr-2"></i>
24
- Recherche intelligente
21
+ 🔍 Recherche intelligente
25
22
  </div>
26
23
  <div class="collapse-content text-sm">
27
24
  <p>Trouvez rapidement n'importe quel élément en posant simplement la question.</p>
@@ -32,8 +29,7 @@
32
29
  <div class="collapse collapse-arrow bg-base-200 mb-2">
33
30
  <input type="checkbox" />
34
31
  <div class="collapse-title font-medium">
35
- <i class="fa-solid fa-plus-circle mr-2"></i>
36
- Création assistée
32
+ Création assistée
37
33
  </div>
38
34
  <div class="collapse-content text-sm">
39
35
  <p>Créez de nouveaux éléments en discutant avec Lucy qui vous guide étape par étape.</p>
@@ -44,8 +40,7 @@
44
40
  <div class="collapse collapse-arrow bg-base-200 mb-2">
45
41
  <input type="checkbox" />
46
42
  <div class="collapse-title font-medium">
47
- <i class="fa-solid fa-bug mr-2"></i>
48
- Analyse de bugs
43
+ 🐛 Analyse de bugs
49
44
  </div>
50
45
  <div class="collapse-content text-sm">
51
46
  <p>Signalez un problème et Lucy analysera pour détecter d'éventuels bugs.</p>
@@ -56,8 +51,7 @@
56
51
  <div class="collapse collapse-arrow bg-base-200 mb-2">
57
52
  <input type="checkbox" />
58
53
  <div class="collapse-title font-medium">
59
- <i class="fa-solid fa-keyboard mr-2"></i>
60
- Raccourcis clavier
54
+ ⌨️ Raccourcis clavier
61
55
  </div>
62
56
  <div class="collapse-content text-sm">
63
57
  <ul class="list-none space-y-2">
@@ -80,7 +74,6 @@
80
74
  <div class="divider"></div>
81
75
 
82
76
  <h4 class="font-bold mb-2">
83
- <i class="fa-solid fa-coins mr-2 text-warning"></i>
84
77
  Tarification
85
78
  </h4>
86
79
 
@@ -101,7 +94,6 @@
101
94
  </div>
102
95
 
103
96
  <div class="alert alert-info mt-4 text-xs">
104
- <i class="fa-solid fa-info-circle"></i>
105
- <span>Le nombre de tokens utilisés dépend de la complexité de vos questions et des réponses générées.</span>
97
+ ℹ️ <span>Le nombre de tokens utilisés dépend de la complexité de vos questions et des réponses générées.</span>
106
98
  </div>
107
99
  </div>