@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.
Files changed (92) hide show
  1. package/lib/components/Catalog/Catalog.js +1 -4
  2. package/lib/components/Catalog/useCatalog.js +3 -4
  3. package/lib/components/CodeBlock/CodeBlockControls.js +1 -1
  4. package/lib/components/CopyButton/CopyButton.js +2 -7
  5. package/lib/components/EditPageButton/EditPageButton.js +1 -4
  6. package/lib/components/Feedback/Comment.js +4 -10
  7. package/lib/components/Feedback/Feedback.js +1 -1
  8. package/lib/components/Feedback/Mood.js +15 -18
  9. package/lib/components/Feedback/Rating.js +12 -12
  10. package/lib/components/Feedback/Reasons.js +4 -9
  11. package/lib/components/Feedback/ReportDialog.js +16 -3
  12. package/lib/components/Feedback/Sentiment.js +13 -15
  13. package/lib/components/Feedback/Thumbs.js +2 -8
  14. package/lib/components/Feedback/types.d.ts +1 -1
  15. package/lib/components/Feedback/useReportDialog.js +6 -8
  16. package/lib/components/Filter/Filter.js +6 -6
  17. package/lib/components/Filter/FilterContent.js +2 -6
  18. package/lib/components/Filter/FilterPopover.js +2 -6
  19. package/lib/components/Footer/FooterCopyright.js +2 -5
  20. package/lib/components/LastUpdated/LastUpdated.js +1 -1
  21. package/lib/components/Menu/hooks/use-mobile-menu-items.js +1 -4
  22. package/lib/components/Menu/hooks/use-mobile-menu-levels.js +2 -6
  23. package/lib/components/Menu/utils.d.ts +2 -1
  24. package/lib/components/Profile/LoginLink.js +2 -5
  25. package/lib/components/Profile/MobileUserProfile.js +1 -4
  26. package/lib/components/Profile/UserProfile.js +3 -7
  27. package/lib/components/Scorecard/Card.d.ts +1 -3
  28. package/lib/components/Scorecard/Card.js +2 -4
  29. package/lib/components/Scorecard/Gauge.d.ts +2 -5
  30. package/lib/components/Scorecard/Gauge.js +2 -6
  31. package/lib/components/Scorecard/StatusByLevelWidget.d.ts +0 -1
  32. package/lib/components/Scorecard/StatusByLevelWidget.js +2 -5
  33. package/lib/components/Search/CancelSearch.js +1 -4
  34. package/lib/components/Search/RecentSearches.js +1 -4
  35. package/lib/components/Search/SearchDialog.js +4 -10
  36. package/lib/components/Search/SearchTrigger.js +1 -4
  37. package/lib/components/Search/SuggestedPages.js +1 -4
  38. package/lib/components/Sidebar/DrilldownMenu.js +2 -5
  39. package/lib/components/Sidebar/VersionPicker.js +2 -6
  40. package/lib/components/TableOfContent/TableOfContent.js +1 -4
  41. package/lib/config.d.ts +0 -6
  42. package/lib/config.js +0 -1
  43. package/lib/layouts/Forbidden.js +2 -6
  44. package/lib/layouts/NotFound.js +2 -6
  45. package/lib/layouts/OIDCForbidden.js +1 -4
  46. package/lib/mocks/hooks/index.d.ts +3 -2
  47. package/lib/mocks/hooks/index.js +3 -4
  48. package/lib/types/portal/src/shared/types/feedback.d.ts +1 -0
  49. package/package.json +2 -2
  50. package/src/components/Catalog/Catalog.tsx +1 -4
  51. package/src/components/Catalog/useCatalog.ts +3 -6
  52. package/src/components/CodeBlock/CodeBlockControls.tsx +0 -1
  53. package/src/components/CopyButton/CopyButton.tsx +3 -8
  54. package/src/components/EditPageButton/EditPageButton.tsx +2 -5
  55. package/src/components/Feedback/Comment.tsx +14 -14
  56. package/src/components/Feedback/Feedback.tsx +2 -2
  57. package/src/components/Feedback/Mood.tsx +25 -20
  58. package/src/components/Feedback/Rating.tsx +15 -14
  59. package/src/components/Feedback/Reasons.tsx +6 -11
  60. package/src/components/Feedback/ReportDialog.tsx +6 -2
  61. package/src/components/Feedback/Sentiment.tsx +15 -17
  62. package/src/components/Feedback/Thumbs.tsx +2 -9
  63. package/src/components/Feedback/types.ts +1 -1
  64. package/src/components/Feedback/useReportDialog.ts +6 -8
  65. package/src/components/Filter/Filter.tsx +9 -6
  66. package/src/components/Filter/FilterContent.tsx +2 -6
  67. package/src/components/Filter/FilterPopover.tsx +2 -6
  68. package/src/components/Footer/FooterCopyright.tsx +2 -5
  69. package/src/components/LastUpdated/LastUpdated.tsx +1 -1
  70. package/src/components/Menu/hooks/use-mobile-menu-items.ts +1 -5
  71. package/src/components/Menu/hooks/use-mobile-menu-levels.ts +2 -7
  72. package/src/components/Menu/utils.ts +2 -1
  73. package/src/components/Profile/LoginLink.tsx +2 -5
  74. package/src/components/Profile/MobileUserProfile.tsx +1 -4
  75. package/src/components/Profile/UserProfile.tsx +5 -8
  76. package/src/components/Scorecard/Card.tsx +2 -4
  77. package/src/components/Scorecard/Gauge.tsx +7 -16
  78. package/src/components/Scorecard/StatusByLevelWidget.tsx +2 -6
  79. package/src/components/Search/CancelSearch.tsx +2 -5
  80. package/src/components/Search/RecentSearches.tsx +2 -5
  81. package/src/components/Search/SearchDialog.tsx +8 -15
  82. package/src/components/Search/SearchTrigger.tsx +3 -5
  83. package/src/components/Search/SuggestedPages.tsx +2 -6
  84. package/src/components/Sidebar/DrilldownMenu.tsx +2 -5
  85. package/src/components/Sidebar/VersionPicker.tsx +3 -7
  86. package/src/components/TableOfContent/TableOfContent.tsx +2 -5
  87. package/src/config.ts +0 -1
  88. package/src/layouts/Forbidden.tsx +4 -13
  89. package/src/layouts/NotFound.tsx +4 -13
  90. package/src/layouts/OIDCForbidden.tsx +2 -6
  91. package/src/mocks/hooks/index.ts +7 -6
  92. 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(TRANSLATION_KEYS.mainMenu, 'Main Menu'),
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(TRANSLATION_KEYS.previous, 'Previous'),
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, TFunction, Version } from '../../types/portal';
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
- const translationKeys = {
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(translationKeys.login, (userProfile === null || userProfile === void 0 ? void 0 : userProfile.loginLabel) || 'Login')));
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(translationKeys.login, (userProfile === null || userProfile === void 0 ? void 0 : userProfile.loginLabel) || 'Login'))) : (react_1.default.createElement(react_1.default.Fragment, null,
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": translationKeys.myApps }, translate(translationKeys.myApps, 'My Apps')));
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": translationKeys.logout, role: "link" },
56
+ }, "data-translation-key": "theme.profile.logout", role: "link" },
61
57
  react_1.default.createElement(icons_1.LogoutIcon, null),
