@redocly/theme 0.25.1 → 0.25.3

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 (74) hide show
  1. package/lib/components/Catalog/Catalog.js +1 -4
  2. package/lib/components/CopyButton/CopyButton.js +2 -7
  3. package/lib/components/EditPageButton/EditPageButton.js +1 -4
  4. package/lib/components/Feedback/Comment.js +4 -10
  5. package/lib/components/Feedback/Mood.js +6 -13
  6. package/lib/components/Feedback/Rating.js +2 -6
  7. package/lib/components/Feedback/Reasons.js +4 -9
  8. package/lib/components/Feedback/Sentiment.js +4 -10
  9. package/lib/components/Feedback/Thumbs.js +2 -8
  10. package/lib/components/Feedback/useReportDialog.js +3 -8
  11. package/lib/components/Filter/Filter.js +1 -5
  12. package/lib/components/Filter/FilterContent.js +2 -6
  13. package/lib/components/Filter/FilterPopover.js +2 -6
  14. package/lib/components/Footer/FooterCopyright.js +2 -5
  15. package/lib/components/LastUpdated/LastUpdated.js +1 -1
  16. package/lib/components/Markdown/styledVariables.js +54 -0
  17. package/lib/components/Menu/hooks/use-mobile-menu-items.js +1 -4
  18. package/lib/components/Menu/hooks/use-mobile-menu-levels.js +2 -6
  19. package/lib/components/Menu/utils.d.ts +2 -1
  20. package/lib/components/Profile/LoginLink.js +2 -5
  21. package/lib/components/Profile/MobileUserProfile.js +1 -4
  22. package/lib/components/Profile/UserProfile.js +3 -7
  23. package/lib/components/Search/CancelSearch.js +1 -4
  24. package/lib/components/Search/RecentSearches.js +1 -4
  25. package/lib/components/Search/SearchDialog.js +4 -10
  26. package/lib/components/Search/SearchTrigger.js +1 -4
  27. package/lib/components/Search/SuggestedPages.js +1 -4
  28. package/lib/components/Sidebar/DrilldownMenu.js +2 -5
  29. package/lib/components/Sidebar/VersionPicker.js +2 -6
  30. package/lib/components/TableOfContent/TableOfContent.js +1 -4
  31. package/lib/components/Tabs/Tab.js +30 -6
  32. package/lib/components/Tabs/Tabs.js +22 -8
  33. package/lib/layouts/Forbidden.js +2 -6
  34. package/lib/layouts/NotFound.js +2 -6
  35. package/lib/layouts/OIDCForbidden.js +1 -4
  36. package/lib/mocks/hooks/index.d.ts +3 -2
  37. package/lib/mocks/hooks/index.js +3 -4
  38. package/package.json +2 -2
  39. package/src/components/Catalog/Catalog.tsx +1 -4
  40. package/src/components/CopyButton/CopyButton.tsx +3 -8
  41. package/src/components/EditPageButton/EditPageButton.tsx +2 -5
  42. package/src/components/Feedback/Comment.tsx +14 -14
  43. package/src/components/Feedback/Mood.tsx +14 -15
  44. package/src/components/Feedback/Rating.tsx +4 -8
  45. package/src/components/Feedback/Reasons.tsx +6 -11
  46. package/src/components/Feedback/Sentiment.tsx +6 -12
  47. package/src/components/Feedback/Thumbs.tsx +2 -9
  48. package/src/components/Feedback/useReportDialog.ts +3 -8
  49. package/src/components/Filter/Filter.tsx +3 -5
  50. package/src/components/Filter/FilterContent.tsx +2 -6
  51. package/src/components/Filter/FilterPopover.tsx +2 -6
  52. package/src/components/Footer/FooterCopyright.tsx +2 -5
  53. package/src/components/LastUpdated/LastUpdated.tsx +1 -1
  54. package/src/components/Markdown/styledVariables.ts +54 -0
  55. package/src/components/Menu/hooks/use-mobile-menu-items.ts +1 -5
  56. package/src/components/Menu/hooks/use-mobile-menu-levels.ts +2 -7
  57. package/src/components/Menu/utils.ts +2 -1
  58. package/src/components/Profile/LoginLink.tsx +2 -5
  59. package/src/components/Profile/MobileUserProfile.tsx +1 -4
  60. package/src/components/Profile/UserProfile.tsx +5 -8
  61. package/src/components/Search/CancelSearch.tsx +2 -5
  62. package/src/components/Search/RecentSearches.tsx +2 -5
  63. package/src/components/Search/SearchDialog.tsx +8 -15
  64. package/src/components/Search/SearchTrigger.tsx +3 -5
  65. package/src/components/Search/SuggestedPages.tsx +2 -6
  66. package/src/components/Sidebar/DrilldownMenu.tsx +2 -5
  67. package/src/components/Sidebar/VersionPicker.tsx +3 -7
  68. package/src/components/TableOfContent/TableOfContent.tsx +2 -5
  69. package/src/components/Tabs/Tab.tsx +30 -6
  70. package/src/components/Tabs/Tabs.tsx +22 -8
  71. package/src/layouts/Forbidden.tsx +4 -13
  72. package/src/layouts/NotFound.tsx +4 -13
  73. package/src/layouts/OIDCForbidden.tsx +2 -6
  74. package/src/mocks/hooks/index.ts +7 -6
