Skip to content

Commit bb7fbe8

Browse files
authored
feat(sidenav): subheading as ReactNode, fix mobile sidenav items padding #421 (#512)
* feat(sidenav): subheading as ReactNode, fix mobile sidenav items padding #421 * fix(sidenav): parents are links collapse button positioning inside menu item #421
1 parent 7ac9916 commit bb7fbe8

File tree

5 files changed

+88
-5
lines changed

5 files changed

+88
-5
lines changed

src/tedi/components/layout/sidenav/components/sidenav-dropdown/sidenav-dropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type SideNavDropdownProps<C extends React.ElementType = 'a'> = {
2626
};
2727

2828
type Group<C extends React.ElementType> = {
29-
subHeading?: string;
29+
subHeading?: React.ReactNode;
3030
subItems: SideNavItemProps<C>[];
3131
};
3232

src/tedi/components/layout/sidenav/components/sidenav-item/sidenav-item.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export type SideNavItemProps<C extends React.ElementType = 'a'> = LinkProps<C> &
2323
* Grouped submenu items (preferred for headings)
2424
*/
2525
subItemGroups?: {
26-
subHeading?: string;
26+
subHeading?: React.ReactNode;
2727
subItems: SideNavItemProps<C>[];
2828
}[];
2929
/**
@@ -73,6 +73,7 @@ export const SideNavItem = <C extends React.ElementType = 'a'>(
7373

7474
const groupsToRender = subItemGroups ?? (subItems ? [{ subItems }] : null);
7575
const hasChildren = !!groupsToRender;
76+
const hasTreeIndicator = level > 1 && hasChildren;
7677

7778
const SideNavItemBEM = cn(
7879
styles['tedi-sidenav__item'],
@@ -81,6 +82,7 @@ export const SideNavItem = <C extends React.ElementType = 'a'>(
8182
[styles[`tedi-sidenav__item--level-${level}`]]: level > 1,
8283
[styles['tedi-sidenav__item--current']]: isActive,
8384
[styles['tedi-sidenav__item--has-children']]: hasChildren,
85+
[styles['tedi-sidenav__item--with-tree']]: hasTreeIndicator,
8486
},
8587
className
8688
);

src/tedi/components/layout/sidenav/examples.ts renamed to src/tedi/components/layout/sidenav/examples.tsx

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
/* istanbul ignore file */
2+
import { Text } from '../../base/typography/text/text';
3+
import { InfoButton } from '../../buttons/info-button/info-button';
24
import { SideNavItemProps } from './components/sidenav-item/sidenav-item';
35

46
export const exampleNavItems: SideNavItemProps[] = [
@@ -248,3 +250,63 @@ export const exampleThirdLevelMenuItemsLinks: SideNavItemProps[] = [
248250
{ href: '#', children: 'Inventory Management', icon: 'inventory' },
249251
{ href: '#', children: 'Billing & Finance', icon: 'payments' },
250252
];
253+
254+
export const exampleThirdLevelMenuItemsLinksWithSubTitles: SideNavItemProps[] = [
255+
{ href: '#', children: 'Dashboard', icon: 'dashboard' },
256+
{ href: '#', children: 'Patient Records', icon: 'people' },
257+
{
258+
children: 'Clinical Management',
259+
icon: 'medical_services',
260+
subItemGroups: [
261+
{
262+
subHeading: (
263+
<Text>
264+
Minu tervise ajalugu <InfoButton color="inverted">Lorem ipsum</InfoButton>
265+
</Text>
266+
),
267+
subItems: [
268+
{ href: '#', children: 'Active Treatments' },
269+
{ href: '#', children: 'Treatment History' },
270+
{ href: '#', children: 'Treatment Plans' },
271+
{ href: '#', children: 'Clinical Protocols' },
272+
],
273+
},
274+
],
275+
subItems: [
276+
{ href: '#', children: 'Vital Signs' },
277+
{ href: '#', children: 'Assessments' },
278+
{
279+
href: '#',
280+
children: 'Treatments',
281+
subItems: [
282+
{ href: '#', children: 'Active Treatments' },
283+
{ href: '#', children: 'Treatment History' },
284+
{ href: '#', children: 'Treatment Plans' },
285+
{ href: '#', children: 'Clinical Protocols' },
286+
],
287+
},
288+
{
289+
href: '#',
290+
children: 'Documentation',
291+
subItems: [
292+
{ href: '#', children: 'Clinical Notes' },
293+
{ href: '#', children: 'Medical Forms' },
294+
{ href: '#', children: 'Consent Forms' },
295+
{ href: '#', children: 'Reports' },
296+
],
297+
},
298+
],
299+
isDefaultOpen: true,
300+
},
301+
{
302+
href: '#',
303+
children: 'Administration',
304+
icon: 'admin_panel_settings',
305+
subItems: [
306+
{ href: '#', children: 'Staff Management' },
307+
{ href: '#', children: 'Scheduling' },
308+
],
309+
},
310+
{ href: '#', children: 'Inventory Management', icon: 'inventory' },
311+
{ href: '#', children: 'Billing & Finance', icon: 'payments' },
312+
];

src/tedi/components/layout/sidenav/sidenav.module.scss

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@
197197
}
198198
}
199199

