@axtec/components 0.1.7 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +1 -0
  2. package/dist/components/AgentChat/AgentChat.d.ts +32 -0
  3. package/dist/components/AgentChat/index.d.ts +1 -0
  4. package/dist/components/AgentPanel/AgentPanel.d.ts +44 -0
  5. package/dist/components/AgentPanel/index.d.ts +1 -0
  6. package/dist/components/OptionDivider/OptionDivider.d.ts +2 -1
  7. package/dist/components/index.d.ts +2 -0
  8. package/dist/index.css +1 -1
  9. package/dist/index.js +161 -157
  10. package/dist/index.js.map +1 -1
  11. package/dist/index10.js +77 -99
  12. package/dist/index10.js.map +1 -1
  13. package/dist/index11.js +91 -36
  14. package/dist/index11.js.map +1 -1
  15. package/dist/index12.js +97 -75
  16. package/dist/index12.js.map +1 -1
  17. package/dist/index13.js +38 -24
  18. package/dist/index13.js.map +1 -1
  19. package/dist/index14.js +76 -16
  20. package/dist/index14.js.map +1 -1
  21. package/dist/index15.js +24 -38
  22. package/dist/index15.js.map +1 -1
  23. package/dist/index16.js +18 -72
  24. package/dist/index16.js.map +1 -1
  25. package/dist/index17.js +36 -47
  26. package/dist/index17.js.map +1 -1
  27. package/dist/index18.js +73 -13
  28. package/dist/index18.js.map +1 -1
  29. package/dist/index19.js +47 -151
  30. package/dist/index19.js.map +1 -1
  31. package/dist/index20.js +12 -17
  32. package/dist/index20.js.map +1 -1
  33. package/dist/index21.js +148 -40
  34. package/dist/index21.js.map +1 -1
  35. package/dist/index22.js +18 -50
  36. package/dist/index22.js.map +1 -1
  37. package/dist/index23.js +41 -74
  38. package/dist/index23.js.map +1 -1
  39. package/dist/index24.js +46 -216
  40. package/dist/index24.js.map +1 -1
  41. package/dist/index25.js +73 -46
  42. package/dist/index25.js.map +1 -1
  43. package/dist/index26.js +212 -70
  44. package/dist/index26.js.map +1 -1
  45. package/dist/index27.js +51 -23
  46. package/dist/index27.js.map +1 -1
  47. package/dist/index28.js +74 -74
  48. package/dist/index28.js.map +1 -1
  49. package/dist/index29.js +19 -28
  50. package/dist/index29.js.map +1 -1
  51. package/dist/index3.js +2 -2
  52. package/dist/index30.js +62 -76
  53. package/dist/index30.js.map +1 -1
  54. package/dist/index31.js +28 -55
  55. package/dist/index31.js.map +1 -1
  56. package/dist/index32.js +87 -40
  57. package/dist/index32.js.map +1 -1
  58. package/dist/index33.js +57 -45
  59. package/dist/index33.js.map +1 -1
  60. package/dist/index34.js +40 -47
  61. package/dist/index34.js.map +1 -1
  62. package/dist/index35.js +47 -27
  63. package/dist/index35.js.map +1 -1
  64. package/dist/index36.js +52 -54
  65. package/dist/index36.js.map +1 -1
  66. package/dist/index37.js +28 -49
  67. package/dist/index37.js.map +1 -1
  68. package/dist/index38.js +54 -13
  69. package/dist/index38.js.map +1 -1
  70. package/dist/index39.js +46 -79
  71. package/dist/index39.js.map +1 -1
  72. package/dist/index40.js +13 -49
  73. package/dist/index40.js.map +1 -1
  74. package/dist/index41.js +80 -17
  75. package/dist/index41.js.map +1 -1
  76. package/dist/index42.js +48 -33
  77. package/dist/index42.js.map +1 -1
  78. package/dist/index43.js +17 -11
  79. package/dist/index43.js.map +1 -1
  80. package/dist/index44.js +34 -15
  81. package/dist/index44.js.map +1 -1
  82. package/dist/index45.js +16 -89
  83. package/dist/index45.js.map +1 -1
  84. package/dist/index46.js +15 -69
  85. package/dist/index46.js.map +1 -1
  86. package/dist/index47.js +85 -116
  87. package/dist/index47.js.map +1 -1
  88. package/dist/index48.js +69 -40
  89. package/dist/index48.js.map +1 -1
  90. package/dist/index49.js +120 -42
  91. package/dist/index49.js.map +1 -1
  92. package/dist/index5.js +1 -1
  93. package/dist/index50.js +39 -55
  94. package/dist/index50.js.map +1 -1
  95. package/dist/index51.js +39 -11
  96. package/dist/index51.js.map +1 -1
  97. package/dist/index52.js +53 -62
  98. package/dist/index52.js.map +1 -1
  99. package/dist/index53.js +16 -54
  100. package/dist/index53.js.map +1 -1
  101. package/dist/index54.js +64 -36
  102. package/dist/index54.js.map +1 -1
  103. package/dist/index55.js +54 -66
  104. package/dist/index55.js.map +1 -1
  105. package/dist/index56.js +37 -22
  106. package/dist/index56.js.map +1 -1
  107. package/dist/index57.js +63 -101
  108. package/dist/index57.js.map +1 -1
  109. package/dist/index58.js +16 -67
  110. package/dist/index58.js.map +1 -1
  111. package/dist/index59.js +99 -213
  112. package/dist/index59.js.map +1 -1
  113. package/dist/index6.js +1 -1
  114. package/dist/index60.js +67 -62
  115. package/dist/index60.js.map +1 -1
  116. package/dist/index61.js +206 -224
  117. package/dist/index61.js.map +1 -1
  118. package/dist/index62.js +62 -96
  119. package/dist/index62.js.map +1 -1
  120. package/dist/index63.js +233 -33
  121. package/dist/index63.js.map +1 -1
  122. package/dist/index64.js +98 -14
  123. package/dist/index64.js.map +1 -1
  124. package/dist/index65.js +35 -59
  125. package/dist/index65.js.map +1 -1
  126. package/dist/index66.js +16 -59
  127. package/dist/index66.js.map +1 -1
  128. package/dist/index67.js +57 -72
  129. package/dist/index67.js.map +1 -1
  130. package/dist/index68.js +58 -106
  131. package/dist/index68.js.map +1 -1
  132. package/dist/index69.js +70 -43
  133. package/dist/index69.js.map +1 -1
  134. package/dist/index7.js +157 -69
  135. package/dist/index7.js.map +1 -1
  136. package/dist/index70.js +101 -40
  137. package/dist/index70.js.map +1 -1
  138. package/dist/index71.js +44 -72
  139. package/dist/index71.js.map +1 -1
  140. package/dist/index72.js +47 -53
  141. package/dist/index72.js.map +1 -1
  142. package/dist/index73.js +70 -62
  143. package/dist/index73.js.map +1 -1
  144. package/dist/index74.js +46 -28
  145. package/dist/index74.js.map +1 -1
  146. package/dist/index75.js +67 -13
  147. package/dist/index75.js.map +1 -1
  148. package/dist/index76.js +35 -2263
  149. package/dist/index76.js.map +1 -1
  150. package/dist/index77.js +17 -0
  151. package/dist/index77.js.map +1 -0
  152. package/dist/index78.js +2267 -0
  153. package/dist/index78.js.map +1 -0
  154. package/dist/index8.js +377 -70
  155. package/dist/index8.js.map +1 -1
  156. package/dist/index9.js +60 -77
  157. package/dist/index9.js.map +1 -1
  158. package/package.json +1 -1
