Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[account] [docs] Add <Account /> in sidebarFooter #4255

Merged
merged 87 commits into from
Nov 5, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
38ecc17
fix: Improve docs and make API clearer
bharatkashyap Oct 2, 2024
7fea561
Merge branch 'master' into enh/account-3
bharatkashyap Oct 2, 2024
01c7fa6
fix: lint
bharatkashyap Oct 2, 2024
49d756a
Merge branch 'enh/account-3' of github.com:bharatkashyap/mui-toolpad …
bharatkashyap Oct 2, 2024
8098608
fix: Incorrect default
bharatkashyap Oct 2, 2024
6c1c073
fix: Add `userDetailsContainer` proposal
bharatkashyap Oct 3, 2024
f5edc05
Merge branch 'master' into enh/account-3
bharatkashyap Oct 3, 2024
43a0978
fix: No default `sx` in the slot
bharatkashyap Oct 3, 2024
7277cbf
fix: CI
bharatkashyap Oct 3, 2024
129b679
Merge branch 'enh/account-3' of github.com:bharatkashyap/mui-toolpad …
bharatkashyap Oct 3, 2024
f909067
fix: Readability
bharatkashyap Oct 3, 2024
e337ac0
fix: typo
bharatkashyap Oct 3, 2024
2e321ba
fix: More clarification
bharatkashyap Oct 3, 2024
1086869
fix: CI
bharatkashyap Oct 3, 2024
7938e3f
fix: WIP `menuItems` -> `content`
bharatkashyap Oct 3, 2024
6807254
wip: Move demos over
bharatkashyap Oct 3, 2024
c2703a7
fix: Move demos to new API
bharatkashyap Oct 3, 2024
884ad56
wip: Better account switcher
bharatkashyap Oct 7, 2024
d76eebf
fix: CI
bharatkashyap Oct 7, 2024
840362c
Merge branch 'master' into enh/account-3
bharatkashyap Oct 7, 2024
c71f5ba
fix: Complete better account switcher
bharatkashyap Oct 7, 2024
6e34be8
fix: CI
bharatkashyap Oct 7, 2024
a80df48
fix: dedupe
bharatkashyap Oct 7, 2024
882b07b
Merge branch 'master' into enh/account-4
bharatkashyap Oct 7, 2024
0b2e4f8
Merge branch 'master' into enh/account-3
bharatkashyap Oct 7, 2024
77d8eb7
Merge branch 'master' of github.com:mui/mui-toolpad into enh/account-3
bharatkashyap Oct 8, 2024
cb9debf
fix: Redesign solution
bharatkashyap Oct 9, 2024
986298c
fix: CI
bharatkashyap Oct 9, 2024
eee948a
Merge branch 'master' of github.com:mui/mui-toolpad into enh/account-3
bharatkashyap Oct 9, 2024
b93270a
fix: CI
bharatkashyap Oct 9, 2024
cd6a2a0
fix: missed
bharatkashyap Oct 9, 2024
81e5304
Merge branch 'master' of github.com:mui/mui-toolpad into enh/account-3
bharatkashyap Oct 10, 2024
b94774f
Merge branch 'master' of github.com:mui/mui-toolpad into enh/account-3
bharatkashyap Oct 13, 2024
67b83fd
Merge branch 'enh/account-4' of github.com:bharatkashyap/mui-toolpad …
bharatkashyap Oct 13, 2024
2dc6584
fix: Simplify docs
bharatkashyap Oct 13, 2024
cf1276f
fix: Add test
bharatkashyap Oct 13, 2024
cc743e5
fix: Rebase on `enh/account-3` and merge upstream
bharatkashyap Oct 13, 2024
28b71d5
Merge branch 'enh/account-3' into enh/account-4
bharatkashyap Oct 13, 2024
3c01cde
feat: Add `useSession`
bharatkashyap Oct 13, 2024
0aff5f9
fix: Move `Divider` out of `AccountDetails`
bharatkashyap Oct 13, 2024
0363c00
fix: Remove `Divider` from `AccountDetails`
bharatkashyap Oct 13, 2024
ce95f41
fix: Add `useSession` docs and examples
bharatkashyap Oct 13, 2024
83cd903
fix: CI
bharatkashyap Oct 13, 2024
96c760c
feat: Add `sidebar` variant to `Account`
bharatkashyap Oct 13, 2024
2ff572d
fix: Move `AccountDetails` into separate component and `slots`
bharatkashyap Oct 13, 2024
86fa603
Merge branch 'enh/account-3' into feat/account-sidebar-variant
bharatkashyap Oct 13, 2024
879f7a7
wip: AccountSidebarFooter
bharatkashyap Oct 13, 2024
868eb6e
fix: CI
bharatkashyap Oct 13, 2024
429b3dc
fix: Move to completely new component architecture
bharatkashyap Oct 17, 2024
ad12efc
Merge branch 'master' into enh/account-3
bharatkashyap Oct 17, 2024
5be7914
fix: CI
bharatkashyap Oct 17, 2024
637d637
fix: update test, CI
bharatkashyap Oct 17, 2024
a941719
Merge branch 'enh/account-3' of github.com:bharatkashyap/mui-toolpad …
bharatkashyap Oct 17, 2024
bdc8e4f
fix: Pedro review
bharatkashyap Oct 17, 2024
a6b4ba9
Merge branch 'master' of github.com:mui/mui-toolpad into enh/account-3
bharatkashyap Oct 17, 2024
1c8523d
fix: Pedro review
bharatkashyap Oct 17, 2024
7334340
fix: missed
bharatkashyap Oct 17, 2024
73590d7
Merge branch 'enh/account-3' into enh/account-4
bharatkashyap Oct 18, 2024
07d48a8
fix: Accommodate new props
bharatkashyap Oct 18, 2024
4e7fdc8
fix: CI
bharatkashyap Oct 18, 2024
fcd1025
Merge branch 'enh/account-4' into feat/account-sidebar-variant
bharatkashyap Oct 18, 2024
86a84d9
wip: Add dashboard footer sidebar demo
bharatkashyap Oct 18, 2024
2a1d6d5
fix: CI
bharatkashyap Oct 18, 2024
d21ac77
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Oct 18, 2024
6107c53
Merge branch 'master' of github.com:mui/mui-toolpad into feat/account…
bharatkashyap Oct 18, 2024
58f14d6
fix: CI
bharatkashyap Oct 18, 2024
3eead4a
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Oct 21, 2024
4b5f4de
fix: Incorrect merge
bharatkashyap Oct 21, 2024
6f1499c
fix: CI
bharatkashyap Oct 21, 2024
ef3f403
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Oct 22, 2024
d8fa6be
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Oct 29, 2024
8603a43
fix: Fine tune demo
bharatkashyap Oct 29, 2024
fd826b3
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Oct 30, 2024
7b86697
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Oct 30, 2024
299eb7f
Merge branch 'master' of github.com:mui/mui-toolpad into feat/account…
bharatkashyap Oct 30, 2024
81f6346
fix: CI
bharatkashyap Oct 31, 2024
2aa87b7
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Nov 1, 2024
64acd1d
fix: Pedro review
bharatkashyap Nov 1, 2024
5b21e45
Merge branch 'feat/account-sidebar-variant' of github.com:bharatkashy…
bharatkashyap Nov 1, 2024
01194bc
fix: Pedro review 2
bharatkashyap Nov 2, 2024
45f0499
fix: CI
bharatkashyap Nov 2, 2024
cbe1024
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Nov 2, 2024
d64ffae
fix: CI
bharatkashyap Nov 2, 2024
c7949d3
Merge branch 'feat/account-sidebar-variant' of github.com:bharatkashy…
bharatkashyap Nov 2, 2024
f9a5297
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Nov 2, 2024
7dd2eb3
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Nov 3, 2024
1615ae1
Merge branch 'master' into feat/account-sidebar-variant
bharatkashyap Nov 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,15 @@ DemoPageContent.propTypes = {
};

