@redocly/theme 0.1.30 → 0.1.33
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/JsonViewer/JsonViewer.js +1 -1
- package/Navbar/Navbar.d.ts +2 -1
- package/Navbar/Navbar.js +3 -2
- package/PageNavigation/NextPageLink.js +3 -3
- package/PageNavigation/PageNavigation.d.ts +1 -1
- package/PageNavigation/PageNavigation.js +7 -1
- package/PageNavigation/PreviousPageLink.js +3 -3
- package/Profile/Profile.js +3 -4
- package/TableOfContent/TableOfContent.js +1 -1
- package/Tooltip/Tooltip.js +4 -2
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +1 -0
- package/hooks/useOutsideClick.d.ts +2 -0
- package/hooks/useOutsideClick.js +21 -0
- package/mocks/hooks/index.d.ts +3 -3
- package/mocks/hooks/index.js +5 -8
- package/package.json +1 -1
- package/settings.yaml +4 -0
- package/src/JsonViewer/JsonViewer.tsx +19 -17
- package/src/Navbar/Navbar.tsx +3 -1
- package/src/PageNavigation/NextPageLink.tsx +1 -1
- package/src/PageNavigation/PageNavigation.tsx +10 -2
- package/src/PageNavigation/PreviousPageLink.tsx +2 -2
- package/src/Profile/Profile.tsx +4 -5
- package/src/TableOfContent/TableOfContent.tsx +1 -1
- package/src/Tooltip/Tooltip.tsx +6 -3
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useOutsideClick.ts +21 -0
- package/src/mocks/hooks/index.ts +6 -9
- package/src/utils/color.ts +9 -6
- package/utils/color.d.ts +1 -2
- package/utils/color.js +11 -9
package/JsonViewer/JsonViewer.js
CHANGED
|
@@ -141,7 +141,7 @@ function JsonComponent(_a) {
|
|
|
141
141
|
exports.Json = (0, react_1.memo)(JsonComponent);
|
|
142
142
|
exports.JsonViewer = (0, styled_components_1.default)(exports.Json).attrs(function () { return ({
|
|
143
143
|
'data-component-name': 'JsonViewer/JsonViewer',
|
|
144
|
-
}); })(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n .redoc-json code {\n background-color: var(--samples-panel-controls-background-color);\n color: var(--color-content-inverse);\n padding: inherit;\n border: none;\n }\n\n contain: content;\n overflow-x: auto;\n position: relative;\n padding: 10px;\n border-radius: var(--global-border-radius);\n background-color: var(--samples-panel-controls-background-color);\n color: var(--color-content-inverse);\n font-size: var(--code-font-size);\n font-family: var(--code-font-family);\n white-space: var(--code-wrap, pre);\n\n &.line-numbers {\n padding: 20px 20px 20px 3em;\n\n *[data-line]:not(.collapsed *[data-line]) {\n &:before {\n content: attr(data-line);\n position: absolute;\n left: 0;\n min-width: 2em;\n text-align: right;\n pointer-events: none;\n user-select: none;\n padding: 0 0.5em;\n font-size: 13px;\n }\n }\n }\n\n .callback-function {\n color: gray;\n }\n\n .
|
|
144
|
+
}); })(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n .redoc-json code {\n background-color: var(--samples-panel-controls-background-color);\n color: var(--color-content-inverse);\n padding: inherit;\n border: none;\n }\n\n contain: content;\n overflow-x: auto;\n position: relative;\n padding: 10px;\n border-radius: var(--global-border-radius);\n background-color: var(--samples-panel-controls-background-color);\n color: var(--color-content-inverse);\n font-size: var(--code-font-size);\n font-family: var(--code-font-family);\n white-space: var(--code-wrap, pre);\n\n &.line-numbers {\n padding: 20px 20px 20px 3em;\n\n *[data-line]:not(.collapsed *[data-line]) {\n &:before {\n content: attr(data-line);\n position: absolute;\n left: 0;\n min-width: 2em;\n text-align: right;\n pointer-events: none;\n user-select: none;\n padding: 0 0.5em;\n font-size: 13px;\n }\n }\n }\n\n .callback-function {\n color: gray;\n }\n\n .ellipsis:after {\n content: ' \u2026 ';\n }\n\n .collapsible {\n padding-left: 2ch;\n display: inline-block;\n }\n\n .hoverable {\n padding: 1px 2px;\n display: inline-block;\n }\n\n .collapsed {\n white-space: nowrap;\n\n & > .collapser:after {\n content: '+';\n }\n }\n\n .hovered {\n background-color: rgba(235, 238, 249, 1);\n }\n\n .collapser {\n --size: 15px;\n --margin-right: 3px;\n\n display: inline-block;\n background-color: transparent;\n border: 0;\n padding: 1px;\n color: #fff;\n width: var(--size);\n height: var(--size);\n margin-left: calc((var(--size) + var(--margin-right)) * -1);\n margin-right: var(--margin-right);\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n font-family: var(--code-font-family);\n font-size: var(--code-font-size);\n\n &:after {\n content: '-';\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n }\n\n &:focus {\n outline: #fff dotted 1px;\n }\n }\n\n .selected {\n outline-width: 1px;\n outline-style: dotted;\n }\n\n .collapsed > .collapsible {\n display: none;\n }\n\n .ellipsis {\n display: none;\n }\n\n .collapsed > .ellipsis {\n display: inline;\n }\n"], ["\n .redoc-json code {\n background-color: var(--samples-panel-controls-background-color);\n color: var(--color-content-inverse);\n padding: inherit;\n border: none;\n }\n\n contain: content;\n overflow-x: auto;\n position: relative;\n padding: 10px;\n border-radius: var(--global-border-radius);\n background-color: var(--samples-panel-controls-background-color);\n color: var(--color-content-inverse);\n font-size: var(--code-font-size);\n font-family: var(--code-font-family);\n white-space: var(--code-wrap, pre);\n\n &.line-numbers {\n padding: 20px 20px 20px 3em;\n\n *[data-line]:not(.collapsed *[data-line]) {\n &:before {\n content: attr(data-line);\n position: absolute;\n left: 0;\n min-width: 2em;\n text-align: right;\n pointer-events: none;\n user-select: none;\n padding: 0 0.5em;\n font-size: 13px;\n }\n }\n }\n\n .callback-function {\n color: gray;\n }\n\n .ellipsis:after {\n content: ' \u2026 ';\n }\n\n .collapsible {\n padding-left: 2ch;\n display: inline-block;\n }\n\n .hoverable {\n padding: 1px 2px;\n display: inline-block;\n }\n\n .collapsed {\n white-space: nowrap;\n\n & > .collapser:after {\n content: '+';\n }\n }\n\n .hovered {\n background-color: rgba(235, 238, 249, 1);\n }\n\n .collapser {\n --size: 15px;\n --margin-right: 3px;\n\n display: inline-block;\n background-color: transparent;\n border: 0;\n padding: 1px;\n color: #fff;\n width: var(--size);\n height: var(--size);\n margin-left: calc((var(--size) + var(--margin-right)) * -1);\n margin-right: var(--margin-right);\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n font-family: var(--code-font-family);\n font-size: var(--code-font-size);\n\n &:after {\n content: '-';\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n }\n\n &:focus {\n outline: #fff dotted 1px;\n }\n }\n\n .selected {\n outline-width: 1px;\n outline-style: dotted;\n }\n\n .collapsed > .collapsible {\n display: none;\n }\n\n .ellipsis {\n display: none;\n }\n\n .collapsed > .ellipsis {\n display: inline;\n }\n"])));
|
|
145
145
|
exports.JsonViewerWrap = styled_components_1.default.div(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &:hover > ", " {\n opacity: 1;\n }\n"], ["\n display: flex;\n flex-direction: column;\n flex: 1;\n\n &:hover > ", " {\n opacity: 1;\n }\n"])), SamplesPanelControls_1.SampleControls);
|
|
146
146
|
exports.StyledCodeBlock = (0, styled_components_1.default)(CodeBlock_1.CodeBlock)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n flex: 1;\n\n code {\n font-family: var(--code-font-family);\n font-size: 14px;\n line-height: 18px;\n }\n"], ["\n flex: 1;\n\n code {\n font-family: var(--code-font-family);\n font-size: 14px;\n line-height: 18px;\n }\n"])));
|
|
147
147
|
var templateObject_1, templateObject_2, templateObject_3;
|
package/Navbar/Navbar.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ interface NavbarProps {
|
|
|
4
4
|
menu: ResolvedConfigLinks;
|
|
5
5
|
logo: React.ReactNode;
|
|
6
6
|
search: React.ReactNode;
|
|
7
|
+
profile?: React.ReactNode;
|
|
7
8
|
}
|
|
8
|
-
export declare function Navbar({ menu, logo, search }: NavbarProps): JSX.Element | null;
|
|
9
|
+
export declare function Navbar({ menu, logo, search, profile }: NavbarProps): JSX.Element | null;
|
|
9
10
|
export declare const NavbarContainer: import("styled-components").StyledComponent<"nav", any, {}, never>;
|
|
10
11
|
export {};
|
package/Navbar/Navbar.js
CHANGED
|
@@ -33,7 +33,7 @@ var useMobileMenu_1 = require("../hooks/useMobileMenu");
|
|
|
33
33
|
var MobileNavbarMenuButton_1 = require("../Navbar/MobileNavbarMenuButton");
|
|
34
34
|
var MobileNavbarMenu_1 = require("../Navbar/MobileNavbarMenu");
|
|
35
35
|
function Navbar(_a) {
|
|
36
|
-
var menu = _a.menu, logo = _a.logo, search = _a.search;
|
|
36
|
+
var menu = _a.menu, logo = _a.logo, search = _a.search, profile = _a.profile;
|
|
37
37
|
var _b = __read((0, useMobileMenu_1.useMobileMenu)(false), 2), isOpen = _b[0], setIsOpen = _b[1];
|
|
38
38
|
var _c = (0, hooks_1.useThemeSettings)(constants_1.DEFAULT_THEME_NAME), searchSettings = _c.search, navbar = _c.navbar;
|
|
39
39
|
var 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');
|
|
@@ -47,7 +47,8 @@ function Navbar(_a) {
|
|
|
47
47
|
isOpen && react_1.default.createElement(MobileNavbarMenu_1.MobileNavbarMenu, { closeMenu: closeMobileMenu, menuItems: menu }),
|
|
48
48
|
logo,
|
|
49
49
|
react_1.default.createElement(Navbar_1.NavbarMenu, { menuItems: menu }),
|
|
50
|
-
hideSearch ? null : search
|
|
50
|
+
hideSearch ? null : search,
|
|
51
|
+
profile));
|
|
51
52
|
}
|
|
52
53
|
exports.Navbar = Navbar;
|
|
53
54
|
exports.NavbarContainer = styled_components_1.default.nav(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n height: var(--navbar-height);\n box-sizing: border-box;\n display: flex;\n color: var(--navbar-text-color);\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n\n font-size: 0.875rem;\n position: sticky;\n top: 0;\n z-index: 200;\n padding: 10px var(--sidebar-margin-left);\n background: var(--navbar-background-color);\n font-family: var(--h-font-family);\n\n ", " {\n padding: 10px var(--sidebar-margin-left);\n font-size: 1rem;\n }\n\n ", " {\n background: transparent;\n display: none;\n > :not(a, img) {\n display: none !important;\n }\n img {\n padding: 0;\n margin: 0;\n }\n }\n"], ["\n height: var(--navbar-height);\n box-sizing: border-box;\n display: flex;\n color: var(--navbar-text-color);\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n\n font-size: 0.875rem;\n position: sticky;\n top: 0;\n z-index: 200;\n padding: 10px var(--sidebar-margin-left);\n background: var(--navbar-background-color);\n font-family: var(--h-font-family);\n\n ", " {\n padding: 10px var(--sidebar-margin-left);\n font-size: 1rem;\n }\n\n ", " {\n background: transparent;\n display: none;\n > :not(a, img) {\n display: none !important;\n }\n img {\n padding: 0;\n margin: 0;\n }\n }\n"])), function (_a) {
|
|
@@ -14,13 +14,13 @@ var hooks_1 = require("../mocks/hooks");
|
|
|
14
14
|
var constants_1 = require("../mocks/constants");
|
|
15
15
|
var Button_1 = require("../Button/Button");
|
|
16
16
|
function NextPageLink() {
|
|
17
|
-
var _a;
|
|
17
|
+
var _a, _b;
|
|
18
18
|
var nextPage = ((0, hooks_1.useSidebarSiblingsData)() || {}).nextPage;
|
|
19
19
|
var navigation = (0, hooks_1.useThemeSettings)(constants_1.DEFAULT_THEME_NAME).navigation;
|
|
20
|
-
if (!nextPage || (navigation === null || navigation === void 0 ? void 0 : navigation.hide)) {
|
|
20
|
+
if (!nextPage || (navigation === null || navigation === void 0 ? void 0 : navigation.hide) || ((_a = navigation === null || navigation === void 0 ? void 0 : navigation.nextPageLink) === null || _a === void 0 ? void 0 : _a.hide)) {
|
|
21
21
|
return react_1.default.createElement("div", null, "\u00A0");
|
|
22
22
|
}
|
|
23
|
-
var label = ((
|
|
23
|
+
var label = ((_b = navigation === null || navigation === void 0 ? void 0 : navigation.nextPageLink) === null || _b === void 0 ? void 0 : _b.label) || "Next to ".concat(nextPage.label);
|
|
24
24
|
return (react_1.default.createElement(StyledButton, { variant: "outlined", size: "large", to: nextPage.link, "data-component-name": "PageNavigation/NextPageLink" }, label));
|
|
25
25
|
}
|
|
26
26
|
exports.NextPageLink = NextPageLink;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
export declare function PageNavigation(): JSX.Element;
|
|
2
|
+
export declare function PageNavigation(): JSX.Element | null;
|
|
@@ -12,11 +12,17 @@ var react_1 = __importDefault(require("react"));
|
|
|
12
12
|
var styled_components_1 = __importDefault(require("styled-components"));
|
|
13
13
|
var PreviousPageLink_1 = require("../PageNavigation/PreviousPageLink");
|
|
14
14
|
var NextPageLink_1 = require("../PageNavigation/NextPageLink");
|
|
15
|
+
var hooks_1 = require("../mocks/hooks");
|
|
16
|
+
var constants_1 = require("../mocks/constants");
|
|
15
17
|
function PageNavigation() {
|
|
18
|
+
var navigation = (0, hooks_1.useThemeSettings)(constants_1.DEFAULT_THEME_NAME).navigation;
|
|
19
|
+
if (navigation === null || navigation === void 0 ? void 0 : navigation.hide) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
16
22
|
return (react_1.default.createElement(PageNavigationWrapper, { "data-component-name": "PageNavigation/PageNavigation" },
|
|
17
23
|
react_1.default.createElement(PreviousPageLink_1.PreviousPageLink, null),
|
|
18
24
|
react_1.default.createElement(NextPageLink_1.NextPageLink, null)));
|
|
19
25
|
}
|
|
20
26
|
exports.PageNavigation = PageNavigation;
|
|
21
|
-
var PageNavigationWrapper = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: flex;\n justify-content: space-between;\n margin: 25px
|
|
27
|
+
var PageNavigationWrapper = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: flex;\n justify-content: space-between;\n margin: 25px 0;\n"], ["\n display: flex;\n justify-content: space-between;\n margin: 25px 0;\n"])));
|
|
22
28
|
var templateObject_1;
|
|
@@ -14,13 +14,13 @@ var hooks_1 = require("../mocks/hooks");
|
|
|
14
14
|
var constants_1 = require("../mocks/constants");
|
|
15
15
|
var Button_1 = require("../Button/Button");
|
|
16
16
|
function PreviousPageLink() {
|
|
17
|
-
var _a;
|
|
17
|
+
var _a, _b;
|
|
18
18
|
var prevPage = ((0, hooks_1.useSidebarSiblingsData)() || {}).prevPage;
|
|
19
19
|
var navigation = (0, hooks_1.useThemeSettings)(constants_1.DEFAULT_THEME_NAME).navigation;
|
|
20
|
-
if (!prevPage || (navigation === null || navigation === void 0 ? void 0 : navigation.hide)) {
|
|
20
|
+
if (!prevPage || (navigation === null || navigation === void 0 ? void 0 : navigation.hide) || ((_a = navigation === null || navigation === void 0 ? void 0 : navigation.previousPageLink) === null || _a === void 0 ? void 0 : _a.hide)) {
|
|
21
21
|
return react_1.default.createElement("div", null, "\u00A0");
|
|
22
22
|
}
|
|
23
|
-
var label = ((
|
|
23
|
+
var label = ((_b = navigation === null || navigation === void 0 ? void 0 : navigation.previousPageLink) === null || _b === void 0 ? void 0 : _b.label) || "Back to ".concat(prevPage.label);
|
|
24
24
|
return (react_1.default.createElement(StyledButton, { variant: "outlined", size: "large", to: prevPage.link, "data-component-name": "PageNavigation/PreviousPageLink" }, label));
|
|
25
25
|
}
|
|
26
26
|
exports.PreviousPageLink = PreviousPageLink;
|
package/Profile/Profile.js
CHANGED
|
@@ -31,7 +31,6 @@ exports.Profile = void 0;
|
|
|
31
31
|
var react_1 = __importStar(require("react"));
|
|
32
32
|
var styled_components_1 = __importStar(require("styled-components"));
|
|
33
33
|
var utils_1 = require("../utils");
|
|
34
|
-
var RANDOM_BG_COLOR = (0, utils_1.getRandomColor)();
|
|
35
34
|
function ProfileComponent(_a) {
|
|
36
35
|
var _b;
|
|
37
36
|
var name = _a.name, imageUrl = _a.imageUrl, onClick = _a.onClick, color = _a.color;
|
|
@@ -44,14 +43,14 @@ function ProfileComponent(_a) {
|
|
|
44
43
|
var avatarLetters = "".concat(name.charAt(0).toUpperCase()).concat(((_b = name.split(' ')[1]) === null || _b === void 0 ? void 0 : _b.charAt(0).toUpperCase()) || '');
|
|
45
44
|
return (react_1.default.createElement(ProfileWrapper, { onClick: onClick },
|
|
46
45
|
react_1.default.createElement(StyledUserName, { "data-cy": "user-name", color: color }, name),
|
|
47
|
-
react_1.default.createElement(AvatarWrapper, { background:
|
|
46
|
+
react_1.default.createElement(AvatarWrapper, { background: (0, utils_1.stringToHslColor)(name) },
|
|
48
47
|
react_1.default.createElement("span", null, avatarLetters))));
|
|
49
48
|
}
|
|
50
49
|
exports.Profile = (0, react_1.memo)(ProfileComponent);
|
|
51
|
-
var ProfileWrapper = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n cursor: pointer;\n width: auto;\n"], ["\n display: flex;\n align-items: center;\n cursor: pointer;\n width: auto;\n"])));
|
|
50
|
+
var ProfileWrapper = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n cursor: pointer;\n width: auto;\n padding-left: calc(var(--sidebar-spacing-horizontal) * 2);\n"], ["\n display: flex;\n align-items: center;\n cursor: pointer;\n width: auto;\n padding-left: calc(var(--sidebar-spacing-horizontal) * 2);\n"])));
|
|
52
51
|
var StyledUserName = styled_components_1.default.span(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n color: ", ";\n"], ["\n color: ", ";\n"])), function (_a) {
|
|
53
52
|
var color = _a.color;
|
|
54
|
-
return color || 'var(--color
|
|
53
|
+
return color || 'var(--navbar-text-color)';
|
|
55
54
|
});
|
|
56
55
|
var AvatarWrapper = styled_components_1.default.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n width: 40px;\n height: 40px;\n display: flex;\n overflow: hidden;\n position: relative;\n font-size: 1.25rem;\n align-items: center;\n flex-shrink: 0;\n line-height: 1;\n user-select: none;\n border-radius: 50%;\n justify-content: center;\n margin-left: 16px;\n\n ", "\n\n & > img {\n color: transparent;\n width: 100%;\n height: 100%;\n object-fit: cover;\n text-align: center;\n text-indent: 10000px;\n }\n"], ["\n width: 40px;\n height: 40px;\n display: flex;\n overflow: hidden;\n position: relative;\n font-size: 1.25rem;\n align-items: center;\n flex-shrink: 0;\n line-height: 1;\n user-select: none;\n border-radius: 50%;\n justify-content: center;\n margin-left: 16px;\n\n ", "\n\n & > img {\n color: transparent;\n width: 100%;\n height: 100%;\n object-fit: cover;\n text-align: center;\n text-indent: 10000px;\n }\n"])), function (_a) {
|
|
57
56
|
var background = _a.background;
|
|
@@ -76,7 +76,7 @@ function TableOfContent(props) {
|
|
|
76
76
|
return null;
|
|
77
77
|
}
|
|
78
78
|
var href = '#' + heading.id;
|
|
79
|
-
return (react_1.default.createElement(MenuItem, { key: href, href: href, depth: heading.depth || 0, className: activeHeadingId === heading.id ? 'active' : '', dangerouslySetInnerHTML: { __html: heading.value || '' }, "data-cy": "toc-".concat(heading.value) }));
|
|
79
|
+
return (react_1.default.createElement(MenuItem, { key: href + idx, href: href, depth: heading.depth || 0, className: activeHeadingId === heading.id ? 'active' : '', dangerouslySetInnerHTML: { __html: heading.value || '' }, "data-cy": "toc-".concat(heading.value) }));
|
|
80
80
|
}))))));
|
|
81
81
|
}
|
|
82
82
|
exports.TableOfContent = TableOfContent;
|
package/Tooltip/Tooltip.js
CHANGED
|
@@ -44,7 +44,9 @@ var styled_components_1 = __importStar(require("styled-components"));
|
|
|
44
44
|
var hooks_1 = require("../hooks");
|
|
45
45
|
function TooltipComponent(_a) {
|
|
46
46
|
var children = _a.children, isOpen = _a.isOpen, tip = _a.tip, _b = _a.withArrow, withArrow = _b === void 0 ? true : _b, _c = _a.placement, placement = _c === void 0 ? 'top' : _c, _d = _a.className, className = _d === void 0 ? 'default' : _d, width = _a.width, dataTestId = _a.dataTestId;
|
|
47
|
+
var ref = (0, react_1.useRef)(null);
|
|
47
48
|
var _e = (0, hooks_1.useControl)(isOpen), isOpened = _e.isOpened, handleOpen = _e.handleOpen, handleClose = _e.handleClose;
|
|
49
|
+
(0, hooks_1.useOutsideClick)(ref, handleClose);
|
|
48
50
|
var isControlled = isOpen !== undefined;
|
|
49
51
|
(0, react_1.useEffect)(function () {
|
|
50
52
|
if (isControlled) {
|
|
@@ -61,7 +63,7 @@ function TooltipComponent(_a) {
|
|
|
61
63
|
onMouseLeave: handleClose,
|
|
62
64
|
onClick: handleClose,
|
|
63
65
|
};
|
|
64
|
-
return (react_1.default.createElement(TooltipWrapper, __assign({}, controllers, { className: "tooltip-".concat(className), "data-component-name": "Tooltip/Tooltip" }),
|
|
66
|
+
return (react_1.default.createElement(TooltipWrapper, __assign({ ref: ref }, controllers, { className: "tooltip-".concat(className), "data-component-name": "Tooltip/Tooltip" }),
|
|
65
67
|
children,
|
|
66
68
|
isOpened && (react_1.default.createElement(TooltipBody, { "data-cy": dataTestId || (typeof tip === 'string' ? tip : ''), placement: placement, width: width, withArrow: withArrow }, tip))));
|
|
67
69
|
}
|
|
@@ -86,7 +88,7 @@ var PLACEMENTS = {
|
|
|
86
88
|
}),
|
|
87
89
|
};
|
|
88
90
|
var TooltipWrapper = styled_components_1.default.div(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n position: relative;\n display: inline-block;\n"], ["\n position: relative;\n display: inline-block;\n"])));
|
|
89
|
-
var TooltipBody = styled_components_1.default.span(templateObject_11 || (templateObject_11 = __makeTemplateObject(["\n display: inline-block;\n\n position: absolute;\n text-align: center;\n\n padding: 10px 20px;\n max-width: 250px;\n white-space: normal;\n overflow-wrap: break-word;\n\n border-radius: var(--global-border-radius);\n
|
|
91
|
+
var TooltipBody = styled_components_1.default.span(templateObject_11 || (templateObject_11 = __makeTemplateObject(["\n display: inline-block;\n\n position: absolute;\n text-align: center;\n\n padding: 10px 20px;\n max-width: 250px;\n white-space: normal;\n overflow-wrap: break-word;\n\n border-radius: var(--global-border-radius);\n transition: opacity 0.3s ease-out;\n\n font-size: 13px;\n\n &::after {\n position: absolute;\n\n content: ' ';\n display: inline-block;\n width: 0;\n height: 0;\n border-color: var(--tooltip-background-color);\n }\n\n background: var(--tooltip-background-color);\n color: var(--tooltip-color);\n box-shadow: rgb(0 0 0 / 25%) 0 2px 4px;\n\n width: ", ";\n ", "\n"], ["\n display: inline-block;\n\n position: absolute;\n text-align: center;\n\n padding: 10px 20px;\n max-width: 250px;\n white-space: normal;\n overflow-wrap: break-word;\n\n border-radius: var(--global-border-radius);\n transition: opacity 0.3s ease-out;\n\n font-size: 13px;\n\n &::after {\n position: absolute;\n\n content: ' ';\n display: inline-block;\n width: 0;\n height: 0;\n border-color: var(--tooltip-background-color);\n }\n\n background: var(--tooltip-background-color);\n color: var(--tooltip-color);\n box-shadow: rgb(0 0 0 / 25%) 0 2px 4px;\n\n width: ", ";\n ", "\n"])), function (_a) {
|
|
90
92
|
var width = _a.width;
|
|
91
93
|
return width || '120px';
|
|
92
94
|
}, function (_a) {
|
package/hooks/index.d.ts
CHANGED
package/hooks/index.js
CHANGED
|
@@ -21,3 +21,4 @@ __exportStar(require("../hooks/useActiveHeading"), exports);
|
|
|
21
21
|
__exportStar(require("../hooks/useActiveSectionId"), exports);
|
|
22
22
|
__exportStar(require("../hooks/useFullHeight"), exports);
|
|
23
23
|
__exportStar(require("../hooks/useNavbarHeight"), exports);
|
|
24
|
+
__exportStar(require("../hooks/useOutsideClick"), exports);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useOutsideClick = void 0;
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
function useOutsideClick(ref, handler) {
|
|
6
|
+
(0, react_1.useEffect)(function () {
|
|
7
|
+
var listener = function (event) {
|
|
8
|
+
if (!ref.current || ref.current.contains(event.target)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
handler(event);
|
|
12
|
+
};
|
|
13
|
+
document.addEventListener('mousedown', listener);
|
|
14
|
+
document.addEventListener('touchstart', listener);
|
|
15
|
+
return function () {
|
|
16
|
+
document.removeEventListener('mousedown', listener);
|
|
17
|
+
document.removeEventListener('touchstart', listener);
|
|
18
|
+
};
|
|
19
|
+
}, [ref, handler]);
|
|
20
|
+
}
|
|
21
|
+
exports.useOutsideClick = useOutsideClick;
|
package/mocks/hooks/index.d.ts
CHANGED
|
@@ -7,9 +7,9 @@ interface PageLink {
|
|
|
7
7
|
link: string;
|
|
8
8
|
type: 'link';
|
|
9
9
|
}
|
|
10
|
-
export declare function useThemeSettings(
|
|
10
|
+
export declare function useThemeSettings(_: string): RawTheme['settings'];
|
|
11
11
|
export declare function useSidebarSiblingsData(): {
|
|
12
|
-
nextPage: PageLink;
|
|
13
|
-
prevPage: PageLink;
|
|
12
|
+
nextPage: PageLink | null;
|
|
13
|
+
prevPage: PageLink | null;
|
|
14
14
|
};
|
|
15
15
|
export {};
|
package/mocks/hooks/index.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useSidebarSiblingsData = exports.useThemeSettings = void 0;
|
|
4
|
-
function useThemeSettings(
|
|
4
|
+
function useThemeSettings(_) {
|
|
5
5
|
return {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
nextPageLink: { label: 'next page' },
|
|
11
|
-
previousPageLink: { label: 'prev page' },
|
|
12
|
-
},
|
|
6
|
+
toc: { header: 'header', hide: false },
|
|
7
|
+
navigation: {
|
|
8
|
+
nextPageLink: { label: 'next page theme settings label' },
|
|
9
|
+
previousPageLink: { label: 'prev page theme settings label' },
|
|
13
10
|
},
|
|
14
11
|
};
|
|
15
12
|
}
|
package/package.json
CHANGED
package/settings.yaml
CHANGED
|
@@ -154,11 +154,6 @@ export const JsonViewer = styled(Json).attrs(() => ({
|
|
|
154
154
|
color: gray;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
.collapsed > .collapser:after {
|
|
158
|
-
content: '+';
|
|
159
|
-
cursor: pointer;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
157
|
.ellipsis:after {
|
|
163
158
|
content: ' … ';
|
|
164
159
|
}
|
|
@@ -174,7 +169,11 @@ export const JsonViewer = styled(Json).attrs(() => ({
|
|
|
174
169
|
}
|
|
175
170
|
|
|
176
171
|
.collapsed {
|
|
177
|
-
|
|
172
|
+
white-space: nowrap;
|
|
173
|
+
|
|
174
|
+
& > .collapser:after {
|
|
175
|
+
content: '+';
|
|
176
|
+
}
|
|
178
177
|
}
|
|
179
178
|
|
|
180
179
|
.hovered {
|
|
@@ -182,13 +181,19 @@ export const JsonViewer = styled(Json).attrs(() => ({
|
|
|
182
181
|
}
|
|
183
182
|
|
|
184
183
|
.collapser {
|
|
184
|
+
--size: 15px;
|
|
185
|
+
--margin-right: 3px;
|
|
186
|
+
|
|
187
|
+
display: inline-block;
|
|
185
188
|
background-color: transparent;
|
|
186
189
|
border: 0;
|
|
187
|
-
padding:
|
|
190
|
+
padding: 1px;
|
|
188
191
|
color: #fff;
|
|
189
|
-
width:
|
|
190
|
-
height:
|
|
191
|
-
|
|
192
|
+
width: var(--size);
|
|
193
|
+
height: var(--size);
|
|
194
|
+
margin-left: calc((var(--size) + var(--margin-right)) * -1);
|
|
195
|
+
margin-right: var(--margin-right);
|
|
196
|
+
cursor: pointer;
|
|
192
197
|
user-select: none;
|
|
193
198
|
-webkit-user-select: none;
|
|
194
199
|
font-family: var(--code-font-family);
|
|
@@ -196,18 +201,15 @@ export const JsonViewer = styled(Json).attrs(() => ({
|
|
|
196
201
|
|
|
197
202
|
&:after {
|
|
198
203
|
content: '-';
|
|
199
|
-
cursor: pointer;
|
|
200
204
|
display: flex;
|
|
201
205
|
align-items: center;
|
|
202
206
|
justify-content: center;
|
|
203
|
-
width: 15px;
|
|
204
207
|
height: 100%;
|
|
205
|
-
|
|
206
|
-
|
|
208
|
+
width: 100%;
|
|
209
|
+
}
|
|
207
210
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
+
&:focus {
|
|
212
|
+
outline: #fff dotted 1px;
|
|
211
213
|
}
|
|
212
214
|
}
|
|
213
215
|
|
package/src/Navbar/Navbar.tsx
CHANGED
|
@@ -13,9 +13,10 @@ interface NavbarProps {
|
|
|
13
13
|
menu: ResolvedConfigLinks;
|
|
14
14
|
logo: React.ReactNode;
|
|
15
15
|
search: React.ReactNode;
|
|
16
|
+
profile?: React.ReactNode;
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
export function Navbar({ menu, logo, search }: NavbarProps): JSX.Element | null {
|
|
19
|
+
export function Navbar({ menu, logo, search, profile }: NavbarProps): JSX.Element | null {
|
|
19
20
|
const [isOpen, setIsOpen] = useMobileMenu(false);
|
|
20
21
|
const { search: searchSettings, navbar } = useThemeSettings(DEFAULT_THEME_NAME);
|
|
21
22
|
const hideSearch =
|
|
@@ -35,6 +36,7 @@ export function Navbar({ menu, logo, search }: NavbarProps): JSX.Element | null
|
|
|
35
36
|
{logo}
|
|
36
37
|
<NavbarMenu menuItems={menu} />
|
|
37
38
|
{hideSearch ? null : search}
|
|
39
|
+
{profile}
|
|
38
40
|
</NavbarContainer>
|
|
39
41
|
);
|
|
40
42
|
}
|
|
@@ -14,7 +14,7 @@ export function NextPageLink(): JSX.Element {
|
|
|
14
14
|
const { nextPage }: NextPageType = useSidebarSiblingsData() || {};
|
|
15
15
|
const { navigation } = useThemeSettings(DEFAULT_THEME_NAME);
|
|
16
16
|
|
|
17
|
-
if (!nextPage || navigation?.hide) {
|
|
17
|
+
if (!nextPage || navigation?.hide || navigation?.nextPageLink?.hide) {
|
|
18
18
|
return <div> </div>;
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -3,8 +3,16 @@ import styled from 'styled-components';
|
|
|
3
3
|
|
|
4
4
|
import { PreviousPageLink } from '@theme/PageNavigation/PreviousPageLink';
|
|
5
5
|
import { NextPageLink } from '@theme/PageNavigation/NextPageLink';
|
|
6
|
+
import { useThemeSettings } from '@portal/hooks';
|
|
7
|
+
import { DEFAULT_THEME_NAME } from '@portal/constants';
|
|
8
|
+
|
|
9
|
+
export function PageNavigation(): JSX.Element | null {
|
|
10
|
+
const { navigation } = useThemeSettings(DEFAULT_THEME_NAME);
|
|
11
|
+
|
|
12
|
+
if (navigation?.hide) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
6
15
|
|
|
7
|
-
export function PageNavigation(): JSX.Element {
|
|
8
16
|
return (
|
|
9
17
|
<PageNavigationWrapper data-component-name="PageNavigation/PageNavigation">
|
|
10
18
|
<PreviousPageLink />
|
|
@@ -16,5 +24,5 @@ export function PageNavigation(): JSX.Element {
|
|
|
16
24
|
const PageNavigationWrapper = styled.div`
|
|
17
25
|
display: flex;
|
|
18
26
|
justify-content: space-between;
|
|
19
|
-
margin: 25px
|
|
27
|
+
margin: 25px 0;
|
|
20
28
|
`;
|
|
@@ -14,11 +14,11 @@ export function PreviousPageLink(): JSX.Element {
|
|
|
14
14
|
const { prevPage }: PreviousPageType = useSidebarSiblingsData() || {};
|
|
15
15
|
const { navigation } = useThemeSettings(DEFAULT_THEME_NAME);
|
|
16
16
|
|
|
17
|
-
if (!prevPage || navigation?.hide) {
|
|
17
|
+
if (!prevPage || navigation?.hide || navigation?.previousPageLink?.hide) {
|
|
18
18
|
return <div> </div>;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const label = navigation?.
|
|
21
|
+
const label = navigation?.previousPageLink?.label || `Back to ${prevPage.label}`;
|
|
22
22
|
|
|
23
23
|
return (
|
|
24
24
|
<StyledButton
|
package/src/Profile/Profile.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { memo } from 'react';
|
|
2
2
|
import styled, { css } from 'styled-components';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { stringToHslColor } from '@theme/utils';
|
|
5
5
|
|
|
6
6
|
export interface ProfileProps {
|
|
7
7
|
name: string;
|
|
@@ -10,8 +10,6 @@ export interface ProfileProps {
|
|
|
10
10
|
onClick?: () => void;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
const RANDOM_BG_COLOR: string = getRandomColor();
|
|
14
|
-
|
|
15
13
|
function ProfileComponent({ name, imageUrl, onClick, color }: ProfileProps): JSX.Element {
|
|
16
14
|
if (imageUrl) {
|
|
17
15
|
return (
|
|
@@ -37,7 +35,7 @@ function ProfileComponent({ name, imageUrl, onClick, color }: ProfileProps): JSX
|
|
|
37
35
|
<StyledUserName data-cy="user-name" color={color}>
|
|
38
36
|
{name}
|
|
39
37
|
</StyledUserName>
|
|
40
|
-
<AvatarWrapper background={
|
|
38
|
+
<AvatarWrapper background={stringToHslColor(name)}>
|
|
41
39
|
<span>{avatarLetters}</span>
|
|
42
40
|
</AvatarWrapper>
|
|
43
41
|
</ProfileWrapper>
|
|
@@ -51,10 +49,11 @@ const ProfileWrapper = styled.div`
|
|
|
51
49
|
align-items: center;
|
|
52
50
|
cursor: pointer;
|
|
53
51
|
width: auto;
|
|
52
|
+
padding-left: calc(var(--sidebar-spacing-horizontal) * 2);
|
|
54
53
|
`;
|
|
55
54
|
|
|
56
55
|
const StyledUserName = styled.span`
|
|
57
|
-
color: ${({ color }) => color || 'var(--color
|
|
56
|
+
color: ${({ color }) => color || 'var(--navbar-text-color)'};
|
|
58
57
|
`;
|
|
59
58
|
|
|
60
59
|
const AvatarWrapper = styled.div<{ background?: string }>`
|
|
@@ -61,7 +61,7 @@ export function TableOfContent(props: TableOfContentProps): JSX.Element | null {
|
|
|
61
61
|
const href = '#' + heading.id;
|
|
62
62
|
return (
|
|
63
63
|
<MenuItem
|
|
64
|
-
key={href}
|
|
64
|
+
key={href + idx}
|
|
65
65
|
href={href}
|
|
66
66
|
depth={heading.depth || 0}
|
|
67
67
|
className={activeHeadingId === heading.id ? 'active' : ''}
|
package/src/Tooltip/Tooltip.tsx
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { PropsWithChildren, ReactNode } from 'react';
|
|
2
|
-
import React, { useEffect, memo } from 'react';
|
|
2
|
+
import React, { useEffect, memo, useRef } from 'react';
|
|
3
3
|
import styled, { css } from 'styled-components';
|
|
4
4
|
|
|
5
|
-
import { useControl } from '@theme/hooks';
|
|
5
|
+
import { useControl, useOutsideClick } from '@theme/hooks';
|
|
6
6
|
|
|
7
7
|
export interface TooltipProps {
|
|
8
8
|
tip: string | ReactNode;
|
|
@@ -24,8 +24,11 @@ export function TooltipComponent({
|
|
|
24
24
|
width,
|
|
25
25
|
dataTestId,
|
|
26
26
|
}: PropsWithChildren<TooltipProps>): JSX.Element {
|
|
27
|
+
const ref = useRef<HTMLDivElement | null>(null);
|
|
27
28
|
const { isOpened, handleOpen, handleClose } = useControl(isOpen);
|
|
28
29
|
|
|
30
|
+
useOutsideClick(ref, handleClose);
|
|
31
|
+
|
|
29
32
|
const isControlled = isOpen !== undefined;
|
|
30
33
|
|
|
31
34
|
useEffect(() => {
|
|
@@ -46,6 +49,7 @@ export function TooltipComponent({
|
|
|
46
49
|
|
|
47
50
|
return (
|
|
48
51
|
<TooltipWrapper
|
|
52
|
+
ref={ref}
|
|
49
53
|
{...controllers}
|
|
50
54
|
className={`tooltip-${className}`}
|
|
51
55
|
data-component-name="Tooltip/Tooltip"
|
|
@@ -169,7 +173,6 @@ const TooltipBody = styled.span<
|
|
|
169
173
|
overflow-wrap: break-word;
|
|
170
174
|
|
|
171
175
|
border-radius: var(--global-border-radius);
|
|
172
|
-
pointer-events: none;
|
|
173
176
|
transition: opacity 0.3s ease-out;
|
|
174
177
|
|
|
175
178
|
font-size: 13px;
|
package/src/hooks/index.ts
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { MutableRefObject, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
export function useOutsideClick(
|
|
4
|
+
ref: MutableRefObject<HTMLElement | null>,
|
|
5
|
+
handler: (event: MouseEvent | TouchEvent) => void,
|
|
6
|
+
): void {
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const listener = (event: MouseEvent | TouchEvent) => {
|
|
9
|
+
if (!ref.current || ref.current.contains(event.target as Node)) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
handler(event);
|
|
13
|
+
};
|
|
14
|
+
document.addEventListener('mousedown', listener);
|
|
15
|
+
document.addEventListener('touchstart', listener);
|
|
16
|
+
return () => {
|
|
17
|
+
document.removeEventListener('mousedown', listener);
|
|
18
|
+
document.removeEventListener('touchstart', listener);
|
|
19
|
+
};
|
|
20
|
+
}, [ref, handler]);
|
|
21
|
+
}
|
package/src/mocks/hooks/index.ts
CHANGED
|
@@ -9,20 +9,17 @@ interface PageLink {
|
|
|
9
9
|
type: 'link';
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export function useThemeSettings(
|
|
12
|
+
export function useThemeSettings(_: string): RawTheme['settings'] {
|
|
13
13
|
return {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
nextPageLink: { label: 'next page' },
|
|
19
|
-
previousPageLink: { label: 'prev page' },
|
|
20
|
-
},
|
|
14
|
+
toc: { header: 'header', hide: false },
|
|
15
|
+
navigation: {
|
|
16
|
+
nextPageLink: { label: 'next page theme settings label' },
|
|
17
|
+
previousPageLink: { label: 'prev page theme settings label' },
|
|
21
18
|
},
|
|
22
19
|
};
|
|
23
20
|
}
|
|
24
21
|
|
|
25
|
-
export function useSidebarSiblingsData(): { nextPage: PageLink; prevPage: PageLink } {
|
|
22
|
+
export function useSidebarSiblingsData(): { nextPage: PageLink | null; prevPage: PageLink | null } {
|
|
26
23
|
return {
|
|
27
24
|
nextPage: {
|
|
28
25
|
type: 'link',
|
package/src/utils/color.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
export
|
|
1
|
+
export function stringToHslColor(value: string): string {
|
|
2
|
+
const s = 30;
|
|
3
|
+
const l = 80;
|
|
4
|
+
let hash = 0;
|
|
2
5
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const l = getRandomNumber(100);
|
|
6
|
+
for (let i = 0; i < value.length; i++) {
|
|
7
|
+
hash = value.charCodeAt(i) + ((hash << 5) - hash);
|
|
8
|
+
}
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
const h = hash % 360;
|
|
11
|
+
return `hsl(${h}, ${s}%, ${l}%)`;
|
|
9
12
|
}
|
package/utils/color.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export declare
|
|
2
|
-
export declare function getRandomColor(): string;
|
|
1
|
+
export declare function stringToHslColor(value: string): string;
|
package/utils/color.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
exports.stringToHslColor = void 0;
|
|
4
|
+
function stringToHslColor(value) {
|
|
5
|
+
var s = 30;
|
|
6
|
+
var l = 80;
|
|
7
|
+
var hash = 0;
|
|
8
|
+
for (var i = 0; i < value.length; i++) {
|
|
9
|
+
hash = value.charCodeAt(i) + ((hash << 5) - hash);
|
|
10
|
+
}
|
|
11
|
+
var h = hash % 360;
|
|
12
|
+
return "hsl(".concat(h, ", ").concat(s, "%, ").concat(l, "%)");
|
|
11
13
|
}
|
|
12
|
-
exports.
|
|
14
|
+
exports.stringToHslColor = stringToHslColor;
|