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

PageHeader: Initial implementation #2265

Merged
merged 27 commits into from
Dec 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3c6c646
Add PageHeader component
pksjce Aug 24, 2022
349748e
Use styled system array props
pksjce Sep 8, 2022
2e8af50
wip
broccolinisoup Nov 14, 2022
4a337de
initial working implementation - not polished at all
broccolinisoup Nov 15, 2022
4e52c61
Add controls
broccolinisoup Nov 16, 2022
61d1e82
update stories
broccolinisoup Nov 17, 2022
6d042c6
fix linting
broccolinisoup Nov 17, 2022
548de17
address code review feedback
broccolinisoup Nov 25, 2022
b5f5e00
make ParentLink polymorphic and use as and aria-label
broccolinisoup Nov 28, 2022
5bc99a7
story examples and features
broccolinisoup Nov 28, 2022
bdb0520
add changeset and delete comment out code
broccolinisoup Nov 28, 2022
6542584
do not export viewports as a story
broccolinisoup Nov 28, 2022
70d387f
rename prop visible->hidden
broccolinisoup Dec 2, 2022
518a028
remove defaultValues in storybook - get feedback first
broccolinisoup Dec 2, 2022
fe0e696
use theme preval & some rem update & prettier
broccolinisoup Dec 6, 2022
58725ae
prettier lint fix
broccolinisoup Dec 6, 2022
389bfac
try using media query instead of hook
broccolinisoup Dec 6, 2022
db61db7
Revert "try using media query instead of hook"
broccolinisoup Dec 7, 2022
c86f362
Spacing adjustments
broccolinisoup Dec 7, 2022
1139bb1
align items to top when the title is multi line
broccolinisoup Dec 7, 2022
03c6834
move variant to the parent and provide context & code review feedback
broccolinisoup Dec 8, 2022
65834a7
remove todo for feature stories
broccolinisoup Dec 8, 2022
d855974
move Box
broccolinisoup Dec 8, 2022
6629315
remove line-height for min touch size and add a comment
broccolinisoup Dec 8, 2022
f1ca9ea
Merge branch 'main' into pk/page-header
broccolinisoup Dec 8, 2022
4e77758
add unit tests and snapshot
broccolinisoup Dec 9, 2022
35542f8
Merge branch 'main' into pk/page-header
broccolinisoup Dec 9, 2022
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
5 changes: 5 additions & 0 deletions .changeset/blue-fireants-behave.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@primer/react': minor
---

PageHeader: Draft implementation
284 changes: 284 additions & 0 deletions src/PageHeader/PageHeader.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,284 @@
import React from 'react'
import {Meta, Story} from '@storybook/react'
import {Button, IconButton, Breadcrumbs, Link, Text, StateLabel, BranchName, Box} from '..'
import {UnderlineNav} from '../UnderlineNav2'
import Label from '../Label'
import {
KebabHorizontalIcon,
GitBranchIcon,
CodeIcon,
GitPullRequestIcon,
PeopleIcon,
PencilIcon,
CommentDiscussionIcon,
CommitIcon,
ChecklistIcon,
FileDiffIcon,
ArrowRightIcon,
SidebarExpandIcon,
} from '@primer/octicons-react'
import {OcticonArgType} from '../utils/story-helpers'

import {PageHeader} from './PageHeader'
import Hidden from '../Hidden'

const meta: Meta = {
title: 'Drafts/Components/PageHeader',
parameters: {
layout: 'fullscreen',
controls: {expanded: true},
},
args: {
hasContextArea: false,
hasParentLink: true,
ParentLink: 'Previous page',
hasContextBar: false,
hasContextAreaAction: true,
hasLeadingAction: false,
hasTitle: true,
Title: 'Branches',
'Title.as': 'h2',
'Title.variant': 'medium',
hasLeadingVisual: false,
LeadingVisual: GitBranchIcon,
hasTrailingVisual: false,
hasTrailingAction: false,
hasActions: false,
hasDescription: false,
hasNavigation: false,
},
argTypes: {
hasContextArea: {
type: 'boolean',
table: {
category: 'ContextArea Slot',
type: {summary: 'string'},
},
description:
'ContextArea is only visible on narrow viewports by default to provide user context of where they are at their journey.',
},
ParentLink: {
type: 'string',
if: {arg: 'hasContextArea'},
table: {
category: 'ContextArea Slot',
},
description: 'The default way to let users navigate up in the hierarchy on Narrow viewports.',
},
hasParentLink: {
type: 'boolean',
if: {arg: 'hasContextArea'},
table: {
category: 'ContextArea Slot',
},
description: 'Parent ',
},
hasContextBar: {
type: 'boolean',
if: {arg: 'hasContextArea'},
table: {
category: 'ContextArea Slot',
},
description:
'ContextBar is generic slot for any component above the title region. Use it for custom breadcrumbs and other navigation elements instead of ParentLink.',
},
hasContextAreaAction: {
type: 'boolean',
if: {arg: 'hasContextArea'},
table: {
category: 'ContextArea Slot',
},
},
hasLeadingAction: {
type: 'boolean',
table: {
category: 'TitleArea Slot',
},
description:
'A back button can be used as a leading action for local navigation. On Narrow viewports, use parentLink instead.',
},
hasTitle: {
type: 'boolean',
table: {
category: 'TitleArea Slot',
},
description:
'ContextBar is generic slot for any component above the title region. Use it for custom breadcrumbs and other navigation elements instead of ParentLink.',
},
Title: {
type: 'string',
table: {
category: 'TitleArea Slot',
},
},
'Title.as': {
control: {
type: 'select',
},
options: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
table: {
category: 'TitleArea Slot',
},
},
'Title.variant': {
control: {
type: 'radio',
},
options: ['large', 'medium', 'subtitle'],
table: {
category: 'TitleArea Slot',
},
description:
'`medium` is the most common page title size. Use for static titles in most situations. `large` for for user-generated content such as issues, pull requests, or discussions. `subtitle` when a PageHeader.Title is already present in the page, such as in a SplitPageLayout.',
},
hasLeadingVisual: {
type: 'boolean',
table: {
category: 'TitleArea Slot',
},
},
LeadingVisual: {
...OcticonArgType([CodeIcon, GitPullRequestIcon, PeopleIcon]),
table: {
category: 'TitleArea Slot',
},
description:
'Leading visualLeading visuals are optional and appear at the start of the title. They can be octicons, avatars, and other custom visuals that fit a small area.',
},
hasTrailingVisual: {
type: 'boolean',
table: {
category: 'TitleArea Slot',
},
description:
'Trailing visualTrailing visual and trailing text can display auxiliary information. They are placed at the right of the item, and can denote status, privacy details, etc.',
},
hasTrailingAction: {
type: 'boolean',
table: {
category: 'TitleArea Slot',
},
},
hasActions: {
type: 'boolean',
table: {
category: 'TitleArea Slot',
},
description: 'Description region/slot',
},
hasDescription: {
type: 'boolean',
table: {
category: 'Other Slots',
},
description: 'Description region/slot',
},
hasNavigation: {
type: 'boolean',
table: {
category: 'Other Slots',
},
description: 'Description region/slot',
},
},
}

