I found a clean nav solution. So maybe this can help someone else. The solution is to use standard reaction-bootstrap components such as Navbar in combination with bootstrap css configuration.
Sample code below:
SideBarMenu.jsx
import React from 'react'; import styles from './sideBarMenu.css'; import {Nav, NavItem, Navbar, NavDropdown, MenuItem, Glyphicon} from 'react-bootstrap'; export default React.createClass( { render: function() { return <div id="sidebar-menu" className={styles.sideBarMenuContainer}> <Navbar fluid className={styles.sidebar} inverse > <Navbar.Header> <Navbar.Brand> <a href="/">User Name</a> </Navbar.Brand> <Navbar.Toggle /> </Navbar.Header> <Navbar.Collapse> <Navbar.Text className={styles.userMenu}> <Navbar.Link href="#"><Glyphicon glyph="home"/></Navbar.Link> <Navbar.Link href="#"><Glyphicon glyph="log-out"/></Navbar.Link> </Navbar.Text> <Nav> <NavDropdown eventKey={1} title="Item 1"> <MenuItem eventKey={1.1} href="#">Item 1.1</MenuItem> </NavDropdown> <NavItem eventKey={2}>Item 2</NavItem> <NavItem eventKey={3}>Item 3</NavItem> </Nav> </Navbar.Collapse> </Navbar> </div>; } });
sideBarMenu.css
.sideBarMenuContainer { position: fixed; height: 100%; } .userMenu { width: 100%; text-align: center; margin-right: 0px; margin-left: 0px; margin-top: 0px; } nav.sidebar :global(.navbar-brand) :global(.glyphicon) { margin-right: 0px; } nav.sidebar.:global(navbar) { border-radius: 0px; } nav.sidebar { -webkit-transition: margin 200ms ease-out; -moz-transition: margin 200ms ease-out; -o-transition: margin 200ms ease-out; transition: margin 200ms ease-out; } @media ( min-width : 768px) { nav.sidebar.:global(navbar).sidebar>.container :global(.navbar-brand), :global(.navbar)>:global(.container-fluid) :global(.navbar-brand) { margin-left: 0px; } nav.sidebar :global(.navbar-brand), nav.sidebar :global(.navbar-header) { text-align: center; width: 100%; margin-left: 0px; } nav.sidebar a { padding-right: 13px; } nav.sidebar :global(.navbar-nav)>li:first-child { border-top: 1px #e5e5e5 solid; } nav.sidebar :global(.navbar-nav)>li { border-bottom: 1px #e5e5e5 solid; } nav.sidebar :global(.navbar-nav) :global(.open) :global(.dropdown-menu) { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } nav.sidebar :global(.navbar-collapse), nav.sidebar :global(.container-fluid) { padding: 0 0px 0 0px; } :global(.navbar-inverse) :global(.navbar-nav) :global(.open) :global(.dropdown-menu)>li>a { color: #777; } nav.sidebar { width: 200px; height: 100%; margin-left: -160px; float: left; z-index: 8000; margin-bottom: 0px; } nav.sidebar li { width: 100%; } nav.sidebar:hover { margin-left: 0px; } :global(.forAnimate) { opacity: 0; } } @media ( min-width : 1330px) { nav.sidebar { margin-left: 0px; float: left; } nav.sidebar :global(.forAnimate) { opacity: 1; } } nav.sidebar :global(.navbar-nav) :global(.open) :global(.dropdown-menu)>li>a:hover, nav.sidebar :global(.navbar-nav) :global(.open) :global(.dropdown-menu)>li>a:focus { color: #CCC; background-color: transparent; } nav:hover :global(.forAnimate) { opacity: 1; } section { padding-left: 15px; }
Note that I use webpack in conjunction with the css-loader module scope, so :global means bootstrap name of the css class.

Sergey Bespalov
source share