@servicetitan/titan-chat-ui 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,CAqF3D,CAAC"}
@@ -1,7 +1,45 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { BodyText, Headline, Link } from '@servicetitan/design-system';
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, ...rest }) {
16
+ return (_jsx(BodyText, { el: "span", className: "c-blue-600 bg-neutral-40 border-radius-1", style: { fontFamily: 'monospace', fontSize: '0.85em' }, ...rest, 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", primary: true, rel: "noopener noreferrer", children: children }));
23
+ },
24
+ h1({ children }) {
25
+ return (_jsx(Headline, { el: "h1", size: "xlarge", children: children }));
26
+ },
27
+ h2({ children }) {
28
+ return (_jsx(Headline, { el: "h2", size: "large", children: children }));
29
+ },
30
+ h3({ children }) {
31
+ return (_jsx(Headline, { el: "h3", size: "medium", children: children }));
32
+ },
33
+ h4({ children }) {
34
+ return (_jsx(Headline, { el: "h4", size: "small", children: children }));
35
+ },
36
+ h5({ children }) {
37
+ return (_jsx(Headline, { el: "h5", size: "small", children: children }));
38
+ },
39
+ h6({ children }) {
40
+ return (_jsx(Headline, { el: "h6", size: "small", children: children }));
41
+ },
42
+ }), []);
43
+ return (_jsx(BodyText, { el: "div", 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",
3
- "version": "3.1.5",
3
+ "version": "3.2.1",
4
4
  "description": "Chat experience UI package",
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/confirm": ">=27",
@@ -38,7 +42,7 @@
38
42
  "react-dom": ">=18"
39
43
  },
40
44
  "devDependencies": {
41
- "@servicetitan/cypress-shared": "^3.1.5",
45
+ "@servicetitan/cypress-shared": "^3.2.1",
42
46
  "cypress": "^14.3.2"
43
47
  },
44
48
  "keywords": [
@@ -51,5 +55,5 @@
51
55
  "cli": {
52
56
  "webpack": false
53
57
  },
54
- "gitHead": "d505add9e192f5d8260f14e15eee7460980e869b"
58
+ "gitHead": "f6a97e29c801f2dd05627766056f9b6e9b2c2318"
55
59
  }
@@ -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,105 @@
1
+ import { BodyText, Headline, Link } from '@servicetitan/design-system';
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, ...rest }: Node) {
26
+ return (
27
+ <BodyText
28
+ el="span"
29
+ className="c-blue-600 bg-neutral-40 border-radius-1"
30
+ style={{ fontFamily: 'monospace', fontSize: '0.85em' }}
31
+ {...rest}
32
+ >
33
+ {children}
34
+ </BodyText>
35
+ );
36
+ },
37
+ u({ children }: Node) {
38
+ return <u>{children}</u>;
39
+ },
40
+ a({ children, href }: Node & { href?: string }) {
41
+ return (
42
+ <Link href={href} target="_blank" primary rel="noopener noreferrer">
43
+ {children}
44
+ </Link>
45
+ );
46
+ },
47
+ h1({ children }: Node) {
48
+ return (
49
+ <Headline el="h1" size="xlarge">
50
+ {children}
51
+ </Headline>
52
+ );
53
+ },
54
+ h2({ children }: Node) {
55
+ return (
56
+ <Headline el="h2" size="large">
57
+ {children}
58
+ </Headline>
59
+ );
60
+ },
61
+ h3({ children }: Node) {
62
+ return (
63
+ <Headline el="h3" size="medium">
64
+ {children}
65
+ </Headline>
66
+ );
67
+ },
68
+ h4({ children }: Node) {
69
+ return (
70
+ <Headline el="h4" size="small">
71
+ {children}
72
+ </Headline>
73
+ );
74
+ },
75
+ h5({ children }: Node) {
76
+ return (
77
+ <Headline el="h5" size="small">
78
+ {children}
79
+ </Headline>
80
+ );
81
+ },
82
+ h6({ children }: Node) {
83
+ return (
84
+ <Headline el="h6" size="small">
85
+ {children}
86
+ </Headline>
87
+ );
88
+ },
89
+ }),
90
+ []
91
+ );
92
+
93
+ return (
94
+ <BodyText el="div" className={classNames(Styles.content, className)} data-cy={dataCy}>
95
+ <Markdown
96
+ components={markdownComponents}
97
+ rehypePlugins={[rehypeRaw]}
98
+ remarkPlugins={[remarkGfm]}
99
+ >
100
+ {DOMpurify.sanitize(message.message)}
101
+ </Markdown>
102
+ </BodyText>
103
+ );
104
+ }
105
+ );
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';