@redocly/theme 0.61.0 → 0.62.0-custom.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 (199) hide show
  1. package/lib/components/Admonition/Admonition.js +14 -18
  2. package/lib/components/Admonition/variables.dark.d.ts +1 -0
  3. package/lib/components/Admonition/variables.dark.js +18 -0
  4. package/lib/components/Admonition/variables.js +24 -28
  5. package/lib/components/AsyncApiDocs/hooks/AfterAsyncApiChannelDescription.d.ts +1 -0
  6. package/lib/components/AsyncApiDocs/hooks/AfterAsyncApiChannelDescription.js +12 -0
  7. package/lib/components/Badge/Badge.d.ts +2 -1
  8. package/lib/components/Badge/Badge.js +24 -2
  9. package/lib/components/Banner/Banner.js +19 -1
  10. package/lib/components/Banner/variables.js +1 -0
  11. package/lib/components/Breadcrumbs/Breadcrumb.js +1 -1
  12. package/lib/components/Breadcrumbs/BreadcrumbDropdown.js +9 -6
  13. package/lib/components/Breadcrumbs/Breadcrumbs.js +24 -15
  14. package/lib/components/Buttons/AIAssistantButton.js +7 -4
  15. package/lib/components/Catalog/CatalogEntities.js +10 -8
  16. package/lib/components/Catalog/CatalogEntity/CatalogEntity.js +2 -2
  17. package/lib/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistorySidebar.js +5 -3
  18. package/lib/components/Catalog/CatalogEntity/CatalogEntityProperties/TagsProperty.js +2 -2
  19. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable.js +13 -11
  20. package/lib/components/Catalog/CatalogEntity/CatalogEntitySchema.js +7 -5
  21. package/lib/components/Catalog/CatalogFilter/CatalogFilterCheckboxes.js +9 -7
  22. package/lib/components/Catalog/CatalogTableView/CatalogTableViewRow.js +1 -1
  23. package/lib/components/Catalog/CatalogTagsWithTooltip.js +2 -2
  24. package/lib/components/CatalogClassic/CatalogClassicInfoBlock.js +1 -1
  25. package/lib/components/CodeBlock/CodeBlockControls.js +8 -6
  26. package/lib/components/Filter/FilterCheckboxes.js +1 -1
  27. package/lib/components/JsonViewer/JsonViewer.js +2 -2
  28. package/lib/components/JsonViewer/{Helpers.js → helpers.js} +2 -1
  29. package/lib/components/LanguagePicker/LanguagePicker.js +1 -1
  30. package/lib/components/Markdown/Markdown.js +2 -2
  31. package/lib/components/Menu/MenuItem.js +41 -15
  32. package/lib/components/Navbar/NavbarItem.js +1 -1
  33. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.d.ts +1 -0
  34. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.js +12 -0
  35. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.d.ts +1 -0
  36. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.js +6 -0
  37. package/lib/components/PageActions/PageActions.js +25 -8
  38. package/lib/components/Search/SearchAiDialog.d.ts +4 -2
  39. package/lib/components/Search/SearchAiDialog.js +23 -4
  40. package/lib/components/Search/SearchAiMessage.d.ts +4 -2
  41. package/lib/components/Search/SearchAiMessage.js +82 -23
  42. package/lib/components/Search/SearchDialog.js +50 -25
  43. package/lib/components/Select/variables.js +2 -2
  44. package/lib/components/SvgViewer/SvgViewer.d.ts +15 -0
  45. package/lib/components/SvgViewer/SvgViewer.js +312 -0
  46. package/lib/components/SvgViewer/variables.d.ts +1 -0
  47. package/lib/components/SvgViewer/variables.dark.d.ts +1 -0
  48. package/lib/components/SvgViewer/variables.dark.js +8 -0
  49. package/lib/components/SvgViewer/variables.js +17 -0
  50. package/lib/components/Tag/Tag.js +1 -1
  51. package/lib/components/Tag/variables.dark.js +6 -0
  52. package/lib/components/Tag/variables.js +6 -0
  53. package/lib/components/Tooltip/Tooltip.d.ts +2 -3
  54. package/lib/components/Tooltip/Tooltip.js +66 -113
  55. package/lib/components/Tooltip/variables.dark.js +4 -0
  56. package/lib/components/Tooltip/variables.js +3 -3
  57. package/lib/components/UserMenu/LoginButton.d.ts +8 -2
  58. package/lib/components/UserMenu/LoginButton.js +4 -3
  59. package/lib/core/constants/search.d.ts +5 -1
  60. package/lib/core/constants/search.js +24 -1
  61. package/lib/core/hooks/search/use-search-dialog.js +2 -2
  62. package/lib/core/hooks/use-color-switcher.d.ts +1 -0
  63. package/lib/core/hooks/use-color-switcher.js +8 -1
  64. package/lib/core/hooks/use-mcp-config.js +2 -1
  65. package/lib/core/hooks/use-modal-scroll-lock.js +24 -10
  66. package/lib/core/hooks/use-outside-click.d.ts +3 -1
  67. package/lib/core/hooks/use-outside-click.js +8 -4
  68. package/lib/core/hooks/use-page-actions.d.ts +1 -1
  69. package/lib/core/hooks/use-page-actions.js +44 -11
  70. package/lib/core/hooks/use-product-picker.js +1 -1
  71. package/lib/core/hooks/use-unique-svg-ids.d.ts +6 -0
  72. package/lib/core/hooks/use-unique-svg-ids.js +15 -0
  73. package/lib/core/openapi/index.d.ts +1 -0
  74. package/lib/core/openapi/index.js +3 -1
  75. package/lib/core/styles/dark.js +4 -0
  76. package/lib/core/styles/global.js +31 -15
  77. package/lib/core/types/catalog.d.ts +1 -1
  78. package/lib/core/types/hooks.d.ts +23 -2
  79. package/lib/core/types/l10n.d.ts +1 -1
  80. package/lib/core/types/search.d.ts +24 -0
  81. package/lib/core/types/search.js +9 -1
  82. package/lib/core/utils/content-segments.d.ts +2 -0
  83. package/lib/core/utils/content-segments.js +22 -0
  84. package/lib/core/utils/index.d.ts +1 -0
  85. package/lib/core/utils/index.js +1 -0
  86. package/lib/core/utils/transform-revisions-to-version-history.js +8 -51
  87. package/lib/ext/process-scorecard.d.ts +5 -0
  88. package/lib/ext/process-scorecard.js +11 -0
  89. package/lib/icons/FitToViewIcon/FitToViewIcon.d.ts +9 -0
  90. package/lib/icons/FitToViewIcon/FitToViewIcon.js +25 -0
  91. package/lib/icons/WarningCycleIcon/WarningCycleIcon.d.ts +9 -0
  92. package/lib/icons/WarningCycleIcon/WarningCycleIcon.js +24 -0
  93. package/lib/index.d.ts +9 -0
  94. package/lib/index.js +9 -0
  95. package/lib/layouts/DocumentationLayout.js +4 -25
  96. package/lib/layouts/DocumentationLayoutBottom.d.ts +11 -0
  97. package/lib/layouts/DocumentationLayoutBottom.js +28 -0
  98. package/lib/layouts/DocumentationLayoutTop.d.ts +13 -0
  99. package/lib/layouts/DocumentationLayoutTop.js +33 -0
  100. package/lib/layouts/Forbidden.js +22 -18
  101. package/lib/markdoc/components/Cards/Card.js +1 -0
  102. package/lib/markdoc/components/CodeWalkthrough/CodeFilters.js +1 -1
  103. package/lib/markdoc/components/Heading/Heading.js +40 -2
  104. package/lib/markdoc/components/LoginButton/LoginButton.d.ts +9 -0
  105. package/lib/markdoc/components/LoginButton/LoginButton.js +48 -0
  106. package/lib/markdoc/components/Mermaid/Mermaid.js +70 -2
  107. package/lib/markdoc/components/default.d.ts +1 -0
  108. package/lib/markdoc/components/default.js +1 -0
  109. package/lib/markdoc/default.d.ts +6 -0
  110. package/lib/markdoc/default.js +2 -0
  111. package/lib/markdoc/tags/login-button.d.ts +2 -0
  112. package/lib/markdoc/tags/login-button.js +32 -0
  113. package/package.json +9 -9
  114. package/src/components/Admonition/Admonition.tsx +14 -18
  115. package/src/components/Admonition/variables.dark.ts +15 -0
  116. package/src/components/Admonition/variables.ts +24 -28
  117. package/src/components/AsyncApiDocs/hooks/AfterAsyncApiChannelDescription.tsx +10 -0
  118. package/src/components/Badge/Badge.tsx +18 -2
  119. package/src/components/Banner/Banner.tsx +23 -1
  120. package/src/components/Banner/variables.ts +1 -0
  121. package/src/components/Breadcrumbs/Breadcrumb.tsx +3 -3
  122. package/src/components/Breadcrumbs/BreadcrumbDropdown.tsx +11 -8
  123. package/src/components/Breadcrumbs/Breadcrumbs.tsx +24 -15
  124. package/src/components/Buttons/AIAssistantButton.tsx +7 -4
  125. package/src/components/Catalog/CatalogEntities.tsx +10 -8
  126. package/src/components/Catalog/CatalogEntity/CatalogEntity.tsx +1 -1
  127. package/src/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistorySidebar.tsx +7 -4
  128. package/src/components/Catalog/CatalogEntity/CatalogEntityProperties/TagsProperty.tsx +1 -1
  129. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityRelationsTable.tsx +13 -11
  130. package/src/components/Catalog/CatalogEntity/CatalogEntitySchema.tsx +7 -5
  131. package/src/components/Catalog/CatalogFilter/CatalogFilterCheckboxes.tsx +9 -7
  132. package/src/components/Catalog/CatalogTableView/CatalogTableViewRow.tsx +1 -2
  133. package/src/components/Catalog/CatalogTagsWithTooltip.tsx +9 -5
  134. package/src/components/CatalogClassic/CatalogClassicInfoBlock.tsx +3 -1
  135. package/src/components/CodeBlock/CodeBlockControls.tsx +16 -10
  136. package/src/components/Filter/FilterCheckboxes.tsx +1 -1
  137. package/src/components/JsonViewer/JsonViewer.tsx +1 -2
  138. package/src/components/JsonViewer/{Helpers.tsx → helpers.tsx} +1 -0
  139. package/src/components/LanguagePicker/LanguagePicker.tsx +1 -1
  140. package/src/components/Markdown/Markdown.tsx +2 -2
  141. package/src/components/Menu/MenuItem.tsx +61 -16
  142. package/src/components/Navbar/NavbarItem.tsx +3 -1
  143. package/src/components/OpenApiDocs/hooks/AdditionalOverviewInfo.tsx +10 -0
  144. package/src/components/OpenApiDocs/hooks/AfterOpenApiDescription.tsx +2 -0
  145. package/src/components/PageActions/PageActions.tsx +38 -15
  146. package/src/components/Search/SearchAiDialog.tsx +31 -2
  147. package/src/components/Search/SearchAiMessage.tsx +103 -17
  148. package/src/components/Search/SearchDialog.tsx +70 -37
  149. package/src/components/Select/variables.ts +2 -2
  150. package/src/components/SvgViewer/SvgViewer.tsx +405 -0
  151. package/src/components/SvgViewer/variables.dark.ts +5 -0
  152. package/src/components/SvgViewer/variables.ts +14 -0
  153. package/src/components/Tag/Tag.tsx +2 -1
  154. package/src/components/Tag/variables.dark.ts +6 -0
  155. package/src/components/Tag/variables.ts +6 -0
  156. package/src/components/Tooltip/Tooltip.tsx +77 -120
  157. package/src/components/Tooltip/variables.dark.ts +4 -0
  158. package/src/components/Tooltip/variables.ts +3 -3
  159. package/src/components/UserMenu/LoginButton.tsx +23 -8
  160. package/src/core/constants/search.ts +27 -1
  161. package/src/core/hooks/__mocks__/use-theme-hooks.ts +10 -1
  162. package/src/core/hooks/search/use-search-dialog.ts +2 -2
  163. package/src/core/hooks/use-color-switcher.ts +10 -2
  164. package/src/core/hooks/use-mcp-config.ts +2 -1
  165. package/src/core/hooks/use-modal-scroll-lock.ts +29 -10
  166. package/src/core/hooks/use-outside-click.ts +16 -5
  167. package/src/core/hooks/use-page-actions.ts +66 -25
  168. package/src/core/hooks/use-product-picker.ts +1 -1
  169. package/src/core/hooks/use-unique-svg-ids.ts +12 -0
  170. package/src/core/openapi/index.ts +1 -0
  171. package/src/core/styles/dark.ts +4 -0
  172. package/src/core/styles/global.ts +31 -15
  173. package/src/core/types/catalog.ts +1 -1
  174. package/src/core/types/hooks.ts +29 -1
  175. package/src/core/types/l10n.ts +12 -1
  176. package/src/core/types/search.ts +19 -0
  177. package/src/core/utils/content-segments.ts +27 -0
  178. package/src/core/utils/index.ts +1 -0
  179. package/src/core/utils/transform-revisions-to-version-history.ts +8 -80
  180. package/src/ext/process-scorecard.ts +14 -0
  181. package/src/icons/FitToViewIcon/FitToViewIcon.tsx +26 -0
  182. package/src/icons/WarningCycleIcon/WarningCycleIcon.tsx +32 -0
  183. package/src/index.ts +9 -0
  184. package/src/layouts/DocumentationLayout.tsx +4 -30
  185. package/src/layouts/DocumentationLayoutBottom.tsx +42 -0
  186. package/src/layouts/DocumentationLayoutTop.tsx +52 -0
  187. package/src/layouts/Forbidden.tsx +36 -21
  188. package/src/markdoc/components/Cards/Card.tsx +1 -0
  189. package/src/markdoc/components/CodeWalkthrough/CodeFilters.tsx +1 -1
  190. package/src/markdoc/components/Heading/Heading.tsx +52 -4
  191. package/src/markdoc/components/LoginButton/LoginButton.tsx +38 -0
  192. package/src/markdoc/components/Mermaid/Mermaid.tsx +57 -8
  193. package/src/markdoc/components/default.ts +1 -0
  194. package/src/markdoc/default.ts +2 -0
  195. package/src/markdoc/tags/login-button.ts +30 -0
  196. package/lib/components/Tooltip/TooltipWrapper.d.ts +0 -12
  197. package/lib/components/Tooltip/TooltipWrapper.js +0 -34
  198. package/src/components/Tooltip/TooltipWrapper.tsx +0 -70
  199. /package/lib/components/JsonViewer/{Helpers.d.ts → helpers.d.ts} +0 -0