function AccountSidebarPreview(props) {
const { handleClick, open } = props;
const { handleClick, open, mini } = props;
return (
<Stack direction="column">
<Stack direction="column" p={0} overflow="hidden">
<Divider />
<AccountPreview variant="expanded" handleClick={handleClick} open={open} />
<AccountPreview
variant={mini ? 'condensed' : 'expanded'}
handleClick={handleClick}
open={open}
/>
</Stack>
);
}
Expand All @@ -89,6 +93,7 @@ AccountSidebarPreview.propTypes = {
* The handler used when the preview is expanded
*/
handleClick: PropTypes.func,
mini: PropTypes.bool.isRequired,
/**
* The state of the Account popover
* @default false
Expand Down Expand Up @@ -164,24 +169,59 @@ function SidebarFooterAccountPopover() {
</MenuItem>
))}
</MenuList>
<Divider />
<AccountPopoverFooter>
<SignOutButton />
</AccountPopoverFooter>
</Stack>
);
}

function SidebarFooterAccount() {
function SidebarFooterAccount({ mini }) {
return (
<Account
slots={{
preview: AccountSidebarPreview,
preview: ({ handleClick, open }) => (
<AccountSidebarPreview handleClick={handleClick} open={open} mini={mini} />
),
popoverContent: SidebarFooterAccountPopover,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In these docs demos, opening and closing the popover automatically scrolls unless they have the disableAutoFocus prop, maybe we could have that somehow?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great find! I've added disableAutoFocus as true by default on the Account popover, but overridable by users through the slotProps

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I'm not 100% sure if we'd need it in a normal app though, maybe it's just a problem in the demo iframes.

}}
slotProps={{
popover: {
transformOrigin: { horizontal: 'left', vertical: 'top' },
anchorOrigin: { horizontal: 'right', vertical: 'bottom' },
slotProps: {
paper: {
elevation: 0,
sx: {
overflow: 'visible',
filter: (theme) =>
`drop-shadow(0px 2px 8px ${theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.32)'})`,
mt: 1,
'&::before': {
content: '""',
display: 'block',
position: 'absolute',
bottom: 10,
left: 0,
width: 10,
height: 10,
bgcolor: 'background.paper',
transform: 'translate(-50%, -50%) rotate(45deg)',
zIndex: 0,
},
},
},
},
},
}}
/>
);
}

SidebarFooterAccount.propTypes = {
mini: PropTypes.bool.isRequired,
};

const demoSession = {
user: {
name: 'Bharat Kashyap',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { createTheme } from '@mui/material/styles';
import DashboardIcon from '@mui/icons-material/Dashboard';
import ShoppingCartIcon from '@mui/icons-material/ShoppingCart';
import { AppProvider } from '@toolpad/core/AppProvider';
import { DashboardLayout } from '@toolpad/core/DashboardLayout';
import { DashboardLayout, SidebarFooterProps } from '@toolpad/core/DashboardLayout';
import {
Account,
AccountPreview,
Expand Down Expand Up @@ -70,13 +70,16 @@ function DemoPageContent({ pathname }: { pathname: string }) {
</Box>
);
}

function AccountSidebarPreview(props: AccountPreviewProps) {
const { handleClick, open } = props;
function AccountSidebarPreview(props: AccountPreviewProps & { mini: boolean }) {
const { handleClick, open, mini } = props;
return (
<Stack direction="column">
<Stack direction="column" p={0} overflow="hidden">
<Divider />
<AccountPreview variant="expanded" handleClick={handleClick} open={open} />
<AccountPreview
variant={mini ? 'condensed' : 'expanded'}
handleClick={handleClick}
open={open}
/>
</Stack>
);
}
Expand Down Expand Up @@ -149,20 +152,51 @@ function SidebarFooterAccountPopover() {
</MenuItem>
))}
</MenuList>
<Divider />
<AccountPopoverFooter>
<SignOutButton />
</AccountPopoverFooter>
</Stack>
);
}

function SidebarFooterAccount() {
function SidebarFooterAccount({ mini }: SidebarFooterProps) {
return (
<Account
slots={{
preview: AccountSidebarPreview,
preview: ({ handleClick, open }) => (
<AccountSidebarPreview handleClick={handleClick} open={open} mini={mini} />
),
popoverContent: SidebarFooterAccountPopover,
}}
slotProps={{
popover: {
transformOrigin: { horizontal: 'right', vertical: 'bottom' },
anchorOrigin: { horizontal: 'right', vertical: 'bottom' },
slotProps: {
paper: {
elevation: 0,
sx: {
overflow: 'visible',
filter: (theme) =>
`drop-shadow(0px 2px 8px ${theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.32)'})`,
mt: 1,
'&::before': {
content: '""',
display: 'block',
position: 'absolute',
bottom: 10,
left: 0,
width: 10,
height: 10,
bgcolor: 'background.paper',
transform: 'translate(-50%, -50%) rotate(45deg)',
zIndex: 0,
},
},
},
},
},
}}
/>
);
}
Expand Down
12 changes: 11 additions & 1 deletion docs/pages/toolpad/core/api/account-preview.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,19 @@
}
},
"slots": {
"type": { "name": "shape", "description": "{ avatar?: elementType }" },
"type": {
"name": "shape",
"description": "{ avatar?: elementType, avatarIconButton?: elementType, moreIconButton?: elementType }"
},
"additionalInfo": { "slotsApi": true }
},
"sx": {
"type": {
"name": "union",
"description": "Array&lt;func<br>&#124;&nbsp;object<br>&#124;&nbsp;bool&gt;<br>&#124;&nbsp;func<br>&#124;&nbsp;object"
},
"additionalInfo": { "sx": true }
},
"variant": {
"type": { "name": "enum", "description": "'condensed'<br>&#124;&nbsp;'expanded'" },
"default": "'condensed'"
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/toolpad/core/api/account.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"slotProps": {
"type": {
"name": "shape",
"description": "{ popover?: object, popoverContent?: object, preview?: { handleClick?: func, open?: bool, slotProps?: { avatar?: object, avatarIconButton?: object, moreIconButton?: object }, slots?: { avatar?: elementType, avatarIconButton?: elementType, moreIconButton?: elementType }, variant?: 'condensed'<br>&#124;&nbsp;'expanded' }, signInButton?: object, signOutButton?: object }"
"description": "{ popover?: object, popoverContent?: object, preview?: { handleClick?: func, open?: bool, slotProps?: { avatar?: object, avatarIconButton?: object, moreIconButton?: object }, slots?: { avatar?: elementType, avatarIconButton?: elementType, moreIconButton?: elementType }, sx?: Array&lt;func<br>&#124;&nbsp;object<br>&#124;&nbsp;bool&gt;<br>&#124;&nbsp;func<br>&#124;&nbsp;object, variant?: 'condensed'<br>&#124;&nbsp;'expanded' }, signInButton?: object, signOutButton?: object }"
}
},
"slots": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
"open": { "description": "The state of the Account popover" },
"slotProps": { "description": "The props used for each slot inside." },
"slots": { "description": "The components used for each slot inside." },
"sx": {
"description": "To override the default <code>sx</code> value on the <code>Stack</code> component in the &quot;expanded&quot; variant"
},
"variant": { "description": "The type of account details to display." }
},
"classDescriptions": {},
Expand Down
34 changes: 23 additions & 11 deletions packages/toolpad-core/src/Account/Account.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import * as React from 'react';
import PropTypes from 'prop-types';
import Button from '@mui/material/Button';
import Popover from '@mui/material/Popover';
import Button, { ButtonProps } from '@mui/material/Button';
import Popover, { PopoverProps } from '@mui/material/Popover';
import Divider from '@mui/material/Divider';
import Stack from '@mui/material/Stack';
import Stack, { StackProps } from '@mui/material/Stack';
import { SignInButton } from './SignInButton';
import { SignOutButton } from './SignOutButton';
import { AccountPreview, AccountPreviewProps } from './AccountPreview';
Expand All @@ -17,27 +17,27 @@ export interface AccountSlots {
* The component used for the account preview
* @default AccountPreview
*/
preview?: React.ElementType;
preview?: React.JSXElementConstructor<AccountPreviewProps>;
/**
* The component used for the account popover menu
* @default Popover
*/
popover?: React.ElementType;
popover?: React.JSXElementConstructor<PopoverProps>;
/**
* The component used for the content of account popover
* @default Stack
*/
popoverContent?: React.ElementType;
popoverContent?: React.JSXElementConstructor<StackProps>;
/**
* The component used for the sign in button.
* @default Button
*/
signInButton?: React.ElementType;
signInButton?: React.JSXElementConstructor<ButtonProps>;
/**
* The component used for the sign out button.
* @default Button
*/
signOutButton?: React.ElementType;
signOutButton?: React.JSXElementConstructor<ButtonProps>;
}