const Template: Story = args => (
<Box sx={{padding: 3}}>
<PageHeader>
<PageHeader.ContextArea hidden={!args.hasContextArea}>
<PageHeader.ParentLink href="http://github.com" hidden={!args.hasParentLink}>
{args.ParentLink}
</PageHeader.ParentLink>

<PageHeader.ContextBar hidden={!args.hasContextBar}>
<Breadcrumbs>
<Breadcrumbs.Item href="#">...</Breadcrumbs.Item>
<Breadcrumbs.Item href="#">primer</Breadcrumbs.Item>
<Breadcrumbs.Item href="#">react</Breadcrumbs.Item>
<Breadcrumbs.Item href="#">src</Breadcrumbs.Item>
<Breadcrumbs.Item href="#">PageHeader</Breadcrumbs.Item>
<Breadcrumbs.Item href="#">PageHeader.tsx</Breadcrumbs.Item>
</Breadcrumbs>
</PageHeader.ContextBar>

<PageHeader.ContextAreaActions hidden={!args.hasContextAreaAction}>
<Button size="small" leadingIcon={GitBranchIcon}>
Main
</Button>
<IconButton size="small" aria-label="More" icon={KebabHorizontalIcon} />
</PageHeader.ContextAreaActions>
</PageHeader.ContextArea>
<PageHeader.TitleArea
variant={{
narrow: args['Title.variant'],
regular: args['Title.variant'],
wide: args['Title.variant'],
}}
>
<PageHeader.LeadingAction hidden={!args.hasLeadingAction}>
<IconButton icon={SidebarExpandIcon} variant="invisible" />{' '}
</PageHeader.LeadingAction>
<PageHeader.LeadingVisual hidden={!args.hasLeadingVisual}>{<args.LeadingVisual />}</PageHeader.LeadingVisual>
<PageHeader.Title as={args['Title.as']} hidden={!args.hasTitle}>
{args.Title}
</PageHeader.Title>
<PageHeader.TrailingVisual hidden={!args.hasTrailingVisual}>
<Label>Beta</Label>
</PageHeader.TrailingVisual>
<PageHeader.TrailingAction hidden={!args.hasTrailingAction}>
<IconButton icon={PencilIcon} variant="invisible" />
</PageHeader.TrailingAction>
<PageHeader.Actions hidden={!args.hasActions}>
<Hidden on={['narrow']}>
<Button variant="primary">New Branch</Button>
</Hidden>

<Hidden on={['regular', 'wide', 'narrow']}>
<Button variant="primary">New</Button>
</Hidden>
<IconButton aria-label="More" icon={KebabHorizontalIcon} />
</PageHeader.Actions>
</PageHeader.TitleArea>
<PageHeader.Description hidden={!args.hasDescription}>
<StateLabel status="pullOpened">Open</StateLabel>
<Hidden on={['narrow']}>
<Text sx={{fontSize: 1, color: 'fg.muted'}}>
<Link href="#" muted sx={{fontWeight: 'bold'}}>
broccolinisoup
</Link>{' '}
wants to merge 3 commits into <BranchName href="#">main</BranchName> from{' '}
<BranchName href="#">broccolinisoup/switch-to-new-underlineNav</BranchName>
</Text>
</Hidden>
<Hidden on={['regular', 'wide']}>
<Text sx={{fontSize: 1, color: 'fg.muted'}}>
<BranchName href="#">main</BranchName>
<ArrowRightIcon />
<BranchName href="#">page-header-initial</BranchName>
</Text>
</Hidden>
</PageHeader.Description>
<PageHeader.Navigation hidden={!args.hasNavigation}>
<UnderlineNav aria-label="Pull Request">
<UnderlineNav.Item icon={CommentDiscussionIcon} counter="12" aria-current="page">
Conversation
</UnderlineNav.Item>
<UnderlineNav.Item counter={3} icon={CommitIcon}>
Commits
</UnderlineNav.Item>
<UnderlineNav.Item counter={7} icon={ChecklistIcon}>
Checks
</UnderlineNav.Item>
<UnderlineNav.Item counter={4} icon={FileDiffIcon}>
Files Changes
</UnderlineNav.Item>
</UnderlineNav>
</PageHeader.Navigation>
</PageHeader>
</Box>
)

export const Playground = Template.bind({})

export default meta
Loading