@clubmed/usg-chat-ui 1.2.7 → 1.3.0

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 (60) hide show
  1. package/README.md +36 -0
  2. package/assets/style.css +1 -1
  3. package/chunks/react.esm.js +2012 -1997
  4. package/chunks/react.esm.js.map +1 -1
  5. package/chunks/vi.2VT5v0um.js +1 -0
  6. package/config/chatLabels.d.ts +43 -0
  7. package/config/chatLabels.js +2 -0
  8. package/config/chatLabels.js.map +1 -0
  9. package/contexts/ChatLabelsContext.d.ts +13 -0
  10. package/contexts/ChatLabelsContext.js +24 -0
  11. package/contexts/ChatLabelsContext.js.map +1 -0
  12. package/contexts/ChatLabelsContext.test.d.ts +1 -0
  13. package/contexts/ChatLabelsContext.test.js +23 -0
  14. package/contexts/ChatLabelsContext.test.js.map +1 -0
  15. package/molecules/AiElements/Branch.js +45 -44
  16. package/molecules/AiElements/Branch.js.map +1 -1
  17. package/molecules/AiElements/PromptInput.js +60 -58
  18. package/molecules/AiElements/PromptInput.js.map +1 -1
  19. package/molecules/RichText/useCollaboration.test.js +1 -1
  20. package/organisms/canvas/CanvasLayout.d.ts +2 -1
  21. package/organisms/canvas/CanvasLayout.js +1249 -1248
  22. package/organisms/canvas/CanvasLayout.js.map +1 -1
  23. package/organisms/chat/Chat.d.ts +7 -1
  24. package/organisms/chat/Chat.js +67 -67
  25. package/organisms/chat/Chat.js.map +1 -1
  26. package/organisms/chat/ChatHeader.d.ts +4 -4
  27. package/organisms/chat/ChatHeader.js +41 -39
  28. package/organisms/chat/ChatHeader.js.map +1 -1
  29. package/organisms/chat/ChatHeader.test.d.ts +1 -0
  30. package/organisms/chat/ChatHeader.test.js +18 -0
  31. package/organisms/chat/ChatHeader.test.js.map +1 -0
  32. package/organisms/chat/ChatMessageList.d.ts +1 -2
  33. package/organisms/chat/ChatMessageList.js +73 -58
  34. package/organisms/chat/ChatMessageList.js.map +1 -1
  35. package/organisms/chat/ChatMessageList.test.d.ts +1 -0
  36. package/organisms/chat/ChatMessageList.test.js +67 -0
  37. package/organisms/chat/ChatMessageList.test.js.map +1 -0
  38. package/organisms/chat/ChatSettingsButton.d.ts +2 -0
  39. package/organisms/chat/ChatSettingsButton.js +24 -0
  40. package/organisms/chat/ChatSettingsButton.js.map +1 -0
  41. package/organisms/chat/ChatSettingsButton.test.d.ts +1 -0
  42. package/organisms/chat/ChatSettingsButton.test.js +16 -0
  43. package/organisms/chat/ChatSettingsButton.test.js.map +1 -0
  44. package/organisms/chat/ConversationSidebar.js +44 -43
  45. package/organisms/chat/ConversationSidebar.js.map +1 -1
  46. package/organisms/chat/MessageActions.js +104 -103
  47. package/organisms/chat/MessageActions.js.map +1 -1
  48. package/organisms/chat/MessageRenderers.js +1 -1
  49. package/organisms/chat/SidebarToggleButton.js +9 -7
  50. package/organisms/chat/SidebarToggleButton.js.map +1 -1
  51. package/organisms/chat/hooks/useChat.d.ts +1 -1
  52. package/organisms/chat/hooks/useChat.js +83 -83
  53. package/organisms/chat/hooks/useChat.js.map +1 -1
  54. package/package.json +1 -1
  55. package/utils/interpolate.d.ts +5 -0
  56. package/utils/interpolate.js +13 -0
  57. package/utils/interpolate.js.map +1 -0
  58. package/utils/interpolate.test.d.ts +1 -0
  59. package/utils/interpolate.test.js +21 -0
  60. package/utils/interpolate.test.js.map +1 -0
@@ -1,26 +1,27 @@
1
1
  "use client";
2
- import { jsxs as t, Fragment as f, jsx as e } from "react/jsx-runtime";
3
- import { useState as a } from "react";
4
- import { cn as s } from "../../utils/cn.js";
5
- import { useToast as L } from "../../molecules/Notifications/useToast.js";
6
- import { useCanvasStore as V } from "../../utils/canvas-store.js";
7
- import { useChatApiClient as q } from "../../contexts/ChatContext.js";
8
- import { Modal as B } from "../../molecules/Modals/Modal.js";
9
- import { Button as N } from "../../molecules/Buttons/Button.js";
10
- import { Textarea as G } from "../../molecules/Textareas/Textarea.js";
11
- import { C as P } from "../../chunks/check.js";
12
- import { C as U } from "../../chunks/copy.js";
13
- import { R as Z } from "../../chunks/refresh-cw.js";
14
- import { M as D } from "../../chunks/maximize-2.js";
15
- import { c as F } from "../../chunks/createLucideIcon.js";
16
- import { X } from "../../chunks/x.js";
2
+ import { jsxs as t, Fragment as p, jsx as e } from "react/jsx-runtime";
3
+ import { useState as i } from "react";
4
+ import { cn as a } from "../../utils/cn.js";
5
+ import { useToast as P } from "../../molecules/Notifications/useToast.js";
6
+ import { useCanvasStore as Z } from "../../utils/canvas-store.js";
7
+ import { useChatApiClient as X } from "../../contexts/ChatContext.js";
8
+ import { Modal as $ } from "../../molecules/Modals/Modal.js";
9
+ import { Button as R } from "../../molecules/Buttons/Button.js";
10
+ import { Textarea as J } from "../../molecules/Textareas/Textarea.js";
11
+ import { useChatLabels as K } from "../../contexts/ChatLabelsContext.js";
12
+ import { C as Q } from "../../chunks/check.js";
13
+ import { C as W } from "../../chunks/copy.js";
14
+ import { R as Y } from "../../chunks/refresh-cw.js";
15
+ import { M as ee } from "../../chunks/maximize-2.js";
16
+ import { c as _ } from "../../chunks/createLucideIcon.js";
17
+ import { X as re } from "../../chunks/x.js";
17
18
  /**
18
19
  * @license lucide-react v0.545.0 - ISC
19
20
  *
20
21
  * This source code is licensed under the ISC license.
21
22
  * See the LICENSE file in the root directory of this source tree.
22
23
  */