package/dist/index8.js CHANGED
@@ -1,82 +1,389 @@
1
- import { jsx as e, jsxs as r } from "react/jsx-runtime";
2
- import { Fragment as l } from "react";
3
- import { Transition as x, Dialog as h, TransitionChild as o, DialogPanel as f, DialogTitle as v } from "@headlessui/react";
1
+ import { jsxs as n, Fragment as w, jsx as e } from "react/jsx-runtime";
2
+ import { useState as K, useRef as z, useEffect as A, Fragment as g } from "react";
3
+ import { Transition as j, TransitionChild as R, Listbox as V, ListboxButton as O, ListboxOptions as q, ListboxOption as U } from "@headlessui/react";
4
+ import { ChartBarSquareIcon as W, BanknotesIcon as X, WrenchScrewdriverIcon as G, DocumentTextIcon as H, SparklesIcon as D, ArrowPathIcon as J, XMarkIcon as Q, PaperAirplaneIcon as Y, ChevronUpDownIcon as Z, CheckIcon as _ } from "@heroicons/react/24/outline";
4
5
  import { cn as i } from "./index3.js";
5
- import { Button as y } from "./index17.js";
6
- const j = ({
7
- isOpen: n,
8
- onClose: c,
9
- title: d,
10
- message: m,
11
- body: s,
12
- buttons: t,
13
- className: p
14
- }) => /* @__PURE__ */ e(x, { show: n, as: l, children: /* @__PURE__ */ r(h, { onClose: c, className: "relative z-50", children: [
15
- /* @__PURE__ */ e(
16
- o,
17
- {
18
- as: l,
19
- enter: "ease-out duration-300",
20
- enterFrom: "opacity-0",
21
- enterTo: "opacity-100",
22
- leave: "ease-in duration-200",
23
- leaveFrom: "opacity-100",
24
- leaveTo: "opacity-0",
25
- children: /* @__PURE__ */ e("div", { className: "fixed inset-0 bg-black/50", "aria-hidden": "true" })
26
- }
27
- ),
28
- /* @__PURE__ */ e("div", { className: "fixed inset-0 flex items-center justify-center p-4", children: /* @__PURE__ */ e(
29
- o,
6
+ const ee = [
7
+ {
8
+ id: "cma",
9
+ name: "CMA Agent",
10
+ description: "Comparative market analysis",
11
+ icon: W,
12
+ color: "#6366f1"
13
+ // indigo
14
+ },
15
+ {
16
+ id: "finance",
17
+ name: "Finance Agent",
18
+ description: "Financial calculations & advice",
19
+ icon: X,
20
+ color: "#0ea5e9"
21
+ // sky
22
+ },
23
+ {
24
+ id: "maintenance",
25
+ name: "Maintenance Agent",
26
+ description: "Property maintenance & repairs",
27
+ icon: G,
28
+ color: "#f59e0b"
29
+ // amber
30
+ },
31
+ {
32
+ id: "contracting",
33
+ name: "Contracting Agent",
34
+ description: "Contracts & agreements",
35
+ icon: H,
36
+ color: "#10b981"
37
+ // emerald
38
+ }
39
+ ];
40
+ function te({
41
+ agents: a,
42
+ activeAgent: l,
43
+ onChange: o
44
+ }) {
45
+ return /* @__PURE__ */ e(V, { value: l, onChange: o, children: /* @__PURE__ */ n("div", { className: "relative", children: [
46
+ /* @__PURE__ */ n(
47
+ O,
48
+ {
49
+ className: i(
50
+ "flex items-center gap-2.5 w-full rounded-xl px-3 py-2",
51
+ "bg-slate-50 hover:bg-slate-100 border border-slate-200 transition-colors",
52
+ "focus:outline-none focus:ring-2 focus:ring-primary-500 rounded-xl",
53
+ "cursor-pointer"
54
+ ),
55
+ children: [
56
+ /* @__PURE__ */ e(m, { agent: l, size: "sm" }),
57
+ /* @__PURE__ */ n("div", { className: "flex-1 text-left min-w-0", children: [
58
+ /* @__PURE__ */ e("div", { className: "text-sm font-semibold text-slate-800 truncate", children: l.name }),
59
+ /* @__PURE__ */ e("div", { className: "text-[11px] text-slate-400 truncate", children: l.description })
60
+ ] }),
61
+ /* @__PURE__ */ e(Z, { className: "w-4 h-4 text-slate-400 flex-shrink-0" })
62
+ ]
63
+ }
64
+ ),
65
+ /* @__PURE__ */ e(
66
+ j,
67
+ {
68
+ as: g,
69
+ leave: "transition ease-in duration-100",
70
+ leaveFrom: "opacity-100",
71
+ leaveTo: "opacity-0",
72
+ children: /* @__PURE__ */ e(
73
+ q,
74
+ {
75
+ className: i(
76
+ "absolute left-0 right-0 mt-1.5 z-10",
77
+ "rounded-xl bg-white border border-slate-200",
78
+ "shadow-lg shadow-black/8 py-1.5",
79
+ "focus:outline-none"
80
+ ),
81
+ children: a.map((s) => /* @__PURE__ */ e(
82
+ U,
83
+ {
84
+ value: s,
85
+ className: i(
86
+ "flex items-center gap-2.5 px-3 py-2.5 cursor-pointer",
87
+ "transition-colors",
88
+ "data-[focus]:bg-slate-50"
89
+ ),
90
+ children: ({ selected: c }) => /* @__PURE__ */ n(w, { children: [
91
+ /* @__PURE__ */ e(m, { agent: s, size: "sm" }),
92
+ /* @__PURE__ */ n("div", { className: "flex-1 min-w-0", children: [
93
+ /* @__PURE__ */ e("div", { className: "text-sm font-medium text-slate-800 truncate", children: s.name }),
94
+ /* @__PURE__ */ e("div", { className: "text-[11px] text-slate-400 truncate", children: s.description })
95
+ ] }),
96
+ c && /* @__PURE__ */ e(_, { className: "w-4 h-4 text-primary-500 flex-shrink-0" })
97
+ ] })
98
+ },
99
+ s.id
100
+ ))
101
+ }
102
+ )
103
+ }
104
+ )
105
+ ] }) });
106
+ }
107
+ function m({
108
+ agent: a,
109
+ size: l = "md"
110
+ }) {
111
+ const o = a.icon || D, s = {
112
+ sm: "w-7 h-7",
113
+ md: "w-9 h-9",
114
+ lg: "w-12 h-12"
115
+ }, c = {
116
+ sm: "w-3.5 h-3.5",
117
+ md: "w-4.5 h-4.5",
118
+ lg: "w-6 h-6"
119
+ };
120
+ return /* @__PURE__ */ e(
121
+ "div",
30
122
  {
31
- as: l,
32
- enter: "ease-out duration-300",
33
- enterFrom: "opacity-0 scale-95",
34
- enterTo: "opacity-100 scale-100",
35
- leave: "ease-in duration-200",
36
- leaveFrom: "opacity-100 scale-100",
37
- leaveTo: "opacity-0 scale-95",
38
- children: /* @__PURE__ */ r(
39
- f,
123
+ className: i(
124
+ "rounded-lg flex items-center justify-center flex-shrink-0",
125
+ s[l]
126
+ ),
127
+ style: { backgroundColor: `${a.color || "#6dbf47"}30` },
128
+ children: /* @__PURE__ */ e(
129
+ o,
40
130
  {
41
- className: i(
42
- "w-full max-w-md bg-white rounded-2xl shadow-xl overflow-hidden",
43
- "transform transition-all",
44
- p
45
- ),
46
- children: [
47
- /* @__PURE__ */ e("div", { className: "px-6 py-4 border-b border-slate-200", children: /* @__PURE__ */ e(v, { className: "text-lg font-semibold text-slate-900 text-center", children: d }) }),
48
- /* @__PURE__ */ r("div", { className: "px-8 py-6 text-center", children: [
49
- /* @__PURE__ */ e("p", { className: "text-slate-700", children: m }),
50
- s && /* @__PURE__ */ e("div", { className: "mt-4", children: s })
51
- ] }),
52
- /* @__PURE__ */ e(
131
+ className: c[l],
132
+ style: { color: a.color || "#6dbf47" }
133
+ }
134
+ )
135
+ }
136
+ );
137
+ }
138
+ function se({
139
+ open: a,
140
+ onClose: l,
141
+ agents: o = ee,
142
+ activeAgentId: s,
143
+ onAgentChange: c,
144
+ messages: h = [],
145
+ onSendMessage: f,
146
+ isTyping: v = !1,
147
+ placeholder: F = "Message the agent...",
148
+ onNewConversation: N,
149
+ width: p = 440,
150
+ headerContent: T,
151
+ className: L
152
+ }) {
153
+ const [u, y] = K(""), k = z(null), I = z(null), r = o.find((t) => t.id === s) || o[0], S = typeof p == "number" ? `${p}px` : p;
154
+ A(() => {
155
+ var t;
156
+ (t = k.current) == null || t.scrollIntoView({ behavior: "smooth" });
157
+ }, [h, v]), A(() => {
158
+ a && setTimeout(() => {
159
+ var t;
160
+ return (t = I.current) == null ? void 0 : t.focus();
161
+ }, 350);
162
+ }, [a]);
163
+ const C = () => {
164
+ const t = u.trim();
165
+ t && (f == null || f(t), y(""));
166
+ }, M = (t) => {
167
+ t.key === "Enter" && !t.shiftKey && (t.preventDefault(), C());
168
+ }, P = (t) => {
169
+ c == null || c(t.id);
170
+ }, $ = (t) => t ? t.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }) : "", B = (t) => t.role !== "agent" ? null : o.find((x) => x.id === t.agentId) || r;
171
+ return /* @__PURE__ */ n(w, { children: [
172
+ /* @__PURE__ */ e(j, { show: a, as: g, children: /* @__PURE__ */ e("div", { className: "fixed inset-0 z-40", children: /* @__PURE__ */ e(
173
+ R,
174
+ {
175
+ as: g,
176
+ enter: "ease-out duration-300",
177
+ enterFrom: "opacity-0",
178
+ enterTo: "opacity-100",
179
+ leave: "ease-in duration-200",
180
+ leaveFrom: "opacity-100",
181
+ leaveTo: "opacity-0",
182
+ children: /* @__PURE__ */ e(
183
+ "div",
184
+ {
185
+ className: "fixed inset-0 bg-black/40",
186
+ onClick: l
187
+ }
188
+ )
189
+ }
190
+ ) }) }),
191
+ /* @__PURE__ */ e(
192
+ "div",
193
+ {
194
+ className: i(
195
+ "fixed top-0 right-0 z-50 h-screen",
196
+ "transition-transform duration-300 ease-in-out",
197
+ "flex flex-col",
198
+ a ? "translate-x-0" : "translate-x-full",
199
+ L
200
+ ),
201
+ style: { width: S },
202
+ children: /* @__PURE__ */ n("div", { className: "flex flex-col h-full bg-white shadow-2xl", children: [
203
+ /* @__PURE__ */ e("div", { className: "flex-shrink-0", children: T || /* @__PURE__ */ n(w, { children: [
204
+ /* @__PURE__ */ n(
53
205
  "div",
54
206
  {
55
- className: i(
56
- "flex px-8 py-4 border-t border-slate-200 gap-3",
57
- t.length === 1 ? "justify-center" : "justify-between"
58
- ),
59
- children: t.map((a) => /* @__PURE__ */ e(
60
- y,
207
+ className: "px-5 py-4 flex items-center gap-3.5 transition-colors duration-300",
208
+ style: { backgroundColor: r.color || "#6dbf47" },
209
+ children: [
210
+ /* @__PURE__ */ e("div", { className: "w-10 h-10 rounded-xl bg-white/20 flex items-center justify-center flex-shrink-0", children: (() => {
211
+ const t = r.icon || D;
212
+ return /* @__PURE__ */ e(t, { className: "w-5 h-5 text-white" });
213
+ })() }),
214
+ /* @__PURE__ */ n("div", { className: "flex-1 min-w-0", children: [
215
+ /* @__PURE__ */ e("h3", { className: "text-[15px] font-semibold text-white leading-tight truncate", children: r.name }),
216
+ /* @__PURE__ */ e("p", { className: "text-xs text-white/70 truncate", children: r.description })
217
+ ] }),
218
+ /* @__PURE__ */ n("div", { className: "flex items-center gap-1 flex-shrink-0", children: [
219
+ N && /* @__PURE__ */ e(
220
+ "button",
221
+ {
222
+ type: "button",
223
+ onClick: N,
224
+ className: "p-1.5 rounded-lg text-white/70 hover:text-white hover:bg-white/15 transition-colors",
225
+ title: "New conversation",
226
+ children: /* @__PURE__ */ e(J, { className: "w-4.5 h-4.5" })
227
+ }
228
+ ),
229
+ /* @__PURE__ */ e(
230
+ "button",
231
+ {
232
+ type: "button",
233
+ onClick: l,
234
+ className: "p-1.5 rounded-lg text-white/70 hover:text-white hover:bg-white/15 transition-colors",
235
+ children: /* @__PURE__ */ e(Q, { className: "w-5 h-5" })
236
+ }
237
+ )
238
+ ] })
239
+ ]
240
+ }
241
+ ),
242
+ /* @__PURE__ */ e("div", { className: "px-5 py-3 border-b border-slate-200 bg-white", children: /* @__PURE__ */ e(
243
+ te,
244
+ {
245
+ agents: o,
246
+ activeAgent: r,
247
+ onChange: P
248
+ }
249
+ ) })
250
+ ] }) }),
251
+ /* @__PURE__ */ n("div", { className: "flex-1 overflow-y-auto px-5 py-5 space-y-4 bg-slate-50", children: [
252
+ h.length === 0 && /* @__PURE__ */ n("div", { className: "flex flex-col items-center justify-center h-full text-center px-8", children: [
253
+ /* @__PURE__ */ e(m, { agent: r, size: "lg" }),
254
+ /* @__PURE__ */ e("h3", { className: "text-base font-semibold text-slate-800 mt-4", children: r.name }),
255
+ /* @__PURE__ */ n("p", { className: "text-sm text-slate-400 mt-1 max-w-[260px]", children: [
256
+ r.description,
257
+ ". Start a conversation to get help."
258
+ ] })
259
+ ] }),
260
+ h.map((t, x) => {
261
+ const d = B(t), b = x > 0 ? h[x - 1] : null, E = t.role === "agent" && d && (!b || b.role === "user" || b.agentId !== t.agentId);
262
+ return /* @__PURE__ */ n("div", { children: [
263
+ E && d && /* @__PURE__ */ n("div", { className: "flex items-center gap-2 mb-2", children: [
264
+ /* @__PURE__ */ e(m, { agent: d, size: "sm" }),
265
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-slate-500", children: d.name })
266
+ ] }),
267
+ /* @__PURE__ */ e(
268
+ "div",
61
269
  {
62
- ...a,
63
270
  className: i(
64
- t.length === 1 ? "w-full" : "flex-1",
65
- a.className
271
+ "flex",
272
+ t.role === "user" ? "justify-end" : "justify-start"
66
273
  ),
67
- children: a.text
68
- },
69
- a.text
70
- ))
274
+ children: /* @__PURE__ */ n(
275
+ "div",
276
+ {
277
+ className: i(
278
+ "max-w-[85%] rounded-2xl px-4 py-3 text-[14px] leading-relaxed",
279
+ t.role === "user" ? "bg-primary-500 text-white rounded-br-md" : "bg-white text-slate-800 rounded-bl-md shadow-sm border border-slate-100 border-l-[3px]"
280
+ ),
281
+ style: t.role === "agent" && d ? { borderLeftColor: d.color || "#6dbf47" } : void 0,
282
+ children: [
283
+ /* @__PURE__ */ e("div", { className: "whitespace-pre-wrap", children: t.content }),
284
+ t.timestamp && /* @__PURE__ */ e(
285
+ "div",
286
+ {
287
+ className: i(
288
+ "text-[10px] mt-1.5",
289
+ t.role === "user" ? "text-white/50" : "text-slate-300"
290
+ ),
291
+ children: $(t.timestamp)
292
+ }
293
+ )
294
+ ]
295
+ }
296
+ )
297
+ }
298
+ )
299
+ ] }, t.id);
300
+ }),
301
+ v && /* @__PURE__ */ n("div", { children: [
302
+ /* @__PURE__ */ n("div", { className: "flex items-center gap-2 mb-2", children: [
303
+ /* @__PURE__ */ e(m, { agent: r, size: "sm" }),
304
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-slate-500", children: r.name })
305
+ ] }),
306
+ /* @__PURE__ */ e("div", { className: "flex justify-start", children: /* @__PURE__ */ e("div", { className: "bg-white rounded-2xl rounded-bl-md shadow-sm border border-slate-100 px-4 py-3.5", children: /* @__PURE__ */ n("div", { className: "flex gap-1.5 items-center", children: [
307
+ /* @__PURE__ */ e(
308
+ "span",
309
+ {
310
+ className: "w-2 h-2 rounded-full animate-bounce",
311
+ style: { backgroundColor: r.color || "#6dbf47", animationDelay: "0ms" }
312
+ }
313
+ ),
314
+ /* @__PURE__ */ e(
315
+ "span",
316
+ {
317
+ className: "w-2 h-2 rounded-full animate-bounce",
318
+ style: { backgroundColor: r.color || "#6dbf47", animationDelay: "150ms" }
319
+ }
320
+ ),
321
+ /* @__PURE__ */ e(
322
+ "span",
323
+ {
324
+ className: "w-2 h-2 rounded-full animate-bounce",
325
+ style: { backgroundColor: r.color || "#6dbf47", animationDelay: "300ms" }
326
+ }
327
+ )
328
+ ] }) }) })
329
+ ] }),
330
+ /* @__PURE__ */ e("div", { ref: k })
331
+ ] }),
332
+ /* @__PURE__ */ n("div", { className: "border-t border-slate-200 bg-white px-5 py-4 flex-shrink-0", children: [
333
+ /* @__PURE__ */ n(
334
+ "div",
335
+ {
336
+ className: "flex items-center gap-2 mb-3 px-2.5 py-1.5 rounded-lg transition-colors duration-300",
337
+ style: { backgroundColor: `${r.color || "#6dbf47"}12` },
338
+ children: [
339
+ /* @__PURE__ */ e(m, { agent: r, size: "sm" }),
340
+ /* @__PURE__ */ n("span", { className: "text-xs text-slate-500", children: [
341
+ "Chatting with ",
342
+ /* @__PURE__ */ e("span", { className: "font-semibold", style: { color: r.color || "#6dbf47" }, children: r.name })
343
+ ] })
344
+ ]
71
345
  }
72
- )
73
- ]
74
- }
75
- )
76
- }
77
- ) })
78
- ] }) });
346
+ ),
347
+ /* @__PURE__ */ n("div", { className: "flex items-end gap-2.5", children: [
348
+ /* @__PURE__ */ e(
349
+ "textarea",
350
+ {
351
+ ref: I,
352
+ value: u,
353
+ onChange: (t) => y(t.target.value),
354
+ onKeyDown: M,
355
+ placeholder: F,
356
+ rows: 1,
357
+ className: i(
358
+ "flex-1 resize-none rounded-xl border border-slate-200 px-4 py-3",
359
+ "text-sm text-slate-800 placeholder:text-slate-400",
360
+ "focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent",
361
+ "max-h-32"
362
+ )
363
+ }
364
+ ),
365
+ /* @__PURE__ */ e(
366
+ "button",
367
+ {
368
+ type: "button",
369
+ onClick: C,
370
+ disabled: !u.trim(),
371
+ className: i(
372
+ "p-3 rounded-xl transition-all duration-150",
373
+ "focus:outline-none focus:ring-2 focus:ring-primary-500",
374
+ u.trim() ? "bg-primary-500 text-white hover:bg-primary-600 shadow-sm" : "bg-slate-100 text-slate-300 cursor-not-allowed"
375
+ ),
376
+ children: /* @__PURE__ */ e(Y, { className: "w-4.5 h-4.5" })
377
+ }
378
+ )
379
+ ] })
380
+ ] })
381
+ ] })
382
+ }
383
+ )
384
+ ] });
385
+ }
79
386
  export {
80
- j as AlertBox
387
+ se as AgentPanel
81
388
  };
