Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Styling Material-UI Drawer component with Styled Components

I am trying to port the styling of the Drawer component below, into Styled Components.

    <Drawer
      variant="permanent"
      classes={{
        paper: classes.drawerPaper
      }}
    >

,where paper is styled as follows:

const styles = theme => ({
  drawerPaper: {
    position: "relative",
    width: 240px
  }
});

I have no idea of how can I customize paper prop through Styled Components. The following styled component syntax does not work:

export const StyledDrawer = styled(Drawer)`
    position: "relative";
    width: 240px;
`;

The source-code for this component indicates that this is passed as props as PaperProps but I can still not find a way to override it.

like image 606
James Avatar asked Apr 04 '18 16:04

James


People also ask

Does styled-components work with material UI?

Now Material ui has some extra custom variables, and also styled-components also inherits Material-ui's Theme object, making them sync. Finally wrap your project with ThemeProvider passing that theme you created. import { ThemeProvider } from "styled-components";// This is the theme we have just created.

How do you use styled-components with MUI?

When using @mui/styled-engine-sc ( styled-components ), nothing needs to be done. When using @mui/styled-engine ( emotion ), the default engine, there are a few steps you should perform: First, you should install @emotion/babel-plugin . Now you should be able to use components as your selectors!


2 Answers

I have recently given an example in https://codesandbox.io/s/material-demo-k9l9h

I hope it helps:

import React, { useState } from "react";
import Drawer from "@material-ui/core/Drawer";
import styled from "styled-components";

const drawerWidth = 240;

const styles = theme => ({
  drawer: {
    position: "absolute",
    overflowX: "hidden",
    zIndex: theme.zIndex.drawer + 2,
    [theme.breakpoints.up("sm")]: {
      position: "relative",
      width: drawerWidth,
      flexShrink: 0,
      zIndex: theme.zIndex.drawer
    },
    whiteSpace: "nowrap"
  },
  drawerOpen: {
    width: drawerWidth,
    transition: theme.transitions.create("width", {
      easing: theme.transitions.easing.sharp,
      duration: theme.transitions.duration.enteringScreen
    })
  },
  drawerClose: {
    transition: theme.transitions.create("width", {
      easing: theme.transitions.easing.sharp,
      duration: theme.transitions.duration.leavingScreen
    }),
    overflowX: "hidden",
    width: 0,
    [theme.breakpoints.up("sm")]: {
      width: theme.spacing.unit * 9 + 1
    }
  }
});

const StyledDrawer = styled(Drawer)`
  ${({ theme, open }) => {
    const classes = styles(theme);
    return {
      ...classes.drawer,
      ...(open ? classes.drawerOpen : classes.drawerClose)
    };
  }}

  .MuiDrawer-paper {
    ${({ theme, open }) => {
      const classes = styles(theme);
      return open ? classes.drawerOpen : classes.drawerClose;
    }}

    &::-webkit-scrollbar {
      width: 2px;
    }
    &:hover {
      &::-webkit-scrollbar-thumb {
        display: none;
      }
    }
    &::-webkit-scrollbar-thumb {
      display: none;
    }
    &::-webkit-scrollbar-track {
      display: none;
    }
  }
`;

const PersistentDrawerLeft = () => {
  const [isOpen, setIsOpen] = useState(false);

  const handleDrawerOpen = () => {
    setIsOpen(true);
  };

  const handleDrawerClose = () => {
    setIsOpen(false);
  };

  return (
    <div>
      <StyledDrawer variant="permanent" open={isOpen}>
        <span>sidebar</span>
        <button onClick={handleDrawerClose}>close</button>
      </StyledDrawer>
      <span>Content</span>
      <button onClick={handleDrawerOpen}>open</button>
    </div>
  );
};

export default PersistentDrawerLeft;
like image 125
Olivier Tassinari Avatar answered Sep 30 '22 05:09

Olivier Tassinari


I would have given my answer in a comment but since I don't have enough reputation I can not comment. Anyway,look at the styled component documentation. It says that :

if you attempt to style a Drawer with variant permanent, you will likely need to affect the Drawer's underlying paper style. However, this is not the root element of Drawer and therefore styled-components customization as above will not work. You can workaround this by using stable JSS class names, but the most reliable approach is to use the classes property to introduce an override style, and then style it with higher specificity via &.

Please also look at the example given of button as well. If you still can't figure out comment here and I will try to help further.

like image 20
connect2Coder Avatar answered Sep 30 '22 04:09

connect2Coder