Skip to content

Commit 1427740

Browse files
authored
feat(Navigation): add iconSize for navigation icons, update margin between icon and text (#329)
1 parent dac13e7 commit 1427740

File tree

9 files changed

+71
-22
lines changed

9 files changed

+71
-22
lines changed

src/models/navigation.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface NavigationItemBase {
1313
text: string;
1414
icon?: ImageProps;
1515
url?: string;
16+
iconSize?: number;
1617
}
1718

1819
export enum NavigationGithubButtonIcon {
@@ -82,6 +83,7 @@ export type ThemedNavigationLogoData = NavigationLogoData & ThemeSupporting<Navi
8283
export interface HeaderData {
8384
leftItems: NavigationItemModel[];
8485
rightItems?: NavigationItemModel[];
86+
iconSize?: number;
8587
}
8688

8789
export interface FooterColumn {

src/navigation/components/Header/Header.tsx

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1-
import React, {MouseEvent, useCallback, useState} from 'react';
1+
import React, {MouseEvent, useCallback, useMemo, useState} from 'react';
22

33
import _ from 'lodash';
44

55
import Control from '../../../components/Control/Control';
66
import OutsideClick from '../../../components/OutsideClick/OutsideClick';
77
import {Col, Grid, Row} from '../../../grid';
88
import {NavigationClose, NavigationOpen} from '../../../icons';
9-
import {HeaderData, ThemedNavigationLogoData} from '../../../models';
9+
import {
10+
HeaderData,
11+
NavigationItemBase,
12+
NavigationItemModel,
13+
ThemedNavigationLogoData,
14+
} from '../../../models';
1015
import {block} from '../../../utils';
1116
import {ItemColumnName} from '../../constants';
1217
import Logo from '../Logo/Logo';
@@ -52,11 +57,32 @@ const MobileMenuButton: React.FC<MobileMenuButtonProps> = ({
5257
);
5358
};
5459

60+
const iconSizeKey: keyof NavigationItemBase = 'iconSize';
61+
5562
export const Header: React.FC<HeaderProps> = ({data, logo}) => {
56-
const {leftItems, rightItems} = data;
63+
const {leftItems, rightItems, iconSize = 20} = data;
5764
const [isSidebarOpened, setIsSidebarOpened] = useState(false);
5865
const [activeItemId, setactiveItemId] = useState<string | undefined>(undefined);
5966

67+
const getNavigationItemWithIconSize = useCallback(
68+
(item: NavigationItemModel) => {
69+
if (!(iconSizeKey in item)) {
70+
return {...item, iconSize};
71+
}
72+
return item;
73+
},
74+
[iconSize],
75+
);
76+
77+
const leftItemsWithIconSize = useMemo(
78+
() => leftItems.map(getNavigationItemWithIconSize),
79+
[getNavigationItemWithIconSize, leftItems],
80+
);
81+
const rightItemsWithIconSize = useMemo(
82+
() => rightItems?.map(getNavigationItemWithIconSize),
83+
[getNavigationItemWithIconSize, rightItems],
84+
);
85+
6086
const onActiveItemChange = useCallback((id?: string) => {
6187
setactiveItemId(id);
6288
}, []);
@@ -86,7 +112,7 @@ export const Header: React.FC<HeaderProps> = ({data, logo}) => {
86112
<div className={b('navigation-container')}>
87113
<Navigation
88114
className={b('navigation')}
89-
links={leftItems}
115+
links={leftItemsWithIconSize}
90116
activeItemId={activeItemId}
91117
onActiveItemChange={onActiveItemChange}
92118
/>
@@ -96,9 +122,9 @@ export const Header: React.FC<HeaderProps> = ({data, logo}) => {
96122
isSidebarOpened={isSidebarOpened}
97123
onSidebarOpenedChange={onSidebarOpenedChange}
98124
/>
99-
{rightItems && (
125+
{rightItemsWithIconSize && (
100126
<ul className={b('buttons')}>
101-
{rightItems.map((button, index) => (
127+
{rightItemsWithIconSize.map((button, index) => (
102128
<NavigationListItem
103129
key={index}
104130
className={b('buttons-item')}

src/navigation/components/NavigationDropdownItem/NavigationDropdownItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const NavigationDropdown: React.FC<NavigationDropdownProps> = ({
2020
onClick,
2121
}) => {
2222
const anchorRef = useRef<HTMLElement>(null);
23-
const {text, icon, items, ...popupProps} = data;
23+
const {text, icon, items, iconSize, ...popupProps} = data;
2424

2525
return (
2626
<Fragment>
@@ -29,7 +29,7 @@ const NavigationDropdown: React.FC<NavigationDropdownProps> = ({
2929
ref={anchorRef}
3030
onClick={onClick}
3131
isOpened={isActive}
32-
data={{text, type: NavigationItemType.Dropdown, icon}}
32+
data={{text, type: NavigationItemType.Dropdown, icon, iconSize}}
3333
/>
3434
<NavigationPopup
3535
open={isActive}

src/navigation/components/NavigationItem/components/ContentWrapper/ContentWrapper.scss

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ $block: '.#{$ns}content-wrapper';
55
#{$block} {
66
&__icon {
77
display: flex;
8-
width: 20px;
9-
height: 20px;
10-
margin-right: $indentXXXS;
8+
margin-right: $navigationIconIndent;
119

1210
object-fit: cover;
1311
}
Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {Fragment} from 'react';
1+
import React, {Fragment, useMemo} from 'react';
22

33
import {Image} from '../../../../../components';
44
import {ImageProps} from '../../../../../models';
@@ -8,9 +8,24 @@ import './ContentWrapper.scss';
88

99
const b = block('content-wrapper');
1010

11-
export const ContentWrapper: React.FC<{text: string; icon?: ImageProps}> = ({text, icon}) => (
12-
<Fragment>
13-
{icon && typeof icon !== 'string' && <Image className={b('icon')} {...icon} />}
14-
<span className={b('text')}>{text}</span>
15-
</Fragment>
16-
);
11+
interface ContentWrapperProps {
12+
text: string;
13+
icon?: ImageProps;
14+
iconSize?: number;
15+
}
16+
17+
export const ContentWrapper: React.FC<ContentWrapperProps> = ({text, icon, iconSize}) => {
18+
const iconSizeStyle = useMemo(
19+
() => (iconSize ? {height: `${iconSize}px`, width: `${iconSize}px`} : {}),
20+
[iconSize],
21+
);
22+
23+
return (
24+
<Fragment>
25+
{icon && typeof icon !== 'string' && (
26+
<Image className={b('icon')} {...icon} style={iconSizeStyle} />
27+
)}
28+
<span className={b('text')}>{text}</span>
29+
</Fragment>
30+
);
31+
};

src/navigation/components/NavigationItem/components/NavigationDropdown/NavigationDropdown.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ const TOGGLE_ARROW_SIZE = 12;
1616
type NavigationDropdownProps = NavigationItemProps & DropdownItemData;
1717

1818
export const NavigationDropdown = React.forwardRef<HTMLElement, NavigationDropdownProps>(
19-
({text, icon, isOpened, className, ...props}, ref) => {
19+
({text, icon, isOpened, className, iconSize, ...props}, ref) => {
2020
const iconData = icon && getMediaImage(icon);
2121

2222
return (
2323
<span ref={ref} {...props} className={b(null, className)}>
24-
<ContentWrapper text={text} icon={iconData} />
24+
<ContentWrapper text={text} icon={iconData} iconSize={iconSize} />
2525
<ToggleArrow
2626
className={b('arrow')}
2727
size={TOGGLE_ARROW_SIZE}

src/navigation/components/NavigationItem/components/NavigationLink/NavigationLink.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ type NavigationLinkProps = NavigationItemProps & NavigationLinkItem;
1717

1818
export const NavigationLink: React.FC<NavigationLinkProps> = (props) => {
1919
const {hostname, Link} = useContext(LocationContext);
20-
const {url, text, icon, arrow, target, className, ...rest} = props;
20+
const {url, text, icon, arrow, target, className, iconSize, ...rest} = props;
2121
const linkExtraProps = getLinkProps(url, hostname, target);
2222
const iconData = icon && getMediaImage(icon);
2323

2424
const classes = b(null, className);
2525
const content = (
2626
<Fragment>
27-
<ContentWrapper text={text} icon={iconData} />
27+
<ContentWrapper text={text} icon={iconData} iconSize={iconSize} />
2828
{arrow && <NavigationArrow className={b('arrow')} />}
2929
</Fragment>
3030
);

src/navigation/schema.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ const NavigationItemBaseProps = {
3737
type: 'string',
3838
pattern: urlPattern,
3939
},
40+
iconSize: {
41+
type: 'number',
42+
},
4043
};
4144

4245
const NavigationItemBaseLinkProps = omit(NavigationItemBaseProps, ['url']);
@@ -96,5 +99,8 @@ export const NavigationHeaderProps = {
9699
properties: {
97100
leftItems: NavigationItemProps,
98101
rightItems: NavigationItemProps,
102+
iconSize: {
103+
type: 'number',
104+
},
99105
},
100106
};

styles/variables.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ $contentMargin: $indentM;
2222
$contentLiftIndent: $indentXL;
2323
$contentLiftIndentMobile: $indentM;
2424

25+
$navigationIconIndent: 6px;
26+
2527
//slider
2628
$sliderArrowSize: 42px;
2729
$headerSliderLargeBreakpoint: 1410px;

0 commit comments

Comments
 (0)