82
389
  //# sourceMappingURL=index8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index8.js","sources":["../src/components/AlertBox/AlertBox.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from 'react'\nimport {\n Dialog,\n DialogPanel,\n DialogTitle,\n Transition,\n TransitionChild,\n} from '@headlessui/react'\nimport { cn } from '@/lib/utils'\nimport { Button, type ButtonProps } from '../Button/Button'\n\nexport interface AlertBoxButton extends Omit<ButtonProps, 'key'> {\n text: string\n}\n\nexport interface AlertBoxProps {\n isOpen: boolean\n onClose: () => void\n title: string\n message: string\n body?: ReactNode\n buttons: AlertBoxButton[]\n className?: string\n}\n\nexport const AlertBox = ({\n isOpen,\n onClose,\n title,\n message,\n body,\n buttons,\n className,\n}: AlertBoxProps) => {\n return (\n <Transition show={isOpen} as={Fragment}>\n <Dialog onClose={onClose} className=\"relative z-50\">\n {/* Backdrop */}\n <TransitionChild\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0\"\n enterTo=\"opacity-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <div className=\"fixed inset-0 bg-black/50\" aria-hidden=\"true\" />\n </TransitionChild>\n\n {/* Modal */}\n <div className=\"fixed inset-0 flex items-center justify-center p-4\">\n <TransitionChild\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0 scale-95\"\n enterTo=\"opacity-100 scale-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100 scale-100\"\n leaveTo=\"opacity-0 scale-95\"\n >\n <DialogPanel\n className={cn(\n 'w-full max-w-md bg-white rounded-2xl shadow-xl overflow-hidden',\n 'transform transition-all',\n className\n )}\n >\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-slate-200\">\n <DialogTitle className=\"text-lg font-semibold text-slate-900 text-center\">\n {title}\n </DialogTitle>\n </div>\n\n {/* Message */}\n <div className=\"px-8 py-6 text-center\">\n <p className=\"text-slate-700\">{message}</p>\n {body && <div className=\"mt-4\">{body}</div>}\n </div>\n\n {/* Buttons */}\n <div\n className={cn(\n 'flex px-8 py-4 border-t border-slate-200 gap-3',\n buttons.length === 1 ? 'justify-center' : 'justify-between'\n )}\n >\n {buttons.map((button) => (\n <Button\n key={button.text}\n {...button}\n className={cn(\n buttons.length === 1 ? 'w-full' : 'flex-1',\n button.className\n )}\n >\n {button.text}\n </Button>\n ))}\n </div>\n </DialogPanel>\n </TransitionChild>\n </div>\n </Dialog>\n </Transition>\n )\n}\n"],"names":["AlertBox","isOpen","onClose","title","message","body","buttons","className","jsx","Transition","Fragment","jsxs","Dialog","TransitionChild","DialogPanel","cn","DialogTitle","button","Button"],"mappings":";;;;;AAyBO,MAAMA,IAAW,CAAC;AAAA,EACvB,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AACF,MAEI,gBAAAC,EAACC,GAAA,EAAW,MAAMR,GAAQ,IAAIS,GAC5B,UAAA,gBAAAC,EAACC,GAAA,EAAO,SAAAV,GAAkB,WAAU,iBAElC,UAAA;AAAA,EAAA,gBAAAM;AAAA,IAACK;AAAA,IAAA;AAAA,MACC,IAAIH;AAAA,MACJ,OAAM;AAAA,MACN,WAAU;AAAA,MACV,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,WAAU;AAAA,MACV,SAAQ;AAAA,MAER,UAAA,gBAAAF,EAAC,OAAA,EAAI,WAAU,6BAA4B,eAAY,OAAA,CAAO;AAAA,IAAA;AAAA,EAAA;AAAA,EAIhE,gBAAAA,EAAC,OAAA,EAAI,WAAU,sDACb,UAAA,gBAAAA;AAAA,IAACK;AAAA,IAAA;AAAA,MACC,IAAIH;AAAA,MACJ,OAAM;AAAA,MACN,WAAU;AAAA,MACV,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,WAAU;AAAA,MACV,SAAQ;AAAA,MAER,UAAA,gBAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,WAAWC;AAAA,YACT;AAAA,YACA;AAAA,YACAR;AAAA,UAAA;AAAA,UAIF,UAAA;AAAA,YAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA,gBAAAA,EAACQ,KAAY,WAAU,oDACpB,aACH,EAAA,CACF;AAAA,YAGA,gBAAAL,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,cAAA,gBAAAH,EAAC,KAAA,EAAE,WAAU,kBAAkB,UAAAJ,GAAQ;AAAA,cACtCC,KAAQ,gBAAAG,EAAC,OAAA,EAAI,WAAU,QAAQ,UAAAH,EAAA,CAAK;AAAA,YAAA,GACvC;AAAA,YAGA,gBAAAG;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWO;AAAA,kBACT;AAAA,kBACAT,EAAQ,WAAW,IAAI,mBAAmB;AAAA,gBAAA;AAAA,gBAG3C,UAAAA,EAAQ,IAAI,CAACW,MACZ,gBAAAT;AAAA,kBAACU;AAAA,kBAAA;AAAA,oBAEE,GAAGD;AAAA,oBACJ,WAAWF;AAAA,sBACTT,EAAQ,WAAW,IAAI,WAAW;AAAA,sBAClCW,EAAO;AAAA,oBAAA;AAAA,oBAGR,UAAAA,EAAO;AAAA,kBAAA;AAAA,kBAPHA,EAAO;AAAA,gBAAA,CASf;AAAA,cAAA;AAAA,YAAA;AAAA,UACH;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA,EACF,CACF;AAAA,EAAA,CACF,EAAA,CACF;"}