62
- translate(translationKeys.logout, (userProfile === null || userProfile === void 0 ? void 0 : userProfile.logoutLabel) || 'Log out')));
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.attrs({
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(--bg-raised);
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 interface GaugeProps {
2
+ export declare function Gauge({ chunks, }: {
3
3
  chunks: {
4
4
  share: number;
5
5
  color: string;
6
- title?: string;
7
6
  }[];
8
- className?: string;
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, className }) {
33
- const title = chunks
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 `
@@ -7,6 +7,5 @@ export interface StatusByLevelWidgetProps {
7
7
  warnings: number;
8
8
  total: number;
9
9
  }[];
10
- className?: string;
11
10
  }
12
11
  export declare function StatusByLevelWidget(props: StatusByLevelWidgetProps): JSX.Element;
@@ -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, className } = props;
36
- return (React.createElement(Card_1.ScorecardCard, { "data-component-name": "Scorecard/StatusByLevelWidget", className: className },
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": translationKeys.cancel, fullWidth: true, variant: "outlined" }, translate(translationKeys.cancel, 'Cancel'))));
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": translationKeys.title }, translate(translationKeys.title, 'Recent searches')),
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": translationKeys.noResults }, translate(translationKeys.noResults, 'No results')))) : (react_1.default.createElement(react_1.default.Fragment, null,
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": translationKeys.navigate, combination: "Tab", text: translate(translationKeys.navigate, 'to navigate') }),
80
- react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key": translationKeys.select, combination: "\u21B5", text: translate(translationKeys.select, 'to select') }),
81
- react_1.default.createElement(Shortcut_1.Shortcut, { "data-translation-key": translationKeys.exit, combination: "Esc", text: translate(translationKeys.exit, 'to exit') })),
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": translationKeys.label }, translate(translationKeys.label, 'Search')),
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": translationKeys.title }, translate(translationKeys.title, 'Suggested pages')),
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(translationKeys.backLabel, 'Back')
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": translationKeys.backLabel }, label),
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": translationKeys.label }, translate(translationKeys.label, 'Version:')),
60
- React.createElement(exports.VersionPickerSelect, { placeholder: translate(translationKeys.unversioned, 'All versions'), disabled: !options.length, options: options, value: value, onChange: onChange })));
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": translationKeys.header }, translate(translationKeys.header, toc.header || 'On this page'))) : null,
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
@@ -280,7 +280,6 @@ const scorecardConfigSchema = {
280
280
  required: ['name'],
281
281
  properties: {
282
282
  name: { type: 'string' },
283
- color: { type: 'string' },
284
283
  extends: { type: 'array', items: { type: 'string' } },
285
284
  rules: {
286
285
  type: 'object',
@@ -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": translationKeys.title }, translate(translationKeys.title, 'Access forbidden')),
20
- react_1.default.createElement(HomeButton, { color: "primary", size: "large", to: "/", "data-translation-key": translationKeys.homeButton }, translate(translationKeys.homeButton, 'Open Homepage'))));
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 `
@@ -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": translationKeys.title }, translate(translationKeys.title, `It looks like you're lost`)),
20
- react_1.default.createElement(HomeButton, { color: "primary", size: "large", to: "/", "data-translation-key": translationKeys.homeButton }, translate(translationKeys.homeButton, 'Open Homepage'))));
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": translationKeys.title }, translate(translationKeys.title, 'Access forbidden')),
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, TFunction, Version } from '../../types/portal';
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 function useTranslate(): {
17
+ export declare const useTranslate: () => {
17
18
  translate: TFunction;
18
19
  };
19
20
  export declare function useI18n(): {
@@ -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
- function useTranslate() {
72
- const translate = (value, options) => (typeof options === 'string' ? options : options === null || options === void 0 ? void 0 : options.defaultValue) || value || '';
73
- return { translate };
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;
@@ -4,6 +4,7 @@ export type SubmitFeedbackParams = {
4
4
  type: string;
5
5
  values: Record<string, unknown>;
6
6
  path?: string;
7
+ location?: string;
7
8
  };
8
9
  export type FeedbackProps = {
9
10
  type: FEEDBACK_TYPES;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.25.1-beta.4",
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.0"
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(translationKeys.addFilter, 'Add filter')}
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).map(([value, count]) => ({ value, count }));
303
-
304
- if (!staticOptions) {
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(translationKeys.toasterText, toasterText || 'Copied!')}
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(translationKeys.tooltipText, tooltipText || 'Copy to clipboard')}
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(translationKeys.buttonText, buttonText || 'Copy')
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={translationKeys.text}>
27
- {translate(translationKeys.text, 'Edit')}
23
+ <ButtonText data-translation-key="theme.markdown.editPage.text">
24
+ {translate('theme.markdown.editPage.text', 'Edit')}
28
25
  </ButtonText>
29
26
  </EditButton>
30
27
  );