@copilotkit/react-ui 0.12.0 → 0.13.0-alpha.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.
Files changed (148) hide show
  1. package/.turbo/turbo-build.log +216 -197
  2. package/CHANGELOG.md +11 -0
  3. package/dist/components/chat-components/chat-list.mjs +440 -12
  4. package/dist/components/chat-components/chat-list.mjs.map +1 -1
  5. package/dist/components/chat-components/chat-message-actions.mjs +168 -7
  6. package/dist/components/chat-components/chat-message-actions.mjs.map +1 -1
  7. package/dist/components/chat-components/chat-message.mjs +403 -10
  8. package/dist/components/chat-components/chat-message.mjs.map +1 -1
  9. package/dist/components/chat-components/chat-panel.mjs +300 -9
  10. package/dist/components/chat-components/chat-panel.mjs.map +1 -1
  11. package/dist/components/chat-components/chat-scroll-anchor.mjs +44 -4
  12. package/dist/components/chat-components/chat-scroll-anchor.mjs.map +1 -1
  13. package/dist/components/chat-components/clear-history.mjs +273 -74
  14. package/dist/components/chat-components/clear-history.mjs.map +1 -1
  15. package/dist/components/chat-components/copilot-chat.mjs +808 -21
  16. package/dist/components/chat-components/copilot-chat.mjs.map +1 -1
  17. package/dist/components/chat-components/default-empty-screen.mjs +175 -7
  18. package/dist/components/chat-components/default-empty-screen.mjs.map +1 -1
  19. package/dist/components/chat-components/external-link.mjs +25 -3
  20. package/dist/components/chat-components/external-link.mjs.map +1 -1
  21. package/dist/components/chat-components/markdown.mjs +10 -3
  22. package/dist/components/chat-components/markdown.mjs.map +1 -1
  23. package/dist/components/chat-components/prompt-form.mjs +227 -8
  24. package/dist/components/chat-components/prompt-form.mjs.map +1 -1
  25. package/dist/components/chat-components/theme-toggle.mjs +143 -31
  26. package/dist/components/chat-components/theme-toggle.mjs.map +1 -1
  27. package/dist/components/chat-components/toaster.mjs +7 -3
  28. package/dist/components/chat-components/toaster.mjs.map +1 -1
  29. package/dist/components/chat-components/ui/alert-dialog.mjs +199 -5
  30. package/dist/components/chat-components/ui/alert-dialog.mjs.map +1 -1
  31. package/dist/components/chat-components/ui/badge.d.ts +1 -1
  32. package/dist/components/chat-components/ui/badge.mjs +50 -10
  33. package/dist/components/chat-components/ui/badge.mjs.map +1 -1
  34. package/dist/components/chat-components/ui/button.mjs +85 -4
  35. package/dist/components/chat-components/ui/button.mjs.map +1 -1
  36. package/dist/components/chat-components/ui/codeblock.mjs +283 -7
  37. package/dist/components/chat-components/ui/codeblock.mjs.map +1 -1
  38. package/dist/components/chat-components/ui/dialog.mjs +125 -59
  39. package/dist/components/chat-components/ui/dialog.mjs.map +1 -1
  40. package/dist/components/chat-components/ui/dropdown-menu.mjs +102 -38
  41. package/dist/components/chat-components/ui/dropdown-menu.mjs.map +1 -1
  42. package/dist/components/chat-components/ui/icons.mjs +554 -4
  43. package/dist/components/chat-components/ui/icons.mjs.map +1 -1
  44. package/dist/components/chat-components/ui/input.mjs +59 -15
  45. package/dist/components/chat-components/ui/input.mjs.map +1 -1
  46. package/dist/components/chat-components/ui/label.mjs +52 -13
  47. package/dist/components/chat-components/ui/label.mjs.map +1 -1
  48. package/dist/components/chat-components/ui/select.mjs +156 -71
  49. package/dist/components/chat-components/ui/select.mjs.map +1 -1
  50. package/dist/components/chat-components/ui/separator.mjs +68 -4
  51. package/dist/components/chat-components/ui/separator.mjs.map +1 -1
  52. package/dist/components/chat-components/ui/sheet.mjs +124 -54
  53. package/dist/components/chat-components/ui/sheet.mjs.map +1 -1
  54. package/dist/components/chat-components/ui/switch.mjs +69 -18
  55. package/dist/components/chat-components/ui/switch.mjs.map +1 -1
  56. package/dist/components/chat-components/ui/textarea.mjs +58 -14
  57. package/dist/components/chat-components/ui/textarea.mjs.map +1 -1
  58. package/dist/components/chat-components/ui/tooltip.mjs +72 -4
  59. package/dist/components/chat-components/ui/tooltip.mjs.map +1 -1
  60. package/dist/components/index.mjs +924 -25
  61. package/dist/components/index.mjs.map +1 -1
  62. package/dist/components/sidebar/copilot-sidebar-ui-provider.mjs +919 -24
  63. package/dist/components/sidebar/copilot-sidebar-ui-provider.mjs.map +1 -1
  64. package/dist/components/sidebar/copilot-sidebar.mjs +841 -22
  65. package/dist/components/sidebar/copilot-sidebar.mjs.map +1 -1
  66. package/dist/components/sidebar/sidebar-context.mjs +10 -3
  67. package/dist/components/sidebar/sidebar-context.mjs.map +1 -1
  68. package/dist/context/index.d.ts +1 -0
  69. package/dist/context/index.mjs +0 -2
  70. package/dist/context/index.mjs.map +1 -1
  71. package/dist/hooks/index.d.ts +1 -0
  72. package/dist/hooks/index.mjs +0 -2
  73. package/dist/hooks/index.mjs.map +1 -1
  74. package/dist/hooks/use-at-bottom.mjs +19 -3
  75. package/dist/hooks/use-at-bottom.mjs.map +1 -1
  76. package/dist/hooks/use-copy-to-clipboard.mjs +26 -3
  77. package/dist/hooks/use-copy-to-clipboard.mjs.map +1 -1
  78. package/dist/hooks/use-enter-submit.mjs +16 -3
  79. package/dist/hooks/use-enter-submit.mjs.map +1 -1
  80. package/dist/index.mjs +924 -28
  81. package/dist/index.mjs.map +1 -1
  82. package/dist/lib/utils.mjs +62 -3
  83. package/dist/lib/utils.mjs.map +1 -1
  84. package/dist/lib/utils.test.d.ts +1 -0
  85. package/dist/lib/utils.test.mjs +0 -1
  86. package/dist/lib/utils.test.mjs.map +1 -1
  87. package/dist/types/index.d.ts +1 -0
  88. package/dist/types/index.mjs +0 -2
  89. package/dist/types/index.mjs.map +1 -1
  90. package/dist/types/types.mjs +0 -2
  91. package/dist/types/types.mjs.map +1 -1
  92. package/package.json +7 -7
  93. package/dist/chunk-34MTYKUD.mjs +0 -473
  94. package/dist/chunk-34MTYKUD.mjs.map +0 -1
  95. package/dist/chunk-4ENGXGIC.mjs +0 -85
  96. package/dist/chunk-4ENGXGIC.mjs.map +0 -1
  97. package/dist/chunk-5HCN6SPC.mjs +0 -47
  98. package/dist/chunk-5HCN6SPC.mjs.map +0 -1
  99. package/dist/chunk-6RG3YDAC.mjs +0 -28
  100. package/dist/chunk-6RG3YDAC.mjs.map +0 -1
  101. package/dist/chunk-7NSRDJ5C.mjs +0 -3
  102. package/dist/chunk-7NSRDJ5C.mjs.map +0 -1
  103. package/dist/chunk-AYVNEHBC.mjs +0 -70
  104. package/dist/chunk-AYVNEHBC.mjs.map +0 -1
  105. package/dist/chunk-CRRPHVT3.mjs +0 -57
  106. package/dist/chunk-CRRPHVT3.mjs.map +0 -1
  107. package/dist/chunk-D72RVITD.mjs +0 -30
  108. package/dist/chunk-D72RVITD.mjs.map +0 -1
  109. package/dist/chunk-ESP3H6NQ.mjs +0 -39
  110. package/dist/chunk-ESP3H6NQ.mjs.map +0 -1
  111. package/dist/chunk-EXOYIXGQ.mjs +0 -74
  112. package/dist/chunk-EXOYIXGQ.mjs.map +0 -1
  113. package/dist/chunk-GBPOPYU3.mjs +0 -27
  114. package/dist/chunk-GBPOPYU3.mjs.map +0 -1
  115. package/dist/chunk-GWX3NPF5.mjs +0 -48
  116. package/dist/chunk-GWX3NPF5.mjs.map +0 -1
  117. package/dist/chunk-H4VKQGVU.mjs +0 -3
  118. package/dist/chunk-H4VKQGVU.mjs.map +0 -1
  119. package/dist/chunk-HKSE5ISX.mjs +0 -105
  120. package/dist/chunk-HKSE5ISX.mjs.map +0 -1
  121. package/dist/chunk-IU3WTXLQ.mjs +0 -3
  122. package/dist/chunk-IU3WTXLQ.mjs.map +0 -1
  123. package/dist/chunk-MC6KTH4X.mjs +0 -12
  124. package/dist/chunk-MC6KTH4X.mjs.map +0 -1
  125. package/dist/chunk-MRXNTQOX.mjs +0 -55
  126. package/dist/chunk-MRXNTQOX.mjs.map +0 -1
  127. package/dist/chunk-OHWEJUCS.mjs +0 -18
  128. package/dist/chunk-OHWEJUCS.mjs.map +0 -1
  129. package/dist/chunk-PY4F436T.mjs +0 -25
  130. package/dist/chunk-PY4F436T.mjs.map +0 -1
  131. package/dist/chunk-Q6YO7LDK.mjs +0 -40
  132. package/dist/chunk-Q6YO7LDK.mjs.map +0 -1
  133. package/dist/chunk-TEYIQHMK.mjs +0 -12
  134. package/dist/chunk-TEYIQHMK.mjs.map +0 -1
  135. package/dist/chunk-U6NJWGTV.mjs +0 -3
  136. package/dist/chunk-U6NJWGTV.mjs.map +0 -1
  137. package/dist/chunk-VUNHHCOA.mjs +0 -24
  138. package/dist/chunk-VUNHHCOA.mjs.map +0 -1
  139. package/dist/chunk-XEVSX2QD.mjs +0 -137
  140. package/dist/chunk-XEVSX2QD.mjs.map +0 -1
  141. package/dist/chunk-XLGSWCCV.mjs +0 -75
  142. package/dist/chunk-XLGSWCCV.mjs.map +0 -1
  143. package/dist/chunk-ZA25IBKF.mjs +0 -69
  144. package/dist/chunk-ZA25IBKF.mjs.map +0 -1
  145. package/dist/chunk-ZLFSBGYI.mjs +0 -26
  146. package/dist/chunk-ZLFSBGYI.mjs.map +0 -1
  147. package/dist/chunk-ZYC5YVDO.mjs +0 -21
  148. package/dist/chunk-ZYC5YVDO.mjs.map +0 -1
