@bikdotai/bik-component-library 0.0.856 → 0.0.857-beta.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/README.md +25 -4
- package/dist/cjs/components/bik-copilot/BIKCopilot.js +2 -0
- package/dist/cjs/components/bik-copilot/BIKCopilot.js.map +1 -0
- package/dist/cjs/components/bik-copilot/ControlledCopilot.js +2 -0
- package/dist/cjs/components/bik-copilot/ControlledCopilot.js.map +1 -0
- package/dist/cjs/components/bik-copilot/ControlledCopilot.styled.js +27 -0
- package/dist/cjs/components/bik-copilot/ControlledCopilot.styled.js.map +1 -0
- package/dist/cjs/components/bik-copilot/CopilotBall.js +2 -0
- package/dist/cjs/components/bik-copilot/CopilotBall.js.map +1 -0
- package/dist/cjs/components/bik-copilot/CopilotBall.styled.js +42 -0
- package/dist/cjs/components/bik-copilot/CopilotBall.styled.js.map +1 -0
- package/dist/cjs/components/bik-copilot/CopilotPanel.js +2 -0
- package/dist/cjs/components/bik-copilot/CopilotPanel.js.map +1 -0
- package/dist/cjs/components/bik-copilot/CopilotPanel.styled.js +419 -0
- package/dist/cjs/components/bik-copilot/CopilotPanel.styled.js.map +1 -0
- package/dist/cjs/components/bik-copilot/copilotPlacement.js +2 -0
- package/dist/cjs/components/bik-copilot/copilotPlacement.js.map +1 -0
- package/dist/cjs/components/bik-copilot/services/copilotDb.js +2 -0
- package/dist/cjs/components/bik-copilot/services/copilotDb.js.map +1 -0
- package/dist/cjs/components/bik-copilot/services/copilotIcebreakersClient.js +2 -0
- package/dist/cjs/components/bik-copilot/services/copilotIcebreakersClient.js.map +1 -0
- package/dist/cjs/components/bik-copilot/services/copilotMessagesClient.js +2 -0
- package/dist/cjs/components/bik-copilot/services/copilotMessagesClient.js.map +1 -0
- package/dist/cjs/components/bik-copilot/services/copilotPageSession.js +2 -0
- package/dist/cjs/components/bik-copilot/services/copilotPageSession.js.map +1 -0
- package/dist/cjs/components/bik-copilot/services/copilotSseParser.js +7 -0
- package/dist/cjs/components/bik-copilot/services/copilotSseParser.js.map +1 -0
- package/dist/cjs/components/bik-copilot/services/copilotStreamClient.js +2 -0
- package/dist/cjs/components/bik-copilot/services/copilotStreamClient.js.map +1 -0
- package/dist/cjs/components/bik-copilot/useCopilotIcebreakers.js +2 -0
- package/dist/cjs/components/bik-copilot/useCopilotIcebreakers.js.map +1 -0
- package/dist/cjs/components/bik-copilot/useCopilotStreamChat.js +2 -0
- package/dist/cjs/components/bik-copilot/useCopilotStreamChat.js.map +1 -0
- package/dist/cjs/components/bik-copilot/useDraggableFloater.js +2 -0
- package/dist/cjs/components/bik-copilot/useDraggableFloater.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/esm/components/bik-copilot/BIKCopilot.d.ts +32 -0
- package/dist/esm/components/bik-copilot/BIKCopilot.js +114 -0
- package/dist/esm/components/bik-copilot/BIKCopilot.js.map +1 -0
- package/dist/esm/components/bik-copilot/ControlledCopilot.d.ts +14 -0
- package/dist/esm/components/bik-copilot/ControlledCopilot.js +170 -0
- package/dist/esm/components/bik-copilot/ControlledCopilot.js.map +1 -0
- package/dist/esm/components/bik-copilot/ControlledCopilot.styled.d.ts +7 -0
- package/dist/esm/components/bik-copilot/ControlledCopilot.styled.js +31 -0
- package/dist/esm/components/bik-copilot/ControlledCopilot.styled.js.map +1 -0
- package/dist/esm/components/bik-copilot/CopilotBall.d.ts +13 -0
- package/dist/esm/components/bik-copilot/CopilotBall.js +50 -0
- package/dist/esm/components/bik-copilot/CopilotBall.js.map +1 -0
- package/dist/esm/components/bik-copilot/CopilotBall.styled.d.ts +9 -0
- package/dist/esm/components/bik-copilot/CopilotBall.styled.js +46 -0
- package/dist/esm/components/bik-copilot/CopilotBall.styled.js.map +1 -0
- package/dist/esm/components/bik-copilot/CopilotPanel.d.ts +9 -0
- package/dist/esm/components/bik-copilot/CopilotPanel.js +309 -0
- package/dist/esm/components/bik-copilot/CopilotPanel.js.map +1 -0
- package/dist/esm/components/bik-copilot/CopilotPanel.styled.d.ts +58 -0
- package/dist/esm/components/bik-copilot/CopilotPanel.styled.js +453 -0
- package/dist/esm/components/bik-copilot/CopilotPanel.styled.js.map +1 -0
- package/dist/esm/components/bik-copilot/copilotPlacement.d.ts +24 -0
- package/dist/esm/components/bik-copilot/copilotPlacement.js +38 -0
- package/dist/esm/components/bik-copilot/copilotPlacement.js.map +1 -0
- package/dist/esm/components/bik-copilot/index.d.ts +16 -0
- package/dist/esm/components/bik-copilot/model.d.ts +674 -0
- package/dist/esm/components/bik-copilot/services/copilotDb.d.ts +90 -0
- package/dist/esm/components/bik-copilot/services/copilotDb.js +96 -0
- package/dist/esm/components/bik-copilot/services/copilotDb.js.map +1 -0
- package/dist/esm/components/bik-copilot/services/copilotIcebreakersClient.d.ts +11 -0
- package/dist/esm/components/bik-copilot/services/copilotIcebreakersClient.js +54 -0
- package/dist/esm/components/bik-copilot/services/copilotIcebreakersClient.js.map +1 -0
- package/dist/esm/components/bik-copilot/services/copilotMessagesClient.d.ts +23 -0
- package/dist/esm/components/bik-copilot/services/copilotMessagesClient.js +78 -0
- package/dist/esm/components/bik-copilot/services/copilotMessagesClient.js.map +1 -0
- package/dist/esm/components/bik-copilot/services/copilotPageSession.d.ts +37 -0
- package/dist/esm/components/bik-copilot/services/copilotPageSession.js +35 -0
- package/dist/esm/components/bik-copilot/services/copilotPageSession.js.map +1 -0
- package/dist/esm/components/bik-copilot/services/copilotSseParser.d.ts +22 -0
- package/dist/esm/components/bik-copilot/services/copilotSseParser.js +52 -0
- package/dist/esm/components/bik-copilot/services/copilotSseParser.js.map +1 -0
- package/dist/esm/components/bik-copilot/services/copilotStreamClient.d.ts +31 -0
- package/dist/esm/components/bik-copilot/services/copilotStreamClient.js +103 -0
- package/dist/esm/components/bik-copilot/services/copilotStreamClient.js.map +1 -0
- package/dist/esm/components/bik-copilot/useCopilotIcebreakers.d.ts +17 -0
- package/dist/esm/components/bik-copilot/useCopilotIcebreakers.js +60 -0
- package/dist/esm/components/bik-copilot/useCopilotIcebreakers.js.map +1 -0
- package/dist/esm/components/bik-copilot/useCopilotStreamChat.d.ts +20 -0
- package/dist/esm/components/bik-copilot/useCopilotStreamChat.js +333 -0
- package/dist/esm/components/bik-copilot/useCopilotStreamChat.js.map +1 -0
- package/dist/esm/components/bik-copilot/useDraggableFloater.d.ts +9 -0
- package/dist/esm/components/bik-copilot/useDraggableFloater.js +118 -0
- package/dist/esm/components/bik-copilot/useDraggableFloater.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +793 -743
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { jsxs as pe, Fragment as me, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { useState as ue, useRef as ge, useCallback as C, useEffect as v } from "react";
|
|
3
|
+
import { COLORS as he } from "../../constants/Theme.js";
|
|
4
|
+
import { PanelPositioner as Ce } from "./ControlledCopilot.styled.js";
|
|
5
|
+
import { CopilotBall as ve, COPILOT_BALL_ATTRIBUTE as we } from "./CopilotBall.js";
|
|
6
|
+
import { CopilotPanel as Le } from "./CopilotPanel.js";
|
|
7
|
+
import { getCopilotPanelPlacement as Pe } from "./copilotPlacement.js";
|
|
8
|
+
import { useDraggableFloater as Ee } from "./useDraggableFloater.js";
|
|
9
|
+
const De = ({
|
|
10
|
+
// Conversation
|
|
11
|
+
messages: w,
|
|
12
|
+
onSendMessage: L,
|
|
13
|
+
isThinking: P = !1,
|
|
14
|
+
thinkingLabel: E,
|
|
15
|
+
isStreaming: k = !1,
|
|
16
|
+
onStop: $,
|
|
17
|
+
interruptedLabel: b,
|
|
18
|
+
followUpsLabel: I,
|
|
19
|
+
hasMoreHistory: O = !1,
|
|
20
|
+
isLoadingHistory: T = !1,
|
|
21
|
+
onLoadOlderMessages: y,
|
|
22
|
+
historyLoadingLabel: B,
|
|
23
|
+
errorMessage: D,
|
|
24
|
+
// Ball
|
|
25
|
+
ballSize: r = 56,
|
|
26
|
+
corner: R = "bottom-right",
|
|
27
|
+
offset: x = 24,
|
|
28
|
+
initialPosition: j,
|
|
29
|
+
draggable: f = !0,
|
|
30
|
+
snapToEdge: A = !0,
|
|
31
|
+
onPositionChange: F,
|
|
32
|
+
ballIcon: U,
|
|
33
|
+
ballOpenIcon: _,
|
|
34
|
+
ballColor: z = he.background.brand,
|
|
35
|
+
zIndex: c = 1200,
|
|
36
|
+
ballAriaLabel: H,
|
|
37
|
+
// Panel
|
|
38
|
+
panelWidth: K = 380,
|
|
39
|
+
panelHeight: S = 540,
|
|
40
|
+
panelGap: q = 12,
|
|
41
|
+
title: G = "Copilot",
|
|
42
|
+
badge: J,
|
|
43
|
+
subtitle: M,
|
|
44
|
+
avatar: N,
|
|
45
|
+
placeholder: Q,
|
|
46
|
+
disclaimer: V,
|
|
47
|
+
emptyStateTitle: W,
|
|
48
|
+
emptyStateSubtitle: X,
|
|
49
|
+
suggestions: Y,
|
|
50
|
+
onSuggestionClick: Z,
|
|
51
|
+
showRefresh: ee = !0,
|
|
52
|
+
onRefresh: oe,
|
|
53
|
+
inputDisabled: te = !1,
|
|
54
|
+
// Open state
|
|
55
|
+
open: d,
|
|
56
|
+
defaultOpen: ne = !1,
|
|
57
|
+
onOpenChange: p,
|
|
58
|
+
closeOnClickOutside: m = !1,
|
|
59
|
+
className: re,
|
|
60
|
+
style: ie
|
|
61
|
+
}) => {
|
|
62
|
+
const [le, se] = ue(ne), u = ge(null), i = d !== void 0, e = i ? d : le, t = C(
|
|
63
|
+
(o) => {
|
|
64
|
+
i || se(o), p?.(o);
|
|
65
|
+
},
|
|
66
|
+
[i, p]
|
|
67
|
+
), { position: g, isDragging: ae, viewport: fe, dragHandlers: ce, shouldIgnoreClick: h } = Ee({
|
|
68
|
+
size: r,
|
|
69
|
+
corner: R,
|
|
70
|
+
offset: x,
|
|
71
|
+
enabled: f,
|
|
72
|
+
snapToEdge: A,
|
|
73
|
+
initialPosition: j,
|
|
74
|
+
onPositionChange: F
|
|
75
|
+
}), de = C(() => {
|
|
76
|
+
h() || t(!e);
|
|
77
|
+
}, [e, t, h]);
|
|
78
|
+
v(() => {
|
|
79
|
+
if (!e)
|
|
80
|
+
return;
|
|
81
|
+
const o = (l) => {
|
|
82
|
+
l.key === "Escape" && t(!1);
|
|
83
|
+
};
|
|
84
|
+
return document.addEventListener("keydown", o), () => document.removeEventListener("keydown", o);
|
|
85
|
+
}, [e, t]), v(() => {
|
|
86
|
+
if (!e || !m)
|
|
87
|
+
return;
|
|
88
|
+
const o = (l) => {
|
|
89
|
+
const s = l.target;
|
|
90
|
+
s && (u.current?.contains(s) || s.closest(`[${we}]`) || t(!1));
|
|
91
|
+
};
|
|
92
|
+
return document.addEventListener("pointerdown", o), () => document.removeEventListener("pointerdown", o);
|
|
93
|
+
}, [m, e, t]);
|
|
94
|
+
const n = Pe({
|
|
95
|
+
ballPosition: g,
|
|
96
|
+
ballSize: r,
|
|
97
|
+
panelWidth: K,
|
|
98
|
+
panelHeight: S,
|
|
99
|
+
gap: q,
|
|
100
|
+
viewport: fe
|
|
101
|
+
});
|
|
102
|
+
return /* @__PURE__ */ pe(me, { children: [
|
|
103
|
+
e && /* @__PURE__ */ a(
|
|
104
|
+
Ce,
|
|
105
|
+
{
|
|
106
|
+
ref: u,
|
|
107
|
+
$left: n.left,
|
|
108
|
+
$top: n.top,
|
|
109
|
+
$width: n.width,
|
|
110
|
+
$height: n.height,
|
|
111
|
+
$zIndex: c,
|
|
112
|
+
children: /* @__PURE__ */ a(
|
|
113
|
+
Le,
|
|
114
|
+
{
|
|
115
|
+
messages: w,
|
|
116
|
+
onSend: L,
|
|
117
|
+
onClose: () => t(!1),
|
|
118
|
+
title: G,
|
|
119
|
+
badge: J,
|
|
120
|
+
subtitle: M,
|
|
121
|
+
avatar: N,
|
|
122
|
+
placeholder: Q,
|
|
123
|
+
disclaimer: V,
|
|
124
|
+
emptyStateTitle: W,
|
|
125
|
+
emptyStateSubtitle: X,
|
|
126
|
+
suggestions: Y,
|
|
127
|
+
onSuggestionClick: Z,
|
|
128
|
+
showRefresh: ee,
|
|
129
|
+
onRefresh: oe,
|
|
130
|
+
isThinking: P,
|
|
131
|
+
thinkingLabel: E,
|
|
132
|
+
isStreaming: k,
|
|
133
|
+
onStop: $,
|
|
134
|
+
interruptedLabel: b,
|
|
135
|
+
followUpsLabel: I,
|
|
136
|
+
hasMoreHistory: O,
|
|
137
|
+
isLoadingHistory: T,
|
|
138
|
+
onLoadOlderMessages: y,
|
|
139
|
+
historyLoadingLabel: B,
|
|
140
|
+
inputDisabled: te,
|
|
141
|
+
errorMessage: D,
|
|
142
|
+
className: re,
|
|
143
|
+
style: ie
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
),
|
|
148
|
+
/* @__PURE__ */ a(
|
|
149
|
+
ve,
|
|
150
|
+
{
|
|
151
|
+
isOpen: e,
|
|
152
|
+
onToggle: de,
|
|
153
|
+
position: g,
|
|
154
|
+
size: r,
|
|
155
|
+
isDragging: ae,
|
|
156
|
+
draggable: f,
|
|
157
|
+
color: z,
|
|
158
|
+
zIndex: c + 1,
|
|
159
|
+
icon: U,
|
|
160
|
+
openIcon: _,
|
|
161
|
+
ariaLabel: H,
|
|
162
|
+
...ce
|
|
163
|
+
}
|
|
164
|
+
)
|
|
165
|
+
] });
|
|
166
|
+
};
|
|
167
|
+
export {
|
|
168
|
+
De as ControlledCopilot
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=ControlledCopilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledCopilot.js","sources":["../../../../src/components/bik-copilot/ControlledCopilot.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { COLORS } from '@src/constants/Theme';\nimport { PanelPositioner } from './ControlledCopilot.styled';\nimport { COPILOT_BALL_ATTRIBUTE, CopilotBall } from './CopilotBall';\nimport { CopilotPanel } from './CopilotPanel';\nimport { getCopilotPanelPlacement } from './copilotPlacement';\nimport { ControlledCopilotProps } from './model';\nimport { useDraggableFloater } from './useDraggableFloater';\n\n/**\n * The presentational half of the copilot: a draggable floating ball that opens a\n * chat panel beside it.\n *\n * Fully controlled — it renders the `messages` it is handed and reports every\n * user action through callbacks, so it carries no backend knowledge. **Use\n * `BIKCopilot` instead** unless you are wiring a backend other than\n * `/bik-ai/copilot-chatbot`; `BIKCopilot` is this component plus the streaming\n * transport, IndexedDB history and route-aware ice breakers.\n */\nexport const ControlledCopilot: React.FC<ControlledCopilotProps> = ({\n\t// Conversation\n\tmessages,\n\tonSendMessage,\n\tisThinking = false,\n\tthinkingLabel,\n\tisStreaming = false,\n\tonStop,\n\tinterruptedLabel,\n\tfollowUpsLabel,\n\thasMoreHistory = false,\n\tisLoadingHistory = false,\n\tonLoadOlderMessages,\n\thistoryLoadingLabel,\n\terrorMessage,\n\t// Ball\n\tballSize = 56,\n\tcorner = 'bottom-right',\n\toffset = 24,\n\tinitialPosition,\n\tdraggable = true,\n\tsnapToEdge = true,\n\tonPositionChange,\n\tballIcon,\n\tballOpenIcon,\n\tballColor = COLORS.background.brand,\n\tzIndex = 1200,\n\tballAriaLabel,\n\t// Panel\n\tpanelWidth = 380,\n\tpanelHeight = 540,\n\tpanelGap = 12,\n\ttitle = 'Copilot',\n\tbadge,\n\tsubtitle,\n\tavatar,\n\tplaceholder,\n\tdisclaimer,\n\temptyStateTitle,\n\temptyStateSubtitle,\n\tsuggestions,\n\tonSuggestionClick,\n\tshowRefresh = true,\n\tonRefresh,\n\tinputDisabled = false,\n\t// Open state\n\topen,\n\tdefaultOpen = false,\n\tonOpenChange,\n\tcloseOnClickOutside = false,\n\tclassName,\n\tstyle,\n}) => {\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n\tconst panelRef = useRef<HTMLDivElement>(null);\n\n\tconst isControlled = open !== undefined;\n\tconst isOpen = isControlled ? open : uncontrolledOpen;\n\n\tconst setOpen = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetUncontrolledOpen(next);\n\t\t\t}\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange],\n\t);\n\n\tconst { position, isDragging, viewport, dragHandlers, shouldIgnoreClick } =\n\t\tuseDraggableFloater({\n\t\t\tsize: ballSize,\n\t\t\tcorner,\n\t\t\toffset,\n\t\t\tenabled: draggable,\n\t\t\tsnapToEdge,\n\t\t\tinitialPosition,\n\t\t\tonPositionChange,\n\t\t});\n\n\tconst handleBallClick = useCallback(() => {\n\t\t// The click that ends a drag gesture must not toggle the panel.\n\t\tif (shouldIgnoreClick()) {\n\t\t\treturn;\n\t\t}\n\t\tsetOpen(!isOpen);\n\t}, [isOpen, setOpen, shouldIgnoreClick]);\n\n\t// Escape closes the panel.\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [isOpen, setOpen]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen || !closeOnClickOutside) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst handlePointerDown = (event: PointerEvent) => {\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (panelRef.current?.contains(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (target.closest(`[${COPILOT_BALL_ATTRIBUTE}]`)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetOpen(false);\n\t\t};\n\t\tdocument.addEventListener('pointerdown', handlePointerDown);\n\t\treturn () => document.removeEventListener('pointerdown', handlePointerDown);\n\t}, [closeOnClickOutside, isOpen, setOpen]);\n\n\tconst placement = getCopilotPanelPlacement({\n\t\tballPosition: position,\n\t\tballSize,\n\t\tpanelWidth,\n\t\tpanelHeight,\n\t\tgap: panelGap,\n\t\tviewport,\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t{isOpen && (\n\t\t\t\t<PanelPositioner\n\t\t\t\t\tref={panelRef}\n\t\t\t\t\t$left={placement.left}\n\t\t\t\t\t$top={placement.top}\n\t\t\t\t\t$width={placement.width}\n\t\t\t\t\t$height={placement.height}\n\t\t\t\t\t$zIndex={zIndex}\n\t\t\t\t>\n\t\t\t\t\t<CopilotPanel\n\t\t\t\t\t\tmessages={messages}\n\t\t\t\t\t\tonSend={onSendMessage}\n\t\t\t\t\t\tonClose={() => setOpen(false)}\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\tbadge={badge}\n\t\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\t\tavatar={avatar}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tdisclaimer={disclaimer}\n\t\t\t\t\t\temptyStateTitle={emptyStateTitle}\n\t\t\t\t\t\temptyStateSubtitle={emptyStateSubtitle}\n\t\t\t\t\t\tsuggestions={suggestions}\n\t\t\t\t\t\tonSuggestionClick={onSuggestionClick}\n\t\t\t\t\t\tshowRefresh={showRefresh}\n\t\t\t\t\t\tonRefresh={onRefresh}\n\t\t\t\t\t\tisThinking={isThinking}\n\t\t\t\t\t\tthinkingLabel={thinkingLabel}\n\t\t\t\t\t\tisStreaming={isStreaming}\n\t\t\t\t\t\tonStop={onStop}\n\t\t\t\t\t\tinterruptedLabel={interruptedLabel}\n\t\t\t\t\t\tfollowUpsLabel={followUpsLabel}\n\t\t\t\t\t\thasMoreHistory={hasMoreHistory}\n\t\t\t\t\t\tisLoadingHistory={isLoadingHistory}\n\t\t\t\t\t\tonLoadOlderMessages={onLoadOlderMessages}\n\t\t\t\t\t\thistoryLoadingLabel={historyLoadingLabel}\n\t\t\t\t\t\tinputDisabled={inputDisabled}\n\t\t\t\t\t\terrorMessage={errorMessage}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t/>\n\t\t\t\t</PanelPositioner>\n\t\t\t)}\n\n\t\t\t<CopilotBall\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tonToggle={handleBallClick}\n\t\t\t\tposition={position}\n\t\t\t\tsize={ballSize}\n\t\t\t\tisDragging={isDragging}\n\t\t\t\tdraggable={draggable}\n\t\t\t\tcolor={ballColor}\n\t\t\t\tzIndex={zIndex + 1}\n\t\t\t\ticon={ballIcon}\n\t\t\t\topenIcon={ballOpenIcon}\n\t\t\t\tariaLabel={ballAriaLabel}\n\t\t\t\t{...dragHandlers}\n\t\t\t/>\n\t\t</>\n\t);\n};\n\nexport default ControlledCopilot;\n"],"names":["ControlledCopilot","messages","onSendMessage","isThinking","thinkingLabel","isStreaming","onStop","interruptedLabel","followUpsLabel","hasMoreHistory","isLoadingHistory","onLoadOlderMessages","historyLoadingLabel","errorMessage","ballSize","corner","offset","initialPosition","draggable","snapToEdge","onPositionChange","ballIcon","ballOpenIcon","ballColor","COLORS","zIndex","ballAriaLabel","panelWidth","panelHeight","panelGap","title","badge","subtitle","avatar","placeholder","disclaimer","emptyStateTitle","emptyStateSubtitle","suggestions","onSuggestionClick","showRefresh","onRefresh","inputDisabled","open","defaultOpen","onOpenChange","closeOnClickOutside","className","style","uncontrolledOpen","setUncontrolledOpen","useState","panelRef","useRef","isControlled","isOpen","setOpen","useCallback","next","position","isDragging","viewport","dragHandlers","shouldIgnoreClick","useDraggableFloater","handleBallClick","useEffect","handleKeyDown","event","handlePointerDown","target","COPILOT_BALL_ATTRIBUTE","placement","getCopilotPanelPlacement","jsxs","Fragment","jsx","PanelPositioner","CopilotPanel","CopilotBall"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import e from "styled-components";
|
|
2
|
+
const o = e.div`
|
|
3
|
+
position: fixed;
|
|
4
|
+
left: ${(t) => t.$left}px;
|
|
5
|
+
top: ${(t) => t.$top}px;
|
|
6
|
+
width: ${(t) => t.$width}px;
|
|
7
|
+
height: ${(t) => t.$height}px;
|
|
8
|
+
z-index: ${(t) => t.$zIndex};
|
|
9
|
+
display: flex;
|
|
10
|
+
animation: bikCopilotPanelIn 0.16s ease-out;
|
|
11
|
+
|
|
12
|
+
> * {
|
|
13
|
+
flex: 1;
|
|
14
|
+
min-width: 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@keyframes bikCopilotPanelIn {
|
|
18
|
+
from {
|
|
19
|
+
opacity: 0;
|
|
20
|
+
transform: translateY(6px) scale(0.98);
|
|
21
|
+
}
|
|
22
|
+
to {
|
|
23
|
+
opacity: 1;
|
|
24
|
+
transform: translateY(0) scale(1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
export {
|
|
29
|
+
o as PanelPositioner
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=ControlledCopilot.styled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlledCopilot.styled.js","sources":["../../../../src/components/bik-copilot/ControlledCopilot.styled.ts"],"sourcesContent":["import styled from 'styled-components';\n\nexport const PanelPositioner = styled.div<{\n\t$left: number;\n\t$top: number;\n\t$width: number;\n\t$height: number;\n\t$zIndex: number;\n}>`\n\tposition: fixed;\n\tleft: ${(props) => props.$left}px;\n\ttop: ${(props) => props.$top}px;\n\twidth: ${(props) => props.$width}px;\n\theight: ${(props) => props.$height}px;\n\tz-index: ${(props) => props.$zIndex};\n\tdisplay: flex;\n\tanimation: bikCopilotPanelIn 0.16s ease-out;\n\n\t> * {\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t@keyframes bikCopilotPanelIn {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(6px) scale(0.98);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0) scale(1);\n\t\t}\n\t}\n`;\n"],"names":["PanelPositioner","styled","props"],"mappings":";AAEO,MAAMA,IAAkBC,EAAO;AAAA;AAAA,SAQ7B,CAACC,MAAUA,EAAM,KAAK;AAAA,QACvB,CAACA,MAAUA,EAAM,IAAI;AAAA,UACnB,CAACA,MAAUA,EAAM,MAAM;AAAA,WACtB,CAACA,MAAUA,EAAM,OAAO;AAAA,YACvB,CAACA,MAAUA,EAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { CopilotBallProps } from './model';
|
|
3
|
+
/**
|
|
4
|
+
* Marks the ball in the DOM so an outside-click handler can tell the ball apart
|
|
5
|
+
* from the rest of the page and not fight the ball's own toggle.
|
|
6
|
+
*/
|
|
7
|
+
export declare const COPILOT_BALL_ATTRIBUTE = "data-bik-copilot-ball";
|
|
8
|
+
/**
|
|
9
|
+
* The floating ball that opens the copilot panel. Purely presentational — the
|
|
10
|
+
* drag gesture lives in `useDraggableFloater` and is passed in as handlers.
|
|
11
|
+
*/
|
|
12
|
+
export declare const CopilotBall: React.FC<CopilotBallProps>;
|
|
13
|
+
export default CopilotBall;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import b from "../../assets/icons/bik_ai_stars_icon.svg.js";
|
|
3
|
+
import s from "../../assets/icons/chevronDown.svg.js";
|
|
4
|
+
import { BallButton as x } from "./CopilotBall.styled.js";
|
|
5
|
+
const C = "data-bik-copilot-ball", w = ({
|
|
6
|
+
isOpen: t,
|
|
7
|
+
onToggle: n,
|
|
8
|
+
position: i,
|
|
9
|
+
size: a,
|
|
10
|
+
isDragging: e,
|
|
11
|
+
draggable: c,
|
|
12
|
+
color: d,
|
|
13
|
+
zIndex: g,
|
|
14
|
+
icon: h,
|
|
15
|
+
openIcon: m,
|
|
16
|
+
ariaLabel: p,
|
|
17
|
+
onPointerDown: $,
|
|
18
|
+
onPointerMove: f,
|
|
19
|
+
onPointerUp: u,
|
|
20
|
+
onPointerCancel: B
|
|
21
|
+
}) => {
|
|
22
|
+
const o = Math.round(a * 0.42), l = t ? /* @__PURE__ */ r(s, { width: o, height: o }) : /* @__PURE__ */ r(b, { width: o, height: o }), I = t ? m ?? l : h ?? l;
|
|
23
|
+
return /* @__PURE__ */ r(
|
|
24
|
+
x,
|
|
25
|
+
{
|
|
26
|
+
type: "button",
|
|
27
|
+
[C]: "true",
|
|
28
|
+
$size: a,
|
|
29
|
+
$left: i.x,
|
|
30
|
+
$top: i.y,
|
|
31
|
+
$color: d,
|
|
32
|
+
$zIndex: g,
|
|
33
|
+
$isDragging: e,
|
|
34
|
+
$draggable: c,
|
|
35
|
+
"aria-label": p || "Copilot",
|
|
36
|
+
"aria-expanded": t,
|
|
37
|
+
onClick: n,
|
|
38
|
+
onPointerDown: $,
|
|
39
|
+
onPointerMove: f,
|
|
40
|
+
onPointerUp: u,
|
|
41
|
+
onPointerCancel: B,
|
|
42
|
+
children: I
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
export {
|
|
47
|
+
C as COPILOT_BALL_ATTRIBUTE,
|
|
48
|
+
w as CopilotBall
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=CopilotBall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopilotBall.js","sources":["../../../../src/components/bik-copilot/CopilotBall.tsx"],"sourcesContent":["import AiStarsIcon from '@src/assets/icons/bik_ai_stars_icon.svg';\nimport ChevronDownIcon from '@src/assets/icons/chevronDown.svg';\nimport React from 'react';\nimport { BallButton } from './CopilotBall.styled';\nimport { CopilotBallProps } from './model';\n\n/**\n * Marks the ball in the DOM so an outside-click handler can tell the ball apart\n * from the rest of the page and not fight the ball's own toggle.\n */\nexport const COPILOT_BALL_ATTRIBUTE = 'data-bik-copilot-ball';\n\n/**\n * The floating ball that opens the copilot panel. Purely presentational — the\n * drag gesture lives in `useDraggableFloater` and is passed in as handlers.\n */\nexport const CopilotBall: React.FC<CopilotBallProps> = ({\n\tisOpen,\n\tonToggle,\n\tposition,\n\tsize,\n\tisDragging,\n\tdraggable,\n\tcolor,\n\tzIndex,\n\ticon,\n\topenIcon,\n\tariaLabel,\n\tonPointerDown,\n\tonPointerMove,\n\tonPointerUp,\n\tonPointerCancel,\n}) => {\n\tconst iconSize = Math.round(size * 0.42);\n\tconst defaultIcon = isOpen ? (\n\t\t<ChevronDownIcon width={iconSize} height={iconSize} />\n\t) : (\n\t\t<AiStarsIcon width={iconSize} height={iconSize} />\n\t);\n\tconst activeIcon = isOpen ? openIcon ?? defaultIcon : icon ?? defaultIcon;\n\n\treturn (\n\t\t<BallButton\n\t\t\ttype=\"button\"\n\t\t\t{...{ [COPILOT_BALL_ATTRIBUTE]: 'true' }}\n\t\t\t$size={size}\n\t\t\t$left={position.x}\n\t\t\t$top={position.y}\n\t\t\t$color={color}\n\t\t\t$zIndex={zIndex}\n\t\t\t$isDragging={isDragging}\n\t\t\t$draggable={draggable}\n\t\t\t/* A disclosure button keeps a stable name and reports its state through\n\t\t\t aria-expanded, so this must not become \"Open/Close copilot\" — that\n\t\t\t would also collide with the panel's own close button. */\n\t\t\taria-label={ariaLabel || 'Copilot'}\n\t\t\taria-expanded={isOpen}\n\t\t\tonClick={onToggle}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonPointerMove={onPointerMove}\n\t\t\tonPointerUp={onPointerUp}\n\t\t\tonPointerCancel={onPointerCancel}\n\t\t>\n\t\t\t{activeIcon}\n\t\t</BallButton>\n\t);\n};\n\nexport default CopilotBall;\n"],"names":["COPILOT_BALL_ATTRIBUTE","CopilotBall","isOpen","onToggle","position","size","isDragging","draggable","color","zIndex","icon","openIcon","ariaLabel","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","iconSize","defaultIcon","jsx","ChevronDownIcon","AiStarsIcon","activeIcon","BallButton"],"mappings":";;;;AAUO,MAAMA,IAAyB,yBAMzBC,IAA0C,CAAC;AAAA,EACvD,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,iBAAAC;AACD,MAAM;AACL,QAAMC,IAAW,KAAK,MAAMZ,IAAO,IAAI,GACjCa,IAAchB,IACnB,gBAAAiB,EAACC,GAAA,EAAgB,OAAOH,GAAU,QAAQA,EAAA,CAAU,IAEpD,gBAAAE,EAACE,GAAA,EAAY,OAAOJ,GAAU,QAAQA,GAAU,GAE3CK,IAAapB,IAASS,KAAYO,IAAcR,KAAQQ;AAE9D,SACC,gBAAAC;AAAA,IAACI;AAAA,IAAA;AAAA,MACA,MAAK;AAAA,MACC,CAACvB,CAAsB,GAAG;AAAA,MAChC,OAAOK;AAAA,MACP,OAAOD,EAAS;AAAA,MAChB,MAAMA,EAAS;AAAA,MACf,QAAQI;AAAA,MACR,SAASC;AAAA,MACT,aAAaH;AAAA,MACb,YAAYC;AAAA,MAIZ,cAAYK,KAAa;AAAA,MACzB,iBAAeV;AAAA,MACf,SAASC;AAAA,MACT,eAAAU;AAAA,MACA,eAAAC;AAAA,MACA,aAAAC;AAAA,MACA,iBAAAC;AAAA,MAEC,UAAAM;AAAA,IAAA;AAAA,EAAA;AAGJ;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import s from "styled-components";
|
|
2
|
+
const t = s.button`
|
|
3
|
+
position: fixed;
|
|
4
|
+
left: ${(e) => e.$left}px;
|
|
5
|
+
top: ${(e) => e.$top}px;
|
|
6
|
+
width: ${(e) => e.$size}px;
|
|
7
|
+
height: ${(e) => e.$size}px;
|
|
8
|
+
z-index: ${(e) => e.$zIndex};
|
|
9
|
+
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
justify-content: center;
|
|
13
|
+
padding: 0;
|
|
14
|
+
border: none;
|
|
15
|
+
border-radius: 50%;
|
|
16
|
+
background: ${(e) => e.$color};
|
|
17
|
+
color: #ffffff;
|
|
18
|
+
box-shadow: ${(e) => e.$isDragging ? "0 12px 32px rgba(40, 3, 78, 0.36)" : "0 6px 20px rgba(40, 3, 78, 0.24)"};
|
|
19
|
+
|
|
20
|
+
cursor: ${(e) => e.$isDragging ? "grabbing" : e.$draggable ? "grab" : "pointer"};
|
|
21
|
+
touch-action: none;
|
|
22
|
+
user-select: none;
|
|
23
|
+
-webkit-user-select: none;
|
|
24
|
+
|
|
25
|
+
/* Position changes animate on release but must track the pointer 1:1 while
|
|
26
|
+
the user is dragging. */
|
|
27
|
+
transition: ${(e) => e.$isDragging ? "box-shadow 0.15s ease, transform 0.15s ease" : "left 0.22s ease, top 0.22s ease, box-shadow 0.15s ease, transform 0.15s ease"};
|
|
28
|
+
transform: ${(e) => e.$isDragging ? "scale(1.06)" : "scale(1)"};
|
|
29
|
+
|
|
30
|
+
&:hover {
|
|
31
|
+
transform: scale(1.06);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
&:focus-visible {
|
|
35
|
+
outline: 2px solid #ffffff;
|
|
36
|
+
outline-offset: 2px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
svg {
|
|
40
|
+
pointer-events: none;
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
export {
|
|
44
|
+
t as BallButton
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=CopilotBall.styled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopilotBall.styled.js","sources":["../../../../src/components/bik-copilot/CopilotBall.styled.ts"],"sourcesContent":["import styled from 'styled-components';\n\nexport const BallButton = styled.button<{\n\t$size: number;\n\t$left: number;\n\t$top: number;\n\t$color: string;\n\t$zIndex: number;\n\t$isDragging: boolean;\n\t$draggable: boolean;\n}>`\n\tposition: fixed;\n\tleft: ${(props) => props.$left}px;\n\ttop: ${(props) => props.$top}px;\n\twidth: ${(props) => props.$size}px;\n\theight: ${(props) => props.$size}px;\n\tz-index: ${(props) => props.$zIndex};\n\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: 50%;\n\tbackground: ${(props) => props.$color};\n\tcolor: #ffffff;\n\tbox-shadow: ${(props) =>\n\t\tprops.$isDragging\n\t\t\t? '0 12px 32px rgba(40, 3, 78, 0.36)'\n\t\t\t: '0 6px 20px rgba(40, 3, 78, 0.24)'};\n\n\tcursor: ${(props) =>\n\t\tprops.$isDragging ? 'grabbing' : props.$draggable ? 'grab' : 'pointer'};\n\ttouch-action: none;\n\tuser-select: none;\n\t-webkit-user-select: none;\n\n\t/* Position changes animate on release but must track the pointer 1:1 while\n\t the user is dragging. */\n\ttransition: ${(props) =>\n\t\tprops.$isDragging\n\t\t\t? 'box-shadow 0.15s ease, transform 0.15s ease'\n\t\t\t: 'left 0.22s ease, top 0.22s ease, box-shadow 0.15s ease, transform 0.15s ease'};\n\ttransform: ${(props) => (props.$isDragging ? 'scale(1.06)' : 'scale(1)')};\n\n\t&:hover {\n\t\ttransform: scale(1.06);\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid #ffffff;\n\t\toutline-offset: 2px;\n\t}\n\n\tsvg {\n\t\tpointer-events: none;\n\t}\n`;\n"],"names":["BallButton","styled","props"],"mappings":";AAEO,MAAMA,IAAaC,EAAO;AAAA;AAAA,SAUxB,CAACC,MAAUA,EAAM,KAAK;AAAA,QACvB,CAACA,MAAUA,EAAM,IAAI;AAAA,UACnB,CAACA,MAAUA,EAAM,KAAK;AAAA,WACrB,CAACA,MAAUA,EAAM,KAAK;AAAA,YACrB,CAACA,MAAUA,EAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQrB,CAACA,MAAUA,EAAM,MAAM;AAAA;AAAA,eAEvB,CAACA,MACdA,EAAM,cACH,sCACA,kCAAkC;AAAA;AAAA,WAE5B,CAACA,MACVA,EAAM,cAAc,aAAaA,EAAM,aAAa,SAAS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOzD,CAACA,MACdA,EAAM,cACH,gDACA,8EAA8E;AAAA,cACrE,CAACA,MAAWA,EAAM,cAAc,gBAAgB,UAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { CopilotPanelProps } from './model';
|
|
3
|
+
/**
|
|
4
|
+
* Chat panel used by the copilot. Fully presentational: it renders the
|
|
5
|
+
* transcript it is given and reports user intent through callbacks, so it works
|
|
6
|
+
* against any backend.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CopilotPanel: React.FC<CopilotPanelProps>;
|
|
9
|
+
export default CopilotPanel;
|