@liveblocks/react-ui 3.8.1 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_private/index.cjs +2 -0
- package/dist/_private/index.cjs.map +1 -1
- package/dist/_private/index.d.cts +7 -1
- package/dist/_private/index.d.ts +7 -1
- package/dist/_private/index.js +1 -0
- package/dist/_private/index.js.map +1 -1
- package/dist/components/AiChat.cjs +15 -3
- package/dist/components/AiChat.cjs.map +1 -1
- package/dist/components/AiChat.js +15 -3
- package/dist/components/AiChat.js.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.cjs +200 -39
- package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.js +195 -34
- package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
- package/dist/components/internal/Favicon.cjs +26 -0
- package/dist/components/internal/Favicon.cjs.map +1 -0
- package/dist/components/internal/Favicon.js +24 -0
- package/dist/components/internal/Favicon.js.map +1 -0
- package/dist/icon.cjs +2 -0
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.js +1 -0
- package/dist/icon.js.map +1 -1
- package/dist/icons/Globe.cjs +23 -0
- package/dist/icons/Globe.cjs.map +1 -0
- package/dist/icons/Globe.js +21 -0
- package/dist/icons/Globe.js.map +1 -0
- package/dist/icons/index.cjs +2 -0
- package/dist/icons/index.cjs.map +1 -1
- package/dist/icons/index.js +1 -0
- package/dist/icons/index.js.map +1 -1
- package/dist/index.d.cts +51 -2
- package/dist/index.d.ts +51 -2
- package/dist/overrides.cjs +79 -28
- package/dist/overrides.cjs.map +1 -1
- package/dist/overrides.js +79 -28
- package/dist/overrides.js.map +1 -1
- package/dist/primitives/AiComposer/index.cjs +6 -2
- package/dist/primitives/AiComposer/index.cjs.map +1 -1
- package/dist/primitives/AiComposer/index.js +6 -2
- package/dist/primitives/AiComposer/index.js.map +1 -1
- package/dist/primitives/AiMessage/index.cjs +16 -2
- package/dist/primitives/AiMessage/index.cjs.map +1 -1
- package/dist/primitives/AiMessage/index.js +16 -2
- package/dist/primitives/AiMessage/index.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/src/styles/index.css +162 -54
- package/styles.css +1 -1
- package/styles.css.map +1 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useUrlMetadata } from '@liveblocks/react';
|
|
3
|
+
import { useMemo, useState, useCallback, memo, forwardRef, useRef, useEffect } from 'react';
|
|
4
|
+
import { useComponents } from '../../components.js';
|
|
3
5
|
import { ChevronRightIcon } from '../../icons/ChevronRight.js';
|
|
4
6
|
import { WarningIcon } from '../../icons/Warning.js';
|
|
5
7
|
import { useOverrides, OverridesProvider } from '../../overrides.js';
|
|
@@ -8,13 +10,103 @@ import { AiMessageToolInvocation } from '../../primitives/AiMessage/tool-invocat
|
|
|
8
10
|
import { Root as CollapsibleRoot, Trigger as CollapsibleTrigger, Content as CollapsibleContent } from '../../primitives/Collapsible/index.js';
|
|
9
11
|
import { cn } from '../../utils/cn.js';
|
|
10
12
|
import { ErrorBoundary } from '../../utils/ErrorBoundary.js';
|
|
13
|
+
import { Favicon } from './Favicon.js';
|
|
11
14
|
import { Prose } from './Prose.js';
|
|
12
15
|
|
|
16
|
+
function getUrlDomain(url) {
|
|
17
|
+
return new URL(url).hostname;
|
|
18
|
+
}
|
|
19
|
+
function AiChatSource({
|
|
20
|
+
source,
|
|
21
|
+
components,
|
|
22
|
+
className,
|
|
23
|
+
...props
|
|
24
|
+
}) {
|
|
25
|
+
const { Anchor } = useComponents(components);
|
|
26
|
+
const { metadata } = useUrlMetadata(source.url);
|
|
27
|
+
const label = useMemo(() => {
|
|
28
|
+
return source.title ?? metadata?.title ?? getUrlDomain(source.url);
|
|
29
|
+
}, [source.title, source.url, metadata?.title]);
|
|
30
|
+
return /* @__PURE__ */ jsxs(Anchor, {
|
|
31
|
+
href: source.url,
|
|
32
|
+
target: "_blank",
|
|
33
|
+
rel: "noopener noreferrer",
|
|
34
|
+
className: cn("lb-ai-chat-source", className),
|
|
35
|
+
...props,
|
|
36
|
+
children: [
|
|
37
|
+
/* @__PURE__ */ jsx(Favicon, {
|
|
38
|
+
url: source.url,
|
|
39
|
+
className: "lb-ai-chat-source-favicon"
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ jsx("span", {
|
|
42
|
+
className: "lb-ai-chat-source-label",
|
|
43
|
+
children: label
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function AiChatSources({
|
|
49
|
+
sources: allSources,
|
|
50
|
+
maxSources,
|
|
51
|
+
components,
|
|
52
|
+
className,
|
|
53
|
+
...props
|
|
54
|
+
}) {
|
|
55
|
+
const $ = useOverrides();
|
|
56
|
+
const [isOpen, setOpen] = useState(false);
|
|
57
|
+
const visibleSources = typeof maxSources === "number" && !isOpen ? allSources.slice(0, maxSources) : allSources;
|
|
58
|
+
const handleToggle = useCallback(() => {
|
|
59
|
+
setOpen((isOpen2) => !isOpen2);
|
|
60
|
+
}, []);
|
|
61
|
+
return /* @__PURE__ */ jsxs("ol", {
|
|
62
|
+
className: cn("lb-ai-chat-sources", className),
|
|
63
|
+
...props,
|
|
64
|
+
children: [
|
|
65
|
+
visibleSources.map((source, index) => {
|
|
66
|
+
return /* @__PURE__ */ jsx("li", {
|
|
67
|
+
children: /* @__PURE__ */ jsx(AiChatSource, {
|
|
68
|
+
source,
|
|
69
|
+
components
|
|
70
|
+
})
|
|
71
|
+
}, `${index}-${source.url}`);
|
|
72
|
+
}),
|
|
73
|
+
visibleSources.length !== allSources.length ? /* @__PURE__ */ jsx("li", {
|
|
74
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
75
|
+
className: "lb-ai-chat-sources-more",
|
|
76
|
+
onClick: handleToggle,
|
|
77
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
78
|
+
className: "lb-ai-chat-sources-more-label",
|
|
79
|
+
children: [
|
|
80
|
+
"+ ",
|
|
81
|
+
$.LIST_REMAINING(allSources.length - visibleSources.length)
|
|
82
|
+
]
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
}) : null
|
|
86
|
+
]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
13
89
|
const AiChatAssistantMessage = memo(
|
|
14
90
|
forwardRef(
|
|
15
|
-
({
|
|
91
|
+
({
|
|
92
|
+
message,
|
|
93
|
+
className,
|
|
94
|
+
overrides,
|
|
95
|
+
components,
|
|
96
|
+
showReasoning,
|
|
97
|
+
showRetrievals,
|
|
98
|
+
showSources,
|
|
99
|
+
...props
|
|
100
|
+
}, forwardedRef) => {
|
|
16
101
|
const $ = useOverrides(overrides);
|
|
17
102
|
let children = null;
|
|
103
|
+
const messageContent = /* @__PURE__ */ jsx(AssistantMessageContent, {
|
|
104
|
+
message,
|
|
105
|
+
components,
|
|
106
|
+
showReasoning,
|
|
107
|
+
showRetrievals,
|
|
108
|
+
showSources
|
|
109
|
+
});
|
|
18
110
|
if (message.deletedAt !== void 0) {
|
|
19
111
|
children = /* @__PURE__ */ jsx("div", {
|
|
20
112
|
className: "lb-ai-chat-message-deleted",
|
|
@@ -27,29 +119,17 @@ const AiChatAssistantMessage = memo(
|
|
|
27
119
|
children: $.AI_CHAT_MESSAGE_THINKING
|
|
28
120
|
});
|
|
29
121
|
} else {
|
|
30
|
-
children =
|
|
31
|
-
message,
|
|
32
|
-
components
|
|
33
|
-
});
|
|
122
|
+
children = messageContent;
|
|
34
123
|
}
|
|
35
124
|
} else if (message.status === "completed") {
|
|
36
|
-
children =
|
|
37
|
-
message,
|
|
38
|
-
components
|
|
39
|
-
});
|
|
125
|
+
children = messageContent;
|
|
40
126
|
} else if (message.status === "failed") {
|
|
41
127
|
if (message.errorReason === "Aborted by user") {
|
|
42
|
-
children =
|
|
43
|
-
message,
|
|
44
|
-
components
|
|
45
|
-
});
|
|
128
|
+
children = messageContent;
|
|
46
129
|
} else {
|
|
47
130
|
children = /* @__PURE__ */ jsxs(Fragment, {
|
|
48
131
|
children: [
|
|
49
|
-
|
|
50
|
-
message,
|
|
51
|
-
components
|
|
52
|
-
}),
|
|
132
|
+
messageContent,
|
|
53
133
|
/* @__PURE__ */ jsxs("div", {
|
|
54
134
|
className: "lb-ai-chat-message-error",
|
|
55
135
|
children: [
|
|
@@ -79,31 +159,62 @@ const AiChatAssistantMessage = memo(
|
|
|
79
159
|
}
|
|
80
160
|
)
|
|
81
161
|
);
|
|
162
|
+
const NoopComponent = () => null;
|
|
82
163
|
function AssistantMessageContent({
|
|
83
164
|
message,
|
|
84
|
-
components
|
|
165
|
+
components,
|
|
166
|
+
showReasoning = true,
|
|
167
|
+
showRetrievals = true,
|
|
168
|
+
showSources = true
|
|
85
169
|
}) {
|
|
86
|
-
const
|
|
170
|
+
const componentsRef = useRef(components);
|
|
171
|
+
let showKnowledgeRetrievals = typeof showRetrievals === "object" ? showRetrievals.knowledge : showRetrievals;
|
|
172
|
+
let showWebRetrievals = typeof showRetrievals === "object" ? showRetrievals.web : showRetrievals;
|
|
173
|
+
showKnowledgeRetrievals ??= true;
|
|
174
|
+
showWebRetrievals ??= true;
|
|
87
175
|
const BoundTextPart = useMemo(
|
|
88
176
|
() => (props) => /* @__PURE__ */ jsx(TextPart, {
|
|
89
177
|
...props,
|
|
90
|
-
components:
|
|
178
|
+
components: componentsRef.current
|
|
91
179
|
}),
|
|
92
180
|
[]
|
|
93
181
|
);
|
|
94
182
|
const BoundReasoningPart = useMemo(
|
|
95
|
-
() => (props) =>
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
183
|
+
() => (props) => {
|
|
184
|
+
if (!showReasoning || showReasoning === "during" && !props.isStreaming) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
return /* @__PURE__ */ jsx(ReasoningPart, {
|
|
188
|
+
...props,
|
|
189
|
+
components: componentsRef.current
|
|
190
|
+
});
|
|
191
|
+
},
|
|
192
|
+
[showReasoning]
|
|
193
|
+
);
|
|
194
|
+
const BoundRetrievalPart = useMemo(
|
|
195
|
+
() => (props) => {
|
|
196
|
+
if (props.part.kind === "knowledge") {
|
|
197
|
+
if (!showKnowledgeRetrievals || showKnowledgeRetrievals === "during" && !props.isStreaming) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
} else if (props.part.kind === "web") {
|
|
201
|
+
if (!showWebRetrievals || showWebRetrievals === "during" && !props.isStreaming) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return /* @__PURE__ */ jsx(RetrievalPart, {
|
|
206
|
+
...props
|
|
207
|
+
});
|
|
208
|
+
},
|
|
209
|
+
[showKnowledgeRetrievals, showWebRetrievals]
|
|
100
210
|
);
|
|
101
211
|
return /* @__PURE__ */ jsx(AiMessageContent, {
|
|
102
212
|
message,
|
|
103
213
|
components: {
|
|
104
214
|
TextPart: BoundTextPart,
|
|
105
215
|
ReasoningPart: BoundReasoningPart,
|
|
106
|
-
RetrievalPart,
|
|
216
|
+
RetrievalPart: BoundRetrievalPart,
|
|
217
|
+
SourcesPart: showSources ? SourcesPart : NoopComponent,
|
|
107
218
|
ToolInvocationPart
|
|
108
219
|
},
|
|
109
220
|
className: "lb-ai-chat-message-content"
|
|
@@ -154,14 +265,57 @@ function ReasoningPart({ part, isStreaming, components }) {
|
|
|
154
265
|
]
|
|
155
266
|
});
|
|
156
267
|
}
|
|
268
|
+
function RetrievalPartFavicons({
|
|
269
|
+
sources,
|
|
270
|
+
maxSources
|
|
271
|
+
}) {
|
|
272
|
+
if (!sources) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
const visibleSources = typeof maxSources === "number" ? sources.slice(0, maxSources) : sources;
|
|
276
|
+
return /* @__PURE__ */ jsx("div", {
|
|
277
|
+
className: "lb-ai-chat-message-retrieval-favicons",
|
|
278
|
+
children: visibleSources.map((source) => /* @__PURE__ */ jsx(Favicon, {
|
|
279
|
+
url: source.url
|
|
280
|
+
}, source.url))
|
|
281
|
+
});
|
|
282
|
+
}
|
|
157
283
|
function RetrievalPart({ part, isStreaming }) {
|
|
158
284
|
const $ = useOverrides();
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
285
|
+
let content = null;
|
|
286
|
+
if (part.kind === "web" && part.sources && part.sources.length > 0) {
|
|
287
|
+
content = /* @__PURE__ */ jsx(AiChatSources, {
|
|
288
|
+
className: "lb-ai-chat-message-retrieval-sources",
|
|
289
|
+
sources: part.sources
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return /* @__PURE__ */ jsxs(CollapsibleRoot, {
|
|
293
|
+
className: "lb-collapsible lb-ai-chat-message-retrieval",
|
|
294
|
+
defaultOpen: false,
|
|
295
|
+
disabled: !content,
|
|
296
|
+
children: [
|
|
297
|
+
/* @__PURE__ */ jsxs(CollapsibleTrigger, {
|
|
298
|
+
className: cn(
|
|
299
|
+
"lb-collapsible-trigger",
|
|
300
|
+
isStreaming && "lb-ai-chat-pending"
|
|
301
|
+
),
|
|
302
|
+
children: [
|
|
303
|
+
$.AI_CHAT_MESSAGE_RETRIEVAL(isStreaming, part),
|
|
304
|
+
part.kind === "web" ? /* @__PURE__ */ jsx(RetrievalPartFavicons, {
|
|
305
|
+
sources: part.sources,
|
|
306
|
+
maxSources: 3
|
|
307
|
+
}) : null,
|
|
308
|
+
content ? /* @__PURE__ */ jsx("span", {
|
|
309
|
+
className: "lb-collapsible-chevron lb-icon-container",
|
|
310
|
+
children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
|
|
311
|
+
}) : null
|
|
312
|
+
]
|
|
313
|
+
}),
|
|
314
|
+
content ? /* @__PURE__ */ jsx(CollapsibleContent, {
|
|
315
|
+
className: "lb-collapsible-content",
|
|
316
|
+
children: content
|
|
317
|
+
}) : null
|
|
318
|
+
]
|
|
165
319
|
});
|
|
166
320
|
}
|
|
167
321
|
function ToolInvocationPart({
|
|
@@ -196,6 +350,13 @@ function ToolInvocationPart({
|
|
|
196
350
|
})
|
|
197
351
|
});
|
|
198
352
|
}
|
|
353
|
+
function SourcesPart({ part }) {
|
|
354
|
+
return /* @__PURE__ */ jsx(AiChatSources, {
|
|
355
|
+
className: "lb-ai-chat-message-sources",
|
|
356
|
+
sources: part.sources,
|
|
357
|
+
maxSources: 5
|
|
358
|
+
});
|
|
359
|
+
}
|
|
199
360
|
|
|
200
361
|
export { AiChatAssistantMessage };
|
|
201
362
|
//# sourceMappingURL=AiChatAssistantMessage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChatAssistantMessage.js","sources":["../../../src/components/internal/AiChatAssistantMessage.tsx"],"sourcesContent":["import type { AiAssistantMessage, WithNavigation } from \"@liveblocks/core\";\nimport {\n type ComponentProps,\n forwardRef,\n memo,\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { type GlobalComponents } from \"../../components\";\nimport { ChevronRightIcon } from \"../../icons/ChevronRight\";\nimport { WarningIcon } from \"../../icons/Warning\";\nimport {\n type AiChatMessageOverrides,\n type GlobalOverrides,\n OverridesProvider,\n useOverrides,\n} from \"../../overrides\";\nimport * as AiMessage from \"../../primitives/AiMessage\";\nimport { AiMessageToolInvocation } from \"../../primitives/AiMessage/tool-invocation\";\nimport type {\n AiMessageContentReasoningPartProps,\n AiMessageContentRetrievalPartProps,\n AiMessageContentTextPartProps,\n AiMessageContentToolInvocationPartProps,\n} from \"../../primitives/AiMessage/types\";\nimport * as Collapsible from \"../../primitives/Collapsible\";\nimport type { MarkdownComponents } from \"../../primitives/Markdown\";\nimport { cn } from \"../../utils/cn\";\nimport { ErrorBoundary } from \"../../utils/ErrorBoundary\";\nimport { Prose } from \"./Prose\";\n\ntype UiAssistantMessage = WithNavigation<AiAssistantMessage>;\n\ntype AiChatAssistantMessageComponents = {\n /**\n * The components used to render Markdown content.\n */\n markdown?: Partial<MarkdownComponents>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatAssistantMessage\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatAssistantMessageProps extends ComponentProps<\"div\"> {\n /**\n * The message to display.\n */\n message: UiAssistantMessage;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n\n /**\n * Override the component's components.\n */\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface TextPartProps extends AiMessageContentTextPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface ReasoningPartProps extends AiMessageContentReasoningPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface RetrievalPartProps extends AiMessageContentRetrievalPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\nexport const AiChatAssistantMessage = memo(\n forwardRef<HTMLDivElement, AiChatAssistantMessageProps>(\n ({ message, className, overrides, components, ...props }, forwardedRef) => {\n const $ = useOverrides(overrides);\n\n let children: ReactNode = null;\n\n if (message.deletedAt !== undefined) {\n children = (\n <div className=\"lb-ai-chat-message-deleted\">\n {$.AI_CHAT_MESSAGE_DELETED}\n </div>\n );\n } else if (\n message.status === \"generating\" ||\n message.status === \"awaiting-tool\"\n ) {\n if (message.contentSoFar.length === 0) {\n children = (\n <div className=\"lb-ai-chat-message-thinking lb-ai-chat-pending\">\n {$.AI_CHAT_MESSAGE_THINKING}\n </div>\n );\n } else {\n children = (\n <AssistantMessageContent\n message={message}\n components={components}\n />\n );\n }\n } else if (message.status === \"completed\") {\n children = (\n <AssistantMessageContent message={message} components={components} />\n );\n } else if (message.status === \"failed\") {\n // Do not include the error message if the user aborted the request.\n if (message.errorReason === \"Aborted by user\") {\n children = (\n <AssistantMessageContent\n message={message}\n components={components}\n />\n );\n } else {\n children = (\n <>\n <AssistantMessageContent\n message={message}\n components={components}\n />\n\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n {message.errorReason}\n </div>\n </>\n );\n }\n }\n\n return (\n <div\n className={cn(\n \"lb-ai-chat-message lb-ai-chat-assistant-message\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n <OverridesProvider overrides={overrides}>\n {children}\n </OverridesProvider>\n </div>\n );\n }\n )\n);\n\nfunction AssistantMessageContent({\n message,\n components,\n}: {\n message: UiAssistantMessage;\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}) {\n const ref = useRef(components);\n const BoundTextPart = useMemo(\n () => (props: TextPartProps) => (\n <TextPart {...props} components={ref.current} />\n ),\n []\n );\n const BoundReasoningPart = useMemo(\n () => (props: ReasoningPartProps) => (\n <ReasoningPart {...props} components={ref.current} />\n ),\n []\n );\n return (\n <AiMessage.Content\n message={message}\n components={{\n TextPart: BoundTextPart,\n ReasoningPart: BoundReasoningPart,\n RetrievalPart,\n ToolInvocationPart,\n }}\n className=\"lb-ai-chat-message-content\"\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * TextPart\n * -----------------------------------------------------------------------------------------------*/\nfunction TextPart({ part, components, isStreaming }: TextPartProps) {\n return (\n <Prose\n content={part.text}\n className=\"lb-ai-chat-message-text\"\n components={components}\n partial={isStreaming}\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ReasoningPart({ part, isStreaming, components }: ReasoningPartProps) {\n // Start collapsed if reasoning is already done.\n const [isOpen, setIsOpen] = useState(isStreaming);\n const $ = useOverrides();\n\n // Auto-collapse when reasoning is done, while still allowing the user to\n // open/collapse it manually during and after it's done.\n useEffect(() => {\n if (!isStreaming) {\n setIsOpen(false);\n }\n }, [isStreaming]);\n\n return (\n <Collapsible.Root\n className=\"lb-collapsible lb-ai-chat-message-reasoning\"\n open={isOpen}\n onOpenChange={setIsOpen}\n >\n <Collapsible.Trigger\n className={cn(\n \"lb-collapsible-trigger\",\n isStreaming && \"lb-ai-chat-pending\"\n )}\n >\n {$.AI_CHAT_MESSAGE_REASONING(isStreaming, part)}\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n </Collapsible.Trigger>\n\n <Collapsible.Content className=\"lb-collapsible-content\">\n <Prose\n content={part.text}\n partial={isStreaming}\n components={components}\n />\n </Collapsible.Content>\n </Collapsible.Root>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * RetrievalPart\n * -----------------------------------------------------------------------------------------------*/\nfunction RetrievalPart({ part, isStreaming }: RetrievalPartProps) {\n const $ = useOverrides();\n\n return (\n <div\n className={cn(\n \"lb-ai-chat-message-retrieval\",\n isStreaming && \"lb-ai-chat-pending\"\n )}\n >\n {$.AI_CHAT_MESSAGE_RETRIEVAL(isStreaming, part)}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ToolInvocationPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ToolInvocationPart({\n part,\n message,\n}: AiMessageContentToolInvocationPartProps) {\n return (\n <div className=\"lb-ai-chat-message-tool-invocation\">\n <ErrorBoundary\n fallback={\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n <p>\n Failed to render tool call result for <code>{part.name}</code>.\n See console for details.\n </p>\n </div>\n }\n >\n <AiMessageToolInvocation part={part} message={message} />\n </ErrorBoundary>\n </div>\n );\n}\n"],"names":["AiMessage.Content","Collapsible.Root","Collapsible.Trigger","Collapsible.Content"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiChatAssistantMessage.js","sources":["../../../src/components/internal/AiChatAssistantMessage.tsx"],"sourcesContent":["import type {\n AiAssistantMessage,\n AiRetrievalPart,\n AiWebRetrievalPart,\n WithNavigation,\n} from \"@liveblocks/core\";\nimport { useUrlMetadata } from \"@liveblocks/react\";\nimport {\n type ComponentProps,\n forwardRef,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { type GlobalComponents, useComponents } from \"../../components\";\nimport { ChevronRightIcon } from \"../../icons/ChevronRight\";\nimport { WarningIcon } from \"../../icons/Warning\";\nimport {\n type AiChatMessageOverrides,\n type GlobalOverrides,\n OverridesProvider,\n useOverrides,\n} from \"../../overrides\";\nimport * as AiMessage from \"../../primitives/AiMessage\";\nimport { AiMessageToolInvocation } from \"../../primitives/AiMessage/tool-invocation\";\nimport type {\n AiMessageContentReasoningPartProps,\n AiMessageContentRetrievalPartProps,\n AiMessageContentSourcesPartProps,\n AiMessageContentTextPartProps,\n AiMessageContentToolInvocationPartProps,\n} from \"../../primitives/AiMessage/types\";\nimport * as Collapsible from \"../../primitives/Collapsible\";\nimport type { MarkdownComponents } from \"../../primitives/Markdown\";\nimport { cn } from \"../../utils/cn\";\nimport { ErrorBoundary } from \"../../utils/ErrorBoundary\";\nimport { Favicon } from \"./Favicon\";\nimport { Prose } from \"./Prose\";\n\ntype UiAssistantMessage = WithNavigation<AiAssistantMessage>;\n\ntype AiChatAssistantMessageComponents = {\n /**\n * The components used to render Markdown content.\n */\n markdown?: Partial<MarkdownComponents>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatAssistantMessage\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatAssistantMessageProps extends ComponentProps<\"div\"> {\n /**\n * The message to display.\n */\n message: UiAssistantMessage;\n\n /**\n * How to show or hide reasoning.\n */\n showReasoning?: boolean | \"during\";\n\n /**\n * How to show or hide retrievals.\n */\n showRetrievals?:\n | boolean\n | \"during\"\n | Record<AiRetrievalPart[\"kind\"], boolean | \"during\">;\n\n /**\n * Whether to show sources.\n */\n showSources?: boolean;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n\n /**\n * Override the component's components.\n */\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface TextPartProps extends AiMessageContentTextPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface ReasoningPartProps extends AiMessageContentReasoningPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface RetrievalPartProps extends AiMessageContentRetrievalPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface SourcesPartProps extends AiMessageContentSourcesPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface AiChatSourceProps extends ComponentProps<\"a\"> {\n source: { url: string; title?: string };\n components?: Partial<GlobalComponents>;\n}\n\ninterface AiChatSourcesProps extends ComponentProps<\"ol\"> {\n sources: AiChatSourceProps[\"source\"][];\n maxSources?: number;\n components?: Partial<GlobalComponents>;\n}\n\nfunction getUrlDomain(url: string) {\n return new URL(url).hostname;\n}\n\nfunction AiChatSource({\n source,\n components,\n className,\n ...props\n}: AiChatSourceProps) {\n const { Anchor } = useComponents(components);\n const { metadata } = useUrlMetadata(source.url);\n const label = useMemo(() => {\n return source.title ?? metadata?.title ?? getUrlDomain(source.url);\n }, [source.title, source.url, metadata?.title]);\n\n return (\n <Anchor\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"lb-ai-chat-source\", className)}\n {...props}\n >\n <Favicon url={source.url} className=\"lb-ai-chat-source-favicon\" />\n <span className=\"lb-ai-chat-source-label\">{label}</span>\n </Anchor>\n );\n}\n\nfunction AiChatSources({\n sources: allSources,\n maxSources,\n components,\n className,\n ...props\n}: AiChatSourcesProps) {\n const $ = useOverrides();\n const [isOpen, setOpen] = useState(false);\n const visibleSources =\n typeof maxSources === \"number\" && !isOpen\n ? allSources.slice(0, maxSources)\n : allSources;\n\n const handleToggle = useCallback(() => {\n setOpen((isOpen) => !isOpen);\n }, []);\n\n return (\n <ol className={cn(\"lb-ai-chat-sources\", className)} {...props}>\n {visibleSources.map((source, index) => {\n return (\n <li key={`${index}-${source.url}`}>\n <AiChatSource source={source} components={components} />\n </li>\n );\n })}\n\n {visibleSources.length !== allSources.length ? (\n <li>\n <button className=\"lb-ai-chat-sources-more\" onClick={handleToggle}>\n <span className=\"lb-ai-chat-sources-more-label\">\n + {$.LIST_REMAINING(allSources.length - visibleSources.length)}\n </span>\n </button>\n </li>\n ) : null}\n </ol>\n );\n}\n\nexport const AiChatAssistantMessage = memo(\n forwardRef<HTMLDivElement, AiChatAssistantMessageProps>(\n (\n {\n message,\n className,\n overrides,\n components,\n showReasoning,\n showRetrievals,\n showSources,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n\n let children: ReactNode = null;\n\n const messageContent = (\n <AssistantMessageContent\n message={message}\n components={components}\n showReasoning={showReasoning}\n showRetrievals={showRetrievals}\n showSources={showSources}\n />\n );\n\n if (message.deletedAt !== undefined) {\n children = (\n <div className=\"lb-ai-chat-message-deleted\">\n {$.AI_CHAT_MESSAGE_DELETED}\n </div>\n );\n } else if (\n message.status === \"generating\" ||\n message.status === \"awaiting-tool\"\n ) {\n if (message.contentSoFar.length === 0) {\n children = (\n <div className=\"lb-ai-chat-message-thinking lb-ai-chat-pending\">\n {$.AI_CHAT_MESSAGE_THINKING}\n </div>\n );\n } else {\n children = messageContent;\n }\n } else if (message.status === \"completed\") {\n children = messageContent;\n } else if (message.status === \"failed\") {\n // Do not include the error message if the user aborted the request.\n if (message.errorReason === \"Aborted by user\") {\n children = messageContent;\n } else {\n children = (\n <>\n {messageContent}\n\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n {message.errorReason}\n </div>\n </>\n );\n }\n }\n\n return (\n <div\n className={cn(\n \"lb-ai-chat-message lb-ai-chat-assistant-message\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n <OverridesProvider overrides={overrides}>\n {children}\n </OverridesProvider>\n </div>\n );\n }\n )\n);\n\nconst NoopComponent = () => null;\n\nfunction AssistantMessageContent({\n message,\n components,\n showReasoning = true,\n showRetrievals = true,\n showSources = true,\n}: {\n message: UiAssistantMessage;\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n showReasoning?: AiChatAssistantMessageProps[\"showReasoning\"];\n showRetrievals?: AiChatAssistantMessageProps[\"showRetrievals\"];\n showSources?: AiChatAssistantMessageProps[\"showSources\"];\n}) {\n const componentsRef = useRef(components);\n let showKnowledgeRetrievals =\n typeof showRetrievals === \"object\"\n ? showRetrievals.knowledge\n : showRetrievals;\n let showWebRetrievals =\n typeof showRetrievals === \"object\" ? showRetrievals.web : showRetrievals;\n\n // Both default to `true` if not specified, even with the object form (e.g. `{ web: \"during\" }`, `knowledge` is still `true`)\n showKnowledgeRetrievals ??= true;\n showWebRetrievals ??= true;\n\n const BoundTextPart = useMemo(\n () => (props: TextPartProps) => (\n <TextPart {...props} components={componentsRef.current} />\n ),\n []\n );\n const BoundReasoningPart = useMemo(\n () => (props: ReasoningPartProps) => {\n if (\n !showReasoning ||\n (showReasoning === \"during\" && !props.isStreaming)\n ) {\n return null;\n }\n\n return <ReasoningPart {...props} components={componentsRef.current} />;\n },\n [showReasoning]\n );\n const BoundRetrievalPart = useMemo(\n () => (props: RetrievalPartProps) => {\n if (props.part.kind === \"knowledge\") {\n if (\n !showKnowledgeRetrievals ||\n (showKnowledgeRetrievals === \"during\" && !props.isStreaming)\n ) {\n return null;\n }\n } else if (props.part.kind === \"web\") {\n if (\n !showWebRetrievals ||\n (showWebRetrievals === \"during\" && !props.isStreaming)\n ) {\n return null;\n }\n }\n\n return <RetrievalPart {...props} />;\n },\n [showKnowledgeRetrievals, showWebRetrievals]\n );\n\n return (\n <AiMessage.Content\n message={message}\n components={{\n TextPart: BoundTextPart,\n ReasoningPart: BoundReasoningPart,\n RetrievalPart: BoundRetrievalPart,\n SourcesPart: showSources ? SourcesPart : NoopComponent,\n ToolInvocationPart,\n }}\n className=\"lb-ai-chat-message-content\"\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * TextPart\n * -----------------------------------------------------------------------------------------------*/\nfunction TextPart({ part, components, isStreaming }: TextPartProps) {\n return (\n <Prose\n content={part.text}\n className=\"lb-ai-chat-message-text\"\n components={components}\n partial={isStreaming}\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ReasoningPart({ part, isStreaming, components }: ReasoningPartProps) {\n // Start collapsed if reasoning is already done.\n const [isOpen, setIsOpen] = useState(isStreaming);\n const $ = useOverrides();\n\n // Auto-collapse when reasoning is done, while still allowing the user to\n // open/collapse it manually during and after it's done.\n useEffect(() => {\n if (!isStreaming) {\n setIsOpen(false);\n }\n }, [isStreaming]);\n\n return (\n <Collapsible.Root\n className=\"lb-collapsible lb-ai-chat-message-reasoning\"\n open={isOpen}\n onOpenChange={setIsOpen}\n >\n <Collapsible.Trigger\n className={cn(\n \"lb-collapsible-trigger\",\n isStreaming && \"lb-ai-chat-pending\"\n )}\n >\n {$.AI_CHAT_MESSAGE_REASONING(isStreaming, part)}\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n </Collapsible.Trigger>\n\n <Collapsible.Content className=\"lb-collapsible-content\">\n <Prose\n content={part.text}\n partial={isStreaming}\n components={components}\n />\n </Collapsible.Content>\n </Collapsible.Root>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * RetrievalPart\n * -----------------------------------------------------------------------------------------------*/\nfunction RetrievalPartFavicons({\n sources,\n maxSources,\n}: {\n sources: AiWebRetrievalPart[\"sources\"];\n maxSources?: number;\n}) {\n if (!sources) {\n return null;\n }\n\n const visibleSources =\n typeof maxSources === \"number\" ? sources.slice(0, maxSources) : sources;\n\n return (\n <div className=\"lb-ai-chat-message-retrieval-favicons\">\n {visibleSources.map((source) => (\n <Favicon key={source.url} url={source.url} />\n ))}\n </div>\n );\n}\n\nfunction RetrievalPart({ part, isStreaming }: RetrievalPartProps) {\n const $ = useOverrides();\n let content: ReactNode = null;\n\n if (part.kind === \"web\" && part.sources && part.sources.length > 0) {\n content = (\n <AiChatSources\n className=\"lb-ai-chat-message-retrieval-sources\"\n sources={part.sources}\n />\n );\n }\n\n return (\n <Collapsible.Root\n className=\"lb-collapsible lb-ai-chat-message-retrieval\"\n defaultOpen={false}\n disabled={!content}\n >\n <Collapsible.Trigger\n className={cn(\n \"lb-collapsible-trigger\",\n isStreaming && \"lb-ai-chat-pending\"\n )}\n >\n {$.AI_CHAT_MESSAGE_RETRIEVAL(isStreaming, part)}\n {part.kind === \"web\" ? (\n <RetrievalPartFavicons sources={part.sources} maxSources={3} />\n ) : null}\n {content ? (\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n ) : null}\n </Collapsible.Trigger>\n\n {content ? (\n <Collapsible.Content className=\"lb-collapsible-content\">\n {content}\n </Collapsible.Content>\n ) : null}\n </Collapsible.Root>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ToolInvocationPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ToolInvocationPart({\n part,\n message,\n}: AiMessageContentToolInvocationPartProps) {\n return (\n <div className=\"lb-ai-chat-message-tool-invocation\">\n <ErrorBoundary\n fallback={\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n <p>\n Failed to render tool call result for <code>{part.name}</code>.\n See console for details.\n </p>\n </div>\n }\n >\n <AiMessageToolInvocation part={part} message={message} />\n </ErrorBoundary>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * SourcesPart\n * -----------------------------------------------------------------------------------------------*/\nfunction SourcesPart({ part }: SourcesPartProps) {\n return (\n <AiChatSources\n className=\"lb-ai-chat-message-sources\"\n sources={part.sources}\n maxSources={5}\n />\n );\n}\n"],"names":["isOpen","AiMessage.Content","Collapsible.Root","Collapsible.Trigger","Collapsible.Content"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var react = require('@liveblocks/react');
|
|
6
|
+
require('../../icons/index.cjs');
|
|
7
|
+
var cn = require('../../utils/cn.cjs');
|
|
8
|
+
var Globe = require('../../icons/Globe.cjs');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
function Favicon({ url, className, ...props }) {
|
|
12
|
+
const { metadata } = react.useUrlMetadata(url);
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", {
|
|
14
|
+
className: cn.cn("lb-favicon", className),
|
|
15
|
+
...props,
|
|
16
|
+
children: metadata?.icon ? /* @__PURE__ */ jsxRuntime.jsx("img", {
|
|
17
|
+
src: metadata?.icon,
|
|
18
|
+
alt: metadata?.title
|
|
19
|
+
}) : /* @__PURE__ */ jsxRuntime.jsx(Globe.GlobeIcon, {
|
|
20
|
+
className: "lb-favicon-fallback"
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
exports.Favicon = Favicon;
|
|
26
|
+
//# sourceMappingURL=Favicon.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Favicon.cjs","sources":["../../../src/components/internal/Favicon.tsx"],"sourcesContent":["\"use client\";\n\nimport { useUrlMetadata } from \"@liveblocks/react\";\nimport { type ComponentProps } from \"react\";\n\nimport { GlobeIcon } from \"../../icons\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FaviconProps extends ComponentProps<\"div\"> {\n url: string;\n}\n\nexport function Favicon({ url, className, ...props }: FaviconProps) {\n const { metadata } = useUrlMetadata(url);\n\n return (\n <div className={cn(\"lb-favicon\", className)} {...props}>\n {metadata?.icon ? (\n <img src={metadata?.icon} alt={metadata?.title} />\n ) : (\n <GlobeIcon className=\"lb-favicon-fallback\" />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAYO;AACL;AAEA;AACG;AAAyC;AAAO;AAE5C;AAAmB;AAAqB;AAExC;AAAoB;AAAsB;AAInD;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useUrlMetadata } from '@liveblocks/react';
|
|
4
|
+
import '../../icons/index.js';
|
|
5
|
+
import { cn } from '../../utils/cn.js';
|
|
6
|
+
import { GlobeIcon } from '../../icons/Globe.js';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
function Favicon({ url, className, ...props }) {
|
|
10
|
+
const { metadata } = useUrlMetadata(url);
|
|
11
|
+
return /* @__PURE__ */ jsx("div", {
|
|
12
|
+
className: cn("lb-favicon", className),
|
|
13
|
+
...props,
|
|
14
|
+
children: metadata?.icon ? /* @__PURE__ */ jsx("img", {
|
|
15
|
+
src: metadata?.icon,
|
|
16
|
+
alt: metadata?.title
|
|
17
|
+
}) : /* @__PURE__ */ jsx(GlobeIcon, {
|
|
18
|
+
className: "lb-favicon-fallback"
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { Favicon };
|
|
24
|
+
//# sourceMappingURL=Favicon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Favicon.js","sources":["../../../src/components/internal/Favicon.tsx"],"sourcesContent":["\"use client\";\n\nimport { useUrlMetadata } from \"@liveblocks/react\";\nimport { type ComponentProps } from \"react\";\n\nimport { GlobeIcon } from \"../../icons\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface FaviconProps extends ComponentProps<\"div\"> {\n url: string;\n}\n\nexport function Favicon({ url, className, ...props }: FaviconProps) {\n const { metadata } = useUrlMetadata(url);\n\n return (\n <div className={cn(\"lb-favicon\", className)} {...props}>\n {metadata?.icon ? (\n <img src={metadata?.icon} alt={metadata?.title} />\n ) : (\n <GlobeIcon className=\"lb-favicon-fallback\" />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAYO;AACL;AAEA;AACG;AAAyC;AAAO;AAE5C;AAAmB;AAAqB;AAExC;AAAoB;AAAsB;AAInD;;"}
|
package/dist/icon.cjs
CHANGED
|
@@ -23,6 +23,7 @@ var Cross = require('./icons/Cross.cjs');
|
|
|
23
23
|
var Ellipsis = require('./icons/Ellipsis.cjs');
|
|
24
24
|
var Emoji = require('./icons/Emoji.cjs');
|
|
25
25
|
var EmojiPlus = require('./icons/EmojiPlus.cjs');
|
|
26
|
+
var Globe = require('./icons/Globe.cjs');
|
|
26
27
|
var H1 = require('./icons/H1.cjs');
|
|
27
28
|
var H2 = require('./icons/H2.cjs');
|
|
28
29
|
var H3 = require('./icons/H3.cjs');
|
|
@@ -73,6 +74,7 @@ exports.Cross = Cross.CrossIcon;
|
|
|
73
74
|
exports.Ellipsis = Ellipsis.EllipsisIcon;
|
|
74
75
|
exports.Emoji = Emoji.EmojiIcon;
|
|
75
76
|
exports.EmojiPlus = EmojiPlus.EmojiPlusIcon;
|
|
77
|
+
exports.Globe = Globe.GlobeIcon;
|
|
76
78
|
exports.H1 = H1.H1Icon;
|
|
77
79
|
exports.H2 = H2.H2Icon;
|
|
78
80
|
exports.H3 = H3.H3Icon;
|
package/dist/icon.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"icon.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/icon.js
CHANGED
|
@@ -21,6 +21,7 @@ export { CrossIcon as Cross } from './icons/Cross.js';
|
|
|
21
21
|
export { EllipsisIcon as Ellipsis } from './icons/Ellipsis.js';
|
|
22
22
|
export { EmojiIcon as Emoji } from './icons/Emoji.js';
|
|
23
23
|
export { EmojiPlusIcon as EmojiPlus } from './icons/EmojiPlus.js';
|
|
24
|
+
export { GlobeIcon as Globe } from './icons/Globe.js';
|
|
24
25
|
export { H1Icon as H1 } from './icons/H1.js';
|
|
25
26
|
export { H2Icon as H2 } from './icons/H2.js';
|
|
26
27
|
export { H3Icon as H3 } from './icons/H3.js';
|
package/dist/icon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"icon.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var Icon = require('../components/internal/Icon.cjs');
|
|
5
|
+
|
|
6
|
+
function GlobeIcon(props) {
|
|
7
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Icon.Icon, {
|
|
8
|
+
...props,
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", {
|
|
11
|
+
cx: 10,
|
|
12
|
+
cy: 10,
|
|
13
|
+
r: 7
|
|
14
|
+
}),
|
|
15
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", {
|
|
16
|
+
d: "M3 10h14M10 3s-3 3-3 7 3 7 3 7M10 3s3 3 3 7-3 7-3 7"
|
|
17
|
+
})
|
|
18
|
+
]
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
exports.GlobeIcon = GlobeIcon;
|
|
23
|
+
//# sourceMappingURL=Globe.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Globe.cjs","sources":["../../src/icons/Globe.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\n\nimport { Icon } from \"../components/internal/Icon\";\n\nexport function GlobeIcon(props: ComponentProps<\"svg\">) {\n return (\n <Icon {...props}>\n <circle cx={10} cy={10} r={7} />\n <path d=\"M3 10h14M10 3s-3 3-3 7 3 7 3 7M10 3s3 3 3 7-3 7-3 7\" />\n </Icon>\n );\n}\n"],"names":["jsxs","Icon","jsx"],"mappings":";;;;;AAIO,SAAS,UAAU,KAA8B,EAAA;AACtD,EAAA,uBACGA,eAAA,CAAAC,SAAA,EAAA;AAAA,IAAM,GAAG,KAAA;AAAA,IACR,QAAA,EAAA;AAAA,sBAACC,cAAA,CAAA,QAAA,EAAA;AAAA,QAAO,EAAI,EAAA,EAAA;AAAA,QAAI,EAAI,EAAA,EAAA;AAAA,QAAI,CAAG,EAAA,CAAA;AAAA,OAAG,CAAA;AAAA,sBAC7BA,cAAA,CAAA,MAAA,EAAA;AAAA,QAAK,CAAE,EAAA,qDAAA;AAAA,OAAsD,CAAA;AAAA,KAAA;AAAA,GAChE,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Icon } from '../components/internal/Icon.js';
|
|
3
|
+
|
|
4
|
+
function GlobeIcon(props) {
|
|
5
|
+
return /* @__PURE__ */ jsxs(Icon, {
|
|
6
|
+
...props,
|
|
7
|
+
children: [
|
|
8
|
+
/* @__PURE__ */ jsx("circle", {
|
|
9
|
+
cx: 10,
|
|
10
|
+
cy: 10,
|
|
11
|
+
r: 7
|
|
12
|
+
}),
|
|
13
|
+
/* @__PURE__ */ jsx("path", {
|
|
14
|
+
d: "M3 10h14M10 3s-3 3-3 7 3 7 3 7M10 3s3 3 3 7-3 7-3 7"
|
|
15
|
+
})
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { GlobeIcon };
|
|
21
|
+
//# sourceMappingURL=Globe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Globe.js","sources":["../../src/icons/Globe.tsx"],"sourcesContent":["import type { ComponentProps } from \"react\";\n\nimport { Icon } from \"../components/internal/Icon\";\n\nexport function GlobeIcon(props: ComponentProps<\"svg\">) {\n return (\n <Icon {...props}>\n <circle cx={10} cy={10} r={7} />\n <path d=\"M3 10h14M10 3s-3 3-3 7 3 7 3 7M10 3s3 3 3 7-3 7-3 7\" />\n </Icon>\n );\n}\n"],"names":[],"mappings":";;;AAIO,SAAS,UAAU,KAA8B,EAAA;AACtD,EAAA,uBACG,IAAA,CAAA,IAAA,EAAA;AAAA,IAAM,GAAG,KAAA;AAAA,IACR,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,QAAA,EAAA;AAAA,QAAO,EAAI,EAAA,EAAA;AAAA,QAAI,EAAI,EAAA,EAAA;AAAA,QAAI,CAAG,EAAA,CAAA;AAAA,OAAG,CAAA;AAAA,sBAC7B,GAAA,CAAA,MAAA,EAAA;AAAA,QAAK,CAAE,EAAA,qDAAA;AAAA,OAAsD,CAAA;AAAA,KAAA;AAAA,GAChE,CAAA,CAAA;AAEJ;;;;"}
|
package/dist/icons/index.cjs
CHANGED
|
@@ -26,6 +26,7 @@ var Edit = require('./Edit.cjs');
|
|
|
26
26
|
var Ellipsis = require('./Ellipsis.cjs');
|
|
27
27
|
var Emoji = require('./Emoji.cjs');
|
|
28
28
|
var EmojiPlus = require('./EmojiPlus.cjs');
|
|
29
|
+
var Globe = require('./Globe.cjs');
|
|
29
30
|
var H1 = require('./H1.cjs');
|
|
30
31
|
var H2 = require('./H2.cjs');
|
|
31
32
|
var H3 = require('./H3.cjs');
|
|
@@ -83,6 +84,7 @@ exports.EditIcon = Edit.EditIcon;
|
|
|
83
84
|
exports.EllipsisIcon = Ellipsis.EllipsisIcon;
|
|
84
85
|
exports.EmojiIcon = Emoji.EmojiIcon;
|
|
85
86
|
exports.EmojiPlusIcon = EmojiPlus.EmojiPlusIcon;
|
|
87
|
+
exports.GlobeIcon = Globe.GlobeIcon;
|
|
86
88
|
exports.H1Icon = H1.H1Icon;
|
|
87
89
|
exports.H2Icon = H2.H2Icon;
|
|
88
90
|
exports.H3Icon = H3.H3Icon;
|
package/dist/icons/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/icons/index.js
CHANGED
|
@@ -24,6 +24,7 @@ export { EditIcon } from './Edit.js';
|
|
|
24
24
|
export { EllipsisIcon } from './Ellipsis.js';
|
|
25
25
|
export { EmojiIcon } from './Emoji.js';
|
|
26
26
|
export { EmojiPlusIcon } from './EmojiPlus.js';
|
|
27
|
+
export { GlobeIcon } from './Globe.js';
|
|
27
28
|
export { H1Icon } from './H1.js';
|
|
28
29
|
export { H2Icon } from './H2.js';
|
|
29
30
|
export { H3Icon } from './H3.js';
|
package/dist/icons/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|