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,