@@ -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;
@@ -14,20 +14,44 @@ exports.Tab = Tab;
14
14
  const TabItem = styled_components_1.default.li `
15
15
  display: inline-block;
16
16
  list-style: none;
17
- padding: 0.75rem 1rem;
18
17
  cursor: pointer;
19
18
 
19
+ color: var(--md-tabs-tab-text-color);
20
+ font-size: var(--md-tabs-tab-font-size);
21
+ font-family: var(--md-tabs-tab-font-family);
22
+ font-style: var(--md-tabs-tab-font-style);
23
+ font-weight: var(--md-tabs-tab-font-weight);
24
+ background-color: var(--md-tabs-tab-background-color);
25
+ border-radius: var(--md-tabs-tab-border-radius);
26
+ padding: var(--md-tabs-tab-padding);
27
+ border: var(--md-tabs-tab-border);
28
+ border-width: var(--md-tabs-tab-border-width);
29
+
20
30
  ${({ active }) => active
21
- ? `
22
- background-color: var(--background-color);
31
+ ? `
32
+ color: var(--md-tabs-active-tab-text-color);
33
+ font-size: var(--md-tabs-active-tab-font-size);
34
+ font-family: var(--md-tabs-active-tab-font-family);
35
+ font-style: var(--md-tabs-active-tab-font-style);
36
+ font-weight: var(--md-tabs-active-tab-font-weight);
37
+ background-color: var(--md-tabs-active-tab-background-color);
38
+ border-radius: var(--md-tabs-active-tab-border-radius);
39
+ padding: var(--md-tabs-active-tab-padding);
23
40
  border: solid var(--md-tabs-active-tab-border-color);
24
- border-width: 0 0 1px 0;
25
- color: var(--text-primary);
41
+ border-width: var(--md-tabs-active-tab-border-width);
26
42
  `
27
43
  : `
28
44
  &:hover {
45
+ color: var(--md-tabs-hover-tab-text-color);
46
+ font-size: var(--md-tabs-hover-tab-font-size);
47
+ font-family: var(--md-tabs-hover-tab-font-family);
48
+ font-style: var(--md-tabs-hover-tab-font-style);
49
+ font-weight: var(--md-tabs-hover-tab-font-weight);
50
+ background-color: var(--md-tabs-hover-tab-background-color);
51
+ border-radius: var(--md-tabs-hover-tab-border-radius);
52
+ padding: var(--md-tabs-hover-tab-padding);
29
53
  border: solid var(--md-tabs-hover-tab-border-color);
30
- border-width: 0 0 1px 0;
54
+ border-width: var(--md-tabs-hover-tab-border-width);
31
55
  }
32
56
  `}
33
57
  `;
@@ -48,7 +48,15 @@ function Tabs(props) {
48
48
  }
49
49
  exports.Tabs = Tabs;
50
50
  const TabsContainer = styled_components_1.default.div `
51
- margin: 10px 0;
51
+ color: var(--md-tabs-container-text-color);
52
+ font-size: var(--md-tabs-container-font-size);
53
+ font-family: var(--md-tabs-container-font-family);
54
+ font-style: var(--md-tabs-container-font-style);
55
+ font-weight: var(--md-tabs-container-font-weight);
56
+ background-color: var(--md-tabs-container-background-color);
57
+ margin: var(--md-tabs-container-margin);
58
+ padding: var(--md-tabs-container-padding);
59
+ border: var(--md-tabs-container-border);
52
60
 
