@@ -23,8 +23,10 @@ import {Button} from '../Button/index.tsx';
2323import {
2424 app ,
2525 appLayout ,
26+ footer ,
2627 header ,
2728 main ,
29+ mainHasFooter ,
2830 mainHasSideNav ,
2931 sideNav ,
3032 sideNavButton ,
@@ -83,6 +85,11 @@ export const App = (props: {
8385 * the application.
8486 */
8587 readonly main ?: ComponentType | ReactNode ;
88+ /**
89+ * An optional component, element, or string which renders the footer of
90+ * the application.
91+ */
92+ readonly footer ?: ComponentType | ReactNode ;
8693 /**
8794 * An extra CSS class name for the component.
8895 */
@@ -104,6 +111,7 @@ const Layout = ({
104111 topNavRight : topNavRightComponentOrNode ,
105112 sideNav : sideNavComponentOrNode ,
106113 main : mainComponentOrNode ,
114+ footer : footerComponentOrNode ,
107115 className,
108116} : Parameters < typeof App > [ 0 ] ) => {
109117 const sessionStoreIsReady = useSessionStoreIsReady ( ) ;
@@ -124,8 +132,10 @@ const Layout = ({
124132 topNavRightComponentOrNode ,
125133 sideNavComponentOrNode ,
126134 mainComponentOrNode ,
135+ footerComponentOrNode ,
127136 ] . some ( ( componentOrNode ) => componentOrNode ) ;
128137 const hasSideNav = sideNavComponentOrNode != null ;
138+ const hasFooter = footerComponentOrNode != null ;
129139
130140 return sessionStoreIsReady && routeStoreIsReady && localStoreIsReady ? (
131141 < div
@@ -169,9 +179,20 @@ const Layout = ({
169179 </ nav >
170180 ) : null }
171181 </ header >
172- < main className = { classNames ( main , hasSideNav && mainHasSideNav ) } >
182+ < main
183+ className = { classNames (
184+ main ,
185+ hasSideNav && mainHasSideNav ,
186+ hasFooter && mainHasFooter ,
187+ ) }
188+ >
173189 { renderComponentOrNode ( mainComponentOrNode ) }
174190 </ main >
191+ { hasFooter ? (
192+ < footer className = { footer } >
193+ { renderComponentOrNode ( footerComponentOrNode ) }
194+ </ footer >
195+ ) : null }
175196 </ >
176197 ) : null }
177198 </ div >
0 commit comments