@redocly/theme 0.1.17 → 0.1.20

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 (60) hide show
  1. package/Footer/CustomFooter.d.ts +7 -0
  2. package/Footer/CustomFooter.js +31 -0
  3. package/Footer/CustomFooterNavItem.d.ts +7 -0
  4. package/Footer/CustomFooterNavItem.js +25 -0
  5. package/Footer/Footer.d.ts +6 -2
  6. package/Footer/Footer.js +1 -1
  7. package/Footer/FooterColumn.d.ts +2 -2
  8. package/Footer/FooterColumn.js +3 -2
  9. package/Footer/FooterColumns.d.ts +6 -4
  10. package/Footer/FooterColumns.js +3 -3
  11. package/Footer/FooterCopyright.d.ts +6 -4
  12. package/Navbar/Navbar.d.ts +2 -1
  13. package/Navbar/Navbar.js +2 -1
  14. package/Navbar/NavbarDropdown.d.ts +8 -0
  15. package/Navbar/NavbarDropdown.js +21 -0
  16. package/Navbar/NavbarItem.d.ts +3 -36
  17. package/Navbar/NavbarItem.js +22 -13
  18. package/Navbar/NavbarMenu.d.ts +2 -1
  19. package/Navbar/NavbarMenu.js +1 -1
  20. package/globalStyle.js +1 -1
  21. package/package.json +1 -1
  22. package/src/Footer/CustomFooter.tsx +45 -0
  23. package/src/Footer/CustomFooterNavItem.tsx +40 -0
  24. package/src/Footer/Footer.tsx +6 -2
  25. package/src/Footer/FooterColumn.tsx +4 -4
  26. package/src/Footer/FooterColumns.tsx +9 -9
  27. package/src/Footer/FooterCopyright.tsx +6 -6
  28. package/src/Navbar/Navbar.tsx +5 -2
  29. package/src/Navbar/NavbarDropdown.tsx +44 -0
  30. package/src/Navbar/NavbarItem.tsx +44 -51
  31. package/src/Navbar/NavbarMenu.tsx +6 -3
  32. package/src/globalStyle.ts +1 -0
  33. package/src/types/portal/index.d.ts +0 -1
  34. package/src/types/portal/src/client/app/Sidebar/types.d.ts +1 -1
  35. package/src/types/portal/src/server/{utils → content}/content-provider.d.ts +9 -9
  36. package/src/types/portal/src/server/{version-store.d.ts → content/versions-config.d.ts} +7 -7
  37. package/src/types/portal/src/server/plugins/markdown/types.d.ts +14 -11
  38. package/src/types/portal/src/server/plugins/portal-config/types.d.ts +16 -19
  39. package/src/types/portal/src/server/plugins/types.d.ts +23 -15
  40. package/src/types/portal/src/server/store.d.ts +32 -33
  41. package/src/types/portal/src/server/utils/fs.d.ts +2 -1
  42. package/src/types/portal/src/server/utils/index.d.ts +0 -1
  43. package/src/types/portal/src/server/utils/paths.d.ts +3 -3
  44. package/src/types/portal/src/server/utils/reporter/formatter.d.ts +2 -1
  45. package/src/types/portal/src/server/utils/reporter/reporter.d.ts +2 -1
  46. package/src/types/portal/src/shared/constants.d.ts +2 -0
  47. package/src/types/portal/src/shared/models/active-item.d.ts +3 -0
  48. package/src/types/portal/src/shared/models/config.d.ts +28 -0
  49. package/src/types/portal/src/shared/models/index.d.ts +6 -0
  50. package/src/types/portal/src/shared/models/json-index.d.ts +5 -0
  51. package/src/types/portal/src/shared/models/operation-parameter.d.ts +6 -0
  52. package/src/types/portal/src/shared/models/search-data.d.ts +5 -0
  53. package/src/types/portal/src/shared/models/search-document.d.ts +11 -0
  54. package/src/types/portal/src/shared/types.d.ts +8 -2
  55. package/src/types/portal/src/shared/urls.d.ts +2 -0
  56. package/src/types/portal/src/shared/utils.d.ts +8 -2
  57. package/src/types/portal/src/client/app/media-css.d.ts +0 -7
  58. package/src/types/portal/src/client/styling/default.d.ts +0 -601
  59. package/src/types/portal/src/client/styling/index.d.ts +0 -10
  60. package/src/types/portal/src/client/styling/resolve.d.ts +0 -1
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { NavGroupRecord } from '@theme/types/portal';
3
+ interface FooterProps {
4
+ data: NavGroupRecord;
5
+ }
6
+ export declare function CustomFooter({ data }: FooterProps): JSX.Element | null;
7
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CustomFooter = void 0;
11
+ var react_1 = __importDefault(require("react"));
12
+ var styled_components_1 = __importDefault(require("styled-components"));
13
+ var CustomFooterNavItem_1 = require("../Footer/CustomFooterNavItem");
14
+ var FooterCopyright_1 = require("../Footer/FooterCopyright");
15
+ function CustomFooter(_a) {
16
+ var data = _a.data;
17
+ if (!data) {
18
+ return null;
19
+ }
20
+ return (react_1.default.createElement(FooterContainer, { "data-component-name": "Footer/CustomFooter" },
21
+ data.links.map(function (navItem, index) {
22
+ return (react_1.default.createElement(CustomFooterNavItem_1.CustomFooterNavItem, { key: "".concat(navItem.label, "_").concat(index), "data-cy": navItem.label, navItem: navItem }));
23
+ }),
24
+ react_1.default.createElement(FooterCopyright_1.FooterCopyright, { copyrightText: data.copyrightText })));
25
+ }
26
+ exports.CustomFooter = CustomFooter;
27
+ var FooterContainer = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n list-style: none;\n margin: 0;\n padding: 0;\n display: block;\n background-color: var(--footer-background-color);\n text-align: center;\n font-family: var(--font-family-base);\n\n ", " {\n display: block;\n }\n"], ["\n list-style: none;\n margin: 0;\n padding: 0;\n display: block;\n background-color: var(--footer-background-color);\n text-align: center;\n font-family: var(--font-family-base);\n\n ", " {\n display: block;\n }\n"])), function (_a) {
28
+ var theme = _a.theme;
29
+ return theme.mediaQueries.medium;
30
+ });
31
+ var templateObject_1;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import type { ResolvedNavItem } from '@theme/types/portal';
3
+ interface CustomFooterNavItemProps {
4
+ navItem: ResolvedNavItem;
5
+ }
6
+ export declare function CustomFooterNavItem({ navItem }: CustomFooterNavItemProps): JSX.Element;
7
+ export {};
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CustomFooterNavItem = void 0;
11
+ var react_1 = __importDefault(require("react"));
12
+ var styled_components_1 = __importDefault(require("styled-components"));
13
+ var Link_1 = require("../mocks/Link");
14
+ function CustomFooterNavItem(_a) {
15
+ var navItem = _a.navItem;
16
+ var item = navItem;
17
+ return (react_1.default.createElement(FooterItem, { "data-component-name": "Navbar/NavbarItem" },
18
+ react_1.default.createElement(FooterLink, { to: item.link },
19
+ react_1.default.createElement(FooterLabel, null, item.label))));
20
+ }
21
+ exports.CustomFooterNavItem = CustomFooterNavItem;
22
+ var FooterItem = styled_components_1.default.li(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: inline-block;\n text-align: center;\n line-height: var(--line-height-base);\n font-size: var(--navbar-item-font-size);\n margin: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 3);\n font-weight: var(--font-weight-regular);\n"], ["\n display: inline-block;\n text-align: center;\n line-height: var(--line-height-base);\n font-size: var(--navbar-item-font-size);\n margin: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 3);\n font-weight: var(--font-weight-regular);\n"])));
23
+ var FooterLink = (0, styled_components_1.default)(Link_1.Link)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n color: var(--footer-text-color);\n text-decoration: none;\n"], ["\n color: var(--footer-text-color);\n text-decoration: none;\n"])));
24
+ var FooterLabel = styled_components_1.default.span(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n cursor: pointer;\n vertical-align: middle;\n"], ["\n cursor: pointer;\n vertical-align: middle;\n"])));
25
+ var templateObject_1, templateObject_2, templateObject_3;
@@ -1,3 +1,7 @@
1
1
  /// <reference types="react" />
2
- import type { FooterConfig } from '@theme/types/portal';
3
- export declare function Footer({ columns, copyrightText }: FooterConfig): JSX.Element | null;
2
+ import type { NavGroupRecord } from '@theme/types/portal';
3
+ interface FooterProps {
4
+ data: NavGroupRecord;
5
+ }
6
+ export declare function Footer({ data: { columns, copyrightText } }: FooterProps): JSX.Element | null;
7
+ export {};
package/Footer/Footer.js CHANGED
@@ -13,7 +13,7 @@ var styled_components_1 = __importDefault(require("styled-components"));
13
13
  var FooterColumns_1 = require("../Footer/FooterColumns");
14
14
  var FooterCopyright_1 = require("../Footer/FooterCopyright");
15
15
  function Footer(_a) {
16
- var columns = _a.columns, copyrightText = _a.copyrightText;
16
+ var _b = _a.data, columns = _b.columns, copyrightText = _b.copyrightText;
17
17
  if (!((columns === null || columns === void 0 ? void 0 : columns.length) || copyrightText)) {
18
18
  return null;
19
19
  }
@@ -1,7 +1,7 @@
1
1
  /// <reference types="react" />
2
- import type { FooterColumn as Column } from '@theme/types/portal';
2
+ import type { ResolvedNavItem } from '@theme/types/portal';
3
3
  interface FooterColumnProps {
4
- column: Column;
4
+ column: ResolvedNavItem;
5
5
  }
6
6
  export declare function FooterColumn({ column }: FooterColumnProps): JSX.Element;
7
7
  export {};
@@ -12,10 +12,11 @@ var react_1 = __importDefault(require("react"));
12
12
  var styled_components_1 = __importDefault(require("styled-components"));
13
13
  var Link_1 = require("../mocks/Link");
14
14
  function FooterColumn(_a) {
15
+ var _b;
15
16
  var column = _a.column;
16
17
  return (react_1.default.createElement(FooterColumnContainer, { "data-component-name": "Footer/FooterColumn" },
17
- react_1.default.createElement(FooterColumnTitle, null, column.group || column.label),
18
- column.items.map(function (columnItem, columnItemIndex) {
18
+ react_1.default.createElement(FooterColumnTitle, null, column.label), (_b = column === null || column === void 0 ? void 0 : column.items) === null || _b === void 0 ? void 0 :
19
+ _b.map(function (columnItem, columnItemIndex) {
19
20
  if (columnItem.type === 'error') {
20
21
  return null;
21
22
  }
@@ -1,7 +1,9 @@
1
1
  /// <reference types="react" />
2
- import type { FooterConfig } from '@theme/types/portal';
3
- export declare function FooterColumns({ columns, }: {
4
- columns?: FooterConfig['columns'];
5
- }): JSX.Element | null;
2
+ import type { NavGroup } from '@theme/types/portal';
3
+ interface FooterColumnsProps {
4
+ columns: NavGroup;
5
+ }
6
+ export declare function FooterColumns({ columns }: FooterColumnsProps): JSX.Element | null;
6
7
  export declare const FooterColumnsContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
7
8
  export declare const FooterRow: import("styled-components").StyledComponent<"div", any, {}, never>;
9
+ export {};
@@ -12,12 +12,12 @@ var react_1 = __importDefault(require("react"));
12
12
  var styled_components_1 = __importDefault(require("styled-components"));
13
13
  var FooterColumn_1 = require("../Footer/FooterColumn");
14
14
  function FooterColumns(_a) {
15
- var _b = _a.columns, columns = _b === void 0 ? [] : _b;
16
- if (!(columns === null || columns === void 0 ? void 0 : columns.length)) {
15
+ var columns = _a.columns;
16
+ if (typeof columns === 'string' || typeof columns === 'undefined' || !(columns === null || columns === void 0 ? void 0 : columns.length)) {
17
17
  return null;
18
18
  }
19
19
  return (react_1.default.createElement(exports.FooterColumnsContainer, { "data-component-name": "Footer/FooterColumns" },
20
- react_1.default.createElement(exports.FooterRow, null, columns.map(function (column, index) { return (react_1.default.createElement(FooterColumn_1.FooterColumn, { key: index, column: column })); }))));
20
+ react_1.default.createElement(exports.FooterRow, null, columns.map(function (column, index) { return (react_1.default.createElement(FooterColumn_1.FooterColumn, { key: "".concat(column.label, "_").concat(index), column: column })); }))));
21
21
  }
22
22
  exports.FooterColumns = FooterColumns;
23
23
  exports.FooterColumnsContainer = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n padding: 3em 20px 1em 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n max-width: 1200px;\n margin: 0 auto;\n\n ", " {\n padding: 5.625em 20px 3.9375em 20px;\n }\n\n ", " {\n color: black;\n display: none;\n }\n"], ["\n padding: 3em 20px 1em 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n max-width: 1200px;\n margin: 0 auto;\n\n ", " {\n padding: 5.625em 20px 3.9375em 20px;\n }\n\n ", " {\n color: black;\n display: none;\n }\n"])), function (_a) {
@@ -1,5 +1,7 @@
1
1
  /// <reference types="react" />
2
- import type { FooterConfig } from '@theme/types/portal';
3
- export declare function FooterCopyright({ copyrightText, }: {
4
- copyrightText?: FooterConfig['copyrightText'];
5
- }): JSX.Element | null;
2
+ import type { NavGroup } from '@theme/types/portal';
3
+ interface FooterCopyrightProps {
4
+ copyrightText: NavGroup;
5
+ }
6
+ export declare function FooterCopyright({ copyrightText }: FooterCopyrightProps): JSX.Element | null;
7
+ export {};
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
+ import { ResolvedConfigLinks } from '@theme/types/portal';
2
3
  interface NavbarProps {
3
- menu: React.ReactNode;
4
+ menu: ResolvedConfigLinks;
4
5
  logo: React.ReactNode;
5
6
  search: React.ReactNode;
6
7
  }
package/Navbar/Navbar.js CHANGED
@@ -10,11 +10,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.NavbarContainer = exports.Navbar = void 0;
11
11
  var react_1 = __importDefault(require("react"));
12
12
  var styled_components_1 = __importDefault(require("styled-components"));
13
+ var Navbar_1 = require("../Navbar");
13
14
  function Navbar(_a) {
14
15
  var menu = _a.menu, logo = _a.logo, search = _a.search;
15
16
  return (react_1.default.createElement(exports.NavbarContainer, { "data-component-name": "Navbar/Navbar" },
16
17
  logo,
17
- menu,
18
+ react_1.default.createElement(Navbar_1.NavbarMenu, { menuItems: menu }),
18
19
  search));
19
20
  }
20
21
  exports.Navbar = Navbar;
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import type { ResolvedNavLinkItem } from '@theme/types/portal';
3
+ interface NavbarDropdownProps {
4
+ items: ResolvedNavLinkItem[];
5
+ }
6
+ export declare function NavbarDropdown({ items }: NavbarDropdownProps): JSX.Element;
7
+ export declare const DropdownWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
8
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
+ return cooked;
5
+ };
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DropdownWrapper = exports.NavbarDropdown = void 0;
11
+ var react_1 = __importDefault(require("react"));
12
+ var styled_components_1 = __importDefault(require("styled-components"));
13
+ var Link_1 = require("../mocks/Link");
14
+ function NavbarDropdown(_a) {
15
+ var items = _a.items;
16
+ return (react_1.default.createElement(exports.DropdownWrapper, { "data-component-name": "Navbar/NavbarDropdown" }, items.map(function (item, index) { return (react_1.default.createElement("div", { key: "".concat(item.label, "_").concat(index) },
17
+ react_1.default.createElement(Link_1.Link, { to: item.link }, item.label))); })));
18
+ }
19
+ exports.NavbarDropdown = NavbarDropdown;
20
+ exports.DropdownWrapper = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: none;\n position: absolute;\n background: var(--navbar-item-active-background-color);\n border-radius: var(--navbar-item-border-radius);\n padding: 10px 15px;\n width: max-content;\n line-height: 1rem;\n box-shadow: var(--navbar-dropdown-shadow);\n & > div {\n text-align: left;\n padding: 10px 0px;\n cursor: pointer;\n a {\n color: var(--navbar-text-color);\n text-decoration: none;\n }\n :hover {\n text-decoration: underline;\n }\n }\n"], ["\n display: none;\n position: absolute;\n background: var(--navbar-item-active-background-color);\n border-radius: var(--navbar-item-border-radius);\n padding: 10px 15px;\n width: max-content;\n line-height: 1rem;\n box-shadow: var(--navbar-dropdown-shadow);\n & > div {\n text-align: left;\n padding: 10px 0px;\n cursor: pointer;\n a {\n color: var(--navbar-text-color);\n text-decoration: none;\n }\n :hover {\n text-decoration: underline;\n }\n }\n"])));
21
+ var templateObject_1;
@@ -1,40 +1,7 @@
1
1
  /// <reference types="react" />
2
- export declare enum MenuStyle {
3
- Drilldown = "drilldown"
4
- }
5
- export declare type ResolvedNavLinkItem = {
6
- type: 'link';
7
- link: string;
8
- label: string;
9
- items?: ResolvedNavItem[];
10
- external?: boolean;
11
- version?: string;
12
- default?: string;
13
- httpVerb?: string;
14
- separatorLine?: boolean;
15
- active?: boolean;
16
- };
17
- export declare type ResolvedNavGroupItem = {
18
- type: 'group';
19
- link?: string;
20
- label: string;
21
- items: ResolvedNavItem[];
22
- version?: string;
23
- default?: string;
24
- menuStyle?: MenuStyle;
25
- separatorLine?: boolean;
26
- active?: boolean;
27
- };
28
- export declare type ResolvedNavItem = ResolvedNavLinkItem | ResolvedNavGroupItem | {
29
- type: 'separator';
30
- label?: string;
31
- separatorLine?: boolean;
32
- } | {
33
- type: 'error';
34
- label: string;
35
- };
2
+ import type { ResolvedNavItem } from '@theme/types/portal';
36
3
  interface NavbarItemProps {
37
- navItem: ResolvedNavLinkItem;
4
+ navItem: ResolvedNavItem;
38
5
  }
39
- export declare function NavbarItem({ navItem }: NavbarItemProps): JSX.Element;
6
+ export declare function NavbarItem({ navItem }: NavbarItemProps): JSX.Element | null;
40
7
  export {};
@@ -7,35 +7,44 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.NavbarItem = exports.MenuStyle = void 0;
10
+ exports.NavbarItem = void 0;
11
11
  var react_1 = __importDefault(require("react"));
12
12
  var styled_components_1 = __importDefault(require("styled-components"));
13
13
  var react_router_dom_1 = require("react-router-dom");
14
14
  var Link_1 = require("../mocks/Link");
15
15
  var utils_1 = require("../mocks/utils");
16
- var MenuStyle;
17
- (function (MenuStyle) {
18
- MenuStyle["Drilldown"] = "drilldown";
19
- })(MenuStyle = exports.MenuStyle || (exports.MenuStyle = {}));
16
+ var NavbarDropdown_1 = require("../Navbar/NavbarDropdown");
20
17
  function NavbarItem(_a) {
21
18
  var navItem = _a.navItem;
22
19
  var pathname = (0, react_router_dom_1.useLocation)().pathname;
23
- var isActive = pathname === (0, utils_1.withPathPrefix)(navItem.link);
24
- return (react_1.default.createElement(NavMenuItem, { active: isActive, "data-component-name": "Navbar/NavbarItem" },
25
- react_1.default.createElement(NavLink, { to: navItem.link, active: isActive },
26
- react_1.default.createElement(NavLabel, null, navItem.label))));
20
+ if (navItem.link) {
21
+ var item = navItem;
22
+ var isActive = pathname === (0, utils_1.withPathPrefix)(item.link);
23
+ return (react_1.default.createElement(NavMenuItem, { active: isActive, "data-component-name": "Navbar/NavbarItem" },
24
+ react_1.default.createElement(NavLink, { to: item.link, active: isActive },
25
+ react_1.default.createElement(NavLabel, null, item.label))));
26
+ }
27
+ if (navItem.items) {
28
+ var item = navItem;
29
+ return (react_1.default.createElement(NavMenuItemWithDropdownWrapper, null,
30
+ react_1.default.createElement(NavMenuItem, { active: false, "data-component-name": "Navbar/NavbarItem" },
31
+ react_1.default.createElement(NavLabel, null, item.label)),
32
+ react_1.default.createElement(NavbarDropdown_1.NavbarDropdown, { items: item.items })));
33
+ }
34
+ return null;
27
35
  }
28
36
  exports.NavbarItem = NavbarItem;
29
- var NavMenuItem = styled_components_1.default.li(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: inline-block;\n padding: 20px calc(var(--sidebar-spacing-horizontal) * 2);\n text-align: center;\n line-height: 1;\n font-size: var(--navbar-item-font-size);\n margin-left: var(--navbar-item-margin-horizontal);\n margin-right: var(--navbar-item-margin-horizontal);\n border-radius: var(--navbar-item-border-radius);\n font-weight: var(--navbar-item-font-weight);\n background: ", ";\n"], ["\n display: inline-block;\n padding: 20px calc(var(--sidebar-spacing-horizontal) * 2);\n text-align: center;\n line-height: 1;\n font-size: var(--navbar-item-font-size);\n margin-left: var(--navbar-item-margin-horizontal);\n margin-right: var(--navbar-item-margin-horizontal);\n border-radius: var(--navbar-item-border-radius);\n font-weight: var(--navbar-item-font-weight);\n background: ", ";\n"])), function (_a) {
37
+ var NavMenuItemWithDropdownWrapper = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: inline-block;\n position: relative;\n border-radius: var(--navbar-item-border-radius);\n &:hover {\n background: var(--navbar-item-active-background-color);\n ", " {\n display: block;\n }\n }\n"], ["\n display: inline-block;\n position: relative;\n border-radius: var(--navbar-item-border-radius);\n &:hover {\n background: var(--navbar-item-active-background-color);\n ", " {\n display: block;\n }\n }\n"])), NavbarDropdown_1.DropdownWrapper);
38
+ var NavMenuItem = styled_components_1.default.li(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n display: inline-block;\n padding: 20px calc(var(--sidebar-spacing-horizontal) * 2);\n text-align: center;\n line-height: 1;\n font-size: var(--navbar-item-font-size);\n margin-left: var(--navbar-item-margin-horizontal);\n margin-right: var(--navbar-item-margin-horizontal);\n border-radius: var(--navbar-item-border-radius);\n font-weight: var(--navbar-item-font-weight);\n background: ", ";\n"], ["\n display: inline-block;\n padding: 20px calc(var(--sidebar-spacing-horizontal) * 2);\n text-align: center;\n line-height: 1;\n font-size: var(--navbar-item-font-size);\n margin-left: var(--navbar-item-margin-horizontal);\n margin-right: var(--navbar-item-margin-horizontal);\n border-radius: var(--navbar-item-border-radius);\n font-weight: var(--navbar-item-font-weight);\n background: ", ";\n"])), function (_a) {
30
39
  var active = _a.active;
31
40
  return (active ? 'var(--navbar-item-active-background-color)' : 'none');
32
41
  });
33
- var NavLink = (0, styled_components_1.default)(Link_1.Link)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n color: ", ";\n text-decoration: ", ";\n"], ["\n color: ", ";\n text-decoration: ", ";\n"])), function (_a) {
42
+ var NavLink = (0, styled_components_1.default)(Link_1.Link)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n color: ", ";\n text-decoration: ", ";\n"], ["\n color: ", ";\n text-decoration: ", ";\n"])), function (_a) {
34
43
  var active = _a.active;
35
44
  return active ? 'var(--navbar-item-active-text-color)' : 'var(--navbar-text-color)';
36
45
  }, function (_a) {
37
46
  var active = _a.active;
38
47
  return active ? 'var(--navbar-item-active-text-decoration)' : 'none';
39
48
  });
40
- var NavLabel = styled_components_1.default.span(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n cursor: pointer;\n vertical-align: middle;\n"], ["\n cursor: pointer;\n vertical-align: middle;\n"])));
41
- var templateObject_1, templateObject_2, templateObject_3;
49
+ var NavLabel = styled_components_1.default.span(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n cursor: pointer;\n vertical-align: middle;\n"], ["\n cursor: pointer;\n vertical-align: middle;\n"])));
50
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="react" />
2
+ import type { ResolvedConfigLinks } from '@theme/types/portal';
2
3
  export declare function NavbarMenu({ menuItems }: {
3
- menuItems: any[];
4
+ menuItems: ResolvedConfigLinks;
4
5
  }): JSX.Element | null;
@@ -17,7 +17,7 @@ function NavbarMenu(_a) {
17
17
  return null;
18
18
  }
19
19
  return (react_1.default.createElement(NavItemsContainer, { "data-component-name": "Navbar/NavbarMenu" }, menuItems.map(function (navItem, index) {
20
- return react_1.default.createElement(NavbarItem_1.NavbarItem, { key: index, "data-cy": navItem.label, navItem: navItem });
20
+ return (react_1.default.createElement(NavbarItem_1.NavbarItem, { key: "".concat(navItem.label, "_").concat(index), "data-cy": navItem.label, navItem: navItem }));
21
21
  })));
22
22
  }
23
23
  exports.NavbarMenu = NavbarMenu;
package/globalStyle.js CHANGED
@@ -22,7 +22,7 @@ var links = (0, styled_components_1.css)(templateObject_13 || (templateObject_13
22
22
  var openapiAndGraphqlDocs = (0, styled_components_1.css)(templateObject_14 || (templateObject_14 = __makeTemplateObject(["\n /* === ref docs and graphql docs specific === */\n\n /**\n * @tokens OpenAPI-GraphQL Logo\n */\n --logo-max-height: 285px;\n --logo-max-width: 285px;\n --logo-padding: 2px;\n\n /**\n * @tokens OpenAPI-GraphQL Layout\n */\n --layout-buttons-top-offset: 20px; // @presenter Spacing\n --layout-buttons-height: 36px; // @presenter Spacing\n --layout-buttons-width: 36px; // @presenter Spacing\n\n --layout-stacked-small-max-width: 90%;\n --layout-stacked-medium-max-width: 75%;\n --layout-stacked-large-max-width: 1200px;\n\n --layout-three-panel-small-max-width: 100%;\n --layout-three-panel-medium-max-width: 100%;\n --layout-three-panel-large-max-width: 1800px;\n\n --layout-middle-panel-small-max-width: none;\n --layout-middle-panel-medium-max-width: none;\n --layout-middle-panel-large-max-width: none;\n\n /**\n * @tokens OpenAPI-GraphQL Schema\n */\n --schema-lines-color: var(--global-border-color); // @presenter Color\n --schema-default-details-width: 70%;\n --schema-type-name-color: var(--color-content-secondary); // @presenter Color\n --schema-type-title-color: var(--color-content-secondary); // @presenter Color\n --schema-require-label-color: var(--color-error-900); // @presenter Color\n --schema-labels-text-size: 0.9em; // @presenter Spacing\n --schema-nesting-spacing: 1em; // @presenter Spacing\n --schema-nested-background-color: var(--color-secondary-200); // @presenter Color\n --schema-chevron-color: var(--color-content); // @presenter Color\n --schema-chevron-size: 9px; // @presenter Spacing\n\n --schema-controls-color: var(--color-emphasis-800); // @presenter Color\n --schema-controls-background-color: var(--color-secondary-400); // @presenter Color\n --schema-controls-hover-background-color: var(--color-secondary-500); // @presenter Color\n --schema-controls-border-color: var(--color-secondary-600); // @presenter Color\n\n --field-name-font-size: var(--code-font-size); // @presenter FontSize\n --field-name-font-family: var(--code-font-family); // @presenter FontFamily\n --field-example-color: var(--color-content); // @presenter Color\n --field-example-background-color: var(--inline-code-background-color); // @presenter Color\n --field-constraint-color: var(--color-content); // @presenter Color\n --field-constraint-background-color: var(--inline-code-background-color); // @presenter Color\n\n /**\n * @tokens OpenAPI-GraphQL Search\n * @presenter Color\n */\n --search-input-border-bottom: #e6e6e6;\n --search-results-background-color: #f2f2f2;\n --search-results-active-item-background-color: #e6e6e6;\n --search-marked-background-color: #ffff03;\n --search-popup-header-background-color: var(--color-secondary-200);\n --search-clear-button-background-color: var(--color-secondary-400);\n --search-clear-button-hover-background-color: var(--color-secondary-600);\n\n /*\n * @tokens OpenAPI-GraphQL Badge\n */\n --badge-color: var(--color-emphasis-100); // @presenter Color\n --badge-background-color: var(--color-primary-500); // @presenter Color\n --deprecated-badge-color: var(--color-emphasis-100); // @presenter Color\n --deprecated-badge-background-color: var(--color-warning-500); // @presenter Color\n\n --http-badge-font-size: 12px; // @presenter FontSize\n --http-badge-line-height: 20px; // @presenter LineHeight\n --http-badge-font-family: var(--code-font-family); // @presenter FontFamily\n --http-badge-font-weight: var(--font-weight-bold); // @presenter FontWeight\n --http-badge-border-radius: 16px; // @presenter BorderRadius\n --http-badge-color: var(--color-content-inverse); // @presenter Color\n\n --http-badge-menu-font-size: 8px; // @presenter FontSize\n --http-badge-menu-line-height: 14px; // @presenter FontSize\n\n /**\n * @tokens OpenAPI-GraphQL Other\n */\n --recursive-label-color: var(--color-warning-500); // @presenter Color\n --spinner-color: var(--color-primary-500); // @presenter Color\n --linear-progress-color: var(--color-accent-500); // @presenter Color\n --linear-progress-background-color: var(--color-accent-100); // @presenter Color\n\n /* Floating action button */\n --fab-color: #0065fb; // @presenter Color\n --fab-background-color: #f2f2f2; // @presenter Color\n\n // @tokens End\n"], ["\n /* === ref docs and graphql docs specific === */\n\n /**\n * @tokens OpenAPI-GraphQL Logo\n */\n --logo-max-height: 285px;\n --logo-max-width: 285px;\n --logo-padding: 2px;\n\n /**\n * @tokens OpenAPI-GraphQL Layout\n */\n --layout-buttons-top-offset: 20px; // @presenter Spacing\n --layout-buttons-height: 36px; // @presenter Spacing\n --layout-buttons-width: 36px; // @presenter Spacing\n\n --layout-stacked-small-max-width: 90%;\n --layout-stacked-medium-max-width: 75%;\n --layout-stacked-large-max-width: 1200px;\n\n --layout-three-panel-small-max-width: 100%;\n --layout-three-panel-medium-max-width: 100%;\n --layout-three-panel-large-max-width: 1800px;\n\n --layout-middle-panel-small-max-width: none;\n --layout-middle-panel-medium-max-width: none;\n --layout-middle-panel-large-max-width: none;\n\n /**\n * @tokens OpenAPI-GraphQL Schema\n */\n --schema-lines-color: var(--global-border-color); // @presenter Color\n --schema-default-details-width: 70%;\n --schema-type-name-color: var(--color-content-secondary); // @presenter Color\n --schema-type-title-color: var(--color-content-secondary); // @presenter Color\n --schema-require-label-color: var(--color-error-900); // @presenter Color\n --schema-labels-text-size: 0.9em; // @presenter Spacing\n --schema-nesting-spacing: 1em; // @presenter Spacing\n --schema-nested-background-color: var(--color-secondary-200); // @presenter Color\n --schema-chevron-color: var(--color-content); // @presenter Color\n --schema-chevron-size: 9px; // @presenter Spacing\n\n --schema-controls-color: var(--color-emphasis-800); // @presenter Color\n --schema-controls-background-color: var(--color-secondary-400); // @presenter Color\n --schema-controls-hover-background-color: var(--color-secondary-500); // @presenter Color\n --schema-controls-border-color: var(--color-secondary-600); // @presenter Color\n\n --field-name-font-size: var(--code-font-size); // @presenter FontSize\n --field-name-font-family: var(--code-font-family); // @presenter FontFamily\n --field-example-color: var(--color-content); // @presenter Color\n --field-example-background-color: var(--inline-code-background-color); // @presenter Color\n --field-constraint-color: var(--color-content); // @presenter Color\n --field-constraint-background-color: var(--inline-code-background-color); // @presenter Color\n\n /**\n * @tokens OpenAPI-GraphQL Search\n * @presenter Color\n */\n --search-input-border-bottom: #e6e6e6;\n --search-results-background-color: #f2f2f2;\n --search-results-active-item-background-color: #e6e6e6;\n --search-marked-background-color: #ffff03;\n --search-popup-header-background-color: var(--color-secondary-200);\n --search-clear-button-background-color: var(--color-secondary-400);\n --search-clear-button-hover-background-color: var(--color-secondary-600);\n\n /*\n * @tokens OpenAPI-GraphQL Badge\n */\n --badge-color: var(--color-emphasis-100); // @presenter Color\n --badge-background-color: var(--color-primary-500); // @presenter Color\n --deprecated-badge-color: var(--color-emphasis-100); // @presenter Color\n --deprecated-badge-background-color: var(--color-warning-500); // @presenter Color\n\n --http-badge-font-size: 12px; // @presenter FontSize\n --http-badge-line-height: 20px; // @presenter LineHeight\n --http-badge-font-family: var(--code-font-family); // @presenter FontFamily\n --http-badge-font-weight: var(--font-weight-bold); // @presenter FontWeight\n --http-badge-border-radius: 16px; // @presenter BorderRadius\n --http-badge-color: var(--color-content-inverse); // @presenter Color\n\n --http-badge-menu-font-size: 8px; // @presenter FontSize\n --http-badge-menu-line-height: 14px; // @presenter FontSize\n\n /**\n * @tokens OpenAPI-GraphQL Other\n */\n --recursive-label-color: var(--color-warning-500); // @presenter Color\n --spinner-color: var(--color-primary-500); // @presenter Color\n --linear-progress-color: var(--color-accent-500); // @presenter Color\n --linear-progress-background-color: var(--color-accent-100); // @presenter Color\n\n /* Floating action button */\n --fab-color: #0065fb; // @presenter Color\n --fab-background-color: #f2f2f2; // @presenter Color\n\n // @tokens End\n"])));
23
23
  var footer = (0, styled_components_1.css)(templateObject_15 || (templateObject_15 = __makeTemplateObject(["\n /**\n * @tokens Footer\n */\n --footer-background-color: var(--color-primary-500); // @presenter Color\n --footer-text-color: #fff; // @presenter Color\n\n // @tokens End\n"], ["\n /**\n * @tokens Footer\n */\n --footer-background-color: var(--color-primary-500); // @presenter Color\n --footer-text-color: #fff; // @presenter Color\n\n // @tokens End\n"])));
24
24
  var logo = (0, styled_components_1.css)(templateObject_16 || (templateObject_16 = __makeTemplateObject(["\n /**\n * @tokens Logo\n */\n --logo-height: 2rem; // @presenter Spacing\n --logo-margin: var(--sidebar-margin-left); // @presenter Spacing\n\n // @tokens End\n"], ["\n /**\n * @tokens Logo\n */\n --logo-height: 2rem; // @presenter Spacing\n --logo-margin: var(--sidebar-margin-left); // @presenter Spacing\n\n // @tokens End\n"])));
25
- var navbar = (0, styled_components_1.css)(templateObject_17 || (templateObject_17 = __makeTemplateObject(["\n /**\n * @tokens Navbar\n */\n --navbar-height: 60px; // @presenter Spacing\n --navbar-text-color: #fff; // @presenter Color\n --navbar-background-color: var(--color-primary-500); // @presenter Color\n\n /**\n * @tokens Navbar Item\n * */\n --navbar-item-font-size: 16px; // @presenter FontSize\n --navbar-item-margin-horizontal: 0; // @presenter Spacing\n --navbar-item-margin-vertical: 0; // @presenter Spacing\n --navbar-item-border-radius: 10px; // @presenter BorderRadius\n --navbar-item-font-weight: var(--font-weight-bold); // @presenter FontWeight\n --navbar-item-active-background-color: #1b75fa; // @presenter Color\n --navbar-item-active-text-color: var(--navbar-text-color); // @presenter Color\n --navbar-item-active-text-decoration: none;\n\n // @tokens End\n"], ["\n /**\n * @tokens Navbar\n */\n --navbar-height: 60px; // @presenter Spacing\n --navbar-text-color: #fff; // @presenter Color\n --navbar-background-color: var(--color-primary-500); // @presenter Color\n\n /**\n * @tokens Navbar Item\n * */\n --navbar-item-font-size: 16px; // @presenter FontSize\n --navbar-item-margin-horizontal: 0; // @presenter Spacing\n --navbar-item-margin-vertical: 0; // @presenter Spacing\n --navbar-item-border-radius: 10px; // @presenter BorderRadius\n --navbar-item-font-weight: var(--font-weight-bold); // @presenter FontWeight\n --navbar-item-active-background-color: #1b75fa; // @presenter Color\n --navbar-item-active-text-color: var(--navbar-text-color); // @presenter Color\n --navbar-item-active-text-decoration: none;\n\n // @tokens End\n"])));
25
+ var navbar = (0, styled_components_1.css)(templateObject_17 || (templateObject_17 = __makeTemplateObject(["\n /**\n * @tokens Navbar\n */\n --navbar-height: 60px; // @presenter Spacing\n --navbar-text-color: #fff; // @presenter Color\n --navbar-background-color: var(--color-primary-500); // @presenter Color\n --navbar-drowpdown-shadow: 4px 4px 15px -2px rgba(0, 0, 0, 0.5);\n\n /**\n * @tokens Navbar Item\n * */\n --navbar-item-font-size: 16px; // @presenter FontSize\n --navbar-item-margin-horizontal: 0; // @presenter Spacing\n --navbar-item-margin-vertical: 0; // @presenter Spacing\n --navbar-item-border-radius: 10px; // @presenter BorderRadius\n --navbar-item-font-weight: var(--font-weight-bold); // @presenter FontWeight\n --navbar-item-active-background-color: #1b75fa; // @presenter Color\n --navbar-item-active-text-color: var(--navbar-text-color); // @presenter Color\n --navbar-item-active-text-decoration: none;\n\n // @tokens End\n"], ["\n /**\n * @tokens Navbar\n */\n --navbar-height: 60px; // @presenter Spacing\n --navbar-text-color: #fff; // @presenter Color\n --navbar-background-color: var(--color-primary-500); // @presenter Color\n --navbar-drowpdown-shadow: 4px 4px 15px -2px rgba(0, 0, 0, 0.5);\n\n /**\n * @tokens Navbar Item\n * */\n --navbar-item-font-size: 16px; // @presenter FontSize\n --navbar-item-margin-horizontal: 0; // @presenter Spacing\n --navbar-item-margin-vertical: 0; // @presenter Spacing\n --navbar-item-border-radius: 10px; // @presenter BorderRadius\n --navbar-item-font-weight: var(--font-weight-bold); // @presenter FontWeight\n --navbar-item-active-background-color: #1b75fa; // @presenter Color\n --navbar-item-active-text-color: var(--navbar-text-color); // @presenter Color\n --navbar-item-active-text-decoration: none;\n\n // @tokens End\n"])));
26
26
  var toc = (0, styled_components_1.css)(templateObject_18 || (templateObject_18 = __makeTemplateObject(["\n /**\n * @tokens TOC\n * */\n --toc-width: 240px;\n\n // @tokens End\n"], ["\n /**\n * @tokens TOC\n * */\n --toc-width: 240px;\n\n // @tokens End\n"])));
27
27
  var markdown = (0, styled_components_1.css)(templateObject_19 || (templateObject_19 = __makeTemplateObject(["\n /**\n * @tokens Markdown\n * */\n --content-wrapper-max-width: 910px;\n --content-wrapper-padding-vertical: 25px; // @presenter Spacing\n --content-wrapper-padding-horizontal: 0px; // @presenter Spacing\n\n // @tokens End\n"], ["\n /**\n * @tokens Markdown\n * */\n --content-wrapper-max-width: 910px;\n --content-wrapper-padding-vertical: 25px; // @presenter Spacing\n --content-wrapper-padding-horizontal: 0px; // @presenter Spacing\n\n // @tokens End\n"])));
28
28
  var blockquote = (0, styled_components_1.css)(templateObject_20 || (templateObject_20 = __makeTemplateObject(["\n /**\n * @tokens Blockquote\n * */\n // TODO: fix typo\n --bloquote-margin-vertical: 1.5em; // @presenter Spacing\n --bloquote-margin-horizontal: 0; // @presenter Spacing\n --bloquote-padding-vertical: 0; // @presenter Spacing\n --bloquote-padding-horizontal: calc(var(--spacing-unit) * 4); // @presenter Spacing\n --bloquote-background-color: transparent; // @presenter Color\n\n // @tokens End\n"], ["\n /**\n * @tokens Blockquote\n * */\n // TODO: fix typo\n --bloquote-margin-vertical: 1.5em; // @presenter Spacing\n --bloquote-margin-horizontal: 0; // @presenter Spacing\n --bloquote-padding-vertical: 0; // @presenter Spacing\n --bloquote-padding-horizontal: calc(var(--spacing-unit) * 4); // @presenter Spacing\n --bloquote-background-color: transparent; // @presenter Color\n\n // @tokens End\n"])));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.1.17",
3
+ "version": "0.1.20",
4
4
  "description": "Shared UI components",
5
5
  "author": "team@redocly.com",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ import { CustomFooterNavItem } from '@theme/Footer/CustomFooterNavItem';
5
+ import { FooterCopyright } from '@theme/Footer/FooterCopyright';
6
+ import { NavGroupRecord, ResolvedNavItem } from '@theme/types/portal';
7
+
8
+ interface FooterProps {
9
+ data: NavGroupRecord;
10
+ }
11
+
12
+ export function CustomFooter({ data }: FooterProps): JSX.Element | null {
13
+ if (!data) {
14
+ return null;
15
+ }
16
+
17
+ return (
18
+ <FooterContainer data-component-name="Footer/CustomFooter">
19
+ {(data.links as ResolvedNavItem[]).map((navItem, index) => {
20
+ return (
21
+ <CustomFooterNavItem
22
+ key={`${navItem.label}_${index}`}
23
+ data-cy={navItem.label}
24
+ navItem={navItem}
25
+ />
26
+ );
27
+ })}
28
+ <FooterCopyright copyrightText={data.copyrightText} />
29
+ </FooterContainer>
30
+ );
31
+ }
32
+
33
+ const FooterContainer = styled.div`
34
+ list-style: none;
35
+ margin: 0;
36
+ padding: 0;
37
+ display: block;
38
+ background-color: var(--footer-background-color);
39
+ text-align: center;
40
+ font-family: var(--font-family-base);
41
+
42
+ ${({ theme }) => theme.mediaQueries.medium} {
43
+ display: block;
44
+ }
45
+ `;
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ import { Link } from '@portal/Link';
5
+ import type { ResolvedNavItem, ResolvedNavLinkItem } from '@theme/types/portal';
6
+
7
+ interface CustomFooterNavItemProps {
8
+ navItem: ResolvedNavItem;
9
+ }
10
+
11
+ export function CustomFooterNavItem({ navItem }: CustomFooterNavItemProps): JSX.Element {
12
+ const item = navItem as ResolvedNavLinkItem;
13
+
14
+ return (
15
+ <FooterItem data-component-name="Navbar/NavbarItem">
16
+ <FooterLink to={item.link}>
17
+ <FooterLabel>{item.label}</FooterLabel>
18
+ </FooterLink>
19
+ </FooterItem>
20
+ );
21
+ }
22
+
23
+ const FooterItem = styled.li`
24
+ display: inline-block;
25
+ text-align: center;
26
+ line-height: var(--line-height-base);
27
+ font-size: var(--navbar-item-font-size);
28
+ margin: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 3);
29
+ font-weight: var(--font-weight-regular);
30
+ `;
31
+
32
+ const FooterLink = styled(Link)`
33
+ color: var(--footer-text-color);
34
+ text-decoration: none;
35
+ `;
36
+
37
+ const FooterLabel = styled.span`
38
+ cursor: pointer;
39
+ vertical-align: middle;
40
+ `;
@@ -3,9 +3,13 @@ import styled from 'styled-components';
3
3
 
4
4
  import { FooterColumns } from '@theme/Footer/FooterColumns';
5
5
  import { FooterCopyright } from '@theme/Footer/FooterCopyright';
6
- import type { FooterConfig } from '@theme/types/portal';
6
+ import type { NavGroupRecord } from '@theme/types/portal';
7
7
 
8
- export function Footer({ columns, copyrightText }: FooterConfig): JSX.Element | null {
8
+ interface FooterProps {
9
+ data: NavGroupRecord;
10
+ }
11
+
12
+ export function Footer({ data: { columns, copyrightText } }: FooterProps): JSX.Element | null {
9
13
  if (!(columns?.length || copyrightText)) {
10
14
  return null;
11
15
  }
@@ -2,17 +2,17 @@ import React from 'react';
2
2
  import styled from 'styled-components';
3
3
 
4
4
  import { Link } from '@portal/Link';
5
- import type { FooterColumn as Column } from '@theme/types/portal';
5
+ import type { ResolvedNavItem } from '@theme/types/portal';
6
6
 
7
7
  interface FooterColumnProps {
8
- column: Column;
8
+ column: ResolvedNavItem;
9
9
  }
10
10
 
11
11
  export function FooterColumn({ column }: FooterColumnProps): JSX.Element {
12
12
  return (
13
13
  <FooterColumnContainer data-component-name="Footer/FooterColumn">
14
- <FooterColumnTitle>{column.group || column.label}</FooterColumnTitle>
15
- {column.items.map((columnItem, columnItemIndex) => {
14
+ <FooterColumnTitle>{column.label}</FooterColumnTitle>
15
+ {column?.items?.map((columnItem, columnItemIndex) => {
16
16
  if (columnItem.type === 'error') {
17
17
  return null;
18
18
  }
@@ -2,14 +2,14 @@ import React from 'react';
2
2
  import styled from 'styled-components';
3
3
 
4
4
  import { FooterColumn } from '@theme/Footer/FooterColumn';
5
- import type { FooterConfig } from '@theme/types/portal';
6
-
7
- export function FooterColumns({
8
- columns = [],
9
- }: {
10
- columns?: FooterConfig['columns'];
11
- }): JSX.Element | null {
12
- if (!columns?.length) {
5
+ import type { NavGroup } from '@theme/types/portal';
6
+
7
+ interface FooterColumnsProps {
8
+ columns: NavGroup;
9
+ }
10
+
11
+ export function FooterColumns({ columns }: FooterColumnsProps): JSX.Element | null {
12
+ if (typeof columns === 'string' || typeof columns === 'undefined' || !columns?.length) {
13
13
  return null;
14
14
  }
15
15
 
@@ -17,7 +17,7 @@ export function FooterColumns({
17
17
  <FooterColumnsContainer data-component-name="Footer/FooterColumns">
18
18
  <FooterRow>
19
19
  {columns.map((column, index) => (
20
- <FooterColumn key={index} column={column} />
20
+ <FooterColumn key={`${column.label}_${index}`} column={column} />
21
21
  ))}
22
22
  </FooterRow>
23
23
  </FooterColumnsContainer>
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
2
  import styled from 'styled-components';
3
3
 
4
- import type { FooterConfig } from '@theme/types/portal';
4
+ import type { NavGroup } from '@theme/types/portal';
5
5
 
6
- export function FooterCopyright({
7
- copyrightText = '',
8
- }: {
9
- copyrightText?: FooterConfig['copyrightText'];
10
- }): JSX.Element | null {
6
+ interface FooterCopyrightProps {
7
+ copyrightText: NavGroup;
8
+ }
9
+
10
+ export function FooterCopyright({ copyrightText = '' }: FooterCopyrightProps): JSX.Element | null {
11
11
  return copyrightText ? (
12
12
  <Wrapper data-component-name="Footer/FooterCopyright">{copyrightText}</Wrapper>
13
13
  ) : null;
@@ -1,8 +1,11 @@
1
1
  import React from 'react';
2
2
  import styled from 'styled-components';
3
3
 
4
+ import { ResolvedConfigLinks } from '@theme/types/portal';
5
+ import { NavbarMenu } from '@theme/Navbar';
6
+
4
7
  interface NavbarProps {
5
- menu: React.ReactNode;
8
+ menu: ResolvedConfigLinks;
6
9
  logo: React.ReactNode;
7
10
  search: React.ReactNode;
8
11
  }
@@ -11,7 +14,7 @@ export function Navbar({ menu, logo, search }: NavbarProps): JSX.Element {
11
14
  return (
12
15
  <NavbarContainer data-component-name="Navbar/Navbar">
13
16
  {logo}
14
- {menu}
17
+ <NavbarMenu menuItems={menu} />
15
18
  {search}
16
19
  </NavbarContainer>
17
20
  );