@servicetitan/titan-chat-ui-anvil2 4.2.0 → 4.3.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/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # v4.3.0 (Wed Oct 08 2025)
2
+
3
+ #### 🚀 Enhancement
4
+
5
+ - SPA-7396: Updated API contract. Improved markdown rendering. Exposed markdown text component [#63](https://github.com/servicetitan/titan-chatbot-client/pull/63) ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
6
+
7
+ #### Authors: 1
8
+
9
+ - Alexandr Yarmolchuk ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
10
+
11
+ ---
12
+
1
13
  # v4.0.0 (Fri Sep 19 2025)
2
14
 
3
15
  #### 💥 Breaking Change
@@ -0,0 +1,8 @@
1
+ import { TextProps } from '@servicetitan/anvil2';
2
+ import { FC } from 'react';
3
+ type MarkdownTextProps = TextProps & {
4
+ text: string;
5
+ };
6
+ export declare const MarkdownText: FC<MarkdownTextProps>;
7
+ export {};
8
+ //# sourceMappingURL=markdown-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/components/common/markdown-text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,EAAE,EAAsB,MAAM,OAAO,CAAC;AAQ/C,KAAK,iBAAiB,GAAG,SAAS,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAuF9C,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Link, Text } from '@servicetitan/anvil2';
3
+ import classNames from 'classnames';
4
+ import DOMpurify from 'dompurify';
5
+ import { useMemo } from 'react';
6
+ import Markdown from 'react-markdown';
7
+ import rehypeRaw from 'rehype-raw';
8
+ import remarkGfm from 'remark-gfm';
9
+ import * as Styles from './markdown-text.module.less';
10
+ export const MarkdownText = ({ className, text, ...rest }) => {
11
+ const markdownComponents = useMemo(() => ({
12
+ code({ children }) {
13
+ return (_jsx(Text, { variant: "body", className: "c-primary bg-stronger border-radius-small", style: { fontFamily: 'monospace', fontSize: '0.85em' }, inline: true, children: children }));
14
+ },
15
+ u({ children }) {
16
+ return _jsx("u", { children: children });
17
+ },
18
+ a({ children, href }) {
19
+ return (_jsx(Link, { href: href, target: "_blank", appearance: "primary", rel: "noopener noreferrer", children: children }));
20
+ },
21
+ h1({ children }) {
22
+ return (_jsx(Text, { variant: "headline", el: "h1", size: "xlarge", children: children }));
23
+ },
24
+ h2({ children }) {
25
+ return (_jsx(Text, { variant: "headline", el: "h2", size: "large", children: children }));
26
+ },
27
+ h3({ children }) {
28
+ return (_jsx(Text, { variant: "headline", el: "h3", size: "medium", children: children }));
29
+ },
30
+ h4({ children }) {
31
+ return (_jsx(Text, { variant: "headline", el: "h4", size: "small", children: children }));
32
+ },
33
+ h5({ children }) {
34
+ return (_jsx(Text, { variant: "headline", el: "h5", size: "small", children: children }));
35
+ },
36
+ h6({ children }) {
37
+ return (_jsx(Text, { variant: "headline", el: "h6", size: "small", children: children }));
38
+ },
39
+ }), []);
40
+ return (_jsx(Text, { variant: "body", className: classNames(Styles.content, className), ...rest, children: _jsx(Markdown, { components: markdownComponents, rehypePlugins: [rehypeRaw], remarkPlugins: [remarkGfm], children: DOMpurify.sanitize(text) }) }));
41
+ };
42
+ //# sourceMappingURL=markdown-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-text.js","sourceRoot":"","sources":["../../../src/components/common/markdown-text.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-content-text.d.ts","sourceRoot":"","sources":["../../../src/components/message-content/message-content-text.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAInG,OAAO,EAAE,EAAE,EAAsB,MAAM,OAAO,CAAC;AAM/C,UAAU,wBAAwB;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,GAAG,uBAAuB,CAAC;IACxD,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,wBAAwB,CA0F3D,CAAC"}
1
+ {"version":3,"file":"message-content-text.d.ts","sourceRoot":"","sources":["../../../src/components/message-content/message-content-text.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAEnG,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAG3B,UAAU,wBAAwB;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,GAAG,uBAAuB,CAAC;IACxD,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,wBAAwB,CAK3D,CAAC"}
@@ -1,45 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Link, Text } from '@servicetitan/anvil2';
3
- import classNames from 'classnames';
4
- import DOMpurify from 'dompurify';
5
2
  import { observer } from 'mobx-react';
6
- import { useMemo } from 'react';
7
- import Markdown from 'react-markdown';
8
- import rehypeRaw from 'rehype-raw';
9
- import remarkGfm from 'remark-gfm';
10
- import * as Styles from './message-content-text.module.less';
3
+ import { MarkdownText } from '../common/markdown-text';
11
4
  export const MessageContentText = observer(({ className, message, ...rest }) => {
12
5
  var _a;
13
6
  const dataCy = (_a = rest['data-cy']) !== null && _a !== void 0 ? _a : 'titan-chat-text';
14
- const markdownComponents = useMemo(() => ({
15
- code({ children }) {
16
- return (_jsx(Text, { variant: "body", className: "c-primary bg-stronger border-radius-small", style: { fontFamily: 'monospace', fontSize: '0.85em' }, inline: true, children: children }));
17
- },
18
- u({ children }) {
19
- return _jsx("u", { children: children });
20
- },
21
- a({ children, href }) {
22
- return (_jsx(Link, { href: href, target: "_blank", appearance: "primary", rel: "noopener noreferrer", children: children }));
23
- },
24
- h1({ children }) {
25
- return (_jsx(Text, { variant: "headline", el: "h1", size: "xlarge", children: children }));
26
- },
27
- h2({ children }) {
28
- return (_jsx(Text, { variant: "headline", el: "h2", size: "large", children: children }));
29
- },
30
- h3({ children }) {
31
- return (_jsx(Text, { variant: "headline", el: "h3", size: "medium", children: children }));
32
- },
33
- h4({ children }) {
34
- return (_jsx(Text, { variant: "headline", el: "h4", size: "small", children: children }));
35
- },
36
- h5({ children }) {
37
- return (_jsx(Text, { variant: "headline", el: "h5", size: "small", children: children }));
38
- },
39
- h6({ children }) {
40
- return (_jsx(Text, { variant: "headline", el: "h6", size: "small", children: children }));
41
- },
42
- }), []);
43
- return (_jsx(Text, { variant: "body", className: classNames(Styles.content, className), "data-cy": dataCy, children: _jsx(Markdown, { components: markdownComponents, rehypePlugins: [rehypeRaw], remarkPlugins: [remarkGfm], children: DOMpurify.sanitize(message.message) }) }));
7
+ return _jsx(MarkdownText, { className: className, text: message.message, "data-cy": dataCy });
44
8
  });
45
9
  //# sourceMappingURL=message-content-text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-content-text.js","sourceRoot":"","sources":["../../../src/components/message-content/message-content-text.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-content-text.js","sourceRoot":"","sources":["../../../src/components/message-content/message-content-text.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAQvD,MAAM,CAAC,MAAM,kBAAkB,GAAiC,QAAQ,CACpE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;;IAChC,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,mCAAI,iBAAiB,CAAC;IACpD,OAAO,KAAC,YAAY,IAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,aAAW,MAAM,GAAI,CAAC;AAC1F,CAAC,CACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export { MessageAvatar, IMessageAvatarProps } from './components/messages/messag
10
10
  export { MessageFooter, IMessageFooterProps } from './components/messages/message-footer';
11
11
  export { useAvatarProps } from './components/messages/use-avatar-props';
12
12
  export { MultilineText } from './components/common/multiline-text';
13
+ export { MarkdownText } from './components/common/markdown-text';
13
14
  export { MessageContentText } from './components/message-content/message-content-text';
14
15
  export { ChatInputStore } from './stores/chat-input.store';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ export { MessageAvatar } from './components/messages/message-avatar';
10
10
  export { MessageFooter } from './components/messages/message-footer';
11
11
  export { useAvatarProps } from './components/messages/use-avatar-props';
12
12
  export { MultilineText } from './components/common/multiline-text';
13
+ export { MarkdownText } from './components/common/markdown-text';
13
14
  export { MessageContentText } from './components/message-content/message-content-text';
14
15
  export { ChatInputStore } from './stores/chat-input.store';
15
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAc,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAsB,MAAM,qCAAqC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAqB,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAwB,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAc,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAsB,MAAM,qCAAqC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAqB,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAwB,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAuB,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/titan-chat-ui-anvil2",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "description": "Chat experience UI package (Anvil2 version)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,7 +17,7 @@
17
17
  "push:local": "yalc push"
18
18
  },
