@redocly/theme 0.60.0-next.6 → 0.60.0-next.8

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 (46) hide show
  1. package/lib/components/Banner/Banner.d.ts +6 -0
  2. package/lib/components/Banner/Banner.js +172 -0
  3. package/lib/components/Banner/variables.d.ts +1 -0
  4. package/lib/components/Banner/variables.dark.d.ts +1 -0
  5. package/lib/components/Banner/variables.dark.js +12 -0
  6. package/lib/components/Banner/variables.js +45 -0
  7. package/lib/components/Buttons/AIAssistantButton.js +2 -1
  8. package/lib/components/LanguagePicker/LanguagePicker.js +1 -0
  9. package/lib/components/Navbar/Navbar.js +13 -5
  10. package/lib/components/Search/Search.js +6 -1
  11. package/lib/components/Search/SearchDialog.js +11 -5
  12. package/lib/core/contexts/SearchContext.d.ts +10 -0
  13. package/lib/core/contexts/SearchContext.js +56 -0
  14. package/lib/core/contexts/index.d.ts +1 -0
  15. package/lib/core/contexts/index.js +1 -0
  16. package/lib/core/hooks/search/use-search-dialog.js +4 -1
  17. package/lib/core/hooks/use-telemetry-fallback.d.ts +2 -0
  18. package/lib/core/hooks/use-telemetry-fallback.js +2 -0
  19. package/lib/core/hooks/use-theme-hooks.js +1 -0
  20. package/lib/core/openapi/index.d.ts +1 -0
  21. package/lib/core/openapi/index.js +4 -1
  22. package/lib/core/styles/dark.js +2 -0
  23. package/lib/core/styles/global.js +32 -30
  24. package/lib/core/types/hooks.d.ts +7 -3
  25. package/lib/index.d.ts +1 -0
  26. package/lib/index.js +2 -0
  27. package/package.json +7 -7
  28. package/src/components/Banner/Banner.tsx +179 -0
  29. package/src/components/Banner/variables.dark.ts +10 -0
  30. package/src/components/Banner/variables.ts +43 -0
  31. package/src/components/Buttons/AIAssistantButton.tsx +3 -2
  32. package/src/components/LanguagePicker/LanguagePicker.tsx +1 -0
  33. package/src/components/Navbar/Navbar.tsx +13 -5
  34. package/src/components/Search/Search.tsx +10 -1
  35. package/src/components/Search/SearchDialog.tsx +12 -5
  36. package/src/core/contexts/SearchContext.tsx +31 -0
  37. package/src/core/contexts/index.ts +1 -0
  38. package/src/core/hooks/__mocks__/use-theme-hooks.ts +4 -0
  39. package/src/core/hooks/search/use-search-dialog.ts +4 -1
  40. package/src/core/hooks/use-telemetry-fallback.ts +2 -0
  41. package/src/core/hooks/use-theme-hooks.ts +1 -0
  42. package/src/core/openapi/index.ts +1 -0
  43. package/src/core/styles/dark.ts +2 -0
  44. package/src/core/styles/global.ts +2 -0
  45. package/src/core/types/hooks.ts +6 -5
  46. package/src/index.ts +2 -0
