@super_studio/ecforce-ai-agent-react 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -31,6 +31,38 @@ var __objRest = (source, exclude) => {
31
31
  return target;
32
32
  };
33
33
 
34
+ // src/chatbot-proivder.tsx
35
+ import React from "react";
36
+ import { jsx } from "react/jsx-runtime";
37
+ var ChatbotContext = React.createContext(
38
+ void 0
39
+ );
40
+ function useChatbot() {
41
+ const context = React.useContext(ChatbotContext);
42
+ if (!context) {
43
+ throw new Error("useChatbot must be used within a ChatbotProvider");
44
+ }
45
+ return context;
46
+ }
47
+ function ChatbotProvider({ children }) {
48
+ const [hasOpened, setHasOpened] = React.useState(false);
49
+ const [open, setOpen] = React.useState(false);
50
+ const [isExpanded, setIsExpanded] = React.useState(false);
51
+ React.useEffect(() => {
52
+ if (open) {
53
+ setHasOpened(true);
54
+ }
55
+ }, [open]);
56
+ const value = {
57
+ hasOpened,
58
+ open,
59
+ setOpen,
60
+ isExpanded,
61
+ setIsExpanded
62
+ };
63
+ return /* @__PURE__ */ jsx(ChatbotContext.Provider, { value, children });
64
+ }
65
+
34
66
  // src/agent-frame.tsx
