@super_studio/ecforce-ai-agent-react 0.1.5 → 0.2.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
@@ -33,27 +33,174 @@ var __objRest = (source, exclude) => {
33
33
 
34
34
  // src/agent-frame.tsx
35
35
  import {
36
- forwardRef,
36
+ forwardRef as forwardRef2,
37
37
  useCallback,
38
- useEffect,
38
+ useEffect as useEffect2,
39
39
  useImperativeHandle,
40
40
  useRef,
41
- useState
41
+ useState as useState2
42
42
  } from "react";
43
43
 
44
44
  // src/constants.ts
45
45
  var PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
46
46
 
47
- // src/agent-frame.tsx
47
+ // src/sheet.tsx
48
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
49
+ import * as React from "react";
48
50
  import { jsx } from "react/jsx-runtime";
49
- var AgentFrame = forwardRef(
51
+ var SheetContext = React.createContext(
52
+ void 0
53
+ );
54
+ function useSheet() {
55
+ const context = React.useContext(SheetContext);
56
+ if (!context) {
57
+ throw new Error("useSheet must be used within a SheetProvider");
58
+ }
59
+ return context;
60
+ }
61
+ function SheetProvider({ children }) {
62
+ const [hasOpened, setHasOpened] = React.useState(false);
63
+ const [sheetOpen, setSheetOpen] = React.useState(false);
64
+ const [isExpanded, setIsExpanded] = React.useState(false);
65
+ React.useEffect(() => {
66
+ if (sheetOpen) {
67
+ setHasOpened(true);
68
+ }
69
+ }, [sheetOpen]);
70
+ const value = {
71
+ hasOpened,
72
+ sheetOpen,
73
+ setSheetOpen,
74
+ isExpanded,
75
+ setIsExpanded
76
+ };
77
+ return /* @__PURE__ */ jsx(SheetContext.Provider, { value, children });
78
+ }
79
+ function Sheet(_a) {
80
+ var props = __objRest(_a, []);
81
+ const { sheetOpen, setSheetOpen } = useSheet();
82
+ return /* @__PURE__ */ jsx(
83
+ SheetPrimitive.Root,
84
+ __spreadValues({
85
+ "data-slot": "sheet",
86
+ modal: false,
87
+ open: sheetOpen,
88
+ onOpenChange: setSheetOpen
89
+ }, props)
90
+ );
91
+ }
92
+ var SheetTrigger = React.forwardRef((_a, ref) => {
93
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
94
+ return /* @__PURE__ */ jsx(
95
+ SheetPrimitive.Trigger,
96
+ __spreadValues({
97
+ ref,
98
+ "data-slot": "sheet-trigger",
99
+ className: `chatbot-trigger ${className || ""}`
100
+ }, props)
101
+ );
102
+ });
103
+ SheetTrigger.displayName = SheetPrimitive.Trigger.displayName;
104
+ var SheetClose = React.forwardRef((_a, ref) => {
105
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
106
+ return /* @__PURE__ */ jsx(
107
+ SheetPrimitive.Close,
108
+ __spreadValues({
109
+ ref,
110
+ "data-slot": "sheet-close",
111
+ className: `chatbot-sheet-close ${className || ""}`
112
+ }, props)
113
+ );
114
+ });
115
+ SheetClose.displayName = SheetPrimitive.Close.displayName;
116
+ function SheetPortal(_a) {
117
+ var props = __objRest(_a, []);
118
+ return /* @__PURE__ */ jsx(SheetPrimitive.Portal, __spreadValues({ "data-slot": "sheet-portal" }, props));
119
+ }
120
+ var SheetContent = React.forwardRef((_a, ref) => {
121
+ var _b = _a, { className, children, style } = _b, props = __objRest(_b, ["className", "children", "style"]);
122
+ const { isExpanded, sheetOpen, hasOpened } = useSheet();
123
+ const width = isExpanded ? "848px" : "400px";
124
+ const translateX = sheetOpen ? "0" : "100%";
125
+ const contentStyle = __spreadValues({
126
+ "--sheet-width": width,
127
+ transform: `translateX(${translateX})`
128
+ }, style);
129
+ return /* @__PURE__ */ jsx(SheetPortal, { forceMount: hasOpened || void 0, children: /* @__PURE__ */ jsx(
130
+ SheetPrimitive.Content,
131
+ __spreadProps(__spreadValues({
132
+ ref,
133
+ "data-slot": "sheet-content",
134
+ forceMount: hasOpened || void 0,
135
+ onInteractOutside: (e) => e.preventDefault(),
136
+ className: `chatbot-sheet-content ${isExpanded ? "chatbot-sheet-expanded" : ""} ${className || ""}`,
137
+ style: contentStyle
138
+ }, props), {
139
+ children
140
+ })
141
+ ) });
142
+ });
143
+ SheetContent.displayName = SheetPrimitive.Content.displayName;
144
+ var SheetHeader = React.forwardRef((_a, ref) => {
145
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
146
+ return /* @__PURE__ */ jsx(
147
+ "div",
148
+ __spreadValues({
149
+ ref,
150
+ "data-slot": "sheet-header",
151
+ className: `chatbot-sheet-header ${className || ""}`
152
+ }, props)
153
+ );
154
+ });
155
+ SheetHeader.displayName = "SheetHeader";
156
+ var SheetFooter = React.forwardRef((_a, ref) => {
157
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
158
+ return /* @__PURE__ */ jsx(
159
+ "div",
160
+ __spreadValues({
161
+ ref,
162
+ "data-slot": "sheet-footer",
163
+ className: `chatbot-sheet-footer ${className || ""}`
164
+ }, props)
165
+ );
166
+ });
167
+ SheetFooter.displayName = "SheetFooter";
168
+ var SheetTitle = React.forwardRef((_a, ref) => {
169
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
170
+ return /* @__PURE__ */ jsx(
171
+ SheetPrimitive.Title,
172
+ __spreadValues({
173
+ ref,
174
+ "data-slot": "sheet-title",
175
+ className: `chatbot-sheet-title ${className || ""}`
176
+ }, props)
177
+ );
178
+ });
179
+ SheetTitle.displayName = SheetPrimitive.Title.displayName;
180
+ var SheetDescription = React.forwardRef((_a, ref) => {
181
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
182
+ return /* @__PURE__ */ jsx(
183
+ SheetPrimitive.Description,
184
+ __spreadValues({
185
+ ref,
186
+ "data-slot": "sheet-description",
187
+ className: `chatbot-sheet-description ${className || ""}`
188
+ }, props)
189
+ );
190
+ });
191
+ SheetDescription.displayName = SheetPrimitive.Description.displayName;
192
+
193
+ // src/agent-frame.tsx
194
+ import { jsx as jsx2 } from "react/jsx-runtime";
195
+ var AgentFrame = forwardRef2(
50
196
  ({ agentId, mcps = [], appName, className, url }, ref) => {
51
197
  var _a;
52
198
  const chatbotUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
53
199
  const iframeRef = useRef(null);
54
- const [isReady, setIsReady] = useState(false);
55
- const [hasInitialized, setHasInitialized] = useState(false);
56
- const [currentMcps, setCurrentMcps] = useState(mcps);
200
+ const [isReady, setIsReady] = useState2(false);
201
+ const [hasInitialized, setHasInitialized] = useState2(false);
202
+ const [currentMcps, setCurrentMcps] = useState2(mcps);
203
+ const { setIsExpanded, setSheetOpen } = useSheet();
57
204
  const postMessage = useCallback((message) => {
58
205
  var _a2;
59
206
  if ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow) {
@@ -91,7 +238,7 @@ var AgentFrame = forwardRef(
91
238
  }),
92
239
  [setMcps, setAppName, isReady]
93
240
  );
94
- useEffect(() => {
241
+ useEffect2(() => {
95
242
  const iframe = iframeRef.current;
96
243
  if (!iframe) {
97
244
  return;
@@ -101,8 +248,19 @@ var AgentFrame = forwardRef(
101
248
  if (process.env.NODE_ENV === "development") {
102
249
  console.log("iframe message", event.data);
103
250
  }
104
- if (((_a2 = event.data) == null ? void 0 : _a2.type) === "CHATBOT_READY") {
105
- setIsReady(true);
251
+ switch ((_a2 = event.data) == null ? void 0 : _a2.type) {
252
+ case "CHATBOT_READY":
253
+ setIsReady(true);
254
+ break;
255
+ case "CLOSE_CHATBOT":
256
+ setSheetOpen(false);
257
+ break;
258
+ case "EXPAND_CHATBOT":
259
+ setIsExpanded(true);
260
+ break;
261
+ case "SHRINK_CHATBOT":
262
+ setIsExpanded(false);
263
+ break;
106
264
  }
107
265
  };
108
266
  const handleIframeLoad = () => {
@@ -114,7 +272,7 @@ var AgentFrame = forwardRef(
114
272
  iframe.removeEventListener("load", handleIframeLoad);
115
273
  };
116
274
  }, []);
117
- useEffect(() => {
275
+ useEffect2(() => {
118
276
  if (isReady && !hasInitialized) {
119
277
  setHasInitialized(true);
120
278
  init({ mcps });
@@ -123,13 +281,13 @@ var AgentFrame = forwardRef(
123
281
  }
124
282
  }
125
283
  }, [isReady, init, mcps, appName, hasInitialized, setAppName]);
126
- useEffect(() => {
284
+ useEffect2(() => {
127
285
  if (JSON.stringify(currentMcps) !== JSON.stringify(mcps)) {
128
286
  setCurrentMcps(mcps);
129
287
  setMcps(mcps);
130
288
  }
131
289
  }, [setMcps, mcps, currentMcps]);
132
- return /* @__PURE__ */ jsx(
290
+ return /* @__PURE__ */ jsx2(
133
291
  "iframe",
134
292
  {
135
293
  ref: iframeRef,
@@ -147,16 +305,16 @@ var AgentFrame = forwardRef(
147
305
  AgentFrame.displayName = "AgentFrame";
148
306
 
149
307
  // src/chatbot-popover.tsx
150
- import { forwardRef as forwardRef3, useState as useState2 } from "react";
308
+ import { forwardRef as forwardRef4, useState as useState3 } from "react";
151
309
 
152
310
  // src/popover.tsx
153
311
  import * as PopoverPrimitive from "@radix-ui/react-popover";
154
- import * as React from "react";
155
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
312
+ import * as React2 from "react";
313
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
156
314
  var Popover = PopoverPrimitive.Root;
157
- var PopoverTrigger = React.forwardRef((_a, ref) => {
315
+ var PopoverTrigger = React2.forwardRef((_a, ref) => {
158
316
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
159
- return /* @__PURE__ */ jsx2(
317
+ return /* @__PURE__ */ jsx3(
160
318
  PopoverPrimitive.Trigger,
161
319
  __spreadValues({
162
320
  ref,
@@ -165,7 +323,7 @@ var PopoverTrigger = React.forwardRef((_a, ref) => {
165
323
  );
166
324
  });
167
325
  PopoverTrigger.displayName = PopoverPrimitive.Trigger.displayName;
168
- var PopoverContent = React.forwardRef(
326
+ var PopoverContent = React2.forwardRef(
169
327
  (_a, ref) => {
170
328
  var _b = _a, {
171
329
  className,
@@ -180,9 +338,9 @@ var PopoverContent = React.forwardRef(
180
338
  "sideOffset",
181
339
  "forceMount"
182
340
  ]);
183
- return /* @__PURE__ */ jsx2(PopoverPrimitive.Portal, { forceMount, children: /* @__PURE__ */ jsxs("div", { children: [
184
- backdrop && /* @__PURE__ */ jsx2("div", { className: "chatbot-popover-backdrop" }),
185
- /* @__PURE__ */ jsx2(
341
+ return /* @__PURE__ */ jsx3(PopoverPrimitive.Portal, { forceMount, children: /* @__PURE__ */ jsxs("div", { children: [
342
+ backdrop && /* @__PURE__ */ jsx3("div", { className: "chatbot-popover-backdrop" }),
343
+ /* @__PURE__ */ jsx3(
186
344
  PopoverPrimitive.Content,
187
345
  __spreadValues({
188
346
  ref,
@@ -198,11 +356,11 @@ var PopoverContent = React.forwardRef(
198
356
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
199
357
 
200
358
  // src/chatbot-popover.tsx
201
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
202
- var ChatbotPopover = forwardRef3(
359
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
360
+ var ChatbotPopover = forwardRef4(
203
361
  (props, ref) => {
204
- const [isOpen, setIsOpen] = useState2(false);
205
- const [hasOpened, setHasOpened] = useState2(false);
362
+ const [isOpen, setIsOpen] = useState3(false);
363
+ const [hasOpened, setHasOpened] = useState3(false);
206
364
  const handleOpenChange = (open) => {
207
365
  setIsOpen(open);
208
366
  if (open && !hasOpened) {
@@ -210,21 +368,21 @@ var ChatbotPopover = forwardRef3(
210
368
  }
211
369
  };
212
370
  return /* @__PURE__ */ jsxs2(Popover, { open: isOpen, onOpenChange: handleOpenChange, children: [
213
- /* @__PURE__ */ jsx3(PopoverTrigger, { children: /* @__PURE__ */ jsx3(EcforceAiIcon, {}) }),
214
- /* @__PURE__ */ jsx3(
371
+ /* @__PURE__ */ jsx4(PopoverTrigger, { children: /* @__PURE__ */ jsx4(EcforceAiIcon, {}) }),
372
+ /* @__PURE__ */ jsx4(
215
373
  PopoverContent,
216
374
  {
217
375
  align: "end",
218
376
  backdrop: isOpen,
219
377
  forceMount: hasOpened || void 0,
220
- children: /* @__PURE__ */ jsx3(AgentFrame, __spreadProps(__spreadValues({}, props), { ref }))
378
+ children: /* @__PURE__ */ jsx4(AgentFrame, __spreadProps(__spreadValues({}, props), { ref }))
221
379
  }
222
380
  )
223
381
  ] });
224
382
  }
225
383
  );
226
384
  function EcforceAiIcon() {
227
- return /* @__PURE__ */ jsx3(
385
+ return /* @__PURE__ */ jsx4(
228
386
  "svg",
229
387
  {
230
388
  width: "24",
@@ -232,7 +390,117 @@ function EcforceAiIcon() {
232
390
  viewBox: "0 0 24 24",
233
391
  xmlns: "http://www.w3.org/2000/svg",
234
392
  fill: "currentColor",
235
- children: /* @__PURE__ */ jsx3(
393
+ children: /* @__PURE__ */ jsx4(
394
+ "path",
395
+ {
396
+ fillRule: "evenodd",
397
+ clipRule: "evenodd",
398
+ d: "M9.2 13.704s3.7-.812 4.325-3.74c.624-2.93.76-3.364 1.112-3.364.352 0 .42.309.5.618.08.309.51 2.276.613 2.745.102.47.783 2.93 3.712 3.616 2.93.686 3.338.697 3.338 1.12 0 .459-2.361.859-3.338 1.122-.976.263-3.042 1.007-3.587 3.49-.534 2.482-.681 3.489-1.238 3.489-.556 0-.545-.584-.613-.87-.068-.286-.34-1.819-.5-2.494-.147-.675-1.044-2.837-2.962-3.363-1.93-.527-3.962-.847-3.962-1.373s2.134-.824 2.6-.995ZM2.462 4.613s1.785-.39 2.08-1.798c.296-1.409.365-1.615.535-1.615.17 0 .205.149.239.298s.25 1.088.296 1.317c.045.229.375 1.409 1.785 1.74 1.41.333 1.603.333 1.603.54 0 .217-1.137.412-1.603.538-.466.126-1.467.48-1.729 1.683C5.407 8.507 5.338 9 5.078 9c-.262 0-.262-.286-.296-.424-.035-.137-.16-.882-.24-1.202-.079-.321-.5-1.363-1.432-1.615-.932-.252-1.91-.413-1.91-.665 0-.252 1.023-.4 1.25-.48h.012Z"
399
+ }
400
+ )
401
+ }
402
+ );
403
+ }
404
+
405
+ // src/chatbot-sheet.tsx
406
+ import { forwardRef as forwardRef5 } from "react";
407
+
408
+ // src/tooltip.tsx
409
+ import {
410
+ Arrow,
411
+ Content as Content3,
412
+ Portal as Portal3,
413
+ Provider,
414
+ Root as Root3,
415
+ Trigger as Trigger3
416
+ } from "@radix-ui/react-tooltip";
417
+ import "./tooltip.css";
418
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
419
+ function Tooltip({
420
+ content,
421
+ trigger,
422
+ side,
423
+ align,
424
+ disabled,
425
+ delayDuration,
426
+ skipDelayDuration,
427
+ className,
428
+ open,
429
+ alignOffset,
430
+ sideOffset,
431
+ arrowClassName,
432
+ keepTooltipOpen
433
+ }) {
434
+ return /* @__PURE__ */ jsx5(
435
+ Provider,
436
+ {
437
+ delayDuration: delayDuration != null ? delayDuration : 200,
438
+ skipDelayDuration: skipDelayDuration != null ? skipDelayDuration : 200,
439
+ children: /* @__PURE__ */ jsxs3(Root3, { open: disabled ? false : open, children: [
440
+ /* @__PURE__ */ jsx5(
441
+ Trigger3,
442
+ {
443
+ onClick: keepTooltipOpen ? (event) => {
444
+ event.preventDefault();
445
+ } : void 0,
446
+ asChild: true,
447
+ children: trigger
448
+ }
449
+ ),
450
+ /* @__PURE__ */ jsx5(Portal3, { children: /* @__PURE__ */ jsxs3(
451
+ Content3,
452
+ {
453
+ className: `tooltip-content ${className || ""}`,
454
+ side,
455
+ align,
456
+ alignOffset,
457
+ sideOffset,
458
+ onPointerDownOutside: keepTooltipOpen ? (event) => {
459
+ event.preventDefault();
460
+ } : void 0,
461
+ children: [
462
+ /* @__PURE__ */ jsx5(Arrow, { className: arrowClassName }),
463
+ content
464
+ ]
465
+ }
466
+ ) })
467
+ ] })
468
+ }
469
+ );
470
+ }
471
+
472
+ // src/chatbot-sheet.tsx
473
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
474
+ var ChatbotSheet = forwardRef5(
475
+ (_a, ref) => {
476
+ var _b = _a, { sheetStyle } = _b, props = __objRest(_b, ["sheetStyle"]);
477
+ return /* @__PURE__ */ jsx6(SheetProvider, { children: /* @__PURE__ */ jsxs4(Sheet, { children: [
478
+ /* @__PURE__ */ jsx6(
479
+ Tooltip,
480
+ {
481
+ side: "top",
482
+ align: "end",
483
+ content: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046",
484
+ trigger: /* @__PURE__ */ jsx6(SheetTrigger, { children: /* @__PURE__ */ jsx6(EcforceAiIcon2, {}) })
485
+ }
486
+ ),
487
+ /* @__PURE__ */ jsxs4(SheetContent, { style: sheetStyle, children: [
488
+ /* @__PURE__ */ jsx6(SheetTitle, { children: "AI\u306B\u8CEA\u554F\u3057\u3066\u307F\u307E\u3057\u3087\u3046" }),
489
+ /* @__PURE__ */ jsx6(AgentFrame, __spreadProps(__spreadValues({}, props), { ref }))
490
+ ] })
491
+ ] }) });
492
+ }
493
+ );
494
+ function EcforceAiIcon2() {
495
+ return /* @__PURE__ */ jsx6(
496
+ "svg",
497
+ {
498
+ width: "18",
499
+ height: "18",
500
+ viewBox: "0 0 24 24",
501
+ xmlns: "http://www.w3.org/2000/svg",
502
+ fill: "currentColor",
503
+ children: /* @__PURE__ */ jsx6(
236
504
  "path",
237
505
  {
238
506
  fillRule: "evenodd",
@@ -246,7 +514,19 @@ function EcforceAiIcon() {
246
514
  export {
247
515
  AgentFrame,
248
516
  ChatbotPopover,
517
+ ChatbotSheet,
249
518
  Popover,
250
519
  PopoverContent,
251
- PopoverTrigger
520
+ PopoverTrigger,
521
+ Sheet,
522
+ SheetClose,
523
+ SheetContent,
524
+ SheetDescription,
525
+ SheetFooter,
526
+ SheetHeader,
527
+ SheetProvider,
528
+ SheetTitle,
529
+ SheetTrigger,
530
+ Tooltip,
531
+ useSheet
252
532
  };
@@ -0,0 +1,27 @@
1
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
2
+ import * as React from "react";
3
+ interface SheetContextType {
4
+ hasOpened: boolean;
5
+ sheetOpen: boolean;
6
+ setSheetOpen: (open: boolean) => void;
7
+ isExpanded: boolean;
8
+ setIsExpanded: (expanded: boolean) => void;
9
+ }
10
+ export declare function useSheet(): SheetContextType;
11
+ interface SheetProviderProps {
12
+ children: React.ReactNode;
13
+ defaultWidth?: number;
14
+ minWidth?: number;
15
+ maxWidth?: number;
16
+ }
17
+ export declare function SheetProvider({ children }: SheetProviderProps): import("react/jsx-runtime").JSX.Element;
18
+ declare function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
19
+ declare const SheetTrigger: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
20
+ declare const SheetClose: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
21
+ declare const SheetContent: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
22
+ declare const SheetHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
23
+ declare const SheetFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
24
+ declare const SheetTitle: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
25
+ declare const SheetDescription: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
26
+ export { Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, };
27
+ //# 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;AAE/B,UAAU,gBAAgB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAMD,wBAAgB,QAAQ,qBAMvB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAsB7D;AAED,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.2.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,16 @@
24
17
  "require": "./dist/index.js",
25
18
  "default": "./dist/index.js"
26
19
  },
27
- "./chatbot.css": "./dist/chatbot.css"
20
+ "./chatbot-popover.css": "./dist/chatbot-popover.css",
21
+ "./chatbot-sheet.css": "./dist/chatbot-sheet.css"
28
22
  },
29
23
  "publishConfig": {
30
24
  "access": "public"
31
25
  },
32
26
  "dependencies": {
33
- "@radix-ui/react-popover": "1.1.14"
27
+ "@radix-ui/react-dialog": "1.1.14",
28
+ "@radix-ui/react-popover": "1.1.14",
29
+ "@radix-ui/react-tooltip": "1.2.7"
34
30
  },
35
31
  "peerDependencies": {
36
32
  "react": ">=16",
@@ -44,5 +40,11 @@
44
40
  "react": "19.1.0",
45
41
  "react-dom": "19.1.0",
46
42
  "tsup": "8.5.0"
43
+ },
44
+ "scripts": {
45
+ "dev": "npm-run-all --parallel dev:main dev:types",
46
+ "dev:main": "tsup --watch",
47
+ "dev:types": "tsc -p tsconfig.build.json --watch",
48
+ "build": "tsup && tsc -p tsconfig.build.json"
47
49
  }
48
50
  }
@@ -7,10 +7,13 @@ import {
7
7
  useState,
8
8
  } from "react";
9
9
  import { PROD_CHATBOT_URL } from "./constants";
10
+ import { useSheet } from "./sheet";
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, setSheetOpen } = useSheet();
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
+ setSheetOpen(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
 
@@ -1,3 +1,5 @@
1
+ @import "./tooltip.css";
2
+
1
3
  /* Chatbot Trigger Button */
2
4
  .chatbot-trigger {
3
5
  position: fixed;