@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.
- package/lib/components/Banner/Banner.d.ts +6 -0
- package/lib/components/Banner/Banner.js +172 -0
- package/lib/components/Banner/variables.d.ts +1 -0
- package/lib/components/Banner/variables.dark.d.ts +1 -0
- package/lib/components/Banner/variables.dark.js +12 -0
- package/lib/components/Banner/variables.js +45 -0
- package/lib/components/Buttons/AIAssistantButton.js +2 -1
- package/lib/components/LanguagePicker/LanguagePicker.js +1 -0
- package/lib/components/Navbar/Navbar.js +13 -5
- package/lib/components/Search/Search.js +6 -1
- package/lib/components/Search/SearchDialog.js +11 -5
- package/lib/core/contexts/SearchContext.d.ts +10 -0
- package/lib/core/contexts/SearchContext.js +56 -0
- package/lib/core/contexts/index.d.ts +1 -0
- package/lib/core/contexts/index.js +1 -0
- package/lib/core/hooks/search/use-search-dialog.js +4 -1
- package/lib/core/hooks/use-telemetry-fallback.d.ts +2 -0
- package/lib/core/hooks/use-telemetry-fallback.js +2 -0
- package/lib/core/hooks/use-theme-hooks.js +1 -0
- package/lib/core/openapi/index.d.ts +1 -0
- package/lib/core/openapi/index.js +4 -1
- package/lib/core/styles/dark.js +2 -0
- package/lib/core/styles/global.js +32 -30
- package/lib/core/types/hooks.d.ts +7 -3
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/package.json +7 -7
- package/src/components/Banner/Banner.tsx +179 -0
- package/src/components/Banner/variables.dark.ts +10 -0
- package/src/components/Banner/variables.ts +43 -0
- package/src/components/Buttons/AIAssistantButton.tsx +3 -2
- package/src/components/LanguagePicker/LanguagePicker.tsx +1 -0
- package/src/components/Navbar/Navbar.tsx +13 -5
- package/src/components/Search/Search.tsx +10 -1
- package/src/components/Search/SearchDialog.tsx +12 -5
- package/src/core/contexts/SearchContext.tsx +31 -0
- package/src/core/contexts/index.ts +1 -0
- package/src/core/hooks/__mocks__/use-theme-hooks.ts +4 -0
- package/src/core/hooks/search/use-search-dialog.ts +4 -1
- package/src/core/hooks/use-telemetry-fallback.ts +2 -0
- package/src/core/hooks/use-theme-hooks.ts +1 -0
- package/src/core/openapi/index.ts +1 -0
- package/src/core/styles/dark.ts +2 -0
- package/src/core/styles/global.ts +2 -0
- package/src/core/types/hooks.ts +6 -5
- package/src/index.ts +2 -0
|
@@ -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(
|
|
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),
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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 }
|
|
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: () =>
|
|
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
|
|
@@ -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
|
package/lib/core/styles/dark.js
CHANGED
|
@@ -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
|