19
19
  "dependencies": {
20
- "@servicetitan/titan-chat-ui-common": "^4.2.0",
20
+ "@servicetitan/titan-chat-ui-common": "^4.3.0",
21
21
  "dompurify": "^3.2.6",
22
22
  "lodash": "4.17.21",
23
23
  "nanoid": "^5.1.5",
@@ -38,7 +38,7 @@
38
38
  "react-dom": ">=18"
39
39
  },
40
40
  "devDependencies": {
41
- "@servicetitan/cypress-shared": "^4.2.0",
41
+ "@servicetitan/cypress-shared": "^4.3.0",
42
42
  "cypress": "^15.2.0"
43
43
  },
44
44
  "keywords": [
@@ -51,5 +51,5 @@
51
51
  "cli": {
52
52
  "webpack": false
53
53
  },
54
- "gitHead": "165f0a686b7a040223f6a0928b10d1d8cf6033e6"
54
+ "gitHead": "640e7253dc9fa5135ca7c330391989d4e3d06374"
55
55
  }
@@ -0,0 +1,103 @@
1
+ import { Link, Text, TextProps } from '@servicetitan/anvil2';
2
+ import classNames from 'classnames';
3
+ import DOMpurify from 'dompurify';
4
+ import { FC, ReactNode, useMemo } from 'react';
5
+ import Markdown, { Components } from 'react-markdown';
6
+ import rehypeRaw from 'rehype-raw';
7
+ import remarkGfm from 'remark-gfm';
8
+ import * as Styles from './markdown-text.module.less';
9
+
10
+ type Node = { children: ReactNode } & { [key: string]: any };
11
+
12
+ type MarkdownTextProps = TextProps & {
13
+ text: string;
14
+ };
15
+
16
+ export const MarkdownText: FC<MarkdownTextProps> = ({ className, text, ...rest }) => {
17
+ const markdownComponents: Components = useMemo(
18
+ () => ({
19
+ code({ children }: Node) {
20
+ return (
21
+ <Text
22
+ variant="body"
23
+ className="c-primary bg-stronger border-radius-small"
24
+ style={{ fontFamily: 'monospace', fontSize: '0.85em' }}
25
+ inline
26
+ >
27
+ {children}
28
+ </Text>
29
+ );
30
+ },
31
+ u({ children }: Node) {
32
+ return <u>{children}</u>;
33
+ },
34
+ a({ children, href }: Node & { href?: string }) {
35
+ return (
36
+ <Link
37
+ href={href}
38
+ target="_blank"
39
+ appearance="primary"
40
+ rel="noopener noreferrer"
41
+ >
42
+ {children}
43
+ </Link>
44
+ );
45
+ },
46
+ h1({ children }: Node) {
47
+ return (
48
+ <Text variant="headline" el="h1" size="xlarge">
49
+ {children}
50
+ </Text>
51
+ );
52
+ },
53
+ h2({ children }: Node) {
54
+ return (
55
+ <Text variant="headline" el="h2" size="large">
56
+ {children}
57
+ </Text>
58
+ );
59
+ },
60
+ h3({ children }: Node) {
61
+ return (
62
+ <Text variant="headline" el="h3" size="medium">
63
+ {children}
64
+ </Text>
65
+ );
66
+ },
67
+ h4({ children }: Node) {
68
+ return (
69
+ <Text variant="headline" el="h4" size="small">
70
+ {children}
71
+ </Text>
72
+ );
73
+ },
74
+ h5({ children }: Node) {
75
+ return (
76
+ <Text variant="headline" el="h5" size="small">
77
+ {children}
78
+ </Text>
79
+ );
80
+ },
81
+ h6({ children }: Node) {
82
+ return (
83
+ <Text variant="headline" el="h6" size="small">
84
+ {children}
85
+ </Text>
86
+ );
87
+ },
88
+ }),
89
+ []
90
+ );
91
+
92
+ return (
93
+ <Text variant="body" className={classNames(Styles.content, className)} {...rest}>
94
+ <Markdown
95
+ components={markdownComponents}
96
+ rehypePlugins={[rehypeRaw]}
97
+ remarkPlugins={[remarkGfm]}
98
+ >
99
+ {DOMpurify.sanitize(text)}
100
+ </Markdown>
101
+ </Text>
102
+ );
103
+ };
@@ -1,13 +1,7 @@
1
- import { Link, Text } from '@servicetitan/anvil2';
2
1
  import { ChatMessageModelText, ChatMessageModelWelcome } from '@servicetitan/titan-chat-ui-common';