@@ -1,12 +0,0 @@
1
- import { createContext } from 'react';
2
-
3
- // src/components/sidebar/sidebar-context.tsx
4
- var CopilotSidebarContext = createContext({
5
- isSidebarOpen: false,
6
- toggleSidebar: () => {
7
- }
8
- });
9
-
10
- export { CopilotSidebarContext };
11
- //# sourceMappingURL=out.js.map
12
- //# sourceMappingURL=chunk-MC6KTH4X.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/sidebar/sidebar-context.tsx"],"names":[],"mappings":";AAAA,SAAS,qBAAgC;AAOlC,IAAM,wBAAwB,cAAyC;AAAA,EAC5E,eAAe;AAAA,EACf,eAAe,MAAM;AAAA,EAAC;AACxB,CAAC","sourcesContent":["import { createContext, ReactNode } from \"react\";\n\nexport interface CopilotSidebarContextType {\n isSidebarOpen: boolean;\n toggleSidebar: () => void;\n}\n\nexport const CopilotSidebarContext = createContext<CopilotSidebarContextType>({\n isSidebarOpen: false,\n toggleSidebar: () => {},\n});\n"]}
@@ -1,55 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __spreadValues = (a, b) => {
9
- for (var prop in b || (b = {}))
10
- if (__hasOwnProp.call(b, prop))
11
- __defNormalProp(a, prop, b[prop]);
12
- if (__getOwnPropSymbols)
13
- for (var prop of __getOwnPropSymbols(b)) {
14
- if (__propIsEnum.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- }
17
- return a;
18
- };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
- var __objRest = (source, exclude) => {
21
- var target = {};
22
- for (var prop in source)
23
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
- target[prop] = source[prop];
25
- if (source != null && __getOwnPropSymbols)
26
- for (var prop of __getOwnPropSymbols(source)) {
27
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
- target[prop] = source[prop];
29
- }
30
- return target;
31
- };
32
- var __async = (__this, __arguments, generator) => {
33
- return new Promise((resolve, reject) => {
34
- var fulfilled = (value) => {
35
- try {
36
- step(generator.next(value));
37
- } catch (e) {
38
- reject(e);
39
- }
40
- };
41
- var rejected = (value) => {
42
- try {
43
- step(generator.throw(value));
44
- } catch (e) {
45
- reject(e);
46
- }
47
- };
48
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
49
- step((generator = generator.apply(__this, __arguments)).next());
50
- });
51
- };
52
-
53
- export { __async, __objRest, __spreadProps, __spreadValues };
54
- //# sourceMappingURL=out.js.map
55
- //# sourceMappingURL=chunk-MRXNTQOX.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
@@ -1,18 +0,0 @@
1
- import { useRef } from 'react';
2
-
3
- // src/hooks/use-enter-submit.tsx
4
- function useEnterSubmit() {
5
- const formRef = useRef(null);
6
- const handleKeyDown = (event) => {
7
- var _a;
8
- if (event.key === "Enter" && !event.shiftKey && !event.nativeEvent.isComposing) {
9
- (_a = formRef.current) == null ? void 0 : _a.requestSubmit();
10
- event.preventDefault();
11
- }
12
- };
13
- return { formRef, onKeyDown: handleKeyDown };
14
- }
15
-
16
- export { useEnterSubmit };
17
- //# sourceMappingURL=out.js.map
18
- //# sourceMappingURL=chunk-OHWEJUCS.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-enter-submit.tsx"],"names":[],"mappings":";AAAA,SAAS,cAA8B;AAEhC,SAAS,iBAGd;AACA,QAAM,UAAU,OAAwB,IAAI;AAE5C,QAAM,gBAAgB,CAAC,UAA0D;AARnF;AASI,QAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM,YAAY,aAAa;AAC9E,oBAAQ,YAAR,mBAAiB;AACjB,YAAM,eAAe;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,WAAW,cAAc;AAC7C","sourcesContent":["import { useRef, type RefObject } from \"react\";\n\nexport function useEnterSubmit(): {\n formRef: RefObject<HTMLFormElement>;\n onKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n} {\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>): void => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.nativeEvent.isComposing) {\n formRef.current?.requestSubmit();\n event.preventDefault();\n }\n };\n\n return { formRef, onKeyDown: handleKeyDown };\n}\n"]}
@@ -1,25 +0,0 @@
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(TooltipPrimitive.Content, __spreadValues({
13
- ref,
14
- sideOffset,
15
- className: cn(
16
- "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",
17
- className
18
- )
19
- }, props));
20
- });
21
- TooltipContent.displayName = TooltipPrimitive.Content.displayName;
22
-
23
- export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
24
- //# sourceMappingURL=out.js.map
25
- //# sourceMappingURL=chunk-PY4F436T.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/chat-components/ui/tooltip.tsx"],"names":[],"mappings":";;;;;;;;;AAEA,YAAY,WAAW;AACvB,YAAY,sBAAsB;AAchC;AAjBF;AAOA,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,6BAAkB,0BAAjB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,KACI,MACN;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"]}
@@ -1,40 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,12 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=out.js.map
3
- //# sourceMappingURL=chunk-U6NJWGTV.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":""}
@@ -1,24 +0,0 @@
1
- import { cn } from './chunk-Q6YO7LDK.mjs';
2
- import { __objRest, __spreadValues } from './chunk-MRXNTQOX.mjs';
3
- import * as React from 'react';
4
- import * as SeparatorPrimitive from '@radix-ui/react-separator';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- var Separator = React.forwardRef((_a, ref) => {
8
- var _b = _a, { className, orientation = "horizontal", decorative = true } = _b, props = __objRest(_b, ["className", "orientation", "decorative"]);
9
- return /* @__PURE__ */ jsx(SeparatorPrimitive.Root, __spreadValues({
10
- ref,
11
- decorative,
12
- orientation,
13
- className: cn(
14
- "shrink-0 bg-border",
15
- orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
16
- className
17
- )
18
- }, props));
19
- });
20
- Separator.displayName = SeparatorPrimitive.Root.displayName;
21
-
22
- export { Separator };
23
- //# sourceMappingURL=out.js.map
24
- //# sourceMappingURL=chunk-VUNHHCOA.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/chat-components/ui/separator.tsx"],"names":[],"mappings":";;;;;;;;;AAEA,YAAY,WAAW;AACvB,YAAY,wBAAwB;AAQlC;AAXF;AAOA,IAAM,YAAkB,iBAGtB,CAAC,IAAwE,QAAK;AAA7E,eAAE,aAAW,cAAc,cAAc,aAAa,KAVzD,IAUG,IAA+D,kBAA/D,IAA+D,CAA7D,aAAW,eAA4B;AAC1C,6BAAoB,yBAAnB;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,gBAAgB,eAAe,mBAAmB;AAAA,MAClD;AAAA,IACF;AAAA,KACI,MACN;AAAA,CACD;AACD,UAAU,cAAiC,wBAAK","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\n\nimport { cn } from \"../../../lib/utils\";\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = \"horizontal\", decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className,\n )}\n {...props}\n />\n));\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n"]}
@@ -1,137 +0,0 @@
1
- import { Button } from './chunk-5HCN6SPC.mjs';
2
- import { IconDownload, IconCheck, IconCopy } from './chunk-34MTYKUD.mjs';
3
- import { useCopyToClipboard } from './chunk-ZLFSBGYI.mjs';
4
- import { memo } from 'react';
5
- import { Prism } from 'react-syntax-highlighter';
6
- import { jsxs, jsx } from 'react/jsx-runtime';
7
-
8
- var programmingLanguages = {
9
- javascript: ".js",
10
- python: ".py",
11
- java: ".java",
12
- c: ".c",
13
- cpp: ".cpp",
14
- "c++": ".cpp",
15
- "c#": ".cs",
16
- ruby: ".rb",
17
- php: ".php",
18
- swift: ".swift",
19
- "objective-c": ".m",
20
- kotlin: ".kt",
21
- typescript: ".ts",
22
- go: ".go",
23
- perl: ".pl",
24
- rust: ".rs",
25
- scala: ".scala",
26
- haskell: ".hs",
27
- lua: ".lua",
28
- shell: ".sh",
29
- sql: ".sql",
30
- html: ".html",
31
- css: ".css"
32
- };
33
- var generateRandomString = (length, lowercase = false) => {
34
- const chars = "ABCDEFGHJKLMNPQRSTUVWXY3456789";
35
- let result = "";
36
- for (let i = 0; i < length; i++) {
37
- result += chars.charAt(Math.floor(Math.random() * chars.length));
38
- }
39
- return lowercase ? result.toLowerCase() : result;
40
- };
41
- var CodeBlock = memo(({ language, value }) => {
42
- const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2e3 });
43
- const downloadAsFile = () => {
44
- if (typeof window === "undefined") {
45
- return;
46
- }
47
- const fileExtension = programmingLanguages[language] || ".file";
48
- const suggestedFileName = `file-${generateRandomString(3, true)}${fileExtension}`;
49
- const fileName = window.prompt("Enter file name", suggestedFileName);
50
- if (!fileName) {
51
- return;
52
- }
53
- const blob = new Blob([value], { type: "text/plain" });
54
- const url = URL.createObjectURL(blob);
55
- const link = document.createElement("a");
56
- link.download = fileName;
57
- link.href = url;
58
- link.style.display = "none";
59
- document.body.appendChild(link);
60
- link.click();
61
- document.body.removeChild(link);
62
- URL.revokeObjectURL(url);
63
- };
64
- const onCopy = () => {
65
- if (isCopied)
66
- return;
67
- copyToClipboard(value);
68
- };
69
- return /* @__PURE__ */ jsxs("div", {
70
- className: "codeblock relative w-full bg-zinc-950 font-sans",
71
- children: [
72
- /* @__PURE__ */ jsxs("div", {
73
- className: "flex w-full items-center justify-between bg-zinc-800 px-6 py-2 pr-4 text-zinc-100",
74
- children: [
75
- /* @__PURE__ */ jsx("span", {
76
- className: "text-xs lowercase",
77
- children: language
78
- }),
79
- /* @__PURE__ */ jsxs("div", {
80
- className: "flex items-center space-x-1",
81
- children: [
82
- /* @__PURE__ */ jsxs(Button, {
83
- variant: "ghost",
84
- className: "hover:bg-zinc-800 focus-visible:ring-1 focus-visible:ring-slate-700 focus-visible:ring-offset-0",
85
- onClick: downloadAsFile,
86
- size: "icon",
87
- children: [
88
- /* @__PURE__ */ jsx(IconDownload, {}),
89
- /* @__PURE__ */ jsx("span", {
90
- className: "sr-only",
91
- children: "Download"
92
- })
93
- ]
94
- }),
95
- /* @__PURE__ */ jsxs(Button, {
96
- variant: "ghost",
97
- size: "icon",
98
- className: "text-xs hover:bg-zinc-800 focus-visible:ring-1 focus-visible:ring-slate-700 focus-visible:ring-offset-0",
99
- onClick: onCopy,
100
- children: [
101
- isCopied ? /* @__PURE__ */ jsx(IconCheck, {}) : /* @__PURE__ */ jsx(IconCopy, {}),
102
- /* @__PURE__ */ jsx("span", {
103
- className: "sr-only",
104
- children: "Copy code"
105
- })
106
- ]
107
- })
108
- ]
109
- })
110
- ]
111
- }),
112
- /* @__PURE__ */ jsx(Prism, {
113
- language,
114
- PreTag: "div",
115
- showLineNumbers: true,
116
- customStyle: {
117
- margin: 0,
118
- width: "100%",
119
- background: "transparent",
120
- padding: "1.5rem 1rem"
121
- },
122
- codeTagProps: {
123
- style: {
124
- fontSize: "0.9rem",
125
- fontFamily: "var(--font-mono)"
126
- }
127
- },
128
- children: value
129
- })
130
- ]
131
- });
132
- });
133
- CodeBlock.displayName = "CodeBlock";
134
-
135
- export { CodeBlock, generateRandomString, programmingLanguages };
136
- //# sourceMappingURL=out.js.map
137
- //# sourceMappingURL=chunk-XEVSX2QD.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/chat-components/ui/codeblock.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport { FC, memo } from \"react\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\n\nimport { useCopyToClipboard } from \"../../../hooks/use-copy-to-clipboard\";\nimport { IconCheck, IconCopy, IconDownload } from \"./icons\";\nimport { Button } from \"./button\";\n\ninterface Props {\n language: string;\n value: string;\n}\n\ninterface languageMap {\n [key: string]: string | undefined;\n}\n\nexport const programmingLanguages: languageMap = {\n javascript: \".js\",\n python: \".py\",\n java: \".java\",\n c: \".c\",\n cpp: \".cpp\",\n \"c++\": \".cpp\",\n \"c#\": \".cs\",\n ruby: \".rb\",\n php: \".php\",\n swift: \".swift\",\n \"objective-c\": \".m\",\n kotlin: \".kt\",\n typescript: \".ts\",\n go: \".go\",\n perl: \".pl\",\n rust: \".rs\",\n scala: \".scala\",\n haskell: \".hs\",\n lua: \".lua\",\n shell: \".sh\",\n sql: \".sql\",\n html: \".html\",\n css: \".css\",\n // add more file extensions here, make sure the key is same as language prop in CodeBlock.tsx component\n};\n\nexport const generateRandomString = (length: number, lowercase = false) => {\n const chars = \"ABCDEFGHJKLMNPQRSTUVWXY3456789\"; // excluding similar looking characters like Z, 2, I, 1, O, 0\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return lowercase ? result.toLowerCase() : result;\n};\n\nconst CodeBlock: FC<Props> = memo(({ language, value }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2000 });\n\n const downloadAsFile = () => {\n if (typeof window === \"undefined\") {\n return;\n }\n const fileExtension = programmingLanguages[language] || \".file\";\n const suggestedFileName = `file-${generateRandomString(3, true)}${fileExtension}`;\n const fileName = window.prompt(\"Enter file name\" || \"\", suggestedFileName);\n\n if (!fileName) {\n // User pressed cancel on prompt.\n return;\n }\n\n const blob = new Blob([value], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.download = fileName;\n link.href = url;\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n const onCopy = () => {\n if (isCopied) return;\n copyToClipboard(value);\n };\n\n return (\n <div className=\"codeblock relative w-full bg-zinc-950 font-sans\">\n <div className=\"flex w-full items-center justify-between bg-zinc-800 px-6 py-2 pr-4 text-zinc-100\">\n <span className=\"text-xs lowercase\">{language}</span>\n <div className=\"flex items-center space-x-1\">\n <Button\n variant=\"ghost\"\n className=\"hover:bg-zinc-800 focus-visible:ring-1 focus-visible:ring-slate-700 focus-visible:ring-offset-0\"\n onClick={downloadAsFile}\n size=\"icon\"\n >\n <IconDownload />\n <span className=\"sr-only\">Download</span>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"text-xs hover:bg-zinc-800 focus-visible:ring-1 focus-visible:ring-slate-700 focus-visible:ring-offset-0\"\n onClick={onCopy}\n >\n {isCopied ? <IconCheck /> : <IconCopy />}\n <span className=\"sr-only\">Copy code</span>\n </Button>\n </div>\n </div>\n <SyntaxHighlighter\n language={language}\n PreTag=\"div\"\n showLineNumbers\n customStyle={{\n margin: 0,\n width: \"100%\",\n background: \"transparent\",\n padding: \"1.5rem 1rem\",\n }}\n codeTagProps={{\n style: {\n fontSize: \"0.9rem\",\n fontFamily: \"var(--font-mono)\",\n },\n }}\n >\n {value}\n </SyntaxHighlighter>\n </div>\n );\n});\nCodeBlock.displayName = \"CodeBlock\";\n\nexport { CodeBlock };\n"]}
@@ -1,75 +0,0 @@
1
- import { CodeBlock } from './chunk-XEVSX2QD.mjs';
2
- import { MemoizedReactMarkdown } from './chunk-TEYIQHMK.mjs';
3
- import { ChatMessageActions } from './chunk-ESP3H6NQ.mjs';
4
- import { IconUser, IconOpenAI } from './chunk-34MTYKUD.mjs';
5
- import { cn } from './chunk-Q6YO7LDK.mjs';
6
- import { __objRest, __spreadProps, __spreadValues } from './chunk-MRXNTQOX.mjs';
7
- import remarkGfm from 'remark-gfm';
8
- import remarkMath from 'remark-math';
9
- import { jsxs, jsx } from 'react/jsx-runtime';
10
-
11
- function ChatMessage(_a) {
12
- var _b = _a, { message } = _b, props = __objRest(_b, ["message"]);
13
- return /* @__PURE__ */ jsxs("div", __spreadProps(__spreadValues({
14
- className: cn("group relative mb-4 flex items-start")
15
- }, props), {
16
- children: [
17
- /* @__PURE__ */ jsx("div", {
18
- className: cn(
19
- "flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow",
20
- message.role === "user" ? "bg-background" : "bg-primary text-primary-foreground"
21
- ),
22
- children: message.role === "user" ? /* @__PURE__ */ jsx(IconUser, {}) : /* @__PURE__ */ jsx(IconOpenAI, {})
23
- }),
24
- /* @__PURE__ */ jsxs("div", {
25
- className: "ml-4 flex-1 space-y-2 overflow-hidden px-1",
26
- children: [
27
- /* @__PURE__ */ jsx(MemoizedReactMarkdown, {
28
- className: "prose break-words dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 text-sm",
29
- remarkPlugins: [remarkGfm, remarkMath],
30
- components: {
31
- p({ children }) {
32
- return /* @__PURE__ */ jsx("p", {
33
- className: "mb-2 last:mb-0",
34
- children
35
- });
36
- },
37
- code(_a2) {
38
- var _b2 = _a2, { children, className, inline } = _b2, props2 = __objRest(_b2, ["children", "className", "inline"]);
39
- if (children.length) {
40
- if (children[0] == "\u258D") {
41
- return /* @__PURE__ */ jsx("span", {
42
- className: "mt-1 animate-pulse cursor-default",
43
- children: "\u258D"
44
- });
45
- }
46
- children[0] = children[0].replace("`\u258D`", "\u258D");
47
- }
48
- const match = /language-(\w+)/.exec(className || "");
49
- if (inline) {
50
- return /* @__PURE__ */ jsx("code", __spreadProps(__spreadValues({
51
- className
52
- }, props2), {
53
- children
54
- }));
55
- }
56
- return /* @__PURE__ */ jsx(CodeBlock, __spreadValues({
57
- language: match && match[1] || "",
58
- value: String(children).replace(/\n$/, "")
59
- }, props2), Math.random());
60
- }
61
- },
62
- children: message.content
63
- }),
64
- /* @__PURE__ */ jsx(ChatMessageActions, {
65
- message
66
- })
67
- ]
68
- })
69
- ]
70
- }));
71
- }
72
-
73
- export { ChatMessage };
74
- //# sourceMappingURL=out.js.map
75
- //# sourceMappingURL=chunk-XLGSWCCV.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/chat-components/chat-message.tsx"],"names":["_a","_b","props"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,eAAe;AACtB,OAAO,gBAAgB;AAqBY,cAE7B,YAF6B;AAT5B,SAAS,YAAY,IAAyC;AAAzC,eAAE,UAd9B,IAc4B,IAAc,kBAAd,IAAc,CAAZ;AAC5B,SACE,qBAAC;AAAA,IAAI,WAAW,GAAG,sCAAsC;AAAA,KAAO,QAA/D;AAAA,IACC;AAAA,0BAAC;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,QAAQ,SAAS,SAAS,kBAAkB;AAAA,QAC9C;AAAA,QAEC,kBAAQ,SAAS,SAAS,oBAAC,YAAS,IAAK,oBAAC,cAAW;AAAA,OACxD;AAAA,MACA,qBAAC;AAAA,QAAI,WAAU;AAAA,QACb;AAAA,8BAAC;AAAA,YACC,WAAU;AAAA,YACV,eAAe,CAAC,WAAW,UAAU;AAAA,YACrC,YAAY;AAAA,cACV,EAAE,EAAE,SAAS,GAAG;AACd,uBAAO,oBAAC;AAAA,kBAAE,WAAU;AAAA,kBAAkB;AAAA,iBAAS;AAAA,cACjD;AAAA,cACA,KAAKA,KAA2C;AAA3C,oBAAAC,MAAAD,KAAE,YAAU,WAAW,OAjCxC,IAiCiBC,KAAkCC,SAAA,UAAlCD,KAAkC,CAAhC,YAAU,aAAW;AAC1B,oBAAI,SAAS,QAAQ;AACnB,sBAAI,SAAS,MAAM,UAAK;AACtB,2BAAO,oBAAC;AAAA,sBAAK,WAAU;AAAA,sBAAoC;AAAA,qBAAC;AAAA,kBAC9D;AAEA,2BAAS,KAAM,SAAS,GAAc,QAAQ,YAAO,QAAG;AAAA,gBAC1D;AAEA,sBAAM,QAAQ,iBAAiB,KAAK,aAAa,EAAE;AAEnD,oBAAI,QAAQ;AACV,yBACE,oBAAC;AAAA,oBAAK;AAAA,qBAA0BC,SAA/B;AAAA,oBACE;AAAA,oBACH;AAAA,gBAEJ;AAEA,uBACE,oBAAC;AAAA,kBAEC,UAAW,SAAS,MAAM,MAAO;AAAA,kBACjC,OAAO,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE;AAAA,mBACrCA,SAHC,KAAK,OAAO,CAInB;AAAA,cAEJ;AAAA,YACF;AAAA,YAEC,kBAAQ;AAAA,WACX;AAAA,UACA,oBAAC;AAAA,YAAmB;AAAA,WAAkB;AAAA;AAAA,OACxC;AAAA;AAAA,IACF;AAEJ","sourcesContent":["import { Message } from \"ai\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\n\nimport { cn } from \"../../lib/utils\";\nimport { CodeBlock } from \"./ui/codeblock\";\nimport { MemoizedReactMarkdown } from \"./markdown\";\nimport { IconOpenAI, IconUser } from \"./ui/icons\";\nimport { ChatMessageActions } from \"./chat-message-actions\";\n\nexport interface ChatMessageProps {\n message: Message;\n}\n\nexport function ChatMessage({ message, ...props }: ChatMessageProps) {\n return (\n <div className={cn(\"group relative mb-4 flex items-start\")} {...props}>\n <div\n className={cn(\n \"flex h-8 w-8 shrink-0 select-none items-center justify-center rounded-md border shadow\",\n message.role === \"user\" ? \"bg-background\" : \"bg-primary text-primary-foreground\",\n )}\n >\n {message.role === \"user\" ? <IconUser /> : <IconOpenAI />}\n </div>\n <div className=\"ml-4 flex-1 space-y-2 overflow-hidden px-1\">\n <MemoizedReactMarkdown\n className=\"prose break-words dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 text-sm\"\n remarkPlugins={[remarkGfm, remarkMath]}\n components={{\n p({ children }) {\n return <p className=\"mb-2 last:mb-0\">{children}</p>;\n },\n code({ children, className, inline, ...props }) {\n if (children.length) {\n if (children[0] == \"▍\") {\n return <span className=\"mt-1 animate-pulse cursor-default\">▍</span>;\n }\n\n children[0] = (children[0] as string).replace(\"`▍`\", \"▍\");\n }\n\n const match = /language-(\\w+)/.exec(className || \"\");\n\n if (inline) {\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n }\n\n return (\n <CodeBlock\n key={Math.random()}\n language={(match && match[1]) || \"\"}\n value={String(children).replace(/\\n$/, \"\")}\n {...props}\n />\n );\n },\n }}\n >\n {message.content}\n </MemoizedReactMarkdown>\n <ChatMessageActions message={message} />\n </div>\n </div>\n );\n}\n"]}
@@ -1,69 +0,0 @@
1
- import { PromptForm } from './chunk-4ENGXGIC.mjs';
2
- import { Button } from './chunk-5HCN6SPC.mjs';
3
- import { IconStop, IconRefresh } from './chunk-34MTYKUD.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("div", {
18
- className: "inset-x-0 bottom-0 bg-gradient-to-b from-muted/10 from-10% to-muted/30 to-50% mt-4 mb-8",
19
- style: { width: "100%", overflow: "hidden", boxSizing: "border-box" },
20
- children: /* @__PURE__ */ jsxs("div", {
21
- className: "mx-auto sm:max-w-2xl sm:px-4",
22
- children: [
23
- /* @__PURE__ */ jsx("div", {
24
- className: "flex h-10 items-center justify-center mb-4",
25
- children: isLoading ? /* @__PURE__ */ jsxs(Button, {
26
- variant: "outline",
27
- onClick: () => stop(),
28
- className: "bg-background",
29
- children: [
30
- /* @__PURE__ */ jsx(IconStop, {
31
- className: "mr-2"
32
- }),
33
- "Stop generating"
34
- ]
35
- }) : (messages == null ? void 0 : messages.length) > 0 && /* @__PURE__ */ jsxs(Button, {
36
- variant: "outline",
37
- onClick: () => reload(),
38
- className: "bg-background",
39
- children: [
40
- /* @__PURE__ */ jsx(IconRefresh, {
41
- className: "mr-2"
42
- }),
43
- "Regenerate response"
44
- ]
45
- })
46
- }),
47
- /* @__PURE__ */ jsx("div", {
48
- className: "space-y-4 border-2 bg-background px-4 py-2 shadow-lg sm:rounded-xl md:py-4",
49
- children: /* @__PURE__ */ jsx(PromptForm, {
50
- onSubmit: (value) => __async(this, null, function* () {
51
- yield append({
52
- id,
53
- content: value,
54
- role: "user"
55
- });
56
- }),
57
- input,
58
- setInput,
59
- isLoading
60
- })
61
- })
62
- ]
63
- })
64
- });
65
- }
66
-
67
- export { ChatPanel };
68
- //# sourceMappingURL=out.js.map
69
- //# sourceMappingURL=chunk-ZA25IBKF.mjs.map
@@ -1 +0,0 @@
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,oBAAC;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAO,QAAQ,UAAU,UAAU,WAAW,aAAa;AAAA,IAEpE,+BAAC;AAAA,MAAI,WAAU;AAAA,MACb;AAAA,4BAAC;AAAA,UAAI,WAAU;AAAA,UACZ,sBACC,qBAAC;AAAA,YAAO,SAAQ;AAAA,YAAU,SAAS,MAAM,KAAK;AAAA,YAAG,WAAU;AAAA,YACzD;AAAA,kCAAC;AAAA,gBAAS,WAAU;AAAA,eAAO;AAAA,cAAE;AAAA;AAAA,WAE/B,KAEA,qCAAU,UAAS,KACjB,qBAAC;AAAA,YAAO,SAAQ;AAAA,YAAU,SAAS,MAAM,OAAO;AAAA,YAAG,WAAU;AAAA,YAC3D;AAAA,kCAAC;AAAA,gBAAY,WAAU;AAAA,eAAO;AAAA,cAAE;AAAA;AAAA,WAElC;AAAA,SAGN;AAAA,QACA,oBAAC;AAAA,UAAI,WAAU;AAAA,UACb,8BAAC;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,WACF;AAAA,SACF;AAAA;AAAA,KACF;AAAA,GACF;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"]}
@@ -1,26 +0,0 @@
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-ZLFSBGYI.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-copy-to-clipboard.tsx"],"names":[],"mappings":";AAEA,YAAY,WAAW;AAFvB;AAQO,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"]}
@@ -1,21 +0,0 @@
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
@@ -1 +0,0 @@
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"]}