reachat 1.6.0 → 1.7.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 (52) hide show
  1. package/dist/AppBar/AppBar.d.ts +13 -0
  2. package/dist/AppBar/index.d.ts +1 -0
  3. package/dist/CSVFileRenderer-Cio05GLC.js +148 -0
  4. package/dist/CSVFileRenderer-Cio05GLC.js.map +1 -0
  5. package/dist/Chat.d.ts +2 -3
  6. package/dist/ChatBubble/ChatBubble.d.ts +31 -0
  7. package/dist/ChatBubble/index.d.ts +1 -0
  8. package/dist/ChatContext.d.ts +2 -3
  9. package/dist/ChatInput/ChatInput.d.ts +0 -1
  10. package/dist/ChatInput/FileInput.d.ts +0 -1
  11. package/dist/{DefaultFileRenderer-DZL5GRed.js → DefaultFileRenderer-C-vGWeXN.js} +2 -2
  12. package/dist/{DefaultFileRenderer-DZL5GRed.js.map → DefaultFileRenderer-C-vGWeXN.js.map} +1 -1
  13. package/dist/Markdown/CodeHighlighter.d.ts +0 -1
  14. package/dist/Markdown/Markdown.d.ts +3 -4
  15. package/dist/Markdown/Table.d.ts +0 -1
  16. package/dist/PDFFileRenderer-DQdFS2l6.js.map +1 -1
  17. package/dist/SessionMessages/SessionEmpty.d.ts +0 -1
  18. package/dist/SessionMessages/SessionMessage/MessageActions.d.ts +0 -1
  19. package/dist/SessionMessages/SessionMessage/MessageFile/MessageFile.d.ts +0 -1
  20. package/dist/SessionMessages/SessionMessage/MessageFile/renderers/CSVFileRenderer.d.ts +0 -1
  21. package/dist/SessionMessages/SessionMessage/MessageFile/renderers/DefaultFileRenderer.d.ts +0 -1
  22. package/dist/SessionMessages/SessionMessage/MessageFile/renderers/ImageFileRenderer.d.ts +0 -1
  23. package/dist/SessionMessages/SessionMessage/MessageFile/renderers/PDFFileRenderer.d.ts +0 -1
  24. package/dist/SessionMessages/SessionMessage/MessageFiles.d.ts +0 -1
  25. package/dist/SessionMessages/SessionMessage/MessageQuestion.d.ts +0 -1
  26. package/dist/SessionMessages/SessionMessage/MessageResponse.d.ts +0 -1
  27. package/dist/SessionMessages/SessionMessage/MessageSource.d.ts +0 -1
  28. package/dist/SessionMessages/SessionMessage/MessageSources.d.ts +0 -1
  29. package/dist/SessionMessages/SessionMessage/SessionMessage.d.ts +0 -1
  30. package/dist/SessionMessages/SessionMessagePanel.d.ts +5 -2
  31. package/dist/SessionMessages/SessionMessages.d.ts +0 -1
  32. package/dist/SessionMessages/SessionMessagesHeader.d.ts +0 -1
  33. package/dist/SessionsList/NewSessionButton.d.ts +0 -1
  34. package/dist/SessionsList/SessionGroups.d.ts +0 -1
  35. package/dist/SessionsList/SessionListItem.d.ts +0 -1
  36. package/dist/SessionsList/SessionsGroup.d.ts +0 -1
  37. package/dist/SessionsList/SessionsList.d.ts +8 -2
  38. package/dist/docs.json +221 -5
  39. package/dist/{index-D-JgMn3h.js → index-B4HlLXxa.js} +98 -48
  40. package/dist/index-B4HlLXxa.js.map +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +4 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/index.umd.cjs +252 -7523
  45. package/dist/index.umd.cjs.map +1 -1
  46. package/dist/theme.d.ts +1 -0
  47. package/dist/types.d.ts +19 -0
  48. package/dist/utils/grouping.d.ts +0 -1
  49. package/package.json +13 -12
  50. package/dist/CSVFileRenderer-6glCQ4gs.js +0 -7468
  51. package/dist/CSVFileRenderer-6glCQ4gs.js.map +0 -1
  52. package/dist/index-D-JgMn3h.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ import { ReactNode, FC } from 'react';