3
- import classNames from 'classnames';
4
- import DOMpurify from 'dompurify';
5
2
  import { observer } from 'mobx-react';
6
- import { FC, ReactNode, useMemo } from 'react';
7
- import Markdown, { Components } from 'react-markdown';
8
- import rehypeRaw from 'rehype-raw';
9
- import remarkGfm from 'remark-gfm';
10
- import * as Styles from './message-content-text.module.less';
3
+ import { FC } from 'react';
4
+ import { MarkdownText } from '../common/markdown-text';
11
5
 
12
6
  interface IMessageContentTextProps {
13
7
  className?: string;
@@ -15,96 +9,9 @@ interface IMessageContentTextProps {
15
9
  ['data-cy']?: string;
16
10
  }
17
11
 
18
- type Node = { children: ReactNode } & { [key: string]: any };
19
-
20
12
  export const MessageContentText: FC<IMessageContentTextProps> = observer(
21
13
  ({ className, message, ...rest }) => {
22
14
  const dataCy = rest['data-cy'] ?? 'titan-chat-text';
23
- const markdownComponents: Components = useMemo(
24
- () => ({
25
- code({ children }: Node) {
26
- return (
27
- <Text
28
- variant="body"
29
- className="c-primary bg-stronger border-radius-small"
30
- style={{ fontFamily: 'monospace', fontSize: '0.85em' }}
31
- inline
32
- >
33
- {children}
34
- </Text>
35
- );
36
- },
37
- u({ children }: Node) {
38
- return <u>{children}</u>;
39
- },
40
- a({ children, href }: Node & { href?: string }) {
41
- return (
42
- <Link
43
- href={href}
44
- target="_blank"
45
- appearance="primary"
46
- rel="noopener noreferrer"
47
- >
48
- {children}
49
- </Link>
50
- );
51
- },
52
- h1({ children }: Node) {
53
- return (
54
- <Text variant="headline" el="h1" size="xlarge">
55
- {children}
56
- </Text>
57
- );
58
- },
59
- h2({ children }: Node) {
60
- return (
61
- <Text variant="headline" el="h2" size="large">
62
- {children}
63
- </Text>
64
- );
65
- },
66
- h3({ children }: Node) {
67
- return (
68
- <Text variant="headline" el="h3" size="medium">
69
- {children}
70
- </Text>
71
- );
72
- },
73
- h4({ children }: Node) {
74
- return (
75
- <Text variant="headline" el="h4" size="small">
76
- {children}
77
- </Text>
78
- );
79
- },
80
- h5({ children }: Node) {
81
- return (
82
- <Text variant="headline" el="h5" size="small">
83
- {children}
84
- </Text>
85
- );
86
- },
87
- h6({ children }: Node) {
88
- return (
89
- <Text variant="headline" el="h6" size="small">
90
- {children}
91
- </Text>
92
- );
93
- },
94
- }),
95
- []
96
- );
97
-
98
- return (
99
- <Text variant="body" className={classNames(Styles.content, className)} data-cy={dataCy}>
100
- <Markdown
101
- components={markdownComponents}
102
- rehypePlugins={[rehypeRaw]}
103
- remarkPlugins={[remarkGfm]}
104
- >
105
- {DOMpurify.sanitize(message.message)}
106
- </Markdown>
107
- </Text>
108
- );
15
+ return <MarkdownText className={className} text={message.message} data-cy={dataCy} />;
109
16
  }
110
17
  );
package/src/index.ts CHANGED
@@ -10,5 +10,6 @@ export { MessageAvatar, IMessageAvatarProps } from './components/messages/messag
10
10
  export { MessageFooter, IMessageFooterProps } from './components/messages/message-footer';
11
11
  export { useAvatarProps } from './components/messages/use-avatar-props';
12
12
  export { MultilineText } from './components/common/multiline-text';
13
+ export { MarkdownText } from './components/common/markdown-text';
13
14
  export { MessageContentText } from './components/message-content/message-content-text';
14
15
  export { ChatInputStore } from './stores/chat-input.store';