This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jun 3, 2020. It is now read-only.

Repository files navigation

React Sidebar npm versionBuild Status

React Sidebar is a sidebar component for React 0.14+. It offers the following features:

  • The sidebar can slide over the main content or dock next to it.
  • Touch enabled: swipe to open and close the sidebar like on a native mobile app.
  • Easy to combine with media queries to show the sidebar only when there's enough screen-width (see example).
  • Works on both the left and right side.
  • Tiny size: <2.5kB gzipped
  • MIT license

See a demo here.

Touch specifics

The touch interaction of the React Sidebar mimics the interactions that are supported by Android apps that implement the material design spec:

  • When the sidebar is closed, dragging from the left side of the screen will have the right side of the sidebar follow your finger.
  • When the sidebar is open, sliding your finger over the screen will only affect the sidebar once your finger is over the sidebar.
  • On release, it will call onSetOpen prop if the distance the sidebar was dragged is more than the dragToggleDistance prop.

Note: The sidebar touch functionality doesn't work on IOS because of the "swipe-to-go-back" feature. Therefore the functionality has been disabled on IOS.

Installation

npm install react-sidebar

If you use TypeScript, typings are available on DefinitelyTyped and can be installed with:

npm install @types/react-sidebar

Getting started

By design, React Sidebar does not keep track of whether it is open or not. This has to be done by the parent component. This allows the parent component to make changes to the sidebar and main content based on the open/docked state. An example could be to hide the "show menu" button from the main content when the sidebar is docked.

Because React Sidebar can be toggled by dragging the sidebar into its open/closed position, you will have to pass in an onSetOpen method as a prop to allow the sidebar to control the open state in the parent.

The minimum React component to integrate React Sidebar looks like this:

importReactfrom"react";importSidebarfrom"react-sidebar";classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarOpen: true};this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}onSetOpen={this.onSetSidebarOpen}styles={{sidebar: {background: "white"}}}><buttononClick={()=>this.onSetSidebarOpen(true)}>
Open sidebar
</button></Sidebar>);}}exportdefaultApp;

Responsive sidebar

A common use case for a sidebar is to show it automatically when there is enough screen width available. This can be achieved using media queries via window.matchMedia. This again has to be integrated into the parent component so you can use the information to make changes to the sidebar and main content.

importReactfrom"react";importSidebarfrom"react-sidebar";constmql=window.matchMedia(`(min-width: 800px)`);classAppextendsReact.Component{constructor(props){super(props);this.state={sidebarDocked: mql.matches,sidebarOpen: false};this.mediaQueryChanged=this.mediaQueryChanged.bind(this);this.onSetSidebarOpen=this.onSetSidebarOpen.bind(this);}componentWillMount(){mql.addListener(this.mediaQueryChanged);}componentWillUnmount(){mql.removeListener(this.mediaQueryChanged);}onSetSidebarOpen(open){this.setState({sidebarOpen: open});}mediaQueryChanged(){this.setState({sidebarDocked: mql.matches,sidebarOpen: false});}render(){return(<Sidebarsidebar={<b>Sidebar content</b>}open={this.state.sidebarOpen}docked={this.state.sidebarDocked}onSetOpen={this.onSetSidebarOpen}><b>Main content</b></Sidebar>);}}exportdefaultApp;

Supported props

Property nameTypeDefaultDescription
childrenAnything React can rendern/aThe main content
rootClassNamestringn/aAdd a custom class to the root component
sidebarClassNamestringn/aAdd a custom class to the sidebar
contentClassNamestringn/aAdd a custom class to the content
overlayClassNamestringn/aAdd a custom class to the overlay
defaultSidebarWidthnumber0Width in pixles of the sidebar on render. Use this to stop the sidebar from poping in after intial render. (Overrides transitions)
sidebarAnything React can rendern/aThe sidebar content
onSetOpenfunctionn/aCallback called when the sidebar wants to change the open prop. Happens after sliding the sidebar and when the overlay is clicked when the sidebar is open.
dockedbooleanfalseIf the sidebar should be always visible
openbooleanfalseIf the sidebar should be open
transitionsbooleantrueIf transitions should be enabled
touchbooleantrueIf touch gestures should be enabled
touchHandleWidthnumber20Width in pixels you can start dragging from the edge when the sidebar is closed.
dragToggleDistancenumber30Distance the sidebar has to be dragged before it will open/close after it is released.
pullRightbooleanfalsePlace the sidebar on the right
shadowbooleantrueEnable/Disable sidebar shadow
stylesobjectSee belowInline styles. These styles are merged with the defaults and applied to the respective elements.
rootIdstringn/aAdd an id to the root component
sidebarIdstringn/aAdd an id to the sidebar
contentIdstringn/aAdd an id to the content. The driving use case for adding an element id to content was to allow react-scroll to scroll the content area of the site using react-sidebar.
overlayIdstringn/aAdd an an id to the overlay

Styles

Styles are passed as an object with 5 keys, root, sidebar, content, overlay and dragHandle, and merged to the following defaults:

{root: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflow: "hidden"},sidebar: {zIndex: 2,position: "absolute",top: 0,bottom: 0,transition: "transform .3s ease-out",WebkitTransition: "-webkit-transform .3s ease-out",willChange: "transform",overflowY: "auto"},content: {position: "absolute",top: 0,left: 0,right: 0,bottom: 0,overflowY: "auto",WebkitOverflowScrolling: "touch",transition: "left .3s ease-out, right .3s ease-out"},overlay: {zIndex: 1,position: "fixed",top: 0,left: 0,right: 0,bottom: 0,opacity: 0,visibility: "hidden",transition: "opacity .3s ease-out, visibility .3s ease-out",backgroundColor: "rgba(0,0,0,.3)"},dragHandle: {zIndex: 1,position: "fixed",top: 0,bottom: 0}};

Acknowledgements

My goal was to make a React Component that implements the material design spec for navigation drawers. My initial attempt was to improve hamburger-basement by arnemart but I quickly figured that I better start from scratch. Still, that project helped me a ton to get started.

About

A sidebar component for React

Resources

Stars

1.5k stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages