@burdenoff/fe-libs 2026.713.2 → 2026.713.4

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.
@@ -13,6 +13,22 @@ export interface AssistantWidgetProps {
13
13
  launcherClassName?: string;
14
14
  /** Speech-recognition language tag. */
15
15
  voiceLang?: string;
16
+ /**
17
+ * `floating` (default) — the small bottom-right popover every product uses.
18
+ * `sidebar` — a full-height panel docked to the right edge, for products whose
19
+ * assistant does long multi-step work worth watching (BigConsole).
20
+ *
21
+ * Defaulted, so a product that passes nothing keeps the exact UI it has today.
22
+ */
23
+ layout?: 'floating' | 'sidebar';
24
+ /**
25
+ * Show the conversations rail (New chat / History, with per-chat delete).
26
+ * Ignored unless the transport actually implements session management —
27
+ * a panel whose buttons do nothing is worse than no panel.
28
+ */
29
+ showSessionPanel?: boolean;
30
+ /** Route in-app links from assistant replies without a full page reload. */
31
+ onNavigate?: (href: string) => void;
16
32
  }
17
33
  /** External toggle hook so command palettes / plugins can open the widget. */
18
34
  export declare const ASSISTANT_WIDGET_TOGGLE_EVENT = "bf:toggle-assistant-widget";
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,kBAAkB,EAA0B,MAAM,SAAS,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AAyB1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAkVpD,CAAC"}
1
+ {"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAef,OAAO,KAAK,EAA2B,kBAAkB,EAA0B,MAAM,SAAS,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AAyB1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAwhBpD,CAAC"}
@@ -1,57 +1,58 @@
1
1
  import { cn as e } from "../../utils/cn.js";
2
2
  import { useVoiceInput as t } from "./useVoiceInput.js";
3
- import { useCallback as n, useEffect as r, useMemo as i, useRef as a, useState as o } from "react";
4
- import { Loader2 as s, MessageCircle as c, Mic as l, Send as u, Sparkles as d, X as f } from "lucide-react";
5
- import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
3
+ import { MessageContent as n } from "./MessageContent.js";
4
+ import { useCallback as r, useEffect as i, useMemo as a, useRef as o, useState as s } from "react";
5
+ import { History as ee, Loader2 as c, MessageCircle as l, Mic as te, Plus as ne, Send as re, Sparkles as u, Trash2 as ie, X as d } from "lucide-react";
6
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
6
7
  //#region src/shared/components/assistantWidget/AssistantWidget.tsx