@@ -0,0 +1,6 @@
1
+ import type { JSX } from 'react';
2
+ type BannerProps = {
3
+ className?: string;
4
+ };
5
+ export declare function Banner({ className }: BannerProps): JSX.Element | null;
6
+ export {};
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Banner = Banner;
37
+ const react_1 = __importStar(require("react"));
38
+ const styled_components_1 = __importStar(require("styled-components"));
39
+ const hooks_1 = require("../../core/hooks");
40
+ const Markdown_1 = require("../../components/Markdown/Markdown");
41
+ const CloseIcon_1 = require("../../icons/CloseIcon/CloseIcon");
42
+ const Button_1 = require("../../components/Button/Button");
43
+ function setBannerHeight(height) {
44
+ document.documentElement.style.setProperty('--banner-height', `${height}px`);
45
+ }
46
+ function Banner({ className }) {
47
+ const { useBanner, useMarkdownText } = (0, hooks_1.useThemeHooks)();
48
+ const { banner, dismissBanner } = useBanner();
49
+ const [displayBanner, setDisplayBanner] = (0, react_1.useState)(undefined);
50
+ const [isVisible, setIsVisible] = (0, react_1.useState)(false);
51
+ const markdownContent = useMarkdownText((displayBanner === null || displayBanner === void 0 ? void 0 : displayBanner.content) || '');
52
+ const bannerRef = (0, react_1.useRef)(null);
53
+ (0, react_1.useEffect)(() => {
54
+ if (banner) {
55
+ setDisplayBanner(banner);
56
+ requestAnimationFrame(() => {
57
+ requestAnimationFrame(() => {
58
+ setIsVisible(true);
59
+ });
60
+ });
61
+ }
62
+ else {
63
+ setIsVisible(false);
64
+ const timer = setTimeout(() => {
65
+ setDisplayBanner(undefined);
66
+ }, 400);
67
+ return () => clearTimeout(timer);
68
+ }
69
+ }, [banner]);
70
+ (0, react_1.useEffect)(() => {
71
+ if (!displayBanner) {
72
+ const timer = setTimeout(() => {
73
+ setBannerHeight(0);
74
+ }, 400);
75
+ return () => clearTimeout(timer);
76
+ }
77
+ const bannerElement = bannerRef.current;
78
+ if (!bannerElement)
79
+ return;
80
+ if (!isVisible) {
81
+ setBannerHeight(0);
82
+ return;
83
+ }
84
+ const updateHeight = () => {
85
+ const height = bannerElement.getBoundingClientRect().height;
86
+ setBannerHeight(height);
87
+ };
88
+ updateHeight();
89
+ const resizeObserver = new ResizeObserver(updateHeight);
90
+ resizeObserver.observe(bannerElement);
91
+ return () => {
92
+ resizeObserver.disconnect();
93
+ };
94
+ }, [displayBanner, isVisible]);
95
+ if (!displayBanner) {
96
+ return null;
97
+ }
98
+ const bannerColor = displayBanner.color || 'info';
99
+ return (react_1.default.createElement(BannerWrapper, { ref: bannerRef, "data-component-name": "Banner/Banner", className: className, "$color": bannerColor, "$isVisible": isVisible },
100
+ react_1.default.createElement(BannerContent, null,
101
+ react_1.default.createElement(Markdown_1.Markdown, { compact: true }, markdownContent)),
102
+ displayBanner.dismissible && (react_1.default.createElement(DismissButton, { variant: "ghost", size: "var(--banner-button-size)", icon: react_1.default.createElement(CloseIcon_1.CloseIcon, { color: `var(--banner-${bannerColor}-icon-color)`, size: "16px" }), onClick: () => dismissBanner(displayBanner.content), "aria-label": "Dismiss banner" }))));
103
+ }
104
+ const BannerContent = styled_components_1.default.div `
105
+ flex: 1;
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+
110
+ p {
111
+ margin: 0;
112
+ color: var(--banner-text-color);
113
+ text-align: center;
114
+
115
+ a:not([role='button']) {
116
+ color: var(--banner-link-color);
117
+ text-decoration: var(--banner-link-decoration);
118
+ }
119
+
120
+ [data-component-name='Button/Button'] {
121
+ --button-font-size: var(--banner-button-font-size);
122
+ --button-border-radius: var(--banner-button-border-radius);
123
+ --button-padding: var(--banner-button-padding-inline);
124
+ --button-line-height: var(--banner-button-line-height);
125
+ --button-icon-size: var(--banner-button-icon-size);
126
+ --button-icon-padding: var(--banner-button-icon-padding);
127
+ --button-icon-left-padding: var(--banner-button-icon-left-padding);
128
+ --button-icon-right-padding: var(--banner-button-icon-right-padding);
129
+ margin: var(--banner-button-margin);
130
+ }
131
+ }
132
+
133
+ p > * {
134
+ vertical-align: bottom;
135
+ }
136
+ `;
137
+ const BannerWrapper = styled_components_1.default.div `
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: space-between;
141
+ padding: var(--banner-padding);
142
+ color: var(--banner-text-color);
143
+ min-height: var(--banner-min-height);
144
+ position: absolute;
145
+ top: 0;
146
+ left: 0;
147
+ right: 0;
148
+ width: 100%;
149
+ z-index: var(--z-index-overlay);
150
+ transform: ${({ $isVisible }) => ($isVisible ? 'translateY(0)' : 'translateY(-100%)')};
151
+ transition: transform 0.4s ease-out;
152
+ ${({ $color }) => $color &&
153
+ (0, styled_components_1.css) `
154
+ background-color: var(--banner-${$color}-bg-color);
155
+
156
+ ${BannerContent} {
157
+ p {
158
+ color: var(--banner-${$color}-text-color);
159
+ }
160
+
161
+ a:not([role='button']) {
162
+ color: var(--banner-${$color}-link-color);
163
+ }
164
+ }
165
+ `}
166
+ `;
167
+ const DismissButton = (0, styled_components_1.default)(Button_1.Button) `
168
+ width: var(--banner-button-size);
169
+ height: var(--banner-button-size);
170
+ padding: var(--banner-button-padding);
171
+ `;
172
+ //# sourceMappingURL=Banner.js.map
@@ -0,0 +1 @@
1
+ export declare const banner: import("styled-components").FlattenSimpleInterpolation;
@@ -0,0 +1 @@
1
+ export declare const bannerDarkMode: import("styled-components").FlattenSimpleInterpolation;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bannerDarkMode = void 0;
4
+ const styled_components_1 = require("styled-components");
5
+ exports.bannerDarkMode = (0, styled_components_1.css) `
6
+ /**
7
+ * @tokens Banner
8
+ */
9
+
10
+ --banner-warning-text-color: var(--color-white); // @presenter Color
11
+ `;
12
+ //# sourceMappingURL=variables.dark.js.map
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.banner = void 0;
4
+ const styled_components_1 = require("styled-components");
5
+ exports.banner = (0, styled_components_1.css) `
6
+ /**
7
+ * @tokens Banner
8
+ */
9
+ --banner-button-size: 22px;
10
+ --banner-button-padding: 3px; // @presenter Spacing
11
+ --banner-button-font-size: var(--font-size-base);
12
+ --banner-button-border-radius: var(--border-radius);
13
+ --banner-button-padding-inline: 1px var(--spacing-sm);
14
+ --banner-button-line-height: var(--line-height-base); // @presenter LineHeight
15
+ --banner-button-icon-size: 14px;
16
+ --banner-button-icon-padding: 5px; // @presenter Spacing
17
+ --banner-button-icon-left-padding: 1px var(--spacing-sm) 1px 10px; // @presenter Spacing
18
+ --banner-button-icon-right-padding: 1px 10px 1px var(--spacing-sm); // @presenter Spacing
19
+ --banner-button-margin: 0 var(--spacing-xs); // @presenter Spacing
20
+ --banner-padding: var(--spacing-xs); // @presenter Spacing
21
+ --banner-link-decoration: var(--link-decoration-hover);
22
+ --banner-min-height: 38px;
23
+ --banner-gap: var(--spacing-xxs); // @presenter Spacing
24
+
25
+ --banner-info-bg-color: var(--color-info-base); // @presenter Color
26
+ --banner-info-text-color: var(--color-static-white); // @presenter Color
27
+ --banner-info-icon-color: var(--color-static-white); // @presenter Color
28
+ --banner-info-link-color: var(--banner-info-text-color); // @presenter Color
29
+
30
+ --banner-success-bg-color: var(--color-success-base); // @presenter Color
31
+ --banner-success-text-color: var(--color-static-white); // @presenter Color
32
+ --banner-success-icon-color: var(--color-static-white); // @presenter Color
33
+ --banner-success-link-color: var(--banner-success-text-color); // @presenter Color
34
+
35
+ --banner-warning-bg-color: var(--color-warning-base); // @presenter Color
36
+ --banner-warning-text-color: var(--color-black); // @presenter Color
37
+ --banner-warning-icon-color: var(--color-black); // @presenter Color
38
+ --banner-warning-link-color: var(--banner-warning-text-color); // @presenter Color
39
+
40
+ --banner-error-bg-color: var(--color-error-base); // @presenter Color
41
+ --banner-error-text-color: var(--color-static-white); // @presenter Color
42
+ --banner-error-icon-color: var(--color-static-white); // @presenter Color
43
+ --banner-error-link-color: var(--banner-error-text-color); // @presenter Color
44
+ `;
45
+ //# sourceMappingURL=variables.js.map
@@ -46,6 +46,7 @@ const hooks_1 = require("../../core/hooks");
46
46
  const ChatIcon_1 = require("../../icons/ChatIcon/ChatIcon");