@@ -40,35 +40,44 @@ exports.SearchAiMessage = void 0;
40
40
  const react_1 = __importStar(require("react"));
41
41
  const styled_components_1 = __importDefault(require("styled-components"));
42
42
  const types_1 = require("../../core/types");
43
+ const constants_1 = require("../../core/constants");
43
44
  const Link_1 = require("../../components/Link/Link");
44
45
  const Tag_1 = require("../../components/Tag/Tag");
45
- const constants_1 = require("../../core/constants");
46
+ const constants_2 = require("../../core/constants");
46
47
  const hooks_1 = require("../../core/hooks");
47
48
  const Markdown_1 = require("../../components/Markdown/Markdown");
48
49
  const DocumentIcon_1 = require("../../icons/DocumentIcon/DocumentIcon");
49
50
  const AiStarsIcon_1 = require("../../icons/AiStarsIcon/AiStarsIcon");
50
51
  const CheckmarkOutlineIcon_1 = require("../../icons/CheckmarkOutlineIcon/CheckmarkOutlineIcon");
51
- const SearchAiActionButtons_1 = require("./SearchAiActionButtons");
52
- const SearchAiNegativeFeedbackForm_1 = require("./SearchAiNegativeFeedbackForm");
53
- function SearchAiMessageComponent({ role, content, isThinking, resources, className, messageId, feedback, onFeedbackChange, }) {
52
+ const SearchAiActionButtons_1 = require("../../components/Search/SearchAiActionButtons");
53
+ const SearchAiNegativeFeedbackForm_1 = require("../../components/Search/SearchAiNegativeFeedbackForm");
54
+ function MarkdownSegment({ text }) {
55
+ const { useMarkdownText } = (0, hooks_1.useThemeHooks)();
56
+ const markdown = useMarkdownText(text);
57
+ return react_1.default.createElement(ResponseText, { as: "div", children: markdown, "data-testid": "response-text" });
58
+ }
59
+ function SearchAiMessageComponent({ role, content, isThinking, resources, className, messageId, feedback, onFeedbackChange, toolCalls = [], contentSegments = [{ type: 'text', text: content }], }) {
54
60
  var _a;
55
- const { useMarkdownText, useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
56
- const markDownContent = useMarkdownText(content || '');
61
+ const { useTranslate, useTelemetry } = (0, hooks_1.useThemeHooks)();
57
62
  const { translate } = useTranslate();
58
63
  const telemetry = useTelemetry();
59
64
  const [feedbackSent, setFeedbackSent] = (0, react_1.useState)(false);
60
65
  const hasResources = !isThinking && resources && resources.length > 0;
61
66
  const resourcesCount = (_a = resources === null || resources === void 0 ? void 0 : resources.length) !== null && _a !== void 0 ? _a : 0;
62
67
  const showSuccessMessage = feedbackSent && feedback;
68
+ const isLoading = isThinking && content.length === 0 && toolCalls.length === 0;
63
69
  const sendFeedbackTelemetry = (feedbackValue, dislikeReason) => {
64
70
  if (!messageId)
65
71
  return;
66
72
  try {
67
- telemetry.sendSearchAIFeedbackMessage({
68
- feedback: feedbackValue,
69
- messageId,
70
- reason: dislikeReason,
71
- });
73
+ telemetry.sendSearchAIFeedbackMessage([
74
+ {
75
+ object: 'feedback',
76
+ feedback: feedbackValue,
77
+ messageId,
78
+ reason: dislikeReason,
79
+ },
80
+ ]);
72
81
  }
73
82
  catch (error) {
74
83
  console.error('Error sending feedback', error);
@@ -87,10 +96,25 @@ function SearchAiMessageComponent({ role, content, isThinking, resources, classN
87
96
  }
88
97
  };
89
98
  return (react_1.default.createElement(SearchAiMessageWrapper, { "data-component-name": "Search/SearchAiMessage", role: role, className: className, "data-testid": "search-ai-message" },
90
- role === constants_1.AiSearchConversationRole.ASSISTANT && (react_1.default.createElement(AiStarsIcon_1.AiStarsIcon, { size: "32px", background: "var(--search-ai-icon-bg-color)", borderRadius: "var(--border-radius-lg)", color: "var(--search-ai-icon-color)", margin: "0 var(--spacing-xs) 0 0" })),
91
- react_1.default.createElement(MessageContentWrapper, null, role === constants_1.AiSearchConversationRole.ASSISTANT ? (react_1.default.createElement(react_1.default.Fragment, null,
99
+ role === constants_2.AiSearchConversationRole.ASSISTANT && (react_1.default.createElement(AiStarsIcon_1.AiStarsIcon, { size: "32px", background: "var(--search-ai-icon-bg-color)", borderRadius: "var(--border-radius-lg)", color: "var(--search-ai-icon-color)", margin: "0 var(--spacing-xs) 0 0" })),
100
+ react_1.default.createElement(MessageContentWrapper, null, role === constants_2.AiSearchConversationRole.ASSISTANT ? (react_1.default.createElement(react_1.default.Fragment, null,
92
101
  react_1.default.createElement(MessageWrapper, { role: role },
93
- react_1.default.createElement(ResponseText, { as: "div", children: markDownContent, "data-testid": "response-text" }),
102
+ contentSegments.map((segment, index) => {
103
+ var _a, _b, _c, _d, _e, _f;
104
+ if (segment.type === 'tool') {
105
+ const toolCallCompleted = Boolean(segment.toolCall.result);
106
+ const toolCallCompletedText = (_b = (_a = constants_1.TOOL_CALL_DISPLAY_TEXT[segment.toolCall.name]) === null || _a === void 0 ? void 0 : _a.completedText) !== null && _b !== void 0 ? _b : `${translate('search.ai.toolResult.found', 'Found')} ${(_d = (_c = segment.toolCall.result) === null || _c === void 0 ? void 0 : _c.documentCount) !== null && _d !== void 0 ? _d : 0} ${translate('search.ai.toolResult.found.documents', 'documents')}`;
107
+ const toolCallInProgressText = (_f = (_e = constants_1.TOOL_CALL_DISPLAY_TEXT[segment.toolCall.name]) === null || _e === void 0 ? void 0 : _e.inProgressText) !== null && _f !== void 0 ? _f : translate('search.ai.toolCall.searching', 'Searching...');
108
+ const toolCallDisplayText = toolCallCompleted
109
+ ? toolCallCompletedText
110
+ : toolCallInProgressText;
111
+ return (react_1.default.createElement(ToolCallsInfoWrapper, { key: `tool-${index}`, "data-testid": "tool-calls-info" },
112
+ react_1.default.createElement(ToolCallInfoItem, null,
113
+ react_1.default.createElement(DocumentIcon_1.DocumentIcon, { size: "14px", color: "--search-ai-text-color" }),
114
+ react_1.default.createElement(ToolCallText, { "$isSearching": !toolCallCompleted }, toolCallDisplayText))));
115
+ }
116
+ return react_1.default.createElement(MarkdownSegment, { key: `text-${index}`, text: segment.text });
117
+ }),
94
118
  hasResources && (react_1.default.createElement(react_1.default.Fragment, null,
95
119
  react_1.default.createElement(ResourcesWrapper, { "data-testid": "resources-wrapper" },
96
120
  react_1.default.createElement(ResourcesTitle, { "data-translation-key": "search.ai.resourcesFound" },
@@ -99,9 +123,9 @@ function SearchAiMessageComponent({ role, content, isThinking, resources, classN
99
123
  resourcesCount,
100
124
  ' ',
101
125
  translate('search.ai.resourcesFound.resources', 'resources')),
102
- react_1.default.createElement(ResourceTagsWrapper, null, resources === null || resources === void 0 ? void 0 : resources.map((resource, idx) => (react_1.default.createElement(Link_1.Link, { key: `${resource.url}-${idx}`, to: resource.url, target: "_blank" },
126
+ react_1.default.createElement(ResourceTagsWrapper, null, resources === null || resources === void 0 ? void 0 : resources.map((resource, index) => (react_1.default.createElement(Link_1.Link, { key: `${resource.url}-${index}`, to: resource.url, target: "_blank" },
103
127
  react_1.default.createElement(ResourceTag, { borderless: true, icon: react_1.default.createElement(DocumentIcon_1.DocumentIcon, { color: "--search-ai-resource-tag-icon-color" }) }, resource.title)))))))),
104
- isThinking && content.length === 0 && (react_1.default.createElement(ThinkingDotsWrapper, { "data-testid": "thinking-dots-wrapper" },
128
+ isLoading && (react_1.default.createElement(ThinkingDotsWrapper, { "data-testid": "thinking-dots-wrapper" },
105
129
  react_1.default.createElement(ThinkingDot, null),
106
130
  react_1.default.createElement(ThinkingDot, null),
107
131
  react_1.default.createElement(ThinkingDot, null))),
@@ -126,20 +150,23 @@ function areResourcesEqual(prev, next) {
126
150
  });
127
151
  }
128
152
  exports.SearchAiMessage = (0, react_1.memo)(SearchAiMessageComponent, (prevProps, nextProps) => {
153
+ var _a, _b;
129
154
  return (prevProps.role === nextProps.role &&
130
155
  prevProps.content === nextProps.content &&
131
156
  prevProps.isThinking === nextProps.isThinking &&
132
157
  prevProps.messageId === nextProps.messageId &&
133
158
  prevProps.feedback === nextProps.feedback &&
134
159
  prevProps.onFeedbackChange === nextProps.onFeedbackChange &&
135
- areResourcesEqual(prevProps.resources, nextProps.resources));
160
+ areResourcesEqual(prevProps.resources, nextProps.resources) &&
161
+ ((_a = prevProps.toolCalls) === null || _a === void 0 ? void 0 : _a.length) === ((_b = nextProps.toolCalls) === null || _b === void 0 ? void 0 : _b.length) &&
162
+ prevProps.contentSegments === nextProps.contentSegments);
136
163
  });
137
164
  const SearchAiMessageWrapper = styled_components_1.default.div `
138
165
  display: flex;
139
166
  flex-direction: row;
140
167
  align-items: flex-start;
141
168
  width: 100%;
142
- justify-content: ${({ role }) => role === constants_1.AiSearchConversationRole.USER ? 'flex-end' : 'flex-start'};
169
+ justify-content: ${({ role }) => role === constants_2.AiSearchConversationRole.USER ? 'flex-end' : 'flex-start'};
143
170
  `;
144
171
  const MessageContentWrapper = styled_components_1.default.div `
145
172
  display: flex;
@@ -165,18 +192,19 @@ const ResponseText = (0, styled_components_1.default)(Markdown_1.Markdown) `
165
192
  }
166
193
  `;
167
194
  const MessageWrapper = styled_components_1.default.div `
168
- padding: ${({ role }) => role === constants_1.AiSearchConversationRole.USER ? 'var(--spacing-sm)' : 'var(--spacing-xs)'}
169
- var(--spacing-sm);
195
+ padding: ${({ role }) => role === constants_2.AiSearchConversationRole.USER
196
+ ? 'var(--spacing-sm)'
197
+ : 'var(--spacing-sm) var(--spacing-sm) var(--spacing-xs) var(--spacing-sm)'};
170
198
  border-radius: var(--border-radius-lg);
171
199
  width: fit-content;
172
200
  max-width: 100%;
173
201
  word-wrap: break-word;
174
202
  white-space: pre-wrap;
175
- background-color: ${({ role }) => role === constants_1.AiSearchConversationRole.USER
203
+ background-color: ${({ role }) => role === constants_2.AiSearchConversationRole.USER
176
204
  ? 'var(--search-ai-user-bg-color)'
177
205
  : 'var(--search-ai-assistant-bg-color)'};
178
- border: ${({ role }) => role === constants_1.AiSearchConversationRole.USER ? 'none' : 'var(--search-ai-assistant-border)'};
179
- color: ${({ role }) => role === constants_1.AiSearchConversationRole.USER
206
+ border: ${({ role }) => role === constants_2.AiSearchConversationRole.USER ? 'none' : 'var(--search-ai-assistant-border)'};
207
+ color: ${({ role }) => role === constants_2.AiSearchConversationRole.USER
180
208
  ? 'var(--search-ai-user-text-color)'
181
209
  : 'var(--search-ai-assistant-text-color)'};
182
210
  `;
@@ -270,4 +298,35 @@ const SuccessMessageText = styled_components_1.default.div `
270
298
  font-size: var(--font-size-base);
271
299
  color: var(--color-success-darker);
272
300
  `;
301
+ const ToolCallsInfoWrapper = styled_components_1.default.div `
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: var(--spacing-xxs);
305
+ margin: 0 0 var(--spacing-sm) 0;
306
+ font-size: var(--font-size-xs);
307
+ color: var(--search-ai-text-color);
308
+ opacity: 0.6;
309
+ `;
310
+ const ToolCallInfoItem = styled_components_1.default.div `
311
+ display: flex;
312
+ align-items: center;
313
+ gap: var(--spacing-xxs);
314
+ `;
315
+ const ToolCallText = styled_components_1.default.span `
316
+ font-weight: var(--font-weight-regular);
317
+
318
+ ${({ $isSearching }) => $isSearching &&
319
+ `
320
+ animation: pulse 1.5s ease-in-out infinite;
321
+
322
+ @keyframes pulse {
323
+ 0%, 100% {
324
+ opacity: 1;
325
+ }
326
+ 50% {
327
+ opacity: 0.4;
328
+ }
329
+ }
330
+ `}
331
+ `;
273
332
  //# sourceMappingURL=SearchAiMessage.js.map
@@ -74,6 +74,7 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
74
74
  const { isFilterOpen, onFilterToggle, onFilterChange, onFilterReset, onFacetReset, onQuickFilterReset, } = (0, hooks_1.useSearchFilter)(filter, setFilter);
75
75
  const { addSearchHistoryItem } = (0, hooks_1.useRecentSearches)();
76
76
  const aiSearch = useAiSearch({ filter });
77
+ (0, hooks_1.useModalScrollLock)(true);
77
78
  const searchInputRef = (0, react_1.useRef)(null);
78
79
  const modalRef = (0, react_1.useRef)(null);
79
80
  const [isMobile, setIsMobile] = (0, react_1.useState)(false);
@@ -134,14 +135,17 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
134
135
  }
135
136
  return (react_1.default.createElement(SearchItem_1.SearchItem, { key: `${index}-${item.document.id}`, item: item, product: itemProduct, innerRef: innerRef, onClick: () => {
136
137
  addSearchHistoryItem(query);
137
- telemetry.sendSearchResultClickedMessage({
138
- query,
139
- url: item.document.url,
140
- totalResults: results.length.toString(),
141
- index: index.toString(),
142
- searchEngine: mode,
143
- searchSessionId,
144
- });
138
+ telemetry.sendSearchResultClickedMessage([
139
+ {
140
+ object: 'search',
141
+ query: query,
142
+ url: item.document.url,
143
+ totalResults: results.length.toString(),
144
+ index: index.toString(),
145
+ searchEngine: mode,
146
+ searchSessionId,
147
+ },
148
+ ]);
145
149
  onClose();
146
150
  } }));
147
151
  }, [onClose, product, products, addSearchHistoryItem, query, telemetry, mode, searchSessionId]);
@@ -189,18 +193,23 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
189
193
  if (query.trim()) {
190
194
  aiSearch.askQuestion(query);
191
195
  }
192
- telemetry.sendSearchAiOpenedMessage({
193
- method: 'ai_search_button',
194
- });
196
+ telemetry.sendSearchAiOpenedMessage([
197
+ {
198
+ object: 'search',
199
+ method: 'ai_search_button',
200
+ },
201
+ ]);
195
202
  } }, translate('search.ai.button', 'Search with AI'))) : null,
196
203
  showSearchFilterButton && (react_1.default.createElement(SearchFilterToggleButton, { icon: react_1.default.createElement(SettingsIcon_1.SettingsIcon, null), onClick: onFilterToggle })))))) : (react_1.default.createElement(AiDialogHeaderWrapper, null,
197
- react_1.default.createElement(Button_1.Button, { variant: "secondary", onClick: () => {
204
+ initialMode === 'ai-dialog' ? (react_1.default.createElement(AiDialogHeaderTitle, null,
205
+ react_1.default.createElement(AiStarsGradientIcon_1.AiStarsGradientIcon, { color: "var(--search-ai-button-icon-color)", size: "1.25rem" }),
206
+ translate('search.ai.assistant', 'Assistant'))) : (react_1.default.createElement(Button_1.Button, { variant: "secondary", onClick: () => {
198
207
  setMode('search');
199
208
  aiSearch.clearConversation();
200
209
  focusSearchInput();
201
210
  }, tabIndex: 0, icon: react_1.default.createElement(ChevronLeftIcon_1.ChevronLeftIcon, null) }, isMobile
202
211
  ? translate('search.ai.back', 'Back')
203
- : translate('search.ai.backToSearch', 'Back to search')),
212
+ : translate('search.ai.backToSearch', 'Back to search'))),
204
213
  react_1.default.createElement(AiDialogHeaderActionsWrapper, null,
205
214
  react_1.default.createElement(Button_1.Button, { variant: "secondary", disabled: !aiSearch.conversation.length, onClick: () => {
206
215
  refreshSearchSessionId();
@@ -217,18 +226,24 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
217
226
  if (query.trim()) {
218
227
  aiSearch.askQuestion(query);
219
228
  }
220
- telemetry.sendSearchAiOpenedMessage({
221
- method: 'ai_search_input',
222
- });
229
+ telemetry.sendSearchAiOpenedMessage([
230
+ {
231
+ object: 'search',
232
+ method: 'ai_search_input',
233
+ },
234
+ ]);
223
235
  }, onKeyDown: (e) => {
224
236
  if (e.key === 'Enter') {
225
237
  setMode('ai-dialog');
226
238
  if (query.trim()) {
227
239
  aiSearch.askQuestion(query);
228
240
  }
229
- telemetry.sendSearchAiOpenedMessage({
230
- method: 'ai_search_input',
231
- });
241
+ telemetry.sendSearchAiOpenedMessage([
242
+ {
243
+ object: 'search',
244
+ method: 'ai_search_input',
245
+ },
246
+ ]);
232
247
  }
233
248
  }, ref: aiQueryRef, tabIndex: 0, role: "option", "aria-selected": "true" },
234
249
  react_1.default.createElement(AiStarsIcon_1.AiStarsIcon, { style: { flexShrink: 0 }, color: "var(--search-ai-icon-color)", size: "36px", background: "var(--search-ai-icon-bg-color)", margin: "0 var(--spacing-md) 0 0", borderRadius: "var(--border-radius-lg)" }),
@@ -262,15 +277,18 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
262
277
  translate('search.loading', 'Loading...'))) : (react_1.default.createElement(SearchMessage, { "data-translation-key": "search.noResults" },
263
278
  react_1.default.createElement("b", null, translate('search.noResults.title', 'No results'))))) : (react_1.default.createElement(react_1.default.Fragment, null,
264
279
  react_1.default.createElement(SearchRecent_1.SearchRecent, { onSelect: (query, index) => {
265
- telemetry.sendSearchRecentClickedMessage({
266
- query,
267
- index: index.toString(),
268
- searchSessionId,
269
- });
280
+ telemetry.sendSearchRecentClickedMessage([
281
+ {
282
+ object: 'search',
283
+ query,
284
+ index: index.toString(),
285
+ searchSessionId,
286
+ },
287
+ ]);
270
288
  setQuery(query);
271
289
  focusSearchInput();
272
290
  } }),
273
- react_1.default.createElement(SearchSuggestedPages_1.SearchSuggestedPages, null)))))) : (react_1.default.createElement(SearchAiDialog_1.SearchAiDialog, { initialMessage: query, response: aiSearch.response, isGeneratingResponse: aiSearch.isGeneratingResponse, error: aiSearch.error, resources: aiSearch.resources, conversation: aiSearch.conversation, setConversation: aiSearch.setConversation, onMessageSent: aiSearch.askQuestion }))),
291
+ react_1.default.createElement(SearchSuggestedPages_1.SearchSuggestedPages, null)))))) : (react_1.default.createElement(SearchAiDialog_1.SearchAiDialog, { initialMessage: query, response: aiSearch.response, isGeneratingResponse: aiSearch.isGeneratingResponse, error: aiSearch.error, resources: aiSearch.resources, conversation: aiSearch.conversation, setConversation: aiSearch.setConversation, onMessageSent: aiSearch.askQuestion, toolCalls: aiSearch.toolCalls, contentSegments: aiSearch.contentSegments }))),
274
292
  react_1.default.createElement(SearchDialogFooter, null, mode === 'ai-dialog' ? (react_1.default.createElement(AiDisclaimer, null, translate('search.ai.disclaimer', 'AI search might provide incomplete or incorrect results. Verify important information.'))) : (react_1.default.createElement(react_1.default.Fragment, null,
275
293
  react_1.default.createElement(SearchShortcuts, null,
276
294
  react_1.default.createElement(SearchShortcut_1.SearchShortcut, { "data-translation-key": "search.keys.navigate", combination: "Tab", text: translate('search.keys.navigate', 'to navigate') }),
@@ -345,6 +363,13 @@ const AiDialogHeaderActionsWrapper = styled_components_1.default.div `
345
363
  display: flex;
346
364
  gap: var(--spacing-xxs);
347
365
  `;
366
+ const AiDialogHeaderTitle = styled_components_1.default.span `
367
+ display: flex;
368
+ align-items: center;
369
+ gap: var(--spacing-xs);
370
+ font-weight: var(--font-weight-semibold);
371
+ font-size: var(--font-size-lg);
372
+ `;
348
373
  const SearchDialogBody = styled_components_1.default.div `
349
374
  display: flex;
350
375
  flex-direction: row-reverse;
@@ -12,7 +12,7 @@ exports.select = (0, styled_components_1.css) `
12
12
  --select-text-color: var(--text-color-secondary); // @presenter Color
13
13
  --select-border-radius: var(--border-radius); // @presenter BorderRadius
14
14
  --select-border: var(--border-width) var(--border-style) var(--border-color-primary); // @presenter Border
15
-
15
+
16
16
  --select-input-padding-vertical: 6px; // @presenter Spacing
17
17
  --select-input-padding-horizontal: 6px; // @presenter Spacing
18
18
  --select-input-padding: var(--select-input-padding-vertical) var(--select-input-padding-horizontal);
@@ -40,7 +40,7 @@ exports.select = (0, styled_components_1.css) `
40
40
  --select-list-item-border-radius: var(--border-radius); // @presenter BorderRadius
41
41
  --select-list-item-bg-color-active: transparent; // @presenter Color
42
42
  --select-list-item-bg-color-hover: var(--menu-item-bg-color-hover); // @presenter Color
43
- --select-list-item-font-weight-active: var(--font-weight-medium); // @presenter Color
43
+ --select-list-item-font-weight-active: var(--font-weight-medium); // @presenter Color
44
44
 
45
45
  --select-placeholder-color: var(--color-warm-grey-6); // @presenter Color
46
46
  // @tokens End
@@ -0,0 +1,15 @@
1
+ import type { JSX, ReactNode } from 'react';
2
+ export type SvgViewerLabels = {
3
+ zoomIn?: string;
4
+ zoomOut?: string;
5
+ fitToView?: string;
6
+ close?: string;
7
+ dialogLabel?: string;
8
+ };
9
+ export type SvgViewerProps = {
10
+ isOpen: boolean;
11
+ onClose: () => void;
12
+ children: ReactNode;
13
+ labels?: SvgViewerLabels;
14
+ };
15
+ export declare function SvgViewer({ isOpen, onClose, children, labels, }: SvgViewerProps): JSX.Element | null;