export interface AccountProps {
Expand All @@ -50,7 +50,7 @@ export interface AccountProps {
*/
slotProps?: {
preview?: AccountPreviewProps;
popover?: React.ComponentProps<typeof Popover>;
popover?: Omit<React.ComponentProps<typeof Popover>, 'open'>;
popoverContent?: React.ComponentProps<typeof Stack>;
signInButton?: React.ComponentProps<typeof SignInButton>;
signOutButton?: React.ComponentProps<typeof Button>;
Expand Down Expand Up @@ -118,14 +118,20 @@ function Account(props: AccountProps) {
/>
)}
{slots?.popover ? (
<slots.popover {...slotProps?.popover} />
<slots.popover
open={open}
onClick={handleClick}
onClose={handleClose}
{...slotProps?.popover}
/>
) : (
<Popover
anchorEl={anchorEl}
id="account-menu"
open={open}
onClose={handleClose}
onClick={handleClose}
disableAutoFocus
transformOrigin={{ horizontal: 'right', vertical: 'top' }}
anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}
{...slotProps?.popover}
Expand All @@ -134,7 +140,8 @@ function Account(props: AccountProps) {
elevation: 0,
sx: {
overflow: 'visible',
filter: 'drop-shadow(0px 2px 8px rgba(0,0,0,0.32))',
filter: (theme) =>
`drop-shadow(0px 2px 8px ${theme.palette.mode === 'dark' ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.32)'})`,
mt: 1,
'&::before': {
content: '""',
Expand Down Expand Up @@ -204,6 +211,11 @@ Account.propTypes /* remove-proptypes */ = {
avatarIconButton: PropTypes.elementType,
moreIconButton: PropTypes.elementType,
}),
sx: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
PropTypes.func,
PropTypes.object,
]),
variant: PropTypes.oneOf(['condensed', 'expanded']),
}),
signInButton: PropTypes.object,
Expand Down
22 changes: 19 additions & 3 deletions packages/toolpad-core/src/Account/AccountPreview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import IconButton, { IconButtonProps } from '@mui/material/IconButton';
import MoreVertIcon from '@mui/icons-material/MoreVert';
import { SessionContext } from '../AppProvider';
import { useLocaleText } from '../shared/locales/LocaleContext';
import type { SxProps } from '@mui/material/styles';

export type AccountPreviewVariant = 'condensed' | 'expanded';

Expand Down Expand Up @@ -58,6 +59,10 @@ export interface AccountPreviewProps {
* @default false
*/
open?: boolean;
/**
* To override the default `sx` value on the `Stack` component in the "expanded" variant
*/
sx?: SxProps;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So it applies to the expanded variant only? Probably ideally it would apply to any variant to be less confusing.
If you're not using it yet maybe we can skip this prop for now?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair enough, we can leave it out for now, adding it will not be a breaking change later

}

/**
Expand All @@ -72,7 +77,7 @@ export interface AccountPreviewProps {
* - [AccountPreview API](https://mui.com/toolpad/core/api/account-preview)
*/
function AccountPreview(props: AccountPreviewProps) {
const { slots, variant = 'condensed', slotProps, open, handleClick } = props;
const { slots, variant = 'condensed', slotProps, open, handleClick, sx } = props;
const session = React.useContext(SessionContext);
const localeText = useLocaleText();

Expand All @@ -93,7 +98,7 @@ function AccountPreview(props: AccountPreviewProps) {

if (variant === 'expanded') {
return (
<Stack direction="row" justifyContent="space-between" spacing={2} padding={2}>
<Stack direction="row" justifyContent="space-between" sx={{ py: 1, px: 2, gap: 2, ...sx }}>
<Stack direction="row" justifyContent="flex-start" spacing={2}>
{avatarContent}
<Stack direction="column" justifyContent="space-evenly">
Expand All @@ -113,7 +118,7 @@ function AccountPreview(props: AccountPreviewProps) {
size="small"
onClick={handleClick}
{...slotProps?.moreIconButton}
sx={{ alignSelf: 'flex-start', ...slotProps?.moreIconButton?.sx }}
sx={{ alignSelf: 'center', ...slotProps?.moreIconButton?.sx }}
>
<MoreVertIcon fontSize="small" />
</IconButton>
Expand All @@ -131,6 +136,7 @@ function AccountPreview(props: AccountPreviewProps) {
onClick={handleClick}
aria-label={localeText.iconButtonAriaLabel || 'Current User'}
size="small"
sx={{ width: 'fit-content', margin: '0 auto' }}
aria-controls={open ? 'account-menu' : undefined}
aria-haspopup="true"
aria-expanded={open ? 'true' : undefined}
Expand Down Expand Up @@ -170,7 +176,17 @@ AccountPreview.propTypes /* remove-proptypes */ = {
*/
slots: PropTypes.shape({
avatar: PropTypes.elementType,
avatarIconButton: PropTypes.elementType,
moreIconButton: PropTypes.elementType,
}),
/**
* To override the default `sx` value on the `Stack` component in the "expanded" variant
*/
sx: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])),
PropTypes.func,
PropTypes.object,
]),
/**
* The type of account details to display.
* @property {'condensed'} condensed - Shows only the user's avatar.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ export interface DashboardLayoutSlots {
* Optional footer component used in the layout sidebar.
* @default null
*/
sidebarFooter?: React.ElementType;
sidebarFooter?: React.JSXElementConstructor<SidebarFooterProps>;
}

export interface DashboardLayoutProps {
Expand Down
Loading