@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/agent-frame.d.ts.map +1 -1
- package/dist/{chatbot.css → chatbot-popover.css} +2 -0
- package/dist/chatbot-sheet.css +103 -0
- package/dist/chatbot-sheet.d.ts +6 -0
- package/dist/chatbot-sheet.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +287 -7
- package/dist/index.mjs +313 -33
- package/dist/sheet.d.ts +27 -0
- package/dist/sheet.d.ts.map +1 -0
- package/dist/tooltip.css +18 -0
- package/dist/tooltip.d.ts +21 -0
- package/dist/tooltip.d.ts.map +1 -0
- package/package.json +12 -10
- package/src/agent-frame.tsx +22 -6
- package/src/{chatbot.css → chatbot-popover.css} +2 -0
- package/src/chatbot-sheet.css +103 -0
- package/src/chatbot-sheet.tsx +61 -0
- package/src/index.ts +3 -0
- package/src/sheet.tsx +198 -0
- package/src/tooltip.css +18 -0
- package/src/tooltip.tsx +88 -0
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/
|
|
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
|
|
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] =
|
|
55
|
-
const [hasInitialized, setHasInitialized] =
|
|
56
|
-
const [currentMcps, setCurrentMcps] =
|
|
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
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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__ */
|
|
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
|
|
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
|
|
155
|
-
import { jsx as
|
|
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 =
|
|
315
|
+
var PopoverTrigger = React2.forwardRef((_a, ref) => {
|
|
158
316
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
159
|
-
return /* @__PURE__ */
|
|
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 =
|
|
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__ */
|
|
184
|
-
backdrop && /* @__PURE__ */
|
|
185
|
-
/* @__PURE__ */
|
|
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
|
|
202
|
-
var ChatbotPopover =
|
|
359
|
+
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
360
|
+
var ChatbotPopover = forwardRef4(
|
|
203
361
|
(props, ref) => {
|
|
204
|
-
const [isOpen, setIsOpen] =
|
|
205
|
-
const [hasOpened, setHasOpened] =
|
|
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__ */
|
|
214
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
};
|
package/dist/sheet.d.ts
ADDED
|
@@ -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"}
|
package/dist/tooltip.css
ADDED
|
@@ -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.
|
|
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-
|
|
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
|
}
|
package/src/agent-frame.tsx
CHANGED
|
@@ -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
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
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
|
|