MarceloBoni
MarceloBoni

Reputation: 241

How change default typography class of a formcontrollabel - material-ui | React?

I would like change the default props of a formControlLabel from body to caption. I tried it and it worked:

<FormControlLabel
  value="all"
  control={<Radio color="primary" />}
  label={
    <Typography variant="caption">
      first
    </Typography>
  }
  labelPlacement="end"
/>

But that's not exactly the effect I want, in this case I just include one more span involving the original span:

enter image description here

Sometimes I fall into the same problem trying to change the default element classes, unfortunately the documentation didn't help me understand what I should do in these cases.

The exemple code and another failed attempts can be found here.


I Just want change default class property from MuiTypography-root MuiFormControlLabel-label MuiTypography-body1 to MuiTypography-root MuiFormControlLabel-label MuiTypography-caption without include a new span element

Upvotes: 4

Views: 9238

Answers (2)

atazmin
atazmin

Reputation: 5687

This seem to work for me with v5, using sx prop

           sx={{
              mr: 3,
              '.MuiFormControlLabel-label': {
                fontSize: 12,
              },
            }}

...

<FormGroup>
          <FormControlLabel
            labelPlacement="start"
            label={`${theme.palette.mode} mode`}
            control={
              <MaterialUISwitch
                onChange={colorMode.toggleColorMode}
                checked={theme.palette.mode === 'dark' ? true : false}
                sx={{ m: 1 }}
                className="bar"
              />
            }
            sx={{
              mr: 3,
              '.MuiFormControlLabel-label': {
                fontSize: 12,
              },
            }}
          />
        </FormGroup>

Upvotes: 1

Ryan Cogswell
Ryan Cogswell

Reputation: 80986

FormControlLabel does not provide a mechanism for controlling the Typography variant. This has been asked for before and is discussed in this issue: https://github.com/mui-org/material-ui/issues/16643.

Your main options are:

You can see the first and last options side-by-side in this example:

import React from "react";
import ReactDOM from "react-dom";

import FormControlLabel from "@material-ui/core/FormControlLabel";
import Radio from "@material-ui/core/Radio";
import Typography from "@material-ui/core/Typography";
import { makeStyles } from "@material-ui/core/styles";

const useStyles = makeStyles(theme => ({
  label: {
    fontSize: theme.typography.pxToRem(12),
    letterSpacing: "0.03333em",
    lineHeight: 1.66
  }
}));

function App() {
  const classes = useStyles();
  return (
    <>
      <FormControlLabel
        value="all"
        control={<Radio color="primary" />}
        label={<Typography variant="caption">first</Typography>}
        labelPlacement="end"
      />
      <FormControlLabel
        value="all"
        control={<Radio color="primary" />}
        label="first"
        labelPlacement="end"
        classes={classes}
      />
    </>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Edit FormControlLabel custom Typography

These two options do not look quite identical. The line-height of the body1 wrapper in the first case causes the text to be shifted a pixel or two down compared to not having the extra wrapper layer, so I would recommend my last option.

Upvotes: 12

Related Questions