Skip to content

Commit

Permalink
[FX-5614] Add light variant support for PageTopBarMenu (#4403)
Browse files Browse the repository at this point in the history
* Add `invert` to `PageTopBarMenu`

* Remove prop and move to context

* Fix changeset
  • Loading branch information
mkrl committed Jul 8, 2024
1 parent 5acb05f commit 337d17a
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 54 deletions.
7 changes: 7 additions & 0 deletions .changeset/clever-horses-cheer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@toptal/picasso-page': minor
---

### PageTopBar, PageTopBarMenu

- added support for `PageTopBarMenu` to be rendered in `PageTopBar` when `variant='light'`
111 changes: 62 additions & 49 deletions packages/base/Page/src/PageTopBar/PageTopBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ export interface Props extends BaseProps, HTMLAttributes<HTMLElement> {
}
}

export const PageTopBarContext = React.createContext<{ variant: VariantType }>({
variant: 'dark',
})

const useStyles = makeStyles<Theme>(styles, {
name: 'PicassoTopBar',
})
Expand Down Expand Up @@ -125,58 +129,67 @@ export const PageTopBar = forwardRef<HTMLElement, Props>(function PageTopBar(
)

return (
<div className={classes.wrapper}>
<header
{...rest}
ref={ref}
className={cx('mui-fixed', classes.root, classes[variant], className, {
[classes.preventPageWidthChangeOnScrollbar]:
preventPageWidthChangeOnScrollbar,
})}
style={style}
>
<div className={innerClassName}>
{/* Left part: Hamburger, Logo, Tagline, Search bar */}
<div className={classes.left}>
<Container flex alignItems='center' gap='small'>
<PageHamburger
id={hamburgerId}
data-testid={testIds?.hamburger}
/>
{logoLink
? React.cloneElement(logoLink, {}, logoComponent)
: logoComponent}
{titleComponent}
</Container>
{leftContent}
</div>

{/* Center part: inline menu */}
{centerContent && (
<>
<PageHamburgerPortal>
<div className={classes.centerContentPortal}>
{centerContent}
</div>
</PageHamburgerPortal>
<Container
flex
alignItems='center'
className={classes.centerContent}
>
{centerContent}
</Container>
</>
<PageTopBarContext.Provider value={{ variant }}>
<div className={classes.wrapper}>
<header
{...rest}
ref={ref}
className={cx(
'mui-fixed',
classes.root,
classes[variant],
className,
{
[classes.preventPageWidthChangeOnScrollbar]:
preventPageWidthChangeOnScrollbar,
}
)}
style={style}
>
<div className={innerClassName}>
{/* Left part: Hamburger, Logo, Tagline, Search bar */}
<div className={classes.left}>
<Container flex alignItems='center' gap='small'>
<PageHamburger
id={hamburgerId}
data-testid={testIds?.hamburger}
/>
{logoLink
? React.cloneElement(logoLink, {}, logoComponent)
: logoComponent}
{titleComponent}
</Container>
{leftContent}
</div>

{/* Center part: inline menu */}
{centerContent && (
<>
<PageHamburgerPortal>
<div className={classes.centerContentPortal}>
{centerContent}
</div>
</PageHamburgerPortal>
<Container
flex
alignItems='center'
className={classes.centerContent}
>
{centerContent}
</Container>
</>
)}

{/* Right part: Action items, User menu, Notifications */}

{/* Right part: Action items, User menu, Notifications */}
<div className={classes.right}>
{actionItems}
{rightContent}
<div className={classes.right}>
{actionItems}
{rightContent}
</div>
</div>
</div>
</header>
</div>
</header>
</div>
</PageTopBarContext.Provider>
)
})

Expand Down
1 change: 1 addition & 0 deletions packages/base/Page/src/PageTopBar/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ import type { OmitInternalProps } from '@toptal/picasso-shared'
import type { Props } from './PageTopBar'

export { default as PageTopBar } from './PageTopBar'
export { PageTopBarContext } from './PageTopBar'
export type PageTopBarProps = OmitInternalProps<Props>
export * from './constants'
26 changes: 26 additions & 0 deletions packages/base/Page/src/PageTopBar/story/Variants.example.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,32 @@ const Example = () => (
}
/>
</Container>

<Container style={{ position: 'relative', height: '6rem' }}>
<Page hamburgerId='hamburger-default-example'>
<Page.TopBar
variant='light'
title='Light with menu'
actionItems={
<Container right={SPACING_6}>
<Button variant='primary'>Create job</Button>
</Container>
}
rightContent={
<Page.TopBarMenu
name='Jacqueline Roque'
meta='Developer'
avatar='./jacqueline-with-flowers-1954-square.jpg'
>
<Menu>
<Menu.Item>My Account</Menu.Item>
<Menu.Item>Log Out</Menu.Item>
</Menu>
</Page.TopBarMenu>
}
/>
</Page>
</Container>
</div>
)

Expand Down
14 changes: 10 additions & 4 deletions packages/base/Page/src/PageTopBarMenu/PageTopBarMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable complexity */
import type { ReactNode, HTMLAttributes } from 'react'
import React, { forwardRef } from 'react'
import React, { useContext, forwardRef } from 'react'
import cx from 'classnames'
import type { Theme } from '@material-ui/core/styles'
import { makeStyles } from '@material-ui/core/styles'
Expand All @@ -12,6 +12,7 @@ import { Typography } from '@toptal/picasso-typography'
import { DropdownCompound as Dropdown } from '@toptal/picasso-dropdown'

import styles from './styles'
import { PageTopBarContext } from '../PageTopBar'

const useStyles = makeStyles<Theme>(styles, {
name: 'PicassoTopBarMenu',
Expand Down Expand Up @@ -42,13 +43,16 @@ export const PageTopBarMenu = forwardRef<HTMLDivElement, Props>(
} = props
const classes = useStyles()

const { variant } = useContext(PageTopBarContext)
const invert = variant === 'light'

const isCompactLayout = useBreakpoint(['xs', 'sm', 'md'])

const metaContent =
typeof meta === 'string' ? (
<Typography
className={classes.truncateText}
invert={!isCompactLayout}
invert={!isCompactLayout && !invert}
size='xsmall'
data-private={dataPrivate}
>
Expand Down Expand Up @@ -89,7 +93,7 @@ export const PageTopBarMenu = forwardRef<HTMLDivElement, Props>(
/>
) : (
<UserBadge
invert
invert={!invert}
center
size='xxsmall'
classes={{
Expand Down Expand Up @@ -122,7 +126,9 @@ export const PageTopBarMenu = forwardRef<HTMLDivElement, Props>(
}}
>
{trigger}
<Dropdown.Arrow className={classes.arrow} />
<Dropdown.Arrow
className={cx(classes.arrow, { [classes.invert]: invert })}
/>
</Dropdown>
)
}
Expand Down
5 changes: 4 additions & 1 deletion packages/base/Page/src/PageTopBarMenu/styles.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Theme } from '@material-ui/core/styles'
import { createStyles } from '@material-ui/core/styles'

export default ({ screens }: Theme) =>
export default ({ screens, palette }: Theme) =>
createStyles({
avatar: {
fontSize: '0.9rem',
Expand Down Expand Up @@ -38,6 +38,9 @@ export default ({ screens }: Theme) =>
marginLeft: '0.5rem',
},
},
invert: {
color: palette.text.primary,
},
paper: {
[screens('xs', 'sm', 'md')]: {
top: '2.5em !important',
Expand Down

0 comments on commit 337d17a

Please sign in to comment.