1
+ {"version":3,"file":"index8.js","sources":["../src/components/AgentPanel/AgentPanel.tsx"],"sourcesContent":["import {\n useState,\n useRef,\n useEffect,\n Fragment,\n type ReactNode,\n type KeyboardEvent,\n type ComponentType,\n type SVGProps,\n} from 'react'\nimport {\n Listbox,\n ListboxButton,\n ListboxOption,\n ListboxOptions,\n Transition,\n TransitionChild,\n} from '@headlessui/react'\nimport {\n XMarkIcon,\n PaperAirplaneIcon,\n ChevronUpDownIcon,\n CheckIcon,\n SparklesIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport {\n ChartBarSquareIcon,\n BanknotesIcon,\n WrenchScrewdriverIcon,\n DocumentTextIcon,\n} from '@heroicons/react/24/outline'\nimport { cn } from '@/lib/utils'\n\n// ─── Agent Definition ────────────────────────────────────────\n\nexport interface AgentDefinition {\n id: string\n name: string\n description: string\n icon?: ComponentType<SVGProps<SVGSVGElement>>\n color?: string\n}\n\nconst defaultAgents: AgentDefinition[] = [\n {\n id: 'cma',\n name: 'CMA Agent',\n description: 'Comparative market analysis',\n icon: ChartBarSquareIcon,\n color: '#6366f1', // indigo\n },\n {\n id: 'finance',\n name: 'Finance Agent',\n description: 'Financial calculations & advice',\n icon: BanknotesIcon,\n color: '#0ea5e9', // sky\n },\n {\n id: 'maintenance',\n name: 'Maintenance Agent',\n description: 'Property maintenance & repairs',\n icon: WrenchScrewdriverIcon,\n color: '#f59e0b', // amber\n },\n {\n id: 'contracting',\n name: 'Contracting Agent',\n description: 'Contracts & agreements',\n icon: DocumentTextIcon,\n color: '#10b981', // emerald\n },\n]\n\n// ─── Message Types ───────────────────────────────────────────\n\nexport interface AgentPanelMessage {\n id: string\n role: 'user' | 'agent'\n content: string\n timestamp?: Date\n agentId?: string\n}\n\n// ─── Component Props ─────────────────────────────────────────\n\nexport interface AgentPanelProps {\n /** Whether the panel is open */\n open: boolean\n /** Called when the panel should close */\n onClose: () => void\n /** Available agents */\n agents?: AgentDefinition[]\n /** Currently selected agent ID */\n activeAgentId?: string\n /** Called when agent is switched */\n onAgentChange?: (agentId: string) => void\n /** Chat messages */\n messages?: AgentPanelMessage[]\n /** Called when user sends a message */\n onSendMessage?: (message: string) => void\n /** Whether the agent is currently responding */\n isTyping?: boolean\n /** Placeholder for the message input */\n placeholder?: string\n /** Called when user clicks new conversation */\n onNewConversation?: () => void\n /** Panel width */\n width?: number | string\n /** Custom header content (replaces default) */\n headerContent?: ReactNode\n /** Additional class */\n className?: string\n}\n\n// ─── Agent Selector ──────────────────────────────────────────\n\nfunction AgentSelector({\n agents,\n activeAgent,\n onChange,\n}: {\n agents: AgentDefinition[]\n activeAgent: AgentDefinition\n onChange: (agent: AgentDefinition) => void\n}) {\n return (\n <Listbox value={activeAgent} onChange={onChange}>\n <div className=\"relative\">\n <ListboxButton\n className={cn(\n 'flex items-center gap-2.5 w-full rounded-xl px-3 py-2',\n 'bg-slate-50 hover:bg-slate-100 border border-slate-200 transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500 rounded-xl',\n 'cursor-pointer'\n )}\n >\n <AgentIcon agent={activeAgent} size=\"sm\" />\n <div className=\"flex-1 text-left min-w-0\">\n <div className=\"text-sm font-semibold text-slate-800 truncate\">\n {activeAgent.name}\n </div>\n <div className=\"text-[11px] text-slate-400 truncate\">\n {activeAgent.description}\n </div>\n </div>\n <ChevronUpDownIcon className=\"w-4 h-4 text-slate-400 flex-shrink-0\" />\n </ListboxButton>\n\n <Transition\n as={Fragment}\n leave=\"transition ease-in duration-100\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <ListboxOptions\n className={cn(\n 'absolute left-0 right-0 mt-1.5 z-10',\n 'rounded-xl bg-white border border-slate-200',\n 'shadow-lg shadow-black/8 py-1.5',\n 'focus:outline-none'\n )}\n >\n {agents.map((agent) => (\n <ListboxOption\n key={agent.id}\n value={agent}\n className={cn(\n 'flex items-center gap-2.5 px-3 py-2.5 cursor-pointer',\n 'transition-colors',\n 'data-[focus]:bg-slate-50'\n )}\n >\n {({ selected }) => (\n <>\n <AgentIcon agent={agent} size=\"sm\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-slate-800 truncate\">\n {agent.name}\n </div>\n <div className=\"text-[11px] text-slate-400 truncate\">\n {agent.description}\n </div>\n </div>\n {selected && (\n <CheckIcon className=\"w-4 h-4 text-primary-500 flex-shrink-0\" />\n )}\n </>\n )}\n </ListboxOption>\n ))}\n </ListboxOptions>\n </Transition>\n </div>\n </Listbox>\n )\n}\n\n// ─── Agent Icon ──────────────────────────────────────────────\n\nfunction AgentIcon({\n agent,\n size = 'md',\n}: {\n agent: AgentDefinition\n size?: 'sm' | 'md' | 'lg'\n}) {\n const Icon = agent.icon || SparklesIcon\n const sizeMap = {\n sm: 'w-7 h-7',\n md: 'w-9 h-9',\n lg: 'w-12 h-12',\n }\n const iconSizeMap = {\n sm: 'w-3.5 h-3.5',\n md: 'w-4.5 h-4.5',\n lg: 'w-6 h-6',\n }\n\n return (\n <div\n className={cn(\n 'rounded-lg flex items-center justify-center flex-shrink-0',\n sizeMap[size]\n )}\n style={{ backgroundColor: `${agent.color || '#6dbf47'}30` }}\n >\n <Icon\n className={iconSizeMap[size]}\n style={{ color: agent.color || '#6dbf47' }}\n />\n </div>\n )\n}\n\n// ─── AgentPanel Component ────────────────────────────────────\n\nexport function AgentPanel({\n open,\n onClose,\n agents = defaultAgents,\n activeAgentId,\n onAgentChange,\n messages = [],\n onSendMessage,\n isTyping = false,\n placeholder = 'Message the agent...',\n onNewConversation,\n width = 440,\n headerContent,\n className,\n}: AgentPanelProps) {\n const [inputValue, setInputValue] = useState('')\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const activeAgent = agents.find((a) => a.id === activeAgentId) || agents[0]\n const widthStyle = typeof width === 'number' ? `${width}px` : width\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages, isTyping])\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 350)\n }\n }, [open])\n\n const handleSend = () => {\n const trimmed = inputValue.trim()\n if (!trimmed) return\n onSendMessage?.(trimmed)\n setInputValue('')\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }\n\n const handleAgentChange = (agent: AgentDefinition) => {\n onAgentChange?.(agent.id)\n }\n\n // Format timestamp\n const formatTime = (date?: Date) => {\n if (!date) return ''\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n }\n\n // Get agent for a message\n const getMessageAgent = (msg: AgentPanelMessage) => {\n if (msg.role !== 'agent') return null\n return agents.find((a) => a.id === msg.agentId) || activeAgent\n }\n\n return (\n <>\n {/* Backdrop */}\n <Transition show={open} as={Fragment}>\n <div className=\"fixed inset-0 z-40\">\n <TransitionChild\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0\"\n enterTo=\"opacity-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <div\n className=\"fixed inset-0 bg-black/40\"\n onClick={onClose}\n />\n </TransitionChild>\n </div>\n </Transition>\n\n {/* Panel */}\n <div\n className={cn(\n 'fixed top-0 right-0 z-50 h-screen',\n 'transition-transform duration-300 ease-in-out',\n 'flex flex-col',\n open ? 'translate-x-0' : 'translate-x-full',\n className\n )}\n style={{ width: widthStyle }}\n >\n <div className=\"flex flex-col h-full bg-white shadow-2xl\">\n {/* Header */}\n <div className=\"flex-shrink-0\">\n {headerContent || (\n <>\n {/* Agent identity banner */}\n <div\n className=\"px-5 py-4 flex items-center gap-3.5 transition-colors duration-300\"\n style={{ backgroundColor: activeAgent.color || '#6dbf47' }}\n >\n <div className=\"w-10 h-10 rounded-xl bg-white/20 flex items-center justify-center flex-shrink-0\">\n {(() => {\n const Icon = activeAgent.icon || SparklesIcon\n return <Icon className=\"w-5 h-5 text-white\" />\n })()}\n </div>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-[15px] font-semibold text-white leading-tight truncate\">\n {activeAgent.name}\n </h3>\n <p className=\"text-xs text-white/70 truncate\">\n {activeAgent.description}\n </p>\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {onNewConversation && (\n <button\n type=\"button\"\n onClick={onNewConversation}\n className=\"p-1.5 rounded-lg text-white/70 hover:text-white hover:bg-white/15 transition-colors\"\n title=\"New conversation\"\n >\n <ArrowPathIcon className=\"w-4.5 h-4.5\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1.5 rounded-lg text-white/70 hover:text-white hover:bg-white/15 transition-colors\"\n >\n <XMarkIcon className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n\n {/* Agent Selector */}\n <div className=\"px-5 py-3 border-b border-slate-200 bg-white\">\n <AgentSelector\n agents={agents}\n activeAgent={activeAgent}\n onChange={handleAgentChange}\n />\n </div>\n </>\n )}\n </div>\n\n {/* Messages Area */}\n <div className=\"flex-1 overflow-y-auto px-5 py-5 space-y-4 bg-slate-50\">\n {messages.length === 0 && (\n <div className=\"flex flex-col items-center justify-center h-full text-center px-8\">\n <AgentIcon agent={activeAgent} size=\"lg\" />\n <h3 className=\"text-base font-semibold text-slate-800 mt-4\">\n {activeAgent.name}\n </h3>\n <p className=\"text-sm text-slate-400 mt-1 max-w-[260px]\">\n {activeAgent.description}. Start a conversation to get help.\n </p>\n </div>\n )}\n\n {messages.map((msg, index) => {\n const msgAgent = getMessageAgent(msg)\n // Show agent label when agent changes between messages\n const prevMsg = index > 0 ? messages[index - 1] : null\n const showAgentLabel =\n msg.role === 'agent' &&\n msgAgent &&\n (!prevMsg ||\n prevMsg.role === 'user' ||\n prevMsg.agentId !== msg.agentId)\n\n return (\n <div key={msg.id}>\n {showAgentLabel && msgAgent && (\n <div className=\"flex items-center gap-2 mb-2\">\n <AgentIcon agent={msgAgent} size=\"sm\" />\n <span className=\"text-xs font-medium text-slate-500\">\n {msgAgent.name}\n </span>\n </div>\n )}\n <div\n className={cn(\n 'flex',\n msg.role === 'user' ? 'justify-end' : 'justify-start'\n )}\n >\n <div\n className={cn(\n 'max-w-[85%] rounded-2xl px-4 py-3 text-[14px] leading-relaxed',\n msg.role === 'user'\n ? 'bg-primary-500 text-white rounded-br-md'\n : 'bg-white text-slate-800 rounded-bl-md shadow-sm border border-slate-100 border-l-[3px]'\n )}\n style={msg.role === 'agent' && msgAgent ? { borderLeftColor: msgAgent.color || '#6dbf47' } : undefined}\n >\n <div className=\"whitespace-pre-wrap\">{msg.content}</div>\n {msg.timestamp && (\n <div\n className={cn(\n 'text-[10px] mt-1.5',\n msg.role === 'user'\n ? 'text-white/50'\n : 'text-slate-300'\n )}\n >\n {formatTime(msg.timestamp)}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n })}\n\n {isTyping && (\n <div>\n <div className=\"flex items-center gap-2 mb-2\">\n <AgentIcon agent={activeAgent} size=\"sm\" />\n <span className=\"text-xs font-medium text-slate-500\">\n {activeAgent.name}\n </span>\n </div>\n <div className=\"flex justify-start\">\n <div className=\"bg-white rounded-2xl rounded-bl-md shadow-sm border border-slate-100 px-4 py-3.5\">\n <div className=\"flex gap-1.5 items-center\">\n <span\n className=\"w-2 h-2 rounded-full animate-bounce\"\n style={{ backgroundColor: activeAgent.color || '#6dbf47', animationDelay: '0ms' }}\n />\n <span\n className=\"w-2 h-2 rounded-full animate-bounce\"\n style={{ backgroundColor: activeAgent.color || '#6dbf47', animationDelay: '150ms' }}\n />\n <span\n className=\"w-2 h-2 rounded-full animate-bounce\"\n style={{ backgroundColor: activeAgent.color || '#6dbf47', animationDelay: '300ms' }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input Area */}\n <div className=\"border-t border-slate-200 bg-white px-5 py-4 flex-shrink-0\">\n {/* Active agent indicator */}\n <div\n className=\"flex items-center gap-2 mb-3 px-2.5 py-1.5 rounded-lg transition-colors duration-300\"\n style={{ backgroundColor: `${activeAgent.color || '#6dbf47'}12` }}\n >\n <AgentIcon agent={activeAgent} size=\"sm\" />\n <span className=\"text-xs text-slate-500\">\n Chatting with <span className=\"font-semibold\" style={{ color: activeAgent.color || '#6dbf47' }}>{activeAgent.name}</span>\n </span>\n </div>\n\n <div className=\"flex items-end gap-2.5\">\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n className={cn(\n 'flex-1 resize-none rounded-xl border border-slate-200 px-4 py-3',\n 'text-sm text-slate-800 placeholder:text-slate-400',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent',\n 'max-h-32'\n )}\n />\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!inputValue.trim()}\n className={cn(\n 'p-3 rounded-xl transition-all duration-150',\n 'focus:outline-none focus:ring-2 focus:ring-primary-500',\n inputValue.trim()\n ? 'bg-primary-500 text-white hover:bg-primary-600 shadow-sm'\n : 'bg-slate-100 text-slate-300 cursor-not-allowed'\n )}\n >\n <PaperAirplaneIcon className=\"w-4.5 h-4.5\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n </>\n )\n}\n"],"names":["defaultAgents","ChartBarSquareIcon","BanknotesIcon","WrenchScrewdriverIcon","DocumentTextIcon","AgentSelector","agents","activeAgent","onChange","jsx","Listbox","jsxs","ListboxButton","cn","AgentIcon","ChevronUpDownIcon","Transition","Fragment","ListboxOptions","agent","ListboxOption","selected","CheckIcon","size","Icon","SparklesIcon","sizeMap","iconSizeMap","AgentPanel","open","onClose","activeAgentId","onAgentChange","messages","onSendMessage","isTyping","placeholder","onNewConversation","width","headerContent","className","inputValue","setInputValue","useState","messagesEndRef","useRef","inputRef","a","widthStyle","useEffect","_a","handleSend","trimmed","handleKeyDown","e","handleAgentChange","formatTime","date","getMessageAgent","msg","TransitionChild","ArrowPathIcon","XMarkIcon","index","msgAgent","prevMsg","showAgentLabel","PaperAirplaneIcon"],"mappings":"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"}