47
47
  const AiStarsGradientIcon_1 = require("../../icons/AiStarsGradientIcon/AiStarsGradientIcon");
48
48
  const RedoclyIcon_1 = require("../../icons/RedoclyIcon/RedoclyIcon");
49
+ const contexts_1 = require("../../core/contexts");
49
50
  const defaultConfig = {
50
51
  hide: false,
51
52
  inputType: 'button',
@@ -92,7 +93,7 @@ function AIAssistantButton() {
92
93
  const handleClose = () => {
93
94
  setIsOpen(false);
94
95
  };
95
- return (React.createElement(React.Fragment, null,
96
+ return (React.createElement(contexts_1.SearchSessionProvider, null,
96
97
  React.createElement(StyledAIAssistantButton, { variant: "outlined", size: "medium", "$inputType": inputType, onClick: handleOpen, "aria-label": `AI Assistant button - ${inputIcon}`, "data-component-name": "Buttons/AIAssistantButton" },
97
98
  icon,
98
99
  inputType === 'button' && text),
@@ -40,6 +40,7 @@ const LanguageDropdown = (0, styled_components_1.default)(Dropdown_1.Dropdown).a
40
40
  },
41
41
  })) `
42
42
  display: none;
43
+ height: auto;
43
44
  @media screen and (min-width: ${utils_1.breakpoints.medium}) {
44
45
  display: block;
45
46
  }
@@ -19,6 +19,7 @@ const ProductPicker_1 = require("../../components/Product/ProductPicker");
19
19
  const Button_1 = require("../../components/Button/Button");
20
20
  const MenuIcon_1 = require("../../icons/MenuIcon/MenuIcon");
21
21
  const CloseIcon_1 = require("../../icons/CloseIcon/CloseIcon");
22
+ const Banner_1 = require("../../components/Banner/Banner");
22
23
  function Navbar({ className }) {
23
24
  var _a;
24
25
  const { isOpen, closeMobileMenu, openMobileMenu } = (0, hooks_1.useMobileMenu)(false);
@@ -34,6 +35,7 @@ function Navbar({ className }) {
34
35
  const hideSearch = (searchSettings === null || searchSettings === void 0 ? void 0 : searchSettings.hide) || ((searchSettings === null || searchSettings === void 0 ? void 0 : searchSettings.placement) && (searchSettings === null || searchSettings === void 0 ? void 0 : searchSettings.placement) !== 'navbar');
35
36
  const hideUserMenu = userMenuSettings === null || userMenuSettings === void 0 ? void 0 : userMenuSettings.hide;
36
37
  return (react_1.default.createElement(NavbarWrapper, { "data-component-name": "Navbar/Navbar", className: className },
38
+ react_1.default.createElement(Banner_1.Banner, null),
37
39
  isOpen && react_1.default.createElement(MenuMobile_1.MenuMobile, { hideUserProfile: !!hideUserMenu }),
38
40
  react_1.default.createElement(NavbarRow, null,
39
41
  logo && react_1.default.createElement(NavbarLogo_1.NavbarLogo, { config: logo }),
@@ -55,16 +57,15 @@ function Navbar({ className }) {
55
57
  }
56
58
  const NavbarWrapper = styled_components_1.default.nav `
57
59
  --text-color: var(--navbar-text-color);
60
+ height: calc(var(--navbar-height) + var(--banner-height));
61
+ transition: height 0.4s ease-out;
58
62
 
59
63
  position: sticky;
60
- display: flex;
61
64
  top: 0;
62
- height: var(--navbar-height);
65
+ display: flex;
66
+ flex-direction: column;
63
67
  flex-shrink: 0;
64
- align-items: center;
65
68
  box-sizing: border-box;
66
- padding: var(--navbar-padding);
67
- border: var(--navbar-border);
68
69
  font-size: var(--navbar-font-size);
69
70
  font-family: var(--navbar-font-family);
70
71
  z-index: var(--z-index-raised);
@@ -88,7 +89,14 @@ const NavbarRow = styled_components_1.default.div `
88
89
  justify-content: space-between;
89
90
  width: 100%;
90
91
  gap: 8px;
92
+ height: var(--navbar-height);
91
93
  max-width: var(--navbar-container-max-width);
94
+ padding: var(--navbar-padding);
95
+ border: var(--navbar-border);
96
+ background: var(--navbar-bg-color);
97
+ box-sizing: border-box;
98
+ margin-top: var(--banner-height);
99
+ transition: margin-top 0.5s ease-out;
92
100
 
93
101
  @media screen and (min-width: ${utils_1.breakpoints.max}) {
94
102
  max-width: var(--container-max-width);
@@ -9,12 +9,17 @@ const styled_components_1 = __importDefault(require("styled-components"));
9
9
  const SearchTrigger_1 = require("../../components/Search/SearchTrigger");
10
10
  const SearchDialog_1 = require("../../components/Search/SearchDialog");
11
11
  const hooks_1 = require("../../core/hooks");
12
- function Search({ className }) {
12
+ const contexts_1 = require("../../core/contexts");
13
+ function SearchContent({ className }) {
13
14
  const { isOpen, onOpen, onClose } = (0, hooks_1.useSearchDialog)();
14
15
  return (react_1.default.createElement(SearchWrapper, { "data-component-name": "Search/Search", className: className },
15
16
  react_1.default.createElement(SearchTrigger_1.SearchTrigger, { onClick: onOpen }),
16
17
  isOpen && react_1.default.createElement(SearchDialog_1.SearchDialog, { onClose: onClose })));
17
18
  }
19
+ function Search({ className }) {
20
+ return (react_1.default.createElement(contexts_1.SearchSessionProvider, null,
21
+ react_1.default.createElement(SearchContent, { className: className })));
22
+ }
18
23
  const SearchWrapper = styled_components_1.default.div `
19
24
  margin-left: auto;
20
25
  `;
@@ -54,6 +54,7 @@ const SearchGroups_1 = require("../../components/Search/SearchGroups");
54
54
  const Typography_1 = require("../../components/Typography/Typography");
55
55
  const SpinnerLoader_1 = require("../../components/Loaders/SpinnerLoader");
56
56
  const SearchAiDialog_1 = require("../../components/Search/SearchAiDialog");
57
+ const contexts_1 = require("../../core/contexts");
57
58
  const SettingsIcon_1 = require("../../icons/SettingsIcon/SettingsIcon");
58
59
  const AiStarsIcon_1 = require("../../icons/AiStarsIcon/AiStarsIcon");
59
60
  const ReturnKeyIcon_1 = require("../../icons/ReturnKeyIcon/ReturnKeyIcon");
@@ -63,16 +64,16 @@ const AiStarsGradientIcon_1 = require("../../icons/AiStarsGradientIcon/AiStarsGr
63
64
  function SearchDialog({ onClose, className, initialMode = 'search', }) {
64
65
  const { useTranslate, useCurrentProduct, useSearch, useProducts, useAiSearch, useTelemetry } = (0, hooks_1.useThemeHooks)();
65
66
  const telemetry = useTelemetry();
67
+ const { searchSessionId, refreshSearchSessionId } = (0, contexts_1.useSearchSession)();
66
68
  const products = useProducts();
67
69
  const currentProduct = useCurrentProduct();
68
70
  const [product, setProduct] = (0, react_1.useState)(currentProduct);
69
- const searchSessionId = `search-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
70
71
  const [mode, setMode] = (0, react_1.useState)(initialMode);
71
72
  const autoSearchDisabled = mode !== 'search';
72
- const { query, setQuery, filter, setFilter, items, isSearchLoading, facets, setLoadMore, advancedSearch, askAi, groupField, } = useSearch(product === null || product === void 0 ? void 0 : product.name, autoSearchDisabled, searchSessionId);
73
+ const { query, setQuery, filter, setFilter, items, isSearchLoading, facets, setLoadMore, advancedSearch, askAi, groupField, } = useSearch(product === null || product === void 0 ? void 0 : product.name, autoSearchDisabled);
73
74
  const { isFilterOpen, onFilterToggle, onFilterChange, onFilterReset, onFacetReset, onQuickFilterReset, } = (0, hooks_1.useSearchFilter)(filter, setFilter);
74
75
  const { addSearchHistoryItem } = (0, hooks_1.useRecentSearches)();
75
- const aiSearch = useAiSearch({ filter }, searchSessionId);
76
+ const aiSearch = useAiSearch({ filter });
76
77
  const searchInputRef = (0, react_1.useRef)(null);
77
78
  const modalRef = (0, react_1.useRef)(null);
78
79
  const [isMobile, setIsMobile] = (0, react_1.useState)(false);
@@ -95,8 +96,10 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
95
96
  if (value) {
96
97
  addSearchHistoryItem(value);
97
98
  }
99
+ // Refresh the search session id so a new session starts on next open
100
+ refreshSearchSessionId();
98
101
  onClose();
99
- }, [addSearchHistoryItem, onClose]);
102
+ }, [addSearchHistoryItem, onClose, refreshSearchSessionId]);
100
103
  (0, hooks_1.useDialogHotKeys)(modalRef, handleClose);