2
+ import { ChatTheme } from '../theme';
3
+ export interface AppBarProps {
4
+ /**
5
+ * Content to display in the header
6
+ */
7
+ content?: ReactNode;
8
+ /**
9
+ * Custom theme for the appbar
10
+ */
11
+ theme?: ChatTheme;
12
+ }
13
+ export declare const AppBar: FC<AppBarProps>;
@@ -0,0 +1 @@
1
+ export * from './AppBar';
@@ -0,0 +1,148 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { useState, useRef, useEffect } from "react";
4
+ import { AnimatePresence, motion } from "motion/react";
5
+ import { a as SvgCopy } from "./index-B4HlLXxa.js";
6
+ import { IconButton } from "reablocks";
7
+ const sanitizeSVGCell = (cell) => {
8
+ const trimmed = cell.trim();
9
+ const escaped = trimmed.replace(/"/g, '""');
10
+ const prefix = /^[=+\-@]/.test(trimmed) ? "'" : "";
11
+ const needsQuotes = /[",\n\r]/.test(escaped) || prefix;
12
+ return needsQuotes ? `"${prefix}${escaped}"` : escaped;
13
+ };
14
+ const parseCSV = (csvString) => {
15
+ try {
16
+ const rows = csvString.split("\n");
17
+ return rows.map((row) => row.split(",").map((cell) => sanitizeSVGCell(cell)));
18
+ } catch (error) {
19
+ console.error("Error parsing CSV:", error);
20
+ throw new Error("Failed to parse CSV file.");
21
+ }
22
+ };
23
+ const SvgDownload = (props) => /* @__PURE__ */ React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: 24, height: 24, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1, strokeLinecap: "round", strokeLinejoin: "round", className: "lucide lucide-cloud-download", ...props }, /* @__PURE__ */ React.createElement("path", { d: "M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242" }), /* @__PURE__ */ React.createElement("path", { d: "M12 12v9" }), /* @__PURE__ */ React.createElement("path", { d: "m8 17 4 4 4-4" }));
24
+ const CSVFileRenderer = ({ name, url, fileIcon }) => {
25
+ const [isLoading, setIsLoading] = useState(true);
26
+ const [csvData, setCsvData] = useState([]);
27
+ const [error, setError] = useState(null);
28
+ const [isModalOpen, setIsModalOpen] = useState(false);
29
+ const modalRef = useRef(null);
30
+ useEffect(() => {
31
+ const fetchCsvData = async () => {
32
+ try {
33
+ setIsLoading(true);
34
+ const response = await fetch(url);
35
+ const data = parseCSV(await response.text());
36
+ setCsvData(data);
37
+ } catch {
38
+ setError("Failed to load CSV file.");
39
+ } finally {
40
+ setIsLoading(false);
41
+ }
42
+ };
43
+ fetchCsvData();
44
+ }, [url]);
45
+ const toggleModal = () => {
46
+ setIsModalOpen((prev) => !prev);
47
+ };
48
+ const handleClickOutside = (event) => {
49
+ if (modalRef.current && !modalRef.current.contains(event.target)) {
50
+ setIsModalOpen(false);
51
+ }
52
+ };
53
+ useEffect(() => {
54
+ if (isModalOpen) {
55
+ document.addEventListener("mousedown", handleClickOutside);
56
+ } else {
57
+ document.removeEventListener("mousedown", handleClickOutside);
58
+ }
59
+ return () => {
60
+ document.removeEventListener("mousedown", handleClickOutside);
61
+ };
62
+ }, [isModalOpen]);
63
+ const downloadCSV = () => {
64
+ if (csvData.length === 0) return;
65
+ const csvContent = csvData.map((row) => row.join(",")).join("\n");
66
+ const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
67
+ const url2 = URL.createObjectURL(blob);
68
+ const link = document.createElement("a");
69
+ link.href = url2;
70
+ link.setAttribute("download", `${name || "data"}`);
71
+ document.body.appendChild(link);
72
+ link.click();
73
+ document.body.removeChild(link);
74
+ };
75
+ const renderTable = (data, maxRows) => /* @__PURE__ */ jsxs(
76
+ motion.table,
77
+ {
78
+ layout: true,
79
+ className: "w-full",
80
+ transition: { type: "spring", stiffness: 100, damping: 20 },
81
+ children: [
82
+ /* @__PURE__ */ jsx("thead", { className: "sticky top-0 bg-gray-200 dark:bg-gray-800 z-10", children: /* @__PURE__ */ jsxs("tr", { children: [
83
+ /* @__PURE__ */ jsx("th", { className: "py-4 px-6", children: "#" }),
84
+ data[0].map((header, index) => /* @__PURE__ */ jsx("th", { className: "py-4 px-6", children: header }, `header-${index}`))
85
+ ] }) }),
86
+ /* @__PURE__ */ jsx("tbody", { children: data.slice(1, maxRows).map((row, rowIndex) => /* @__PURE__ */ jsxs(
87
+ "tr",
88
+ {
89
+ className: "border-b border-panel-accent hover:bg-panel-accent/40 transition-colors text-base text-text-secondary",
90
+ children: [
91
+ /* @__PURE__ */ jsx("td", { className: "py-4 px-6", children: rowIndex + 1 }),
92
+ row.map((cell, cellIndex) => /* @__PURE__ */ jsx(
93
+ "td",
94
+ {
95
+ className: "py-4 px-6 dark:bg-vulcan light:bg-mystic",
96
+ children: cell
97
+ },
98
+ `cell-${rowIndex}-${cellIndex}`
99
+ ))
100
+ ]
101
+ },
102
+ `row-${rowIndex}`
103
+ )) })
104
+ ]
105
+ }
106
+ );
107
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
108
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center gap-4", children: [
109
+ /* @__PURE__ */ jsxs("div", { className: "csv-icon flex items-center", children: [
110
+ fileIcon,
111
+ name && /* @__PURE__ */ jsx("figcaption", { className: "ml-1", children: name })
112
+ ] }),
113
+ /* @__PURE__ */ jsxs("div", { className: "csv-icon flex items-center gap-6", children: [
114
+ /* @__PURE__ */ jsx(IconButton, { size: "small", variant: "text", onClick: downloadCSV, children: /* @__PURE__ */ jsx(SvgDownload, {}) }),
115
+ /* @__PURE__ */ jsx(IconButton, { size: "small", variant: "text", onClick: toggleModal, children: /* @__PURE__ */ jsx(SvgCopy, {}) })
116
+ ] })
117
+ ] }),
118
+ error && /* @__PURE__ */ jsx("div", { className: "error-message", children: error }),
119
+ isLoading && !csvData && /* @__PURE__ */ jsx("div", { className: "text-text-secondary", children: "Loading..." }),
120
+ /* @__PURE__ */ jsx("div", { className: "flex justify-between", children: !error && csvData.length > 0 && renderTable(csvData, 6) }),
121
+ /* @__PURE__ */ jsx(AnimatePresence, { children: isModalOpen && /* @__PURE__ */ jsx(
122
+ motion.div,
123
+ {
124
+ className: "fixed inset-0 bg-black/70 flex justify-center items-center z-50",
125
+ initial: { opacity: 0 },
126
+ animate: { opacity: 1 },
127
+ exit: { opacity: 0 },
128
+ transition: { duration: 0.3 },
129
+ children: /* @__PURE__ */ jsx(
130
+ motion.div,
131
+ {
132
+ ref: modalRef,
133
+ className: "bg-white dark:bg-gray-900 rounded-md w-11/12 h-5/6 overflow-auto",
134
+ initial: { scale: 0.8 },
135
+ animate: { scale: 1 },
136
+ exit: { scale: 0.8 },
137
+ transition: { duration: 0.3 },
138
+ children: !error && csvData.length > 0 && renderTable(csvData)
139
+ }
140
+ )
141
+ }
142
+ ) })
143
+ ] });
144
+ };
145
+ export {
146
+ CSVFileRenderer as default
147
+ };
148
+ //# sourceMappingURL=CSVFileRenderer-Cio05GLC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSVFileRenderer-Cio05GLC.js","sources":["../src/utils/sanitize.ts","../src/utils/parseCSV.ts","../src/assets/download.svg?react","../src/SessionMessages/SessionMessage/MessageFile/renderers/CSVFileRenderer.tsx"],"sourcesContent":["\n/**\n * Sanitizes cell content to prevent CSV injection and other potential vulnerabilities.\n * Based on the documentation of OWASP for CSV Injection\n * https://owasp.org/www-community/attacks/CSV_Injection\n * @param cell The cell content to sanitize.\n * @returns The sanitized cell content.\n */\nexport const sanitizeSVGCell = (cell: string): string => {\n const trimmed = cell.trim();\n // Escape double quotes by doubling them\n const escaped = trimmed.replace(/\"/g, '\"\"');\n // Add single quote prefix only for potentially dangerous content\n const prefix = /^[=+\\-@]/.test(trimmed) ? '\\'' : '';\n // Only wrap in quotes if the content contains special characters\n const needsQuotes = /[\",\\n\\r]/.test(escaped) || prefix;\n\n return needsQuotes ? `\"${prefix}${escaped}\"` : escaped;\n};\n","import { sanitizeSVGCell } from './sanitize';\n\n/**\n * Parses a CSV string from a local file and returns an array of rows.\n * Sanitizes cell data to prevent injection attacks.\n * @param csvString The raw CSV string content to parse.\n * @returns The parsed CSV data as a 2D array of strings.\n */\nexport const parseCSV = (csvString: string): string[][] => {\n try {\n const rows = csvString.split('\\n');\n return rows.map((row) => row.split(',').map((cell) => sanitizeSVGCell(cell)));\n } catch (error) {\n console.error('Error parsing CSV:', error);\n throw new Error('Failed to parse CSV file.');\n }\n};\n","import * as React from \"react\";\nconst SvgDownload = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-cloud-download\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12 12v9\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"m8 17 4 4 4-4\" }));\nexport default SvgDownload;\n","import { FC, useEffect, useState, ReactElement, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { parseCSV } from '@/utils/parseCSV';\nimport DownloadIcon from '@/assets/download.svg?react';\nimport PlaceholderIcon from '@/assets/copy.svg?react';\nimport { IconButton } from 'reablocks';\n\ninterface CSVFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Renderer for CSV files that fetches and displays a snippet of the file data.\n */\nconst CSVFileRenderer: FC<CSVFileRendererProps> = ({ name, url, fileIcon }) => {\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [csvData, setCsvData] = useState<string[][]>([]);\n const [error, setError] = useState<string | null>(null);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const modalRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const fetchCsvData = async () => {\n try {\n setIsLoading(true);\n const response = await fetch(url);\n const data = parseCSV(await response.text());\n setCsvData(data);\n } catch {\n setError('Failed to load CSV file.');\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchCsvData();\n }, [url]);\n\n const toggleModal = () => {\n setIsModalOpen(prev => !prev);\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (modalRef.current && !modalRef.current.contains(event.target as Node)) {\n setIsModalOpen(false);\n }\n };\n\n useEffect(() => {\n if (isModalOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n } else {\n document.removeEventListener('mousedown', handleClickOutside);\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isModalOpen]);\n\n const downloadCSV = () => {\n if (csvData.length === 0) return;\n\n const csvContent = csvData.map(row => row.join(',')).join('\\n');\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', `${name || 'data'}`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n const renderTable = (data: string[][], maxRows?: number) => (\n <motion.table\n layout\n className=\"w-full\"\n transition={{ type: 'spring', stiffness: 100, damping: 20 }}\n >\n <thead className=\"sticky top-0 bg-gray-200 dark:bg-gray-800 z-10\">\n <tr>\n <th className=\"py-4 px-6\">#</th>\n {data[0].map((header, index) => (\n <th key={`header-${index}`} className=\"py-4 px-6\">\n {header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.slice(1, maxRows).map((row, rowIndex) => (\n <tr\n key={`row-${rowIndex}`}\n className=\"border-b border-panel-accent hover:bg-panel-accent/40 transition-colors text-base text-text-secondary\"\n >\n <td className=\"py-4 px-6\">{rowIndex + 1}</td>\n {row.map((cell, cellIndex) => (\n <td\n key={`cell-${rowIndex}-${cellIndex}`}\n className=\"py-4 px-6 dark:bg-vulcan light:bg-mystic\"\n >\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </motion.table>\n );\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center gap-4\">\n <div className=\"csv-icon flex items-center\">\n {fileIcon}\n {name && <figcaption className=\"ml-1\">{name}</figcaption>}\n </div>\n <div className=\"csv-icon flex items-center gap-6\">\n <IconButton size=\"small\" variant=\"text\" onClick={downloadCSV}>\n <DownloadIcon />\n </IconButton>\n <IconButton size=\"small\" variant=\"text\" onClick={toggleModal}>\n <PlaceholderIcon />\n </IconButton>\n </div>\n </div>\n\n {error && <div className=\"error-message\">{error}</div>}\n\n {isLoading && !csvData && (\n <div className=\"text-text-secondary\">Loading...</div>\n )}\n\n <div className=\"flex justify-between\">\n {!error && csvData.length > 0 && renderTable(csvData, 6)}\n </div>\n\n <AnimatePresence>\n {isModalOpen && (\n <motion.div\n className=\"fixed inset-0 bg-black/70 flex justify-center items-center z-50\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.3 }}\n >\n <motion.div\n ref={modalRef}\n className=\"bg-white dark:bg-gray-900 rounded-md w-11/12 h-5/6 overflow-auto\"\n initial={{ scale: 0.8 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0.8 }}\n transition={{ duration: 0.3 }}\n >\n {!error && csvData.length > 0 && renderTable(csvData)}\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n};\n\nexport default CSVFileRenderer;\n"],"names":["url","DownloadIcon","PlaceholderIcon"],"mappings":"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"}
package/dist/Chat.d.ts CHANGED
@@ -2,8 +2,7 @@ import { CSSProperties, FC, PropsWithChildren } from 'react';
2
2
  import { Session } from './types';