53
61
  ol[class^='Tabs__TabList'] {
54
62
  margin: 0;
@@ -56,18 +64,24 @@ const TabsContainer = styled_components_1.default.div `
56
64
  }
57
65
  `;
58
66
  const TabList = styled_components_1.default.ol `
59
- color: var(--md-tabs-tab-text-color);
60
- padding: 0;
67
+ padding: var(--md-tabs-padding);
61
68
  margin-block-end: 0;
62
- border: solid var(--border-primary);
63
- border-width: 0 0 1px 0;
69
+ border: var(--md-tabs-border);
70
+ border-width: var(--md-tabs-border-width);
64
71
 
65
72
  li[class^='Tab__TabItem'] {
66
- margin: 0;
67
- margin-bottom: -1px;
73
+ margin: var(--md-tabs-tab-margin);
68
74
  }
69
75
  `;
70
76
  const TabContent = styled_components_1.default.div `
71
- padding: 1rem 0;
77
+ color: var(--md-tabs-content-text-color);
78
+ font-size: var(--md-tabs-content-font-size);
79
+ font-family: var(--md-tabs-content-font-family);
80
+ font-style: var(--md-tabs-content-font-style);
81
+ font-weight: var(--md-tabs-content-font-weight);
82
+ background-color: var(--md-tabs-content-background-color);
83
+ margin: var(--md-tabs-content-margin);
84
+ padding: var(--md-tabs-content-padding);
85
+ border: var(--md-tabs-content-border);
72
86
  `;
73
87
  //# sourceMappingURL=Tabs.js.map
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.25.1",
3
+ "version": "0.25.3",
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>
@@ -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
  );
