@financial-times/dotcom-ui-header 7.1.3 → 7.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/components/drawer/additionalPartials.js +9 -5
- package/dist/node/components/drawer/topLevelPartials.js +22 -12
- package/dist/node/components/navigation/partials.js +32 -14
- package/dist/node/components/sticky/partials.js +6 -3
- package/dist/node/components/sub-navigation/partials.js +5 -3
- package/dist/node/components/top/partials.js +4 -2
- package/package.json +2 -2
- package/src/components/drawer/additionalPartials.tsx +5 -5
- package/src/components/drawer/topLevelPartials.tsx +10 -6
- package/src/components/navigation/partials.tsx +14 -10
- package/src/components/sticky/partials.tsx +2 -2
- package/src/components/sub-navigation/partials.tsx +15 -10
- package/src/components/top/partials.tsx +2 -2
|
@@ -7,24 +7,28 @@ exports.SubscribeButton = exports.EditionsSwitcher = exports.DrawerSpecialItem =
|
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const utils_1 = require("../../utils");
|
|
9
9
|
exports.DrawerParentItem = ({ item, idSuffix }) => {
|
|
10
|
+
var _a, _b;
|
|
10
11
|
const selected = item.selected ? 'selected' : 'unselected';
|
|
11
12
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
12
13
|
react_1.default.createElement("div", { key: item.url, className: "o-header__drawer-menu-toggle-wrapper" },
|
|
13
|
-
react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--parent`, href: item.url }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label),
|
|
14
|
+
react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--parent`, href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label),
|
|
14
15
|
react_1.default.createElement("button", { className: `o-header__drawer-menu-toggle o-header__drawer-menu-toggle--${selected}`, "aria-controls": `o-header-drawer-child-${idSuffix}`, "data-trackable": `sub-level-toggle | ${item.label}` }, `Show more ${item.label}`)),
|
|
15
|
-
react_1.default.createElement("ul", { className: "o-header__drawer-menu-list o-header__drawer-menu-list--child", id: `o-header-drawer-child-${idSuffix}`, "data-trackable": "sub-level" }, item.submenu.items.map((item) => {
|
|
16
|
+
react_1.default.createElement("ul", { className: "o-header__drawer-menu-list o-header__drawer-menu-list--child", id: `o-header-drawer-child-${idSuffix}`, "data-trackable": "sub-level" }, ((_b = item.submenu) === null || _b === void 0 ? void 0 : _b.items).map((item) => {
|
|
17
|
+
var _a;
|
|
16
18
|
const selected = item.selected ? 'selected' : 'unselected';
|
|
17
19
|
return (react_1.default.createElement("li", { key: item.url, className: "o-header__drawer-menu-item" },
|
|
18
|
-
react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--child`, href: item.url, "data-trackable": item.label }, utils_1.ariaSelected(item)), item.label)));
|
|
20
|
+
react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--child`, href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, utils_1.ariaSelected(item)), item.label)));
|
|
19
21
|
}))));
|
|
20
22
|
};
|
|
21
23
|
exports.DrawerSingleItem = (item) => {
|
|
24
|
+
var _a;
|
|
22
25
|
const selected = item.selected ? 'selected' : 'unselected';
|
|
23
|
-
return (react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected}`, href: item.url, "data-trackable": item.label }, utils_1.ariaSelected(item)), item.label));
|
|
26
|
+
return (react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected}`, href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, utils_1.ariaSelected(item)), item.label));
|
|
24
27
|
};
|
|
25
28
|
exports.DrawerSpecialItem = (item) => {
|
|
29
|
+
var _a;
|
|
26
30
|
const selected = item.selected ? 'selected' : 'unselected';
|
|
27
|
-
return (react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--secondary`, href: item.url, "data-trackable": item.label }, utils_1.ariaSelected(item)), item.label));
|
|
31
|
+
return (react_1.default.createElement("a", Object.assign({ className: `o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--secondary`, href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, utils_1.ariaSelected(item)), item.label));
|
|
28
32
|
};
|
|
29
33
|
exports.EditionsSwitcher = (editions) => (react_1.default.createElement("ul", { className: "o-header__drawer-menu-list" }, editions.others.map(({ id, name, url }) => {
|
|
30
34
|
const href = `${url}?edition=${id}`;
|
|
@@ -20,7 +20,7 @@ const Drawer = (props) => {
|
|
|
20
20
|
react_1.default.createElement(Search, null),
|
|
21
21
|
react_1.default.createElement("nav", { className: "o-header__drawer-menu o-header__drawer-menu--primary o-header__drawer-menu--border" },
|
|
22
22
|
editions && react_1.default.createElement(additionalPartials_1.EditionsSwitcher, Object.assign({}, editions)),
|
|
23
|
-
react_1.default.createElement("ul", { className: "o-header__drawer-menu-list" },
|
|
23
|
+
react_1.default.createElement("ul", { "data-component": "drawer-menu--primary__drawer-menu-list", className: "o-header__drawer-menu-list" },
|
|
24
24
|
primary ? react_1.default.createElement(SectionPrimary, Object.assign({}, primary)) : null,
|
|
25
25
|
secondary ? react_1.default.createElement(SectionSecondary, Object.assign({}, secondary)) : null,
|
|
26
26
|
tertiary ? react_1.default.createElement(SectionTertiary, Object.assign({}, tertiary)) : null)),
|
|
@@ -41,18 +41,28 @@ const Search = () => (react_1.default.createElement("div", { className: "o-heade
|
|
|
41
41
|
react_1.default.createElement("button", { className: "o-header__drawer-search-submit", type: "submit", "data-trackable": "search-submit" },
|
|
42
42
|
react_1.default.createElement("span", { className: "o-header__visually-hidden" }, "Search")))));
|
|
43
43
|
const SectionPrimary = (props) => {
|
|
44
|
+
var _a;
|
|
44
45
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
45
46
|
react_1.default.createElement("li", { className: "o-header__drawer-menu-item o-header__drawer-menu-item--heading" }, props.label),
|
|
46
|
-
props.submenu.items.map((item, index) => (react_1.default.createElement("li", { key: item.url, className: "o-header__drawer-menu-item" }, item.submenu ? (react_1.default.createElement(additionalPartials_1.DrawerParentItem, { item: item, idSuffix: `${index}` })) : (react_1.default.createElement(additionalPartials_1.DrawerSingleItem, Object.assign({}, item))))))));
|
|
47
|
+
((_a = props.submenu) === null || _a === void 0 ? void 0 : _a.items).map((item, index) => (react_1.default.createElement("li", { key: item.url, className: "o-header__drawer-menu-item" }, item.submenu ? (react_1.default.createElement(additionalPartials_1.DrawerParentItem, { item: item, idSuffix: `${index}` })) : (react_1.default.createElement(additionalPartials_1.DrawerSingleItem, Object.assign({}, item))))))));
|
|
48
|
+
};
|
|
49
|
+
const SectionSecondary = (props) => {
|
|
50
|
+
var _a;
|
|
51
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
52
|
+
react_1.default.createElement("li", { className: "o-header__drawer-menu-item o-header__drawer-menu-item--heading" }, props.label),
|
|
53
|
+
((_a = props.submenu) === null || _a === void 0 ? void 0 : _a.items).map((item, index) => (react_1.default.createElement("li", { key: item.url, className: "o-header__drawer-menu-item" }, item.submenu ? (react_1.default.createElement(additionalPartials_1.DrawerParentItem, { item: item, idSuffix: 'inner' + index })) : (react_1.default.createElement(additionalPartials_1.DrawerSingleItem, Object.assign({}, item))))))));
|
|
54
|
+
};
|
|
55
|
+
const SectionTertiary = (props) => {
|
|
56
|
+
var _a;
|
|
57
|
+
return (react_1.default.createElement(react_1.default.Fragment, null, ((_a = props.submenu) === null || _a === void 0 ? void 0 : _a.items).map((item, index) => {
|
|
58
|
+
const divideItem = index === 0 ? 'o-header__drawer-menu-item--divide' : '';
|
|
59
|
+
return (react_1.default.createElement("li", { "data-component": divideItem ? 'drawer-menu-item--divide' : undefined, key: item.url, className: `o-header__drawer-menu-item ${divideItem}` },
|
|
60
|
+
react_1.default.createElement(additionalPartials_1.DrawerSpecialItem, Object.assign({}, item))));
|
|
61
|
+
})));
|
|
47
62
|
};
|
|
48
|
-
const SectionSecondary = (props) => (react_1.default.createElement(react_1.default.Fragment, null,
|
|
49
|
-
react_1.default.createElement("li", { className: "o-header__drawer-menu-item o-header__drawer-menu-item--heading" }, props.label),
|
|
50
|
-
props.submenu.items.map((item, index) => (react_1.default.createElement("li", { key: item.url, className: "o-header__drawer-menu-item" }, item.submenu ? (react_1.default.createElement(additionalPartials_1.DrawerParentItem, { item: item, idSuffix: 'inner' + index })) : (react_1.default.createElement(additionalPartials_1.DrawerSingleItem, Object.assign({}, item))))))));
|
|
51
|
-
const SectionTertiary = (props) => (react_1.default.createElement(react_1.default.Fragment, null, props.submenu.items.map((item, index) => {
|
|
52
|
-
const divideItem = index === 0 ? 'o-header__drawer-menu-item--divide' : '';
|
|
53
|
-
return (react_1.default.createElement("li", { key: item.url, className: `o-header__drawer-menu-item ${divideItem}` },
|
|
54
|
-
react_1.default.createElement(additionalPartials_1.DrawerSpecialItem, Object.assign({}, item))));
|
|
55
|
-
})));
|
|
56
63
|
const UserMenu = (props) => (react_1.default.createElement("nav", { className: "o-header__drawer-menu o-header__drawer-menu--user", "data-trackable": "user-nav" },
|
|
57
|
-
react_1.default.createElement("ul", { className: "o-header__drawer-menu-list" }, props.items.map((item) =>
|
|
58
|
-
|
|
64
|
+
react_1.default.createElement("ul", { className: "o-header__drawer-menu-list" }, props.items.map((item) => {
|
|
65
|
+
var _a;
|
|
66
|
+
return (react_1.default.createElement("li", { key: item.url, className: "o-header__drawer-menu-item" },
|
|
67
|
+
react_1.default.createElement("a", { className: "o-header__drawer-menu-link", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, item.label)));
|
|
68
|
+
}))));
|
|
@@ -9,28 +9,37 @@ const utils_1 = require("../../utils");
|
|
|
9
9
|
const MobileNav = (props) => {
|
|
10
10
|
// Only display navigation on pages which are included in this menu
|
|
11
11
|
const targetUrls = props.data['navbar-simple'].items.map((item) => item.url);
|
|
12
|
-
return targetUrls.includes(props.data.currentPath) ? (react_1.default.createElement(NavMobile, { items: props.data['navbar-simple'].items })) : null;
|
|
12
|
+
return props.data.currentPath && targetUrls.includes(props.data.currentPath) ? (react_1.default.createElement(NavMobile, { items: props.data['navbar-simple'].items })) : null;
|
|
13
13
|
};
|
|
14
14
|
exports.MobileNav = MobileNav;
|
|
15
15
|
const NavMobile = ({ items }) => {
|
|
16
16
|
return (react_1.default.createElement("nav", { id: "o-header-nav-mobile", className: "o-header__row o-header__nav o-header__nav--mobile", "aria-hidden": "true", "data-trackable": "header-nav:mobile" },
|
|
17
|
-
react_1.default.createElement("ul", { className: "o-header__nav-list" }, items.map((item, index) =>
|
|
18
|
-
|
|
17
|
+
react_1.default.createElement("ul", { className: "o-header__nav-list" }, items.map((item, index) => {
|
|
18
|
+
var _a;
|
|
19
|
+
return (react_1.default.createElement("li", { className: "o-header__nav-item", key: `link-${index}` },
|
|
20
|
+
react_1.default.createElement("a", Object.assign({ className: "o-header__nav-link o-header__nav-link--primary", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label)));
|
|
21
|
+
}))));
|
|
19
22
|
};
|
|
20
23
|
const NavDesktop = (props) => (react_1.default.createElement("nav", { id: "o-header-nav-desktop", className: "o-header__row o-header__nav o-header__nav--desktop", role: "navigation", "aria-label": "Primary navigation", "data-trackable": "header-nav:desktop" },
|
|
21
24
|
react_1.default.createElement("div", { className: "o-header__container" }, props.children)));
|
|
22
25
|
exports.NavDesktop = NavDesktop;
|
|
23
|
-
const NavListLeft = (props) => (react_1.default.createElement("ul", { className: "o-header__nav-list o-header__nav-list--left", "data-trackable": "primary-nav" }, props.data.navbar.items.map((item, index) =>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
const NavListLeft = (props) => (react_1.default.createElement("ul", { className: "o-header__nav-list o-header__nav-list--left", "data-trackable": "primary-nav" }, props.data.navbar.items.map((item, index) => {
|
|
27
|
+
var _a;
|
|
28
|
+
return (react_1.default.createElement("li", { className: "o-header__nav-item", key: `link-${index}` },
|
|
29
|
+
react_1.default.createElement("a", Object.assign({ className: "o-header__nav-link o-header__nav-link--primary", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, id: `o-header-link-${index}` }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label),
|
|
30
|
+
props.showMegaNav && Array.isArray(item.meganav) ? (react_1.default.createElement(MegaNav, { meganav: item.meganav, label: item.label, index: index })) : null));
|
|
31
|
+
})));
|
|
26
32
|
exports.NavListLeft = NavListLeft;
|
|
27
33
|
const NavListRight = (props) => {
|
|
28
34
|
return props.userIsLoggedIn ? react_1.default.createElement(NavListRightLoggedIn, { items: props.data['navbar-right'].items }) : null;
|
|
29
35
|
};
|
|
30
36
|
exports.NavListRight = NavListRight;
|
|
31
37
|
const NavListRightLoggedIn = ({ items }) => {
|
|
32
|
-
return (react_1.default.createElement("ul", { className: "o-header__nav-list o-header__nav-list--right", "data-trackable": "user-nav" }, items.map((item, index) =>
|
|
33
|
-
|
|
38
|
+
return (react_1.default.createElement("ul", { "data-component": "nav-list--right", className: "o-header__nav-list o-header__nav-list--right", "data-trackable": "user-nav" }, items.map((item, index) => {
|
|
39
|
+
var _a;
|
|
40
|
+
return (react_1.default.createElement("li", { className: "o-header__nav-item", key: `link-${index}` },
|
|
41
|
+
react_1.default.createElement("a", { className: "o-header__nav-link", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, item.label)));
|
|
42
|
+
})));
|
|
34
43
|
};
|
|
35
44
|
const MegaNav = ({ label, meganav, index }) => {
|
|
36
45
|
const sections = meganav.find(({ component }) => component === 'sectionlist');
|
|
@@ -45,20 +54,29 @@ const SectionList = ({ title, data }) => {
|
|
|
45
54
|
return (react_1.default.createElement("div", { className: "o-header__mega-column o-header__mega-column--subsections", "data-trackable": "sections" },
|
|
46
55
|
react_1.default.createElement("div", { className: "o-header__mega-heading" }, title),
|
|
47
56
|
react_1.default.createElement("div", { className: "o-header__mega-content" },
|
|
48
|
-
react_1.default.createElement("ul", { className: "o-header__mega-list" }, data.map((column) => column.map((item, index) =>
|
|
49
|
-
|
|
57
|
+
react_1.default.createElement("ul", { className: "o-header__mega-list" }, data === null || data === void 0 ? void 0 : data.map((column) => column.map((item, index) => {
|
|
58
|
+
var _a;
|
|
59
|
+
return (react_1.default.createElement("li", { className: "o-header__mega-item", key: `link-${index}` },
|
|
60
|
+
react_1.default.createElement("a", Object.assign({ className: "o-header__mega-link", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined }, utils_1.ariaSelected(item), { "data-trackable": "link" }), item.label)));
|
|
61
|
+
}))))));
|
|
50
62
|
};
|
|
51
63
|
const ArticleList = ({ title, data }) => {
|
|
52
64
|
return (react_1.default.createElement("div", { className: "o-header__mega-column o-header__mega-column--articles", "data-trackable": "popular" },
|
|
53
65
|
react_1.default.createElement("div", { className: "o-header__mega-heading" }, title),
|
|
54
66
|
react_1.default.createElement("div", { className: "o-header__mega-content" },
|
|
55
|
-
react_1.default.createElement("ul", { className: "o-header__mega-list" }, data.map((item, index) =>
|
|
56
|
-
|
|
67
|
+
react_1.default.createElement("ul", { className: "o-header__mega-list" }, data === null || data === void 0 ? void 0 : data.map((item, index) => {
|
|
68
|
+
var _a;
|
|
69
|
+
return (react_1.default.createElement("li", { className: "o-header__mega-item", key: `link-${index}` },
|
|
70
|
+
react_1.default.createElement("a", Object.assign({ className: "o-header__mega-link", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined }, utils_1.ariaSelected(item), { "data-trackable": "link" }), item.label)));
|
|
71
|
+
})))));
|
|
57
72
|
};
|
|
58
73
|
const UserActionsNav = (props) => {
|
|
59
74
|
const userNavItems = props.data['navbar-right-anon'].items;
|
|
60
75
|
return (react_1.default.createElement("div", { className: "o-header__row o-header__anon", "data-trackable": "header-anon" },
|
|
61
|
-
react_1.default.createElement("ul", { className: "o-header__anon-list" }, userNavItems.map((item, index) =>
|
|
62
|
-
|
|
76
|
+
react_1.default.createElement("ul", { className: "o-header__anon-list" }, userNavItems.map((item, index) => {
|
|
77
|
+
var _a;
|
|
78
|
+
return (react_1.default.createElement("li", { className: "o-header__anon-item", key: `link-${index}` },
|
|
79
|
+
react_1.default.createElement("a", { className: "o-header__anon-link", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, item.label)));
|
|
80
|
+
}))));
|
|
63
81
|
};
|
|
64
82
|
exports.UserActionsNav = UserActionsNav;
|
|
@@ -16,8 +16,11 @@ const SearchIconSticky = () => (react_1.default.createElement("a", { href: "#",
|
|
|
16
16
|
react_1.default.createElement("span", { className: "o-header__top-link-label" }, "Search")));
|
|
17
17
|
const Navigation = (props) => (react_1.default.createElement("div", { className: "o-header__top-takeover" },
|
|
18
18
|
react_1.default.createElement("div", { className: "o-header__nav" },
|
|
19
|
-
react_1.default.createElement("ul", { className: "o-header__nav-list o-header__nav-list--left", "data-trackable": "primary-nav" }, props.data.navbar.items.map((item, index) =>
|
|
20
|
-
|
|
19
|
+
react_1.default.createElement("ul", { className: "o-header__nav-list o-header__nav-list--left", "data-trackable": "primary-nav" }, props.data.navbar.items.map((item, index) => {
|
|
20
|
+
var _a;
|
|
21
|
+
return (react_1.default.createElement("li", { className: "o-header__nav-item", key: `link-${index}` },
|
|
22
|
+
react_1.default.createElement("a", { className: "o-header__nav-link o-header__nav-link--primary", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label, tabIndex: -1 }, item.label)));
|
|
23
|
+
})))));
|
|
21
24
|
const Logo = () => (react_1.default.createElement("a", { className: "o-header__top-logo o-header__hide--L", "data-trackable": "logo", href: "/", title: "Go to Financial Times homepage", tabIndex: -1 },
|
|
22
25
|
react_1.default.createElement("span", { className: "o-header__visually-hidden" }, "Financial Times")));
|
|
23
26
|
const NavListRightAnonSticky = (props) => {
|
|
@@ -57,7 +60,7 @@ const NavListRightLoggedInSticky = (props) => {
|
|
|
57
60
|
// - The sticky header renders either the `navbar-right-anon` data or the myFT component
|
|
58
61
|
// - The normal header renders either the `navbar-right-anon` or the `navbar-right` data
|
|
59
62
|
const TopColumnRightSticky = (props) => {
|
|
60
|
-
let children =
|
|
63
|
+
let children = undefined;
|
|
61
64
|
if (props.userIsLoggedIn) {
|
|
62
65
|
children = react_1.default.createElement(NavListRightLoggedInSticky, Object.assign({}, props));
|
|
63
66
|
}
|
|
@@ -18,10 +18,11 @@ const SubNavigationWrapper = (props) => (react_1.default.createElement("div", {
|
|
|
18
18
|
react_1.default.createElement("div", { className: "o-header__subnav-content" }, props.children)),
|
|
19
19
|
react_1.default.createElement("button", { className: "o-header__subnav-button o-header__subnav-button--left", title: "scroll left", "aria-label": "scroll left", "aria-hidden": "true", disabled: true }),
|
|
20
20
|
react_1.default.createElement("button", { className: "o-header__subnav-button o-header__subnav-button--right", title: "scroll right", "aria-label": "scroll right", "aria-hidden": "true", disabled: true })))));
|
|
21
|
-
const BreadCrumb = ({ items }) => (react_1.default.createElement("ol", { className: "o-header__subnav-list o-header__subnav-list--breadcrumb", "aria-label": "Breadcrumb", "data-trackable": "breadcrumb" }, items.map((item, index) => {
|
|
21
|
+
const BreadCrumb = ({ items }) => (react_1.default.createElement("ol", { className: "o-header__subnav-list o-header__subnav-list--breadcrumb", "aria-label": "Breadcrumb", "data-trackable": "breadcrumb" }, items === null || items === void 0 ? void 0 : items.map((item, index) => {
|
|
22
|
+
var _a;
|
|
22
23
|
const selected = item.selected ? 'o-header__subnav-link--highlight' : '';
|
|
23
24
|
return (react_1.default.createElement("li", { className: "o-header__subnav-item", key: `item-${index}` },
|
|
24
|
-
react_1.default.createElement("a", Object.assign({ className: `o-header__subnav-link ${selected}`, href: item.url }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label)));
|
|
25
|
+
react_1.default.createElement("a", Object.assign({ className: `o-header__subnav-link ${selected}`, href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label)));
|
|
25
26
|
})));
|
|
26
27
|
const SubSections = ({ items, rightAlignment }) => {
|
|
27
28
|
if (!items || items.length === 0) {
|
|
@@ -29,8 +30,9 @@ const SubSections = ({ items, rightAlignment }) => {
|
|
|
29
30
|
}
|
|
30
31
|
return (react_1.default.createElement("ul", { className: 'o-header__subnav-list o-header__subnav-list--children' +
|
|
31
32
|
(rightAlignment ? ' o-header__subnav-list--right' : ''), "aria-label": rightAlignment ? 'Additional Sub Navigation' : 'Subsections', "data-trackable": "subsections" }, items.map((item, index) => {
|
|
33
|
+
var _a;
|
|
32
34
|
const selected = item.selected ? 'o-header__subnav-link--highlight' : '';
|
|
33
35
|
return (react_1.default.createElement("li", { className: "o-header__subnav-item", key: `item-${index}` },
|
|
34
|
-
react_1.default.createElement("a", Object.assign({ className: `o-header__subnav-link ${selected}`, href: item.url }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label)));
|
|
36
|
+
react_1.default.createElement("a", Object.assign({ className: `o-header__subnav-link ${selected}`, href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined }, utils_1.ariaSelected(item), { "data-trackable": item.label }), item.label)));
|
|
35
37
|
})));
|
|
36
38
|
};
|
|
@@ -38,16 +38,18 @@ const TopColumnRightLoggedIn = (props) => {
|
|
|
38
38
|
react_1.default.createElement(MyFt, { className: "" })));
|
|
39
39
|
};
|
|
40
40
|
const SignInLink = ({ item, variant, className }) => {
|
|
41
|
+
var _a;
|
|
41
42
|
const setTabIndex = variant === 'sticky' ? { tabIndex: -1 } : null;
|
|
42
|
-
return (react_1.default.createElement("a", Object.assign({ className: `o-header__top-link ${className}`, href: item.url, "data-trackable": item.label }, setTabIndex), item.label));
|
|
43
|
+
return (react_1.default.createElement("a", Object.assign({ className: `o-header__top-link ${className}`, href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, setTabIndex), item.label));
|
|
43
44
|
};
|
|
44
45
|
exports.SignInLink = SignInLink;
|
|
45
46
|
const SubscribeButton = ({ item, variant, className }) => {
|
|
47
|
+
var _a;
|
|
46
48
|
const setTabIndex = variant === 'sticky' ? { tabIndex: -1 } : null;
|
|
47
49
|
return (react_1.default.createElement("a", Object.assign({ className: `o-header__top-button ${className}`,
|
|
48
50
|
// Added as the result of a DAC audit. This will be confusing for users of voice activation software
|
|
49
51
|
// as it looks like a button but behaves like a link without this role.
|
|
50
|
-
role: "button", href: item.url, "data-trackable": item.label }, setTabIndex), item.label));
|
|
52
|
+
role: "button", href: (_a = item.url) !== null && _a !== void 0 ? _a : undefined, "data-trackable": item.label }, setTabIndex), item.label));
|
|
51
53
|
};
|
|
52
54
|
exports.SubscribeButton = SubscribeButton;
|
|
53
55
|
const TopColumnRightAnon = ({ items, variant }) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@financial-times/dotcom-ui-header",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.2.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"browser": "browser.js",
|
|
6
6
|
"main": "component.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"author": "",
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@financial-times/dotcom-types-navigation": "^7.
|
|
26
|
+
"@financial-times/dotcom-types-navigation": "^7.2.4",
|
|
27
27
|
"n-topic-search": "^4.0.0",
|
|
28
28
|
"n-ui-foundations": "^9.0.0"
|
|
29
29
|
},
|
|
@@ -14,7 +14,7 @@ export const DrawerParentItem = ({ item, idSuffix }: TDrawerParentItemProps) =>
|
|
|
14
14
|
<div key={item.url} className="o-header__drawer-menu-toggle-wrapper">
|
|
15
15
|
<a
|
|
16
16
|
className={`o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--parent`}
|
|
17
|
-
href={item.url}
|
|
17
|
+
href={item.url ?? undefined}
|
|
18
18
|
{...ariaSelected(item)}
|
|
19
19
|
data-trackable={item.label}
|
|
20
20
|
>
|
|
@@ -33,13 +33,13 @@ export const DrawerParentItem = ({ item, idSuffix }: TDrawerParentItemProps) =>
|
|
|
33
33
|
id={`o-header-drawer-child-${idSuffix}`}
|
|
34
34
|
data-trackable="sub-level"
|
|
35
35
|
>
|
|
36
|
-
{(item.submenu
|
|
36
|
+
{(item.submenu?.items as TNavMenuItem[]).map((item) => {
|
|
37
37
|
const selected = item.selected ? 'selected' : 'unselected'
|
|
38
38
|
return (
|
|
39
39
|
<li key={item.url} className="o-header__drawer-menu-item">
|
|
40
40
|
<a
|
|
41
41
|
className={`o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--child`}
|
|
42
|
-
href={item.url}
|
|
42
|
+
href={item.url ?? undefined}
|
|
43
43
|
data-trackable={item.label}
|
|
44
44
|
{...ariaSelected(item)}
|
|
45
45
|
>
|
|
@@ -58,7 +58,7 @@ export const DrawerSingleItem = (item: TNavMenuItem) => {
|
|
|
58
58
|
return (
|
|
59
59
|
<a
|
|
60
60
|
className={`o-header__drawer-menu-link o-header__drawer-menu-link--${selected}`}
|
|
61
|
-
href={item.url}
|
|
61
|
+
href={item.url ?? undefined}
|
|
62
62
|
data-trackable={item.label}
|
|
63
63
|
{...ariaSelected(item)}
|
|
64
64
|
>
|
|
@@ -72,7 +72,7 @@ export const DrawerSpecialItem = (item: TNavMenuItem) => {
|
|
|
72
72
|
return (
|
|
73
73
|
<a
|
|
74
74
|
className={`o-header__drawer-menu-link o-header__drawer-menu-link--${selected} o-header__drawer-menu-link--secondary`}
|
|
75
|
-
href={item.url}
|
|
75
|
+
href={item.url ?? undefined}
|
|
76
76
|
data-trackable={item.label}
|
|
77
77
|
{...ariaSelected(item)}
|
|
78
78
|
>
|
|
@@ -34,7 +34,7 @@ const Drawer = (props: THeaderProps) => {
|
|
|
34
34
|
<Search />
|
|
35
35
|
<nav className="o-header__drawer-menu o-header__drawer-menu--primary o-header__drawer-menu--border">
|
|
36
36
|
{editions && <EditionsSwitcher {...editions} />}
|
|
37
|
-
<ul className="o-header__drawer-menu-list">
|
|
37
|
+
<ul data-component="drawer-menu--primary__drawer-menu-list" className="o-header__drawer-menu-list">
|
|
38
38
|
{primary ? <SectionPrimary {...primary} /> : null}
|
|
39
39
|
{secondary ? <SectionSecondary {...secondary} /> : null}
|
|
40
40
|
{tertiary ? <SectionTertiary {...tertiary} /> : null}
|
|
@@ -102,7 +102,7 @@ const SectionPrimary = (props: TNavMenuItem) => {
|
|
|
102
102
|
return (
|
|
103
103
|
<React.Fragment>
|
|
104
104
|
<li className="o-header__drawer-menu-item o-header__drawer-menu-item--heading">{props.label}</li>
|
|
105
|
-
{(props.submenu
|
|
105
|
+
{(props.submenu?.items as TNavMenuItem[]).map((item, index) => (
|
|
106
106
|
<li key={item.url} className="o-header__drawer-menu-item">
|
|
107
107
|
{item.submenu ? (
|
|
108
108
|
<DrawerParentItem item={item} idSuffix={`${index}`} />
|
|
@@ -118,7 +118,7 @@ const SectionPrimary = (props: TNavMenuItem) => {
|
|
|
118
118
|
const SectionSecondary = (props: TNavMenuItem) => (
|
|
119
119
|
<React.Fragment>
|
|
120
120
|
<li className="o-header__drawer-menu-item o-header__drawer-menu-item--heading">{props.label}</li>
|
|
121
|
-
{(props.submenu
|
|
121
|
+
{(props.submenu?.items as TNavMenuItem[]).map((item, index) => (
|
|
122
122
|
<li key={item.url} className="o-header__drawer-menu-item">
|
|
123
123
|
{item.submenu ? (
|
|
124
124
|
<DrawerParentItem item={item} idSuffix={'inner' + index} />
|
|
@@ -132,11 +132,15 @@ const SectionSecondary = (props: TNavMenuItem) => (
|
|
|
132
132
|
|
|
133
133
|
const SectionTertiary = (props: TNavMenuItem) => (
|
|
134
134
|
<React.Fragment>
|
|
135
|
-
{(props.submenu
|
|
135
|
+
{(props.submenu?.items as TNavMenuItem[]).map((item, index) => {
|
|
136
136
|
const divideItem = index === 0 ? 'o-header__drawer-menu-item--divide' : ''
|
|
137
137
|
|
|
138
138
|
return (
|
|
139
|
-
<li
|
|
139
|
+
<li
|
|
140
|
+
data-component={divideItem ? 'drawer-menu-item--divide' : undefined}
|
|
141
|
+
key={item.url}
|
|
142
|
+
className={`o-header__drawer-menu-item ${divideItem}`}
|
|
143
|
+
>
|
|
140
144
|
<DrawerSpecialItem {...item} />
|
|
141
145
|
</li>
|
|
142
146
|
)
|
|
@@ -149,7 +153,7 @@ const UserMenu = (props: TNavMenu) => (
|
|
|
149
153
|
<ul className="o-header__drawer-menu-list">
|
|
150
154
|
{props.items.map((item) => (
|
|
151
155
|
<li key={item.url} className="o-header__drawer-menu-item">
|
|
152
|
-
<a className="o-header__drawer-menu-link" href={item.url} data-trackable={item.label}>
|
|
156
|
+
<a className="o-header__drawer-menu-link" href={item.url ?? undefined} data-trackable={item.label}>
|
|
153
157
|
{item.label}
|
|
154
158
|
</a>
|
|
155
159
|
</li>
|
|
@@ -12,7 +12,7 @@ const MobileNav = (props: THeaderProps) => {
|
|
|
12
12
|
// Only display navigation on pages which are included in this menu
|
|
13
13
|
const targetUrls = props.data['navbar-simple'].items.map((item) => item.url)
|
|
14
14
|
|
|
15
|
-
return targetUrls.includes(props.data.currentPath) ? (
|
|
15
|
+
return props.data.currentPath && targetUrls.includes(props.data.currentPath) ? (
|
|
16
16
|
<NavMobile items={props.data['navbar-simple'].items} />
|
|
17
17
|
) : null
|
|
18
18
|
}
|
|
@@ -30,7 +30,7 @@ const NavMobile = ({ items }: { items: TNavMenuItem[] }) => {
|
|
|
30
30
|
<li className="o-header__nav-item" key={`link-${index}`}>
|
|
31
31
|
<a
|
|
32
32
|
className="o-header__nav-link o-header__nav-link--primary"
|
|
33
|
-
href={item.url}
|
|
33
|
+
href={item.url ?? undefined}
|
|
34
34
|
{...ariaSelected(item)}
|
|
35
35
|
data-trackable={item.label}
|
|
36
36
|
>
|
|
@@ -61,7 +61,7 @@ const NavListLeft = (props: THeaderProps) => (
|
|
|
61
61
|
<li className="o-header__nav-item" key={`link-${index}`}>
|
|
62
62
|
<a
|
|
63
63
|
className="o-header__nav-link o-header__nav-link--primary"
|
|
64
|
-
href={item.url}
|
|
64
|
+
href={item.url ?? undefined}
|
|
65
65
|
id={`o-header-link-${index}`}
|
|
66
66
|
{...ariaSelected(item)}
|
|
67
67
|
data-trackable={item.label}
|
|
@@ -82,10 +82,14 @@ const NavListRight = (props: THeaderProps) => {
|
|
|
82
82
|
|
|
83
83
|
const NavListRightLoggedIn = ({ items }: { items: TNavMenuItem[] }) => {
|
|
84
84
|
return (
|
|
85
|
-
<ul
|
|
85
|
+
<ul
|
|
86
|
+
data-component="nav-list--right"
|
|
87
|
+
className="o-header__nav-list o-header__nav-list--right"
|
|
88
|
+
data-trackable="user-nav"
|
|
89
|
+
>
|
|
86
90
|
{items.map((item, index) => (
|
|
87
91
|
<li className="o-header__nav-item" key={`link-${index}`}>
|
|
88
|
-
<a className="o-header__nav-link" href={item.url} data-trackable={item.label}>
|
|
92
|
+
<a className="o-header__nav-link" href={item.url ?? undefined} data-trackable={item.label}>
|
|
89
93
|
{item.label}
|
|
90
94
|
</a>
|
|
91
95
|
</li>
|
|
@@ -123,12 +127,12 @@ const SectionList = ({ title, data }: INavMeganavSections) => {
|
|
|
123
127
|
<div className="o-header__mega-heading">{title}</div>
|
|
124
128
|
<div className="o-header__mega-content">
|
|
125
129
|
<ul className="o-header__mega-list">
|
|
126
|
-
{data
|
|
130
|
+
{data?.map((column) =>
|
|
127
131
|
column.map((item, index) => (
|
|
128
132
|
<li className="o-header__mega-item" key={`link-${index}`}>
|
|
129
133
|
<a
|
|
130
134
|
className="o-header__mega-link"
|
|
131
|
-
href={item.url}
|
|
135
|
+
href={item.url ?? undefined}
|
|
132
136
|
{...ariaSelected(item)}
|
|
133
137
|
data-trackable="link"
|
|
134
138
|
>
|
|
@@ -149,11 +153,11 @@ const ArticleList = ({ title, data }: INavMeganavArticles) => {
|
|
|
149
153
|
<div className="o-header__mega-heading">{title}</div>
|
|
150
154
|
<div className="o-header__mega-content">
|
|
151
155
|
<ul className="o-header__mega-list">
|
|
152
|
-
{data
|
|
156
|
+
{data?.map((item, index) => (
|
|
153
157
|
<li className="o-header__mega-item" key={`link-${index}`}>
|
|
154
158
|
<a
|
|
155
159
|
className="o-header__mega-link"
|
|
156
|
-
href={item.url}
|
|
160
|
+
href={item.url ?? undefined}
|
|
157
161
|
{...ariaSelected(item)}
|
|
158
162
|
data-trackable="link"
|
|
159
163
|
>
|
|
@@ -175,7 +179,7 @@ const UserActionsNav = (props: THeaderProps) => {
|
|
|
175
179
|
<ul className="o-header__anon-list">
|
|
176
180
|
{userNavItems.map((item, index) => (
|
|
177
181
|
<li className="o-header__anon-item" key={`link-${index}`}>
|
|
178
|
-
<a className="o-header__anon-link" href={item.url} data-trackable={item.label}>
|
|
182
|
+
<a className="o-header__anon-link" href={item.url ?? undefined} data-trackable={item.label}>
|
|
179
183
|
{item.label}
|
|
180
184
|
</a>
|
|
181
185
|
</li>
|
|
@@ -48,7 +48,7 @@ const Navigation = (props: THeaderProps) => (
|
|
|
48
48
|
<li className="o-header__nav-item" key={`link-${index}`}>
|
|
49
49
|
<a
|
|
50
50
|
className="o-header__nav-link o-header__nav-link--primary"
|
|
51
|
-
href={item.url}
|
|
51
|
+
href={item.url ?? undefined}
|
|
52
52
|
data-trackable={item.label}
|
|
53
53
|
tabIndex={-1}
|
|
54
54
|
>
|
|
@@ -144,7 +144,7 @@ const NavListRightLoggedInSticky = (props: THeaderProps) => {
|
|
|
144
144
|
// - The sticky header renders either the `navbar-right-anon` data or the myFT component
|
|
145
145
|
// - The normal header renders either the `navbar-right-anon` or the `navbar-right` data
|
|
146
146
|
const TopColumnRightSticky = (props: THeaderProps) => {
|
|
147
|
-
let children =
|
|
147
|
+
let children: JSX.Element | undefined = undefined
|
|
148
148
|
|
|
149
149
|
if (props.userIsLoggedIn) {
|
|
150
150
|
children = <NavListRightLoggedInSticky {...props} />
|
|
@@ -17,7 +17,8 @@ const SubNavigationWrapper = (props) => (
|
|
|
17
17
|
role="navigation"
|
|
18
18
|
aria-label="Sub navigation"
|
|
19
19
|
data-o-header-subnav
|
|
20
|
-
data-trackable="header-subnav"
|
|
20
|
+
data-trackable="header-subnav"
|
|
21
|
+
>
|
|
21
22
|
<div className="o-header__container">
|
|
22
23
|
<div className="o-header__subnav-wrap-outside">
|
|
23
24
|
<div className="o-header__subnav-wrap-inside" data-o-header-subnav-wrapper>
|
|
@@ -43,21 +44,23 @@ const SubNavigationWrapper = (props) => (
|
|
|
43
44
|
</div>
|
|
44
45
|
)
|
|
45
46
|
|
|
46
|
-
const BreadCrumb = ({ items }: { items
|
|
47
|
+
const BreadCrumb = ({ items }: { items?: TNavMenuItem[] }) => (
|
|
47
48
|
<ol
|
|
48
49
|
className="o-header__subnav-list o-header__subnav-list--breadcrumb"
|
|
49
50
|
aria-label="Breadcrumb"
|
|
50
|
-
data-trackable="breadcrumb"
|
|
51
|
-
|
|
51
|
+
data-trackable="breadcrumb"
|
|
52
|
+
>
|
|
53
|
+
{items?.map((item, index) => {
|
|
52
54
|
const selected = item.selected ? 'o-header__subnav-link--highlight' : ''
|
|
53
55
|
|
|
54
56
|
return (
|
|
55
57
|
<li className="o-header__subnav-item" key={`item-${index}`}>
|
|
56
58
|
<a
|
|
57
59
|
className={`o-header__subnav-link ${selected}`}
|
|
58
|
-
href={item.url}
|
|
60
|
+
href={item.url ?? undefined}
|
|
59
61
|
{...ariaSelected(item)}
|
|
60
|
-
data-trackable={item.label}
|
|
62
|
+
data-trackable={item.label}
|
|
63
|
+
>
|
|
61
64
|
{item.label}
|
|
62
65
|
</a>
|
|
63
66
|
</li>
|
|
@@ -66,7 +69,7 @@ const BreadCrumb = ({ items }: { items: TNavMenuItem[] }) => (
|
|
|
66
69
|
</ol>
|
|
67
70
|
)
|
|
68
71
|
|
|
69
|
-
const SubSections = ({ items, rightAlignment }: { items
|
|
72
|
+
const SubSections = ({ items, rightAlignment }: { items?: TNavMenuItem[]; rightAlignment?: boolean }) => {
|
|
70
73
|
if (!items || items.length === 0) {
|
|
71
74
|
return null
|
|
72
75
|
}
|
|
@@ -78,7 +81,8 @@ const SubSections = ({ items, rightAlignment }: { items: TNavMenuItem[]; rightAl
|
|
|
78
81
|
(rightAlignment ? ' o-header__subnav-list--right' : '')
|
|
79
82
|
}
|
|
80
83
|
aria-label={rightAlignment ? 'Additional Sub Navigation' : 'Subsections'}
|
|
81
|
-
data-trackable="subsections"
|
|
84
|
+
data-trackable="subsections"
|
|
85
|
+
>
|
|
82
86
|
{items.map((item, index) => {
|
|
83
87
|
const selected = item.selected ? 'o-header__subnav-link--highlight' : ''
|
|
84
88
|
|
|
@@ -86,9 +90,10 @@ const SubSections = ({ items, rightAlignment }: { items: TNavMenuItem[]; rightAl
|
|
|
86
90
|
<li className="o-header__subnav-item" key={`item-${index}`}>
|
|
87
91
|
<a
|
|
88
92
|
className={`o-header__subnav-link ${selected}`}
|
|
89
|
-
href={item.url}
|
|
93
|
+
href={item.url ?? undefined}
|
|
90
94
|
{...ariaSelected(item)}
|
|
91
|
-
data-trackable={item.label}
|
|
95
|
+
data-trackable={item.label}
|
|
96
|
+
>
|
|
92
97
|
{item.label}
|
|
93
98
|
</a>
|
|
94
99
|
</li>
|
|
@@ -118,7 +118,7 @@ const SignInLink = ({
|
|
|
118
118
|
return (
|
|
119
119
|
<a
|
|
120
120
|
className={`o-header__top-link ${className}`}
|
|
121
|
-
href={item.url}
|
|
121
|
+
href={item.url ?? undefined}
|
|
122
122
|
data-trackable={item.label}
|
|
123
123
|
{...setTabIndex}
|
|
124
124
|
>
|
|
@@ -142,7 +142,7 @@ const SubscribeButton = ({
|
|
|
142
142
|
// Added as the result of a DAC audit. This will be confusing for users of voice activation software
|
|
143
143
|
// as it looks like a button but behaves like a link without this role.
|
|
144
144
|
role="button"
|
|
145
|
-
href={item.url}
|
|
145
|
+
href={item.url ?? undefined}
|
|
146
146
|
data-trackable={item.label}
|
|
147
147
|
{...setTabIndex}
|
|
148
148
|
>
|