3
3
  import { ChatTheme } from './theme';
4
4
  import { ChatViewType } from './ChatContext';
5
- import { PluggableList } from 'react-markdown/lib';
6
-
5
+ import { Plugin } from 'unified';
7
6
  export interface ChatProps extends PropsWithChildren {
8
7
  /**
9
8
  * The style to apply to the root element.
@@ -36,7 +35,7 @@ export interface ChatProps extends PropsWithChildren {
36
35
  /**
37
36
  * Remark plugins to apply to the request/response.
38
37
  */
39
- remarkPlugins?: PluggableList[];
38
+ remarkPlugins?: Plugin[];
40
39
  /**
41
40
  * Whether to display a loading state.
42
41
  */
@@ -0,0 +1,31 @@
1
+ import { ReactNode, CSSProperties } from 'react';
2
+ export type Position = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
3
+ export interface ChatBubbleProps {
4
+ /**
5
+ * The main content to be rendered.
6
+ */
7
+ children: ReactNode;
8
+ /**
9
+ * The content to be rendered in the trigger bubble.
10
+ */
11
+ bubbleContent: ReactNode;
12
+ /**
13
+ * The position of the chat bubble on the screen.
14
+ * @default 'bottom-left'
15
+ */
16
+ position?: Position;
17
+ /**
18
+ * Custom CSS styles to override the default positioning.
19
+ */
20
+ customPosition?: CSSProperties;
21
+ /**
22
+ * The DOM element where the chat bubble should be rendered.
23
+ * @default document.body
24
+ */
25
+ portalTarget?: HTMLElement | null;
26
+ /**
27
+ * Additional CSS classes to apply to the chat bubble.
28
+ */
29
+ className?: string;
30
+ }
31
+ export declare const ChatBubble: import('react').NamedExoticComponent<ChatBubbleProps>;
@@ -0,0 +1 @@
1
+ export * from './ChatBubble';
@@ -1,7 +1,6 @@
1
1
  import { Session } from './types';
2
2
  import { ChatTheme } from './theme';
3
- import { PluggableList } from 'react-markdown/lib';
4
-
3
+ import { Plugin } from 'unified';
5
4
  export type ChatViewType = 'chat' | 'companion' | 'console';
6
5
  export interface ChatContextProps {
7
6
  sessions: Session[];
@@ -12,7 +11,7 @@ export interface ChatContextProps {
12
11
  isCompact?: boolean;
13
12
  viewType?: ChatViewType;
14
13
  activeSession?: Session | null;
15
- remarkPlugins?: PluggableList[];
14
+ remarkPlugins?: Plugin[];
16
15
  selectSession?: (sessionId: string) => void;
17
16
  deleteSession?: (sessionId: string) => void;
18
17
  createSession?: () => void;
@@ -1,5 +1,4 @@
1
1
  import { ReactElement } from 'react';
2
-
3
2
  interface ChatInputProps {
4
3
  /**
5
4
  * Default value for the input field.
@@ -1,5 +1,4 @@
1
1
  import { FC, ReactNode, ChangeEvent } from 'react';
2
-
3
2
  interface FileInputProps {
4
3
  /**
5
4
  * Array of allowed file extensions.
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
- import { S as SvgFile } from "./index-D-JgMn3h.js";
2
+ import { S as SvgFile } from "./index-B4HlLXxa.js";
3
3
  import { cn, Ellipsis } from "reablocks";
4
4
  const DefaultFileRenderer = ({
5
5
  name,
@@ -12,4 +12,4 @@ const DefaultFileRenderer = ({
12
12
  export {
13
13
  DefaultFileRenderer as default
14
14
  };
15
- //# sourceMappingURL=DefaultFileRenderer-DZL5GRed.js.map
15
+ //# sourceMappingURL=DefaultFileRenderer-C-vGWeXN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultFileRenderer-DZL5GRed.js","sources":["../src/SessionMessages/SessionMessage/MessageFile/renderers/DefaultFileRenderer.tsx"],"sourcesContent":["import { FC, ReactElement } from 'react';\nimport FileIcon from '@/assets/file.svg?react';\nimport { Ellipsis, cn } from 'reablocks';\n\ninterface DefaultFileRendererProps {\n /**\n * Limit for the name.\n */\n limit?: number;\n\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Default renderer for unspecified file types.\n */\nconst DefaultFileRenderer: FC<DefaultFileRendererProps> = ({\n name,\n limit = 100,\n fileIcon = <FileIcon />,\n}) => (\n <figure className=\"flex items-center gap-2\">\n {fileIcon}\n {name && (\n <figcaption className={cn('file-name-class')}>\n <Ellipsis value={name} limit={limit} />\n </figcaption>\n )}\n </figure>\n);\n\nexport default DefaultFileRenderer;\n"],"names":["FileIcon"],"mappings":";;;AA6BA,MAAM,sBAAoD,CAAC;AAAA,EACzD;AAAA,EACA,QAAQ;AAAA,EACR,+BAAYA,SAAS,EAAA;AACvB,MACE,qBAAC,UAAO,EAAA,WAAU,2BACf,UAAA;AAAA,EAAA;AAAA,EACA,QACC,oBAAC,cAAW,EAAA,WAAW,GAAG,iBAAiB,GACzC,UAAA,oBAAC,UAAS,EAAA,OAAO,MAAM,MAAc,CAAA,GACvC;AAAA,EAEJ,CAAA;"}
1
+ {"version":3,"file":"DefaultFileRenderer-C-vGWeXN.js","sources":["../src/SessionMessages/SessionMessage/MessageFile/renderers/DefaultFileRenderer.tsx"],"sourcesContent":["import { FC, ReactElement } from 'react';\nimport FileIcon from '@/assets/file.svg?react';\nimport { Ellipsis, cn } from 'reablocks';\n\ninterface DefaultFileRendererProps {\n /**\n * Limit for the name.\n */\n limit?: number;\n\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Default renderer for unspecified file types.\n */\nconst DefaultFileRenderer: FC<DefaultFileRendererProps> = ({\n name,\n limit = 100,\n fileIcon = <FileIcon />,\n}) => (\n <figure className=\"flex items-center gap-2\">\n {fileIcon}\n {name && (\n <figcaption className={cn('file-name-class')}>\n <Ellipsis value={name} limit={limit} />\n </figcaption>\n )}\n </figure>\n);\n\nexport default DefaultFileRenderer;\n"],"names":["FileIcon"],"mappings":";;;AA6BA,MAAM,sBAAoD,CAAC;AAAA,EACzD;AAAA,EACA,QAAQ;AAAA,EACR,+BAAYA,SAAS,CAAA,CAAA;AACvB,MACE,qBAAC,UAAO,EAAA,WAAU,2BACf,UAAA;AAAA,EAAA;AAAA,EACA,QACC,oBAAC,cAAW,EAAA,WAAW,GAAG,iBAAiB,GACzC,UAAA,oBAAC,UAAS,EAAA,OAAO,MAAM,MAAc,CAAA,EACvC,CAAA;AAAA,EAEJ,CAAA;"}
@@ -1,5 +1,4 @@
1
1
  import { FC, PropsWithChildren, ReactElement } from 'react';
2
-
3
2
  export interface CodeHighlighterProps extends PropsWithChildren {
4
3
  /**
5
4
  * The class name to apply to the code block.
@@ -1,15 +1,14 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
- import { PluggableList } from 'react-markdown/lib';
3
-
2
+ import { Plugin } from 'unified';
4
3
  interface MarkdownWrapperProps extends PropsWithChildren {
5
4
  /**
6
5
  * Remark plugins to apply to the markdown content.
7
6
  */
8
- remarkPlugins?: PluggableList[];
7
+ remarkPlugins?: Plugin[];
9
8
  /**
10
9
  * Rehype plugins to apply to the markdown content.
11
10
  */
12
- rehypePlugins?: PluggableList[];
11
+ rehypePlugins?: Plugin[];
13
12
  }
14
13
  export declare const Markdown: FC<MarkdownWrapperProps>;
15
14
  export {};
@@ -1,5 +1,4 @@
1
1
  import { default as React, FC, PropsWithChildren } from 'react';
2
-
3
2
  export declare const TableComponent: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableElement>>>;
4
3
  export declare const TableHeaderCell: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableHeaderCellElement>>>;
5
4
  export declare const TableDataCell: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableDataCellElement>>>;
@@ -1 +1 @@
1
- {"version":3,"file":"PDFFileRenderer-DQdFS2l6.js","sources":["../src/SessionMessages/SessionMessage/MessageFile/renderers/PDFFileRenderer.tsx"],"sourcesContent":["import { FC, ReactElement } from 'react';\n\ninterface PDFFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Renderer for PDF files.\n */\nconst PDFFileRenderer: FC<PDFFileRendererProps> = ({ name, url, fileIcon }) => (\n <figure className=\"csv-icon flex items-center gap-2\" onClick={() => window.open(url, '_blank')}>\n {fileIcon}\n {name && <figcaption className=\"file-name\">{name}</figcaption>}\n </figure>\n);\n\nexport default PDFFileRenderer;\n"],"names":[],"mappings":";AAsBA,MAAM,kBAA4C,CAAC,EAAE,MAAM,KAAK,SAC9D,MAAA,qBAAC,UAAO,EAAA,WAAU,oCAAmC,SAAS,MAAM,OAAO,KAAK,KAAK,QAAQ,GAC1F,UAAA;AAAA,EAAA;AAAA,EACA,QAAQ,oBAAC,cAAW,EAAA,WAAU,aAAa,UAAK,MAAA;AAAA,EACnD,CAAA;"}
1
+ {"version":3,"file":"PDFFileRenderer-DQdFS2l6.js","sources":["../src/SessionMessages/SessionMessage/MessageFile/renderers/PDFFileRenderer.tsx"],"sourcesContent":["import { FC, ReactElement } from 'react';\n\ninterface PDFFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Renderer for PDF files.\n */\nconst PDFFileRenderer: FC<PDFFileRendererProps> = ({ name, url, fileIcon }) => (\n <figure className=\"csv-icon flex items-center gap-2\" onClick={() => window.open(url, '_blank')}>\n {fileIcon}\n {name && <figcaption className=\"file-name\">{name}</figcaption>}\n </figure>\n);\n\nexport default PDFFileRenderer;\n"],"names":[],"mappings":";AAsBA,MAAM,kBAA4C,CAAC,EAAE,MAAM,KAAK,SAC9D,MAAA,qBAAC,UAAO,EAAA,WAAU,oCAAmC,SAAS,MAAM,OAAO,KAAK,KAAK,QAAQ,GAC1F,UAAA;AAAA,EAAA;AAAA,EACA,QAAQ,oBAAC,cAAW,EAAA,WAAU,aAAa,UAAK,KAAA,CAAA;AAAA,EACnD,CAAA;"}
@@ -1,5 +1,4 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
-
3
2
  interface SessionEmptyProps extends PropsWithChildren {
4
3
  }
5
4
  export declare const SessionEmpty: FC<SessionEmptyProps>;
@@ -1,5 +1,4 @@
1
1
  import { FC, PropsWithChildren, ReactElement } from 'react';
2
-
3
2
  export interface MessageActionsProps extends PropsWithChildren {
4
3
  /**
5
4
  * Question to be copied
@@ -1,6 +1,5 @@
1
1
  import { FC, ReactElement } from 'react';
2
2
  import { ConversationFile } from '../../../types';
3
-
4
3
  export interface MessageFileProps extends ConversationFile {
5
4
  /**
6
5
  * Icon to show for delete.
@@ -1,5 +1,4 @@
1
1
  import { FC, ReactElement } from 'react';
2
-
3
2
  interface CSVFileRendererProps {
4
3
  /**
5
4
  * Name of the file.
@@ -1,5 +1,4 @@
1
1
  import { FC, ReactElement } from 'react';
2
-
3
2
  interface DefaultFileRendererProps {
4
3
  /**
5
4
  * Limit for the name.
@@ -1,5 +1,4 @@
1
1
  import { FC } from 'react';
2
-
3
2
  interface ImageFileRendererProps {
4
3
  /**
5
4
  * Name of the file.
@@ -1,5 +1,4 @@
1
1
  import { FC, ReactElement } from 'react';
2
-
3
2
  interface PDFFileRendererProps {
4
3
  /**
5
4
  * Name of the file.
@@ -1,6 +1,5 @@
1
1
  import { ConversationFile } from '../../types';
2
2
  import { FC, PropsWithChildren } from 'react';
3
-
4
3
  interface MessageFilesProps extends PropsWithChildren {
5
4
  /**
6
5
  * Files to render.
@@ -1,6 +1,5 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
2
  import { ConversationFile } from '../../types';
3
-
4
3
  export interface MessageQuestionProps extends PropsWithChildren {
5
4
  /**
6
5
  * Question to render.
@@ -1,5 +1,4 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
-
3
2
  export interface MessageResponseProps extends PropsWithChildren {
4
3
  /**
5
4
  * Response to render.
@@ -1,6 +1,5 @@
1
1
  import { FC } from 'react';
2
2
  import { ConversationSource } from '../../types';
3
-
4
3
  export interface MessageSourceProps extends ConversationSource {
5
4
  /**
6
5
  * Limit for the title.
@@ -1,6 +1,5 @@
1
1
  import { ConversationSource } from '../../types';
2
2
  import { FC, PropsWithChildren } from 'react';
3
-
4
3
  interface MessageSourcesProps extends PropsWithChildren {
5
4
  /**
6
5
  * Sources to render.
@@ -1,6 +1,5 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
2
  import { Conversation } from '../../types';
3
-
4
3
  interface SessionMessageProps extends PropsWithChildren {
5
4
  /**
6
5
  * Conversation to render.
@@ -1,3 +1,6 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
-
3
- export declare const SessionMessagePanel: FC<PropsWithChildren>;
2
+ interface SessionMessagePanelProps extends PropsWithChildren {
3
+ allowBack?: boolean;
4
+ }
5
+ export declare const SessionMessagePanel: FC<SessionMessagePanelProps>;
6
+ export {};
@@ -1,6 +1,5 @@
1
1
  import { default as React, ReactNode } from 'react';
2
2
  import { Conversation } from '../types';
3
-
4
3
  interface SessionMessagesProps {
5
4
  /**
6
5
  * Content to display when there are no sessions selected or a new session is started.
@@ -1,3 +1,2 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
-
3
2
  export declare const SessionMessagesHeader: FC<PropsWithChildren>;
@@ -1,5 +1,4 @@
1
1
  import { FC, PropsWithChildren, ReactNode } from 'react';
2
-
3
2
  interface NewSessionButtonProps extends PropsWithChildren {
4
3
  /**
5
4
  * Text for the new session button.
@@ -1,6 +1,5 @@
1
1
  import { FC, ReactNode } from 'react';
2
2
  import { GroupedSessions } from '../utils/grouping';
3
-
4
3
  export interface SessionGroupsProps {
5
4
  /**
6
5
  * Render function for the session groups.
@@ -1,6 +1,5 @@
1
1
  import { FC, PropsWithChildren, ReactElement } from 'react';
2
2
  import { Session } from '../types';
3
-
4
3
  export interface SessionListItemProps extends PropsWithChildren {
5
4
  /**
6
5
  * Session to display.
@@ -1,5 +1,4 @@
1
1
  import { FC, PropsWithChildren, ReactNode } from 'react';
2
-
3
2
  interface SessionsGroupProps extends PropsWithChildren {
4
3
  /**
5
4
  * Heading for the session group.
@@ -1,3 +1,9 @@
1
1
  import { FC, PropsWithChildren } from 'react';
2
-
3
- export declare const SessionsList: FC<PropsWithChildren>;
2
+ import { Template } from '../types';
3
+ export interface SessionsListProps extends PropsWithChildren {
4
+ /**
5
+ * Templates to show when no session is active
6
+ */
7
+ templates?: Template[];
8
+ }
9
+ export declare const SessionsList: FC<SessionsListProps>;