@copilotkit/react-ui 0.13.0-alpha.3 → 0.13.0-alpha.4
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/.turbo/turbo-build.log +98 -94
- package/CHANGELOG.md +11 -0
- package/dist/chunk-2KAF7NKC.mjs +484 -0
- package/dist/chunk-2KAF7NKC.mjs.map +1 -0
- package/dist/chunk-44FWXZNS.mjs +66 -0
- package/dist/chunk-44FWXZNS.mjs.map +1 -0
- package/dist/chunk-44PMTS4V.mjs +42 -0
- package/dist/chunk-44PMTS4V.mjs.map +1 -0
- package/dist/chunk-5KEDV5VC.mjs +27 -0
- package/dist/chunk-5KEDV5VC.mjs.map +1 -0
- package/dist/chunk-7AMJNPKO.mjs +129 -0
- package/dist/chunk-7AMJNPKO.mjs.map +1 -0
- package/dist/chunk-7NSRDJ5C.mjs +3 -0
- package/dist/chunk-7NSRDJ5C.mjs.map +1 -0
- package/dist/chunk-AHAVF76D.mjs +39 -0
- package/dist/chunk-AHAVF76D.mjs.map +1 -0
- package/dist/chunk-GCOPYGHH.mjs +27 -0
- package/dist/chunk-GCOPYGHH.mjs.map +1 -0
- package/dist/chunk-H4VKQGVU.mjs +3 -0
- package/dist/chunk-H4VKQGVU.mjs.map +1 -0
- package/dist/chunk-IJLMKBSZ.mjs +25 -0
- package/dist/chunk-IJLMKBSZ.mjs.map +1 -0
- package/dist/chunk-IU3WTXLQ.mjs +3 -0
- package/dist/chunk-IU3WTXLQ.mjs.map +1 -0
- package/dist/chunk-L3OH4SEP.mjs +52 -0
- package/dist/chunk-L3OH4SEP.mjs.map +1 -0
- package/dist/chunk-LSHMHHRZ.mjs +34 -0
- package/dist/chunk-LSHMHHRZ.mjs.map +1 -0
- package/dist/chunk-M3CZWJI3.mjs +44 -0
- package/dist/chunk-M3CZWJI3.mjs.map +1 -0
- package/dist/chunk-MC6KTH4X.mjs +12 -0
- package/dist/chunk-MC6KTH4X.mjs.map +1 -0
- package/dist/chunk-MRXNTQOX.mjs +55 -0
- package/dist/chunk-MRXNTQOX.mjs.map +1 -0
- package/dist/chunk-OHWEJUCS.mjs +18 -0
- package/dist/chunk-OHWEJUCS.mjs.map +1 -0
- package/dist/chunk-OXCGWFXC.mjs +52 -0
- package/dist/chunk-OXCGWFXC.mjs.map +1 -0
- package/dist/chunk-POVINPXX.mjs +26 -0
- package/dist/chunk-POVINPXX.mjs.map +1 -0
- package/dist/chunk-Q6YO7LDK.mjs +40 -0
- package/dist/chunk-Q6YO7LDK.mjs.map +1 -0
- package/dist/chunk-QXW3Q7JE.mjs +18 -0
- package/dist/chunk-QXW3Q7JE.mjs.map +1 -0
- package/dist/chunk-SRBUGQTM.mjs +109 -0
- package/dist/chunk-SRBUGQTM.mjs.map +1 -0
- package/dist/chunk-T3T3C3EH.mjs +72 -0
- package/dist/chunk-T3T3C3EH.mjs.map +1 -0
- package/dist/chunk-TEYIQHMK.mjs +12 -0
- package/dist/chunk-TEYIQHMK.mjs.map +1 -0
- package/dist/chunk-U6NJWGTV.mjs +3 -0
- package/dist/chunk-U6NJWGTV.mjs.map +1 -0
- package/dist/chunk-VGX2W5ZB.mjs +28 -0
- package/dist/chunk-VGX2W5ZB.mjs.map +1 -0
- package/dist/chunk-Z4FKMKAJ.mjs +72 -0
- package/dist/chunk-Z4FKMKAJ.mjs.map +1 -0
- package/dist/chunk-ZYC5YVDO.mjs +21 -0
- package/dist/chunk-ZYC5YVDO.mjs.map +1 -0
- package/dist/components/chat-components/chat-list.mjs +12 -440
- package/dist/components/chat-components/chat-list.mjs.map +1 -1
- package/dist/components/chat-components/chat-message-actions.mjs +7 -168
- package/dist/components/chat-components/chat-message-actions.mjs.map +1 -1
- package/dist/components/chat-components/chat-message.mjs +10 -403
- package/dist/components/chat-components/chat-message.mjs.map +1 -1
- package/dist/components/chat-components/chat-panel.mjs +9 -300
- package/dist/components/chat-components/chat-panel.mjs.map +1 -1
- package/dist/components/chat-components/chat-scroll-anchor.mjs +4 -44
- package/dist/components/chat-components/chat-scroll-anchor.mjs.map +1 -1
- package/dist/components/chat-components/clear-history.mjs +25 -249
- package/dist/components/chat-components/clear-history.mjs.map +1 -1
- package/dist/components/chat-components/copilot-chat.mjs +21 -808
- package/dist/components/chat-components/copilot-chat.mjs.map +1 -1
- package/dist/components/chat-components/default-empty-screen.mjs +7 -175
- package/dist/components/chat-components/default-empty-screen.mjs.map +1 -1
- package/dist/components/chat-components/external-link.mjs +3 -25
- package/dist/components/chat-components/external-link.mjs.map +1 -1
- package/dist/components/chat-components/markdown.mjs +3 -10
- package/dist/components/chat-components/markdown.mjs.map +1 -1
- package/dist/components/chat-components/prompt-form.mjs +8 -227
- package/dist/components/chat-components/prompt-form.mjs.map +1 -1
- package/dist/components/chat-components/theme-toggle.mjs +14 -130
- package/dist/components/chat-components/theme-toggle.mjs.map +1 -1
- package/dist/components/chat-components/toaster.mjs +3 -7
- package/dist/components/chat-components/toaster.mjs.map +1 -1
- package/dist/components/chat-components/ui/alert-dialog.mjs +5 -199
- package/dist/components/chat-components/ui/alert-dialog.mjs.map +1 -1
- package/dist/components/chat-components/ui/badge.mjs +7 -49
- package/dist/components/chat-components/ui/badge.mjs.map +1 -1
- package/dist/components/chat-components/ui/button.mjs +4 -85
- package/dist/components/chat-components/ui/button.mjs.map +1 -1
- package/dist/components/chat-components/ui/codeblock.mjs +7 -283
- package/dist/components/chat-components/ui/codeblock.mjs.map +1 -1
- package/dist/components/chat-components/ui/dialog.mjs +25 -93
- package/dist/components/chat-components/ui/dialog.mjs.map +1 -1
- package/dist/components/chat-components/ui/dropdown-menu.mjs +8 -61
- package/dist/components/chat-components/ui/dropdown-menu.mjs.map +1 -1
- package/dist/components/chat-components/ui/icons.mjs +4 -554
- package/dist/components/chat-components/ui/icons.mjs.map +1 -1
- package/dist/components/chat-components/ui/input.mjs +7 -48
- package/dist/components/chat-components/ui/input.mjs.map +1 -1
- package/dist/components/chat-components/ui/label.mjs +9 -51
- package/dist/components/chat-components/ui/label.mjs.map +1 -1
- package/dist/components/chat-components/ui/select.mjs +23 -106
- package/dist/components/chat-components/ui/select.mjs.map +1 -1
- package/dist/components/chat-components/ui/separator.mjs +4 -68
- package/dist/components/chat-components/ui/separator.mjs.map +1 -1
- package/dist/components/chat-components/ui/sheet.mjs +23 -92
- package/dist/components/chat-components/ui/sheet.mjs.map +1 -1
- package/dist/components/chat-components/ui/switch.mjs +8 -53
- package/dist/components/chat-components/ui/switch.mjs.map +1 -1
- package/dist/components/chat-components/ui/textarea.mjs +7 -48
- package/dist/components/chat-components/ui/textarea.mjs.map +1 -1
- package/dist/components/chat-components/ui/tooltip.mjs +4 -72
- package/dist/components/chat-components/ui/tooltip.mjs.map +1 -1
- package/dist/components/index.mjs +25 -924
- package/dist/components/index.mjs.map +1 -1
- package/dist/components/sidebar/copilot-sidebar-ui-provider.mjs +24 -919
- package/dist/components/sidebar/copilot-sidebar-ui-provider.mjs.map +1 -1
- package/dist/components/sidebar/copilot-sidebar.mjs +22 -841
- package/dist/components/sidebar/copilot-sidebar.mjs.map +1 -1
- package/dist/components/sidebar/sidebar-context.mjs +3 -10
- package/dist/components/sidebar/sidebar-context.mjs.map +1 -1
- package/dist/context/index.mjs +2 -0
- package/dist/context/index.mjs.map +1 -1
- package/dist/hooks/index.mjs +2 -0
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/hooks/use-at-bottom.mjs +3 -19
- package/dist/hooks/use-at-bottom.mjs.map +1 -1
- package/dist/hooks/use-copy-to-clipboard.mjs +3 -26
- package/dist/hooks/use-copy-to-clipboard.mjs.map +1 -1
- package/dist/hooks/use-enter-submit.mjs +3 -16
- package/dist/hooks/use-enter-submit.mjs.map +1 -1
- package/dist/index.mjs +28 -924
- package/dist/index.mjs.map +1 -1
- package/dist/lib/utils.mjs +3 -62
- package/dist/lib/utils.mjs.map +1 -1
- package/dist/lib/utils.test.mjs +1 -0
- package/dist/lib/utils.test.mjs.map +1 -1
- package/dist/types/index.mjs +2 -0
- package/dist/types/index.mjs.map +1 -1
- package/dist/types/types.mjs +2 -0
- package/dist/types/types.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { PromptForm } from './chunk-Z4FKMKAJ.mjs';
|
|
2
|
+
import { Button } from './chunk-M3CZWJI3.mjs';
|
|
3
|
+
import { IconStop, IconRefresh } from './chunk-2KAF7NKC.mjs';
|
|
4
|
+
import { __async } from './chunk-MRXNTQOX.mjs';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function ChatPanel({
|
|
8
|
+
id,
|
|
9
|
+
isLoading,
|
|
10
|
+
stop,
|
|
11
|
+
append,
|
|
12
|
+
reload,
|
|
13
|
+
input,
|
|
14
|
+
setInput,
|
|
15
|
+
messages
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ jsx(
|
|
18
|
+
"div",
|
|
19
|
+
{
|
|
20
|
+
className: "inset-x-0 bottom-0 bg-gradient-to-b from-muted/10 from-10% to-muted/30 to-50% mt-4 mb-8",
|
|
21
|
+
style: { width: "100%", overflow: "hidden", boxSizing: "border-box" },
|
|
22
|
+
children: /* @__PURE__ */ jsxs("div", { className: "mx-auto sm:max-w-2xl sm:px-4", children: [
|
|
23
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-10 items-center justify-center mb-4", children: isLoading ? /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => stop(), className: "bg-background", children: [
|
|
24
|
+
/* @__PURE__ */ jsx(IconStop, { className: "mr-2" }),
|
|
25
|
+
"Stop generating"
|
|
26
|
+
] }) : (messages == null ? void 0 : messages.length) > 0 && /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => reload(), className: "bg-background", children: [
|
|
27
|
+
/* @__PURE__ */ jsx(IconRefresh, { className: "mr-2" }),
|
|
28
|
+
"Regenerate response"
|
|
29
|
+
] }) }),
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4 border-2 bg-background px-4 py-2 shadow-lg sm:rounded-xl md:py-4", children: /* @__PURE__ */ jsx(
|
|
31
|
+
PromptForm,
|
|
32
|
+
{
|
|
33
|
+
onSubmit: (value) => __async(this, null, function* () {
|
|
34
|
+
yield append({
|
|
35
|
+
id,
|
|
36
|
+
content: value,
|
|
37
|
+
role: "user"
|
|
38
|
+
});
|
|
39
|
+
}),
|
|
40
|
+
input,
|
|
41
|
+
setInput,
|
|
42
|
+
isLoading
|
|
43
|
+
}
|
|
44
|
+
) })
|
|
45
|
+
] })
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { ChatPanel };
|
|
51
|
+
//# sourceMappingURL=out.js.map
|
|
52
|
+
//# sourceMappingURL=chunk-OXCGWFXC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chat-components/chat-panel.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgCY,SACE,KADF;AAlBL,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,QAAQ,UAAU,UAAU,WAAW,aAAa;AAAA,MAEpE,+BAAC,SAAI,WAAU,gCACb;AAAA,4BAAC,SAAI,WAAU,8CACZ,sBACC,qBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,KAAK,GAAG,WAAU,iBACzD;AAAA,8BAAC,YAAS,WAAU,QAAO;AAAA,UAAE;AAAA,WAE/B,KAEA,qCAAU,UAAS,KACjB,qBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,OAAO,GAAG,WAAU,iBAC3D;AAAA,8BAAC,eAAY,WAAU,QAAO;AAAA,UAAE;AAAA,WAElC,GAGN;AAAA,QACA,oBAAC,SAAI,WAAU,8EACb;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,CAAO,UAAU;AACzB,oBAAM,OAAO;AAAA,gBACX;AAAA,gBACA,SAAS;AAAA,gBACT,MAAM;AAAA,cACR,CAAC;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF,GACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ","sourcesContent":["import { type UseChatHelpers } from \"ai/react\";\n\nimport { Button } from \"./ui/button\";\nimport { PromptForm } from \"./prompt-form\";\nimport { IconRefresh, IconStop } from \"./ui/icons\";\n\nexport interface ChatPanelProps\n extends Pick<\n UseChatHelpers,\n \"append\" | \"isLoading\" | \"reload\" | \"messages\" | \"stop\" | \"input\" | \"setInput\"\n > {\n id?: string;\n}\n\nexport function ChatPanel({\n id,\n isLoading,\n stop,\n append,\n reload,\n input,\n setInput,\n messages,\n}: ChatPanelProps) {\n return (\n <div\n className=\"inset-x-0 bottom-0 bg-gradient-to-b from-muted/10 from-10% to-muted/30 to-50% mt-4 mb-8\"\n style={{ width: \"100%\", overflow: \"hidden\", boxSizing: \"border-box\" }}\n >\n <div className=\"mx-auto sm:max-w-2xl sm:px-4\">\n <div className=\"flex h-10 items-center justify-center mb-4\">\n {isLoading ? (\n <Button variant=\"outline\" onClick={() => stop()} className=\"bg-background\">\n <IconStop className=\"mr-2\" />\n Stop generating\n </Button>\n ) : (\n messages?.length > 0 && (\n <Button variant=\"outline\" onClick={() => reload()} className=\"bg-background\">\n <IconRefresh className=\"mr-2\" />\n Regenerate response\n </Button>\n )\n )}\n </div>\n <div className=\"space-y-4 border-2 bg-background px-4 py-2 shadow-lg sm:rounded-xl md:py-4\">\n <PromptForm\n onSubmit={async (value) => {\n await append({\n id,\n content: value,\n role: \"user\",\n });\n }}\n input={input}\n setInput={setInput}\n isLoading={isLoading}\n />\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/use-copy-to-clipboard.tsx
|
|
4
|
+
function useCopyToClipboard({ timeout = 2e3 }) {
|
|
5
|
+
const [isCopied, setIsCopied] = React.useState(false);
|
|
6
|
+
const copyToClipboard = (value) => {
|
|
7
|
+
var _a;
|
|
8
|
+
if (typeof window === "undefined" || !((_a = navigator.clipboard) == null ? void 0 : _a.writeText)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!value) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
navigator.clipboard.writeText(value).then(() => {
|
|
15
|
+
setIsCopied(true);
|
|
16
|
+
setTimeout(() => {
|
|
17
|
+
setIsCopied(false);
|
|
18
|
+
}, timeout);
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
return { isCopied, copyToClipboard };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { useCopyToClipboard };
|
|
25
|
+
//# sourceMappingURL=out.js.map
|
|
26
|
+
//# sourceMappingURL=chunk-POVINPXX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-copy-to-clipboard.tsx"],"names":[],"mappings":";AAEA,YAAY,WAAW;AAMhB,SAAS,mBAAmB,EAAE,UAAU,IAAK,GAA4B;AAC9E,QAAM,CAAC,UAAU,WAAW,IAAU,eAAkB,KAAK;AAE7D,QAAM,kBAAkB,CAAC,UAAkB;AAX7C;AAYI,QAAI,OAAO,WAAW,eAAe,GAAC,eAAU,cAAV,mBAAqB,YAAW;AACpE;AAAA,IACF;AAEA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,cAAU,UAAU,UAAU,KAAK,EAAE,KAAK,MAAM;AAC9C,kBAAY,IAAI;AAEhB,iBAAW,MAAM;AACf,oBAAY,KAAK;AAAA,MACnB,GAAG,OAAO;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,gBAAgB;AACrC","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nexport interface useCopyToClipboardProps {\n timeout?: number;\n}\n\nexport function useCopyToClipboard({ timeout = 2000 }: useCopyToClipboardProps) {\n const [isCopied, setIsCopied] = React.useState<Boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (typeof window === \"undefined\" || !navigator.clipboard?.writeText) {\n return;\n }\n\n if (!value) {\n return;\n }\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n\n setTimeout(() => {\n setIsCopied(false);\n }, timeout);\n });\n };\n\n return { isCopied, copyToClipboard };\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { __async } from './chunk-MRXNTQOX.mjs';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { customAlphabet } from 'nanoid';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
|
|
6
|
+
function cn(...inputs) {
|
|
7
|
+
return twMerge(clsx(inputs));
|
|
8
|
+
}
|
|
9
|
+
var nanoid = customAlphabet(
|
|
10
|
+
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
|
11
|
+
7
|
|
12
|
+
);
|
|
13
|
+
function fetcher(input, init) {
|
|
14
|
+
return __async(this, null, function* () {
|
|
15
|
+
const res = yield fetch(input, init);
|
|
16
|
+
if (!res.ok) {
|
|
17
|
+
const json = yield res.json();
|
|
18
|
+
if (json.error) {
|
|
19
|
+
const error = new Error(json.error);
|
|
20
|
+
error.status = res.status;
|
|
21
|
+
throw error;
|
|
22
|
+
} else {
|
|
23
|
+
throw new Error("An unexpected error occurred");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return res.json();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function formatDate(input) {
|
|
30
|
+
const date = new Date(input);
|
|
31
|
+
return date.toLocaleDateString("en-US", {
|
|
32
|
+
month: "long",
|
|
33
|
+
day: "numeric",
|
|
34
|
+
year: "numeric"
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { cn, fetcher, formatDate, nanoid };
|
|
39
|
+
//# sourceMappingURL=out.js.map
|
|
40
|
+
//# sourceMappingURL=chunk-Q6YO7LDK.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":";;;;;AAAA,SAAS,YAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;AAEO,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AACF;AAEA,SAAsB,QAAoB,OAAoB,MAAmC;AAAA;AAC/F,UAAM,MAAM,MAAM,MAAM,OAAO,IAAI;AAEnC,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAI,KAAK,OAAO;AACd,cAAM,QAAQ,IAAI,MAAM,KAAK,KAAK;AAGlC,cAAM,SAAS,IAAI;AACnB,cAAM;AAAA,MACR,OAAO;AACL,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,IACF;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAEO,SAAS,WAAW,OAAuC;AAChE,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC;AACH","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { customAlphabet } from \"nanoid\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport const nanoid = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n); // 7-character random string\n\nexport async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {\n const res = await fetch(input, init);\n\n if (!res.ok) {\n const json = await res.json();\n if (json.error) {\n const error = new Error(json.error) as Error & {\n status: number;\n };\n error.status = res.status;\n throw error;\n } else {\n throw new Error(\"An unexpected error occurred\");\n }\n }\n\n return res.json();\n}\n\nexport function formatDate(input: string | number | Date): string {\n const date = new Date(input);\n return date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Separator } from './chunk-GCOPYGHH.mjs';
|
|
2
|
+
import { ChatMessage } from './chunk-44FWXZNS.mjs';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function ChatList({ messages }) {
|
|
6
|
+
const displayedMessages = messages.filter((message) => message.role !== "system");
|
|
7
|
+
if (!displayedMessages.length) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
return /* @__PURE__ */ jsx("div", { className: "relative mx-auto max-w-2xl px-0", children: displayedMessages.map((message, index) => /* @__PURE__ */ jsxs("div", { children: [
|
|
11
|
+
/* @__PURE__ */ jsx(ChatMessage, { message }),
|
|
12
|
+
index < displayedMessages.length - 1 && /* @__PURE__ */ jsx(Separator, { className: "my-4 md:my-4" })
|
|
13
|
+
] }, index)) });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { ChatList };
|
|
17
|
+
//# sourceMappingURL=out.js.map
|
|
18
|
+
//# sourceMappingURL=chunk-QXW3Q7JE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chat-components/chat-list.tsx"],"names":[],"mappings":";;;;;;;;AAoBQ,SACE,KADF;AAXD,SAAS,SAAS,EAAE,SAAS,GAAa;AAE/C,QAAM,oBAAoB,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ;AAEhF,MAAI,CAAC,kBAAkB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,SAAI,WAAU,mCACZ,4BAAkB,IAAI,CAAC,SAAS,UAC/B,qBAAC,SACC;AAAA,wBAAC,eAAY,SAAkB;AAAA,IAC9B,QAAQ,kBAAkB,SAAS,KAAK,oBAAC,aAAU,WAAU,gBAAe;AAAA,OAFrE,KAGV,CACD,GACH;AAEJ","sourcesContent":["import { type Message } from \"ai\";\n\nimport { Separator } from \"./ui/separator\";\nimport { ChatMessage } from \"./chat-message\";\n\nexport interface ChatList {\n messages: Message[];\n}\n\nexport function ChatList({ messages }: ChatList) {\n // we don't want to display system messages\n const displayedMessages = messages.filter((message) => message.role !== \"system\");\n\n if (!displayedMessages.length) {\n return null;\n }\n\n return (\n <div className=\"relative mx-auto max-w-2xl px-0\">\n {displayedMessages.map((message, index) => (\n <div key={index}>\n <ChatMessage message={message} />\n {index < displayedMessages.length - 1 && <Separator className=\"my-4 md:my-4\" />}\n </div>\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { buttonVariants } from './chunk-M3CZWJI3.mjs';
|
|
2
|
+
import { cn } from './chunk-Q6YO7LDK.mjs';
|
|
3
|
+
import { __objRest, __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var AlertDialog = AlertDialogPrimitive.Root;
|
|
9
|
+
var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
|
|
10
|
+
var AlertDialogPortal = (_a) => {
|
|
11
|
+
var _b = _a, {
|
|
12
|
+
className,
|
|
13
|
+
children
|
|
14
|
+
} = _b, props = __objRest(_b, [
|
|
15
|
+
"className",
|
|
16
|
+
"children"
|
|
17
|
+
]);
|
|
18
|
+
return /* @__PURE__ */ jsx(AlertDialogPrimitive.Portal, __spreadProps(__spreadValues({ className: cn(className) }, props), { children: /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-50 flex items-end justify-center sm:items-center", children }) }));
|
|
19
|
+
};
|
|
20
|
+
AlertDialogPortal.displayName = AlertDialogPrimitive.Portal.displayName;
|
|
21
|
+
var AlertDialogOverlay = React.forwardRef((_a, ref) => {
|
|
22
|
+
var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
AlertDialogPrimitive.Overlay,
|
|
25
|
+
__spreadProps(__spreadValues({
|
|
26
|
+
className: cn(
|
|
27
|
+
"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm transition-opacity animate-in fade-in",
|
|
28
|
+
className
|
|
29
|
+
)
|
|
30
|
+
}, props), {
|
|
31
|
+
ref
|
|
32
|
+
})
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
|
|
36
|
+
var AlertDialogContent = React.forwardRef((_a, ref) => {
|
|
37
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
38
|
+
return /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
|
|
39
|
+
/* @__PURE__ */ jsx(AlertDialogOverlay, {}),
|
|
40
|
+
/* @__PURE__ */ jsx(
|
|
41
|
+
AlertDialogPrimitive.Content,
|
|
42
|
+
__spreadValues({
|
|
43
|
+
ref,
|
|
44
|
+
className: cn(
|
|
45
|
+
"fixed z-50 grid w-full max-w-lg scale-100 gap-4 border bg-background p-6 opacity-100 shadow-lg animate-in fade-in-90 slide-in-from-bottom-10 sm:rounded-lg sm:zoom-in-90 sm:slide-in-from-bottom-0 md:w-full",
|
|
46
|
+
className
|
|
47
|
+
)
|
|
48
|
+
}, props)
|
|
49
|
+
)
|
|
50
|
+
] });
|
|
51
|
+
});
|
|
52
|
+
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
|
|
53
|
+
var AlertDialogHeader = (_a) => {
|
|
54
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
55
|
+
return /* @__PURE__ */ jsx("div", __spreadValues({ className: cn("flex flex-col space-y-2 text-center sm:text-left", className) }, props));
|
|
56
|
+
};
|
|
57
|
+
AlertDialogHeader.displayName = "AlertDialogHeader";
|
|
58
|
+
var AlertDialogFooter = (_a) => {
|
|
59
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
60
|
+
return /* @__PURE__ */ jsx(
|
|
61
|
+
"div",
|
|
62
|
+
__spreadValues({
|
|
63
|
+
className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)
|
|
64
|
+
}, props)
|
|
65
|
+
);
|
|
66
|
+
};
|
|
67
|
+
AlertDialogFooter.displayName = "AlertDialogFooter";
|
|
68
|
+
var AlertDialogTitle = React.forwardRef((_a, ref) => {
|
|
69
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
71
|
+
AlertDialogPrimitive.Title,
|
|
72
|
+
__spreadValues({
|
|
73
|
+
ref,
|
|
74
|
+
className: cn("text-lg font-semibold", className)
|
|
75
|
+
}, props)
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
|
|
79
|
+
var AlertDialogDescription = React.forwardRef((_a, ref) => {
|
|
80
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
81
|
+
return /* @__PURE__ */ jsx(
|
|
82
|
+
AlertDialogPrimitive.Description,
|
|
83
|
+
__spreadValues({
|
|
84
|
+
ref,
|
|
85
|
+
className: cn("text-sm text-muted-foreground", className)
|
|
86
|
+
}, props)
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
|
|
90
|
+
var AlertDialogAction = React.forwardRef((_a, ref) => {
|
|
91
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
92
|
+
return /* @__PURE__ */ jsx(AlertDialogPrimitive.Action, __spreadValues({ ref, className: cn(buttonVariants(), className) }, props));
|
|
93
|
+
});
|
|
94
|
+
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
|
|
95
|
+
var AlertDialogCancel = React.forwardRef((_a, ref) => {
|
|
96
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
97
|
+
return /* @__PURE__ */ jsx(
|
|
98
|
+
AlertDialogPrimitive.Cancel,
|
|
99
|
+
__spreadValues({
|
|
100
|
+
ref,
|
|
101
|
+
className: cn(buttonVariants({ variant: "outline" }), "mt-2 sm:mt-0", className)
|
|
102
|
+
}, props)
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
|
|
106
|
+
|
|
107
|
+
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger };
|
|
108
|
+
//# sourceMappingURL=out.js.map
|
|
109
|
+
//# sourceMappingURL=chunk-SRBUGQTM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chat-components/ui/alert-dialog.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { buttonVariants } from \"./button\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nconst AlertDialogPortal = ({\n className,\n children,\n ...props\n}: AlertDialogPrimitive.AlertDialogPortalProps) => (\n <AlertDialogPrimitive.Portal className={cn(className)} {...props}>\n <div className=\"fixed inset-0 z-50 flex items-end justify-center sm:items-center\">\n {children}\n </div>\n </AlertDialogPrimitive.Portal>\n);\nAlertDialogPortal.displayName = AlertDialogPrimitive.Portal.displayName;\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, children, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-background/80 backdrop-blur-sm transition-opacity animate-in fade-in\",\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed z-50 grid w-full max-w-lg scale-100 gap-4 border bg-background p-6 opacity-100 shadow-lg animate-in fade-in-90 slide-in-from-bottom-10 sm:rounded-lg sm:zoom-in-90 sm:slide-in-from-bottom-0 md:w-full\",\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-2 text-center sm:text-left\", className)} {...props} />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(buttonVariants({ variant: \"outline\" }), \"mt-2 sm:mt-0\", className)}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { CopilotSidebar } from './chunk-AHAVF76D.mjs';
|
|
2
|
+
import { CopilotSidebarContext } from './chunk-MC6KTH4X.mjs';
|
|
3
|
+
import { TooltipProvider } from './chunk-VGX2W5ZB.mjs';
|
|
4
|
+
import { useState, useCallback } from 'react';
|
|
5
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function CopilotSidebarUIProvider({ children }) {
|
|
8
|
+
const [sidebarOpen, setSidebarOpen] = useState(true);
|
|
9
|
+
const toggleSidebar = useCallback(() => {
|
|
10
|
+
setSidebarOpen((prev) => !prev);
|
|
11
|
+
}, []);
|
|
12
|
+
return /* @__PURE__ */ jsx(CopilotSidebarContext.Provider, { value: { isSidebarOpen: sidebarOpen, toggleSidebar }, children: /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
|
|
13
|
+
"div",
|
|
14
|
+
{
|
|
15
|
+
style: {
|
|
16
|
+
height: "100vh",
|
|
17
|
+
width: "100vw",
|
|
18
|
+
position: "relative"
|
|
19
|
+
},
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ jsx(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
style: {
|
|
25
|
+
overflowY: "auto",
|
|
26
|
+
overflowX: "hidden",
|
|
27
|
+
height: "100%",
|
|
28
|
+
width: sidebarOpen ? "calc(100% - 450px)" : "100%",
|
|
29
|
+
position: "absolute",
|
|
30
|
+
transition: "width 0.5s ease-in-out"
|
|
31
|
+
// New
|
|
32
|
+
},
|
|
33
|
+
children: /* @__PURE__ */ jsx("main", { children })
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
style: {
|
|
40
|
+
overflowY: "auto",
|
|
41
|
+
height: "100%",
|
|
42
|
+
width: "450px",
|
|
43
|
+
position: "absolute",
|
|
44
|
+
right: sidebarOpen ? "0" : "-450px",
|
|
45
|
+
transition: "right 0.5s ease-in-out"
|
|
46
|
+
},
|
|
47
|
+
children: /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(CopilotSidebar, { setSidebarOpen }) })
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
!sidebarOpen && /* @__PURE__ */ jsx(
|
|
51
|
+
"button",
|
|
52
|
+
{
|
|
53
|
+
onClick: toggleSidebar,
|
|
54
|
+
style: {
|
|
55
|
+
position: "absolute",
|
|
56
|
+
top: "5%",
|
|
57
|
+
right: "20px",
|
|
58
|
+
transform: "translateY(-50%)",
|
|
59
|
+
transition: "opacity 0.5s ease-in-out"
|
|
60
|
+
},
|
|
61
|
+
className: "bg-slate-100 ring-2 ring-slate-600 font-semibold text-black p-2 rounded-lg shadow-lg",
|
|
62
|
+
children: "Open Copilot"
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
) }) });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { CopilotSidebarUIProvider };
|
|
71
|
+
//# sourceMappingURL=out.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-T3T3C3EH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/sidebar/copilot-sidebar-ui-provider.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,SAA2B,mBAAmB;AAC9C,SAAS,gBAAgB;AAkBnB,mBAkBM,KAjBJ,YADF;AATC,SAAS,yBAAyB,EAAE,SAAS,GAAkC;AACpF,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,IAAI;AAEnD,QAAM,gBAAgB,YAAY,MAAM;AACtC,mBAAe,CAAC,SAAS,CAAC,IAAI;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,SACE,oBAAC,sBAAsB,UAAtB,EAA+B,OAAO,EAAE,eAAe,aAAa,cAAc,GACjF,0CACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,OAAO,cAAc,uBAAuB;AAAA,cAC5C,UAAU;AAAA,cACV,YAAY;AAAA;AAAA,YACd;AAAA,YAEA,8BAAC,UAAM,UAAS;AAAA;AAAA,QAClB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,UAAU;AAAA,cACV,OAAO,cAAc,MAAM;AAAA,cAC3B,YAAY;AAAA,YACd;AAAA,YAEA,8BAAC,mBACC,8BAAC,kBAAe,gBAAgC,GAClD;AAAA;AAAA,QACF;AAAA,QACC,CAAC,eACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO;AAAA,cACL,UAAU;AAAA,cACV,KAAK;AAAA,cACL,OAAO;AAAA,cACP,WAAW;AAAA,cACX,YAAY;AAAA,YACd;AAAA,YACA,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ,GACF,GACF;AAEJ","sourcesContent":["import React, { ReactNode, useCallback } from \"react\";\nimport { useState } from \"react\";\nimport { CopilotSidebar } from \"./copilot-sidebar\";\nimport { CopilotSidebarContext } from \"./sidebar-context\";\nimport { TooltipProvider } from \"../chat-components/ui/tooltip\";\n\nexport interface CopilotSidebarUIProviderProps {\n children: ReactNode;\n}\n\nexport function CopilotSidebarUIProvider({ children }: CopilotSidebarUIProviderProps) {\n const [sidebarOpen, setSidebarOpen] = useState(true);\n\n const toggleSidebar = useCallback(() => {\n setSidebarOpen((prev) => !prev);\n }, []);\n\n return (\n <CopilotSidebarContext.Provider value={{ isSidebarOpen: sidebarOpen, toggleSidebar }}>\n <>\n <div\n style={{\n height: \"100vh\",\n width: \"100vw\",\n position: \"relative\",\n }}\n >\n <div\n style={{\n overflowY: \"auto\",\n overflowX: \"hidden\",\n height: \"100%\",\n width: sidebarOpen ? \"calc(100% - 450px)\" : \"100%\",\n position: \"absolute\",\n transition: \"width 0.5s ease-in-out\", // New\n }}\n >\n <main>{children}</main>\n </div>\n <div\n style={{\n overflowY: \"auto\",\n height: \"100%\",\n width: \"450px\",\n position: \"absolute\",\n right: sidebarOpen ? \"0\" : \"-450px\",\n transition: \"right 0.5s ease-in-out\",\n }}\n >\n <TooltipProvider>\n <CopilotSidebar setSidebarOpen={setSidebarOpen} />\n </TooltipProvider>\n </div>\n {!sidebarOpen && (\n <button\n onClick={toggleSidebar}\n style={{\n position: \"absolute\",\n top: \"5%\",\n right: \"20px\",\n transform: \"translateY(-50%)\",\n transition: \"opacity 0.5s ease-in-out\",\n }}\n className=\"bg-slate-100 ring-2 ring-slate-600 font-semibold text-black p-2 rounded-lg shadow-lg\"\n >\n Open Copilot\n </button>\n )}\n </div>\n </>\n </CopilotSidebarContext.Provider>\n );\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { memo } from 'react';
|
|
2
|
+
import ReactMarkdown from 'react-markdown';
|
|
3
|
+
|
|
4
|
+
// src/components/chat-components/markdown.tsx
|
|
5
|
+
var MemoizedReactMarkdown = memo(
|
|
6
|
+
ReactMarkdown,
|
|
7
|
+
(prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
export { MemoizedReactMarkdown };
|
|
11
|
+
//# sourceMappingURL=out.js.map
|
|
12
|
+
//# sourceMappingURL=chunk-TEYIQHMK.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chat-components/markdown.tsx"],"names":[],"mappings":";AAAA,SAAa,YAAY;AACzB,OAAO,mBAAgC;AAEhC,IAAM,wBAAqC;AAAA,EAChD;AAAA,EACA,CAAC,WAAW,cACV,UAAU,aAAa,UAAU,YAAY,UAAU,cAAc,UAAU;AACnF","sourcesContent":["import { FC, memo } from \"react\";\nimport ReactMarkdown, { Options } from \"react-markdown\";\n\nexport const MemoizedReactMarkdown: FC<Options> = memo(\n ReactMarkdown,\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children && prevProps.className === nextProps.className,\n);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { cn } from './chunk-Q6YO7LDK.mjs';
|
|
2
|
+
import { __objRest, __spreadValues } from './chunk-MRXNTQOX.mjs';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var TooltipProvider = TooltipPrimitive.Provider;
|
|
8
|
+
var Tooltip = TooltipPrimitive.Root;
|
|
9
|
+
var TooltipTrigger = TooltipPrimitive.Trigger;
|
|
10
|
+
var TooltipContent = React.forwardRef((_a, ref) => {
|
|
11
|
+
var _b = _a, { className, sideOffset = 4 } = _b, props = __objRest(_b, ["className", "sideOffset"]);
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
TooltipPrimitive.Content,
|
|
14
|
+
__spreadValues({
|
|
15
|
+
ref,
|
|
16
|
+
sideOffset,
|
|
17
|
+
className: cn(
|
|
18
|
+
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs font-medium text-popover-foreground shadow-md animate-in fade-in-50 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1",
|
|
19
|
+
className
|
|
20
|
+
)
|
|
21
|
+
}, props)
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
25
|
+
|
|
26
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
|
27
|
+
//# sourceMappingURL=out.js.map
|
|
28
|
+
//# sourceMappingURL=chunk-VGX2W5ZB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chat-components/ui/tooltip.tsx"],"names":[],"mappings":";;;;;;;;;AAEA,YAAY,WAAW;AACvB,YAAY,sBAAsB;AAchC;AAVF,IAAM,kBAAmC;AAEzC,IAAM,UAA2B;AAEjC,IAAM,iBAAkC;AAExC,IAAM,iBAAuB,iBAG3B,CAAC,IAAyC,QAAK;AAA9C,eAAE,aAAW,aAAa,EAhB7B,IAgBG,IAAgC,kBAAhC,IAAgC,CAA9B,aAAW;AACd;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,OACI;AAAA,EACN;AAAA,CACD;AACD,eAAe,cAA+B,yBAAQ","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\nimport { cn } from \"../../../lib/utils\";\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs font-medium text-popover-foreground shadow-md animate-in fade-in-50 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1\",\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Tooltip, TooltipTrigger, TooltipContent } from './chunk-VGX2W5ZB.mjs';
|
|
2
|
+
import { useEnterSubmit } from './chunk-OHWEJUCS.mjs';
|
|
3
|
+
import { Button } from './chunk-M3CZWJI3.mjs';
|
|
4
|
+
import { IconArrowElbow } from './chunk-2KAF7NKC.mjs';
|
|
5
|
+
import { __async } from './chunk-MRXNTQOX.mjs';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import TextareaAutosize from 'react-textarea-autosize';
|
|
8
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
function PromptForm({ onSubmit, input, setInput, isLoading }) {
|
|
11
|
+
const { formRef, onKeyDown } = useEnterSubmit();
|
|
12
|
+
const inputRef = React.useRef(null);
|
|
13
|
+
React.useEffect(() => {
|
|
14
|
+
if (inputRef.current) {
|
|
15
|
+
inputRef.current.focus();
|
|
16
|
+
}
|
|
17
|
+
}, []);
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
"form",
|
|
20
|
+
{
|
|
21
|
+
onSubmit: (e) => __async(this, null, function* () {
|
|
22
|
+
e.preventDefault();
|
|
23
|
+
if (!(input == null ? void 0 : input.trim())) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
setInput("");
|
|
27
|
+
yield onSubmit(input);
|
|
28
|
+
}),
|
|
29
|
+
ref: formRef,
|
|
30
|
+
children: /* @__PURE__ */ jsxs("div", { className: "relative flex max-h-60 w-full grow flex-col overflow-hidden bg-background px-8 sm:rounded-md border sm:px-12", children: [
|
|
31
|
+
/* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
32
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true }),
|
|
33
|
+
/* @__PURE__ */ jsx(TooltipContent, { children: "New Chat" })
|
|
34
|
+
] }),
|
|
35
|
+
/* @__PURE__ */ jsx(
|
|
36
|
+
TextareaAutosize,
|
|
37
|
+
{
|
|
38
|
+
ref: inputRef,
|
|
39
|
+
tabIndex: 0,
|
|
40
|
+
onKeyDown,
|
|
41
|
+
rows: 1,
|
|
42
|
+
value: input,
|
|
43
|
+
onChange: (e) => setInput(e.target.value),
|
|
44
|
+
placeholder: "Send a message.",
|
|
45
|
+
spellCheck: false,
|
|
46
|
+
className: "min-h-[60px] w-full resize-none bg-transparent px-4 py-[1.3rem] focus-within:outline-none sm:text-sm"
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
/* @__PURE__ */ jsx("div", { className: "absolute right-0 top-4 sm:right-4", children: /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
50
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
51
|
+
Button,
|
|
52
|
+
{
|
|
53
|
+
type: "submit",
|
|
54
|
+
size: "icon",
|
|
55
|
+
disabled: isLoading || input === "",
|
|
56
|
+
className: " bg-slate-300",
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ jsx(IconArrowElbow, {}),
|
|
59
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Send message" })
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
) }),
|
|
63
|
+
/* @__PURE__ */ jsx(TooltipContent, { children: "Send message" })
|
|
64
|
+
] }) })
|
|
65
|
+
] })
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { PromptForm };
|
|
71
|
+
//# sourceMappingURL=out.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-Z4FKMKAJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/chat-components/prompt-form.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,YAAY,WAAW;AACvB,OAAO,sBAAsB;AAsCrB,SACE,KADF;AAvBD,SAAS,WAAW,EAAE,UAAU,OAAO,UAAU,UAAU,GAAgB;AAChF,QAAM,EAAE,SAAS,UAAU,IAAI,eAAe;AAC9C,QAAM,WAAiB,aAA4B,IAAI;AAEvD,EAAM,gBAAU,MAAM;AACpB,QAAI,SAAS,SAAS;AACpB,eAAS,QAAQ,MAAM;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAO,MAAM;AACrB,UAAE,eAAe;AACjB,YAAI,EAAC,+BAAO,SAAQ;AAClB;AAAA,QACF;AACA,iBAAS,EAAE;AACX,cAAM,SAAS,KAAK;AAAA,MACtB;AAAA,MACA,KAAK;AAAA,MAEL,+BAAC,SAAI,WAAU,gHACb;AAAA,6BAAC,WACC;AAAA,8BAAC,kBAAe,SAAO,MAWvB;AAAA,UACA,oBAAC,kBAAe,sBAAQ;AAAA,WAC1B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,UAAU;AAAA,YACV;AAAA,YACA,MAAM;AAAA,YACN,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,aAAY;AAAA,YACZ,YAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,oBAAC,SAAI,WAAU,qCACb,+BAAC,WACC;AAAA,8BAAC,kBAAe,SAAO,MACrB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,UAAU,aAAa,UAAU;AAAA,cACjC,WAAU;AAAA,cAEV;AAAA,oCAAC,kBAAe;AAAA,gBAChB,oBAAC,UAAK,WAAU,WAAU,0BAAY;AAAA;AAAA;AAAA,UACxC,GACF;AAAA,UACA,oBAAC,kBAAe,0BAAY;AAAA,WAC9B,GACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ","sourcesContent":["import * as React from \"react\";\nimport TextareaAutosize from \"react-textarea-autosize\";\nimport { UseChatHelpers } from \"ai/react\";\n\nimport { useEnterSubmit } from \"../../hooks/use-enter-submit\";\nimport { cn } from \"../../lib/utils\";\nimport { Button, buttonVariants } from \"./ui/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\nimport { IconArrowElbow, IconPlus } from \"./ui/icons\";\n// import Link from \"next/link\";\n\nexport interface PromptProps extends Pick<UseChatHelpers, \"input\" | \"setInput\"> {\n onSubmit: (value: string) => Promise<void>;\n isLoading: boolean;\n}\n\nexport function PromptForm({ onSubmit, input, setInput, isLoading }: PromptProps) {\n const { formRef, onKeyDown } = useEnterSubmit();\n const inputRef = React.useRef<HTMLTextAreaElement>(null);\n\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n\n return (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n if (!input?.trim()) {\n return;\n }\n setInput(\"\");\n await onSubmit(input);\n }}\n ref={formRef}\n >\n <div className=\"relative flex max-h-60 w-full grow flex-col overflow-hidden bg-background px-8 sm:rounded-md border sm:px-12\">\n <Tooltip>\n <TooltipTrigger asChild>\n {/* <Link\n href=\"/\"\n className={cn(\n buttonVariants({ size: \"sm\", variant: \"outline\" }),\n \"absolute left-0 top-4 h-8 w-8 rounded-full bg-background p-0 sm:left-4\"\n )}\n >\n <IconPlus />\n <span className=\"sr-only\">New Chat</span>\n </Link> */}\n </TooltipTrigger>\n <TooltipContent>New Chat</TooltipContent>\n </Tooltip>\n <TextareaAutosize\n ref={inputRef}\n tabIndex={0}\n onKeyDown={onKeyDown}\n rows={1}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Send a message.\"\n spellCheck={false}\n className=\"min-h-[60px] w-full resize-none bg-transparent px-4 py-[1.3rem] focus-within:outline-none sm:text-sm\"\n />\n <div className=\"absolute right-0 top-4 sm:right-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={isLoading || input === \"\"}\n className=\" bg-slate-300\"\n >\n <IconArrowElbow />\n <span className=\"sr-only\">Send message</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent>Send message</TooltipContent>\n </Tooltip>\n </div>\n </div>\n </form>\n );\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/use-at-bottom.tsx
|
|
4
|
+
function useAtBottom(offset = 0) {
|
|
5
|
+
const [isAtBottom, setIsAtBottom] = React.useState(false);
|
|
6
|
+
React.useEffect(() => {
|
|
7
|
+
const handleScroll = () => {
|
|
8
|
+
setIsAtBottom(window.innerHeight + window.scrollY >= document.body.offsetHeight - offset);
|
|
9
|
+
};
|
|
10
|
+
window.addEventListener("scroll", handleScroll, { passive: true });
|
|
11
|
+
handleScroll();
|
|
12
|
+
return () => {
|
|
13
|
+
window.removeEventListener("scroll", handleScroll);
|
|
14
|
+
};
|
|
15
|
+
}, [offset]);
|
|
16
|
+
return isAtBottom;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { useAtBottom };
|
|
20
|
+
//# sourceMappingURL=out.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-ZYC5YVDO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-at-bottom.tsx"],"names":[],"mappings":";AAAA,YAAY,WAAW;AAEhB,SAAS,YAAY,SAAS,GAAG;AACtC,QAAM,CAAC,YAAY,aAAa,IAAU,eAAS,KAAK;AAExD,EAAM,gBAAU,MAAM;AACpB,UAAM,eAAe,MAAM;AACzB,oBAAc,OAAO,cAAc,OAAO,WAAW,SAAS,KAAK,eAAe,MAAM;AAAA,IAC1F;AAEA,WAAO,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;AACjE,iBAAa;AAEb,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,YAAY;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT","sourcesContent":["import * as React from \"react\";\n\nexport function useAtBottom(offset = 0) {\n const [isAtBottom, setIsAtBottom] = React.useState(false);\n\n React.useEffect(() => {\n const handleScroll = () => {\n setIsAtBottom(window.innerHeight + window.scrollY >= document.body.offsetHeight - offset);\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n handleScroll();\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n };\n }, [offset]);\n\n return isAtBottom;\n}\n"]}
|