35
67
  import {
36
68
  forwardRef,
@@ -45,7 +77,7 @@ import {
45
77
  var PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
46
78
 
47
79
  // src/agent-frame.tsx
48
- import { jsx } from "react/jsx-runtime";
80
+ import { jsx as jsx2 } from "react/jsx-runtime";
49
81
  var AgentFrame = forwardRef(
50
82
  ({ agentId, mcps = [], appName, className, url }, ref) => {
51
83
  var _a;
@@ -54,6 +86,7 @@ var AgentFrame = forwardRef(
54
86
  const [isReady, setIsReady] = useState(false);
55
87
  const [hasInitialized, setHasInitialized] = useState(false);
56
88
  const [currentMcps, setCurrentMcps] = useState(mcps);
89
+ const { setIsExpanded, setOpen } = useChatbot();
57
90
  const postMessage = useCallback((message) => {
58
91
  var _a2;
59
92
  if ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow) {
@@ -101,8 +134,19 @@ var AgentFrame = forwardRef(
101
134
  if (process.env.NODE_ENV === "development") {
102
135
  console.log("iframe message", event.data);
103
136
  }
104
- if (((_a2 = event.data) == null ? void 0 : _a2.type) === "CHATBOT_READY") {
105
- setIsReady(true);
137
+ switch ((_a2 = event.data) == null ? void 0 : _a2.type) {
138
+ case "CHATBOT_READY":
139
+ setIsReady(true);
140
+ break;
141
+ case "CLOSE_CHATBOT":
142
+ setOpen(false);
143
+ break;
144
+ case "EXPAND_CHATBOT":
145
+ setIsExpanded(true);
146
+ break;
147
+ case "SHRINK_CHATBOT":
148
+ setIsExpanded(false);
149
+ break;
106
150
  }
107
151
  };
108
152
  const handleIframeLoad = () => {
@@ -129,7 +173,7 @@ var AgentFrame = forwardRef(
129
173
  setMcps(mcps);
130
174
  }
131
175
  }, [setMcps, mcps, currentMcps]);
132
- return /* @__PURE__ */ jsx(
176
+ return /* @__PURE__ */ jsx2(
133
177
  "iframe",
134
178
  {
135
179
  ref: iframeRef,
@@ -146,93 +190,224 @@ var AgentFrame = forwardRef(
146
190
  );
147
191
  AgentFrame.displayName = "AgentFrame";
148
192
 
149
- // src/chatbot-popover.tsx
150
- import { forwardRef as forwardRef3, useState as useState2 } from "react";
193
+ // src/chatbot-sheet.tsx
194
+ import { forwardRef as forwardRef3 } from "react";
151
195
 
152
- // src/popover.tsx
153
- import * as PopoverPrimitive from "@radix-ui/react-popover";
154
- import * as React from "react";
155
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
156
- var Popover = PopoverPrimitive.Root;
157
- var PopoverTrigger = React.forwardRef((_a, ref) => {
196
+ // src/sheet.tsx
197
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
198
+ import * as React2 from "react";
199
+ import { jsx as jsx3 } from "react/jsx-runtime";
200
+ function Sheet(_a) {
201
+ var props = __objRest(_a, []);
202
+ const { open, setOpen } = useChatbot();
203
+ return /* @__PURE__ */ jsx3(
204
+ SheetPrimitive.Root,
205
+ __spreadValues({
206
+ "data-slot": "sheet",
207
+ modal: false,
208
+ open,
209
+ onOpenChange: setOpen
210
+ }, props)
211
+ );
212
+ }
213
+ var SheetTrigger = React2.forwardRef((_a, ref) => {
158
214
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
159
- return /* @__PURE__ */ jsx2(
160
- PopoverPrimitive.Trigger,
215
+ return /* @__PURE__ */ jsx3(
216
+ SheetPrimitive.Trigger,
161
217
  __spreadValues({
162
218
  ref,
163
- className: `chatbot-trigger ${className}`
219
+ "data-slot": "sheet-trigger",
220
+ className: `chatbot-trigger ${className || ""}`
164
221
  }, props)
165
222
  );
166
223
  });
167
- PopoverTrigger.displayName = PopoverPrimitive.Trigger.displayName;
168
- var PopoverContent = React.forwardRef(
169
- (_a, ref) => {
170
- var _b = _a, {
171
- className,
172
- align = "center",
173
- backdrop,
174
- sideOffset = 4,
175
- forceMount
176
- } = _b, props = __objRest(_b, [
177
- "className",
178
- "align",
179
- "backdrop",
180
- "sideOffset",
181
- "forceMount"
182
- ]);
183
- return /* @__PURE__ */ jsx2(PopoverPrimitive.Portal, { forceMount, children: /* @__PURE__ */ jsxs("div", { children: [
184
- backdrop && /* @__PURE__ */ jsx2("div", { className: "chatbot-popover-backdrop" }),
185
- /* @__PURE__ */ jsx2(
186
- PopoverPrimitive.Content,
187
- __spreadValues({
188
- ref,
189
- align,
190
- sideOffset,
191
- forceMount,
192
- className: `chatbot-popover-content ${className}`
193
- }, props)
194
- )
195
- ] }) });
196
- }
197
- );
198
- PopoverContent.displayName = PopoverPrimitive.Content.displayName;
224
+ SheetTrigger.displayName = SheetPrimitive.Trigger.displayName;
225
+ var SheetClose = React2.forwardRef((_a, ref) => {
226
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
227
+ return /* @__PURE__ */ jsx3(
228
+ SheetPrimitive.Close,
229
+ __spreadValues({
230
+ ref,
231
+ "data-slot": "sheet-close",
232
+ className: `chatbot-sheet-close ${className || ""}`
233
+ }, props)
234
+ );
235
+ });
236
+ SheetClose.displayName = SheetPrimitive.Close.displayName;
237
+ function SheetPortal(_a) {
238
+ var props = __objRest(_a, []);
239
+ return /* @__PURE__ */ jsx3(SheetPrimitive.Portal, __spreadValues({ "data-slot": "sheet-portal" }, props));
240
+ }
241
+ var SheetContent = React2.forwardRef((_a, ref) => {
242
+ var _b = _a, { className, children, style } = _b, props = __objRest(_b, ["className", "children", "style"]);
243
+ const { isExpanded, open, hasOpened } = useChatbot();
244
+ const width = isExpanded ? "848px" : "400px";
245
+ const translateX = open ? "0" : "100%";
246
+ const contentStyle = __spreadValues({
247
+ "--sheet-width": width,
248
+ transform: `translateX(${translateX})`
249
+ }, style);
250
+ return /* @__PURE__ */ jsx3(SheetPortal, { forceMount: hasOpened || void 0, children: /* @__PURE__ */ jsx3(
251
+ SheetPrimitive.Content,
252
+ __spreadProps(__spreadValues({
253
+ ref,
254
+ "data-slot": "sheet-content",
255
+ forceMount: hasOpened || void 0,
256
+ onInteractOutside: (e) => e.preventDefault(),
257
+ className: `chatbot-sheet-content ${isExpanded ? "chatbot-sheet-expanded" : ""} ${className || ""}`,
258
+ style: contentStyle
259
+ }, props), {
260
+ children
261
+ })
262
+ ) });
263
+ });
264
+ SheetContent.displayName = SheetPrimitive.Content.displayName;
265
+ var SheetHeader = React2.forwardRef((_a, ref) => {
266
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
267
+ return /* @__PURE__ */ jsx3(
268
+ "div",
269
+ __spreadValues({
270
+ ref,
271
+ "data-slot": "sheet-header",
272
+ className: `chatbot-sheet-header ${className || ""}`
273
+ }, props)
274
+ );
275
+ });
276
+ SheetHeader.displayName = "SheetHeader";
277
+ var SheetFooter = React2.forwardRef((_a, ref) => {
278
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
279
+ return /* @__PURE__ */ jsx3(
280
+ "div",
281
+ __spreadValues({
282
+ ref,
283
+ "data-slot": "sheet-footer",
284
+ className: `chatbot-sheet-footer ${className || ""}`
285
+ }, props)
286
+ );
287
+ });
288
+ SheetFooter.displayName = "SheetFooter";
289
+ var SheetTitle = React2.forwardRef((_a, ref) => {
290
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
291
+ return /* @__PURE__ */ jsx3(
292
+ SheetPrimitive.Title,
293
+ __spreadValues({
294
+ ref,
295
+ "data-slot": "sheet-title",
296
+ className: `chatbot-sheet-title ${className || ""}`
297
+ }, props)
298
+ );
299
+ });
300
+ SheetTitle.displayName = SheetPrimitive.Title.displayName;
301
+ var SheetDescription = React2.forwardRef((_a, ref) => {
302
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
303
+ return /* @__PURE__ */ jsx3(
304
+ SheetPrimitive.Description,
305
+ __spreadValues({
306
+ ref,
307
+ "data-slot": "sheet-description",
308
+ className: `chatbot-sheet-description ${className || ""}`
309
+ }, props)
310
+ );
311
+ });
312
+ SheetDescription.displayName = SheetPrimitive.Description.displayName;
199
313
 
200
- // src/chatbot-popover.tsx
201
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
202
- var ChatbotPopover = forwardRef3(
203
- (props, ref) => {
204
- const [isOpen, setIsOpen] = useState2(false);
205
- const [hasOpened, setHasOpened] = useState2(false);
206
- const handleOpenChange = (open) => {
207
- setIsOpen(open);
208
- if (open && !hasOpened) {
209
- setHasOpened(true);
210
- }
211
- };
212
- return /* @__PURE__ */ jsxs2(Popover, { open: isOpen, onOpenChange: handleOpenChange, children: [
213
- /* @__PURE__ */ jsx3(PopoverTrigger, { children: /* @__PURE__ */ jsx3(EcforceAiIcon, {}) }),
214
- /* @__PURE__ */ jsx3(
215
- PopoverContent,
314
+ // src/tooltip.tsx
315
+ import {
316
+ Arrow,
317
+ Content as Content2,
318
+ Portal as Portal2,
319
+ Provider,
320
+ Root as Root2,
321
+ Trigger as Trigger2
322
+ } from "@radix-ui/react-tooltip";
323
+ import "./tooltip.css";
324
+ import { jsx as jsx4, jsxs } from "react/jsx-runtime";
325
+ function Tooltip({
326
+ content,
327
+ trigger,
328
+ side,
329
+ align,
330
+ disabled,
331
+ delayDuration,
332
+ skipDelayDuration,
333
+ className,
334
+ open,
335
+ alignOffset,
336
+ sideOffset,
337
+ arrowClassName,
338
+ keepTooltipOpen
339
+ }) {
340
+ return /* @__PURE__ */ jsx4(
341
+ Provider,
342
+ {
343
+ delayDuration: delayDuration != null ? delayDuration : 200,
344
+ skipDelayDuration: skipDelayDuration != null ? skipDelayDuration : 200,
345
+ children: /* @__PURE__ */ jsxs(Root2, { open: disabled ? false : open, children: [
346
+ /* @__PURE__ */ jsx4(
347
+ Trigger2,
348
+ {
349
+ onClick: keepTooltipOpen ? (event) => {
350
+ event.preventDefault();
351
+ } : void 0,
352
+ asChild: true,
353
+ children: trigger
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsx4(Portal2, { children: /* @__PURE__ */ jsxs(
357
+ Content2,
358
+ {
359
+ className: `tooltip-content ${className || ""}`,
360
+ side,
361
+ align,
362
+ alignOffset,
363
+ sideOffset,
364
+ onPointerDownOutside: keepTooltipOpen ? (event) => {
365
+ event.preventDefault();
366
+ } : void 0,
367
+ children: [
368
+ /* @__PURE__ */ jsx4(Arrow, { className: arrowClassName }),
369
+ content
370
+ ]
371
+ }
372
+ ) })
373
+ ] })
374
+ }
375
+ );
376
+ }
377
+
378
+ // src/chatbot-sheet.tsx
379
+ import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
380
+ var ChatbotSheet = forwardRef3(
381
+ (_a, ref) => {
382
+ var _b = _a, { sheetStyle } = _b, props = __objRest(_b, ["sheetStyle"]);
383
+ return /* @__PURE__ */ jsxs2(Sheet, { children: [
384
+ /* @__PURE__ */ jsx5(
385
+ Tooltip,
216
386
  {
387
+ side: "top",
217
388
  align: "end",
218
- backdrop: isOpen,
219
- forceMount: hasOpened || void 0,
220
- children: /* @__PURE__ */ jsx3(AgentFrame, __spreadProps(__spreadValues({}, props), { ref }))
389
+ content: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046",
390
+ trigger: /* @__PURE__ */ jsx5(SheetTrigger, { children: /* @__PURE__ */ jsx5(EcforceAiIcon, {}) })
221
391
  }
222
- )
392
+ ),
393
+ /* @__PURE__ */ jsxs2(SheetContent, { style: sheetStyle, children: [
394
+ /* @__PURE__ */ jsx5(SheetTitle, { children: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046" }),
395
+ /* @__PURE__ */ jsx5(SheetDescription, { children: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046" }),
396
+ /* @__PURE__ */ jsx5(AgentFrame, __spreadProps(__spreadValues({}, props), { ref }))
397
+ ] })
223
398
  ] });
224
399
  }
225
400
  );
226
401
  function EcforceAiIcon() {
227
- return /* @__PURE__ */ jsx3(
402
+ return /* @__PURE__ */ jsx5(
228
403
  "svg",
229
404
  {
230
- width: "24",
231
- height: "24",
405
+ width: "18",
406
+ height: "18",
232
407
  viewBox: "0 0 24 24",
233
408
  xmlns: "http://www.w3.org/2000/svg",
234
409
  fill: "currentColor",
235
- children: /* @__PURE__ */ jsx3(
410
+ children: /* @__PURE__ */ jsx5(
236
411
  "path",
237
412
  {
238
413
  fillRule: "evenodd",
@@ -245,8 +420,16 @@ function EcforceAiIcon() {
245
420
  }
246
421
  export {
247
422
  AgentFrame,
248
- ChatbotPopover,
249
- Popover,
250
- PopoverContent,
251
- PopoverTrigger
423
+ ChatbotProvider,
424
+ ChatbotSheet,
425
+ Sheet,
426
+ SheetClose,
427
+ SheetContent,
428
+ SheetDescription,
429
+ SheetFooter,
430
+ SheetHeader,
431
+ SheetTitle,
432
+ SheetTrigger,
433
+ Tooltip,
434
+ useChatbot
252
435
  };
@@ -0,0 +1,12 @@
1
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
2
+ import * as React from "react";
3
+ declare function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ declare const SheetTrigger: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
5
+ declare const SheetClose: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
6
+ declare const SheetContent: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ declare const SheetHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
8
+ declare const SheetFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
9
+ declare const SheetTitle: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
10
+ declare const SheetDescription: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
11
+ export { Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, };
12
+ //# sourceMappingURL=sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../src/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,cAAc,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,iBAAS,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,IAAI,CAAC,2CAW5E;AAED,QAAA,MAAM,YAAY,mKAUhB,CAAC;AAGH,QAAA,MAAM,UAAU,iKAUd,CAAC;AASH,QAAA,MAAM,YAAY,6JAgChB,CAAC;AAGH,QAAA,MAAM,WAAW,6GAUf,CAAC;AAGH,QAAA,MAAM,WAAW,6GAUf,CAAC;AAGH,QAAA,MAAM,UAAU,mKAUd,CAAC;AAGH,QAAA,MAAM,gBAAgB,6KAUpB,CAAC;AAGH,OAAO,EACL,KAAK,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /* Tooltip Content */
2
+ .tooltip-content {
3
+ background-color: #1f2937;
4
+ z-index: 50;
5
+ max-width: 320px;
6
+ border-radius: 0.125rem;
7
+ padding: 0.5rem;
8
+ font-size: 0.625rem;
9
+ font-weight: 400;
10
+ line-height: 1.25;
11
+ color: #ffffff;
12
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
13
+ }
14
+
15
+ /* Arrow styling can be customized via arrowClassName prop */
16
+ .tooltip-arrow {
17
+ fill: #1f2937;
18
+ }
@@ -0,0 +1,21 @@
1
+ import "./tooltip.css";
2
+ type Side = "top" | "right" | "bottom" | "left";
3
+ type Align = "start" | "center" | "end";
4
+ type TooltipProps = {
5
+ content: React.ReactNode;
6
+ side?: Side;
7
+ align?: Align;
8
+ trigger: React.ReactNode;
9
+ disabled?: boolean;
10
+ delayDuration?: number;
11
+ skipDelayDuration?: number;
12
+ className?: string;
13
+ open?: boolean;
14
+ alignOffset?: number;
15
+ sideOffset?: number;
16
+ arrowClassName?: string;
17
+ keepTooltipOpen?: boolean;
18
+ };
19
+ export declare function Tooltip({ content, trigger, side, align, disabled, delayDuration, skipDelayDuration, className, open, alignOffset, sideOffset, arrowClassName, keepTooltipOpen, }: TooltipProps): import("react/jsx-runtime").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../src/tooltip.tsx"],"names":[],"mappings":"AAUA,OAAO,eAAe,CAAC;AAEvB,KAAK,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAChD,KAAK,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAExC,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,OAAO,EACP,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,IAAI,EACJ,WAAW,EACX,UAAU,EACV,cAAc,EACd,eAAe,GAChB,EAAE,YAAY,2CA0Cd"}
package/package.json CHANGED
@@ -1,17 +1,10 @@
1
1
  {
2
2
  "name": "@super_studio/ecforce-ai-agent-react",
3
- "version": "0.1.5",
3
+ "version": "0.3.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
7
7
  "sideEffects": false,
8
- "scripts": {
9
- "dev": "npm-run-all --parallel dev:main dev:types",
10
- "dev:main": "tsup --watch",
11
- "dev:types": "tsc -p tsconfig.build.json --watch",
12
- "build": "tsup && tsc -p tsconfig.build.json",
13
- "prepublishOnly": "pnpm build"
14
- },
15
8
  "files": [
16
9
  "dist",
17
10
  "src/**/*.ts",
@@ -24,13 +17,14 @@
24
17
  "require": "./dist/index.js",
25
18
  "default": "./dist/index.js"
26
19
  },
27
- "./chatbot.css": "./dist/chatbot.css"
20
+ "./chatbot-sheet.css": "./dist/chatbot-sheet.css"
28
21
  },
29
22
  "publishConfig": {
30
23
  "access": "public"
31
24
  },
32
25
  "dependencies": {
33
- "@radix-ui/react-popover": "1.1.14"
26
+ "@radix-ui/react-dialog": "1.1.14",
27
+ "@radix-ui/react-tooltip": "1.2.7"
34
28
  },
35
29
  "peerDependencies": {
36
30
  "react": ">=16",
@@ -44,5 +38,11 @@
44
38
  "react": "19.1.0",
45
39
  "react-dom": "19.1.0",
46
40
  "tsup": "8.5.0"
41
+ },
42
+ "scripts": {
43
+ "dev": "npm-run-all --parallel dev:main dev:types",
44
+ "dev:main": "tsup --watch",
45
+ "dev:types": "tsc -p tsconfig.build.json --watch",
46
+ "build": "tsup && tsc -p tsconfig.build.json"
47
47
  }
48
48
  }
@@ -6,11 +6,14 @@ import {
6
6
  useRef,
7
7
  useState,
8
8
  } from "react";
9
+ import { useChatbot } from "./chatbot-proivder";
9
10
  import { PROD_CHATBOT_URL } from "./constants";
10
11
 
11
- type IframeMessage = {
12
- type: "CHATBOT_READY";
13
- };
12
+ type IframeMessage =
13
+ | { type: "CHATBOT_READY" }
14
+ | { type: "CLOSE_CHATBOT" }
15
+ | { type: "EXPAND_CHATBOT" }
16
+ | { type: "SHRINK_CHATBOT" };
14
17
 
15
18
  type MCP = {
16
19
  name: string;
@@ -68,6 +71,7 @@ export const AgentFrame = forwardRef<AgentElement, AgentFrameProps>(
68
71
  const [isReady, setIsReady] = useState(false);
69
72
  const [hasInitialized, setHasInitialized] = useState(false);
70
73
  const [currentMcps, setCurrentMcps] = useState<MCP[]>(mcps);
74
+ const { setIsExpanded, setOpen } = useChatbot();
71
75
 
72
76
  // helper to post message to the iframe
73
77
  const postMessage = useCallback((message: ParentMessage) => {
@@ -124,9 +128,21 @@ export const AgentFrame = forwardRef<AgentElement, AgentFrameProps>(
124
128
  if (process.env.NODE_ENV === "development") {
125
129
  console.log("iframe message", event.data);
126
130
  }
127
- // When the iframe is ready, set isReady flag to kick off the initialization
128
- if (event.data?.type === "CHATBOT_READY") {
129
- setIsReady(true);
131
+ // Handle iframe messages
132
+ switch (event.data?.type) {
133
+ case "CHATBOT_READY":
134
+ // When the iframe is ready, set isReady flag to kick off the initialization
135
+ setIsReady(true);
136
+ break;
137
+ case "CLOSE_CHATBOT":
138
+ setOpen(false);
139
+ break;
140
+ case "EXPAND_CHATBOT":
141
+ setIsExpanded(true);
142
+ break;
143
+ case "SHRINK_CHATBOT":
144
+ setIsExpanded(false);
145
+ break;
130
146
  }
131
147
  };
132
148
 
@@ -0,0 +1,51 @@
1
+ "use client";
2
+
3
+ import React from "react";
4
+
5
+ interface ChatbotContextType {
6
+ hasOpened: boolean;
7
+ open: boolean;
8
+ setOpen: (open: boolean) => void;
9
+ isExpanded: boolean;
10
+ setIsExpanded: (expanded: boolean) => void;
11
+ }
12
+
13
+ const ChatbotContext = React.createContext<ChatbotContextType | undefined>(
14
+ undefined,
15
+ );
16
+
17
+ export function useChatbot() {
18
+ const context = React.useContext(ChatbotContext);
19
+ if (!context) {
20
+ throw new Error("useChatbot must be used within a ChatbotProvider");
21
+ }
22
+ return context;
23
+ }
24
+
25
+ interface ChatbotProviderProps {
26
+ children: React.ReactNode;
27
+ }
28
+
29
+ export function ChatbotProvider({ children }: ChatbotProviderProps) {
30
+ const [hasOpened, setHasOpened] = React.useState(false);
31
+ const [open, setOpen] = React.useState(false);
32
+ const [isExpanded, setIsExpanded] = React.useState(false);
33
+
34
+ React.useEffect(() => {
35
+ if (open) {
36
+ setHasOpened(true);
37
+ }
38
+ }, [open]);
39
+
40
+ const value = {
41
+ hasOpened,
42
+ open,
43
+ setOpen,
44
+ isExpanded,
45
+ setIsExpanded,
46
+ };
47
+
48
+ return (
49
+ <ChatbotContext.Provider value={value}>{children}</ChatbotContext.Provider>
50
+ );
51
+ }