@gravity-ui/aikit 2.23.1-beta.e7799c5b0ca223cf977058eeddf7cc7c8570c020.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/build/cjs/components/atoms/MarkdownRenderer/MarkdownRenderer.css +21 -0
  2. package/build/cjs/components/atoms/MarkdownRenderer/MarkdownRenderer.d.ts +5 -2
  3. package/build/cjs/components/atoms/MarkdownRenderer/MarkdownRenderer.js +17 -28
  4. package/build/cjs/components/atoms/MarkdownRenderer/MarkdownRenderer.js.map +1 -1
  5. package/build/cjs/components/atoms/MessageBalloon/MessageBalloon.css +5 -1
  6. package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.d.ts +3 -2
  7. package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js +3 -2
  8. package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
  9. package/build/cjs/components/organisms/AssistantMessage/defaultMessageTypeRegistry.d.ts +2 -2
  10. package/build/cjs/components/organisms/AssistantMessage/defaultMessageTypeRegistry.js +3 -3
  11. package/build/cjs/components/organisms/AssistantMessage/defaultMessageTypeRegistry.js.map +1 -1
  12. package/build/cjs/components/organisms/MessageList/MessageItem.d.ts +3 -2
  13. package/build/cjs/components/organisms/MessageList/MessageItem.js +3 -3
  14. package/build/cjs/components/organisms/MessageList/MessageItem.js.map +1 -1
  15. package/build/cjs/components/organisms/MessageList/MessageList.d.ts +2 -1
  16. package/build/cjs/components/organisms/MessageList/MessageList.js +2 -2
  17. package/build/cjs/components/organisms/MessageList/MessageList.js.map +1 -1
  18. package/build/cjs/components/organisms/MessageList/MessageList.virtualized.d.ts +1 -1
  19. package/build/cjs/components/organisms/MessageList/MessageList.virtualized.js +3 -1
  20. package/build/cjs/components/organisms/MessageList/MessageList.virtualized.js.map +1 -1
  21. package/build/cjs/components/organisms/ThinkingMessage/index.d.ts +2 -1
  22. package/build/cjs/components/organisms/ThinkingMessage/index.js +2 -2
  23. package/build/cjs/components/organisms/ThinkingMessage/index.js.map +1 -1
  24. package/build/cjs/components/organisms/UserMessage/index.d.ts +2 -1
  25. package/build/cjs/components/organisms/UserMessage/index.js +2 -2
  26. package/build/cjs/components/organisms/UserMessage/index.js.map +1 -1
  27. package/build/cjs/components/pages/ChatContainer/ChatContainer.js +3 -1
  28. package/build/cjs/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  29. package/build/cjs/components/pages/ChatContainer/types.d.ts +4 -1
  30. package/build/cjs/components/pages/ChatContainer/types.js.map +1 -1
  31. package/build/cjs/hooks/useMarkdownTransform.d.ts +1 -1
  32. package/build/cjs/hooks/useMarkdownTransform.js +6 -4
  33. package/build/cjs/hooks/useMarkdownTransform.js.map +1 -1
  34. package/build/cjs/hooks/useMermaid.d.ts +3 -0
  35. package/build/cjs/hooks/useMermaid.js +101 -0
  36. package/build/cjs/hooks/useMermaid.js.map +1 -0
  37. package/build/cjs/hooks/useSmartScroll.js +4 -8
  38. package/build/cjs/hooks/useSmartScroll.js.map +1 -1
  39. package/build/cjs/hooks/useVirtualStickToBottom.js +4 -8
  40. package/build/cjs/hooks/useVirtualStickToBottom.js.map +1 -1
  41. package/build/cjs/package.json +1 -1
  42. package/build/cjs/themes/dark.css +1 -0
  43. package/build/cjs/themes/light.css +1 -0
  44. package/build/cjs/utils/markdownLinks.d.ts +6 -0
  45. package/build/cjs/utils/markdownLinks.js +43 -0
  46. package/build/cjs/utils/markdownLinks.js.map +1 -0
  47. package/build/cjs/utils/markdownMermaidPlugin.d.ts +4 -0
  48. package/build/cjs/utils/markdownMermaidPlugin.js +19 -0
  49. package/build/cjs/utils/markdownMermaidPlugin.js.map +1 -0
  50. package/build/cjs/utils/markdownUtils.d.ts +2 -2
  51. package/build/cjs/utils/markdownUtils.js +9 -3
  52. package/build/cjs/utils/markdownUtils.js.map +1 -1
  53. package/build/cjs/utils/observeScrollContent.d.ts +2 -0
  54. package/build/cjs/utils/observeScrollContent.js +53 -0
  55. package/build/cjs/utils/observeScrollContent.js.map +1 -0
  56. package/build/cjs/utils/renderMermaid.d.ts +21 -0
  57. package/build/cjs/utils/renderMermaid.js +54 -0
  58. package/build/cjs/utils/renderMermaid.js.map +1 -0
  59. package/build/docs/INDEX.md +2 -1
  60. package/build/docs/components/atoms/MarkdownRenderer.md +57 -5
  61. package/build/docs/components/atoms/MessageBalloon.md +7 -5
  62. package/build/docs/components/organisms/AssistantMessage.md +1 -0
  63. package/build/docs/components/organisms/MessageList.md +1 -0
  64. package/build/docs/components/organisms/ThinkingMessage.md +1 -0
  65. package/build/docs/components/organisms/UserMessage.md +1 -0
  66. package/build/docs/components/pages/AIStudioChat.md +1 -0
  67. package/build/docs/components/pages/ChatContainer.md +1 -0
  68. package/build/docs/guides/README.md +1 -0
  69. package/build/docs/guides/THEMER.md +63 -0
  70. package/build/docs/guides/THEMING.md +3 -1
  71. package/build/esm/components/atoms/MarkdownRenderer/MarkdownRenderer.css +21 -0
  72. package/build/esm/components/atoms/MarkdownRenderer/MarkdownRenderer.d.ts +5 -2
  73. package/build/esm/components/atoms/MarkdownRenderer/MarkdownRenderer.js +17 -28
  74. package/build/esm/components/atoms/MarkdownRenderer/MarkdownRenderer.js.map +1 -1
  75. package/build/esm/components/atoms/MessageBalloon/MessageBalloon.css +5 -1
  76. package/build/esm/components/organisms/AssistantMessage/AssistantMessage.d.ts +3 -2
  77. package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js +3 -2
  78. package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
  79. package/build/esm/components/organisms/AssistantMessage/defaultMessageTypeRegistry.d.ts +2 -2
  80. package/build/esm/components/organisms/AssistantMessage/defaultMessageTypeRegistry.js +4 -4
  81. package/build/esm/components/organisms/AssistantMessage/defaultMessageTypeRegistry.js.map +1 -1
  82. package/build/esm/components/organisms/MessageList/MessageItem.d.ts +3 -2
  83. package/build/esm/components/organisms/MessageList/MessageItem.js +3 -3
  84. package/build/esm/components/organisms/MessageList/MessageItem.js.map +1 -1
  85. package/build/esm/components/organisms/MessageList/MessageList.d.ts +2 -1
  86. package/build/esm/components/organisms/MessageList/MessageList.js +2 -2
  87. package/build/esm/components/organisms/MessageList/MessageList.js.map +1 -1
  88. package/build/esm/components/organisms/MessageList/MessageList.virtualized.d.ts +1 -1
  89. package/build/esm/components/organisms/MessageList/MessageList.virtualized.js +3 -1
  90. package/build/esm/components/organisms/MessageList/MessageList.virtualized.js.map +1 -1
  91. package/build/esm/components/organisms/ThinkingMessage/index.d.ts +2 -1
  92. package/build/esm/components/organisms/ThinkingMessage/index.js +3 -3
  93. package/build/esm/components/organisms/ThinkingMessage/index.js.map +1 -1
  94. package/build/esm/components/organisms/UserMessage/index.d.ts +2 -1
  95. package/build/esm/components/organisms/UserMessage/index.js +3 -3
  96. package/build/esm/components/organisms/UserMessage/index.js.map +1 -1
  97. package/build/esm/components/pages/ChatContainer/ChatContainer.js +3 -1
  98. package/build/esm/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  99. package/build/esm/components/pages/ChatContainer/types.d.ts +4 -1
  100. package/build/esm/components/pages/ChatContainer/types.js.map +1 -1
  101. package/build/esm/hooks/useMarkdownTransform.d.ts +1 -1
  102. package/build/esm/hooks/useMarkdownTransform.js +6 -4
  103. package/build/esm/hooks/useMarkdownTransform.js.map +1 -1
  104. package/build/esm/hooks/useMermaid.d.ts +3 -0
  105. package/build/esm/hooks/useMermaid.js +98 -0
  106. package/build/esm/hooks/useMermaid.js.map +1 -0
  107. package/build/esm/hooks/useSmartScroll.js +4 -8
  108. package/build/esm/hooks/useSmartScroll.js.map +1 -1
  109. package/build/esm/hooks/useVirtualStickToBottom.js +4 -8
  110. package/build/esm/hooks/useVirtualStickToBottom.js.map +1 -1
  111. package/build/esm/package.json +1 -1
  112. package/build/esm/themes/dark.css +1 -0
  113. package/build/esm/themes/light.css +1 -0
  114. package/build/esm/utils/markdownLinks.d.ts +6 -0
  115. package/build/esm/utils/markdownLinks.js +39 -0
  116. package/build/esm/utils/markdownLinks.js.map +1 -0
  117. package/build/esm/utils/markdownMermaidPlugin.d.ts +4 -0
  118. package/build/esm/utils/markdownMermaidPlugin.js +16 -0
  119. package/build/esm/utils/markdownMermaidPlugin.js.map +1 -0
  120. package/build/esm/utils/markdownUtils.d.ts +2 -2
  121. package/build/esm/utils/markdownUtils.js +9 -3
  122. package/build/esm/utils/markdownUtils.js.map +1 -1
  123. package/build/esm/utils/observeScrollContent.d.ts +2 -0
  124. package/build/esm/utils/observeScrollContent.js +50 -0
  125. package/build/esm/utils/observeScrollContent.js.map +1 -0
  126. package/build/esm/utils/renderMermaid.d.ts +21 -0
  127. package/build/esm/utils/renderMermaid.js +51 -0
  128. package/build/esm/utils/renderMermaid.js.map +1 -0
  129. package/docs/README.md +1 -0
  130. package/docs/THEMER.md +63 -0
  131. package/docs/THEMING.md +3 -1
  132. package/llms-full.txt +70 -1
  133. package/llms.txt +1 -0
  134. package/package.json +17 -5
@@ -90,6 +90,27 @@
90
90
  width: 100%;
91
91
  max-width: 100%;
92
92
  min-width: 0;
93
+ }
94
+ .g-aikit-markdown-renderer__mermaid {
95
+ max-width: 100%;
96
+ min-width: 0;
97
+ margin-block: 16px;
98
+ overflow-x: auto;
99
+ overscroll-behavior-x: var(--g-aikit-scroll-overscroll-behavior, auto);
100
+ }
101
+ .g-aikit-markdown-renderer__mermaid pre[hidden] {
102
+ display: none;
103
+ }
104
+ .g-aikit-markdown-renderer__mermaid-diagram {
105
+ width: max-content;
106
+ min-width: 100%;
107
+ }
108
+ .g-aikit-markdown-renderer__mermaid-diagram > svg {
109
+ display: block;
110
+ height: auto;
111
+ max-height: none;
112
+ }
113
+ .g-aikit-markdown-renderer {
93
114
  /* Scroll container injected by markdownTableWrapPlugin; text outside stays fixed */
94
115
  }
95
116
  .g-aikit-markdown-renderer__table-wrap {
@@ -1,6 +1,8 @@
1
1
  import { type HTMLAttributes } from 'react';
2
2
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
3
3
  import type { MDXComponents } from 'mdx/types';
4
+ import type { MermaidOptions } from "../../../utils/renderMermaid.js";
5
+ export type { MermaidOptions } from "../../../utils/renderMermaid.js";
4
6
  import "./MarkdownRenderer.css";
5
7
  /**
6
8
  * Options for rendering embedded MDX/JSX in the markdown content via
@@ -21,11 +23,12 @@ export interface MarkdownRendererProps {
21
23
  transformOptions?: OptionsType;
22
24
  shouldParseIncompleteMarkdown?: boolean;
23
25
  openLinksInNewTab?: boolean;
26
+ /** Enables Mermaid diagrams using the supplied lazy loader. Disabled by default. */
27
+ mermaidOptions?: MermaidOptions;
24
28
  mdxOptions?: MarkdownRendererMdxOptions;
25
29
  mdxContext?: Record<string, unknown>;
26
30
  /** Extra props forwarded to the root container `div` element. */
27
31
  extraProps?: HTMLAttributes<HTMLDivElement>;
28
32
  }