7
- var g = "bf:toggle-assistant-widget", _ = "bf:assistant-widget:isOpen";
8
- function v() {
8
+ var h = "bf:toggle-assistant-widget", g = "bf:assistant-widget:isOpen";
9
+ function _() {
9
10
  if (typeof window > "u") return !1;
10
11
  try {
11
- return window.sessionStorage.getItem(_) === "1";
12
+ return window.sessionStorage.getItem(g) === "1";
12
13
  } catch {
13
14
  return !1;
14
15
  }
15
16
  }
16
- function y(e) {
17
+ function v(e) {
17
18
  if (!(typeof window > "u")) try {
18
- window.sessionStorage.setItem(_, e ? "1" : "0");
19
+ window.sessionStorage.setItem(g, e ? "1" : "0");
19
20
  } catch {}
20
21
  }
21
- function b() {
22
+ function y() {
22
23
  return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
23
24
  }
24
- var x = ({ transport: _, title: x = "AI Assistant", subtitle: S = "Ask me to do things on this screen — I can run them for you.", placeholder: C = "Ask anything, or describe what to create…", launcherClassName: w, voiceLang: T = "en-US" }) => {
25
- let [E, D] = o(() => v()), [O, k] = o([]), [A, j] = o(""), [M, N] = o(!1), [P, F] = o(!1), I = a(null), L = a(null), R = a(null), z = a(!1), B = t(T), V = n(() => {
26
- y(!0), D(!0);
27
- }, []), H = n(() => {
28
- y(!1), D(!1);
29
- }, []), U = n(() => {
25
+ var b = ({ transport: g, title: b = "AI Assistant", subtitle: x = "Ask me to do things on this screen — I can run them for you.", placeholder: S = "Ask anything, or describe what to create…", launcherClassName: C, voiceLang: w = "en-US", layout: T = "floating", showSessionPanel: ae = !1, onNavigate: oe }) => {
26
+ let [E, D] = s(() => _()), [O, k] = s([]), [A, j] = s(""), [M, N] = s(!1), [P, F] = s(!1), [I, L] = s([]), [R, z] = s(!1), [B, V] = s(!1), H = o(null), U = o(null), W = o(null), G = o(!1), K = T === "sidebar", se = ae && !!g.newSession, q = t(w), J = r(() => {
27
+ v(!0), D(!0);
28
+ }, []), Y = r(() => {
29
+ v(!1), D(!1);
30
+ }, []), X = r(() => {
30
31
  D((e) => {
31
32
  let t = !e;
32
- return y(t), t;
33
+ return v(t), t;
33
34
  });
34
35
  }, []);
35
- r(() => {
36
+ i(() => {
36
37
  let e = (e) => {
37
38
  let t = e.detail;
38
- t?.open === !0 ? V() : t?.open === !1 ? H() : U();
39
+ t?.open === !0 ? J() : t?.open === !1 ? Y() : X();
39
40
  };
40
- return window.addEventListener(g, e), () => window.removeEventListener(g, e);
41
+ return window.addEventListener(h, e), () => window.removeEventListener(h, e);
41
42
  }, [
42
- V,
43
- H,
44
- U
45
- ]), r(() => {
46
- B.isListening && B.transcript && j(B.transcript);
47
- }, [B.transcript, B.isListening]), r(() => {
48
- if (!E || z.current) return;
49
- let e = _.loadHistory;
43
+ J,
44
+ Y,
45
+ X
46
+ ]), i(() => {
47
+ q.isListening && q.transcript && j(q.transcript);
48
+ }, [q.transcript, q.isListening]), i(() => {
49
+ if (!E || G.current) return;
50
+ let e = g.loadHistory;
50
51
  if (!e) {
51
- z.current = !0;
52
+ G.current = !0;
52
53
  return;
53
54
  }
54
- z.current = !0;
55
+ G.current = !0;
55
56
  let t = !1;
56
57
  return F(!0), (async () => {
57
58
  try {
@@ -63,23 +64,64 @@ var x = ({ transport: _, title: x = "AI Assistant", subtitle: S = "Ask me to do
63
64
  })(), () => {
64
65
  t = !0;
65
66
  };
66
- }, [E, _]), r(() => {
67
- E && L.current && (L.current.scrollTop = L.current.scrollHeight);
67
+ }, [E, g]), i(() => {
68
+ E && U.current && (U.current.scrollTop = U.current.scrollHeight);
68
69
  }, [O, E]);
69
- let W = n((e, t) => {
70
+ let Z = r((e, t) => {
70
71
  k((n) => n.map((n) => n.id === e ? {
71
72
  ...n,
72
73
  ...t
73
74
  } : n));
74
- }, []), G = n(async () => {
75
+ }, []), Q = r(async () => {
76
+ if (g.listSessions) {
77
+ V(!0);
78
+ try {
79
+ L(await g.listSessions());
80
+ } catch {
81
+ L([]);
82
+ } finally {
83
+ V(!1);
84
+ }
85
+ }
86
+ }, [g]), ce = r(async () => {
87
+ !g.newSession || M || (k([]), j(""), z(!1), await g.newSession());
88
+ }, [g, M]), le = r(async (e, t) => {
89
+ if (!(!g.deleteSession || M)) {
90
+ L((t) => t.filter((t) => t.id !== e)), t && (k([]), j(""));
91
+ try {
92
+ await g.deleteSession(e);
93
+ } finally {
94
+ Q();
95
+ }
96
+ }
97
+ }, [
98
+ g,
99
+ M,
100
+ Q
101
+ ]), ue = r(() => {
102
+ z((e) => (e || Q(), !e));
103
+ }, [Q]), de = r(async (e) => {
104
+ if (!(!g.selectSession || M)) {
105
+ F(!0);
106
+ try {
107
+ k(await g.selectSession(e)), z(!1), Q();
108
+ } catch {} finally {
109
+ F(!1);
110
+ }
111
+ }
112
+ }, [
113
+ g,
114
+ M,
115
+ Q
116
+ ]), $ = r(async () => {
75
117
  let e = A.trim();
76
118
  if (!e || M) return;
77
- B.isListening && B.stop(), B.reset(), j(""), I.current && (I.current.style.height = "auto");
119
+ q.isListening && q.stop(), q.reset(), j(""), H.current && (H.current.style.height = "auto");
78
120
  let t = {
79
- id: b(),
121
+ id: y(),
80
122
  role: "user",
81
123
  content: e
82
- }, n = b();
124
+ }, n = y();
83
125
  k((e) => [
84
126
  ...e,
85
127
  t,
@@ -91,147 +133,209 @@ var x = ({ transport: _, title: x = "AI Assistant", subtitle: S = "Ask me to do
91
133
  }
92
134
  ]), N(!0);
93
135
  let r = new AbortController();
94
- R.current = r;
136
+ W.current = r;
95
137
  try {
96
- let { text: t } = await _.sendPrompt({
138
+ let { text: t } = await g.sendPrompt({
97
139
  prompt: e,
98
140
  signal: r.signal,
99
- onProgress: (e) => W(n, { content: e })
141
+ onProgress: (e) => Z(n, { content: e })
100
142
  });
101
- W(n, {
143
+ Z(n, {
102
144
  content: t,
103
145
  pending: !1
104
146
  });
105
147
  } catch (e) {
106
- W(n, {
148
+ Z(n, {
107
149
  content: `Sorry, I couldn't complete that: ${e instanceof Error ? e.message : "Something went wrong. Please try again."}`,
108
150
  pending: !1,
109
151
  error: !0
110
152
  });
111
153
  } finally {
112
- N(!1), R.current = null;
154
+ N(!1), W.current = null, R && Q();
113
155
  }
114
156
  }, [
115
157
  A,
116
158
  M,
117
- W,
118
- _,
119
- B
120
- ]), K = n((e) => {
121
- e.key === "Enter" && !e.shiftKey && (e.preventDefault(), G());
122
- }, [G]), q = n(() => {
123
- let e = I.current;
159
+ Z,
160
+ g,
161
+ q,
162
+ R,
163
+ Q
164
+ ]), fe = r((e) => {
165
+ e.key === "Enter" && !e.shiftKey && (e.preventDefault(), $());
166
+ }, [$]), pe = r(() => {
167
+ let e = H.current;
124
168
  e && (e.style.height = "auto", e.style.height = `${Math.min(e.scrollHeight, 120)}px`);
125
- }, []), J = n(() => {
126
- B.isListening ? B.stop() : B.start();
127
- }, [B]);
128
- return /* @__PURE__ */ h(p, { children: [i(() => /* @__PURE__ */ m("button", {
169
+ }, []), me = r(() => {
170
+ q.isListening ? q.stop() : q.start();
171
+ }, [q]);
172
+ return /* @__PURE__ */ m(f, { children: [a(() => /* @__PURE__ */ p("button", {
129
173
  type: "button",
130
- onClick: U,
174
+ onClick: X,
131
175
  "aria-label": E ? "Close AI assistant" : "Open AI assistant",
132
176
  "aria-expanded": E,
133
177
  "data-testid": "assistant-widget-launcher",
134
- className: e("fixed bottom-6 right-6 z-[100] inline-flex size-14 items-center justify-center rounded-full", "bg-action-primary-bg text-action-primary-text shadow-xl transition-transform duration-200", "hover:scale-105 hover:bg-action-primary-bg-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer", w),
135
- children: m(E ? f : d, { className: "size-6" })
178
+ className: e("fixed bottom-6 right-6 z-[100] inline-flex size-14 items-center justify-center rounded-full", "bg-action-primary-bg text-action-primary-text shadow-xl transition-transform duration-200", "hover:scale-105 hover:bg-action-primary-bg-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer", C),
179
+ children: p(E ? d : u, { className: "size-6" })
136
180
  }), [
137
181
  E,
138
- U,
139
- w
140
- ]), E ? /* @__PURE__ */ h("div", {
182
+ X,
183
+ C
184
+ ]), E ? /* @__PURE__ */ m("div", {
141
185
  role: "dialog",
142
- "aria-label": x,
186
+ "aria-label": b,
143
187
  "data-testid": "assistant-widget-window",
144
- className: e("fixed z-[100] flex flex-col overflow-hidden rounded-xl border border-border-default bg-bg-surface shadow-2xl", "bottom-24 right-6 h-[560px] max-h-[calc(100vh-7rem)] w-[calc(100vw-3rem)] sm:w-[400px]", "animate-in slide-in-from-bottom-2 fade-in duration-200"),
145
- children: [
146
- /* @__PURE__ */ h("div", {
147
- className: "flex items-center justify-between gap-2 border-b border-border-subtle bg-bg-surface px-4 py-3",
148
- children: [/* @__PURE__ */ h("div", {
149
- className: "flex min-w-0 items-center gap-2",
150
- children: [/* @__PURE__ */ m("span", {
151
- className: "inline-flex size-7 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-action-primary-bg",
152
- children: /* @__PURE__ */ m(d, { className: "size-4" })
153
- }), /* @__PURE__ */ m("h2", {
154
- className: "truncate text-sm font-semibold text-text-primary",
155
- children: x
156
- })]
157
- }), /* @__PURE__ */ m("button", {
188
+ "data-layout": T,
189
+ className: e("fixed z-[100] flex overflow-hidden border-border-default bg-bg-surface shadow-2xl", K ? "inset-y-0 right-0 h-screen w-full border-l sm:w-[480px] lg:w-[560px] animate-in slide-in-from-right duration-200" : "flex-col rounded-xl border bottom-24 right-6 h-[560px] max-h-[calc(100vh-7rem)] w-[calc(100vw-3rem)] sm:w-[400px] animate-in slide-in-from-bottom-2 fade-in duration-200"),
190
+ children: [K && se ? /* @__PURE__ */ m("aside", {
191
+ "data-testid": "assistant-session-panel",
192
+ className: "flex w-[168px] shrink-0 flex-col gap-1 border-r border-border-subtle bg-bg-sunken p-2",
193
+ children: [
194
+ /* @__PURE__ */ m("button", {
158
195
  type: "button",
159
- onClick: H,
160
- "aria-label": "Close AI assistant",
161
- "data-testid": "assistant-widget-close",
162
- className: "inline-flex size-8 shrink-0 items-center justify-center rounded-md text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer",
163
- children: /* @__PURE__ */ m(f, { className: "size-4" })
164
- })]
165
- }),
166
- /* @__PURE__ */ m("div", {
167
- ref: L,
168
- className: "flex-1 space-y-3 overflow-y-auto px-4 py-4",
169
- "data-testid": "assistant-widget-messages",
170
- children: O.length === 0 && P ? /* @__PURE__ */ h("div", {
171
- "data-testid": "assistant-widget-restoring",
172
- className: "flex h-full flex-col items-center justify-center gap-3 text-center",
173
- children: [/* @__PURE__ */ m(s, { className: "size-5 animate-spin text-text-secondary" }), /* @__PURE__ */ m("p", {
174
- className: "text-xs leading-relaxed text-text-secondary",
175
- children: "Restoring your conversation…"
176
- })]
177
- }) : O.length === 0 ? /* @__PURE__ */ h("div", {
178
- className: "flex h-full flex-col items-center justify-center gap-3 text-center",
179
- children: [/* @__PURE__ */ m("span", {
180
- className: "inline-flex size-12 items-center justify-center rounded-full bg-bg-sunken text-action-primary-bg",
181
- children: /* @__PURE__ */ m(c, { className: "size-6" })
182
- }), /* @__PURE__ */ m("p", {
183
- className: "max-w-[16rem] text-xs leading-relaxed text-text-secondary",
184
- children: S
185
- })]
186
- }) : O.map((t) => /* @__PURE__ */ m("div", {
187
- className: e("flex", t.role === "user" ? "justify-end" : "justify-start"),
188
- children: /* @__PURE__ */ h("div", {
189
- "data-testid": `assistant-widget-message-${t.role}`,
190
- className: e("max-w-[85%] whitespace-pre-wrap break-words rounded-lg px-3 py-2 text-xs leading-relaxed", t.role === "user" ? "bg-action-primary-bg text-action-primary-text" : t.error ? "bg-status-error-bg/10 text-status-error-bg" : "bg-bg-sunken text-text-primary"),
191
- children: [t.content || (t.pending, ""), t.pending ? /* @__PURE__ */ h("span", {
192
- className: "mt-1 inline-flex items-center gap-1 text-text-secondary",
193
- children: [/* @__PURE__ */ m(s, { className: "size-3 animate-spin" }), /* @__PURE__ */ m("span", { children: "Thinking…" })]
196
+ onClick: () => void ce(),
197
+ disabled: M,
198
+ "data-testid": "assistant-new-chat",
199
+ className: "flex items-center gap-2 rounded-md px-2 py-2 text-xs font-medium text-text-primary transition-colors hover:bg-bg-surface disabled:opacity-50 cursor-pointer",
200
+ children: [/* @__PURE__ */ p(ne, { className: "size-4 shrink-0" }), "New chat"]
201
+ }),
202
+ /* @__PURE__ */ m("button", {
203
+ type: "button",
204
+ onClick: ue,
205
+ "aria-expanded": R,
206
+ "data-testid": "assistant-history-toggle",
207
+ className: "flex items-center gap-2 rounded-md px-2 py-2 text-xs font-medium text-text-primary transition-colors hover:bg-bg-surface cursor-pointer",
208
+ children: [/* @__PURE__ */ p(ee, { className: "size-4 shrink-0" }), "History"]
209
+ }),
210
+ R ? /* @__PURE__ */ p("div", {
211
+ "data-testid": "assistant-history-list",
212
+ className: "mt-1 flex-1 space-y-0.5 overflow-y-auto border-t border-border-subtle pt-2",
213
+ children: B && I.length === 0 ? /* @__PURE__ */ m("p", {
214
+ className: "flex items-center gap-1.5 px-2 py-1 text-[11px] text-text-muted",
215
+ children: [/* @__PURE__ */ p(c, { className: "size-3 animate-spin" }), "Loading…"]
216
+ }) : I.length === 0 ? /* @__PURE__ */ p("p", {
217
+ className: "px-2 py-1 text-[11px] leading-relaxed text-text-muted",
218
+ children: "No past chats yet."
219
+ }) : I.map((t) => /* @__PURE__ */ m("div", {
220
+ "data-testid": "assistant-history-row",
221
+ className: e("group flex items-center gap-1 rounded pr-1 transition-colors", t.active ? "bg-bg-surface" : "hover:bg-bg-surface"),
222
+ children: [/* @__PURE__ */ p("button", {
223
+ type: "button",
224
+ onClick: () => void de(t.id),
225
+ title: t.title,
226
+ "data-testid": "assistant-history-item",
227
+ className: e("min-w-0 flex-1 truncate rounded px-2 py-1.5 text-left text-[11px] leading-relaxed cursor-pointer", t.active ? "font-medium text-text-primary" : "text-text-secondary group-hover:text-text-primary"),
228
+ children: t.title
229
+ }), g.deleteSession ? /* @__PURE__ */ p("button", {
230
+ type: "button",
231
+ onClick: () => void le(t.id, !!t.active),
232
+ disabled: M,
233
+ "aria-label": `Delete chat: ${t.title}`,
234
+ title: "Delete this chat",
235
+ "data-testid": "assistant-delete-chat",
236
+ className: "inline-flex size-6 shrink-0 items-center justify-center rounded text-text-muted opacity-0 transition-opacity hover:text-status-error-bg focus-visible:opacity-100 group-hover:opacity-100 disabled:opacity-30 cursor-pointer",
237
+ children: /* @__PURE__ */ p(ie, { className: "size-3.5" })
194
238
  }) : null]
195
- })
196
- }, t.id))
197
- }),
198
- /* @__PURE__ */ h("div", {
199
- className: "flex items-end gap-2 border-t border-border-default bg-bg-surface px-3 py-2.5",
200
- children: [
201
- B.isSupported ? /* @__PURE__ */ m("button", {
239
+ }, t.id))
240
+ }) : null
241
+ ]
242
+ }) : null, /* @__PURE__ */ m("div", {
243
+ className: "flex min-w-0 flex-1 flex-col",
244
+ children: [
245
+ /* @__PURE__ */ m("div", {
246
+ className: "flex items-center justify-between gap-2 border-b border-border-subtle bg-bg-surface px-4 py-3",
247
+ children: [/* @__PURE__ */ m("div", {
248
+ className: "flex min-w-0 items-center gap-2",
249
+ children: [/* @__PURE__ */ p("span", {
250
+ className: "inline-flex size-7 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-action-primary-bg",
251
+ children: /* @__PURE__ */ p(u, { className: "size-4" })
252
+ }), /* @__PURE__ */ p("h2", {
253
+ className: "truncate text-sm font-semibold text-text-primary",
254
+ children: b
255
+ })]
256
+ }), /* @__PURE__ */ p("button", {
202
257
  type: "button",
203
- onClick: J,
204
- "aria-label": B.isListening ? "Stop voice input" : "Start voice input",
205
- "aria-pressed": B.isListening,
206
- "data-testid": "assistant-widget-mic",
207
- className: e("flex size-9 shrink-0 items-center justify-center rounded-lg transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer", B.isListening ? "animate-pulse bg-status-error-bg text-action-primary-text" : "bg-bg-sunken text-text-secondary hover:text-text-primary"),
208
- children: /* @__PURE__ */ m(l, { className: "size-4" })
209
- }) : null,
210
- /* @__PURE__ */ m("textarea", {
211
- ref: I,
212
- value: A,
213
- onChange: (e) => j(e.target.value),
214
- onKeyDown: K,
215
- onInput: q,
216
- rows: 1,
217
- placeholder: C,
218
- "aria-label": "Message the assistant",
219
- "data-testid": "assistant-widget-input",
220
- className: "flex-1 resize-none rounded-lg border border-border-default bg-bg-sunken px-3 py-2 text-xs leading-relaxed text-text-primary placeholder:text-text-muted focus:border-action-primary-bg focus:outline-none"
221
- }),
222
- /* @__PURE__ */ m("button", {
223
- type: "button",
224
- onClick: () => void G(),
225
- disabled: M || A.trim().length === 0,
226
- "aria-label": "Send message",
227
- "data-testid": "assistant-widget-send",
228
- className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg text-action-primary-text transition-colors hover:bg-action-primary-bg-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong disabled:opacity-50 cursor-pointer",
229
- children: M ? /* @__PURE__ */ m(s, { className: "size-4 animate-spin" }) : /* @__PURE__ */ m(u, { className: "size-4" })
230
- })
231
- ]
232
- })
233
- ]
258
+ onClick: Y,
259
+ "aria-label": "Close AI assistant",
260
+ "data-testid": "assistant-widget-close",
261
+ className: "inline-flex size-8 shrink-0 items-center justify-center rounded-md text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer",
262
+ children: /* @__PURE__ */ p(d, { className: "size-4" })
263
+ })]
264
+ }),
265
+ /* @__PURE__ */ p("div", {
266
+ ref: U,
267
+ className: "flex-1 space-y-3 overflow-y-auto px-4 py-4",
268
+ "data-testid": "assistant-widget-messages",
269
+ children: O.length === 0 && P ? /* @__PURE__ */ m("div", {
270
+ "data-testid": "assistant-widget-restoring",
271
+ className: "flex h-full flex-col items-center justify-center gap-3 text-center",
272
+ children: [/* @__PURE__ */ p(c, { className: "size-5 animate-spin text-text-secondary" }), /* @__PURE__ */ p("p", {
273
+ className: "text-xs leading-relaxed text-text-secondary",
274
+ children: "Restoring your conversation…"
275
+ })]
276
+ }) : O.length === 0 ? /* @__PURE__ */ m("div", {
277
+ className: "flex h-full flex-col items-center justify-center gap-3 text-center",
278
+ children: [/* @__PURE__ */ p("span", {
279
+ className: "inline-flex size-12 items-center justify-center rounded-full bg-bg-sunken text-action-primary-bg",
280
+ children: /* @__PURE__ */ p(l, { className: "size-6" })
281
+ }), /* @__PURE__ */ p("p", {
282
+ className: "max-w-[16rem] text-xs leading-relaxed text-text-secondary",
283
+ children: x
284
+ })]
285
+ }) : O.map((t) => /* @__PURE__ */ p("div", {
286
+ className: e("flex", t.role === "user" ? "justify-end" : "justify-start"),
287
+ children: /* @__PURE__ */ m("div", {
288
+ "data-testid": `assistant-widget-message-${t.role}`,
289
+ className: e("whitespace-pre-wrap break-words rounded-lg px-3 py-2 text-xs leading-relaxed", K ? "max-w-[92%]" : "max-w-[85%]", t.role === "user" ? "bg-action-primary-bg text-action-primary-text" : t.error ? "bg-status-error-bg/10 text-status-error-bg" : "bg-bg-sunken text-text-primary"),
290
+ children: [t.content ? /* @__PURE__ */ p(n, {
291
+ content: t.content,
292
+ onNavigate: oe
293
+ }) : null, t.pending ? /* @__PURE__ */ m("span", {
294
+ "data-testid": "assistant-widget-working",
295
+ className: e("inline-flex items-center gap-1 text-text-secondary", t.content ? "mt-1" : ""),
296
+ children: [/* @__PURE__ */ p(c, { className: "size-3 animate-spin" }), t.content ? null : /* @__PURE__ */ p("span", { children: "Working on it…" })]
297
+ }) : null]
298
+ })
299
+ }, t.id))
300
+ }),
301
+ /* @__PURE__ */ m("div", {
302
+ className: "flex items-end gap-2 border-t border-border-default bg-bg-surface px-3 py-2.5",
303
+ children: [
304
+ q.isSupported ? /* @__PURE__ */ p("button", {
305
+ type: "button",
306
+ onClick: me,
307
+ "aria-label": q.isListening ? "Stop voice input" : "Start voice input",
308
+ "aria-pressed": q.isListening,
309
+ "data-testid": "assistant-widget-mic",
310
+ className: e("flex size-9 shrink-0 items-center justify-center rounded-lg transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer", q.isListening ? "animate-pulse bg-status-error-bg text-action-primary-text" : "bg-bg-sunken text-text-secondary hover:text-text-primary"),
311
+ children: /* @__PURE__ */ p(te, { className: "size-4" })
312
+ }) : null,
313
+ /* @__PURE__ */ p("textarea", {
314
+ ref: H,
315
+ value: A,
316
+ onChange: (e) => j(e.target.value),
317
+ onKeyDown: fe,
318
+ onInput: pe,
319
+ rows: 1,
320
+ placeholder: S,
321
+ "aria-label": "Message the assistant",
322
+ "data-testid": "assistant-widget-input",
323
+ className: "flex-1 resize-none rounded-lg border border-border-default bg-bg-sunken px-3 py-2 text-xs leading-relaxed text-text-primary placeholder:text-text-muted focus:border-action-primary-bg focus:outline-none"
324
+ }),
325
+ /* @__PURE__ */ p("button", {
326
+ type: "button",
327
+ onClick: () => void $(),
328
+ disabled: M || A.trim().length === 0,
329
+ "aria-label": "Send message",
330
+ "data-testid": "assistant-widget-send",
331
+ className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg text-action-primary-text transition-colors hover:bg-action-primary-bg-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong disabled:opacity-50 cursor-pointer",
332
+ children: M ? /* @__PURE__ */ p(c, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(re, { className: "size-4" })
333
+ })
334
+ ]
335
+ })
336
+ ]
337
+ })]
234
338
  }) : null] });
235
339
  };
236
340
  //#endregion
237
- export { g as ASSISTANT_WIDGET_TOGGLE_EVENT, x as AssistantWidget };
341
+ export { h as ASSISTANT_WIDGET_TOGGLE_EVENT, b as AssistantWidget };
@@ -0,0 +1,11 @@
1
+ import { FC } from 'react';
2
+ export interface MessageContentProps {
3
+ content: string;
4
+ /**
5
+ * Called for in-app (`/…`) links so the host can route without a full page
6
+ * reload. When omitted, in-app links fall back to a normal anchor.
7
+ */
8
+ onNavigate?: (href: string) => void;
9
+ }
10
+ export declare const MessageContent: FC<MessageContentProps>;
11
+ //# sourceMappingURL=MessageContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageContent.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/MessageContent.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAY,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAW1D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAqDlD,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Fragment as e } from "react";
2
+ import { Fragment as t, jsx as n } from "react/jsx-runtime";
3
+ //#region src/shared/components/assistantWidget/MessageContent.tsx
4
+ var r = /\[([^\]]+)\]\(([^)\s]+)\)/g;
5
+ function i(e) {
6
+ return e.startsWith("/") && !e.startsWith("//") ? !0 : e.startsWith("https://");
7
+ }
8
+ var a = ({ content: a, onNavigate: o }) => {
9
+ let s = [], c = 0, l = new RegExp(r.source, "g");
10
+ for (let t of a.matchAll(l)) {
11
+ let [r, l, u] = t, d = t.index ?? 0;
12
+ if (d > c && s.push(/* @__PURE__ */ n(e, { children: a.slice(c, d) }, `t${String(c)}`)), l && u && i(u)) {
13
+ let e = u.startsWith("/");
14
+ s.push(/* @__PURE__ */ n("a", {
15
+ href: u,
16
+ "data-testid": "assistant-message-link",
17
+ ...e ? { onClick: o ? (e) => {
18
+ e.preventDefault(), o(u);
19
+ } : void 0 } : {
20
+ target: "_blank",
21
+ rel: "noopener noreferrer"
22
+ },
23
+ className: "font-medium text-action-primary-bg underline underline-offset-2 hover:opacity-80",
24
+ children: l
25
+ }, `l${String(d)}`));
26
+ } else s.push(/* @__PURE__ */ n(e, { children: l ?? r }, `u${String(d)}`));
27
+ c = d + r.length;
28
+ }
29
+ return c < a.length && s.push(/* @__PURE__ */ n(e, { children: a.slice(c) }, `t${String(c)}`)), /* @__PURE__ */ n(t, { children: s });
30
+ };
31
+ //#endregion
32
+ export { a as MessageContent };
@@ -33,10 +33,33 @@ export interface AssistantSendArgs {
33
33
  * Backend adapter the host product supplies. A single transport instance is
34
34
  * reused across turns so it can keep a warm session/sandbox between sends.
35
35
  */
36
+ /** One past conversation, for the history list. */
37
+ export interface AssistantSessionSummary {
38
+ id: string;
39
+ title: string;
40
+ /** epoch ms — used only for ordering/labelling. */
41
+ updatedAt?: number;
42
+ /** True for the conversation currently on screen. */
43
+ active?: boolean;
44
+ }
36
45
  export interface AssistantTransport {
37
46
  sendPrompt: (args: AssistantSendArgs) => Promise<{
38
47
  text: string;
39
48
  }>;
49
+ /** All conversations for this user/sandbox, newest first. */
50
+ listSessions?: () => Promise<AssistantSessionSummary[]>;
51
+ /** Start an empty conversation and make it active. */
52
+ newSession?: () => Promise<void>;
53
+ /**
54
+ * Delete one conversation by id.
55
+ *
56
+ * Replaces a blanket "clear chat", which could only ever remove whichever chat
57
+ * happened to be open — ambiguous, and useless for tidying up an old one. A
58
+ * delete control on each history row says exactly what it will remove.
59
+ */
60
+ deleteSession?: (sessionId: string) => Promise<void>;
61
+ /** Switch to a past conversation; returns its messages. */
62
+ selectSession?: (sessionId: string) => Promise<AssistantWidgetMessage[]>;
40
63
  /**
41
64
  * Optional: restore the conversation from the backend when the widget opens.
42
65
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;CACvD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAOnE,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IACxD,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACzE;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;CACvD"}
@@ -30,5 +30,5 @@ export { AssistantWidget, ASSISTANT_WIDGET_TOGGLE_EVENT } from './assistantWidge
30
30
  export type { AssistantWidgetProps } from './assistantWidget/AssistantWidget';
31
31
  export { useVoiceInput } from './assistantWidget/useVoiceInput';
32
32
  export type { UseVoiceInputReturn } from './assistantWidget/useVoiceInput';
33
- export type { AssistantTransport, AssistantSendArgs, AssistantWidgetMessage, AssistantWidgetRole, } from './assistantWidget/types';
33
+ export type { AssistantTransport, AssistantSendArgs, AssistantSessionSummary, AssistantWidgetMessage, AssistantWidgetRole, } from './assistantWidget/types';
34
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAI/E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,YAAY,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAEpF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAGlF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AACnG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAI/E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,YAAY,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAEpF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAGlF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AACnG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.713.2",
3
+ "version": "2026.713.4",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "imports": {