diff --git a/.changeset/four-pandas-roll.md b/.changeset/four-pandas-roll.md new file mode 100644 index 00000000000..e0059e64c5f --- /dev/null +++ b/.changeset/four-pandas-roll.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +Hidden component diff --git a/docs/content/drafts/Hidden.mdx b/docs/content/drafts/Hidden.mdx new file mode 100644 index 00000000000..c20bc13626d --- /dev/null +++ b/docs/content/drafts/Hidden.mdx @@ -0,0 +1,56 @@ +--- +title: Hidden +description: Use Hidden to responsively hide or show content in narrow, regular and wide viewports. +source: https://github.com/primer/react/blob/main/src/Hidden/index.tsx +status: Alpha +componentId: hidden +--- + +The `Hidden` component is a utility component that will help you hide or show content/components in different viewports. +**Attention:** Use Hidden only to control behaviour in a responsive manner. It does not take any `sx` props. + +## Example + +```jsx live + + + +``` + +## Array as `when` prop + +```jsx live + + + +``` + +## Props + + + + + +## Status + + diff --git a/docs/src/@primer/gatsby-theme-doctocat/nav.yml b/docs/src/@primer/gatsby-theme-doctocat/nav.yml index 60e6565d437..71a548febde 100644 --- a/docs/src/@primer/gatsby-theme-doctocat/nav.yml +++ b/docs/src/@primer/gatsby-theme-doctocat/nav.yml @@ -155,6 +155,8 @@ children: - title: Dialog v2 url: /drafts/Dialog + - title: Hidden + url: /Hidden - title: InlineAutocomplete url: /drafts/InlineAutocomplete - title: MarkdownEditor diff --git a/src/Hidden/Hidden.stories.tsx b/src/Hidden/Hidden.stories.tsx new file mode 100644 index 00000000000..02f111cea46 --- /dev/null +++ b/src/Hidden/Hidden.stories.tsx @@ -0,0 +1,54 @@ +import {Meta} from '@storybook/react' +import React from 'react' +import {ThemeProvider} from '..' +import {Hidden} from './Hidden' +import BaseStyles from '../BaseStyles' +import Box from '../Box' + +const meta: Meta = { + title: 'Layout components/Hidden', + component: Hidden, + decorators: [ + (Story: React.ComponentType>): JSX.Element => ( + + + + + + ) + ], + parameters: { + controls: { + expanded: true + } + }, + argTypes: { + on: { + type: { + name: 'enum', + value: ['narrow', 'regular', 'wide'] + }, + defaultValue: 'regular', + control: {type: 'radio'} + } + } +} +export default meta + +export const isVisibleInRegularOnly = () => ( + + This value is only shown in regular viewport + +) + +export const isVisibleInNarrowOnly = () => ( + + This value is only shown in narrow viewport + +) + +export const isHiddenInNarrowOnly = () => ( + + This is hidden in narrow only + +) diff --git a/src/Hidden/Hidden.tsx b/src/Hidden/Hidden.tsx new file mode 100644 index 00000000000..d986cebed71 --- /dev/null +++ b/src/Hidden/Hidden.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import {useMedia} from '../hooks/useMedia' +import {viewportRanges} from '../hooks/useResponsiveValue' + +type Viewports = 'narrow' | 'regular' | 'wide' + +type HiddenProps = { + on: Array | Viewports + children: React.ReactNode +} + +export const Hidden = ({on: hiddenViewports, children}: HiddenProps) => { + const isNarrowViewport = useMedia(viewportRanges.narrow) + const isRegularViewport = useMedia(viewportRanges.regular) + const isWideViewport = useMedia(viewportRanges.wide) + let show = true + if (isNarrowViewport && (hiddenViewports === 'narrow' || hiddenViewports.indexOf('narrow') > -1)) { + show = false + } else if (isRegularViewport && (hiddenViewports === 'regular' || hiddenViewports.indexOf('regular') > -1)) { + show = false + } else if (isWideViewport && (hiddenViewports === 'wide' || hiddenViewports.indexOf('wide') > -1)) { + show = false + } + return show ? <>{children} : null +} diff --git a/src/Hidden/index.tsx b/src/Hidden/index.tsx new file mode 100644 index 00000000000..72f57bdd264 --- /dev/null +++ b/src/Hidden/index.tsx @@ -0,0 +1,3 @@ +import {Hidden} from './Hidden' + +export default Hidden diff --git a/src/drafts/index.ts b/src/drafts/index.ts index 23bd8a7d9ba..21c700ad43a 100644 --- a/src/drafts/index.ts +++ b/src/drafts/index.ts @@ -6,6 +6,8 @@ */ export * from '../Dialog/Dialog' +export * from '../Hidden' // Will be moved from drafts to main bundle after utility is proven + export {default as InlineAutocomplete} from './InlineAutocomplete' export type { InlineAutocompleteProps,