@alfadocs/ui-kit 0.1.6 → 0.1.7
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.
- package/dist/_chunks/{balance-cell-renderer-BRWt3neo.js → balance-cell-renderer-BWm3knY9.js} +2 -2
- package/dist/_chunks/{balance-cell-renderer-BRWt3neo.js.map → balance-cell-renderer-BWm3knY9.js.map} +1 -1
- package/dist/_chunks/{chat-container-BZvQ3_yT.js → chat-container-Cm3SlR2p.js} +12 -12
- package/dist/_chunks/{chat-container-BZvQ3_yT.js.map → chat-container-Cm3SlR2p.js.map} +1 -1
- package/dist/_chunks/{chat-input-DsIrWM4f.js → chat-input-DreOPP8A.js} +36 -31
- package/dist/_chunks/chat-input-DreOPP8A.js.map +1 -0
- package/dist/_chunks/{dropdown-menu-JNo66A-j.js → dropdown-menu-Cw3EyPZv.js} +35 -31
- package/dist/_chunks/dropdown-menu-Cw3EyPZv.js.map +1 -0
- package/dist/_chunks/{leo-sidebar-Bh3dPDTQ.js → leo-sidebar-nbHib2D-.js} +97 -89
- package/dist/_chunks/leo-sidebar-nbHib2D-.js.map +1 -0
- package/dist/_chunks/{notification-tray-Bq-08ReD.js → notification-tray-B7U5YZYg.js} +5 -2
- package/dist/_chunks/notification-tray-B7U5YZYg.js.map +1 -0
- package/dist/_chunks/{patient-shell-DP54y6rc.js → patient-shell-7cXqIMFg.js} +2 -2
- package/dist/_chunks/{patient-shell-DP54y6rc.js.map → patient-shell-7cXqIMFg.js.map} +1 -1
- package/dist/_chunks/{popover-DvAtFOi-.js → popover-C3CTUsqh.js} +20 -16
- package/dist/_chunks/popover-C3CTUsqh.js.map +1 -0
- package/dist/_chunks/{privacy-lock-DS6QRo2N.js → privacy-lock-CQpgkLec.js} +23 -23
- package/dist/_chunks/{privacy-lock-DS6QRo2N.js.map → privacy-lock-CQpgkLec.js.map} +1 -1
- package/dist/_chunks/{suggestion-chip-6AB40rxz.js → suggestion-chip-BNJ2M8Os.js} +3 -3
- package/dist/_chunks/suggestion-chip-BNJ2M8Os.js.map +1 -0
- package/dist/_chunks/{theme-toggle-COHFwO2H.js → theme-toggle-BHiMMEQN.js} +2 -2
- package/dist/_chunks/{theme-toggle-COHFwO2H.js.map → theme-toggle-BHiMMEQN.js.map} +1 -1
- package/dist/_chunks/{workflow-map-DGJwVcO-.js → workflow-map-XeqHDFvp.js} +2 -2
- package/dist/_chunks/{workflow-map-DGJwVcO-.js.map → workflow-map-XeqHDFvp.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/components/chat-container/index.js +1 -1
- package/dist/components/chat-input/chat-input.d.ts.map +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/popover/popover.d.ts.map +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/suggestion-chip/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/index.js +12 -12
- package/dist/patterns/leo-assistant/index.js +1 -1
- package/dist/patterns/leo-assistant/leo-chat-surface.d.ts.map +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/chat-input-DsIrWM4f.js.map +0 -1
- package/dist/_chunks/dropdown-menu-JNo66A-j.js.map +0 -1
- package/dist/_chunks/leo-sidebar-Bh3dPDTQ.js.map +0 -1
- package/dist/_chunks/notification-tray-Bq-08ReD.js.map +0 -1
- package/dist/_chunks/popover-DvAtFOi-.js.map +0 -1
- package/dist/_chunks/suggestion-chip-6AB40rxz.js.map +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { jsx as e, jsxs as c, Fragment as A } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as
|
|
2
|
+
import { forwardRef as k, useMemo as U } from "react";
|
|
3
3
|
import * as ee from "@radix-ui/react-dialog";
|
|
4
4
|
import { useTranslation as y } from "react-i18next";
|
|
5
5
|
import { F as se } from "./floating-action-button-Cnw-f6AG.js";
|
|
6
6
|
import { I as B } from "./icon-button-Wnnde5lc.js";
|
|
7
7
|
import { S as E } from "./sheet-BhNpLHc9.js";
|
|
8
8
|
import { X as de } from "./x-CCcI3eJp.js";
|
|
9
|
-
import { A as
|
|
9
|
+
import { A as L } from "./avatar-Dcr6XuDQ.js";
|
|
10
10
|
import { B as D } from "./button-7mLWcMp_.js";
|
|
11
|
-
import { C as
|
|
12
|
-
import { C as
|
|
13
|
-
import { C as le } from "./chat-input-
|
|
11
|
+
import { C as ae } from "./chat-container-Cm3SlR2p.js";
|
|
12
|
+
import { C as re } from "./chat-message-ByouZpPP.js";
|
|
13
|
+
import { C as le } from "./chat-input-DreOPP8A.js";
|
|
14
14
|
import { S as ie } from "./streaming-text-BgjCTVOw.js";
|
|
15
|
-
import { a as q, S as O } from "./suggestion-chip-
|
|
15
|
+
import { a as q, S as O } from "./suggestion-chip-BNJ2M8Os.js";
|
|
16
16
|
import { T as oe } from "./typing-indicator-CbUBf-Dx.js";
|
|
17
17
|
import { P as te } from "./progress-B4Of_pzz.js";
|
|
18
18
|
import { S as ne } from "./square-CZoGU14v.js";
|
|
@@ -51,16 +51,16 @@ const ge = [
|
|
|
51
51
|
icon: "ds:size-8"
|
|
52
52
|
}
|
|
53
53
|
};
|
|
54
|
-
function
|
|
54
|
+
function w({
|
|
55
55
|
size: s,
|
|
56
|
-
label:
|
|
56
|
+
label: a
|
|
57
57
|
}) {
|
|
58
|
-
const
|
|
58
|
+
const r = Q[s];
|
|
59
59
|
return /* @__PURE__ */ e(
|
|
60
60
|
"span",
|
|
61
61
|
{
|
|
62
62
|
role: "img",
|
|
63
|
-
"aria-label":
|
|
63
|
+
"aria-label": a,
|
|
64
64
|
className: [
|
|
65
65
|
"ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center",
|
|
66
66
|
"ds:rounded-[var(--radius-full)]",
|
|
@@ -71,41 +71,41 @@ function j({
|
|
|
71
71
|
// forced-colors: UA strips color-mix backgrounds; fall back to
|
|
72
72
|
// a bordered disc so the identity still reads in HCM.
|
|
73
73
|
"ds:forced-colors:bg-transparent ds:forced-colors:border ds:forced-colors:border-[CanvasText]",
|
|
74
|
-
|
|
74
|
+
r.box
|
|
75
75
|
].join(" "),
|
|
76
|
-
children: /* @__PURE__ */ e(M, { "aria-hidden": "true", className:
|
|
76
|
+
children: /* @__PURE__ */ e(M, { "aria-hidden": "true", className: r.icon })
|
|
77
77
|
}
|
|
78
78
|
);
|
|
79
79
|
}
|
|
80
|
-
function
|
|
80
|
+
function he({
|
|
81
81
|
size: s,
|
|
82
|
-
label:
|
|
82
|
+
label: a
|
|
83
83
|
}) {
|
|
84
|
-
const
|
|
84
|
+
const r = Q[s];
|
|
85
85
|
return /* @__PURE__ */ e(
|
|
86
86
|
"span",
|
|
87
87
|
{
|
|
88
88
|
role: "img",
|
|
89
|
-
"aria-label":
|
|
89
|
+
"aria-label": a,
|
|
90
90
|
className: [
|
|
91
91
|
"ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center",
|
|
92
92
|
"ds:rounded-[var(--radius-full)]",
|
|
93
93
|
"ds:bg-[color-mix(in_srgb,var(--muted-foreground)_14%,transparent)]",
|
|
94
94
|
"ds:text-[color:var(--muted-foreground)]",
|
|
95
95
|
"ds:forced-colors:bg-transparent ds:forced-colors:border ds:forced-colors:border-[CanvasText]",
|
|
96
|
-
|
|
96
|
+
r.box
|
|
97
97
|
].join(" "),
|
|
98
|
-
children: /* @__PURE__ */ e(pe, { "aria-hidden": "true", className:
|
|
98
|
+
children: /* @__PURE__ */ e(pe, { "aria-hidden": "true", className: r.icon })
|
|
99
99
|
}
|
|
100
100
|
);
|
|
101
101
|
}
|
|
102
|
-
function
|
|
103
|
-
return s ? s.slot ? { slot: s.slot } : { name: s.name, src: s.src } : { slot: /* @__PURE__ */ e(
|
|
102
|
+
function be(s, a) {
|
|
103
|
+
return s ? s.slot ? { slot: s.slot } : { name: s.name, src: s.src } : { slot: /* @__PURE__ */ e(he, { size: "sm", label: a }) };
|
|
104
104
|
}
|
|
105
105
|
function ve({
|
|
106
106
|
assistantName: s,
|
|
107
|
-
avatarSrc:
|
|
108
|
-
greeting:
|
|
107
|
+
avatarSrc: a,
|
|
108
|
+
greeting: r,
|
|
109
109
|
subtitle: o,
|
|
110
110
|
suggestions: i,
|
|
111
111
|
onSuggestion: t
|
|
@@ -125,14 +125,14 @@ function ve({
|
|
|
125
125
|
].join(" "),
|
|
126
126
|
"data-testid": "leo-empty-state",
|
|
127
127
|
children: [
|
|
128
|
-
|
|
128
|
+
a ? /* @__PURE__ */ e(L, { name: s, src: a, size: "xl" }) : /* @__PURE__ */ e(w, { size: "xl", label: s }),
|
|
129
129
|
/* @__PURE__ */ c("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:max-w-[32rem]", children: [
|
|
130
130
|
/* @__PURE__ */ e(
|
|
131
131
|
"h2",
|
|
132
132
|
{
|
|
133
133
|
id: l,
|
|
134
134
|
className: "type-title-section ds:m-0 ds:text-[color:var(--foreground)]",
|
|
135
|
-
children:
|
|
135
|
+
children: r
|
|
136
136
|
}
|
|
137
137
|
),
|
|
138
138
|
/* @__PURE__ */ e("p", { className: "type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]", children: o })
|
|
@@ -161,8 +161,8 @@ function ve({
|
|
|
161
161
|
}
|
|
162
162
|
function xe({
|
|
163
163
|
message: s,
|
|
164
|
-
assistantName:
|
|
165
|
-
avatarSrc:
|
|
164
|
+
assistantName: a,
|
|
165
|
+
avatarSrc: r,
|
|
166
166
|
renderMarkdown: o
|
|
167
167
|
}) {
|
|
168
168
|
const { t: i, i18n: t } = y(), u = i("chat.message.role.assistant"), l = U(() => {
|
|
@@ -179,7 +179,7 @@ function xe({
|
|
|
179
179
|
"aria-label": n,
|
|
180
180
|
className: "ds:flex ds:w-full ds:items-start ds:flex-row ds:gap-[var(--spacing-sm)]",
|
|
181
181
|
children: [
|
|
182
|
-
|
|
182
|
+
r ? /* @__PURE__ */ e(L, { name: a, src: r, size: "sm" }) : /* @__PURE__ */ e(w, { size: "sm", label: a }),
|
|
183
183
|
/* @__PURE__ */ e("div", { className: "ds:flex ds:flex-col ds:items-start", children: /* @__PURE__ */ e(
|
|
184
184
|
"div",
|
|
185
185
|
{
|
|
@@ -209,8 +209,8 @@ function xe({
|
|
|
209
209
|
}
|
|
210
210
|
function Ne({
|
|
211
211
|
assistantName: s,
|
|
212
|
-
avatarSrc:
|
|
213
|
-
onNewConversation:
|
|
212
|
+
avatarSrc: a,
|
|
213
|
+
onNewConversation: r,
|
|
214
214
|
headerEndSlot: o,
|
|
215
215
|
density: i
|
|
216
216
|
}) {
|
|
@@ -221,22 +221,25 @@ function Ne({
|
|
|
221
221
|
"aria-label": t("leo.headerLabel"),
|
|
222
222
|
className: [
|
|
223
223
|
"ds:flex ds:shrink-0 ds:items-center ds:gap-[var(--spacing-sm)]",
|
|
224
|
-
|
|
224
|
+
// Soft drop-shadow on the block-end edge in place of a `border-b`
|
|
225
|
+
// against `--border` — same rationale as the Leo sidebar's inline
|
|
226
|
+
// edge (see leo-sidebar.tsx).
|
|
227
|
+
"ds:shadow-[var(--shadow-chrome-down)]",
|
|
225
228
|
"ds:bg-[var(--background)]",
|
|
226
229
|
"ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
|
|
227
230
|
i === "compact" ? "ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]" : "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]"
|
|
228
231
|
].join(" "),
|
|
229
232
|
"data-testid": "leo-header",
|
|
230
233
|
children: [
|
|
231
|
-
|
|
232
|
-
|
|
234
|
+
a ? /* @__PURE__ */ e(
|
|
235
|
+
L,
|
|
233
236
|
{
|
|
234
237
|
name: s,
|
|
235
|
-
src:
|
|
238
|
+
src: a,
|
|
236
239
|
size: i === "compact" ? "sm" : "md"
|
|
237
240
|
}
|
|
238
241
|
) : /* @__PURE__ */ e(
|
|
239
|
-
|
|
242
|
+
w,
|
|
240
243
|
{
|
|
241
244
|
size: i === "compact" ? "sm" : "md",
|
|
242
245
|
label: s
|
|
@@ -244,13 +247,13 @@ function Ne({
|
|
|
244
247
|
),
|
|
245
248
|
/* @__PURE__ */ e("span", { className: "type-title-item ds:text-[color:var(--foreground)]", children: s }),
|
|
246
249
|
/* @__PURE__ */ c("div", { className: "ds:ms-auto ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]", children: [
|
|
247
|
-
|
|
250
|
+
r ? /* @__PURE__ */ e(
|
|
248
251
|
D,
|
|
249
252
|
{
|
|
250
253
|
intent: "ghost",
|
|
251
254
|
size: "sm",
|
|
252
255
|
startIcon: /* @__PURE__ */ e(me, { "aria-hidden": "true" }),
|
|
253
|
-
onClick:
|
|
256
|
+
onClick: r,
|
|
254
257
|
children: t("leo.newConversation")
|
|
255
258
|
}
|
|
256
259
|
) : null,
|
|
@@ -260,11 +263,11 @@ function Ne({
|
|
|
260
263
|
}
|
|
261
264
|
);
|
|
262
265
|
}
|
|
263
|
-
const C =
|
|
266
|
+
const C = k(
|
|
264
267
|
({
|
|
265
268
|
messages: s,
|
|
266
|
-
onSend:
|
|
267
|
-
onRetry:
|
|
269
|
+
onSend: a,
|
|
270
|
+
onRetry: r,
|
|
268
271
|
onSuggestion: o,
|
|
269
272
|
suggestions: i,
|
|
270
273
|
isGenerating: t = !1,
|
|
@@ -273,7 +276,7 @@ const C = L(
|
|
|
273
276
|
onUpgrade: n,
|
|
274
277
|
assistantName: m,
|
|
275
278
|
assistantAvatar: d,
|
|
276
|
-
userAvatar:
|
|
279
|
+
userAvatar: b,
|
|
277
280
|
greeting: v,
|
|
278
281
|
subtitle: I,
|
|
279
282
|
density: x = "default",
|
|
@@ -283,26 +286,26 @@ const C = L(
|
|
|
283
286
|
acceptedFileTypes: Z,
|
|
284
287
|
headerEndSlot: $
|
|
285
288
|
}, J) => {
|
|
286
|
-
const { t: p } = y(), f = m ?? p("leo.name"), K = v ?? p("leo.greeting"), V = I ?? p("leo.subtitle"), g = s[s.length - 1],
|
|
287
|
-
const N = p("chat.message.role.user"), T = P.map((
|
|
289
|
+
const { t: p } = y(), f = m ?? p("leo.name"), K = v ?? p("leo.greeting"), V = I ?? p("leo.subtitle"), g = s[s.length - 1], j = (g == null ? void 0 : g.role) === "assistant" && g.streaming === !0, P = j ? s.slice(0, -1) : s, Y = U(() => {
|
|
290
|
+
const N = p("chat.message.role.user"), T = P.map((h) => {
|
|
288
291
|
let _;
|
|
289
|
-
return
|
|
290
|
-
id:
|
|
292
|
+
return h.role === "assistant" ? _ = d != null && d.src ? { name: f, src: d.src } : { slot: /* @__PURE__ */ e(w, { size: "sm", label: f }) } : h.role === "user" && (_ = be(b, N)), {
|
|
293
|
+
id: h.id,
|
|
291
294
|
node: /* @__PURE__ */ e(
|
|
292
|
-
|
|
295
|
+
re,
|
|
293
296
|
{
|
|
294
|
-
role:
|
|
295
|
-
content:
|
|
297
|
+
role: h.role,
|
|
298
|
+
content: h.content,
|
|
296
299
|
avatar: _,
|
|
297
|
-
timestamp:
|
|
298
|
-
status:
|
|
300
|
+
timestamp: h.timestamp,
|
|
301
|
+
status: h.status,
|
|
299
302
|
renderMarkdown: S,
|
|
300
|
-
onRetry:
|
|
303
|
+
onRetry: r ? () => r(h.id) : void 0
|
|
301
304
|
}
|
|
302
305
|
)
|
|
303
306
|
};
|
|
304
307
|
});
|
|
305
|
-
return
|
|
308
|
+
return j && g && T.push({
|
|
306
309
|
id: g.id,
|
|
307
310
|
node: /* @__PURE__ */ e(
|
|
308
311
|
xe,
|
|
@@ -313,17 +316,17 @@ const C = L(
|
|
|
313
316
|
renderMarkdown: S
|
|
314
317
|
}
|
|
315
318
|
)
|
|
316
|
-
}), t && !
|
|
319
|
+
}), t && !j && T.push({
|
|
317
320
|
id: "__leo-typing__",
|
|
318
321
|
node: /* @__PURE__ */ c("div", { className: "ds:flex ds:w-full ds:items-start ds:gap-[var(--spacing-sm)]", children: [
|
|
319
322
|
d != null && d.src ? /* @__PURE__ */ e(
|
|
320
|
-
|
|
323
|
+
L,
|
|
321
324
|
{
|
|
322
325
|
name: f,
|
|
323
326
|
src: d.src,
|
|
324
327
|
size: "sm"
|
|
325
328
|
}
|
|
326
|
-
) : /* @__PURE__ */ e(
|
|
329
|
+
) : /* @__PURE__ */ e(w, { size: "sm", label: f }),
|
|
327
330
|
/* @__PURE__ */ e(
|
|
328
331
|
"div",
|
|
329
332
|
{
|
|
@@ -346,14 +349,14 @@ const C = L(
|
|
|
346
349
|
}), T;
|
|
347
350
|
}, [
|
|
348
351
|
P,
|
|
349
|
-
|
|
352
|
+
j,
|
|
350
353
|
g,
|
|
351
354
|
t,
|
|
352
355
|
f,
|
|
353
356
|
d == null ? void 0 : d.src,
|
|
354
|
-
|
|
357
|
+
b,
|
|
355
358
|
S,
|
|
356
|
-
|
|
359
|
+
r,
|
|
357
360
|
x,
|
|
358
361
|
p
|
|
359
362
|
]), G = l ? Math.min(100, Math.max(0, l.current / Math.max(1, l.limit) * 100)) : 0, z = l ? l.current >= l.limit : !1, F = l ? l.label ?? p("leo.usageLabel", {
|
|
@@ -413,7 +416,7 @@ const C = L(
|
|
|
413
416
|
le,
|
|
414
417
|
{
|
|
415
418
|
submitOnEnter: !0,
|
|
416
|
-
onSubmit:
|
|
419
|
+
onSubmit: a,
|
|
417
420
|
onAttach: X,
|
|
418
421
|
accept: Z,
|
|
419
422
|
disabled: z,
|
|
@@ -469,8 +472,13 @@ const C = L(
|
|
|
469
472
|
"div",
|
|
470
473
|
{
|
|
471
474
|
className: [
|
|
472
|
-
|
|
473
|
-
|
|
475
|
+
// No top divider — the ChatInput's own soft shadow + the
|
|
476
|
+
// border-radius give it enough visual containment, and a
|
|
477
|
+
// surface-level separator here read as a sharp line at
|
|
478
|
+
// 1px-equivalent shadow blur. Keep the bg explicit so
|
|
479
|
+
// the chat-input chrome paints over the messages-area
|
|
480
|
+
// background instead of mixing with it.
|
|
481
|
+
"ds:shrink-0 ds:bg-[var(--background)]",
|
|
474
482
|
"ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
|
|
475
483
|
"ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]"
|
|
476
484
|
].join(" "),
|
|
@@ -478,7 +486,7 @@ const C = L(
|
|
|
478
486
|
}
|
|
479
487
|
)
|
|
480
488
|
] }) : /* @__PURE__ */ e(
|
|
481
|
-
|
|
489
|
+
ae,
|
|
482
490
|
{
|
|
483
491
|
messages: Y,
|
|
484
492
|
density: x,
|
|
@@ -492,11 +500,11 @@ const C = L(
|
|
|
492
500
|
}
|
|
493
501
|
);
|
|
494
502
|
C.displayName = "LeoChatSurface";
|
|
495
|
-
const ye =
|
|
496
|
-
({ headerSlot: s, ...
|
|
503
|
+
const ye = k(
|
|
504
|
+
({ headerSlot: s, ...a }, r) => /* @__PURE__ */ c(
|
|
497
505
|
"div",
|
|
498
506
|
{
|
|
499
|
-
ref:
|
|
507
|
+
ref: r,
|
|
500
508
|
className: [
|
|
501
509
|
"ds:flex ds:min-h-0 ds:flex-1 ds:flex-col",
|
|
502
510
|
"ds:bg-[var(--background)] ds:text-[color:var(--foreground)]",
|
|
@@ -524,7 +532,7 @@ const ye = L(
|
|
|
524
532
|
"ds:[max-inline-size:48rem]",
|
|
525
533
|
"ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]"
|
|
526
534
|
].join(" "),
|
|
527
|
-
children: /* @__PURE__ */ e(C, { ...
|
|
535
|
+
children: /* @__PURE__ */ e(C, { ...a })
|
|
528
536
|
}
|
|
529
537
|
) })
|
|
530
538
|
]
|
|
@@ -535,17 +543,17 @@ ye.displayName = "LeoEmbedded";
|
|
|
535
543
|
function ze(s) {
|
|
536
544
|
return s > 99 ? "99+" : String(s);
|
|
537
545
|
}
|
|
538
|
-
const
|
|
546
|
+
const we = k(
|
|
539
547
|
({
|
|
540
548
|
open: s,
|
|
541
|
-
onOpenChange:
|
|
542
|
-
position:
|
|
549
|
+
onOpenChange: a,
|
|
550
|
+
position: r = "bottom-end",
|
|
543
551
|
unseenCount: o,
|
|
544
552
|
assistantName: i,
|
|
545
553
|
assistantAvatar: t,
|
|
546
554
|
...u
|
|
547
555
|
}, l) => {
|
|
548
|
-
const { t: n } = y(), m = i || n("leo.name"), d = typeof o == "number" && o > 0,
|
|
556
|
+
const { t: n } = y(), m = i || n("leo.name"), d = typeof o == "number" && o > 0, b = d ? n("leo.unseenCount", { count: o }) : n("leo.open"), v = /* @__PURE__ */ e(ee.Close, { asChild: !0, children: /* @__PURE__ */ e(
|
|
549
557
|
B,
|
|
550
558
|
{
|
|
551
559
|
icon: /* @__PURE__ */ e(de, { "aria-hidden": "true" }),
|
|
@@ -555,7 +563,7 @@ const je = L(
|
|
|
555
563
|
"data-testid": "leo-popout-close"
|
|
556
564
|
}
|
|
557
565
|
) });
|
|
558
|
-
return /* @__PURE__ */ c(E.Root, { open: s, onOpenChange:
|
|
566
|
+
return /* @__PURE__ */ c(E.Root, { open: s, onOpenChange: a, children: [
|
|
559
567
|
/* @__PURE__ */ e(
|
|
560
568
|
"div",
|
|
561
569
|
{
|
|
@@ -563,7 +571,7 @@ const je = L(
|
|
|
563
571
|
className: [
|
|
564
572
|
"ds:fixed ds:z-[var(--z-fixed)]",
|
|
565
573
|
"ds:bottom-[calc(var(--spacing-lg)+env(safe-area-inset-bottom,0px))]",
|
|
566
|
-
|
|
574
|
+
r === "bottom-end" ? "ds:end-[var(--spacing-lg)]" : "ds:start-[var(--spacing-lg)]"
|
|
567
575
|
].join(" "),
|
|
568
576
|
"data-testid": "leo-popout-fab-wrapper",
|
|
569
577
|
children: /* @__PURE__ */ c("div", { className: "ds:relative", children: [
|
|
@@ -571,11 +579,11 @@ const je = L(
|
|
|
571
579
|
se,
|
|
572
580
|
{
|
|
573
581
|
icon: /* @__PURE__ */ e(M, { "aria-hidden": "true" }),
|
|
574
|
-
"aria-label":
|
|
582
|
+
"aria-label": b,
|
|
575
583
|
variant: "primary",
|
|
576
584
|
size: "md",
|
|
577
585
|
position: "static",
|
|
578
|
-
onClick: () =>
|
|
586
|
+
onClick: () => a(!0),
|
|
579
587
|
"data-testid": "leo-popout-fab"
|
|
580
588
|
}
|
|
581
589
|
),
|
|
@@ -628,22 +636,22 @@ const je = L(
|
|
|
628
636
|
] });
|
|
629
637
|
}
|
|
630
638
|
);
|
|
631
|
-
|
|
632
|
-
function
|
|
639
|
+
we.displayName = "LeoPopout";
|
|
640
|
+
function je(s) {
|
|
633
641
|
return s > 99 ? "99+" : String(s);
|
|
634
642
|
}
|
|
635
|
-
const
|
|
643
|
+
const ke = "ds:[inline-size:22rem]", Le = "ds:[inline-size:3rem]", Ce = k(
|
|
636
644
|
({
|
|
637
645
|
open: s,
|
|
638
|
-
onOpenChange:
|
|
639
|
-
side:
|
|
646
|
+
onOpenChange: a,
|
|
647
|
+
side: r = "end",
|
|
640
648
|
unseenCount: o,
|
|
641
649
|
footerSlot: i,
|
|
642
650
|
assistantName: t,
|
|
643
651
|
assistantAvatar: u,
|
|
644
652
|
...l
|
|
645
653
|
}, n) => {
|
|
646
|
-
const { t: m } = y(), d = t || m("leo.name"),
|
|
654
|
+
const { t: m } = y(), d = t || m("leo.name"), b = typeof o == "number" && o > 0, v = r === "end" ? "ds:shadow-[var(--shadow-chrome-start)]" : "ds:shadow-[var(--shadow-chrome-end)]", I = b ? m("leo.unseenCount", { count: o }) : m("leo.open");
|
|
647
655
|
if (!s)
|
|
648
656
|
return /* @__PURE__ */ e(
|
|
649
657
|
"aside",
|
|
@@ -655,7 +663,7 @@ const Le = "ds:[inline-size:22rem]", we = "ds:[inline-size:3rem]", Ce = L(
|
|
|
655
663
|
"ds:bg-[var(--background)]",
|
|
656
664
|
v,
|
|
657
665
|
"ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]",
|
|
658
|
-
|
|
666
|
+
Le
|
|
659
667
|
].join(" "),
|
|
660
668
|
"data-testid": "leo-sidebar-rail",
|
|
661
669
|
"data-leo-sidebar-state": "collapsed",
|
|
@@ -668,11 +676,11 @@ const Le = "ds:[inline-size:22rem]", we = "ds:[inline-size:3rem]", Ce = L(
|
|
|
668
676
|
"aria-expanded": "false",
|
|
669
677
|
intent: "ghost",
|
|
670
678
|
size: "sm",
|
|
671
|
-
onClick: () =>
|
|
679
|
+
onClick: () => a(!0),
|
|
672
680
|
"data-testid": "leo-sidebar-rail-trigger"
|
|
673
681
|
}
|
|
674
682
|
),
|
|
675
|
-
|
|
683
|
+
b ? /* @__PURE__ */ e(
|
|
676
684
|
"span",
|
|
677
685
|
{
|
|
678
686
|
"aria-hidden": "true",
|
|
@@ -689,7 +697,7 @@ const Le = "ds:[inline-size:22rem]", we = "ds:[inline-size:3rem]", Ce = L(
|
|
|
689
697
|
"ds:pointer-events-none ds:select-none",
|
|
690
698
|
"ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]"
|
|
691
699
|
].join(" "),
|
|
692
|
-
children:
|
|
700
|
+
children: je(o)
|
|
693
701
|
}
|
|
694
702
|
) : null
|
|
695
703
|
] })
|
|
@@ -698,12 +706,12 @@ const Le = "ds:[inline-size:22rem]", we = "ds:[inline-size:3rem]", Ce = L(
|
|
|
698
706
|
const x = /* @__PURE__ */ e(
|
|
699
707
|
B,
|
|
700
708
|
{
|
|
701
|
-
icon:
|
|
709
|
+
icon: r === "end" ? /* @__PURE__ */ e(ue, {}) : /* @__PURE__ */ e(fe, {}),
|
|
702
710
|
intent: "ghost",
|
|
703
711
|
size: "sm",
|
|
704
712
|
"aria-label": m("leo.close"),
|
|
705
713
|
"aria-expanded": "true",
|
|
706
|
-
onClick: () =>
|
|
714
|
+
onClick: () => a(!1),
|
|
707
715
|
"data-testid": "leo-sidebar-collapse"
|
|
708
716
|
}
|
|
709
717
|
);
|
|
@@ -716,7 +724,7 @@ const Le = "ds:[inline-size:22rem]", we = "ds:[inline-size:3rem]", Ce = L(
|
|
|
716
724
|
"ds:flex ds:shrink-0 ds:flex-col ds:min-h-0",
|
|
717
725
|
"ds:bg-[var(--background)]",
|
|
718
726
|
v,
|
|
719
|
-
|
|
727
|
+
ke,
|
|
720
728
|
"ds:h-full"
|
|
721
729
|
].join(" "),
|
|
722
730
|
"data-testid": "leo-sidebar",
|
|
@@ -736,7 +744,7 @@ const Le = "ds:[inline-size:22rem]", we = "ds:[inline-size:3rem]", Ce = L(
|
|
|
736
744
|
"div",
|
|
737
745
|
{
|
|
738
746
|
"data-testid": "leo-sidebar-footer-slot",
|
|
739
|
-
className: "ds:shrink-0 ds:
|
|
747
|
+
className: "ds:shrink-0 ds:shadow-[var(--shadow-chrome-up)]",
|
|
740
748
|
children: i
|
|
741
749
|
}
|
|
742
750
|
) : null
|
|
@@ -749,7 +757,7 @@ Ce.displayName = "LeoSidebar";
|
|
|
749
757
|
export {
|
|
750
758
|
C as L,
|
|
751
759
|
ye as a,
|
|
752
|
-
|
|
760
|
+
we as b,
|
|
753
761
|
Ce as c
|
|
754
762
|
};
|
|
755
|
-
//# sourceMappingURL=leo-sidebar-
|
|
763
|
+
//# sourceMappingURL=leo-sidebar-nbHib2D-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leo-sidebar-nbHib2D-.js","sources":["../../node_modules/lucide-react/dist/esm/icons/sparkles.js","../../src/patterns/leo-assistant/leo-chat-surface.tsx","../../src/patterns/leo-assistant/leo-embedded.tsx","../../src/patterns/leo-assistant/leo-popout.tsx","../../src/patterns/leo-assistant/leo-sidebar.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.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 [\n \"path\",\n {\n d: \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * Leo Assistant — inner chat surface shared between embedded and popout\n * modes. This is a pure presentational composition of existing DS\n * primitives and owns NO state, NO API calls, NO SSE parsing — the\n * consuming app drives `messages`, `isGenerating`, `usage`, and the\n * callbacks.\n */\nimport {\n forwardRef,\n useMemo,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Plus, Sparkles, Square, User } from 'lucide-react';\nimport { Avatar } from '../../components/avatar';\nimport { Button } from '../../components/button';\nimport { ChatContainer } from '../../components/chat-container';\nimport { ChatMessage } from '../../components/chat-message';\nimport { ChatInput } from '../../components/chat-input';\nimport { StreamingText } from '../../components/streaming-text';\nimport {\n SuggestionChip,\n SuggestionChipGroup,\n} from '../../components/suggestion-chip';\nimport { TypingIndicator } from '../../components/typing-indicator';\nimport { Progress } from '../../components/progress';\nimport type {\n LeoChatSurfaceProps,\n LeoMessage,\n LeoSuggestion,\n LeoUserAvatar,\n} from './leo-types';\n\n/* ------------------------------------------------------------------ */\n/* Leo identity tile — Sparkles on an accent-tinted disc. */\n/* */\n/* Used in place of <Avatar> for Leo's own identity (header + empty */\n/* state + streaming/typing rows) so the visual identity matches the */\n/* collapsed sidebar rail trigger. When the consuming app supplies an */\n/* `assistantAvatar.src`, LeoChatSurface falls back to <Avatar> — the */\n/* sparkle is for the DS-provided default only. */\n/* */\n/* Sizes mirror the Avatar size scale we were replacing: */\n/* sm → 32px (row messages, streaming bubble, compact header) */\n/* md → 40px (default header) */\n/* xl → 64px (empty-state hero) */\n/* ------------------------------------------------------------------ */\n\nconst LEO_TILE_SIZES = {\n sm: {\n box: 'ds:size-[calc(var(--spacing-md)*2)]',\n icon: 'ds:size-4',\n },\n md: {\n box: 'ds:size-[calc(var(--spacing-md)*2.5)]',\n icon: 'ds:size-[1.125rem]',\n },\n xl: {\n box: 'ds:size-[calc(var(--spacing-md)*4)]',\n icon: 'ds:size-8',\n },\n} as const;\n\nfunction LeoIdentityTile({\n size,\n label,\n}: {\n size: keyof typeof LEO_TILE_SIZES;\n label: string;\n}) {\n const dims = LEO_TILE_SIZES[size];\n return (\n <span\n role=\"img\"\n aria-label={label}\n className={[\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)]',\n // Subtle accent-tinted disc so the sparkle reads against both\n // light and dark surfaces without a hard-coded literal colour.\n 'ds:bg-[color-mix(in_srgb,var(--accent)_14%,transparent)]',\n 'ds:text-[color:var(--accent)]',\n // forced-colors: UA strips color-mix backgrounds; fall back to\n // a bordered disc so the identity still reads in HCM.\n 'ds:forced-colors:bg-transparent ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n dims.box,\n ].join(' ')}\n >\n <Sparkles aria-hidden=\"true\" className={dims.icon} />\n </span>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* User identity tile — neutral companion to the Sparkles tile above. */\n/* Rendered when the caller has no user avatar to display, so the */\n/* conversation still has a consistent visual anchor on both sides. */\n/* Uses --muted/--muted-foreground so it reads as \"neutral person\" */\n/* without borrowing the brand accent. */\n/* ------------------------------------------------------------------ */\n\nfunction UserIdentityTile({\n size,\n label,\n}: {\n size: keyof typeof LEO_TILE_SIZES;\n label: string;\n}) {\n const dims = LEO_TILE_SIZES[size];\n return (\n <span\n role=\"img\"\n aria-label={label}\n className={[\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color-mix(in_srgb,var(--muted-foreground)_14%,transparent)]',\n 'ds:text-[color:var(--muted-foreground)]',\n 'ds:forced-colors:bg-transparent ds:forced-colors:border ds:forced-colors:border-[CanvasText]',\n dims.box,\n ].join(' ')}\n >\n <User aria-hidden=\"true\" className={dims.icon} />\n </span>\n );\n}\n\n/**\n * Pick the right avatar shape for a user message.\n *\n * Precedence (highest wins):\n * 1. `userAvatar.slot` — caller supplied a fully custom node.\n * 2. `userAvatar.src` — caller supplied a photo (or initials override via `name`).\n * 3. `userAvatar.name` only — <Avatar> renders initials.\n * 4. Nothing supplied — fall back to the neutral `<UserIdentityTile>`.\n */\nfunction resolveUserAvatar(\n userAvatar: LeoUserAvatar | undefined,\n defaultLabel: string,\n) {\n if (!userAvatar) {\n return { slot: <UserIdentityTile size=\"sm\" label={defaultLabel} /> };\n }\n if (userAvatar.slot) return { slot: userAvatar.slot };\n // Pass the fields straight through; ChatMessage scrubs `src` with\n // `safeImageSrc` and falls back to initials from `name`.\n return { name: userAvatar.name, src: userAvatar.src };\n}\n\n/* ------------------------------------------------------------------ */\n/* Empty state — branded welcome shown when messages is empty */\n/* ------------------------------------------------------------------ */\n\ninterface EmptyStateProps {\n assistantName: string;\n avatarSrc?: string;\n greeting: string;\n subtitle: string;\n suggestions?: LeoSuggestion[];\n onSuggestion?: (suggestion: LeoSuggestion) => void;\n}\n\nfunction EmptyState({\n assistantName,\n avatarSrc,\n greeting,\n subtitle,\n suggestions,\n onSuggestion,\n}: EmptyStateProps) {\n const { t } = useTranslation();\n const headingId = 'leo-empty-state-heading';\n\n return (\n <section\n role=\"region\"\n aria-labelledby={headingId}\n className={[\n 'ds:flex ds:flex-1 ds:min-h-0 ds:flex-col ds:items-center ds:justify-center',\n 'ds:text-center',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)]',\n 'ds:pt-[var(--spacing-xl)] ds:pb-[var(--spacing-xl)]',\n 'ds:gap-[var(--spacing-md)]',\n ].join(' ')}\n data-testid=\"leo-empty-state\"\n >\n {avatarSrc ? (\n <Avatar name={assistantName} src={avatarSrc} size=\"xl\" />\n ) : (\n <LeoIdentityTile size=\"xl\" label={assistantName} />\n )}\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:max-w-[32rem]\">\n <h2\n id={headingId}\n className=\"type-title-section ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {greeting}\n </h2>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--muted-foreground)]\">\n {subtitle}\n </p>\n </div>\n {suggestions && suggestions.length > 0 ? (\n <div className=\"ds:w-full ds:max-w-[40rem]\">\n <SuggestionChipGroup\n label={t('leo.exampleQuestions')}\n className=\"ds:justify-center\"\n >\n {suggestions.map((s) => (\n <SuggestionChip\n key={s.id}\n intent=\"suggestion\"\n startIcon={s.icon}\n keepOnSelect\n onSelect={() => onSuggestion?.(s)}\n >\n {s.label}\n </SuggestionChip>\n ))}\n </SuggestionChipGroup>\n </div>\n ) : null}\n </section>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Streaming message — renders the last assistant message's body via */\n/* StreamingText when `streaming: true`. */\n/* ------------------------------------------------------------------ */\n\ninterface StreamingMessageProps {\n message: LeoMessage;\n assistantName: string;\n avatarSrc?: string;\n renderMarkdown?: boolean;\n}\n\nfunction StreamingMessage({\n message,\n assistantName,\n avatarSrc,\n renderMarkdown,\n}: StreamingMessageProps) {\n const { t, i18n } = useTranslation();\n const roleLabel = t('chat.message.role.assistant');\n const formattedTime = useMemo(() => {\n if (!message.timestamp) return null;\n const date =\n message.timestamp instanceof Date\n ? message.timestamp\n : new Date(message.timestamp);\n if (Number.isNaN(date.getTime())) return null;\n return new Intl.DateTimeFormat(i18n.language, {\n hour: '2-digit',\n minute: '2-digit',\n }).format(date);\n }, [message.timestamp, i18n.language]);\n\n const label = formattedTime\n ? t('chat.message.label', { role: roleLabel, time: formattedTime })\n : t('chat.message.labelNoTime', { role: roleLabel });\n\n return (\n <article\n aria-label={label}\n className=\"ds:flex ds:w-full ds:items-start ds:flex-row ds:gap-[var(--spacing-sm)]\"\n >\n {avatarSrc ? (\n <Avatar name={assistantName} src={avatarSrc} size=\"sm\" />\n ) : (\n <LeoIdentityTile size=\"sm\" label={assistantName} />\n )}\n <div className=\"ds:flex ds:flex-col ds:items-start\">\n <div\n dir=\"auto\"\n className={[\n 'ds:relative ds:max-w-[min(42rem,90%)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'type-body',\n 'ds:break-words',\n 'ds:bg-muted/40 ds:text-foreground',\n 'ds:rounded-[var(--radius-md)] ds:rounded-es-[var(--radius-sm)]',\n ].join(' ')}\n >\n <StreamingText\n content={message.content}\n isStreaming={true}\n renderMarkdown={renderMarkdown}\n />\n </div>\n </div>\n </article>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Header bar — avatar + name + optional new-conversation + end slot */\n/* ------------------------------------------------------------------ */\n\ninterface HeaderBarProps {\n assistantName: string;\n avatarSrc?: string;\n onNewConversation?: () => void;\n headerEndSlot?: ReactNode;\n density: 'default' | 'compact';\n}\n\nfunction HeaderBar({\n assistantName,\n avatarSrc,\n onNewConversation,\n headerEndSlot,\n density,\n}: HeaderBarProps) {\n const { t } = useTranslation();\n return (\n <header\n aria-label={t('leo.headerLabel')}\n className={[\n 'ds:flex ds:shrink-0 ds:items-center ds:gap-[var(--spacing-sm)]',\n // Soft drop-shadow on the block-end edge in place of a `border-b`\n // against `--border` — same rationale as the Leo sidebar's inline\n // edge (see leo-sidebar.tsx).\n 'ds:shadow-[var(--shadow-chrome-down)]',\n 'ds:bg-[var(--background)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n density === 'compact'\n ? 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]'\n : 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' ')}\n data-testid=\"leo-header\"\n >\n {avatarSrc ? (\n <Avatar\n name={assistantName}\n src={avatarSrc}\n size={density === 'compact' ? 'sm' : 'md'}\n />\n ) : (\n <LeoIdentityTile\n size={density === 'compact' ? 'sm' : 'md'}\n label={assistantName}\n />\n )}\n <span className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {assistantName}\n </span>\n <div className=\"ds:ms-auto ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {onNewConversation ? (\n <Button\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<Plus aria-hidden=\"true\" />}\n onClick={onNewConversation}\n >\n {t('leo.newConversation')}\n </Button>\n ) : null}\n {headerEndSlot}\n </div>\n </header>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main export — LeoChatSurface */\n/* ------------------------------------------------------------------ */\n\nexport const LeoChatSurface = forwardRef<HTMLDivElement, LeoChatSurfaceProps>(\n (\n {\n messages,\n onSend,\n onRetry,\n onSuggestion,\n suggestions,\n isGenerating = false,\n onStopGenerating,\n usage,\n onUpgrade,\n assistantName,\n assistantAvatar,\n userAvatar,\n greeting,\n subtitle,\n density = 'default',\n renderMarkdown = true,\n onNewConversation,\n onAttach,\n acceptedFileTypes,\n headerEndSlot,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const resolvedName = assistantName ?? t('leo.name');\n const resolvedGreeting = greeting ?? t('leo.greeting');\n const resolvedSubtitle = subtitle ?? t('leo.subtitle');\n\n const lastMessage = messages[messages.length - 1];\n const lastIsStreamingAssistant =\n lastMessage?.role === 'assistant' && lastMessage.streaming === true;\n const listMessages = lastIsStreamingAssistant\n ? messages.slice(0, -1)\n : messages;\n\n // ChatContainer messages — each visible non-streaming message becomes\n // a ChatMessage; the streaming tail + typing indicator are appended.\n const containerMessages = useMemo(() => {\n const userLabel = t('chat.message.role.user');\n const base = listMessages.map((m) => {\n let avatar;\n if (m.role === 'assistant') {\n // Consumer-provided image wins; otherwise render the Sparkles tile.\n avatar = assistantAvatar?.src\n ? { name: resolvedName, src: assistantAvatar.src }\n : { slot: <LeoIdentityTile size=\"sm\" label={resolvedName} /> };\n } else if (m.role === 'user') {\n avatar = resolveUserAvatar(userAvatar, userLabel);\n }\n return {\n id: m.id,\n node: (\n <ChatMessage\n role={m.role}\n content={m.content}\n avatar={avatar}\n timestamp={m.timestamp}\n status={m.status}\n renderMarkdown={renderMarkdown}\n onRetry={onRetry ? () => onRetry(m.id) : undefined}\n />\n ),\n };\n });\n\n if (lastIsStreamingAssistant && lastMessage) {\n base.push({\n id: lastMessage.id,\n node: (\n <StreamingMessage\n message={lastMessage}\n assistantName={resolvedName}\n avatarSrc={assistantAvatar?.src}\n renderMarkdown={renderMarkdown}\n />\n ),\n });\n }\n\n if (isGenerating && !lastIsStreamingAssistant) {\n base.push({\n id: '__leo-typing__',\n node: (\n <div className=\"ds:flex ds:w-full ds:items-start ds:gap-[var(--spacing-sm)]\">\n {assistantAvatar?.src ? (\n <Avatar\n name={resolvedName}\n src={assistantAvatar.src}\n size=\"sm\"\n />\n ) : (\n <LeoIdentityTile size=\"sm\" label={resolvedName} />\n )}\n <div\n className={[\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:rounded-es-[var(--radius-sm)]',\n 'ds:bg-muted/40',\n ].join(' ')}\n >\n <TypingIndicator\n label={t('chat.typing')}\n density={density}\n />\n </div>\n </div>\n ),\n });\n }\n\n return base;\n }, [\n listMessages,\n lastIsStreamingAssistant,\n lastMessage,\n isGenerating,\n resolvedName,\n assistantAvatar?.src,\n userAvatar,\n renderMarkdown,\n onRetry,\n density,\n t,\n ]);\n\n // Usage progress data.\n const usagePercent = usage\n ? Math.min(100, Math.max(0, (usage.current / Math.max(1, usage.limit)) * 100))\n : 0;\n const usageFull = usage ? usage.current >= usage.limit : false;\n const usageLabel = usage\n ? usage.label ??\n t('leo.usageLabel', {\n current: usage.current,\n limit: usage.limit,\n })\n : null;\n\n const isEmpty = messages.length === 0 && !isGenerating;\n\n // Composer — disabled when usage is full.\n const composer = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {usage ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span\n className={[\n 'type-meta',\n usageFull\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n data-testid=\"leo-usage-label\"\n >\n {usageFull ? t('leo.usageLimitReached') : usageLabel}\n </span>\n {usageFull && onUpgrade ? (\n <Button intent=\"primary\" size=\"sm\" onClick={onUpgrade}>\n {t('leo.upgrade')}\n </Button>\n ) : null}\n </div>\n <Progress\n value={usagePercent}\n max={100}\n size=\"sm\"\n ariaLabel={usageLabel ?? t('leo.usageLabel', {\n current: usage.current,\n limit: usage.limit,\n })}\n className={\n usageFull\n ? 'ds:[&_[role=progressbar]>*]:bg-[color:var(--destructive)]'\n : undefined\n }\n data-testid=\"leo-usage-progress\"\n />\n </div>\n ) : null}\n {!isEmpty && suggestions && suggestions.length > 0 && !isGenerating ? (\n <SuggestionChipGroup\n label={t('leo.exampleQuestions')}\n data-testid=\"leo-followup-suggestions\"\n >\n {suggestions.map((s) => (\n <SuggestionChip\n key={s.id}\n intent=\"followup\"\n startIcon={s.icon}\n keepOnSelect\n onSelect={() => onSuggestion?.(s)}\n >\n {s.label}\n </SuggestionChip>\n ))}\n </SuggestionChipGroup>\n ) : null}\n <div className=\"ds:flex ds:items-end ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex-1 ds:min-w-0\">\n <ChatInput\n submitOnEnter\n onSubmit={onSend}\n onAttach={onAttach}\n accept={acceptedFileTypes}\n disabled={usageFull}\n data-testid=\"leo-composer\"\n />\n </div>\n {isGenerating && onStopGenerating ? (\n <Button\n intent=\"outline\"\n size=\"sm\"\n startIcon={<Square aria-hidden=\"true\" />}\n onClick={onStopGenerating}\n aria-label={t('leo.stopGenerating')}\n >\n {t('leo.stopGenerating')}\n </Button>\n ) : null}\n </div>\n </div>\n );\n\n return (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:min-h-0 ds:flex-1 ds:flex-col',\n 'ds:bg-[var(--background)] ds:text-[color:var(--foreground)]',\n ].join(' ')}\n data-testid=\"leo-surface\"\n >\n <HeaderBar\n assistantName={resolvedName}\n avatarSrc={assistantAvatar?.src}\n onNewConversation={onNewConversation}\n headerEndSlot={headerEndSlot}\n density={density}\n />\n {isEmpty ? (\n <>\n <EmptyState\n assistantName={resolvedName}\n avatarSrc={assistantAvatar?.src}\n greeting={resolvedGreeting}\n subtitle={resolvedSubtitle}\n suggestions={suggestions}\n onSuggestion={onSuggestion}\n />\n <div\n className={[\n // No top divider — the ChatInput's own soft shadow + the\n // border-radius give it enough visual containment, and a\n // surface-level separator here read as a sharp line at\n // 1px-equivalent shadow blur. Keep the bg explicit so\n // the chat-input chrome paints over the messages-area\n // background instead of mixing with it.\n 'ds:shrink-0 ds:bg-[var(--background)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n ].join(' ')}\n >\n {composer}\n </div>\n </>\n ) : (\n <ChatContainer\n messages={containerMessages}\n density={density}\n composer={composer}\n className=\"ds:flex-1 ds:min-h-0\"\n />\n )}\n </div>\n );\n },\n);\n\nLeoChatSurface.displayName = 'LeoChatSurface';\n","/**\n * Leo Assistant — embedded (full-page) mode. Fills the parent container\n * (typically `<AppFrame padded={false}>`'s `<main>` slot) with a\n * ChatGPT-style centred conversation column.\n */\nimport { forwardRef, type ReactNode } from 'react';\nimport { LeoChatSurface } from './leo-chat-surface';\nimport type { LeoChatSurfaceProps } from './leo-types';\n\nexport interface LeoEmbeddedProps extends LeoChatSurfaceProps {\n /** Optional slot rendered above the chat surface (e.g. a breadcrumb). */\n headerSlot?: ReactNode;\n}\n\nexport const LeoEmbedded = forwardRef<HTMLDivElement, LeoEmbeddedProps>(\n ({ headerSlot, ...surfaceProps }, ref) => {\n return (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:min-h-0 ds:flex-1 ds:flex-col',\n 'ds:bg-[var(--background)] ds:text-[color:var(--foreground)]',\n 'ds:h-full ds:w-full',\n ].join(' ')}\n data-testid=\"leo-embedded\"\n >\n {headerSlot ? (\n <div\n className={[\n 'ds:shrink-0',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n ].join(' ')}\n >\n {headerSlot}\n </div>\n ) : null}\n <div className=\"ds:flex ds:min-h-0 ds:flex-1 ds:flex-col ds:items-stretch\">\n <div\n className={[\n 'ds:flex ds:min-h-0 ds:w-full ds:flex-1 ds:flex-col',\n 'ds:ms-auto ds:me-auto',\n 'ds:[max-inline-size:48rem]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n ].join(' ')}\n >\n <LeoChatSurface {...surfaceProps} />\n </div>\n </div>\n </div>\n );\n },\n);\n\nLeoEmbedded.displayName = 'LeoEmbedded';\n","/**\n * Leo Assistant — popout (FAB + Sheet) mode. A floating trigger button\n * anchored to the bottom-inline-end corner opens a slide-in `Sheet`\n * panel containing the same `LeoChatSurface` in compact density.\n *\n * Z-index: the FAB sits on `--z-fixed`; the Sheet sits on `--z-modal`.\n * Both render above the app chrome but below any open Dialog.\n */\nimport { forwardRef } from 'react';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { useTranslation } from 'react-i18next';\nimport { Sparkles, X } from 'lucide-react';\nimport { FloatingActionButton } from '../../components/floating-action-button';\nimport { IconButton } from '../../components/button';\nimport { Sheet } from '../../components/sheet';\nimport { LeoChatSurface } from './leo-chat-surface';\nimport type { LeoChatSurfaceProps } from './leo-types';\n\nexport interface LeoPopoutProps extends LeoChatSurfaceProps {\n /** Whether the popout panel is open. */\n open: boolean;\n /** Fires when the panel should open or close. */\n onOpenChange: (open: boolean) => void;\n /** Position of the FAB trigger. */\n position?: 'bottom-end' | 'bottom-start';\n /** Optional unseen message count badge on the FAB. */\n unseenCount?: number;\n}\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\nexport const LeoPopout = forwardRef<HTMLDivElement, LeoPopoutProps>(\n (\n {\n open,\n onOpenChange,\n position = 'bottom-end',\n unseenCount,\n assistantName,\n assistantAvatar,\n ...surfaceProps\n },\n ref,\n ) => {\n const { t } = useTranslation();\n // `|| t(…)` (not `??`) — also defaults when the host passes an empty\n // string so Radix Dialog's required `Sheet.Title` is never empty.\n const resolvedName = assistantName || t('leo.name');\n const showBadge = typeof unseenCount === 'number' && unseenCount > 0;\n\n const triggerLabel = showBadge\n ? t('leo.unseenCount', { count: unseenCount })\n : t('leo.open');\n\n // Close button injected into the chat surface header via the\n // headerEndSlot hook — keeps the Sheet's title wiring and DialogClose\n // semantics without duplicating the header shell.\n const headerEndSlot = (\n <RadixDialog.Close asChild>\n <IconButton\n icon={<X aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('leo.close')}\n data-testid=\"leo-popout-close\"\n />\n </RadixDialog.Close>\n );\n\n return (\n <Sheet.Root open={open} onOpenChange={onOpenChange}>\n {/* FAB trigger — sits outside the Sheet.Trigger so the unseen-\n count badge can overlay it. A Sheet.Trigger wrapper would\n turn the FAB into a button-inside-a-button. Instead, we\n invoke `onOpenChange(true)` on click. */}\n <div\n ref={ref}\n className={[\n 'ds:fixed ds:z-[var(--z-fixed)]',\n 'ds:bottom-[calc(var(--spacing-lg)+env(safe-area-inset-bottom,0px))]',\n position === 'bottom-end'\n ? 'ds:end-[var(--spacing-lg)]'\n : 'ds:start-[var(--spacing-lg)]',\n ].join(' ')}\n data-testid=\"leo-popout-fab-wrapper\"\n >\n <div className=\"ds:relative\">\n <FloatingActionButton\n icon={<Sparkles aria-hidden=\"true\" />}\n aria-label={triggerLabel}\n variant=\"primary\"\n size=\"md\"\n position=\"static\"\n onClick={() => onOpenChange(true)}\n data-testid=\"leo-popout-fab\"\n />\n {showBadge ? (\n <span\n aria-hidden=\"true\"\n data-testid=\"leo-popout-badge\"\n className={[\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)]',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))]',\n 'ds:h-[calc(var(--spacing-md)+var(--spacing-xs))]',\n 'ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)] ds:text-[color:var(--destructive-foreground)]',\n 'ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n 'ds:pointer-events-none ds:select-none',\n 'ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]',\n ].join(' ')}\n >\n {formatBadgeCount(unseenCount)}\n </span>\n ) : null}\n </div>\n </div>\n\n <Sheet.Content\n side=\"end\"\n size=\"md\"\n aria-label={t('leo.panelLabel')}\n className=\"ds:flex ds:min-h-0 ds:flex-col ds:p-0\"\n data-testid=\"leo-popout-panel\"\n >\n {/* Sheet.Title is required by Radix Dialog for a11y. We hide it\n visually because LeoChatSurface renders its own header. */}\n <Sheet.Title className=\"ds:sr-only\">{resolvedName}</Sheet.Title>\n <LeoChatSurface\n {...surfaceProps}\n assistantName={resolvedName}\n assistantAvatar={assistantAvatar}\n density=\"compact\"\n headerEndSlot={headerEndSlot}\n />\n </Sheet.Content>\n </Sheet.Root>\n );\n },\n);\n\nLeoPopout.displayName = 'LeoPopout';\n","/**\n * Leo Assistant — sidebar (docked panel) mode.\n *\n * A persistent, non-modal panel that docks to the `inline-end` edge of\n * the layout. Unlike `LeoPopout` it does NOT trap focus or overlay\n * content — users can chat with Leo while continuing to interact with\n * the main surface. Collapses to an icon rail when `open={false}`.\n *\n * This is the intended **default desktop mode** for Leo once MCP tool\n * access and settings land: users will want Leo visible while they\n * configure servers, inspect tool runs, and reference data. On mobile\n * viewports the consuming app should flip to `LeoPopout` because a\n * 22rem sidebar would consume the entire screen.\n *\n * Unlike the popout (Radix Dialog) and embedded (full-page main) modes,\n * the sidebar is a plain `<aside>` landmark — it lives in the normal\n * layout flow and consumes inline space.\n */\nimport { forwardRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n ChevronsLeft,\n ChevronsRight,\n Sparkles,\n} from 'lucide-react';\nimport { IconButton } from '../../components/button';\nimport { LeoChatSurface } from './leo-chat-surface';\nimport type { LeoChatSurfaceProps } from './leo-types';\n\nexport interface LeoSidebarProps extends LeoChatSurfaceProps {\n /** Whether the sidebar is expanded. When false, a narrow icon rail\n * stays visible and clicking it fires `onOpenChange(true)`. */\n open: boolean;\n /** Fires when the user expands or collapses the sidebar. */\n onOpenChange: (open: boolean) => void;\n /** Which edge of the container the sidebar docks to. Defaults to\n * `'end'` (inline-end). RTL flips automatically via logical\n * properties. */\n side?: 'end' | 'start';\n /** Optional unseen-message count shown on the collapsed rail. */\n unseenCount?: number;\n /** Optional slot rendered under the chat surface (e.g. an MCP server\n * list or settings accordion). Future hook for the MCP panel. */\n footerSlot?: ReactNode;\n}\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\n// Fixed tokenised widths — keeps the pattern constraint-compliant (no\n// prop-driven inline styles). Consuming apps that need a different size\n// can wrap the sidebar in their own container and override via CSS.\nconst EXPANDED_WIDTH = 'ds:[inline-size:22rem]';\nconst RAIL_WIDTH = 'ds:[inline-size:3rem]';\n\nexport const LeoSidebar = forwardRef<HTMLElement, LeoSidebarProps>(\n (\n {\n open,\n onOpenChange,\n side = 'end',\n unseenCount,\n footerSlot,\n assistantName,\n assistantAvatar,\n ...surfaceProps\n },\n ref,\n ) => {\n const { t } = useTranslation();\n // `|| t(…)` — also defaults when the host passes an empty string,\n // so the collapsed-rail `aria-label` is never empty.\n const resolvedName = assistantName || t('leo.name');\n const showBadge = typeof unseenCount === 'number' && unseenCount > 0;\n\n // Soft drop-shadow on the inline-edge that faces the main content\n // area. Replaces a flat `border-s`/`border-e` against `--border`,\n // which since the WCAG 1.4.11 bump (grey-600 → grey-800) reads as a\n // heavy charcoal line at this scale. A directional shadow keeps the\n // panel-edge cue without needing to clear contrast thresholds the\n // way an actual border would. Tokenised via `--shadow-chrome-start`\n // / `--shadow-chrome-end` (see `src/tokens/index.css`).\n const borderClass =\n side === 'end'\n ? 'ds:shadow-[var(--shadow-chrome-start)]'\n : 'ds:shadow-[var(--shadow-chrome-end)]';\n\n const triggerLabel = showBadge\n ? t('leo.unseenCount', { count: unseenCount })\n : t('leo.open');\n\n // Collapsed rail — a tall vertical strip with the Leo icon plus an\n // unseen badge. Clicking it expands the sidebar.\n if (!open) {\n return (\n <aside\n ref={ref}\n aria-label={t('leo.panelLabel')}\n className={[\n 'ds:flex ds:shrink-0 ds:flex-col ds:items-center',\n 'ds:bg-[var(--background)]',\n borderClass,\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n RAIL_WIDTH,\n ].join(' ')}\n data-testid=\"leo-sidebar-rail\"\n data-leo-sidebar-state=\"collapsed\"\n >\n <div className=\"ds:relative ds:[&_svg]:text-[color:var(--accent)]\">\n <IconButton\n icon={<Sparkles aria-hidden=\"true\" />}\n aria-label={triggerLabel}\n aria-expanded=\"false\"\n intent=\"ghost\"\n size=\"sm\"\n onClick={() => onOpenChange(true)}\n data-testid=\"leo-sidebar-rail-trigger\"\n />\n {showBadge ? (\n <span\n aria-hidden=\"true\"\n data-testid=\"leo-sidebar-badge\"\n className={[\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)]',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))]',\n 'ds:h-[calc(var(--spacing-md)+var(--spacing-xs))]',\n 'ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)] ds:text-[color:var(--destructive-foreground)]',\n 'ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n 'ds:pointer-events-none ds:select-none',\n 'ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]',\n ].join(' ')}\n >\n {formatBadgeCount(unseenCount)}\n </span>\n ) : null}\n </div>\n </aside>\n );\n }\n\n // Expanded panel — same LeoChatSurface as embedded / popout, in\n // compact density, with a collapse-toggle injected into the header.\n // Chevron points toward the docked edge so users read it as\n // \"collapse toward that side\".\n const headerEndSlot = (\n <IconButton\n icon={side === 'end' ? <ChevronsRight /> : <ChevronsLeft />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('leo.close')}\n aria-expanded=\"true\"\n onClick={() => onOpenChange(false)}\n data-testid=\"leo-sidebar-collapse\"\n />\n );\n\n return (\n <aside\n ref={ref}\n aria-label={t('leo.panelLabel')}\n className={[\n 'ds:flex ds:shrink-0 ds:flex-col ds:min-h-0',\n 'ds:bg-[var(--background)]',\n borderClass,\n EXPANDED_WIDTH,\n 'ds:h-full',\n ].join(' ')}\n data-testid=\"leo-sidebar\"\n data-leo-sidebar-state=\"expanded\"\n >\n <div className=\"ds:flex ds:min-h-0 ds:flex-1 ds:flex-col\">\n <LeoChatSurface\n {...surfaceProps}\n assistantName={resolvedName}\n assistantAvatar={assistantAvatar}\n density=\"compact\"\n headerEndSlot={headerEndSlot}\n />\n </div>\n {footerSlot ? (\n <div\n data-testid=\"leo-sidebar-footer-slot\"\n className=\"ds:shrink-0 ds:shadow-[var(--shadow-chrome-up)]\"\n >\n {footerSlot}\n </div>\n ) : null}\n </aside>\n );\n },\n);\n\nLeoSidebar.displayName = 'LeoSidebar';\n"],"names":["__iconNode","Sparkles","createLucideIcon","LEO_TILE_SIZES","LeoIdentityTile","size","label","dims","jsx","UserIdentityTile","User","resolveUserAvatar","userAvatar","defaultLabel","EmptyState","assistantName","avatarSrc","greeting","subtitle","suggestions","onSuggestion","t","useTranslation","headingId","jsxs","Avatar","SuggestionChipGroup","s","SuggestionChip","StreamingMessage","message","renderMarkdown","i18n","roleLabel","formattedTime","useMemo","date","StreamingText","HeaderBar","onNewConversation","headerEndSlot","density","Button","Plus","LeoChatSurface","forwardRef","messages","onSend","onRetry","isGenerating","onStopGenerating","usage","onUpgrade","assistantAvatar","onAttach","acceptedFileTypes","ref","resolvedName","resolvedGreeting","resolvedSubtitle","lastMessage","lastIsStreamingAssistant","listMessages","containerMessages","userLabel","base","m","avatar","ChatMessage","TypingIndicator","usagePercent","usageFull","usageLabel","isEmpty","composer","Progress","ChatInput","Square","Fragment","ChatContainer","LeoEmbedded","headerSlot","surfaceProps","formatBadgeCount","count","LeoPopout","open","onOpenChange","position","unseenCount","showBadge","triggerLabel","RadixDialog","IconButton","X","Sheet","FloatingActionButton","EXPANDED_WIDTH","RAIL_WIDTH","LeoSidebar","side","footerSlot","borderClass","ChevronsRight","ChevronsLeft"],"mappings":"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","x_google_ignoreList":[0]}
|