200-
.tedi-sidenav__item.tedi-sidenav__sub-item .tedi-sidenav__link {
200+
.tedi-sidenav__item--with-tree .tedi-sidenav__item.tedi-sidenav__sub-item .tedi-sidenav__link,
201+
.tedi-sidenav__item--level-2 .tedi-sidenav__link {
201202
min-height: var(--navigation-vertical-item-min-height-medium);
202203
padding-top: var(--navigation-vertical-item-padding-y);
203204
padding-bottom: var(--navigation-vertical-item-padding-y);
@@ -208,11 +209,21 @@
208209
);
209210
}
210211

212+
.tedi-sidenav__item:not(.tedi-sidenav__item--with-tree) .tedi-sidenav__sub-item.tedi-sidenav__item .tedi-sidenav__link,
213+
.tedi-sidenav__item--level-2 .tedi-sidenav__link,
214+
.tedi-sidenav__item--with-tree.tedi-sidenav__item--level-2 .tedi-sidenav__link.tedi-sidenav__link--has-children-link {
215+
@include breakpoints.media-breakpoint-down(md) {
216+
padding-left: var(--navigation-vertical-item-padding-right);
217+
}
218+
}
219+
211220
.tedi-sidenav__item .tedi-sidenav__link--has-children-link {
212221
padding-right: calc(var(--navigation-vertical-item-padding-right) + var(--button-xs-icon-size));
213222

214223
@include breakpoints.media-breakpoint-down(md) {
224+
z-index: 1;
215225
margin-left: calc(var(--navigation-vertical-item-padding-right) + var(--button-xs-icon-size));
226+
background-color: var(--navigation-vertical-item-background-default);
216227
}
217228
}
218229

@@ -227,7 +238,7 @@
227238
+ .tedi-sidenav__link-collapse-wrapper
228239
[data-name='collapse-trigger'] {
229240
position: absolute;
230-
top: calc(var(--navigation-vertical-item-min-height-medium) / 3);
241+
top: calc((var(--navigation-vertical-item-min-height-large) - var(--button-xs-icon-size)) / 2);
231242
right: var(--navigation-vertical-item-padding-right);
232243
display: flex;
233244
align-items: center;
@@ -359,7 +370,7 @@ button.tedi-sidenav__link.tedi-sidenav__back-button {
359370
.tedi-sidenav__subheading {
360371
padding: var(--layout-grid-gutters-02) var(--navigation-vertical-item-padding-left-level-1)
361372
var(--layout-grid-gutters-04) var(--navigation-vertical-item-padding-right);
362-
font-size: var(--size-00);
373+
font-size: var(--body-extra-small-bold-size);
363374
color: var(--navigation-vertical-group-title-text);
364375
text-transform: uppercase;
365376

src/tedi/components/layout/sidenav/sidenav.stories.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
exampleNavItems,
1212
exampleThirdLevelMenuItems,
1313
exampleThirdLevelMenuItemsLinks,
14+
exampleThirdLevelMenuItemsLinksWithSubTitles,
1415
} from './examples';
1516
import { SideNav } from './sidenav';
1617

@@ -278,3 +279,10 @@ export const SmallSideNavItems: Story = {
278279
sideNavItemSize: 'small',
279280
},
280281
};
282+
283+
export const SubTitles: Story = {
284+
render: Template,
285+
args: {
286+
navItems: exampleThirdLevelMenuItemsLinksWithSubTitles,
287+
},
288+
};

0 commit comments

Comments
 (0)