Skip to content

Commit 4e0937f

Browse files
authored
Merge pull request #2249 from dxc-technology/jialecl-layout-improvement
Application layout improved to behave better with a custom header or …
2 parents d77c9bd + 23b6517 commit 4e0937f

File tree

2 files changed

+62
-46
lines changed

2 files changed

+62
-46
lines changed

packages/lib/src/layout/ApplicationLayout.tsx

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,27 @@ const ApplicationLayoutContainer = styled.div<{
1515
isSidenavVisible: boolean;
1616
hasSidenav: boolean;
1717
}>`
18-
position: absolute;
19-
top: 64px;
20-
bottom: 0;
18+
top: 0;
2119
left: 0;
22-
right: 0;
23-
display: flex;
24-
flex-direction: column;
20+
display: grid;
21+
grid-template-rows: auto 1fr;
22+
height: 100vh;
23+
width: 100vw;
24+
position: absolute;
25+
overflow: hidden;
2526
2627
@media (max-width: ${responsiveSizes.large}rem) {
27-
${(props) => props.hasSidenav && "top: 116px"};
2828
${(props) => props.isSidenavVisible && "overflow: hidden;"}
2929
}
3030
`;
3131

3232
const HeaderContainer = styled.div`
33-
position: fixed;
34-
top: 0;
35-
left: 0;
36-
right: 0;
33+
width: 100%;
34+
height: fit-content;
3735
z-index: 3;
3836
`;
3937

4038
const VisibilityToggle = styled.div`
41-
position: fixed;
42-
top: 64px;
43-
left: 0;
44-
right: 0;
4539
box-sizing: border-box;
4640
display: flex;
4741
align-items: center;
@@ -81,16 +75,18 @@ const HamburgerTrigger = styled.button`
8175

8276
const BodyContainer = styled.div`
8377
display: flex;
84-
flex-direction: row;
85-
flex: 1;
78+
width: 100%;
79+
height: 100%;
80+
overflow: hidden;
8681
`;
8782

8883
const SidenavContainer = styled.div`
89-
position: sticky;
90-
top: 64px;
91-
display: flex;
92-
height: calc(100vh - 64px);
84+
width: fit-content;
85+
min-width: 280px;
86+
height: 100%;
9387
z-index: 1;
88+
position: sticky;
89+
overflow: auto;
9490
9591
@media (max-width: ${responsiveSizes.large}rem) {
9692
position: absolute;
@@ -101,16 +97,26 @@ const SidenavContainer = styled.div`
10197

10298
const MainContainer = styled.div`
10399
display: flex;
100+
flex-grow: 1;
104101
flex-direction: column;
105102
width: 100%;
103+
height: 100%;
104+
position: relative;
105+
overflow: auto;
106+
`;
107+
108+
const FooterContainer = styled.div`
109+
height: fit-content;
110+
width: 100%;
106111
`;
107112

108113
const MainContentContainer = styled.main`
109-
flex: 1;
110-
background-color: var(--color-bg-neutral-lightest);
114+
height: 100%;
115+
display: grid;
116+
grid-template-rows: 1fr auto;
111117
`;
112118

113-
const Main = ({ children }: AppLayoutMainPropsType): JSX.Element => <>{children}</>;
119+
const Main = ({ children }: AppLayoutMainPropsType): JSX.Element => <div>{children}</div>;
114120

115121
const DxcApplicationLayout = ({
116122
visibilityToggleLabel = "",
@@ -136,35 +142,44 @@ const DxcApplicationLayout = ({
136142

137143
return (
138144
<ApplicationLayoutContainer hasSidenav={!!sidenav} isSidenavVisible={isSidenavVisibleResponsive} ref={ref}>
139-
<HeaderContainer>{header ?? <DxcHeader underlined />}</HeaderContainer>
140-
{sidenav && isResponsive && (
141-
<VisibilityToggle>
142-
<Tooltip label={translatedLabels.applicationLayout.visibilityToggleTitle}>
143-
<HamburgerTrigger
144-
onClick={handleSidenavVisibility}
145-
aria-label={visibilityToggleLabel ? undefined : translatedLabels.applicationLayout.visibilityToggleTitle}
146-
>
147-
<DxcIcon icon="Menu" />
148-
{visibilityToggleLabel}
149-
</HamburgerTrigger>
150-
</Tooltip>
151-
</VisibilityToggle>
152-
)}
145+
<HeaderContainer>
146+
{header ?? <DxcHeader underlined />}
147+
{sidenav && isResponsive && (
148+
<VisibilityToggle>
149+
<Tooltip label={translatedLabels.applicationLayout.visibilityToggleTitle}>
150+
<HamburgerTrigger
151+
onClick={handleSidenavVisibility}
152+
aria-label={
153+
visibilityToggleLabel ? undefined : translatedLabels.applicationLayout.visibilityToggleTitle
154+
}
155+
>
156+
<DxcIcon icon="Menu" />
157+
{visibilityToggleLabel}
158+
</HamburgerTrigger>
159+
</Tooltip>
160+
</VisibilityToggle>
161+
)}
162+
</HeaderContainer>
163+
153164
<BodyContainer>
154165
<SidenavContextProvider value={setIsSidenavVisibleResponsive}>
155166
{sidenav && (isResponsive ? isSidenavVisibleResponsive : true) && (
156167
<SidenavContainer>{sidenav}</SidenavContainer>
157168
)}
158169
</SidenavContextProvider>
159170
<MainContainer>
160-
<MainContentContainer>{findChildType(children, Main)}</MainContentContainer>
161-
{footer ?? (
162-
<DxcFooter
163-
copyright={`© DXC Technology ${year}. All rights reserved.`}
164-
bottomLinks={bottomLinks}
165-
socialLinks={socialLinks}
166-
/>
167-
)}
171+
<MainContentContainer>
172+
{findChildType(children, Main)}
173+
<FooterContainer>
174+
{footer ?? (
175+
<DxcFooter
176+
copyright={`© DXC Technology ${year}. All rights reserved.`}
177+
bottomLinks={bottomLinks}
178+
socialLinks={socialLinks}
179+
/>
180+
)}
181+
</FooterContainer>
182+
</MainContentContainer>
168183
</MainContainer>
169184
</BodyContainer>
170185
</ApplicationLayoutContainer>

packages/lib/src/sidenav/Sidenav.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const SidenavContainer = styled.div`
2020
display: flex;
2121
flex-direction: column;
2222
width: 280px;
23+
height: 100%;
2324
@media (max-width: ${responsiveSizes.large}rem) {
2425
width: 100vw;
2526
}

0 commit comments

Comments
 (0)