29
- declare function MarkdownRendererComponent({ content, className, qa, transformOptions, shouldParseIncompleteMarkdown, openLinksInNewTab, mdxOptions, mdxContext, extraProps, }: MarkdownRendererProps): import("react/jsx-runtime").JSX.Element;
33
+ declare function MarkdownRendererComponent({ content, className, qa, transformOptions, shouldParseIncompleteMarkdown, openLinksInNewTab, mermaidOptions, mdxOptions, mdxContext, extraProps, }: MarkdownRendererProps): import("react/jsx-runtime").JSX.Element;
30
34
  export declare const MarkdownRenderer: import("react").MemoExoticComponent<typeof MarkdownRendererComponent>;
31
- export {};
@@ -5,31 +5,14 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const mdx_extension_1 = require("@diplodoc/mdx-extension");
7
7
  const useMarkdownTransform_1 = require("../../../hooks/useMarkdownTransform.js");
8
+ const useMermaid_1 = require("../../../hooks/useMermaid.js");
8
9
  const useRemend_1 = require("../../../hooks/useRemend.js");
9
10
  const cn_1 = require("../../../utils/cn.js");
11
+ const markdownLinks_1 = require("../../../utils/markdownLinks.js");
10
12
  const markdownUtils_1 = require("../../../utils/markdownUtils.js");
11
13
  const MdxPortals_1 = require("./MdxPortals.js");
12
14
  require("./MarkdownRenderer.css");
13
15
  const b = (0, cn_1.block)('markdown-renderer');