23
- const $ = [
24
+ const te = [
24
25
  ["path", { d: "M17 14V2", key: "8ymqnk" }],
25
26
  [
26
27
  "path",
@@ -29,14 +30,14 @@ const $ = [
29
30
  key: "m61m77"
30
31
  }
31
32
  ]
32
- ], y = F("thumbs-down", $);
33
+ ], z = _("thumbs-down", te);
33
34
  /**
34
35
  * @license lucide-react v0.545.0 - ISC
35
36
  *
36
37
  * This source code is licensed under the ISC license.
37
38
  * See the LICENSE file in the root directory of this source tree.
38
39
  */
39
- const J = [
40
+ const oe = [
40
41
  ["path", { d: "M7 10v12", key: "1qc93n" }],
41
42
  [
42
43
  "path",
@@ -45,80 +46,80 @@ const J = [
45
46
  key: "emmmcr"
46
47
  }
47
48
  ]
48
- ], M = F("thumbs-up", J);
49
- function ue({
50
- content: p,
51
- messageId: R,
52
- storyId: A,
49
+ ], T = _("thumbs-up", oe);
50
+ function ke({
51
+ content: b,
52
+ messageId: O,
53
+ storyId: S,
53
54
  onRegenerate: h,
54
- responseType: d,
55
- canvasData: c,
56
- className: z
55
+ responseType: c,
56
+ canvasData: u,
57
+ className: j
57
58
  }) {
58
- const [_, b] = a(!1), [o, O] = a(null), [S, u] = a(!1), [n, x] = a(null), [m, g] = a(""), [i, v] = a(!1), { toast: l } = L(), { openApiDocsCanvas: j } = V(), E = q(), I = async () => {
59
+ const [E, x] = i(!1), [o, I] = i(null), [U, m] = i(!1), [s, v] = i(null), [g, f] = i(""), [l, k] = i(!1), { toast: d } = P(), { openApiDocsCanvas: D } = Z(), H = X(), { get: n } = K(), w = n("messageCopyAriaLabel", "Copier le message"), C = n("messageRegenerateAriaLabel", "Régénérer la réponse"), N = n("messageOpenCanvasAriaLabel", "Ouvrir Canva"), y = n("messageThumbsUpAriaLabel", "Réponse utile"), L = n("messageThumbsDownAriaLabel", "Réponse non utile"), V = n("messageCloseFeedbackAriaLabel", "Fermer"), q = async () => {
59
60
  try {
60
- await navigator.clipboard.writeText(p), b(!0), l({
61
+ await navigator.clipboard.writeText(b), x(!0), d({
61
62
  title: "Copié",
62
63
  description: "Message copié dans le presse-papiers"
63
- }), setTimeout(() => b(!1), 2e3);
64
+ }), setTimeout(() => x(!1), 2e3);
64
65
  } catch (r) {
65
- console.error("Failed to copy:", r), l({
66
+ console.error("Failed to copy:", r), d({
66
67
  title: "Erreur",
67
68
  description: "Impossible de copier le message",
68
69
  variant: "destructive"
69
70
  });
70
71
  }
71
- }, T = () => {
72
- if (c && d === "api_answer") {
73
- const r = c;
74
- (r.answer || r.sources) && j({
75
- answer: r.answer || p,
72
+ }, B = () => {
73
+ if (u && c === "api_answer") {
74
+ const r = u;
75
+ (r.answer || r.sources) && D({
76
+ answer: r.answer || b,
76
77
  sources: r.sources || []
77
78
  });
78
79
  }
79
- }, k = (r) => {
80
- o || (x(r), u(!0));
81
- }, w = async (r) => {
82
- if (n) {
83
- v(!0);
80
+ }, M = (r) => {
81
+ o || (v(r), m(!0));
82
+ }, A = async (r) => {
83
+ if (s) {
84
+ k(!0);
84
85
  try {
85
- await E.submitFeedback({
86
- messageId: R,
87
- storyId: A,
88
- rating: n,
89
- comment: r ? m : void 0,
90
- responseType: d
91
- }), O(n), u(!1), g(""), l({
86
+ await H.submitFeedback({
87
+ messageId: O,
88
+ storyId: S,
89
+ rating: s,
90
+ comment: r ? g : void 0,
91
+ responseType: c
92
+ }), I(s), m(!1), f(""), d({
92
93
  title: "Merci !",
93
94
  description: "Votre feedback a été enregistré"
94
95
  });
95
- } catch (H) {
96
- console.error("Failed to submit feedback:", H), l({
96
+ } catch (G) {
97
+ console.error("Failed to submit feedback:", G), d({
97
98
  title: "Erreur",
98
99
  description: "Impossible d'enregistrer le feedback",
99
100
  variant: "destructive"
100
101
  });
101
102
  } finally {
102
- v(!1);
103
+ k(!1);
103
104
  }
104
105
  }
105
- }, C = () => {
106
- u(!1), x(null), g("");
106
+ }, F = () => {
107
+ m(!1), v(null), f("");
107
108
  };
108
- return /* @__PURE__ */ t(f, { children: [
109
- /* @__PURE__ */ t("div", { className: s("flex items-center gap-1.5 mt-3 pt-2 border-t border-border", z), children: [
109
+ return /* @__PURE__ */ t(p, { children: [
110
+ /* @__PURE__ */ t("div", { className: a("flex items-center gap-1.5 mt-3 pt-2 border-t border-border", j), children: [
110
111
  /* @__PURE__ */ e(
111
112
  "button",
112
113
  {
113
- onClick: I,
114
+ onClick: q,
114
115
  className: "group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background",
115
- title: "Copier le message",
116
- "aria-label": "Copier le message",
117
- children: _ ? /* @__PURE__ */ t(f, { children: [
118
- /* @__PURE__ */ e(P, { className: "h-3.5 w-3.5 text-positive-foreground" }),
116
+ title: w,
117
+ "aria-label": w,
118
+ children: E ? /* @__PURE__ */ t(p, { children: [
119
+ /* @__PURE__ */ e(Q, { className: "h-3.5 w-3.5 text-positive-foreground" }),
119
120
  /* @__PURE__ */ e("span", { className: "text-xs font-medium text-positive-foreground", children: "Copié" })
120
- ] }) : /* @__PURE__ */ t(f, { children: [
121
- /* @__PURE__ */ e(U, { className: "h-3.5 w-3.5" }),
121
+ ] }) : /* @__PURE__ */ t(p, { children: [
122
+ /* @__PURE__ */ e(W, { className: "h-3.5 w-3.5" }),
122
123
  /* @__PURE__ */ e("span", { className: "text-xs font-medium hidden sm:inline", children: "Copier" })
123
124
  ] })
124
125
  }
@@ -128,23 +129,23 @@ function ue({
128
129
  {
129
130
  onClick: h,
130
131
  className: "group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background",
131
- title: "Régénérer la réponse",
132
- "aria-label": "Régénérer la réponse",
132
+ title: C,
133
+ "aria-label": C,
133
134
  children: [
134
- /* @__PURE__ */ e(Z, { className: "h-3.5 w-3.5 group-hover:rotate-180 transition-transform duration-500" }),
135
+ /* @__PURE__ */ e(Y, { className: "h-3.5 w-3.5 group-hover:rotate-180 transition-transform duration-500" }),
135
136
  /* @__PURE__ */ e("span", { className: "text-xs font-medium hidden sm:inline", children: "Régénérer" })
136
137
  ]
137
138
  }
138
139
  ),
139
- d === "api_answer" && c && /* @__PURE__ */ t(
140
+ c === "api_answer" && u && /* @__PURE__ */ t(
140
141
  "button",
141
142
  {
142
- onClick: T,
143
+ onClick: B,
143
144
  className: "group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background",
144
- title: "Ouvrir Canva",
145
- "aria-label": "Ouvrir Canva",
145
+ title: N,
146
+ "aria-label": N,
146
147
  children: [
147
- /* @__PURE__ */ e(D, { className: "h-3.5 w-3.5 group-hover:scale-110 transition-transform duration-200" }),
148
+ /* @__PURE__ */ e(ee, { className: "h-3.5 w-3.5 group-hover:scale-110 transition-transform duration-200" }),
148
149
  /* @__PURE__ */ e("span", { className: "text-xs font-medium hidden sm:inline", children: "Ouvrir Canva" })
149
150
  ]
150
151
  }
@@ -153,15 +154,15 @@ function ue({
153
154
  /* @__PURE__ */ e(
154
155
  "button",
155
156
  {
156
- onClick: () => k("positive"),
157
+ onClick: () => M("positive"),
157
158
  disabled: o !== null,
158
- className: s(
159
+ className: a(
159
160
  "group flex items-center gap-1 px-2 py-1.5 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background",
160
161
  o === "positive" ? "bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400" : o !== null ? "opacity-50 cursor-not-allowed text-muted-foreground" : "hover:bg-muted/60 text-muted-foreground hover:text-green-600 dark:hover:text-green-400 hover:scale-105"
161
162
  ),
162
- title: "Réponse utile",
163
- "aria-label": "Réponse utile",
164
- children: /* @__PURE__ */ e(M, { className: s(
163
+ title: y,
164
+ "aria-label": y,
165
+ children: /* @__PURE__ */ e(T, { className: a(
165
166
  "h-3.5 w-3.5",
166
167
  o === "positive" && "fill-current"
167
168
  ) })
@@ -170,15 +171,15 @@ function ue({
170
171
  /* @__PURE__ */ e(
171
172
  "button",
172
173
  {
173
- onClick: () => k("negative"),
174
+ onClick: () => M("negative"),
174
175
  disabled: o !== null,
175
- className: s(
176
+ className: a(
176
177
  "group flex items-center gap-1 px-2 py-1.5 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background",
177
178
  o === "negative" ? "bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400" : o !== null ? "opacity-50 cursor-not-allowed text-muted-foreground" : "hover:bg-muted/60 text-muted-foreground hover:text-red-600 dark:hover:text-red-400 hover:scale-105"
178
179
  ),
179
- title: "Réponse non utile",
180
- "aria-label": "Réponse non utile",
181
- children: /* @__PURE__ */ e(y, { className: s(
180
+ title: L,
181
+ "aria-label": L,
182
+ children: /* @__PURE__ */ e(z, { className: a(
182
183
  "h-3.5 w-3.5",
183
184
  o === "negative" && "fill-current"
184
185
  ) })
@@ -186,10 +187,10 @@ function ue({
186
187
  )
187
188
  ] }),
188
189
  /* @__PURE__ */ e(
189
- B,
190
+ $,
190
191
  {
191
- isOpen: S,
192
- onClose: C,
192
+ isOpen: U,
193
+ onClose: F,
193
194
  size: "small",
194
195
  showCloseButton: !1,
195
196
  className: "w-[calc(100vw-2rem)] max-w-md",
@@ -198,61 +199,61 @@ function ue({
198
199
  "button",
199
200
  {
200
201
  type: "button",
201
- onClick: C,
202
+ onClick: F,
202
203
  className: "absolute right-0 top-0 text-muted-foreground hover:text-foreground transition-colors",
203
- "aria-label": "Fermer",
204
- children: /* @__PURE__ */ e(X, { className: "h-4 w-4" })
204
+ "aria-label": V,
205
+ children: /* @__PURE__ */ e(re, { className: "h-4 w-4" })
205
206
  }
206
207
  ),
207
208
  /* @__PURE__ */ t(
208
209
  "div",
209
210
  {
210
- className: s(
211
+ className: a(
211
212
  "flex items-start gap-3 rounded-lg border px-4 py-3 sm:px-5 sm:py-4 pt-4",
212
- n === "positive" ? "border-green-200 bg-green-50 dark:bg-green-950/20 text-green-700 dark:text-green-300" : "border-red-200 bg-red-50 dark:bg-red-950/20 text-red-700 dark:text-red-300"
213
+ s === "positive" ? "border-green-200 bg-green-50 dark:bg-green-950/20 text-green-700 dark:text-green-300" : "border-red-200 bg-red-50 dark:bg-red-950/20 text-red-700 dark:text-red-300"
213
214
  ),
214
215
  children: [
215
- /* @__PURE__ */ e("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-white/70 dark:bg-background/30", children: n === "positive" ? /* @__PURE__ */ e(M, { className: "h-4 w-4 fill-current" }) : /* @__PURE__ */ e(y, { className: "h-4 w-4 fill-current" }) }),
216
+ /* @__PURE__ */ e("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-white/70 dark:bg-background/30", children: s === "positive" ? /* @__PURE__ */ e(T, { className: "h-4 w-4 fill-current" }) : /* @__PURE__ */ e(z, { className: "h-4 w-4 fill-current" }) }),
216
217
  /* @__PURE__ */ t("div", { className: "space-y-1", children: [
217
- /* @__PURE__ */ e("p", { className: "text-sm font-semibold", children: n === "positive" ? "Merci pour votre feedback !" : "Aidez-nous à nous améliorer" }),
218
+ /* @__PURE__ */ e("p", { className: "text-sm font-semibold", children: s === "positive" ? "Merci pour votre feedback !" : "Aidez-nous à nous améliorer" }),
218
219
  /* @__PURE__ */ e("p", { className: "text-xs sm:text-sm text-muted-foreground", children: "Un commentaire pour nous aider ?" })
219
220
  ] })
220
221
  ]
221
222
  }
222
223
  ),
223
224
  /* @__PURE__ */ e(
224
- G,
225
+ J,
225
226
  {
226
227
  placeholder: "Votre commentaire (optionnel)...",
227
- value: m,
228
- onChange: (r) => g(r.target.value),
228
+ value: g,
229
+ onChange: (r) => f(r.target.value),
229
230
  className: "min-h-[80px] max-h-[150px] w-full resize-none text-sm box-border",
230
- disabled: i
231
+ disabled: l
231
232
  }
232
233
  ),
233
234
  /* @__PURE__ */ t("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
234
235
  /* @__PURE__ */ e(
235
- N,
236
+ R,
236
237
  {
237
238
  variant: "ghost",
238
239
  size: "sm",
239
- onClick: () => w(!1),
240
- disabled: i,
240
+ onClick: () => A(!1),
241
+ disabled: l,
241
242
  className: "w-full sm:w-auto text-muted-foreground hover:text-foreground",
242
243
  children: "Passer"
243
244
  }
244
245
  ),
245
246
  /* @__PURE__ */ e(
246
- N,
247
+ R,
247
248
  {
248
249
  size: "sm",
249
- onClick: () => w(!0),
250
- disabled: i || !m.trim(),
251
- className: s(
250
+ onClick: () => A(!0),
251
+ disabled: l || !g.trim(),
252
+ className: a(
252
253
  "w-full sm:w-auto",
253
- n === "positive" ? "bg-green-600 hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600" : "bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600"
254
+ s === "positive" ? "bg-green-600 hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600" : "bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600"
254
255
  ),
255
- children: i ? "Envoi..." : "Envoyer"
256
+ children: l ? "Envoi..." : "Envoyer"
256
257
  }
257
258
  )
258
259
  ] })
@@ -262,6 +263,6 @@ function ue({
262
263
  ] });
263
264
  }
264
265
  export {
265
- ue as MessageActions
266
+ ke as MessageActions
266
267
  };
267
268
  //# sourceMappingURL=MessageActions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageActions.js","sources":["../../../../../node_modules/.pnpm/lucide-react@0.545.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/thumbs-down.js","../../../../../node_modules/.pnpm/lucide-react@0.545.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/thumbs-up.js","../../../lib/organisms/chat/MessageActions.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M17 14V2\", key: \"8ymqnk\" }],\n [\n \"path\",\n {\n d: \"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\",\n key: \"m61m77\"\n }\n ]\n];\nconst ThumbsDown = createLucideIcon(\"thumbs-down\", __iconNode);\n\nexport { __iconNode, ThumbsDown as default };\n//# sourceMappingURL=thumbs-down.js.map\n","/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M7 10v12\", key: \"1qc93n\" }],\n [\n \"path\",\n {\n d: \"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\",\n key: \"emmmcr\"\n }\n ]\n];\nconst ThumbsUp = createLucideIcon(\"thumbs-up\", __iconNode);\n\nexport { __iconNode, ThumbsUp as default };\n//# sourceMappingURL=thumbs-up.js.map\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { ChangeEvent } from \"react\";\nimport { Copy, RefreshCw, Check, Maximize2, ThumbsUp, ThumbsDown, X } from \"lucide-react\";\nimport { cn } from \"@clubmed/usg-chat-ui/utils/cn\";\nimport { useToast } from \"@clubmed/usg-chat-ui/molecules/Notifications/useToast\";\nimport { useCanvasStore } from \"@clubmed/usg-chat-ui/utils/canvas-store\";\nimport { useChatApiClient } from \"@clubmed/usg-chat-ui/contexts/ChatContext\";\nimport { Modal } from \"@clubmed/usg-chat-ui/molecules/Modals/Modal\";\nimport { Button } from \"@clubmed/usg-chat-ui/molecules/Buttons/Button\";\nimport { Textarea } from \"@clubmed/usg-chat-ui/molecules/Textareas/Textarea\";\n\ninterface MessageActionsProps {\n content: string;\n messageId?: string;\n storyId?: string;\n onRegenerate?: () => void;\n responseType?: \"message\" | \"story\" | \"api_answer\" | \"followup_questions\" | \"release_note\";\n canvasData?: Record<string, unknown>;\n className?: string;\n}\n\nexport function MessageActions({ \n content, \n messageId,\n storyId,\n onRegenerate, \n responseType,\n canvasData,\n className \n}: MessageActionsProps) {\n const [copied, setCopied] = useState(false);\n const [feedbackGiven, setFeedbackGiven] = useState<\"positive\" | \"negative\" | null>(null);\n const [showFeedbackModal, setShowFeedbackModal] = useState(false);\n const [pendingRating, setPendingRating] = useState<\"positive\" | \"negative\" | null>(null);\n const [feedbackComment, setFeedbackComment] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { toast } = useToast();\n const { openApiDocsCanvas } = useCanvasStore();\n const apiClient = useChatApiClient();\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n toast({\n title: \"Copié\",\n description: \"Message copié dans le presse-papiers\",\n });\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n console.error(\"Failed to copy:\", error);\n toast({\n title: \"Erreur\",\n description: \"Impossible de copier le message\",\n variant: \"destructive\",\n });\n }\n };\n\n const handleOpenApiCanvas = () => {\n if (canvasData && responseType === \"api_answer\") {\n const apiData = canvasData as {\n answer?: string;\n sources?: Array<{ title: string; href: string; score?: number }>;\n };\n \n if (apiData.answer || apiData.sources) {\n openApiDocsCanvas({\n answer: apiData.answer || content,\n sources: apiData.sources || [],\n });\n }\n }\n };\n\n const handleFeedbackClick = (rating: \"positive\" | \"negative\") => {\n if (feedbackGiven) return; // Already gave feedback\n setPendingRating(rating);\n setShowFeedbackModal(true);\n };\n\n const submitFeedback = async (withComment: boolean) => {\n if (!pendingRating) return;\n \n setIsSubmitting(true);\n try {\n await apiClient.submitFeedback({\n messageId,\n storyId,\n rating: pendingRating,\n comment: withComment ? feedbackComment : undefined,\n responseType: responseType as \"story\" | \"release_note\" | \"api_answer\" | \"message\" | undefined,\n });\n \n setFeedbackGiven(pendingRating);\n setShowFeedbackModal(false);\n setFeedbackComment(\"\");\n \n toast({\n title: \"Merci !\",\n description: \"Votre feedback a été enregistré\",\n });\n } catch (error) {\n console.error(\"Failed to submit feedback:\", error);\n toast({\n title: \"Erreur\",\n description: \"Impossible d'enregistrer le feedback\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleModalClose = () => {\n setShowFeedbackModal(false);\n setPendingRating(null);\n setFeedbackComment(\"\");\n };\n\n return (\n <>\n <div className={cn(\"flex items-center gap-1.5 mt-3 pt-2 border-t border-border\", className)}>\n <button\n onClick={handleCopy}\n className=\"group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\"\n title=\"Copier le message\"\n aria-label=\"Copier le message\"\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5 text-positive-foreground\" />\n <span className=\"text-xs font-medium text-positive-foreground\">Copié</span>\n </>\n ) : (\n <>\n <Copy className=\"h-3.5 w-3.5\" />\n <span className=\"text-xs font-medium hidden sm:inline\">Copier</span>\n </>\n )}\n </button>\n \n {onRegenerate && (\n <button\n onClick={onRegenerate}\n className=\"group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\"\n title=\"Régénérer la réponse\"\n aria-label=\"Régénérer la réponse\"\n >\n <RefreshCw className=\"h-3.5 w-3.5 group-hover:rotate-180 transition-transform duration-500\" />\n <span className=\"text-xs font-medium hidden sm:inline\">Régénérer</span>\n </button>\n )}\n \n {responseType === \"api_answer\" && canvasData && (\n <button\n onClick={handleOpenApiCanvas}\n className=\"group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\"\n title=\"Ouvrir Canva\"\n aria-label=\"Ouvrir Canva\"\n >\n <Maximize2 className=\"h-3.5 w-3.5 group-hover:scale-110 transition-transform duration-200\" />\n <span className=\"text-xs font-medium hidden sm:inline\">Ouvrir Canva</span>\n </button>\n )}\n\n {/* Feedback buttons - separator */}\n <div className=\"mx-1 h-4 w-px bg-muted-foreground/20\" />\n\n {/* Thumbs Up */}\n <button\n onClick={() => handleFeedbackClick(\"positive\")}\n disabled={feedbackGiven !== null}\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\",\n feedbackGiven === \"positive\"\n ? \"bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400\"\n : feedbackGiven !== null\n ? \"opacity-50 cursor-not-allowed text-muted-foreground\"\n : \"hover:bg-muted/60 text-muted-foreground hover:text-green-600 dark:hover:text-green-400 hover:scale-105\"\n )}\n title=\"Réponse utile\"\n aria-label=\"Réponse utile\"\n >\n <ThumbsUp className={cn(\n \"h-3.5 w-3.5\",\n feedbackGiven === \"positive\" && \"fill-current\"\n )} />\n </button>\n\n {/* Thumbs Down */}\n <button\n onClick={() => handleFeedbackClick(\"negative\")}\n disabled={feedbackGiven !== null}\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\",\n feedbackGiven === \"negative\"\n ? \"bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400\"\n : feedbackGiven !== null\n ? \"opacity-50 cursor-not-allowed text-muted-foreground\"\n : \"hover:bg-muted/60 text-muted-foreground hover:text-red-600 dark:hover:text-red-400 hover:scale-105\"\n )}\n title=\"Réponse non utile\"\n aria-label=\"Réponse non utile\"\n >\n <ThumbsDown className={cn(\n \"h-3.5 w-3.5\",\n feedbackGiven === \"negative\" && \"fill-current\"\n )} />\n </button>\n </div>\n\n <Modal\n isOpen={showFeedbackModal}\n onClose={handleModalClose}\n size=\"small\"\n showCloseButton={false}\n className=\"w-[calc(100vw-2rem)] max-w-md\"\n >\n <div className=\"relative space-y-4\">\n <button\n type=\"button\"\n onClick={handleModalClose}\n className=\"absolute right-0 top-0 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"Fermer\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n\n <div\n className={cn(\n \"flex items-start gap-3 rounded-lg border px-4 py-3 sm:px-5 sm:py-4 pt-4\",\n pendingRating === \"positive\"\n ? \"border-green-200 bg-green-50 dark:bg-green-950/20 text-green-700 dark:text-green-300\"\n : \"border-red-200 bg-red-50 dark:bg-red-950/20 text-red-700 dark:text-red-300\"\n )}\n >\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-white/70 dark:bg-background/30\">\n {pendingRating === \"positive\" ? (\n <ThumbsUp className=\"h-4 w-4 fill-current\" />\n ) : (\n <ThumbsDown className=\"h-4 w-4 fill-current\" />\n )}\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-semibold\">\n {pendingRating === \"positive\"\n ? \"Merci pour votre feedback !\"\n : \"Aidez-nous à nous améliorer\"}\n </p>\n <p className=\"text-xs sm:text-sm text-muted-foreground\">\n Un commentaire pour nous aider ?\n </p>\n </div>\n </div>\n\n <Textarea\n placeholder=\"Votre commentaire (optionnel)...\"\n value={feedbackComment}\n onChange={(event: ChangeEvent<HTMLTextAreaElement>) =>\n setFeedbackComment(event.target.value)\n }\n className=\"min-h-[80px] max-h-[150px] w-full resize-none text-sm box-border\"\n disabled={isSubmitting}\n />\n\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => submitFeedback(false)}\n disabled={isSubmitting}\n className=\"w-full sm:w-auto text-muted-foreground hover:text-foreground\"\n >\n Passer\n </Button>\n <Button\n size=\"sm\"\n onClick={() => submitFeedback(true)}\n disabled={isSubmitting || !feedbackComment.trim()}\n className={cn(\n \"w-full sm:w-auto\",\n pendingRating === \"positive\"\n ? \"bg-green-600 hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600\"\n : \"bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\"\n )}\n >\n {isSubmitting ? \"Envoi...\" : \"Envoyer\"}\n </Button>\n </div>\n </div>\n </Modal>\n </>\n );\n}\n"],"names":["__iconNode","ThumbsDown","createLucideIcon","ThumbsUp","MessageActions","content","messageId","storyId","onRegenerate","responseType","canvasData","className","copied","setCopied","useState","feedbackGiven","setFeedbackGiven","showFeedbackModal","setShowFeedbackModal","pendingRating","setPendingRating","feedbackComment","setFeedbackComment","isSubmitting","setIsSubmitting","toast","useToast","openApiDocsCanvas","useCanvasStore","apiClient","useChatApiClient","handleCopy","error","handleOpenApiCanvas","apiData","handleFeedbackClick","rating","submitFeedback","withComment","handleModalClose","jsxs","Fragment","cn","jsx","Check","Copy","RefreshCw","Maximize2","Modal","Textarea","event","Button"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"MessageActions.js","sources":["../../../../../node_modules/.pnpm/lucide-react@0.545.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/thumbs-down.js","../../../../../node_modules/.pnpm/lucide-react@0.545.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/thumbs-up.js","../../../lib/organisms/chat/MessageActions.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M17 14V2\", key: \"8ymqnk\" }],\n [\n \"path\",\n {\n d: \"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\",\n key: \"m61m77\"\n }\n ]\n];\nconst ThumbsDown = createLucideIcon(\"thumbs-down\", __iconNode);\n\nexport { __iconNode, ThumbsDown as default };\n//# sourceMappingURL=thumbs-down.js.map\n","/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M7 10v12\", key: \"1qc93n\" }],\n [\n \"path\",\n {\n d: \"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\",\n key: \"emmmcr\"\n }\n ]\n];\nconst ThumbsUp = createLucideIcon(\"thumbs-up\", __iconNode);\n\nexport { __iconNode, ThumbsUp as default };\n//# sourceMappingURL=thumbs-up.js.map\n","\"use client\";\n\nimport {useState} from \"react\";\nimport type {ChangeEvent} from \"react\";\nimport {Copy, RefreshCw, Check, Maximize2, ThumbsUp, ThumbsDown, X} from \"lucide-react\";\nimport {cn} from \"@clubmed/usg-chat-ui/utils/cn\";\nimport {useToast} from \"@clubmed/usg-chat-ui/molecules/Notifications/useToast\";\nimport {useCanvasStore} from \"@clubmed/usg-chat-ui/utils/canvas-store\";\nimport {useChatApiClient} from \"@clubmed/usg-chat-ui/contexts/ChatContext\";\nimport {Modal} from \"@clubmed/usg-chat-ui/molecules/Modals/Modal\";\nimport {Button} from \"@clubmed/usg-chat-ui/molecules/Buttons/Button\";\nimport {Textarea} from \"@clubmed/usg-chat-ui/molecules/Textareas/Textarea\";\nimport {useChatLabels} from \"../../contexts/ChatLabelsContext\";\n\ninterface MessageActionsProps {\n content: string;\n messageId?: string;\n storyId?: string;\n onRegenerate?: () => void;\n responseType?: \"message\" | \"story\" | \"api_answer\" | \"followup_questions\" | \"release_note\";\n canvasData?: Record<string, unknown>;\n className?: string;\n}\n\nexport function MessageActions({ \n content, \n messageId,\n storyId,\n onRegenerate, \n responseType,\n canvasData,\n className \n}: MessageActionsProps) {\n const [copied, setCopied] = useState(false);\n const [feedbackGiven, setFeedbackGiven] = useState<\"positive\" | \"negative\" | null>(null);\n const [showFeedbackModal, setShowFeedbackModal] = useState(false);\n const [pendingRating, setPendingRating] = useState<\"positive\" | \"negative\" | null>(null);\n const [feedbackComment, setFeedbackComment] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { toast } = useToast();\n const { openApiDocsCanvas } = useCanvasStore();\n const apiClient = useChatApiClient();\n const {get} = useChatLabels();\n const copyLabel = get(\"messageCopyAriaLabel\", \"Copier le message\");\n const regenerateLabel = get(\"messageRegenerateAriaLabel\", \"Régénérer la réponse\");\n const openCanvasLabel = get(\"messageOpenCanvasAriaLabel\", \"Ouvrir Canva\");\n const thumbsUpLabel = get(\"messageThumbsUpAriaLabel\", \"Réponse utile\");\n const thumbsDownLabel = get(\"messageThumbsDownAriaLabel\", \"Réponse non utile\");\n const closeFeedbackLabel = get(\"messageCloseFeedbackAriaLabel\", \"Fermer\");\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n toast({\n title: \"Copié\",\n description: \"Message copié dans le presse-papiers\",\n });\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n console.error(\"Failed to copy:\", error);\n toast({\n title: \"Erreur\",\n description: \"Impossible de copier le message\",\n variant: \"destructive\",\n });\n }\n };\n\n const handleOpenApiCanvas = () => {\n if (canvasData && responseType === \"api_answer\") {\n const apiData = canvasData as {\n answer?: string;\n sources?: Array<{ title: string; href: string; score?: number }>;\n };\n \n if (apiData.answer || apiData.sources) {\n openApiDocsCanvas({\n answer: apiData.answer || content,\n sources: apiData.sources || [],\n });\n }\n }\n };\n\n const handleFeedbackClick = (rating: \"positive\" | \"negative\") => {\n if (feedbackGiven) return; // Already gave feedback\n setPendingRating(rating);\n setShowFeedbackModal(true);\n };\n\n const submitFeedback = async (withComment: boolean) => {\n if (!pendingRating) return;\n \n setIsSubmitting(true);\n try {\n await apiClient.submitFeedback({\n messageId,\n storyId,\n rating: pendingRating,\n comment: withComment ? feedbackComment : undefined,\n responseType: responseType as \"story\" | \"release_note\" | \"api_answer\" | \"message\" | undefined,\n });\n \n setFeedbackGiven(pendingRating);\n setShowFeedbackModal(false);\n setFeedbackComment(\"\");\n \n toast({\n title: \"Merci !\",\n description: \"Votre feedback a été enregistré\",\n });\n } catch (error) {\n console.error(\"Failed to submit feedback:\", error);\n toast({\n title: \"Erreur\",\n description: \"Impossible d'enregistrer le feedback\",\n variant: \"destructive\",\n });\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleModalClose = () => {\n setShowFeedbackModal(false);\n setPendingRating(null);\n setFeedbackComment(\"\");\n };\n\n return (\n <>\n <div className={cn(\"flex items-center gap-1.5 mt-3 pt-2 border-t border-border\", className)}>\n <button\n onClick={handleCopy}\n className=\"group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\"\n title={copyLabel}\n aria-label={copyLabel}\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5 text-positive-foreground\" />\n <span className=\"text-xs font-medium text-positive-foreground\">Copié</span>\n </>\n ) : (\n <>\n <Copy className=\"h-3.5 w-3.5\" />\n <span className=\"text-xs font-medium hidden sm:inline\">Copier</span>\n </>\n )}\n </button>\n \n {onRegenerate && (\n <button\n onClick={onRegenerate}\n className=\"group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\"\n title={regenerateLabel}\n aria-label={regenerateLabel}\n >\n <RefreshCw className=\"h-3.5 w-3.5 group-hover:rotate-180 transition-transform duration-500\" />\n <span className=\"text-xs font-medium hidden sm:inline\">Régénérer</span>\n </button>\n )}\n \n {responseType === \"api_answer\" && canvasData && (\n <button\n onClick={handleOpenApiCanvas}\n className=\"group flex items-center gap-1.5 px-2.5 py-1.5 rounded-md hover:bg-muted/60 text-muted-foreground hover:text-foreground transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\"\n title={openCanvasLabel}\n aria-label={openCanvasLabel}\n >\n <Maximize2 className=\"h-3.5 w-3.5 group-hover:scale-110 transition-transform duration-200\" />\n <span className=\"text-xs font-medium hidden sm:inline\">Ouvrir Canva</span>\n </button>\n )}\n\n {/* Feedback buttons - separator */}\n <div className=\"mx-1 h-4 w-px bg-muted-foreground/20\" />\n\n {/* Thumbs Up */}\n <button\n onClick={() => handleFeedbackClick(\"positive\")}\n disabled={feedbackGiven !== null}\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\",\n feedbackGiven === \"positive\"\n ? \"bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400\"\n : feedbackGiven !== null\n ? \"opacity-50 cursor-not-allowed text-muted-foreground\"\n : \"hover:bg-muted/60 text-muted-foreground hover:text-green-600 dark:hover:text-green-400 hover:scale-105\"\n )}\n title={thumbsUpLabel}\n aria-label={thumbsUpLabel}\n >\n <ThumbsUp className={cn(\n \"h-3.5 w-3.5\",\n feedbackGiven === \"positive\" && \"fill-current\"\n )} />\n </button>\n\n {/* Thumbs Down */}\n <button\n onClick={() => handleFeedbackClick(\"negative\")}\n disabled={feedbackGiven !== null}\n className={cn(\n \"group flex items-center gap-1 px-2 py-1.5 rounded-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 focus:ring-offset-background\",\n feedbackGiven === \"negative\"\n ? \"bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400\"\n : feedbackGiven !== null\n ? \"opacity-50 cursor-not-allowed text-muted-foreground\"\n : \"hover:bg-muted/60 text-muted-foreground hover:text-red-600 dark:hover:text-red-400 hover:scale-105\"\n )}\n title={thumbsDownLabel}\n aria-label={thumbsDownLabel}\n >\n <ThumbsDown className={cn(\n \"h-3.5 w-3.5\",\n feedbackGiven === \"negative\" && \"fill-current\"\n )} />\n </button>\n </div>\n\n <Modal\n isOpen={showFeedbackModal}\n onClose={handleModalClose}\n size=\"small\"\n showCloseButton={false}\n className=\"w-[calc(100vw-2rem)] max-w-md\"\n >\n <div className=\"relative space-y-4\">\n <button\n type=\"button\"\n onClick={handleModalClose}\n className=\"absolute right-0 top-0 text-muted-foreground hover:text-foreground transition-colors\"\n aria-label={closeFeedbackLabel}\n >\n <X className=\"h-4 w-4\" />\n </button>\n\n <div\n className={cn(\n \"flex items-start gap-3 rounded-lg border px-4 py-3 sm:px-5 sm:py-4 pt-4\",\n pendingRating === \"positive\"\n ? \"border-green-200 bg-green-50 dark:bg-green-950/20 text-green-700 dark:text-green-300\"\n : \"border-red-200 bg-red-50 dark:bg-red-950/20 text-red-700 dark:text-red-300\"\n )}\n >\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-white/70 dark:bg-background/30\">\n {pendingRating === \"positive\" ? (\n <ThumbsUp className=\"h-4 w-4 fill-current\" />\n ) : (\n <ThumbsDown className=\"h-4 w-4 fill-current\" />\n )}\n </div>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-semibold\">\n {pendingRating === \"positive\"\n ? \"Merci pour votre feedback !\"\n : \"Aidez-nous à nous améliorer\"}\n </p>\n <p className=\"text-xs sm:text-sm text-muted-foreground\">\n Un commentaire pour nous aider ?\n </p>\n </div>\n </div>\n\n <Textarea\n placeholder=\"Votre commentaire (optionnel)...\"\n value={feedbackComment}\n onChange={(event: ChangeEvent<HTMLTextAreaElement>) =>\n setFeedbackComment(event.target.value)\n }\n className=\"min-h-[80px] max-h-[150px] w-full resize-none text-sm box-border\"\n disabled={isSubmitting}\n />\n\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => submitFeedback(false)}\n disabled={isSubmitting}\n className=\"w-full sm:w-auto text-muted-foreground hover:text-foreground\"\n >\n Passer\n </Button>\n <Button\n size=\"sm\"\n onClick={() => submitFeedback(true)}\n disabled={isSubmitting || !feedbackComment.trim()}\n className={cn(\n \"w-full sm:w-auto\",\n pendingRating === \"positive\"\n ? \"bg-green-600 hover:bg-green-700 dark:bg-green-500 dark:hover:bg-green-600\"\n : \"bg-red-600 hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\"\n )}\n >\n {isSubmitting ? \"Envoi...\" : \"Envoyer\"}\n </Button>\n </div>\n </div>\n </Modal>\n </>\n );\n}\n"],"names":["__iconNode","ThumbsDown","createLucideIcon","ThumbsUp","MessageActions","content","messageId","storyId","onRegenerate","responseType","canvasData","className","copied","setCopied","useState","feedbackGiven","setFeedbackGiven","showFeedbackModal","setShowFeedbackModal","pendingRating","setPendingRating","feedbackComment","setFeedbackComment","isSubmitting","setIsSubmitting","toast","useToast","openApiDocsCanvas","useCanvasStore","apiClient","useChatApiClient","get","useChatLabels","copyLabel","regenerateLabel","openCanvasLabel","thumbsUpLabel","thumbsDownLabel","closeFeedbackLabel","handleCopy","error","handleOpenApiCanvas","apiData","handleFeedbackClick","rating","submitFeedback","withComment","handleModalClose","jsxs","Fragment","cn","jsx","Check","Copy","RefreshCw","Maximize2","Modal","X","Textarea","event","Button"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -9,8 +9,8 @@ import { Sources as k, SourcesTrigger as A, SourcesContent as R, Source as C } f
9
9
  import { Reasoning as M, ReasoningTrigger as S, ReasoningContent as z } from "../../molecules/AiElements/Reasoning.js";
10
10
  import { useCanvasStore as b } from "../../utils/canvas-store.js";
11
11
  import { c as _ } from "../../chunks/createLucideIcon.js";
12
- import { C as w } from "../../chunks/chevron-right.js";
13
12
  import { N as j } from "../../chunks/newspaper.js";
13
+ import { C as w } from "../../chunks/chevron-right.js";
14
14
  /**
15
15
  * @license lucide-react v0.545.0 - ISC
16
16
  *
@@ -1,21 +1,23 @@
1
1
  "use client";
2
2
  import { jsx as e } from "react/jsx-runtime";
3
- import { cn as o } from "../../utils/cn.js";
4
- import { P as t } from "../../chunks/panel-left.js";
5
- function l({ onOpen: r }) {
3
+ import { cn as s } from "../../utils/cn.js";
4
+ import { useChatLabels as n } from "../../contexts/ChatLabelsContext.js";
5
+ import { P as i } from "../../chunks/panel-left.js";
6
+ function f({ onOpen: r }) {
7
+ const { get: t } = n(), o = t("sidebarOpenHistoryAriaLabel", "Ouvrir l'historique");
6
8
  return /* @__PURE__ */ e("div", { className: "absolute left-4 sm:left-6 z-40 top-2", children: /* @__PURE__ */ e(
7
9
  "button",
8
10
  {
9
11
  onClick: r,
10
- className: o(
12
+ className: s(
11
13
  "group relative flex h-10 w-10 sm:h-11 sm:w-11 items-center justify-center bg-transparent hover:bg-muted transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background rounded-lg p-2"
12
14
  ),
13
- "aria-label": "Ouvrir l'historique",
14
- children: /* @__PURE__ */ e(t, { className: "h-4 w-4 sm:h-5 sm:w-5 text-muted-foreground transition-colors" })
15
+ "aria-label": o,
16
+ children: /* @__PURE__ */ e(i, { className: "h-4 w-4 sm:h-5 sm:w-5 text-muted-foreground transition-colors" })
15
17
  }
16
18
  ) });
17
19
  }
18
20
  export {
19
- l as SidebarToggleButton
21
+ f as SidebarToggleButton
20
22
  };
21
23
  //# sourceMappingURL=SidebarToggleButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarToggleButton.js","sources":["../../../lib/organisms/chat/SidebarToggleButton.tsx"],"sourcesContent":["\"use client\";\n\nimport { PanelLeft } from \"lucide-react\";\nimport { cn } from \"@clubmed/usg-chat-ui/utils/cn\";\n\ninterface SidebarToggleButtonProps {\n onOpen: () => void;\n}\n\nexport function SidebarToggleButton({ onOpen }: SidebarToggleButtonProps) {\n return (\n <div className=\"absolute left-4 sm:left-6 z-40 top-2\">\n <button\n onClick={onOpen}\n className={cn(\n \"group relative flex h-10 w-10 sm:h-11 sm:w-11 items-center justify-center bg-transparent hover:bg-muted transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background rounded-lg p-2\"\n )}\n aria-label=\"Ouvrir l'historique\"\n >\n <PanelLeft className=\"h-4 w-4 sm:h-5 sm:w-5 text-muted-foreground transition-colors\" />\n </button>\n </div>\n );\n}\n"],"names":["SidebarToggleButton","onOpen","jsx","cn","PanelLeft"],"mappings":";;;;AASO,SAASA,EAAoB,EAAE,QAAAC,KAAoC;AACxE,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAASD;AAAA,MACT,WAAWE;AAAA,QACT;AAAA,MAAA;AAAA,MAEF,cAAW;AAAA,MAEX,UAAA,gBAAAD,EAACE,GAAA,EAAU,WAAU,gEAAA,CAAgE;AAAA,IAAA;AAAA,EAAA,GAEzF;AAEJ;"}
1
+ {"version":3,"file":"SidebarToggleButton.js","sources":["../../../lib/organisms/chat/SidebarToggleButton.tsx"],"sourcesContent":["\"use client\";\n\nimport {PanelLeft} from \"lucide-react\";\nimport {cn} from \"@clubmed/usg-chat-ui/utils/cn\";\nimport {useChatLabels} from \"../../contexts/ChatLabelsContext\";\n\ninterface SidebarToggleButtonProps {\n onOpen: () => void;\n}\n\nexport function SidebarToggleButton({onOpen}: SidebarToggleButtonProps) {\n const {get} = useChatLabels();\n const ariaLabel = get(\"sidebarOpenHistoryAriaLabel\", \"Ouvrir l'historique\");\n\n return (\n <div className=\"absolute left-4 sm:left-6 z-40 top-2\">\n <button\n onClick={onOpen}\n className={cn(\n \"group relative flex h-10 w-10 sm:h-11 sm:w-11 items-center justify-center bg-transparent hover:bg-muted transition-all duration-200 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background rounded-lg p-2\"\n )}\n aria-label={ariaLabel}\n >\n <PanelLeft className=\"h-4 w-4 sm:h-5 sm:w-5 text-muted-foreground transition-colors\"/>\n </button>\n </div>\n );\n}\n"],"names":["SidebarToggleButton","onOpen","get","useChatLabels","ariaLabel","jsx","cn","PanelLeft"],"mappings":";;;;;AAUO,SAASA,EAAoB,EAAC,QAAAC,KAAmC;AACtE,QAAM,EAAC,KAAAC,EAAA,IAAOC,EAAA,GACRC,IAAYF,EAAI,+BAA+B,qBAAqB;AAE1E,SACE,gBAAAG,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAASJ;AAAA,MACT,WAAWK;AAAA,QACT;AAAA,MAAA;AAAA,MAEF,cAAYF;AAAA,MAEZ,UAAA,gBAAAC,EAACE,GAAA,EAAU,WAAU,gEAAA,CAA+D;AAAA,IAAA;AAAA,EAAA,GAExF;AAEJ;"}
@@ -1,6 +1,7 @@
1
1
  import { PromptInputMessage } from '../../../molecules/AiElements/PromptInput';
2
2
  import { ChatMessage } from '../types';
3
3
  export declare function useChat(): {
4
+ user: import('../../..').ChatUser | null | undefined;
4
5
  chatMessages: ChatMessage[];
5
6
  settingsOpen: boolean;
6
7
  setSettingsOpen: import('react').Dispatch<import('react').SetStateAction<boolean>>;
@@ -21,5 +22,4 @@ export declare function useChat(): {
21
22
  handleRegenerate: (messageKey: string) => Promise<void>;
22
23
  localInput: string;
23
24
  setLocalInput: import('react').Dispatch<import('react').SetStateAction<string>>;
24
- emptyStateGreeting: string | undefined;
25
25
  };