@redocly/theme 0.25.1-beta.4 → 0.25.2
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/Catalog/Catalog.js +1 -4
- package/lib/components/Catalog/useCatalog.js +3 -4
- package/lib/components/CodeBlock/CodeBlockControls.js +1 -1
- package/lib/components/CopyButton/CopyButton.js +2 -7
- package/lib/components/EditPageButton/EditPageButton.js +1 -4
- package/lib/components/Feedback/Comment.js +4 -10
- package/lib/components/Feedback/Feedback.js +1 -1
- package/lib/components/Feedback/Mood.js +15 -18
- package/lib/components/Feedback/Rating.js +12 -12
- package/lib/components/Feedback/Reasons.js +4 -9
- package/lib/components/Feedback/ReportDialog.js +16 -3
- package/lib/components/Feedback/Sentiment.js +13 -15
- package/lib/components/Feedback/Thumbs.js +2 -8
- package/lib/components/Feedback/types.d.ts +1 -1
- package/lib/components/Feedback/useReportDialog.js +6 -8
- package/lib/components/Filter/Filter.js +6 -6
- package/lib/components/Filter/FilterContent.js +2 -6
- package/lib/components/Filter/FilterPopover.js +2 -6
- package/lib/components/Footer/FooterCopyright.js +2 -5
- package/lib/components/LastUpdated/LastUpdated.js +1 -1
- package/lib/components/Menu/hooks/use-mobile-menu-items.js +1 -4
- package/lib/components/Menu/hooks/use-mobile-menu-levels.js +2 -6
- package/lib/components/Menu/utils.d.ts +2 -1
- package/lib/components/Profile/LoginLink.js +2 -5
- package/lib/components/Profile/MobileUserProfile.js +1 -4
- package/lib/components/Profile/UserProfile.js +3 -7
- package/lib/components/Scorecard/Card.d.ts +1 -3
- package/lib/components/Scorecard/Card.js +2 -4
- package/lib/components/Scorecard/Gauge.d.ts +2 -5
- package/lib/components/Scorecard/Gauge.js +2 -6
- package/lib/components/Scorecard/StatusByLevelWidget.d.ts +0 -1
- package/lib/components/Scorecard/StatusByLevelWidget.js +2 -5
- package/lib/components/Search/CancelSearch.js +1 -4
- package/lib/components/Search/RecentSearches.js +1 -4
- package/lib/components/Search/SearchDialog.js +4 -10
- package/lib/components/Search/SearchTrigger.js +1 -4
- package/lib/components/Search/SuggestedPages.js +1 -4
- package/lib/components/Sidebar/DrilldownMenu.js +2 -5
- package/lib/components/Sidebar/VersionPicker.js +2 -6
- package/lib/components/TableOfContent/TableOfContent.js +1 -4
- package/lib/config.d.ts +0 -6
- package/lib/config.js +0 -1
- package/lib/layouts/Forbidden.js +2 -6
- package/lib/layouts/NotFound.js +2 -6
- package/lib/layouts/OIDCForbidden.js +1 -4
- package/lib/mocks/hooks/index.d.ts +3 -2
- package/lib/mocks/hooks/index.js +3 -4
- package/lib/types/portal/src/shared/types/feedback.d.ts +1 -0
- package/package.json +2 -2
- package/src/components/Catalog/Catalog.tsx +1 -4
- package/src/components/Catalog/useCatalog.ts +3 -6
- package/src/components/CodeBlock/CodeBlockControls.tsx +0 -1
- package/src/components/CopyButton/CopyButton.tsx +3 -8
- package/src/components/EditPageButton/EditPageButton.tsx +2 -5
- package/src/components/Feedback/Comment.tsx +14 -14
- package/src/components/Feedback/Feedback.tsx +2 -2
- package/src/components/Feedback/Mood.tsx +25 -20
- package/src/components/Feedback/Rating.tsx +15 -14
- package/src/components/Feedback/Reasons.tsx +6 -11
- package/src/components/Feedback/ReportDialog.tsx +6 -2
- package/src/components/Feedback/Sentiment.tsx +15 -17
- package/src/components/Feedback/Thumbs.tsx +2 -9
- package/src/components/Feedback/types.ts +1 -1
- package/src/components/Feedback/useReportDialog.ts +6 -8
- package/src/components/Filter/Filter.tsx +9 -6
- package/src/components/Filter/FilterContent.tsx +2 -6
- package/src/components/Filter/FilterPopover.tsx +2 -6
- package/src/components/Footer/FooterCopyright.tsx +2 -5
- package/src/components/LastUpdated/LastUpdated.tsx +1 -1
- package/src/components/Menu/hooks/use-mobile-menu-items.ts +1 -5
- package/src/components/Menu/hooks/use-mobile-menu-levels.ts +2 -7
- package/src/components/Menu/utils.ts +2 -1
- package/src/components/Profile/LoginLink.tsx +2 -5
- package/src/components/Profile/MobileUserProfile.tsx +1 -4
- package/src/components/Profile/UserProfile.tsx +5 -8
- package/src/components/Scorecard/Card.tsx +2 -4
- package/src/components/Scorecard/Gauge.tsx +7 -16
- package/src/components/Scorecard/StatusByLevelWidget.tsx +2 -6
- package/src/components/Search/CancelSearch.tsx +2 -5
- package/src/components/Search/RecentSearches.tsx +2 -5
- package/src/components/Search/SearchDialog.tsx +8 -15
- package/src/components/Search/SearchTrigger.tsx +3 -5
- package/src/components/Search/SuggestedPages.tsx +2 -6
- package/src/components/Sidebar/DrilldownMenu.tsx +2 -5
- package/src/components/Sidebar/VersionPicker.tsx +3 -7
- package/src/components/TableOfContent/TableOfContent.tsx +2 -5
- package/src/config.ts +0 -1
- package/src/layouts/Forbidden.tsx +4 -13
- package/src/layouts/NotFound.tsx +4 -13
- package/src/layouts/OIDCForbidden.tsx +2 -6
- package/src/mocks/hooks/index.ts +7 -6
- package/src/types/portal/src/shared/types/feedback.ts +1 -0
|
@@ -7,10 +7,6 @@ const hooks_1 = require("../../../mocks/hooks");
|
|
|
7
7
|
const useSidebarItems_1 = require("../../../mocks/Sidebar/useSidebarItems");
|
|
8
8
|
const constants_1 = require("../../../components/Menu/constants");
|
|
9
9
|
const hooks_2 = require("../../../hooks");
|
|
10
|
-
const TRANSLATION_KEYS = {
|
|
11
|
-
mainMenu: 'theme.mobileMenu.mainMenu',
|
|
12
|
-
previous: 'theme.mobileMenu.previous',
|
|
13
|
-
};
|
|
14
10
|
const useMobileMenuLevels = () => {
|
|
15
11
|
var _a, _b;
|
|
16
12
|
const { versions = [] } = (0, hooks_1.usePageVersions)() || {};
|
|
@@ -25,7 +21,7 @@ const useMobileMenuLevels = () => {
|
|
|
25
21
|
const menuLevels = (0, react_1.useMemo)(() => {
|
|
26
22
|
const menuLevels = [
|
|
27
23
|
{
|
|
28
|
-
label: translate(
|
|
24
|
+
label: translate('theme.mobileMenu.mainMenu', 'Main Menu'),
|
|
29
25
|
type: constants_1.MenuType.MAIN_MENU,
|
|
30
26
|
},
|
|
31
27
|
];
|
|
@@ -37,7 +33,7 @@ const useMobileMenuLevels = () => {
|
|
|
37
33
|
}
|
|
38
34
|
if (sidebarItems.length || activeVersion) {
|
|
39
35
|
menuLevels.push({
|
|
40
|
-
label: translate(
|
|
36
|
+
label: translate('theme.mobileMenu.previous', 'Previous'),
|
|
41
37
|
type: constants_1.MenuType.PAGE,
|
|
42
38
|
});
|
|
43
39
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Location } from 'react-router-dom';
|
|
2
|
+
import type { TFunction } from '@redocly/portal-types';
|
|
2
3
|
import type { ItemState } from '../../components/Sidebar/types';
|
|
3
|
-
import type { Locale, ResolvedNavItem,
|
|
4
|
+
import type { Locale, ResolvedNavItem, Version } from '../../types/portal';
|
|
4
5
|
export declare const mapNavbarItems: (items: ResolvedNavItem[], defaultLocale: string, currentLocale: string, locales: Locale[], location: Location) => ItemState[];
|
|
5
6
|
export declare const isItemActive: (item: ResolvedNavItem, defaultLocale: string, currentLocale: string, locales: Locale[], location: Location) => boolean;
|
|
6
7
|
export declare const buildLanguagesGroup: (locales: Locale[], currentLocale: string, defaultLocale: string) => ResolvedNavItem | undefined;
|
|
@@ -12,12 +12,9 @@ const telemetry_1 = require("../../mocks/telemetry");
|
|
|
12
12
|
function LoginLink({ href }) {
|
|
13
13
|
const { userProfile } = (0, useThemeConfig_1.useThemeConfig)();
|
|
14
14
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
15
|
-
|
|
16
|
-
login: 'theme.profile.login',
|
|
17
|
-
};
|
|
18
|
-
return (react_1.default.createElement(StyledLink, { href: href, "data-translation-key": translationKeys.login, onClick: () => {
|
|
15
|
+
return (react_1.default.createElement(StyledLink, { href: href, "data-translation-key": "theme.profile.login", onClick: () => {
|
|
19
16
|
telemetry_1.telemetry.send('login_button_clicked', {});
|
|
20
|
-
} }, translate(
|
|
17
|
+
} }, translate('theme.profile.login', (userProfile === null || userProfile === void 0 ? void 0 : userProfile.loginLabel) || 'Login')));
|
|
21
18
|
}
|
|
22
19
|
exports.LoginLink = LoginLink;
|
|
23
20
|
const StyledLink = styled_components_1.default.a.attrs(() => ({
|
|
@@ -16,12 +16,9 @@ function MobileUserProfile() {
|
|
|
16
16
|
const { userProfile } = (0, useThemeConfig_1.useThemeConfig)();
|
|
17
17
|
const { userData, handleLogout, loginUrl } = (0, useProfileProps_1.useProfileProps)();
|
|
18
18
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
19
|
-
const translationKeys = {
|
|
20
|
-
login: 'theme.profile.login',
|
|
21
|
-
};
|
|
22
19
|
if (!(userData === null || userData === void 0 ? void 0 : userData.isAuthenticated) && !loginUrl)
|
|
23
20
|
return null;
|
|
24
|
-
return (react_1.default.createElement(MobileProfileWrapper, { "data-component-name": "Navbar/MobileUserProfile" }, !(userData === null || userData === void 0 ? void 0 : userData.isAuthenticated) ? (react_1.default.createElement(LoginButton, { href: loginUrl, "data-cy": "login-btn", onClick: () => telemetry_1.telemetry.send('login_button_clicked', {}) }, translate(
|
|
21
|
+
return (react_1.default.createElement(MobileProfileWrapper, { "data-component-name": "Navbar/MobileUserProfile" }, !(userData === null || userData === void 0 ? void 0 : userData.isAuthenticated) ? (react_1.default.createElement(LoginButton, { href: loginUrl, "data-cy": "login-btn", onClick: () => telemetry_1.telemetry.send('login_button_clicked', {}) }, translate('theme.profile.login', (userProfile === null || userProfile === void 0 ? void 0 : userProfile.loginLabel) || 'Login'))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
25
22
|
react_1.default.createElement(UserProfileData_1.UserProfileData, { userData: userData }),
|
|
26
23
|
react_1.default.createElement(LogoutButton, { onClick: () => {
|
|
27
24
|
handleLogout();
|
|
@@ -40,14 +40,10 @@ const icons_1 = require("../../icons");
|
|
|
40
40
|
function UserProfile({ userData, handleLogout, hasDeveloperOnboarding = false, }) {
|
|
41
41
|
const { userProfile } = (0, useThemeConfig_1.useThemeConfig)();
|
|
42
42
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
43
|
-
const translationKeys = {
|
|
44
|
-
myApps: 'theme.profile.myApps',
|
|
45
|
-
logout: 'theme.profile.logout',
|
|
46
|
-
};
|
|
47
43
|
const [isOpened, setIsOpened] = (0, react_1.useState)(false);
|
|
48
44
|
const menuItems = [react_1.default.createElement(UserProfileData_1.UserProfileData, { key: userData.name, userData: userData })];
|
|
49
45
|
if (hasDeveloperOnboarding) {
|
|
50
|
-
menuItems.push(react_1.default.createElement(Link_1.Link, { to: "/apps", "data-translation-key":
|
|
46
|
+
menuItems.push(react_1.default.createElement(Link_1.Link, { to: "/apps", "data-translation-key": "theme.profile.myApps" }, translate('theme.profile.myApps', 'My Apps')));
|
|
51
47
|
}
|
|
52
48
|
if (userProfile && userProfile.menu) {
|
|
53
49
|
for (const item of userProfile.menu) {
|
|
@@ -57,9 +53,9 @@ function UserProfile({ userData, handleLogout, hasDeveloperOnboarding = false, }
|
|
|
57
53
|
menuItems.push(react_1.default.createElement(Logout, { onClick: () => {
|
|
58
54
|
handleLogout();
|
|
59
55
|
telemetry_1.telemetry.send('logout_menu_item_clicked', {});
|
|
60
|
-
}, "data-translation-key":
|
|
56
|
+
}, "data-translation-key": "theme.profile.logout", role: "link" },
|
|
61
57
|
react_1.default.createElement(icons_1.LogoutIcon, null),
|
|
62
|
-
translate(
|
|
58
|
+
translate('theme.profile.logout', (userProfile === null || userProfile === void 0 ? void 0 : userProfile.logoutLabel) || 'Log out')));
|
|
63
59
|
return (react_1.default.createElement(ProfileDropdown, { items: menuItems, alignment: "end" },
|
|
64
60
|
react_1.default.createElement(Profile_1.Profile, { name: userData.name, imageUrl: userData.picture, onClick: userData.logoutDisabled ? undefined : () => setIsOpened(!isOpened) })));
|
|
65
61
|
}
|
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
export declare const ScorecardCard: import("styled-components").StyledComponent<"div", any, {
|
|
2
|
-
'data-component-name': string;
|
|
3
|
-
}, "data-component-name">;
|
|
1
|
+
export declare const ScorecardCard: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
4
2
|
export declare const ScorecardCardTitle: import("styled-components").StyledComponent<"h3", any, {}, never>;
|
|
@@ -5,11 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ScorecardCardTitle = exports.ScorecardCard = void 0;
|
|
7
7
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
8
|
-
exports.ScorecardCard = styled_components_1.default.div
|
|
9
|
-
'data-component-name': 'Scorecard/ScorecardCard',
|
|
10
|
-
}) `
|
|
8
|
+
exports.ScorecardCard = styled_components_1.default.div `
|
|
11
9
|
color: var(--text-primary);
|
|
12
|
-
background-color: var(--
|
|
10
|
+
background-color: var(--thin-tile-background-color);
|
|
13
11
|
border-radius: 4px;
|
|
14
12
|
|
|
15
13
|
border: 1px solid var(--border-primary);
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
export
|
|
2
|
+
export declare function Gauge({ chunks, }: {
|
|
3
3
|
chunks: {
|
|
4
4
|
share: number;
|
|
5
5
|
color: string;
|
|
6
|
-
title?: string;
|
|
7
6
|
}[];
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
export declare function Gauge({ chunks, className }: GaugeProps): JSX.Element;
|
|
7
|
+
}): JSX.Element;
|
|
11
8
|
export declare const GaugeValue: import("styled-components").StyledComponent<"span", any, {}, never>;
|
|
@@ -29,12 +29,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.GaugeValue = exports.Gauge = void 0;
|
|
30
30
|
const React = __importStar(require("react"));
|
|
31
31
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
32
|
-
function Gauge({ chunks,
|
|
33
|
-
|
|
34
|
-
.map((chunk) => chunk.title)
|
|
35
|
-
.filter(Boolean)
|
|
36
|
-
.join(', ');
|
|
37
|
-
return (React.createElement(GaugeWrapper, { "data-component-name": "Scorecard/StatusByLevelWidget", className: className, title: title }, chunks.map((chunk, i) => (React.createElement(GaugeChunk, { key: i, share: chunk.share, color: chunk.color })))));
|
|
32
|
+
function Gauge({ chunks, }) {
|
|
33
|
+
return (React.createElement(GaugeWrapper, null, chunks.map((chunk, i) => (React.createElement(GaugeChunk, Object.assign({ key: i }, chunk))))));
|
|
38
34
|
}
|
|
39
35
|
exports.Gauge = Gauge;
|
|
40
36
|
exports.GaugeValue = styled_components_1.default.span `
|
|
@@ -32,8 +32,8 @@ const styled_components_1 = __importDefault(require("styled-components"));
|
|
|
32
32
|
const Gauge_1 = require("../../components/Scorecard/Gauge");
|
|
33
33
|
const Card_1 = require("../../components/Scorecard/Card");
|
|
34
34
|
function StatusByLevelWidget(props) {
|
|
35
|
-
const { levels, title
|
|
36
|
-
return (React.createElement(Card_1.ScorecardCard,
|
|
35
|
+
const { levels, title } = props;
|
|
36
|
+
return (React.createElement(Card_1.ScorecardCard, null,
|
|
37
37
|
React.createElement(Card_1.ScorecardCardTitle, null, title),
|
|
38
38
|
React.createElement(CardBody, null, levels.map((level) => {
|
|
39
39
|
const success = level.total - level.errors - level.warnings;
|
|
@@ -43,17 +43,14 @@ function StatusByLevelWidget(props) {
|
|
|
43
43
|
{
|
|
44
44
|
share: (success / level.total) * 100,
|
|
45
45
|
color: 'var(--scorecard-color-success)',
|
|
46
|
-
title: `${success} passed`,
|
|
47
46
|
},
|
|
48
47
|
{
|
|
49
48
|
share: (level.warnings / level.total) * 100,
|
|
50
49
|
color: 'var(--scorecard-color-warning)',
|
|
51
|
-
title: `${level.warnings} ${level.warnings === 1 ? 'warning' : 'warnings'}`,
|
|
52
50
|
},
|
|
53
51
|
{
|
|
54
52
|
share: (level.errors / level.total) * 100,
|
|
55
53
|
color: 'var(--scorecard-color-error)',
|
|
56
|
-
title: `${level.errors} ${level.errors === 1 ? 'error' : 'errors'}`,
|
|
57
54
|
},
|
|
58
55
|
] }),
|
|
59
56
|
React.createElement(Gauge_1.GaugeValue, null,
|
|
@@ -33,11 +33,8 @@ const hooks_1 = require("../../mocks/hooks");
|
|
|
33
33
|
const Button_1 = require("../../components/Button");
|
|
34
34
|
function CancelSearch({ onClick, className, }) {
|
|
35
35
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
36
|
-
const translationKeys = {
|
|
37
|
-
cancel: 'theme.search.cancel',
|
|
38
|
-
};
|
|
39
36
|
return (React.createElement(Wrapper, { "data-component-name": "Search/CancelSearch", onClick: onClick, className: className },
|
|
40
|
-
React.createElement(Button_1.Button, { "data-translation-keys":
|
|
37
|
+
React.createElement(Button_1.Button, { "data-translation-keys": "theme.search.cancel", fullWidth: true, variant: "outlined" }, translate('theme.search.cancel', 'Cancel'))));
|
|
41
38
|
}
|
|
42
39
|
exports.CancelSearch = CancelSearch;
|
|
43
40
|
const Wrapper = styled_components_1.default.div `
|
|
@@ -36,9 +36,6 @@ const hooks_1 = require("../../mocks/hooks");
|
|
|
36
36
|
function RecentSearches({ onSelect, className, }) {
|
|
37
37
|
const { items, removeSearchHistoryItem } = (0, search_1.useRecentSearches)();
|
|
38
38
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
39
|
-
const translationKeys = {
|
|
40
|
-
title: 'theme.search.recent',
|
|
41
|
-
};
|
|
42
39
|
if (!items || !items.length)
|
|
43
40
|
return null;
|
|
44
41
|
const removeItem = (e, item) => {
|
|
@@ -51,7 +48,7 @@ function RecentSearches({ onSelect, className, }) {
|
|
|
51
48
|
}
|
|
52
49
|
};
|
|
53
50
|
return (React.createElement(Wrapper, { "data-component-name": "Search/RecentSearches", className: className },
|
|
54
|
-
React.createElement(Title, { "data-translation-key":
|
|
51
|
+
React.createElement(Title, { "data-translation-key": "theme.search.recent" }, translate('theme.search.recent', 'Recent searches')),
|
|
55
52
|
React.createElement(RecentItems, null, items.map((item) => (React.createElement(Item, { key: item, onClick: () => onSelect(item), onKeyDown: (e) => handleKeyDown(e, item), tabIndex: 0, role: "link" },
|
|
56
53
|
React.createElement(Group, null,
|
|
57
54
|
React.createElement(ClockBackwardsIcon, null),
|
|
@@ -56,12 +56,6 @@ const SearchDialog = ({ onClose, className, }) => {
|
|
|
56
56
|
onClose();
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
|
-
const translationKeys = {
|
|
60
|
-
noResults: 'theme.search.noResults',
|
|
61
|
-
navigate: 'theme.search.keys.navigate',
|
|
62
|
-
select: 'theme.search.keys.select',
|
|
63
|
-
exit: 'theme.search.keys.exit',
|
|
64
|
-
};
|
|
65
59
|
const mapItem = (item) => {
|
|
66
60
|
var _a;
|
|
67
61
|
return (react_1.default.createElement(SearchItem_1.SearchItem, { key: item.id, item: item, product: !product ? (_a = item.product) === null || _a === void 0 ? void 0 : _a.name : undefined }));
|
|
@@ -71,14 +65,14 @@ const SearchDialog = ({ onClose, className, }) => {
|
|
|
71
65
|
react_1.default.createElement(TopContainer, null,
|
|
72
66
|
react_1.default.createElement(InputWrapper_1.InputWrapper, { value: query, change: setQuery, placeholder: translate('theme.search.label', 'Search docs...'), isLoading: isLoading }),
|
|
73
67
|
product && react_1.default.createElement(ProductTag_1.ProductTag, { label: product.name, onRemove: () => setProduct(undefined) })),
|
|
74
|
-
react_1.default.createElement(Results, null, items !== null ? (items.length ? (items.map(mapItem)) : (react_1.default.createElement(Message, { "data-translation-key":
|
|
68
|
+
react_1.default.createElement(Results, null, items !== null ? (items.length ? (items.map(mapItem)) : (react_1.default.createElement(Message, { "data-translation-key": "theme.search.noResults" }, translate('theme.search.noResults', 'No results')))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
75
69
|
react_1.default.createElement(RecentSearches_1.RecentSearches, { onSelect: setQuery }),
|
|
76
70
|
react_1.default.createElement(SuggestedPages_1.SuggestedPages, null)))),
|
|
77
71
|
react_1.default.createElement(BottomContainer, null,
|
|
78
72
|
react_1.default.createElement(Shortcuts, null,
|
|
79
|
-
react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key":
|
|
80
|
-
react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key":
|
|
81
|
-
react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key":
|
|
73
|
+
react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key": "theme.search.keys.navigate", combination: "Tab", text: translate('theme.search.keys.navigate', 'to navigate') }),
|
|
74
|
+
react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key": "theme.search.keys.select", combination: "\u21B5", text: translate('theme.search.keys.select', 'to select') }),
|
|
75
|
+
react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key": "theme.search.keys.exit", combination: "Esc", text: translate('theme.search.keys.exit', 'to exit') })),
|
|
82
76
|
react_1.default.createElement(CancelSearch_1.CancelSearch, { onClick: onClose })))));
|
|
83
77
|
};
|
|
84
78
|
exports.SearchDialog = SearchDialog;
|
|
@@ -34,13 +34,10 @@ function SearchTrigger({ onClick, className, }) {
|
|
|
34
34
|
var _a, _b;
|
|
35
35
|
const themeSettings = (0, hooks_1.useThemeConfig)();
|
|
36
36
|
const { translate } = (0, hooks_2.useTranslate)();
|
|
37
|
-
const translationKeys = {
|
|
38
|
-
label: 'theme.search.navbar.label',
|
|
39
|
-
};
|
|
40
37
|
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 : ['/'];
|
|
41
38
|
return (React.createElement(Wrapper, { "data-component-name": "Search/SearchTrigger", onClick: onClick, className: className },
|
|
42
39
|
React.createElement(SearchIconSmall, null),
|
|
43
|
-
React.createElement(Label, { "data-translation-key":
|
|
40
|
+
React.createElement(Label, { "data-translation-key": "theme.search.navbar.label" }, translate('theme.search.navbar.label', 'Search')),
|
|
44
41
|
React.createElement(ShortcutKey_1.ShortcutKey, { keyShortcuts: keyShortcuts })));
|
|
45
42
|
}
|
|
46
43
|
exports.SearchTrigger = SearchTrigger;
|
|
@@ -36,13 +36,10 @@ const hooks_1 = require("../../mocks/hooks");
|
|
|
36
36
|
function SuggestedPages({ className }) {
|
|
37
37
|
const pages = (0, search_1.useSuggestedPages)();
|
|
38
38
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
39
|
-
const translationKeys = {
|
|
40
|
-
title: 'theme.search.suggested',
|
|
41
|
-
};
|
|
42
39
|
if (!pages.length)
|
|
43
40
|
return null;
|
|
44
41
|
return (React.createElement(Wrapper, { "data-component-name": "Search/SuggestedPages", className: className },
|
|
45
|
-
React.createElement(Title, { "data-translation-key":
|
|
42
|
+
React.createElement(Title, { "data-translation-key": "theme.search.suggested" }, translate('theme.search.suggested', 'Suggested pages')),
|
|
46
43
|
React.createElement(SuggestedItems, null, pages.map((page) => page.link && (React.createElement(Item, { key: page.label },
|
|
47
44
|
React.createElement(PageLink, Object.assign({ to: page.link }, page),
|
|
48
45
|
React.createElement(Group, null,
|
|
@@ -35,16 +35,13 @@ const hooks_1 = require("../../mocks/hooks");
|
|
|
35
35
|
const Menu_1 = require("../../components/Menu");
|
|
36
36
|
function DrilldownMenu({ item, back, prevActiveItem, children, className, }) {
|
|
37
37
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
38
|
-
const translationKeys = {
|
|
39
|
-
backLabel: 'theme.sidebar.menu.backLabel',
|
|
40
|
-
};
|
|
41
38
|
const label = item.label === (prevActiveItem === null || prevActiveItem === void 0 ? void 0 : prevActiveItem.label) || !(prevActiveItem === null || prevActiveItem === void 0 ? void 0 : prevActiveItem.label)
|
|
42
|
-
? translate(
|
|
39
|
+
? translate('theme.sidebar.menu.backLabel', 'Back')
|
|
43
40
|
: prevActiveItem === null || prevActiveItem === void 0 ? void 0 : prevActiveItem.label;
|
|
44
41
|
return (react_1.default.createElement(MenuContainer, { "data-component-name": "Sidebar/DrilldownMenu", className: className },
|
|
45
42
|
react_1.default.createElement(MenuContent, null,
|
|
46
43
|
react_1.default.createElement(MenuWrapper, null,
|
|
47
|
-
react_1.default.createElement(BackButton_1.BackButton, { back: back, "data-translation-key":
|
|
44
|
+
react_1.default.createElement(BackButton_1.BackButton, { back: back, "data-translation-key": "theme.sidebar.menu.backLabel" }, label),
|
|
48
45
|
react_1.default.createElement(Menu_1.MenuLinkItem, { item: item },
|
|
49
46
|
react_1.default.createElement(DrilldownMenuItem_1.DrilldownMenuItem, { item: item }))),
|
|
50
47
|
children)));
|
|
@@ -37,10 +37,6 @@ function VersionPicker(props) {
|
|
|
37
37
|
const themeConfig = (0, hooks_1.useThemeConfig)();
|
|
38
38
|
const { versionPicker } = themeConfig;
|
|
39
39
|
const { translate } = (0, hooks_2.useTranslate)();
|
|
40
|
-
const translationKeys = {
|
|
41
|
-
label: 'theme.versionPicker.label',
|
|
42
|
-
unversioned: 'theme.versionPicker.unversioned',
|
|
43
|
-
};
|
|
44
40
|
const { versions = [], onChange } = props;
|
|
45
41
|
const options = versions.map((version) => {
|
|
46
42
|
return {
|
|
@@ -56,8 +52,8 @@ function VersionPicker(props) {
|
|
|
56
52
|
if (!options.length && !(versionPicker === null || versionPicker === void 0 ? void 0 : versionPicker.showForUnversioned))
|
|
57
53
|
return null;
|
|
58
54
|
return (React.createElement(VersionsPickerWrapper, null,
|
|
59
|
-
React.createElement(VersionPickerLabel, { "data-translation-key":
|
|
60
|
-
React.createElement(exports.VersionPickerSelect, { placeholder: translate(
|
|
55
|
+
React.createElement(VersionPickerLabel, { "data-translation-key": "theme.versionPicker.label" }, translate('theme.versionPicker.label', 'Version:')),
|
|
56
|
+
React.createElement(exports.VersionPickerSelect, { placeholder: translate('theme.versionPicker.unversioned', 'All versions'), disabled: !options.length, options: options, value: value, onChange: onChange })));
|
|
61
57
|
}
|
|
62
58
|
exports.VersionPicker = VersionPicker;
|
|
63
59
|
const VersionPickerLabel = styled_components_1.default.label `
|
|
@@ -44,16 +44,13 @@ function TableOfContent(props) {
|
|
|
44
44
|
const leastDepth = (0, utils_1.getLeastDepth)(displayedHeadings);
|
|
45
45
|
const activeHeadingId = (0, useActiveHeading_1.useActiveHeading)(contentWrapper, (0, utils_1.getDisplayedHeadingsIds)(displayedHeadings));
|
|
46
46
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
47
|
-
const translationKeys = {
|
|
48
|
-
header: 'theme.toc.header',
|
|
49
|
-
};
|
|
50
47
|
if (toc === null || toc === void 0 ? void 0 : toc.hide) {
|
|
51
48
|
return null;
|
|
52
49
|
}
|
|
53
50
|
return (React.createElement(React.Fragment, null,
|
|
54
51
|
React.createElement(TableOfContentMenu, { "data-component-name": "TableOfContent/TableOfContent", className: className },
|
|
55
52
|
React.createElement(TableOfContentItems, { ref: sidebar },
|
|
56
|
-
displayedHeadings.length ? (React.createElement(TocHeader, { "data-translation-key":
|
|
53
|
+
displayedHeadings.length ? (React.createElement(TocHeader, { "data-translation-key": "theme.toc.header" }, translate('theme.toc.header', toc.header || 'On this page'))) : null,
|
|
57
54
|
displayedHeadings.map((heading, idx) => {
|
|
58
55
|
if (!heading) {
|
|
59
56
|
return null;
|
package/lib/config.d.ts
CHANGED
|
@@ -309,9 +309,6 @@ declare const scorecardConfigSchema: {
|
|
|
309
309
|
readonly name: {
|
|
310
310
|
readonly type: "string";
|
|
311
311
|
};
|
|
312
|
-
readonly color: {
|
|
313
|
-
readonly type: "string";
|
|
314
|
-
};
|
|
315
312
|
readonly extends: {
|
|
316
313
|
readonly type: "array";
|
|
317
314
|
readonly items: {
|
|
@@ -1865,9 +1862,6 @@ export declare const themeConfigSchema: {
|
|
|
1865
1862
|
readonly name: {
|
|
1866
1863
|
readonly type: "string";
|
|
1867
1864
|
};
|
|
1868
|
-
readonly color: {
|
|
1869
|
-
readonly type: "string";
|
|
1870
|
-
};
|
|
1871
1865
|
readonly extends: {
|
|
1872
1866
|
readonly type: "array";
|
|
1873
1867
|
readonly items: {
|
package/lib/config.js
CHANGED
package/lib/layouts/Forbidden.js
CHANGED
|
@@ -10,14 +10,10 @@ const Button_1 = require("../components/Button");
|
|
|
10
10
|
const hooks_1 = require("../mocks/hooks");
|
|
11
11
|
function Forbidden() {
|
|
12
12
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
13
|
-
const translationKeys = {
|
|
14
|
-
title: 'theme.page.forbidden.title',
|
|
15
|
-
homeButton: 'theme.page.homeButton',
|
|
16
|
-
};
|
|
17
13
|
return (react_1.default.createElement(Wrapper, { "data-component-name": "Pages/Forbidden" },
|
|
18
14
|
react_1.default.createElement(Header, null, "403"),
|
|
19
|
-
react_1.default.createElement(Description, { "data-translation-key":
|
|
20
|
-
react_1.default.createElement(HomeButton, { color: "primary", size: "large", to: "/", "data-translation-key":
|
|
15
|
+
react_1.default.createElement(Description, { "data-translation-key": "theme.page.forbidden.title" }, translate('theme.page.forbidden.title', 'Access forbidden')),
|
|
16
|
+
react_1.default.createElement(HomeButton, { color: "primary", size: "large", to: "/", "data-translation-key": "theme.page.homeButton" }, translate('theme.page.homeButton', 'Open Homepage'))));
|
|
21
17
|
}
|
|
22
18
|
exports.Forbidden = Forbidden;
|
|
23
19
|
const Wrapper = styled_components_1.default.div `
|
package/lib/layouts/NotFound.js
CHANGED
|
@@ -10,14 +10,10 @@ const Button_1 = require("../components/Button");
|
|
|
10
10
|
const hooks_1 = require("../mocks/hooks");
|
|
11
11
|
function NotFound() {
|
|
12
12
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
13
|
-
const translationKeys = {
|
|
14
|
-
title: 'theme.page.notFound.title',
|
|
15
|
-
homeButton: 'theme.page.homeButton',
|
|
16
|
-
};
|
|
17
13
|
return (react_1.default.createElement(Wrapper, { "data-component-name": "Pages/NotFound" },
|
|
18
14
|
react_1.default.createElement(Header, null, "404"),
|
|
19
|
-
react_1.default.createElement(Description, { "data-translation-key":
|
|
20
|
-
react_1.default.createElement(HomeButton, { color: "primary", size: "large", to: "/", "data-translation-key":
|
|
15
|
+
react_1.default.createElement(Description, { "data-translation-key": "theme.page.notFound.title" }, translate('theme.page.notFound.title', "It looks like you're lost")),
|
|
16
|
+
react_1.default.createElement(HomeButton, { color: "primary", size: "large", to: "/", "data-translation-key": "theme.page.homeButton" }, translate('theme.page.homeButton', 'Open Homepage'))));
|
|
21
17
|
}
|
|
22
18
|
exports.NotFound = NotFound;
|
|
23
19
|
const Wrapper = styled_components_1.default.div `
|
|
@@ -35,9 +35,6 @@ function OIDCForbidden() {
|
|
|
35
35
|
const { translate } = (0, hooks_1.useTranslate)();
|
|
36
36
|
const [searchParams, setSearchParams] = (0, react_router_dom_1.useSearchParams)();
|
|
37
37
|
const [errorDescription, setErrorDescription] = (0, react_1.useState)('');
|
|
38
|
-
const translationKeys = {
|
|
39
|
-
title: 'theme.page.forbidden.title',
|
|
40
|
-
};
|
|
41
38
|
// use whatever you want here
|
|
42
39
|
const URL_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;
|
|
43
40
|
const renderText = (text) => text.split(' ').map((part) => URL_REGEX.test(part) ? (react_1.default.createElement(ErrorDescriptionLink, { key: part, href: part },
|
|
@@ -51,7 +48,7 @@ function OIDCForbidden() {
|
|
|
51
48
|
}, [searchParams, setSearchParams]);
|
|
52
49
|
return (react_1.default.createElement(Wrapper, { "data-component-name": "Pages/OIDCForbidden" },
|
|
53
50
|
react_1.default.createElement(Header, null, "403"),
|
|
54
|
-
react_1.default.createElement(Description, { "data-translation-key":
|
|
51
|
+
react_1.default.createElement(Description, { "data-translation-key": "theme.page.forbidden.title" }, translate('theme.page.forbidden.title', 'Access forbidden')),
|
|
55
52
|
errorDescription && react_1.default.createElement(ErrorDescription, null, renderText(errorDescription))));
|
|
56
53
|
}
|
|
57
54
|
exports.OIDCForbidden = OIDCForbidden;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { TFunction } from '@redocly/portal-types';
|
|
1
2
|
import type { CatalogConfig, ProductUiConfig, ThemeUIConfig } from '../../config';
|
|
2
|
-
import type { ResolvedNavItem,
|
|
3
|
+
import type { ResolvedNavItem, Version } from '../../types/portal';
|
|
3
4
|
import type { FilteredCatalog } from '../../types/portal/src/shared/types/catalog';
|
|
4
5
|
interface PageLink {
|
|
5
6
|
label: string;
|
|
@@ -13,7 +14,7 @@ export declare function useSidebarSiblingsData(): {
|
|
|
13
14
|
};
|
|
14
15
|
export declare function usePageSharedData<T = unknown>(_id: string): T;
|
|
15
16
|
export declare function useCatalog(_items: ResolvedNavItem[], _config: CatalogConfig): FilteredCatalog;
|
|
16
|
-
export declare
|
|
17
|
+
export declare const useTranslate: () => {
|
|
17
18
|
translate: TFunction;
|
|
18
19
|
};
|
|
19
20
|
export declare function useI18n(): {
|
package/lib/mocks/hooks/index.js
CHANGED
|
@@ -68,10 +68,9 @@ function useCatalog(_items, _config) {
|
|
|
68
68
|
throw new Error('Mock not implemented yet.');
|
|
69
69
|
}
|
|
70
70
|
exports.useCatalog = useCatalog;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
71
|
+
const useTranslate = () => ({
|
|
72
|
+
translate: (value, options) => (typeof options === 'string' ? options : options === null || options === void 0 ? void 0 : options.defaultValue) || value || '',
|
|
73
|
+
});
|
|
75
74
|
exports.useTranslate = useTranslate;
|
|
76
75
|
function useI18n() {
|
|
77
76
|
const changeLanguage = (...args) => args.value;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redocly/theme",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.2",
|
|
4
4
|
"description": "Shared UI components lib",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"theme",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"tsconfig-paths-webpack-plugin": "^3.5.2",
|
|
82
82
|
"typescript": "^4.8.4",
|
|
83
83
|
"webpack": "^5.72.0",
|
|
84
|
-
"@redocly/portal-types": "1.1.
|
|
84
|
+
"@redocly/portal-types": "1.1.1"
|
|
85
85
|
},
|
|
86
86
|
"dependencies": {
|
|
87
87
|
"@redocly/ajv": "^8.11.0",
|
|
@@ -26,9 +26,6 @@ export default function Catalog(props: {
|
|
|
26
26
|
|
|
27
27
|
const { filterTerm, setFilterTerm, groups, filters } = useCatalog(items, catalogConfig);
|
|
28
28
|
const [isAddingFilter, setIsAddingFilter] = React.useState(false);
|
|
29
|
-
const translationKeys = {
|
|
30
|
-
addFilter: 'theme.catalog.filters.select.addFilter',
|
|
31
|
-
};
|
|
32
29
|
const { translate } = useTranslate();
|
|
33
30
|
|
|
34
31
|
useModalScrollLock(isAddingFilter);
|
|
@@ -44,7 +41,7 @@ export default function Catalog(props: {
|
|
|
44
41
|
icon={<PlusIcon />}
|
|
45
42
|
onClick={() => setIsAddingFilter(true)}
|
|
46
43
|
>
|
|
47
|
-
{translate(
|
|
44
|
+
{translate('theme.catalog.filters.select.addFilter', 'Add filter')}
|
|
48
45
|
</Button>
|
|
49
46
|
<FilterTags filters={filters} />
|
|
50
47
|
</FilterTagsWrapper>
|
|
@@ -299,12 +299,9 @@ function collectFilterOptions(
|
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
301
|
|
|
302
|
-
const options = Object.entries(usedOptions)
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
options.sort((a, b) => b.value.localeCompare(a.value));
|
|
306
|
-
}
|
|
307
|
-
|
|
302
|
+
const options = Object.entries(usedOptions)
|
|
303
|
+
.map(([value, count]) => ({ value, count }))
|
|
304
|
+
.sort((a, b) => b.value.localeCompare(a.value));
|
|
308
305
|
if (othersCount) {
|
|
309
306
|
options.push({
|
|
310
307
|
value: filter.missingCategoryNameTranslationKey || filter.missingCategoryName || 'Others',
|
|
@@ -142,7 +142,6 @@ export function CodeBlockControls({
|
|
|
142
142
|
asIcon={controlsType === 'icon'}
|
|
143
143
|
title={report.tooltipText}
|
|
144
144
|
{...report.props}
|
|
145
|
-
onClick={() => telemetry.send('code_snippet_reported', {})}
|
|
146
145
|
>
|
|
147
146
|
{controlsType === 'icon' ? <ReportIcon /> : report.props?.buttonText || 'Report'}
|
|
148
147
|
</CodeBlockControlButton>
|
|
@@ -34,11 +34,6 @@ function CopyButtonComponent({
|
|
|
34
34
|
}: CopyButtonProps): JSX.Element {
|
|
35
35
|
const tooltip = useControl();
|
|
36
36
|
const { translate } = useTranslate();
|
|
37
|
-
const translationKeys = {
|
|
38
|
-
buttonText: 'theme.codeSnippet.copy.buttonText',
|
|
39
|
-
tooltipText: 'theme.codeSnippet.copy.tooltipText',
|
|
40
|
-
toasterText: 'theme.codeSnippet.copy.toasterText',
|
|
41
|
-
};
|
|
42
37
|
|
|
43
38
|
const showTooltip = (duration: number = 1500): void => {
|
|
44
39
|
tooltip.handleOpen();
|
|
@@ -59,7 +54,7 @@ function CopyButtonComponent({
|
|
|
59
54
|
return (
|
|
60
55
|
<Tooltip
|
|
61
56
|
className="copy-button"
|
|
62
|
-
tip={translate(
|
|
57
|
+
tip={translate('theme.codeSnippet.copy.buttonText', toasterText || 'Copied!')}
|
|
63
58
|
isOpen={tooltip.isOpened}
|
|
64
59
|
placement={toasterPlacement}
|
|
65
60
|
>
|
|
@@ -67,13 +62,13 @@ function CopyButtonComponent({
|
|
|
67
62
|
onClick={() => copy(toasterDuration)}
|
|
68
63
|
data-cy={dataTestId}
|
|
69
64
|
asIcon={type === 'icon'}
|
|
70
|
-
title={translate(
|
|
65
|
+
title={translate('theme.codeSnippet.copy.tooltipText', tooltipText || 'Copy to clipboard')}
|
|
71
66
|
data-testid={dataTestId}
|
|
72
67
|
>
|
|
73
68
|
{type === 'icon' ? (
|
|
74
69
|
<CopyIcon />
|
|
75
70
|
) : (
|
|
76
|
-
translate(
|
|
71
|
+
translate('theme.codeSnippet.copy.toasterText', buttonText || 'Copy')
|
|
77
72
|
)}
|
|
78
73
|
</CodeBlockControlButton>
|
|
79
74
|
</Tooltip>
|
|
@@ -12,9 +12,6 @@ export interface EditPageButtonProps {
|
|
|
12
12
|
|
|
13
13
|
export const EditPageButton = ({ to }: EditPageButtonProps): JSX.Element => {
|
|
14
14
|
const { translate } = useTranslate();
|
|
15
|
-
const translationKeys = {
|
|
16
|
-
text: 'theme.markdown.editPage.text',
|
|
17
|
-
};
|
|
18
15
|
|
|
19
16
|
return (
|
|
20
17
|
<EditButton
|
|
@@ -23,8 +20,8 @@ export const EditPageButton = ({ to }: EditPageButtonProps): JSX.Element => {
|
|
|
23
20
|
onClick={() => telemetry.send('edit_page_link_clicked', {})}
|
|
24
21
|
>
|
|
25
22
|
<ButtonIcon />
|
|
26
|
-
<ButtonText data-translation-key=
|
|
27
|
-
{translate(
|
|
23
|
+
<ButtonText data-translation-key="theme.markdown.editPage.text">
|
|
24
|
+
{translate('theme.markdown.editPage.text', 'Edit')}
|
|
28
25
|
</ButtonText>
|
|
29
26
|
</EditButton>
|
|
30
27
|
);
|