@servicetitan/titan-chat-ui-anvil2 3.1.5 → 3.2.1

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,27 @@
1
+ # v3.2.1 (Tue Sep 09 2025)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - SPA-7282: Fixed browser default "p" style for messages. [#54](https://github.com/servicetitan/titan-chatbot-client/pull/54) ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
6
+
7
+ #### Authors: 1
8
+
9
+ - Alexandr Yarmolchuk ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
10
+
11
+ ---
12
+
13
+ # v3.2.0 (Tue Sep 09 2025)
14
+
15
+ #### 🚀 Enhancement
16
+
17
+ - SPA-7282: Support Rendering of Markups in Chatbot Responses [#53](https://github.com/servicetitan/titan-chatbot-client/pull/53) ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
18
+
19
+ #### Authors: 1
20
+
21
+ - Alexandr Yarmolchuk ([@AlexYarmolchuk](https://github.com/AlexYarmolchuk))
22
+
23
+ ---
24
+
1
25
  # v3.1.3 (Fri Aug 22 2025)
2
26
 
3
27
  #### 🐛 Bug Fix
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-content-text.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-content-text.test.d.ts","sourceRoot":"","sources":["../../../../src/components/message-content/__tests-cy__/message-content-text.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { runMessageContentTextSharedTests } from '@servicetitan/cypress-shared';
2
+ import { MessageContentText } from '../message-content-text';
3
+ describe('MessageContentText', () => {
4
+ runMessageContentTextSharedTests(MessageContentText);
5
+ });
6
+ //# sourceMappingURL=message-content-text.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-content-text.test.js","sourceRoot":"","sources":["../../../../src/components/message-content/__tests-cy__/message-content-text.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,gCAAgC,CAAC,kBAAkB,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { ChatMessageModelText, ChatMessageModelWelcome } from '@servicetitan/titan-chat-ui-common';
2
2
  import { FC } from 'react';
3
3
  interface IMessageContentTextProps {
4
+ className?: string;
4
5
  message: ChatMessageModelText | ChatMessageModelWelcome;
6
+ ['data-cy']?: string;
5
7
  }
6
8
  export declare const MessageContentText: FC<IMessageContentTextProps>;
7
9
  export {};
@@ -1 +1 @@
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,OAAO,EAAE,oBAAoB,GAAG,uBAAuB,CAAC;CAC3D;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,wBAAwB,CAE1D,CAAC"}
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,7 +1,45 @@
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';
2
5
  import { observer } from 'mobx-react';
3
- import { MultilineText } from '../common/multiline-text';
4
- export const MessageContentText = observer(({ message }) => {
5
- return _jsx(MultilineText, { text: message.message });
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';
11
+ export const MessageContentText = observer(({ className, message, ...rest }) => {
12
+ var _a;
13
+ 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) }) }));
6
44
  });
7
45
  //# 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":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAMzD,MAAM,CAAC,MAAM,kBAAkB,GAAiC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IACrF,OAAO,KAAC,aAAa,IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,GAAI,CAAC;AACpD,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"message-content-text.js","sourceRoot":"","sources":["../../../src/components/message-content/message-content-text.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ @import '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ .content {
4
+ p {
5
+ margin: @spacing-0;
6
+ padding: @spacing-0;
7
+ }
8
+ }
package/dist/index.d.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 { MessageContentText } from './components/message-content/message-content-text';
13
14
  export { ChatInputStore } from './stores/chat-input.store';
14
15
  //# 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,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,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -10,5 +10,6 @@ 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 { MessageContentText } from './components/message-content/message-content-text';
13
14
  export { ChatInputStore } from './stores/chat-input.store';
14
15
  //# 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,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,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": "3.1.5",
3
+ "version": "3.2.1",
4
4
  "description": "Chat experience UI package (Anvil2 version)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,9 +17,13 @@
17
17
  "push:local": "yalc push"
18
18
  },
19
19
  "dependencies": {
20
- "@servicetitan/titan-chat-ui-common": "^3.1.5",
20
+ "@servicetitan/titan-chat-ui-common": "^3.2.1",
21
+ "dompurify": "^3.2.6",
21
22
  "lodash": "4.17.21",
22
- "nanoid": "^5.1.5"
23
+ "nanoid": "^5.1.5",
24
+ "react-markdown": "^10.1.0",
25
+ "rehype-raw": "^7.0.0",
26
+ "remark-gfm": "^4.0.1"
23
27
  },
24
28
  "peerDependencies": {
25
29
  "@servicetitan/anvil2": ">=1.16.0",
@@ -34,7 +38,7 @@
34
38
  "react-dom": ">=18"
35
39
  },
36
40
  "devDependencies": {
37
- "@servicetitan/cypress-shared": "^3.1.5",
41
+ "@servicetitan/cypress-shared": "^3.2.1",
38
42
  "cypress": "^14.3.2"
39
43
  },
40
44
  "keywords": [
@@ -47,5 +51,5 @@
47
51
  "cli": {
48
52
  "webpack": false
49
53
  },
50
- "gitHead": "d505add9e192f5d8260f14e15eee7460980e869b"
54
+ "gitHead": "f6a97e29c801f2dd05627766056f9b6e9b2c2318"
51
55
  }
@@ -0,0 +1,6 @@
1
+ import { runMessageContentTextSharedTests } from '@servicetitan/cypress-shared';
2
+ import { MessageContentText } from '../message-content-text';
3
+
4
+ describe('MessageContentText', () => {
5
+ runMessageContentTextSharedTests(MessageContentText);
6
+ });
@@ -0,0 +1,8 @@
1
+ @import '@servicetitan/tokens/dist/tokens.less';
2
+
3
+ .content {
4
+ p {
5
+ margin: @spacing-0;
6
+ padding: @spacing-0;
7
+ }
8
+ }
@@ -0,0 +1,3 @@
1
+ export const __esModule: true;
2
+ export const content: string;
3
+
@@ -1,12 +1,110 @@
1
+ import { Link, Text } from '@servicetitan/anvil2';
1
2
  import { ChatMessageModelText, ChatMessageModelWelcome } from '@servicetitan/titan-chat-ui-common';
3
+ import classNames from 'classnames';
4
+ import DOMpurify from 'dompurify';
2
5
  import { observer } from 'mobx-react';
3
- import { FC } from 'react';
4
- import { MultilineText } from '../common/multiline-text';
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';
5
11
 
6
12
  interface IMessageContentTextProps {
13
+ className?: string;
7
14
  message: ChatMessageModelText | ChatMessageModelWelcome;
15
+ ['data-cy']?: string;
8
16
  }
9
17
 
10
- export const MessageContentText: FC<IMessageContentTextProps> = observer(({ message }) => {
11
- return <MultilineText text={message.message} />;
12
- });
18
+ type Node = { children: ReactNode } & { [key: string]: any };
19
+
20
+ export const MessageContentText: FC<IMessageContentTextProps> = observer(
21
+ ({ className, message, ...rest }) => {
22
+ 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
+ );
109
+ }
110
+ );
package/src/index.ts CHANGED
@@ -10,4 +10,5 @@ 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 { MessageContentText } from './components/message-content/message-content-text';
13
14
  export { ChatInputStore } from './stores/chat-input.store';