101
104
  const focusSearchInput = () => {
102
105
  requestAnimationFrame(() => {
@@ -199,7 +202,10 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
199
202
  ? translate('search.ai.back', 'Back')
200
203
  : translate('search.ai.backToSearch', 'Back to search')),
201
204
  react_1.default.createElement(AiDialogHeaderActionsWrapper, null,
202
- react_1.default.createElement(Button_1.Button, { variant: "secondary", disabled: !aiSearch.conversation.length, onClick: () => aiSearch.clearConversation(), tabIndex: 0, icon: react_1.default.createElement(EditIcon_1.EditIcon, null) }, translate('search.ai.newConversation', 'New conversation')),
205
+ react_1.default.createElement(Button_1.Button, { variant: "secondary", disabled: !aiSearch.conversation.length, onClick: () => {
206
+ refreshSearchSessionId();
207
+ aiSearch.clearConversation();
208
+ }, tabIndex: 0, icon: react_1.default.createElement(EditIcon_1.EditIcon, null) }, translate('search.ai.newConversation', 'New conversation')),
203
209
  isMobile && react_1.default.createElement(Button_1.Button, { variant: "text", icon: react_1.default.createElement(CloseIcon_1.CloseIcon, null), onClick: handleClose }))))),
204
210
  react_1.default.createElement(SearchDialogBody, null, mode === 'search' ? (react_1.default.createElement(react_1.default.Fragment, null,
205
211
  advancedSearch && isFilterOpen && (react_1.default.createElement(SearchDialogBodyFilterView, null,
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export type SearchSessionContextValue = {
3
+ searchSessionId: string;
4
+ refreshSearchSessionId: () => void;
5
+ };
6
+ export declare const SearchSessionContext: React.Context<SearchSessionContextValue | null>;
7
+ export declare const SearchSessionProvider: ({ children }: {
8
+ children: React.ReactNode;
9
+ }) => React.JSX.Element;
10
+ export declare function useSearchSession(): SearchSessionContextValue;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SearchSessionProvider = exports.SearchSessionContext = void 0;
37
+ exports.useSearchSession = useSearchSession;
38
+ const react_1 = __importStar(require("react"));
39
+ exports.SearchSessionContext = (0, react_1.createContext)(null);
40
+ const SearchSessionProvider = ({ children }) => {
41
+ const [searchSessionId, setSearchSessionId] = (0, react_1.useState)(() => crypto.randomUUID());
42
+ const refreshSearchSessionId = (0, react_1.useCallback)(() => {
43
+ setSearchSessionId(crypto.randomUUID());
44
+ }, []);
45
+ const value = (0, react_1.useMemo)(() => ({ searchSessionId, refreshSearchSessionId }), [searchSessionId, refreshSearchSessionId]);
46
+ return react_1.default.createElement(exports.SearchSessionContext.Provider, { value: value }, children);
47
+ };
48
+ exports.SearchSessionProvider = SearchSessionProvider;
49
+ function useSearchSession() {
50
+ const contextValue = (0, react_1.useContext)(exports.SearchSessionContext);
51
+ if (!contextValue) {
52
+ throw new Error('useSearchSession must be used within a SearchSessionProvider');
53
+ }
54
+ return contextValue;
55
+ }
56
+ //# sourceMappingURL=SearchContext.js.map
@@ -2,3 +2,4 @@ export * from './ThemeDataContext';
2
2
  export * from './CodeWalkthrough/CodeWalkthroughControlsContext';
3
3
  export * from './CodeWalkthrough/CodeWalkthroughStepsContext';
4
4
  export * from './CodeSnippetContext';
5
+ export * from './SearchContext';
@@ -18,4 +18,5 @@ __exportStar(require("./ThemeDataContext"), exports);
18
18
  __exportStar(require("./CodeWalkthrough/CodeWalkthroughControlsContext"), exports);
19
19
  __exportStar(require("./CodeWalkthrough/CodeWalkthroughStepsContext"), exports);
20
20
  __exportStar(require("./CodeSnippetContext"), exports);
21
+ __exportStar(require("./SearchContext"), exports);
21
22
  //# sourceMappingURL=index.js.map
@@ -9,6 +9,7 @@ const react_router_dom_1 = require("react-router-dom");
9
9
  const hotkeys_js_1 = __importDefault(require("hotkeys-js"));
10
10
  const use_theme_hooks_1 = require("../use-theme-hooks");
11
11
  const use_theme_config_1 = require("../use-theme-config");
12
+ const contexts_1 = require("../../contexts");
12
13
  function useSearchDialog() {
13
14
  var _a, _b;
14
15
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
@@ -16,6 +17,7 @@ function useSearchDialog() {
16
17
  const location = (0, react_router_dom_1.useLocation)();
17
18
  const { useTelemetry } = (0, use_theme_hooks_1.useThemeHooks)();
18
19
  const telemetry = useTelemetry();
20
+ const { refreshSearchSessionId } = (0, contexts_1.useSearchSession)();
19
21
  const keyShortcuts = (_b = (_a = themeSettings === null || themeSettings === void 0 ? void 0 : themeSettings.search) === null || _a === void 0 ? void 0 : _a.shortcuts) !== null && _b !== void 0 ? _b : ['⌘+K,CTRL+K'];
20
22
  const hotKeys = keyShortcuts === null || keyShortcuts === void 0 ? void 0 : keyShortcuts.join(',');
21
23
  (0, react_1.useEffect)(() => {
@@ -35,8 +37,9 @@ function useSearchDialog() {
35
37
  // eslint-disable-next-line react-hooks/exhaustive-deps
36
38
  }, []);
37
39
  const onClose = (0, react_1.useCallback)(() => {
40
+ refreshSearchSessionId();
38
41
  setIsOpen(false);
39
- }, []);
42
+ }, [refreshSearchSessionId]);
40
43
  // eslint-disable-next-line react-hooks/exhaustive-deps
41
44
  (0, react_1.useEffect)(onClose, [location]);
42
45
  return { isOpen, onOpen, onClose };
@@ -52,6 +52,8 @@ export declare const useTelemetryFallback: () => {
52
52
  sendSwitchServersClickedMessage: () => void;
53
53
  sendExamplesSwitcherClickedMessage: () => void;
54
54
  sendTryItOpenedMessage: () => void;
55
+ sendViewSecurityDetailsClickedMessage: () => void;
56
+ sendViewSecurityDetailsClosedMessage: () => void;
55
57
  sendAsyncapiDocsViewedMessage: () => void;
56
58
  sendAsyncapiDocsPerformanceMetricsMessage: () => void;
57
59
  sendAsyncapiDocsSwitchMessageClickedMessage: () => void;
@@ -57,6 +57,8 @@ const useTelemetryFallback = () => ({
57
57
  sendSwitchServersClickedMessage: () => { },
58
58
  sendExamplesSwitcherClickedMessage: () => { },
59
59
  sendTryItOpenedMessage: () => { },
60
+ sendViewSecurityDetailsClickedMessage: () => { },
61
+ sendViewSecurityDetailsClosedMessage: () => { },
60
62
  sendAsyncapiDocsViewedMessage: () => { },
61
63
  sendAsyncapiDocsPerformanceMetricsMessage: () => { },
62
64
  sendAsyncapiDocsSwitchMessageClickedMessage: () => { },
@@ -15,6 +15,7 @@ const fallbacks = {
15
15
  **/
16
16
  useOtelTelemetry: () => ({ send: () => { } }),
17
17
  useBreadcrumbs: () => ({ breadcrumbs: [], siblings: undefined }),
18
+ useBanner: () => ({ banner: undefined, dismissBanner: () => { } }),
18
19
  useCodeHighlight: () => ({ highlight: (rawContent) => rawContent }),
19
20
  useUserMenu: () => ({}),
20
21
  usePageData: () => null,
@@ -24,3 +24,4 @@ export { useDialogHotKeys } from '../hooks/use-dialog-hotkeys';
24
24
  export { SecurityVariablesEnvSuffix } from '../constants/environments';
25
25
  export { isUndefined, isString, isNotNull, isObject } from '../utils/type-guards';
26
26
  export { ThemeDataContext, type ThemeDataTransferObject } from '../contexts/ThemeDataContext';
27
+ export { SearchSessionProvider, SearchSessionContext } from '../contexts/SearchContext';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThemeDataContext = exports.isObject = exports.isNotNull = exports.isString = exports.isUndefined = exports.SecurityVariablesEnvSuffix = exports.useDialogHotKeys = exports.useSearchDialog = exports.useModalScrollLock = exports.useActiveSectionId = exports.useOutsideClick = exports.useThemeHooks = exports.useFocusTrap = exports.getUserAgent = exports.ClipboardService = exports.getOperationColor = exports.isPrimitive = exports.breakpoints = exports.GlobalStyle = exports.useMount = exports.typedMemo = exports.capitalize = exports.withPathPrefix = exports.addTrailingSlash = exports.combineUrls = exports.getPathPrefix = exports.removeLeadingSlash = exports.addLeadingSlash = exports.IS_BROWSER = void 0;
3
+ exports.SearchSessionContext = exports.SearchSessionProvider = exports.ThemeDataContext = exports.isObject = exports.isNotNull = exports.isString = exports.isUndefined = exports.SecurityVariablesEnvSuffix = exports.useDialogHotKeys = exports.useSearchDialog = exports.useModalScrollLock = exports.useActiveSectionId = exports.useOutsideClick = exports.useThemeHooks = exports.useFocusTrap = exports.getUserAgent = exports.ClipboardService = exports.getOperationColor = exports.isPrimitive = exports.breakpoints = exports.GlobalStyle = exports.useMount = exports.typedMemo = exports.capitalize = exports.withPathPrefix = exports.addTrailingSlash = exports.combineUrls = exports.getPathPrefix = exports.removeLeadingSlash = exports.addLeadingSlash = exports.IS_BROWSER = void 0;
4
4
  var dom_1 = require("../utils/dom");
5
5
  Object.defineProperty(exports, "IS_BROWSER", { enumerable: true, get: function () { return dom_1.IS_BROWSER; } });
6
6
  var urls_1 = require("../utils/urls");
@@ -51,4 +51,7 @@ Object.defineProperty(exports, "isNotNull", { enumerable: true, get: function ()
51
51
  Object.defineProperty(exports, "isObject", { enumerable: true, get: function () { return type_guards_1.isObject; } });
52
52
  var ThemeDataContext_1 = require("../contexts/ThemeDataContext");
53
53
  Object.defineProperty(exports, "ThemeDataContext", { enumerable: true, get: function () { return ThemeDataContext_1.ThemeDataContext; } });
54
+ var SearchContext_1 = require("../contexts/SearchContext");
55
+ Object.defineProperty(exports, "SearchSessionProvider", { enumerable: true, get: function () { return SearchContext_1.SearchSessionProvider; } });
56
+ Object.defineProperty(exports, "SearchSessionContext", { enumerable: true, get: function () { return SearchContext_1.SearchSessionContext; } });
54
57
  //# sourceMappingURL=index.js.map
@@ -16,6 +16,7 @@ const variables_dark_11 = require("../../markdoc/components/Cards/variables.dark
16
16
  const variables_dark_12 = require("../../components/Catalog/variables.dark");
17
17
  const variables_dark_13 = require("../../components/PageActions/variables.dark");
18
18
  const variables_dark_14 = require("../../components/Tooltip/variables.dark");
19
+ const variables_dark_15 = require("../../components/Banner/variables.dark");
19
20
  const replayDarkMode = (0, styled_components_1.css) `
20
21
  /**
21
22
  * @tokens Replay Colors
@@ -327,6 +328,7 @@ exports.darkMode = (0, styled_components_1.css) `
327
328
  ${variables_dark_12.catalogDarkMode}
328
329
  ${variables_dark_13.pageActionsDarkMode}
329
330
  ${variables_dark_14.tooltipDarkMode}
331
+ ${variables_dark_15.bannerDarkMode}
330
332
 
331
333
  /**
332
334
  * @tokens Dark Theme Scrollbar Config