14
- const ABSOLUTE_HTTP_URL_RE = /^(https?:)?\/\//i;
15
- const isSameDocumentAnchor = (href) => {
16
- if (href.startsWith('#')) {
17
- return true;
18
- }
19
- if (ABSOLUTE_HTTP_URL_RE.test(href) || typeof window === 'undefined') {
20
- return false;
21
- }
22
- try {
23
- const url = new URL(href, window.location.href);
24
- return (Boolean(url.hash) &&
25
- url.origin === window.location.origin &&
26
- url.pathname === window.location.pathname &&
27
- url.search === window.location.search);
28
- }
29
- catch (_a) {
30
- return false;
31
- }
32
- };
33
16
  const openLinksInNewTabPlugin = ((md) => {
34
17
  const rendererRules = md.renderer.rules;
35
18
  const defaultRender = rendererRules.link_open ||
@@ -38,14 +21,16 @@ const openLinksInNewTabPlugin = ((md) => {
38
21
  };
39
22
  rendererRules.link_open = function (tokens, idx, options, env, self) {
40
23
  const href = tokens[idx].attrGet('href');
41
- if (!href || !isSameDocumentAnchor(href)) {
42
- tokens[idx].attrSet('target', '_blank');
43
- tokens[idx].attrSet('rel', 'noopener noreferrer');
24
+ const attributes = (0, markdownLinks_1.getNewTabLinkAttributes)(href);
25
+ if (attributes) {
26
+ for (const [name, value] of Object.entries(attributes)) {
27
+ tokens[idx].attrSet(name, value);
28
+ }
44
29
  }
45
30
  return defaultRender(tokens, idx, options, env, self);
46
31
  };
47
32
  });
48
- function MarkdownRendererComponent({ content, className, qa, transformOptions, shouldParseIncompleteMarkdown = false, openLinksInNewTab = false, mdxOptions, mdxContext, extraProps, }) {
33
+ function MarkdownRendererComponent({ content, className, qa, transformOptions, shouldParseIncompleteMarkdown = false, openLinksInNewTab = false, mermaidOptions, mdxOptions, mdxContext, extraProps, }) {
49
34
  const closedContent = (0, useRemend_1.useRemend)(content, shouldParseIncompleteMarkdown);
50
35
  const enableMdx = Boolean(mdxOptions);
51
36
  const mdxComponents = mdxOptions === null || mdxOptions === void 0 ? void 0 : mdxOptions.components;
@@ -66,11 +51,12 @@ function MarkdownRendererComponent({ content, className, qa, transformOptions, s
66
51
  return Object.assign(Object.assign({}, transformOptions), { plugins });
67
52
  }, [openLinksInNewTab, transformOptions, enableMdx, mdxTagNames]);
68
53
  const containerRef = (0, react_1.useRef)(null);
69
- const { html, mdxArtifacts } = (0, useMarkdownTransform_1.useMarkdownTransform)(closedContent, finalTransformOptions, enableMdx);
54
+ const { html, mdxArtifacts } = (0, useMarkdownTransform_1.useMarkdownTransform)(closedContent, finalTransformOptions, enableMdx, Boolean(mermaidOptions));
55
+ (0, useMermaid_1.useMermaid)(containerRef, html, openLinksInNewTab, mermaidOptions);
70
56
  return ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", Object.assign({ ref: containerRef, className: b(null, [className, 'yfm']), "data-qa": qa, dangerouslySetInnerHTML: { __html: html } }, extraProps)), enableMdx ? ((0, jsx_runtime_1.jsx)(MdxPortals_1.MdxPortals, { refCtr: containerRef, html: html, components: mdxComponents, mdxArtifacts: mdxArtifacts, nonce: mdxNonce, mdxContext: mdxContext })) : null] }));
71
57
  }
72
58
  exports.MarkdownRenderer = (0, react_1.memo)(MarkdownRendererComponent, (prevProps, nextProps) => {
73
- var _a, _b, _c, _d, _e, _f;
59
+ var _a, _b, _c, _d, _e, _f, _g, _h;
74
60
  if (prevProps.content !== nextProps.content) {
75
61
  return false;
76
62
  }
@@ -80,19 +66,22 @@ exports.MarkdownRenderer = (0, react_1.memo)(MarkdownRendererComponent, (prevPro
80
66
  if (prevProps.openLinksInNewTab !== nextProps.openLinksInNewTab) {
81
67
  return false;
82
68
  }
69
+ if (((_a = prevProps.mermaidOptions) === null || _a === void 0 ? void 0 : _a.load) !== ((_b = nextProps.mermaidOptions) === null || _b === void 0 ? void 0 : _b.load)) {
70
+ return false;
71
+ }
83
72
  if (prevProps.className !== nextProps.className) {
84
73
  return false;
85
74
  }
86
75
  if (prevProps.qa !== nextProps.qa) {
87
76
  return false;
88
77
  }
89
- if (((_a = prevProps.mdxOptions) === null || _a === void 0 ? void 0 : _a.components) !== ((_b = nextProps.mdxOptions) === null || _b === void 0 ? void 0 : _b.components)) {
78
+ if (((_c = prevProps.mdxOptions) === null || _c === void 0 ? void 0 : _c.components) !== ((_d = nextProps.mdxOptions) === null || _d === void 0 ? void 0 : _d.components)) {
90
79
  return false;
91
80
  }
92
- if (((_c = prevProps.mdxOptions) === null || _c === void 0 ? void 0 : _c.tagNames) !== ((_d = nextProps.mdxOptions) === null || _d === void 0 ? void 0 : _d.tagNames)) {
81
+ if (((_e = prevProps.mdxOptions) === null || _e === void 0 ? void 0 : _e.tagNames) !== ((_f = nextProps.mdxOptions) === null || _f === void 0 ? void 0 : _f.tagNames)) {
93
82
  return false;
94
83
  }
95
- if (((_e = prevProps.mdxOptions) === null || _e === void 0 ? void 0 : _e.nonce) !== ((_f = nextProps.mdxOptions) === null || _f === void 0 ? void 0 : _f.nonce)) {
84
+ if (((_g = prevProps.mdxOptions) === null || _g === void 0 ? void 0 : _g.nonce) !== ((_h = nextProps.mdxOptions) === null || _h === void 0 ? void 0 : _h.nonce)) {
96
85
  return false;
97
86
  }
98
87
  if (prevProps.mdxContext !== nextProps.mdxContext) {
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.js","sourceRoot":"../../../../../src","sources":["components/atoms/MarkdownRenderer/MarkdownRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type HTMLAttributes, memo, useMemo, useRef} from 'react';\n\nimport {mdxPlugin} from '@diplodoc/mdx-extension';\nimport type {\n ExtendedPluginWithCollect,\n MarkdownIt,\n OptionsType,\n} from '@diplodoc/transform/lib/typings';\nimport type {MDXComponents} from 'mdx/types';\n\nimport {useMarkdownTransform} from '../../../hooks/useMarkdownTransform';\nimport {useRemend} from '../../../hooks/useRemend';\nimport {block} from '../../../utils/cn';\nimport {areOptionsEqual} from '../../../utils/markdownUtils';\n\nimport {MdxPortals} from './MdxPortals';\n\nimport './MarkdownRenderer.scss';\n\nconst b = block('markdown-renderer');\n\n/**\n * Options for rendering embedded MDX/JSX in the markdown content via\n * `@diplodoc/mdx-extension`. Passing `mdxOptions` enables MDX processing.\n */\nexport interface MarkdownRendererMdxOptions {\n /** Map of components rendered from embedded MDX/JSX in the markdown content. */\n components: MDXComponents;\n /** Optional list of tag names to limit which components are processed as MDX. */\n tagNames?: string[];\n /** CSP nonce applied to compiled MDX scripts. Defaults to a nonce found in the document. */\n nonce?: string;\n}\n\nexport interface MarkdownRendererProps {\n content: string;\n className?: string;\n qa?: string;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n openLinksInNewTab?: boolean;\n mdxOptions?: MarkdownRendererMdxOptions;\n mdxContext?: Record<string, unknown>;\n /** Extra props forwarded to the root container `div` element. */\n extraProps?: HTMLAttributes<HTMLDivElement>;\n}\n\nconst ABSOLUTE_HTTP_URL_RE = /^(https?:)?\\/\\//i;\n\nconst isSameDocumentAnchor = (href: string) => {\n if (href.startsWith('#')) {\n return true;\n }\n\n if (ABSOLUTE_HTTP_URL_RE.test(href) || typeof window === 'undefined') {\n return false;\n }\n\n try {\n const url = new URL(href, window.location.href);\n\n return (\n Boolean(url.hash) &&\n url.origin === window.location.origin &&\n url.pathname === window.location.pathname &&\n url.search === window.location.search\n );\n } catch {\n return false;\n }\n};\n\nconst openLinksInNewTabPlugin: ExtendedPluginWithCollect = ((md: MarkdownIt) => {\n const rendererRules = md.renderer.rules;\n const defaultRender =\n rendererRules.link_open ||\n function (tokens, idx, options, _env, self) {\n return self.renderToken(tokens, idx, options);\n };\n\n rendererRules.link_open = function (tokens, idx, options, env, self) {\n const href = tokens[idx].attrGet('href');\n if (!href || !isSameDocumentAnchor(href)) {\n tokens[idx].attrSet('target', '_blank');\n tokens[idx].attrSet('rel', 'noopener noreferrer');\n }\n\n return defaultRender(tokens, idx, options, env, self);\n };\n}) as ExtendedPluginWithCollect;\n\nfunction MarkdownRendererComponent({\n content,\n className,\n qa,\n transformOptions,\n shouldParseIncompleteMarkdown = false,\n openLinksInNewTab = false,\n mdxOptions,\n mdxContext,\n extraProps,\n}: MarkdownRendererProps) {\n const closedContent = useRemend(content, shouldParseIncompleteMarkdown);\n const enableMdx = Boolean(mdxOptions);\n const mdxComponents = mdxOptions?.components;\n const mdxTagNames = mdxOptions?.tagNames;\n const mdxNonce = mdxOptions?.nonce;\n const finalTransformOptions = useMemo<OptionsType | undefined>(() => {\n const plugins = [...(transformOptions?.plugins ?? [])];\n\n if (openLinksInNewTab) {\n plugins.push(openLinksInNewTabPlugin);\n }\n\n if (enableMdx) {\n plugins.push(\n mdxPlugin(\n mdxTagNames ? {tagNames: mdxTagNames} : undefined,\n ) as unknown as ExtendedPluginWithCollect,\n );\n }\n\n if (plugins.length === 0) {\n return transformOptions;\n }\n\n return {\n ...transformOptions,\n plugins,\n };\n }, [openLinksInNewTab, transformOptions, enableMdx, mdxTagNames]);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const {html, mdxArtifacts} = useMarkdownTransform(\n closedContent,\n finalTransformOptions,\n enableMdx,\n );\n\n return (\n <Fragment>\n <div\n ref={containerRef}\n className={b(null, [className, 'yfm'])}\n data-qa={qa}\n dangerouslySetInnerHTML={{__html: html}}\n {...extraProps}\n />\n {enableMdx ? (\n <MdxPortals\n refCtr={containerRef}\n html={html}\n components={mdxComponents}\n mdxArtifacts={mdxArtifacts}\n nonce={mdxNonce}\n mdxContext={mdxContext}\n />\n ) : null}\n </Fragment>\n );\n}\n\nexport const MarkdownRenderer = memo(MarkdownRendererComponent, (prevProps, nextProps) => {\n if (prevProps.content !== nextProps.content) {\n return false;\n }\n\n if (prevProps.shouldParseIncompleteMarkdown !== nextProps.shouldParseIncompleteMarkdown) {\n return false;\n }\n\n if (prevProps.openLinksInNewTab !== nextProps.openLinksInNewTab) {\n return false;\n }\n\n if (prevProps.className !== nextProps.className) {\n return false;\n }\n\n if (prevProps.qa !== nextProps.qa) {\n return false;\n }\n\n if (prevProps.mdxOptions?.components !== nextProps.mdxOptions?.components) {\n return false;\n }\n\n if (prevProps.mdxOptions?.tagNames !== nextProps.mdxOptions?.tagNames) {\n return false;\n }\n\n if (prevProps.mdxOptions?.nonce !== nextProps.mdxOptions?.nonce) {\n return false;\n }\n\n if (prevProps.mdxContext !== nextProps.mdxContext) {\n return false;\n }\n\n if (prevProps.extraProps !== nextProps.extraProps) {\n return false;\n }\n\n return areOptionsEqual(prevProps.transformOptions, nextProps.transformOptions);\n});\n\nMarkdownRenderer.displayName = 'MarkdownRenderer';\n"]}
1
+ {"version":3,"file":"MarkdownRenderer.js","sourceRoot":"../../../../../src","sources":["components/atoms/MarkdownRenderer/MarkdownRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type HTMLAttributes, memo, useMemo, useRef} from 'react';\n\nimport {mdxPlugin} from '@diplodoc/mdx-extension';\nimport type {\n ExtendedPluginWithCollect,\n MarkdownIt,\n OptionsType,\n} from '@diplodoc/transform/lib/typings';\nimport type {MDXComponents} from 'mdx/types';\n\nimport {useMarkdownTransform} from '../../../hooks/useMarkdownTransform';\nimport {useMermaid} from '../../../hooks/useMermaid';\nimport {useRemend} from '../../../hooks/useRemend';\nimport {block} from '../../../utils/cn';\nimport {getNewTabLinkAttributes} from '../../../utils/markdownLinks';\nimport {areOptionsEqual} from '../../../utils/markdownUtils';\nimport type {MermaidOptions} from '../../../utils/renderMermaid';\n\nexport type {MermaidOptions} from '../../../utils/renderMermaid';\n\nimport {MdxPortals} from './MdxPortals';\n\nimport './MarkdownRenderer.scss';\n\nconst b = block('markdown-renderer');\n\n/**\n * Options for rendering embedded MDX/JSX in the markdown content via\n * `@diplodoc/mdx-extension`. Passing `mdxOptions` enables MDX processing.\n */\nexport interface MarkdownRendererMdxOptions {\n /** Map of components rendered from embedded MDX/JSX in the markdown content. */\n components: MDXComponents;\n /** Optional list of tag names to limit which components are processed as MDX. */\n tagNames?: string[];\n /** CSP nonce applied to compiled MDX scripts. Defaults to a nonce found in the document. */\n nonce?: string;\n}\n\nexport interface MarkdownRendererProps {\n content: string;\n className?: string;\n qa?: string;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n openLinksInNewTab?: boolean;\n /** Enables Mermaid diagrams using the supplied lazy loader. Disabled by default. */\n mermaidOptions?: MermaidOptions;\n mdxOptions?: MarkdownRendererMdxOptions;\n mdxContext?: Record<string, unknown>;\n /** Extra props forwarded to the root container `div` element. */\n extraProps?: HTMLAttributes<HTMLDivElement>;\n}\n\nconst openLinksInNewTabPlugin: ExtendedPluginWithCollect = ((md: MarkdownIt) => {\n const rendererRules = md.renderer.rules;\n const defaultRender =\n rendererRules.link_open ||\n function (tokens, idx, options, _env, self) {\n return self.renderToken(tokens, idx, options);\n };\n\n rendererRules.link_open = function (tokens, idx, options, env, self) {\n const href = tokens[idx].attrGet('href');\n const attributes = getNewTabLinkAttributes(href);\n if (attributes) {\n for (const [name, value] of Object.entries(attributes)) {\n tokens[idx].attrSet(name, value);\n }\n }\n\n return defaultRender(tokens, idx, options, env, self);\n };\n}) as ExtendedPluginWithCollect;\n\nfunction MarkdownRendererComponent({\n content,\n className,\n qa,\n transformOptions,\n shouldParseIncompleteMarkdown = false,\n openLinksInNewTab = false,\n mermaidOptions,\n mdxOptions,\n mdxContext,\n extraProps,\n}: MarkdownRendererProps) {\n const closedContent = useRemend(content, shouldParseIncompleteMarkdown);\n const enableMdx = Boolean(mdxOptions);\n const mdxComponents = mdxOptions?.components;\n const mdxTagNames = mdxOptions?.tagNames;\n const mdxNonce = mdxOptions?.nonce;\n const finalTransformOptions = useMemo<OptionsType | undefined>(() => {\n const plugins = [...(transformOptions?.plugins ?? [])];\n\n if (openLinksInNewTab) {\n plugins.push(openLinksInNewTabPlugin);\n }\n\n if (enableMdx) {\n plugins.push(\n mdxPlugin(\n mdxTagNames ? {tagNames: mdxTagNames} : undefined,\n ) as unknown as ExtendedPluginWithCollect,\n );\n }\n\n if (plugins.length === 0) {\n return transformOptions;\n }\n\n return {\n ...transformOptions,\n plugins,\n };\n }, [openLinksInNewTab, transformOptions, enableMdx, mdxTagNames]);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const {html, mdxArtifacts} = useMarkdownTransform(\n closedContent,\n finalTransformOptions,\n enableMdx,\n Boolean(mermaidOptions),\n );\n\n useMermaid(containerRef, html, openLinksInNewTab, mermaidOptions);\n\n return (\n <Fragment>\n <div\n ref={containerRef}\n className={b(null, [className, 'yfm'])}\n data-qa={qa}\n dangerouslySetInnerHTML={{__html: html}}\n {...extraProps}\n />\n {enableMdx ? (\n <MdxPortals\n refCtr={containerRef}\n html={html}\n components={mdxComponents}\n mdxArtifacts={mdxArtifacts}\n nonce={mdxNonce}\n mdxContext={mdxContext}\n />\n ) : null}\n </Fragment>\n );\n}\n\nexport const MarkdownRenderer = memo(MarkdownRendererComponent, (prevProps, nextProps) => {\n if (prevProps.content !== nextProps.content) {\n return false;\n }\n\n if (prevProps.shouldParseIncompleteMarkdown !== nextProps.shouldParseIncompleteMarkdown) {\n return false;\n }\n\n if (prevProps.openLinksInNewTab !== nextProps.openLinksInNewTab) {\n return false;\n }\n\n if (prevProps.mermaidOptions?.load !== nextProps.mermaidOptions?.load) {\n return false;\n }\n\n if (prevProps.className !== nextProps.className) {\n return false;\n }\n\n if (prevProps.qa !== nextProps.qa) {\n return false;\n }\n\n if (prevProps.mdxOptions?.components !== nextProps.mdxOptions?.components) {\n return false;\n }\n\n if (prevProps.mdxOptions?.tagNames !== nextProps.mdxOptions?.tagNames) {\n return false;\n }\n\n if (prevProps.mdxOptions?.nonce !== nextProps.mdxOptions?.nonce) {\n return false;\n }\n\n if (prevProps.mdxContext !== nextProps.mdxContext) {\n return false;\n }\n\n if (prevProps.extraProps !== nextProps.extraProps) {\n return false;\n }\n\n return areOptionsEqual(prevProps.transformOptions, nextProps.transformOptions);\n});\n\nMarkdownRenderer.displayName = 'MarkdownRenderer';\n"]}
@@ -1,7 +1,11 @@
1
1
  .g-aikit-message-balloon {
2
2
  display: inline-block;
3
- background-color: var(--g-color-base-info-light);
3
+ background-color: var(--g-aikit-message-balloon-background, var(--g-color-base-info-light));
4
+ color: var(--g-aikit-message-balloon-color, inherit);
4
5
  padding: var(--g-spacing-2) var(--g-spacing-3);
5
6
  border-radius: var(--g-spacing-3) 0 var(--g-spacing-3) var(--g-spacing-3);
6
7
  max-width: 100%;
8
+ }
9
+ .g-aikit-message-balloon .g-aikit-markdown-renderer {
10
+ color: var(--g-aikit-message-balloon-color, var(--g-color-text-primary));
7
11
  }
@@ -2,7 +2,7 @@ import { type HTMLAttributes } from 'react';
2
2
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
3
3
  import type { BaseMessageProps, TAssistantMessage, TMessageContent, TMessageMetadata } from "../../../types/messages.js";
4
4
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
5
- import type { MarkdownRendererMdxOptions } from "../../atoms/MarkdownRenderer/index.js";
5
+ import type { MarkdownRendererMdxOptions, MermaidOptions } from "../../atoms/MarkdownRenderer/index.js";
6
6
  import "./AssistantMessage.css";
7
7
  type BaseMessagePick = Pick<BaseMessageProps, 'actions' | 'extraInfo' | 'timestamp' | 'showActionsOnHover' | 'showTimestamp' | 'onActionPopup'>;
8
8
  type AssistantMessagePick<TContent extends TMessageContent> = Pick<TAssistantMessage<TContent, TMessageMetadata>, 'id' | 'content' | 'userRating'>;
@@ -10,6 +10,7 @@ export type AssistantMessageProps<TContent extends TMessageContent = never> = Ba
10
10
  messageRendererRegistry?: MessageRendererRegistry;
11
11
  transformOptions?: OptionsType;
12
12
  shouldParseIncompleteMarkdown?: boolean;
13
+ mermaidOptions?: MermaidOptions;
13
14
  openMarkdownLinksInNewTab?: boolean;
14
15
  mdxOptions?: MarkdownRendererMdxOptions;
15
16
  mdxContext?: Record<string, unknown>;
@@ -18,6 +19,6 @@ export type AssistantMessageProps<TContent extends TMessageContent = never> = Ba
18
19
  className?: string;
19
20
  qa?: string;
20
21
  };
21
- declare function AssistantMessageComponent<TContent extends TMessageContent = never>({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }: AssistantMessageProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
22
+ declare function AssistantMessageComponent<TContent extends TMessageContent = never>({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, mermaidOptions, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }: AssistantMessageProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
22
23
  export declare const AssistantMessage: typeof AssistantMessageComponent;
23
24
  export {};
@@ -10,9 +10,9 @@ const BaseMessage_1 = require("../../molecules/BaseMessage/index.js");
10
10
  const defaultMessageTypeRegistry_1 = require("./defaultMessageTypeRegistry.js");
11
11
  require("./AssistantMessage.css");
12
12
  const b = (0, cn_1.block)('assistant-message');
13
- function AssistantMessageComponent({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }) {
13
+ function AssistantMessageComponent({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, mermaidOptions, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }) {
14
14
  const registry = (0, react_1.useMemo)(() => {
15
- const defaultRegistry = (0, defaultMessageTypeRegistry_1.createDefaultMessageRegistry)(transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps);
15
+ const defaultRegistry = (0, defaultMessageTypeRegistry_1.createDefaultMessageRegistry)(transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps, mermaidOptions);
16
16
  if (messageRendererRegistry) {
17
17
  return (0, messageTypeRegistry_1.mergeMessageRendererRegistries)(defaultRegistry, messageRendererRegistry);
18
18
  }
@@ -21,6 +21,7 @@ function AssistantMessageComponent({ content, actions, extraInfo, timestamp, id,
21
21
  messageRendererRegistry,
22
22
  transformOptions,
23
23
  shouldParseIncompleteMarkdown,
24
+ mermaidOptions,
24
25
  openMarkdownLinksInNewTab,
25
26
  mdxOptions,
26
27
  mdxContext,
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMessage.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/AssistantMessage.tsx"],"names":[],"mappings":";;;;AAAA,iCAAyD;AAWzD,6CAAwC;AACxC,+EAI4C;AAC5C,iEAA6D;AAE7D,sEAAwD;AAExD,gFAA0E;AAE1E,kCAAiC;AAyBjC,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,mBAAmB,CAAC,CAAC;AAErC,SAAS,yBAAyB,CAA2C,EACzE,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EACT,EAAE,EACF,uBAAuB,EACvB,gBAAgB,EAChB,6BAA6B,EAC7B,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,SAAS,EACT,EAAE,EACF,aAAa,GACiB;IAC9B,MAAM,QAAQ,GAAG,IAAA,eAAO,EAA0B,GAAG,EAAE;QACnD,MAAM,eAAe,GAAG,IAAA,yDAA4B,EAChD,gBAAgB,EAChB,6BAA6B,EAC7B,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,kBAAkB,CACrB,CAAC;QACF,IAAI,uBAAuB,EAAE,CAAC;YAC1B,OAAO,IAAA,oDAA8B,EAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC,EAAE;QACC,uBAAuB;QACvB,gBAAgB;QAChB,6BAA6B;QAC7B,yBAAyB;QACzB,UAAU;QACV,UAAU;QACV,kBAAkB;KACrB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,+BAAgB,EAAW,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,IAAoC,EAAE,SAAiB,EAAE,EAAE;QAC3E,MAAM,aAAa,GAAG,IAAA,wCAAkB,EAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,SAAS,SAAS,SAAS,EAAE,CAAC;QAE9D,OAAO,uBAAC,aAAa,IAAW,IAAI,EAAE,IAAI,IAAf,GAAG,CAAgB,CAAC;IACnD,CAAC,CAAC;IAEF,OAAO,CACH,uBAAC,yBAAW,IACR,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAC7B,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,aAAa,YAE5B,gCAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAClD,GACI,CACjB,CAAC;AACN,CAAC;AAED,MAAM,wBAAwB,GAAG,IAAA,YAAI,EAAC,yBAAyB,CAAC,CAAC;AACjE,wBAAwB,CAAC,WAAW,GAAG,kBAAkB,CAAC;AAE7C,QAAA,gBAAgB,GAAG,wBAA4D,CAAC","sourcesContent":["import {type HTMLAttributes, memo, useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n BaseMessageProps,\n TAssistantMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {\n type MessageRendererRegistry,\n getMessageRenderer,\n mergeMessageRendererRegistries,\n} from '../../../utils/messageTypeRegistry';\nimport {normalizeContent} from '../../../utils/messageUtils';\nimport type {MarkdownRendererMdxOptions} from '../../atoms/MarkdownRenderer';\nimport {BaseMessage} from '../../molecules/BaseMessage';\n\nimport {createDefaultMessageRegistry} from './defaultMessageTypeRegistry';\n\nimport './AssistantMessage.scss';\n\ntype BaseMessagePick = Pick<\n BaseMessageProps,\n 'actions' | 'extraInfo' | 'timestamp' | 'showActionsOnHover' | 'showTimestamp' | 'onActionPopup'\n>;\ntype AssistantMessagePick<TContent extends TMessageContent> = Pick<\n TAssistantMessage<TContent, TMessageMetadata>,\n 'id' | 'content' | 'userRating'\n>;\n\nexport type AssistantMessageProps<TContent extends TMessageContent = never> = BaseMessagePick &\n AssistantMessagePick<TContent> & {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n openMarkdownLinksInNewTab?: boolean;\n mdxOptions?: MarkdownRendererMdxOptions;\n mdxContext?: Record<string, unknown>;\n /** Extra props forwarded to the root container `div` of each rendered markdown block. */\n markdownExtraProps?: HTMLAttributes<HTMLDivElement>;\n className?: string;\n qa?: string;\n };\n\nconst b = block('assistant-message');\n\nfunction AssistantMessageComponent<TContent extends TMessageContent = never>({\n content,\n actions,\n extraInfo,\n timestamp,\n id,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxOptions,\n mdxContext,\n markdownExtraProps,\n showActionsOnHover,\n showTimestamp,\n userRating,\n className,\n qa,\n onActionPopup,\n}: AssistantMessageProps<TContent>) {\n const registry = useMemo<MessageRendererRegistry>(() => {\n const defaultRegistry = createDefaultMessageRegistry(\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxOptions,\n mdxContext,\n markdownExtraProps,\n );\n if (messageRendererRegistry) {\n return mergeMessageRendererRegistries(defaultRegistry, messageRendererRegistry);\n }\n\n return defaultRegistry;\n }, [\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxOptions,\n mdxContext,\n markdownExtraProps,\n ]);\n\n const parts = useMemo(() => normalizeContent<TContent>(content), [content]);\n\n if (parts.length === 0) {\n return null;\n }\n\n const renderPart = (part: TMessageContentUnion<TContent>, partIndex: number) => {\n const PartComponent = getMessageRenderer(registry, part.type);\n\n if (!PartComponent) {\n return null;\n }\n\n const key = part.id || `${id || 'message'}-part-${partIndex}`;\n\n return <PartComponent key={key} part={part} />;\n };\n\n return (\n <BaseMessage\n role=\"assistant\"\n actions={actions}\n extraInfo={extraInfo}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n timestamp={timestamp}\n userRating={userRating}\n className={b(null, className)}\n qa={qa}\n onActionPopup={onActionPopup}\n >\n <div className={b('content')}>\n {parts.map((part, index) => renderPart(part, index))}\n </div>\n </BaseMessage>\n );\n}\n\nconst MemoizedAssistantMessage = memo(AssistantMessageComponent);\nMemoizedAssistantMessage.displayName = 'AssistantMessage';\n\nexport const AssistantMessage = MemoizedAssistantMessage as typeof AssistantMessageComponent;\n"]}
1
+ {"version":3,"file":"AssistantMessage.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/AssistantMessage.tsx"],"names":[],"mappings":";;;;AAAA,iCAAyD;AAWzD,6CAAwC;AACxC,+EAI4C;AAC5C,iEAA6D;AAE7D,sEAAwD;AAExD,gFAA0E;AAE1E,kCAAiC;AA0BjC,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,mBAAmB,CAAC,CAAC;AAErC,SAAS,yBAAyB,CAA2C,EACzE,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EACT,EAAE,EACF,uBAAuB,EACvB,gBAAgB,EAChB,6BAA6B,EAC7B,cAAc,EACd,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,SAAS,EACT,EAAE,EACF,aAAa,GACiB;IAC9B,MAAM,QAAQ,GAAG,IAAA,eAAO,EAA0B,GAAG,EAAE;QACnD,MAAM,eAAe,GAAG,IAAA,yDAA4B,EAChD,gBAAgB,EAChB,6BAA6B,EAC7B,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,cAAc,CACjB,CAAC;QACF,IAAI,uBAAuB,EAAE,CAAC;YAC1B,OAAO,IAAA,oDAA8B,EAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC,EAAE;QACC,uBAAuB;QACvB,gBAAgB;QAChB,6BAA6B;QAC7B,cAAc;QACd,yBAAyB;QACzB,UAAU;QACV,UAAU;QACV,kBAAkB;KACrB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,+BAAgB,EAAW,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,IAAoC,EAAE,SAAiB,EAAE,EAAE;QAC3E,MAAM,aAAa,GAAG,IAAA,wCAAkB,EAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,SAAS,SAAS,SAAS,EAAE,CAAC;QAE9D,OAAO,uBAAC,aAAa,IAAW,IAAI,EAAE,IAAI,IAAf,GAAG,CAAgB,CAAC;IACnD,CAAC,CAAC;IAEF,OAAO,CACH,uBAAC,yBAAW,IACR,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAC7B,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,aAAa,YAE5B,gCAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAClD,GACI,CACjB,CAAC;AACN,CAAC;AAED,MAAM,wBAAwB,GAAG,IAAA,YAAI,EAAC,yBAAyB,CAAC,CAAC;AACjE,wBAAwB,CAAC,WAAW,GAAG,kBAAkB,CAAC;AAE7C,QAAA,gBAAgB,GAAG,wBAA4D,CAAC","sourcesContent":["import {type HTMLAttributes, memo, useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n BaseMessageProps,\n TAssistantMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {\n type MessageRendererRegistry,\n getMessageRenderer,\n mergeMessageRendererRegistries,\n} from '../../../utils/messageTypeRegistry';\nimport {normalizeContent} from '../../../utils/messageUtils';\nimport type {MarkdownRendererMdxOptions, MermaidOptions} from '../../atoms/MarkdownRenderer';\nimport {BaseMessage} from '../../molecules/BaseMessage';\n\nimport {createDefaultMessageRegistry} from './defaultMessageTypeRegistry';\n\nimport './AssistantMessage.scss';\n\ntype BaseMessagePick = Pick<\n BaseMessageProps,\n 'actions' | 'extraInfo' | 'timestamp' | 'showActionsOnHover' | 'showTimestamp' | 'onActionPopup'\n>;\ntype AssistantMessagePick<TContent extends TMessageContent> = Pick<\n TAssistantMessage<TContent, TMessageMetadata>,\n 'id' | 'content' | 'userRating'\n>;\n\nexport type AssistantMessageProps<TContent extends TMessageContent = never> = BaseMessagePick &\n AssistantMessagePick<TContent> & {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n mermaidOptions?: MermaidOptions;\n openMarkdownLinksInNewTab?: boolean;\n mdxOptions?: MarkdownRendererMdxOptions;\n mdxContext?: Record<string, unknown>;\n /** Extra props forwarded to the root container `div` of each rendered markdown block. */\n markdownExtraProps?: HTMLAttributes<HTMLDivElement>;\n className?: string;\n qa?: string;\n };\n\nconst b = block('assistant-message');\n\nfunction AssistantMessageComponent<TContent extends TMessageContent = never>({\n content,\n actions,\n extraInfo,\n timestamp,\n id,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxOptions,\n mdxContext,\n markdownExtraProps,\n showActionsOnHover,\n showTimestamp,\n userRating,\n className,\n qa,\n onActionPopup,\n}: AssistantMessageProps<TContent>) {\n const registry = useMemo<MessageRendererRegistry>(() => {\n const defaultRegistry = createDefaultMessageRegistry(\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxOptions,\n mdxContext,\n markdownExtraProps,\n mermaidOptions,\n );\n if (messageRendererRegistry) {\n return mergeMessageRendererRegistries(defaultRegistry, messageRendererRegistry);\n }\n\n return defaultRegistry;\n }, [\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxOptions,\n mdxContext,\n markdownExtraProps,\n ]);\n\n const parts = useMemo(() => normalizeContent<TContent>(content), [content]);\n\n if (parts.length === 0) {\n return null;\n }\n\n const renderPart = (part: TMessageContentUnion<TContent>, partIndex: number) => {\n const PartComponent = getMessageRenderer(registry, part.type);\n\n if (!PartComponent) {\n return null;\n }\n\n const key = part.id || `${id || 'message'}-part-${partIndex}`;\n\n return <PartComponent key={key} part={part} />;\n };\n\n return (\n <BaseMessage\n role=\"assistant\"\n actions={actions}\n extraInfo={extraInfo}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n timestamp={timestamp}\n userRating={userRating}\n className={b(null, className)}\n qa={qa}\n onActionPopup={onActionPopup}\n >\n <div className={b('content')}>\n {parts.map((part, index) => renderPart(part, index))}\n </div>\n </BaseMessage>\n );\n}\n\nconst MemoizedAssistantMessage = memo(AssistantMessageComponent);\nMemoizedAssistantMessage.displayName = 'AssistantMessage';\n\nexport const AssistantMessage = MemoizedAssistantMessage as typeof AssistantMessageComponent;\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { HTMLAttributes } from 'react';
2
2
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
3
3
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
4
- import { type MarkdownRendererMdxOptions } from "../../atoms/MarkdownRenderer/index.js";
5
- export declare function createDefaultMessageRegistry(transformOptions?: OptionsType, shouldParseIncompleteMarkdown?: boolean, openMarkdownLinksInNewTab?: boolean, mdxOptions?: MarkdownRendererMdxOptions, mdxContext?: Record<string, unknown>, markdownExtraProps?: HTMLAttributes<HTMLDivElement>): MessageRendererRegistry;
4
+ import { type MarkdownRendererMdxOptions, type MermaidOptions } from "../../atoms/MarkdownRenderer/index.js";
5
+ export declare function createDefaultMessageRegistry(transformOptions?: OptionsType, shouldParseIncompleteMarkdown?: boolean, openMarkdownLinksInNewTab?: boolean, mdxOptions?: MarkdownRendererMdxOptions, mdxContext?: Record<string, unknown>, markdownExtraProps?: HTMLAttributes<HTMLDivElement>, mermaidOptions?: MermaidOptions): MessageRendererRegistry;
@@ -6,10 +6,10 @@ const messageTypeRegistry_1 = require("../../../utils/messageTypeRegistry.js");
6
6
  const MarkdownRenderer_1 = require("../../atoms/MarkdownRenderer/index.js");
7
7
  const ThinkingMessage_1 = require("../ThinkingMessage/index.js");
8
8
  const ToolMessage_1 = require("../ToolMessage/index.js");
9
- function createDefaultMessageRegistry(transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps) {
9
+ function createDefaultMessageRegistry(transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, mdxContext, markdownExtraProps, mermaidOptions) {
10
10
  const registry = (0, messageTypeRegistry_1.createMessageRendererRegistry)();
11
11
  (0, messageTypeRegistry_1.registerMessageRenderer)(registry, 'text', {
12
- component: ({ part }) => ((0, jsx_runtime_1.jsx)(MarkdownRenderer_1.MarkdownRenderer, { content: part.data.text, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, openLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, extraProps: markdownExtraProps })),
12
+ component: ({ part }) => ((0, jsx_runtime_1.jsx)(MarkdownRenderer_1.MarkdownRenderer, { content: part.data.text, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, mermaidOptions: mermaidOptions, openLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, extraProps: markdownExtraProps })),
13
13
  }, {
14
14
  isDefault: true,
15
15
  });
@@ -19,7 +19,7 @@ function createDefaultMessageRegistry(transformOptions, shouldParseIncompleteMar
19
19
  isDefault: true,
20
20
  });
21
21
  (0, messageTypeRegistry_1.registerMessageRenderer)(registry, 'thinking', {
22
- component: ({ part }) => ((0, jsx_runtime_1.jsx)(ThinkingMessage_1.ThinkingMessage, Object.assign({}, part.data, { openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, markdownExtraProps: markdownExtraProps }))),
22
+ component: ({ part }) => ((0, jsx_runtime_1.jsx)(ThinkingMessage_1.ThinkingMessage, Object.assign({}, part.data, { mermaidOptions: mermaidOptions, openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, markdownExtraProps: markdownExtraProps }))),
23
23
  }, {
24
24
  isDefault: true,
25
25
  });
@@ -1 +1 @@
1
- {"version":3,"file":"defaultMessageTypeRegistry.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/defaultMessageTypeRegistry.tsx"],"names":[],"mappings":";;AAkBA,oEA8DC;;AAvED,+EAI4C;AAC5C,4EAA+F;AAC/F,iEAAmD;AACnD,yDAA2C;AAE3C,SAAgB,4BAA4B,CACxC,gBAA8B,EAC9B,6BAAuC,EACvC,yBAAmC,EACnC,UAAuC,EACvC,UAAoC,EACpC,kBAAmD;IAEnD,MAAM,QAAQ,GAAG,IAAA,mDAA6B,GAAE,CAAC;IAEjD,IAAA,6CAAuB,EACnB,QAAQ,EACR,MAAM,EACN;QACI,SAAS,EAAE,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACnB,uBAAC,mCAAgB,IACb,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EACvB,gBAAgB,EAAE,gBAAgB,EAClC,6BAA6B,EAAE,6BAA6B,EAC5D,iBAAiB,EAAE,yBAAyB,EAC5C,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,kBAAkB,GAChC,CACL;KACJ,EACD;QACI,SAAS,EAAE,IAAI;KAClB,CACJ,CAAC;IAEF,IAAA,6CAAuB,EACnB,QAAQ,EACR,MAAM,EACN;QACI,SAAS,EAAE,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,uBAAC,yBAAW,oBAAK,IAAI,CAAC,IAAI,EAAI;KACxD,EACD;QACI,SAAS,EAAE,IAAI;KAClB,CACJ,CAAC;IAEF,IAAA,6CAAuB,EACnB,QAAQ,EACR,UAAU,EACV;QACI,SAAS,EAAE,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACnB,uBAAC,iCAAe,oBACR,IAAI,CAAC,IAAI,IACb,yBAAyB,EAAE,yBAAyB,EACpD,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB,IACxC,CACL;KACJ,EACD;QACI,SAAS,EAAE,IAAI;KAClB,CACJ,CAAC;IAEF,OAAO,QAAQ,CAAC;AACpB,CAAC","sourcesContent":["import type {HTMLAttributes} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n TextMessageContent,\n ThinkingMessageContent,\n ToolMessageContent,\n} from '../../../types/messages';\nimport {\n type MessageRendererRegistry,\n createMessageRendererRegistry,\n registerMessageRenderer,\n} from '../../../utils/messageTypeRegistry';\nimport {MarkdownRenderer, type MarkdownRendererMdxOptions} from '../../atoms/MarkdownRenderer';\nimport {ThinkingMessage} from '../ThinkingMessage';\nimport {ToolMessage} from '../ToolMessage';\n\nexport function createDefaultMessageRegistry(\n transformOptions?: OptionsType,\n shouldParseIncompleteMarkdown?: boolean,\n openMarkdownLinksInNewTab?: boolean,\n mdxOptions?: MarkdownRendererMdxOptions,\n mdxContext?: Record<string, unknown>,\n markdownExtraProps?: HTMLAttributes<HTMLDivElement>,\n): MessageRendererRegistry {\n const registry = createMessageRendererRegistry();\n\n registerMessageRenderer<TextMessageContent>(\n registry,\n 'text',\n {\n component: ({part}) => (\n <MarkdownRenderer\n content={part.data.text}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n openLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n extraProps={markdownExtraProps}\n />\n ),\n },\n {\n isDefault: true,\n },\n );\n\n registerMessageRenderer<ToolMessageContent>(\n registry,\n 'tool',\n {\n component: ({part}) => <ToolMessage {...part.data} />,\n },\n {\n isDefault: true,\n },\n );\n\n registerMessageRenderer<ThinkingMessageContent>(\n registry,\n 'thinking',\n {\n component: ({part}) => (\n <ThinkingMessage\n {...part.data}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n markdownExtraProps={markdownExtraProps}\n />\n ),\n },\n {\n isDefault: true,\n },\n );\n\n return registry;\n}\n"]}
1
+ {"version":3,"file":"defaultMessageTypeRegistry.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/defaultMessageTypeRegistry.tsx"],"names":[],"mappings":";;AAsBA,oEAiEC;;AA9ED,+EAI4C;AAC5C,4EAIsC;AACtC,iEAAmD;AACnD,yDAA2C;AAE3C,SAAgB,4BAA4B,CACxC,gBAA8B,EAC9B,6BAAuC,EACvC,yBAAmC,EACnC,UAAuC,EACvC,UAAoC,EACpC,kBAAmD,EACnD,cAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAA,mDAA6B,GAAE,CAAC;IAEjD,IAAA,6CAAuB,EACnB,QAAQ,EACR,MAAM,EACN;QACI,SAAS,EAAE,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACnB,uBAAC,mCAAgB,IACb,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EACvB,gBAAgB,EAAE,gBAAgB,EAClC,6BAA6B,EAAE,6BAA6B,EAC5D,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,yBAAyB,EAC5C,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,kBAAkB,GAChC,CACL;KACJ,EACD;QACI,SAAS,EAAE,IAAI;KAClB,CACJ,CAAC;IAEF,IAAA,6CAAuB,EACnB,QAAQ,EACR,MAAM,EACN;QACI,SAAS,EAAE,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,uBAAC,yBAAW,oBAAK,IAAI,CAAC,IAAI,EAAI;KACxD,EACD;QACI,SAAS,EAAE,IAAI;KAClB,CACJ,CAAC;IAEF,IAAA,6CAAuB,EACnB,QAAQ,EACR,UAAU,EACV;QACI,SAAS,EAAE,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACnB,uBAAC,iCAAe,oBACR,IAAI,CAAC,IAAI,IACb,cAAc,EAAE,cAAc,EAC9B,yBAAyB,EAAE,yBAAyB,EACpD,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB,IACxC,CACL;KACJ,EACD;QACI,SAAS,EAAE,IAAI;KAClB,CACJ,CAAC;IAEF,OAAO,QAAQ,CAAC;AACpB,CAAC","sourcesContent":["import type {HTMLAttributes} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n TextMessageContent,\n ThinkingMessageContent,\n ToolMessageContent,\n} from '../../../types/messages';\nimport {\n type MessageRendererRegistry,\n createMessageRendererRegistry,\n registerMessageRenderer,\n} from '../../../utils/messageTypeRegistry';\nimport {\n MarkdownRenderer,\n type MarkdownRendererMdxOptions,\n type MermaidOptions,\n} from '../../atoms/MarkdownRenderer';\nimport {ThinkingMessage} from '../ThinkingMessage';\nimport {ToolMessage} from '../ToolMessage';\n\nexport function createDefaultMessageRegistry(\n transformOptions?: OptionsType,\n shouldParseIncompleteMarkdown?: boolean,\n openMarkdownLinksInNewTab?: boolean,\n mdxOptions?: MarkdownRendererMdxOptions,\n mdxContext?: Record<string, unknown>,\n markdownExtraProps?: HTMLAttributes<HTMLDivElement>,\n mermaidOptions?: MermaidOptions,\n): MessageRendererRegistry {\n const registry = createMessageRendererRegistry();\n\n registerMessageRenderer<TextMessageContent>(\n registry,\n 'text',\n {\n component: ({part}) => (\n <MarkdownRenderer\n content={part.data.text}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n mermaidOptions={mermaidOptions}\n openLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n extraProps={markdownExtraProps}\n />\n ),\n },\n {\n isDefault: true,\n },\n );\n\n registerMessageRenderer<ToolMessageContent>(\n registry,\n 'tool',\n {\n component: ({part}) => <ToolMessage {...part.data} />,\n },\n {\n isDefault: true,\n },\n );\n\n registerMessageRenderer<ThinkingMessageContent>(\n registry,\n 'thinking',\n {\n component: ({part}) => (\n <ThinkingMessage\n {...part.data}\n mermaidOptions={mermaidOptions}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n markdownExtraProps={markdownExtraProps}\n />\n ),\n },\n {\n isDefault: true,\n },\n );\n\n return registry;\n}\n"]}
@@ -2,7 +2,7 @@ import { type HTMLAttributes } from 'react';
2
2
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
3
3
  import type { BaseMessageActionConfig, DefaultMessageAction, MessageExtraInfoComponent, TAssistantMessage, TChatMessage, TMessageContent, TMessageMetadata, TUserMessage } from "../../../types/messages.js";
4
4
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
5
- import type { MarkdownRendererMdxOptions } from "../../atoms/MarkdownRenderer/index.js";
5
+ import type { MarkdownRendererMdxOptions, MermaidOptions } from "../../atoms/MarkdownRenderer/index.js";
6
6
  /**
7
7
  * Shared configuration for a single rendered message. These props are expected to be
8
8
  * referentially stable across renders (memoized by the parent list), so that the memoized
@@ -12,6 +12,7 @@ export type MessageItemConfig<TContent extends TMessageContent = never> = {
12
12
  messageRendererRegistry?: MessageRendererRegistry;
13
13
  transformOptions?: OptionsType;
14
14
  shouldParseIncompleteMarkdown?: boolean;
15
+ mermaidOptions?: MermaidOptions;
15
16
  openMarkdownLinksInNewTab?: boolean;
16
17
  mdxOptions?: MarkdownRendererMdxOptions;
17
18
  getMarkdownExtraProps?: (message: TChatMessage<TContent, TMessageMetadata>) => HTMLAttributes<HTMLDivElement> | undefined;
@@ -35,7 +36,7 @@ export type MessageItemProps<TContent extends TMessageContent = never> = Message
35
36
  */
36
37
  suppressActions: boolean;
37
38
  };
38
- declare function MessageItemComponent<TContent extends TMessageContent = never>({ message, suppressActions, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, getMarkdownExtraProps, getMdxContext, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, onActionPopup, }: MessageItemProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
39
+ declare function MessageItemComponent<TContent extends TMessageContent = never>({ message, suppressActions, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, mermaidOptions, openMarkdownLinksInNewTab, mdxOptions, getMarkdownExtraProps, getMdxContext, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, onActionPopup, }: MessageItemProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
39
40
  /**
40
41
  * Memoized single message renderer shared by the plain and virtualized message lists.
41
42
  * Re-renders only when `message`, `suppressActions`, or one of the (stable) config props changes,
@@ -6,12 +6,12 @@ const react_1 = require("react");
6
6
  const utils_1 = require("../../../utils/index.js");
7
7
  const AssistantMessage_1 = require("../AssistantMessage/index.js");
8
8
  const UserMessage_1 = require("../UserMessage/index.js");
9
- function MessageItemComponent({ message, suppressActions, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxOptions, getMarkdownExtraProps, getMdxContext, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, onActionPopup, }) {
9
+ function MessageItemComponent({ message, suppressActions, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, mermaidOptions, openMarkdownLinksInNewTab, mdxOptions, getMarkdownExtraProps, getMdxContext, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, onActionPopup, }) {
10
10
  const mdxContext = (0, react_1.useMemo)(() => getMdxContext === null || getMdxContext === void 0 ? void 0 : getMdxContext(message), [getMdxContext, message]);
11
11
  const markdownExtraProps = (0, react_1.useMemo)(() => getMarkdownExtraProps === null || getMarkdownExtraProps === void 0 ? void 0 : getMarkdownExtraProps(message), [getMarkdownExtraProps, message]);
12
12
  if ((0, utils_1.isUserMessage)(message)) {
13
13
  const actions = (0, utils_1.resolveMessageActions)(message, userActions);
14
- return ((0, jsx_runtime_1.jsx)(UserMessage_1.UserMessage, { content: message.content, actions: actions, extraInfo: UserExtraInfo ? (0, jsx_runtime_1.jsx)(UserExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, format: message.format, avatarUrl: message.avatarUrl, images: message.images, fileAttachments: message.fileAttachments, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, markdownExtraProps: markdownExtraProps, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, showAvatar: showAvatar, onActionPopup: (action, anchor) => onActionPopup(message, action, anchor) }));
14
+ return ((0, jsx_runtime_1.jsx)(UserMessage_1.UserMessage, { content: message.content, actions: actions, extraInfo: UserExtraInfo ? (0, jsx_runtime_1.jsx)(UserExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, format: message.format, avatarUrl: message.avatarUrl, images: message.images, fileAttachments: message.fileAttachments, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, mermaidOptions: mermaidOptions, openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, markdownExtraProps: markdownExtraProps, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, showAvatar: showAvatar, onActionPopup: (action, anchor) => onActionPopup(message, action, anchor) }));
15
15
  }
16
16
  if ((0, utils_1.isAssistantMessage)(message)) {
17
17
  // Don't show assistantActions for messages with ONLY thinking content.
@@ -19,7 +19,7 @@ function MessageItemComponent({ message, suppressActions, messageRendererRegistr
19
19
  const actions = !suppressActions && !(0, utils_1.hasOnlyThinkingContent)(message.content)
20
20
  ? (0, utils_1.resolveMessageActions)(message, assistantActions)
21
21
  : undefined;
22
- return ((0, jsx_runtime_1.jsx)(AssistantMessage_1.AssistantMessage, { content: message.content, actions: actions, extraInfo: AssistantExtraInfo ? (0, jsx_runtime_1.jsx)(AssistantExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, id: message.id, messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, markdownExtraProps: markdownExtraProps, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, userRating: message.userRating, onActionPopup: (action, anchor) => onActionPopup(message, action, anchor) }));
22
+ return ((0, jsx_runtime_1.jsx)(AssistantMessage_1.AssistantMessage, { content: message.content, actions: actions, extraInfo: AssistantExtraInfo ? (0, jsx_runtime_1.jsx)(AssistantExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, id: message.id, messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, mermaidOptions: mermaidOptions, openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxOptions, mdxContext: mdxContext, markdownExtraProps: markdownExtraProps, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, userRating: message.userRating, onActionPopup: (action, anchor) => onActionPopup(message, action, anchor) }));
23
23
  }
24
24
  return null;
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MessageItem.js","sourceRoot":"../../../../../src","sources":["components/organisms/MessageList/MessageItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type HTMLAttributes, memo, useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n BaseMessageActionConfig,\n DefaultMessageAction,\n MessageExtraInfoComponent,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageMetadata,\n TUserMessage,\n} from '../../../types/messages';\nimport {\n hasOnlyThinkingContent,\n isAssistantMessage,\n isUserMessage,\n resolveMessageActions,\n} from '../../../utils';\nimport {type MessageRendererRegistry} from '../../../utils/messageTypeRegistry';\nimport type {MarkdownRendererMdxOptions} from '../../atoms/MarkdownRenderer';\nimport {AssistantMessage} from '../AssistantMessage';\nimport {UserMessage} from '../UserMessage';\n\n/**\n * Shared configuration for a single rendered message. These props are expected to be\n * referentially stable across renders (memoized by the parent list), so that the memoized\n * `MessageItem` only re-renders when the `message` itself changes.\n */\nexport type MessageItemConfig<TContent extends TMessageContent = never> = {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n openMarkdownLinksInNewTab?: boolean;\n mdxOptions?: MarkdownRendererMdxOptions;\n getMarkdownExtraProps?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => HTMLAttributes<HTMLDivElement> | undefined;\n\n getMdxContext?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => Record<string, unknown> | undefined;\n showActionsOnHover?: boolean;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n userActions?: DefaultMessageAction<TUserMessage<TMessageMetadata>>[];\n assistantActions?: DefaultMessageAction<TAssistantMessage<TContent, TMessageMetadata>>[];\n userExtraInfo?: MessageExtraInfoComponent<TUserMessage<TMessageMetadata>>;\n assistantExtraInfo?: MessageExtraInfoComponent<TAssistantMessage<TContent, TMessageMetadata>>;\n /** Stable popup handler from `usePopup`; bound to the concrete message internally. */\n onActionPopup: (\n message: TChatMessage<TContent, TMessageMetadata>,\n action: BaseMessageActionConfig,\n anchor: HTMLElement,\n ) => void;\n};\n\nexport type MessageItemProps<TContent extends TMessageContent = never> =\n MessageItemConfig<TContent> & {\n message: TChatMessage<TContent, TMessageMetadata>;\n /**\n * Whether action buttons should be hidden for this message. Precomputed by the parent\n * (the last message while a response is still streaming/submitted) so that completed\n * messages keep a stable value and stay memoized.\n */\n suppressActions: boolean;\n };\n\nfunction MessageItemComponent<TContent extends TMessageContent = never>({\n message,\n suppressActions,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxOptions,\n getMarkdownExtraProps,\n getMdxContext,\n showActionsOnHover,\n showTimestamp,\n showAvatar,\n userActions,\n assistantActions,\n userExtraInfo: UserExtraInfo,\n assistantExtraInfo: AssistantExtraInfo,\n onActionPopup,\n}: MessageItemProps<TContent>) {\n const mdxContext = useMemo(\n () => getMdxContext?.(message) as Record<string, unknown> | undefined,\n [getMdxContext, message],\n );\n const markdownExtraProps = useMemo(\n () => getMarkdownExtraProps?.(message),\n [getMarkdownExtraProps, message],\n );\n\n if (isUserMessage<TMessageMetadata, TContent>(message)) {\n const actions = resolveMessageActions(message, userActions);\n\n return (\n <UserMessage\n content={message.content}\n actions={actions}\n extraInfo={UserExtraInfo ? <UserExtraInfo message={message} /> : undefined}\n timestamp={message.timestamp}\n format={message.format}\n avatarUrl={message.avatarUrl}\n images={message.images}\n fileAttachments={message.fileAttachments}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n markdownExtraProps={markdownExtraProps}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n showAvatar={showAvatar}\n onActionPopup={(action, anchor) => onActionPopup(message, action, anchor)}\n />\n );\n }\n\n if (isAssistantMessage<TMessageMetadata, TContent>(message)) {\n // Don't show assistantActions for messages with ONLY thinking content.\n // For mixed content (thinking + text), actions are shown and copy the entire message.\n const actions =\n !suppressActions && !hasOnlyThinkingContent(message.content)\n ? resolveMessageActions(message, assistantActions)\n : undefined;\n\n return (\n <AssistantMessage<TContent>\n content={message.content}\n actions={actions}\n extraInfo={\n AssistantExtraInfo ? <AssistantExtraInfo message={message} /> : undefined\n }\n timestamp={message.timestamp}\n id={message.id}\n messageRendererRegistry={messageRendererRegistry}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n markdownExtraProps={markdownExtraProps}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n userRating={message.userRating}\n onActionPopup={(action, anchor) => onActionPopup(message, action, anchor)}\n />\n );\n }\n\n return null;\n}\n\n/**\n * Memoized single message renderer shared by the plain and virtualized message lists.\n * Re-renders only when `message`, `suppressActions`, or one of the (stable) config props changes,\n * so that during streaming only the message that actually changed is re-rendered.\n */\nexport const MessageItem = memo(MessageItemComponent) as typeof MessageItemComponent;\n"]}
1
+ {"version":3,"file":"MessageItem.js","sourceRoot":"../../../../../src","sources":["components/organisms/MessageList/MessageItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type HTMLAttributes, memo, useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n BaseMessageActionConfig,\n DefaultMessageAction,\n MessageExtraInfoComponent,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageMetadata,\n TUserMessage,\n} from '../../../types/messages';\nimport {\n hasOnlyThinkingContent,\n isAssistantMessage,\n isUserMessage,\n resolveMessageActions,\n} from '../../../utils';\nimport {type MessageRendererRegistry} from '../../../utils/messageTypeRegistry';\nimport type {MarkdownRendererMdxOptions, MermaidOptions} from '../../atoms/MarkdownRenderer';\nimport {AssistantMessage} from '../AssistantMessage';\nimport {UserMessage} from '../UserMessage';\n\n/**\n * Shared configuration for a single rendered message. These props are expected to be\n * referentially stable across renders (memoized by the parent list), so that the memoized\n * `MessageItem` only re-renders when the `message` itself changes.\n */\nexport type MessageItemConfig<TContent extends TMessageContent = never> = {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n mermaidOptions?: MermaidOptions;\n openMarkdownLinksInNewTab?: boolean;\n mdxOptions?: MarkdownRendererMdxOptions;\n getMarkdownExtraProps?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => HTMLAttributes<HTMLDivElement> | undefined;\n\n getMdxContext?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => Record<string, unknown> | undefined;\n showActionsOnHover?: boolean;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n userActions?: DefaultMessageAction<TUserMessage<TMessageMetadata>>[];\n assistantActions?: DefaultMessageAction<TAssistantMessage<TContent, TMessageMetadata>>[];\n userExtraInfo?: MessageExtraInfoComponent<TUserMessage<TMessageMetadata>>;\n assistantExtraInfo?: MessageExtraInfoComponent<TAssistantMessage<TContent, TMessageMetadata>>;\n /** Stable popup handler from `usePopup`; bound to the concrete message internally. */\n onActionPopup: (\n message: TChatMessage<TContent, TMessageMetadata>,\n action: BaseMessageActionConfig,\n anchor: HTMLElement,\n ) => void;\n};\n\nexport type MessageItemProps<TContent extends TMessageContent = never> =\n MessageItemConfig<TContent> & {\n message: TChatMessage<TContent, TMessageMetadata>;\n /**\n * Whether action buttons should be hidden for this message. Precomputed by the parent\n * (the last message while a response is still streaming/submitted) so that completed\n * messages keep a stable value and stay memoized.\n */\n suppressActions: boolean;\n };\n\nfunction MessageItemComponent<TContent extends TMessageContent = never>({\n message,\n suppressActions,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxOptions,\n getMarkdownExtraProps,\n getMdxContext,\n showActionsOnHover,\n showTimestamp,\n showAvatar,\n userActions,\n assistantActions,\n userExtraInfo: UserExtraInfo,\n assistantExtraInfo: AssistantExtraInfo,\n onActionPopup,\n}: MessageItemProps<TContent>) {\n const mdxContext = useMemo(\n () => getMdxContext?.(message) as Record<string, unknown> | undefined,\n [getMdxContext, message],\n );\n const markdownExtraProps = useMemo(\n () => getMarkdownExtraProps?.(message),\n [getMarkdownExtraProps, message],\n );\n\n if (isUserMessage<TMessageMetadata, TContent>(message)) {\n const actions = resolveMessageActions(message, userActions);\n\n return (\n <UserMessage\n content={message.content}\n actions={actions}\n extraInfo={UserExtraInfo ? <UserExtraInfo message={message} /> : undefined}\n timestamp={message.timestamp}\n format={message.format}\n avatarUrl={message.avatarUrl}\n images={message.images}\n fileAttachments={message.fileAttachments}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n mermaidOptions={mermaidOptions}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n markdownExtraProps={markdownExtraProps}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n showAvatar={showAvatar}\n onActionPopup={(action, anchor) => onActionPopup(message, action, anchor)}\n />\n );\n }\n\n if (isAssistantMessage<TMessageMetadata, TContent>(message)) {\n // Don't show assistantActions for messages with ONLY thinking content.\n // For mixed content (thinking + text), actions are shown and copy the entire message.\n const actions =\n !suppressActions && !hasOnlyThinkingContent(message.content)\n ? resolveMessageActions(message, assistantActions)\n : undefined;\n\n return (\n <AssistantMessage<TContent>\n content={message.content}\n actions={actions}\n extraInfo={\n AssistantExtraInfo ? <AssistantExtraInfo message={message} /> : undefined\n }\n timestamp={message.timestamp}\n id={message.id}\n messageRendererRegistry={messageRendererRegistry}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n mermaidOptions={mermaidOptions}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxOptions}\n mdxContext={mdxContext}\n markdownExtraProps={markdownExtraProps}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n userRating={message.userRating}\n onActionPopup={(action, anchor) => onActionPopup(message, action, anchor)}\n />\n );\n }\n\n return null;\n}\n\n/**\n * Memoized single message renderer shared by the plain and virtualized message lists.\n * Re-renders only when `message`, `suppressActions`, or one of the (stable) config props changes,\n * so that during streaming only the message that actually changed is re-rendered.\n */\nexport const MessageItem = memo(MessageItemComponent) as typeof MessageItemComponent;\n"]}
@@ -5,7 +5,7 @@ import { ChatStatus } from "../../../types/index.js";
5
5
  import type { DefaultMessageAction, MessageExtraInfoComponent, TAssistantMessage, TChatMessage, TMessageContent, TMessageMetadata, TUserMessage } from "../../../types/messages.js";
6
6
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
7
7
  import { AlertProps } from "../../atoms/Alert/index.js";
8
- import type { MarkdownRendererMdxOptions } from "../../atoms/MarkdownRenderer/index.js";
8
+ import type { MarkdownRendererMdxOptions, MermaidOptions } from "../../atoms/MarkdownRenderer/index.js";
9
9
  import { type RatingBlockProps } from "../../molecules/RatingBlock/RatingBlock.js";
10
10
  import "./MessageList.css";
11
11
  export declare enum MessageListQa {
@@ -56,6 +56,7 @@ export type MessageListProps<TContent extends TMessageContent = never> = {
56
56
  messageRendererRegistry?: MessageRendererRegistry;
57
57
  transformOptions?: OptionsType;
58
58
  shouldParseIncompleteMarkdown?: boolean;
59
+ mermaidOptions?: MermaidOptions;
59
60
  openMarkdownLinksInNewTab?: boolean;
60
61
  /** Grouped MDX/markdown rendering props (`mdxOptions`, `getMarkdownExtraProps`, `getMdxContext`). */
61
62
  mdxProps?: MdxProps<TContent>;
@@ -25,7 +25,7 @@ function MessageList(props) {
25
25
  }
26
26
  return (0, jsx_runtime_1.jsx)(PlainMessageList, Object.assign({}, props));
27
27
  }
28
- function PlainMessageList({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxProps, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses = ['submitted', 'streaming_loading'], className, qa, status, errorMessage, loaderMessage, withLoaderShimmer, onRetry, hasPreviousMessages = false, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, footerContent, }) {
28
+ function PlainMessageList({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, mermaidOptions, openMarkdownLinksInNewTab, mdxProps, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses = ['submitted', 'streaming_loading'], className, qa, status, errorMessage, loaderMessage, withLoaderShimmer, onRetry, hasPreviousMessages = false, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, footerContent, }) {
29
29
  const isStreaming = status === 'streaming' || status === 'streaming_loading';
30
30
  const isSubmitted = status === 'submitted';
31
31
  const showLoader = status && loaderStatuses.includes(status);
@@ -40,6 +40,6 @@ function PlainMessageList({ messages, messageRendererRegistry, transformOptions,
40
40
  (0, hooks_1.useScrollPreservation)(containerRef, messages.length);
41
41
  const isNotCompleted = isSubmitted || isStreaming;
42
42
  return ((0, jsx_runtime_1.jsxs)("div", { ref: containerRef, className: b(null, className), "data-qa": qa !== null && qa !== void 0 ? qa : MessageListQa.Root, children: [hasPreviousMessages && ((0, jsx_runtime_1.jsx)(IntersectionContainer_1.IntersectionContainer, { onIntersect: onLoadPreviousMessages, className: b('load-trigger'), children: (0, jsx_runtime_1.jsx)(Loader_1.Loader, { view: "loading" }) })), (0, jsx_runtime_1.jsx)("div", { className: b('messages'), "data-qa": qa ? `${qa}-messages` : MessageListQa.Messages, children: messages.map((message, index) => ((0, jsx_runtime_1.jsx)(MessageItem_1.MessageItem, { message: message, suppressActions: index === messages.length - 1 && isNotCompleted, showActionsOnHover: showActionsOnHover &&
43
- !(0, usePopup_1.isActionPopupOpenForMessage)(popupState, message.id), messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxProps === null || mdxProps === void 0 ? void 0 : mdxProps.mdxOptions, getMarkdownExtraProps: mdxProps === null || mdxProps === void 0 ? void 0 : mdxProps.getMarkdownExtraProps, getMdxContext: mdxProps === null || mdxProps === void 0 ? void 0 : mdxProps.getMdxContext, showTimestamp: showTimestamp, showAvatar: showAvatar, userActions: userActions, assistantActions: assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, onActionPopup: handleActionPopup }, message.id || `message-${index}`))) }), (0, jsx_runtime_1.jsx)(MessageListFooter_1.MessageListFooter, { showLoader: showLoader, status: status, errorMessage: errorMessage, loaderMessage: loaderMessage, withLoaderShimmer: withLoaderShimmer, onRetry: onRetry, ratingBlockProps: ratingBlockProps, actionPopupProps: actionPopupProps, qa: qa, showActionPopup: showActionPopup, popupState: popupState, onPopupOpenChange: handlePopupOpenChange }), footerContent !== undefined && footerContent !== null && ((0, jsx_runtime_1.jsx)("div", { className: b('footer-content'), children: footerContent }))] }));
43
+ !(0, usePopup_1.isActionPopupOpenForMessage)(popupState, message.id), messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, mermaidOptions: mermaidOptions, openMarkdownLinksInNewTab: openMarkdownLinksInNewTab, mdxOptions: mdxProps === null || mdxProps === void 0 ? void 0 : mdxProps.mdxOptions, getMarkdownExtraProps: mdxProps === null || mdxProps === void 0 ? void 0 : mdxProps.getMarkdownExtraProps, getMdxContext: mdxProps === null || mdxProps === void 0 ? void 0 : mdxProps.getMdxContext, showTimestamp: showTimestamp, showAvatar: showAvatar, userActions: userActions, assistantActions: assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, onActionPopup: handleActionPopup }, message.id || `message-${index}`))) }), (0, jsx_runtime_1.jsx)(MessageListFooter_1.MessageListFooter, { showLoader: showLoader, status: status, errorMessage: errorMessage, loaderMessage: loaderMessage, withLoaderShimmer: withLoaderShimmer, onRetry: onRetry, ratingBlockProps: ratingBlockProps, actionPopupProps: actionPopupProps, qa: qa, showActionPopup: showActionPopup, popupState: popupState, onPopupOpenChange: handlePopupOpenChange }), footerContent !== undefined && footerContent !== null && ((0, jsx_runtime_1.jsx)("div", { className: b('footer-content'), children: footerContent }))] }));
44
44
  }
45
45
  //# sourceMappingURL=MessageList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageList.js","sourceRoot":"../../../../../src","sources":["components/organisms/MessageList/MessageList.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {HTMLAttributes} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\nimport type {PopupPlacement} from '@gravity-ui/uikit';\n\nimport {useScrollPreservation, useSmartScroll} from '../../../hooks';\nimport {ChatStatus} from '../../../types';\nimport type {\n DefaultMessageAction,\n MessageExtraInfoComponent,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageMetadata,\n TUserMessage,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {type MessageRendererRegistry} from '../../../utils/messageTypeRegistry';\nimport {AlertProps} from '../../atoms/Alert';\nimport {IntersectionContainer} from '../../atoms/IntersectionContainer';\nimport {Loader} from '../../atoms/Loader';\nimport type {MarkdownRendererMdxOptions} from '../../atoms/MarkdownRenderer';\nimport {type RatingBlockProps} from '../../molecules/RatingBlock/RatingBlock';\n\nimport {MessageItem} from './MessageItem';\nimport {VirtualizedMessageList} from './MessageList.virtualized';\nimport {MessageListFooter} from './MessageListFooter';\nimport {isActionPopupOpenForMessage, usePopup} from './usePopup';\n\nimport './MessageList.scss';\n\nconst b = block('message-list');\n\nexport enum MessageListQa {\n Root = 'message-list',\n Messages = 'message-list-messages',\n}\n\n/** Configuration for action popup behavior */\nexport interface MessageListActionPopupConfig {\n /** Override title for all popups (overrides action-specific title) */\n title?: string;\n /** Override subtitle for all popups (overrides action-specific subtitle) */\n subtitle?: string;\n /** Override placement for all popups (overrides action-specific placement) */\n placement?: PopupPlacement;\n /** Additional CSS class for popup */\n className?: string;\n /** QA/test identifier for popup */\n qa?: string;\n}\n\n/**\n * Grouped MDX/markdown rendering props exposed as a single object on `MessageList` and\n * `ChatContainer`. They are destructured back into individual props before being handed to\n * the low-level `MessageItem` renderer.\n */\nexport type MdxProps<TContent extends TMessageContent = never> = {\n /** Options for rendering MDX (`@diplodoc/mdx-extension`) in the default message renderers */\n mdxOptions?: MarkdownRendererMdxOptions;\n /**\n * Resolves the extra props forwarded to the root container `div` of each rendered\n * markdown block. Called with the concrete message so handlers (e.g. `onClick`) can\n * identify the message they belong to.\n */\n getMarkdownExtraProps?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => HTMLAttributes<HTMLDivElement> | undefined;\n /**\n * Resolves the per-message value exposed to MDX components (via `useMdxContext`).\n * Called with the concrete message so embedded MDX components can read data\n * unique to the message they belong to.\n */\n getMdxContext?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => Record<string, unknown> | undefined;\n};\n\nexport type MessageListProps<TContent extends TMessageContent = never> = {\n messages: TChatMessage<TContent, TMessageMetadata>[];\n status?: ChatStatus;\n errorMessage?: AlertProps;\n loaderMessage?: string;\n withLoaderShimmer?: boolean;\n onRetry?: () => void;\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n openMarkdownLinksInNewTab?: boolean;\n /** Grouped MDX/markdown rendering props (`mdxOptions`, `getMarkdownExtraProps`, `getMdxContext`). */\n mdxProps?: MdxProps<TContent>;\n showActionsOnHover?: boolean;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n userActions?: DefaultMessageAction<TUserMessage<TMessageMetadata>>[];\n assistantActions?: DefaultMessageAction<TAssistantMessage<TContent, TMessageMetadata>>[];\n /** Component rendered alongside action buttons for each user message. Receives message as prop. */\n userExtraInfo?: MessageExtraInfoComponent<TUserMessage<TMessageMetadata>>;\n /** Component rendered alongside action buttons for each assistant message. Receives message as prop. */\n assistantExtraInfo?: MessageExtraInfoComponent<TAssistantMessage<TContent, TMessageMetadata>>;\n /** Array of chat statuses that should display the loader */\n loaderStatuses?: ChatStatus[];\n className?: string;\n qa?: string;\n hasPreviousMessages?: boolean;\n onLoadPreviousMessages?: () => void;\n /** Rating block configuration (for CSAT or other feedback use cases) - renders after messages list */\n ratingBlockProps?: RatingBlockProps;\n /** Action popup configuration - applies to all action popups */\n actionPopupProps?: MessageListActionPopupConfig;\n /**\n * Enable windowed rendering via react-window for very large histories.\n * Off by default to preserve the existing rendering/scroll behavior.\n */\n virtualized?: boolean;\n /** Last scrollable row rendered after all messages. */\n footerContent?: React.ReactNode;\n};\n\nexport function MessageList<TContent extends TMessageContent = never>(\n props: MessageListProps<TContent>,\n) {\n // Opt-in virtualized path - keeps the proven non-virtualized rendering untouched below.\n if (props.virtualized) {\n return <VirtualizedMessageList<TContent> {...props} />;\n }\n\n return <PlainMessageList<TContent> {...props} />;\n}\n\nfunction PlainMessageList<TContent extends TMessageContent = never>({\n messages,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n mdxProps,\n showActionsOnHover,\n showTimestamp,\n showAvatar,\n userActions,\n assistantActions,\n userExtraInfo: UserExtraInfo,\n assistantExtraInfo: AssistantExtraInfo,\n loaderStatuses = ['submitted', 'streaming_loading'],\n className,\n qa,\n status,\n errorMessage,\n loaderMessage,\n withLoaderShimmer,\n onRetry,\n hasPreviousMessages = false,\n onLoadPreviousMessages,\n ratingBlockProps,\n actionPopupProps,\n footerContent,\n}: MessageListProps<TContent>) {\n const isStreaming = status === 'streaming' || status === 'streaming_loading';\n const isSubmitted = status === 'submitted';\n const showLoader = status && loaderStatuses.includes(status);\n\n // Use popup hook for managing popup state\n const {popupState, handleActionPopup, handlePopupOpenChange, showActionPopup} = usePopup<\n TContent,\n TMessageMetadata\n >();\n\n const {containerRef} = useSmartScroll<HTMLDivElement>({\n isStreaming: isStreaming || isSubmitted,\n messagesCount: messages.length,\n status,\n });\n\n // Preserve scroll position when older messages are loaded\n useScrollPreservation(containerRef, messages.length);\n\n const isNotCompleted = isSubmitted || isStreaming;\n\n return (\n <div ref={containerRef} className={b(null, className)} data-qa={qa ?? MessageListQa.Root}>\n {hasPreviousMessages && (\n <IntersectionContainer\n onIntersect={onLoadPreviousMessages}\n className={b('load-trigger')}\n >\n <Loader view=\"loading\" />\n </IntersectionContainer>\n )}\n <div className={b('messages')} data-qa={qa ? `${qa}-messages` : MessageListQa.Messages}>\n {messages.map((message, index) => (\n <MessageItem<TContent>\n key={message.id || `message-${index}`}\n message={message}\n suppressActions={index === messages.length - 1 && isNotCompleted}\n showActionsOnHover={\n showActionsOnHover &&\n !isActionPopupOpenForMessage(popupState, message.id)\n }\n messageRendererRegistry={messageRendererRegistry}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxProps?.mdxOptions}\n getMarkdownExtraProps={mdxProps?.getMarkdownExtraProps}\n getMdxContext={mdxProps?.getMdxContext}\n showTimestamp={showTimestamp}\n showAvatar={showAvatar}\n userActions={userActions}\n assistantActions={assistantActions}\n userExtraInfo={UserExtraInfo}\n assistantExtraInfo={AssistantExtraInfo}\n onActionPopup={handleActionPopup}\n />\n ))}\n </div>\n <MessageListFooter\n showLoader={showLoader}\n status={status}\n errorMessage={errorMessage}\n loaderMessage={loaderMessage}\n withLoaderShimmer={withLoaderShimmer}\n onRetry={onRetry}\n ratingBlockProps={ratingBlockProps}\n actionPopupProps={actionPopupProps}\n qa={qa}\n showActionPopup={showActionPopup}\n popupState={popupState}\n onPopupOpenChange={handlePopupOpenChange}\n />\n {footerContent !== undefined && footerContent !== null && (\n <div className={b('footer-content')}>{footerContent}</div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"MessageList.js","sourceRoot":"../../../../../src","sources":["components/organisms/MessageList/MessageList.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {HTMLAttributes} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\nimport type {PopupPlacement} from '@gravity-ui/uikit';\n\nimport {useScrollPreservation, useSmartScroll} from '../../../hooks';\nimport {ChatStatus} from '../../../types';\nimport type {\n DefaultMessageAction,\n MessageExtraInfoComponent,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageMetadata,\n TUserMessage,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {type MessageRendererRegistry} from '../../../utils/messageTypeRegistry';\nimport {AlertProps} from '../../atoms/Alert';\nimport {IntersectionContainer} from '../../atoms/IntersectionContainer';\nimport {Loader} from '../../atoms/Loader';\nimport type {MarkdownRendererMdxOptions, MermaidOptions} from '../../atoms/MarkdownRenderer';\nimport {type RatingBlockProps} from '../../molecules/RatingBlock/RatingBlock';\n\nimport {MessageItem} from './MessageItem';\nimport {VirtualizedMessageList} from './MessageList.virtualized';\nimport {MessageListFooter} from './MessageListFooter';\nimport {isActionPopupOpenForMessage, usePopup} from './usePopup';\n\nimport './MessageList.scss';\n\nconst b = block('message-list');\n\nexport enum MessageListQa {\n Root = 'message-list',\n Messages = 'message-list-messages',\n}\n\n/** Configuration for action popup behavior */\nexport interface MessageListActionPopupConfig {\n /** Override title for all popups (overrides action-specific title) */\n title?: string;\n /** Override subtitle for all popups (overrides action-specific subtitle) */\n subtitle?: string;\n /** Override placement for all popups (overrides action-specific placement) */\n placement?: PopupPlacement;\n /** Additional CSS class for popup */\n className?: string;\n /** QA/test identifier for popup */\n qa?: string;\n}\n\n/**\n * Grouped MDX/markdown rendering props exposed as a single object on `MessageList` and\n * `ChatContainer`. They are destructured back into individual props before being handed to\n * the low-level `MessageItem` renderer.\n */\nexport type MdxProps<TContent extends TMessageContent = never> = {\n /** Options for rendering MDX (`@diplodoc/mdx-extension`) in the default message renderers */\n mdxOptions?: MarkdownRendererMdxOptions;\n /**\n * Resolves the extra props forwarded to the root container `div` of each rendered\n * markdown block. Called with the concrete message so handlers (e.g. `onClick`) can\n * identify the message they belong to.\n */\n getMarkdownExtraProps?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => HTMLAttributes<HTMLDivElement> | undefined;\n /**\n * Resolves the per-message value exposed to MDX components (via `useMdxContext`).\n * Called with the concrete message so embedded MDX components can read data\n * unique to the message they belong to.\n */\n getMdxContext?: (\n message: TChatMessage<TContent, TMessageMetadata>,\n ) => Record<string, unknown> | undefined;\n};\n\nexport type MessageListProps<TContent extends TMessageContent = never> = {\n messages: TChatMessage<TContent, TMessageMetadata>[];\n status?: ChatStatus;\n errorMessage?: AlertProps;\n loaderMessage?: string;\n withLoaderShimmer?: boolean;\n onRetry?: () => void;\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n mermaidOptions?: MermaidOptions;\n openMarkdownLinksInNewTab?: boolean;\n /** Grouped MDX/markdown rendering props (`mdxOptions`, `getMarkdownExtraProps`, `getMdxContext`). */\n mdxProps?: MdxProps<TContent>;\n showActionsOnHover?: boolean;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n userActions?: DefaultMessageAction<TUserMessage<TMessageMetadata>>[];\n assistantActions?: DefaultMessageAction<TAssistantMessage<TContent, TMessageMetadata>>[];\n /** Component rendered alongside action buttons for each user message. Receives message as prop. */\n userExtraInfo?: MessageExtraInfoComponent<TUserMessage<TMessageMetadata>>;\n /** Component rendered alongside action buttons for each assistant message. Receives message as prop. */\n assistantExtraInfo?: MessageExtraInfoComponent<TAssistantMessage<TContent, TMessageMetadata>>;\n /** Array of chat statuses that should display the loader */\n loaderStatuses?: ChatStatus[];\n className?: string;\n qa?: string;\n hasPreviousMessages?: boolean;\n onLoadPreviousMessages?: () => void;\n /** Rating block configuration (for CSAT or other feedback use cases) - renders after messages list */\n ratingBlockProps?: RatingBlockProps;\n /** Action popup configuration - applies to all action popups */\n actionPopupProps?: MessageListActionPopupConfig;\n /**\n * Enable windowed rendering via react-window for very large histories.\n * Off by default to preserve the existing rendering/scroll behavior.\n */\n virtualized?: boolean;\n /** Last scrollable row rendered after all messages. */\n footerContent?: React.ReactNode;\n};\n\nexport function MessageList<TContent extends TMessageContent = never>(\n props: MessageListProps<TContent>,\n) {\n // Opt-in virtualized path - keeps the proven non-virtualized rendering untouched below.\n if (props.virtualized) {\n return <VirtualizedMessageList<TContent> {...props} />;\n }\n\n return <PlainMessageList<TContent> {...props} />;\n}\n\nfunction PlainMessageList<TContent extends TMessageContent = never>({\n messages,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n mermaidOptions,\n openMarkdownLinksInNewTab,\n mdxProps,\n showActionsOnHover,\n showTimestamp,\n showAvatar,\n userActions,\n assistantActions,\n userExtraInfo: UserExtraInfo,\n assistantExtraInfo: AssistantExtraInfo,\n loaderStatuses = ['submitted', 'streaming_loading'],\n className,\n qa,\n status,\n errorMessage,\n loaderMessage,\n withLoaderShimmer,\n onRetry,\n hasPreviousMessages = false,\n onLoadPreviousMessages,\n ratingBlockProps,\n actionPopupProps,\n footerContent,\n}: MessageListProps<TContent>) {\n const isStreaming = status === 'streaming' || status === 'streaming_loading';\n const isSubmitted = status === 'submitted';\n const showLoader = status && loaderStatuses.includes(status);\n\n // Use popup hook for managing popup state\n const {popupState, handleActionPopup, handlePopupOpenChange, showActionPopup} = usePopup<\n TContent,\n TMessageMetadata\n >();\n\n const {containerRef} = useSmartScroll<HTMLDivElement>({\n isStreaming: isStreaming || isSubmitted,\n messagesCount: messages.length,\n status,\n });\n\n // Preserve scroll position when older messages are loaded\n useScrollPreservation(containerRef, messages.length);\n\n const isNotCompleted = isSubmitted || isStreaming;\n\n return (\n <div ref={containerRef} className={b(null, className)} data-qa={qa ?? MessageListQa.Root}>\n {hasPreviousMessages && (\n <IntersectionContainer\n onIntersect={onLoadPreviousMessages}\n className={b('load-trigger')}\n >\n <Loader view=\"loading\" />\n </IntersectionContainer>\n )}\n <div className={b('messages')} data-qa={qa ? `${qa}-messages` : MessageListQa.Messages}>\n {messages.map((message, index) => (\n <MessageItem<TContent>\n key={message.id || `message-${index}`}\n message={message}\n suppressActions={index === messages.length - 1 && isNotCompleted}\n showActionsOnHover={\n showActionsOnHover &&\n !isActionPopupOpenForMessage(popupState, message.id)\n }\n messageRendererRegistry={messageRendererRegistry}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n mermaidOptions={mermaidOptions}\n openMarkdownLinksInNewTab={openMarkdownLinksInNewTab}\n mdxOptions={mdxProps?.mdxOptions}\n getMarkdownExtraProps={mdxProps?.getMarkdownExtraProps}\n getMdxContext={mdxProps?.getMdxContext}\n showTimestamp={showTimestamp}\n showAvatar={showAvatar}\n userActions={userActions}\n assistantActions={assistantActions}\n userExtraInfo={UserExtraInfo}\n assistantExtraInfo={AssistantExtraInfo}\n onActionPopup={handleActionPopup}\n />\n ))}\n </div>\n <MessageListFooter\n showLoader={showLoader}\n status={status}\n errorMessage={errorMessage}\n loaderMessage={loaderMessage}\n withLoaderShimmer={withLoaderShimmer}\n onRetry={onRetry}\n ratingBlockProps={ratingBlockProps}\n actionPopupProps={actionPopupProps}\n qa={qa}\n showActionPopup={showActionPopup}\n popupState={popupState}\n onPopupOpenChange={handlePopupOpenChange}\n />\n {footerContent !== undefined && footerContent !== null && (\n <div className={b('footer-content')}>{footerContent}</div>\n )}\n </div>\n );\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  import type { TMessageContent } from "../../../types/messages.js";
2
2
  import { type MessageListProps } from "./MessageList.js";
3
- export declare function VirtualizedMessageList<TContent extends TMessageContent = never>({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, openMarkdownLinksInNewTab, mdxProps, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses, className, qa, status, errorMessage, loaderMessage, withLoaderShimmer, onRetry, hasPreviousMessages, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, footerContent, }: MessageListProps<TContent>): import("react/jsx-runtime").JSX.Element;
3
+ export declare function VirtualizedMessageList<TContent extends TMessageContent = never>({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, mermaidOptions, openMarkdownLinksInNewTab, mdxProps, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses, className, qa, status, errorMessage, loaderMessage, withLoaderShimmer, onRetry, hasPreviousMessages, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, footerContent, }: MessageListProps<TContent>): import("react/jsx-runtime").JSX.Element;