@@ -10,12 +10,6 @@ export const Comment = ({ settings, onSubmit, onCancel, className }: CommentProp
10
10
  const [text, setText] = React.useState('');
11
11
  const [submitValue, setSubmitValue] = React.useState('');
12
12
  const { translate } = useTranslate();
13
- const translationKeys = {
14
- submitText: 'theme.feedback.settings.comment.submitText',
15
- label: 'theme.feedback.settings.comment.label',
16
- send: 'theme.feedback.settings.comment.send',
17
- cancel: 'theme.feedback.settings.comment.cancel',
18
- };
19
13
 
20
14
  const send = () => {
21
15
  if (!text) return;
@@ -29,9 +23,9 @@ export const Comment = ({ settings, onSubmit, onCancel, className }: CommentProp
29
23
  if (submitValue) {
30
24
  return (
31
25
  <Wrapper className={className}>
32
- <Label data-translation-key={translationKeys.submitText}>
26
+ <Label data-translation-key="theme.feedback.settings.comment.submitText">
33
27
  {translate(
34
- translationKeys.submitText,
28
+ 'theme.feedback.settings.comment.submitText',
35
29
  submitText || 'Thank you for helping improve our documentation!',
36
30
  )}
37
31
  </Label>
@@ -41,17 +35,23 @@ export const Comment = ({ settings, onSubmit, onCancel, className }: CommentProp
41
35
 
42
36
  return (
43
37
  <Wrapper data-component-name="Feedback/Comment" className={className}>
44
- <Label data-translation-key={translationKeys.label}>
45
- {translate(translationKeys.label, label || 'Please share your feedback with us.')}
38
+ <Label data-translation-key="theme.feedback.settings.comment.label">
39
+ {translate(
40
+ 'theme.feedback.settings.comment.label',
41
+ label || 'Please share your feedback with us.',
42
+ )}
46
43
  </Label>
47
44
  <TextArea rows={3} onChange={handleTextAreaChange} />
48
45
  <ButtonsContainer>
49
- <SendButton data-translation-key={translationKeys.send} onClick={send}>
50
- {translate(translationKeys.send, 'Send')}
46
+ <SendButton data-translation-key="theme.feedback.settings.comment.send" onClick={send}>
47
+ {translate('theme.feedback.settings.comment.send', 'Send')}
51
48
  </SendButton>
52
49
  {onCancel && (
53
- <CancelButton data-translation-key={translationKeys.cancel} onClick={onCancel}>
54
- {translate(translationKeys.cancel, 'Cancel')}
50
+ <CancelButton
51
+ data-translation-key="theme.feedback.settings.comment.cancel"
52
+ onClick={onCancel}
53
+ >
54
+ {translate('theme.feedback.settings.comment.cancel', 'Cancel')}
55
55
  </CancelButton>
56
56
  )}
57
57
  </ButtonsContainer>
@@ -19,13 +19,6 @@ export const Mood = ({ settings, onSubmit, className }: MoodProps): JSX.Element
19
19
  const [comment, setComment] = React.useState('');
20
20
  const [reasons, setReasons] = React.useState([] as ReasonsProps['settings']['items']);
21
21
  const { translate } = useTranslate();
22
- const translationKeys = {
23
- submitText: 'theme.feedback.settings.submitText',
24
- label: 'theme.feedback.settings.label',
25
- satisfiedLabel: 'theme.feedback.settings.comment.satisfiedLabel',
26
- neutralLabel: 'theme.feedback.settings.comment.neutralLabel',
27
- dissatisfiedLabel: 'theme.feedback.settings.comment.dissatisfiedLabel',
28
- };
29
22
 
30
23
  if (score && reasonsSettings?.enable && !reasons.length) {
31
24
  const { label: reasonsLabel, items, multi } = reasonsSettings;
@@ -43,21 +36,24 @@ export const Mood = ({ settings, onSubmit, className }: MoodProps): JSX.Element
43
36
  switch (score) {
44
37
  case MOOD_STATES.SATISFIED:
45
38
  return translate(
46
- translationKeys.satisfiedLabel,
39
+ 'theme.feedback.settings.comment.satisfiedLabel',
47
40
  commentSettings.satisfiedLabel || 'What was most helpful?',
48
41
  );
49
42
  case MOOD_STATES.NEUTRAL:
50
43
  return translate(
51
- translationKeys.neutralLabel,
44
+ 'theme.feedback.settings.comment.neutralLabel',
52
45
  commentSettings.neutralLabel || 'What can we improve?',
53
46
  );
54
47
  case MOOD_STATES.DISSATISFIED:
55
48
  return translate(
56
- translationKeys.dissatisfiedLabel,
49
+ 'theme.feedback.settings.comment.dissatisfiedLabel',
57
50
  commentSettings.dissatisfiedLabel || 'What can we improve?',
58
51
  );
59
52
  default:
60
- return translate(translationKeys.satisfiedLabel, 'What can we improve?');
53
+ return translate(
54
+ 'theme.feedback.settings.comment.satisfiedLabel',
55
+ 'What can we improve?',
56
+ );
61
57
  }
62
58
  };
63
59
  return (
@@ -81,8 +77,11 @@ export const Mood = ({ settings, onSubmit, className }: MoodProps): JSX.Element
81
77
 
82
78
  return (
83
79
  <Wrapper>
84
- <Label data-translation-key={translationKeys.submitText}>
85
- {translate(translationKeys.submitText, submitText || 'Thank you for your feedback!')}
80
+ <Label data-translation-key="theme.feedback.settings.submitText">
81
+ {translate(
82
+ 'theme.feedback.settings.submitText',
83
+ submitText || 'Thank you for your feedback!',
84
+ )}
86
85
  </Label>
87
86
  </Wrapper>
88
87
  );
@@ -90,8 +89,8 @@ export const Mood = ({ settings, onSubmit, className }: MoodProps): JSX.Element
90
89
 
91
90
  return (
92
91
  <Wrapper data-component-name="Feedback/Mood" className={className}>
93
- <Label data-translation-key={translationKeys.label}>
94
- {translate(translationKeys.label, label || 'Was this page helpful?')}
92
+ <Label data-translation-key="theme.feedback.settings.label">
93
+ {translate('theme.feedback.settings.label', label || 'Was this page helpful?')}
95
94
  </Label>
96
95
  <Vote
97
96
  onClick={() => {
@@ -23,10 +23,6 @@ export const Rating = ({ settings, onSubmit, className }: RatingProps): JSX.Elem
23
23
  const [comment, setComment] = React.useState('');
24
24
  const [reasons, setReasons] = React.useState([] as ReasonsProps['settings']['items']);
25
25
  const { translate } = useTranslate();
26
- const translationKeys = {
27
- submitText: 'theme.feedback.settings.submitText',
28
- label: 'theme.feedback.settings.label',
29
- };
30
26
  const maxRating = max || 5;
31
27
 
32
28
  if (score && reasonsSettings?.enable && !reasons.length) {
@@ -62,9 +58,9 @@ export const Rating = ({ settings, onSubmit, className }: RatingProps): JSX.Elem
62
58
 
63
59
  return (
64
60
  <Wrapper>
65
- <Label data-translation-key={translationKeys.submitText}>
61
+ <Label data-translation-key="theme.feedback.settings.submitText">
66
62
  {translate(
67
- translationKeys.submitText,
63
+ 'theme.feedback.settings.submitText',
68
64
  submitText || 'Thank you for helping improve our documentation!',
69
65
  )}
70
66
  </Label>
@@ -74,8 +70,8 @@ export const Rating = ({ settings, onSubmit, className }: RatingProps): JSX.Elem
74
70
 
75
71
  return (
76
72
  <Wrapper data-component-name="Feedback/Rating" className={className}>
77
- <Label data-translation-key={translationKeys.label}>
78
- {translate(translationKeys.label, label || 'How helpful was this page?')}
73
+ <Label data-translation-key="theme.feedback.settings.label">
74
+ {translate('theme.feedback.settings.label', label || 'How helpful was this page?')}
79
75
  </Label>
80
76
  <Stars max={maxRating} onSubmit={setScore} />
81
77
  </Wrapper>