I am very new to material UI, typescript, and react, so if I say something incorrect or use the wrong terminology please correct me. I have 4 boxes that I want to place on a page, but three boxes have to go in a row and stacking the 4th on the bottom of the box 1.
I currently have a grid as a parent that holds these boxes together as shown
<Grid container={true} spacing={1} justifyContent="center" alignItems='flex-start'>
<Box sx={{m: 1}} style={{width: '500px', height: '600px'}}>
<SomeData data={defaultDeploymentFrequencyData}/>
</Box>
<Box sx={{m: 1}} style={{width: '500px', height: '600px'}}>
<SomeData data={defaultDeploymentFrequencyData}/>
</Box>
<Box sx={{m: 1}} style={{width: '500px', height: '600px'}}>
<SomeData data={defaultDeploymentFrequencyData}/>
</Box>
<Box sx={{m: 1}} style={{width: '500px', height: '600px'}}>
<SomeData data={defaultDeploymentFrequencyData}/>
</Box>
</Grid>
Instead of using boxes all the time and editing them there, is there a way that i can call a method so that it aligns them correctly
export const BoxLayout = ():JSX.Element => {
return (
<Box>
sx={{
display: 'grid',
gap: 1,
gridTemplateColumns: 'repeat(2, 1fr)',
}}
</Box>
)
}
I am thinking this could be called when laying out the boxes, maybe like
<Grid container={true} spacing={1} justifyContent="center" alignItems='flex-start'>
<BoxLayout>
<SomeData data={defaultDeploymentFrequencyData}/>
<SomeData data={defaultDeploymentFrequencyData}/>
<SomeData data={defaultDeploymentFrequencyData}/>
<SomeData data={defaultDeploymentFrequencyData}/>
<BoxLayout>
</Grid>
You also need to wrap each Box inside <Grid item> component.
<Grid container spacing={1}>
<Grid item xs={4}>
<Box style={{ width: 50, height: 50}}>Box</Box>
</Grid>
<Grid item xs={4}>
<Box style={{ width: 50, height: 50}}>Box</Box>
</Grid>
<Grid item xs={4}>
<Box style={{ width: 50, height: 50}}>Box</Box>
</Grid>
<Grid item xs={4}>
<Box style={{ width: 50, height: 50}}>Box</Box>
</Grid>
</Grid>
Column widths are integer values between 1 and 12; they apply at any breakpoint and indicate how many columns are occupied by the component.
So by saying xs={4} you mean this box occupies 4/12 of the space or one third. Then last box goes to the next line under the first box.
Related
I'm trying to figure out a layout using MUI Gridv2. The grid will consist of two columns both having equal heights, dependent on what content is in them. The second column has an inner grid consisting of two row items.
I have found a couple of examples on how to do something similar, however, they are using Mui Box and Mui Grid version 1 and act a little different with wrapping(Box) and element types(Gridv1).
Here is what I have so far:
<Gridv2 container xs={6} spacing={{ xs: 1 }} sx={{ flexGrow: 1 }}>
<Gridv2 container xs={12} sx={{ backgroundColor: "yellow" }} flexGrow={1}>
<Gridv2 md={12} lg={6} xl={8}>
<Item elevation={2} sx={{ backgroundColor: "#476485" }}>
<FormLabel component="legend">
Designation{" "}
<Tooltip title="Select a Service Type">
<IconButton size="small" sx={{ padding: 0 }}>
<MenuOpenIcon />
</IconButton>
</Tooltip>
</FormLabel>
is this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it
</Item>
</Gridv2>
<Gridv2 md={12} lg={6} xl={4}>
<Item elevation={2} sx={{ backgroundColor: "#476485", marginBottom: '8px' }}>
<FormLabel component="legend">
Points of Interest{" "}
<Tooltip title="Add a Point of Interest">
<IconButton size="small" sx={{ padding: 0 }}>
<AddLocationAltOutlinedIcon />
</IconButton>
</Tooltip>
</FormLabel>
is this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it
</Item>
<Item elevation={2} sx={{ backgroundColor: "#476485", marginTop: '8px' }}>
<FormLabel component="legend">
Extra Contact List{" "}
<Tooltip title="Add a Contact">
<IconButton size="small" sx={{ padding: 0 }}>
<AddIcCallOutlinedIcon />
</IconButton>
</Tooltip>
</FormLabel>
is this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it is this it is this it is
this it is this it is this it is this it
</Item>
</Gridv2>
</Gridv2>
</Gridv2>
CodeSandbox Example You can see by dragging between large and medium screens how the largest height can swap from one column to the other.
From the image above, what I would like is if the second column is larger than the first, expand the first column and vice versa.
I want the Box content on the right (Textfields, etc.) as shown in the image below to be always centered even in responsive,
I tried justifyContent="center" in <Box > but nothing happened it didn't move at all also tried justifyContent="center" in <Stack > also nothing happened, I'm not sure if I missed something or there is another way to do it!!
Some help would be appreciated.
The code:
return (
<div className="login">
<Box>
<Stack direction="row"
// spacing={1} >
{/* FIRST BOX ON THE LEFT WITH THE IMAGE & LOGO */}
<Box sx={{
width: "40%",
height: "100%",
backgroundColor: '#3AAFA9',
display: {xs: "none", md: "none", sm: "none", lg:"block"},
}}
>
{/* TO HOLD IMAGE, LOGO & DISCRIPTION */}
<Stack direction="column"
spacing={-2}
sx={{ display: 'block' }}
py={10}
ml={7}>
{/* STUFF */}
</Stack>
</Box>
{/* HERE WHERE THE PROBLEM IS*/}
<Box component="div"
// sx= {{
// padding:{ xs: 2, sm: 4, md: 4, lg:10 },
// }}
justifyContent= "center">
<Stack
direction='column'
width="100%"
justifyContent="flex-start"
// sx={{ ml: 10 }}
>
<Typography variant="h5"
gutterBottom
component="span"
style={{ fontWeight: 600, textAlign: 'left' }}
>
Login to
</Typography>
<Divider style={{width:'100%'}}>
Or
</Divider>
{/* LOGIN FORM */}
<form className="loginForm" onSubmit={handleSubmit}>
</form>
{/* LOGIN FORM ENDS */}
</Stack>
</Box>
</Stack>
</Box>
</div>
)
The Box-Component of Mui dont have a prop justifyContent.
You have to declare it inside youre sx.
sx={{
display: "flex",
justifyContent: "space-between",
width: "100%",
//...
}}
The width is just to say the box it have to use the hole space.
Cheers
Below the component contains a parent grid inside which 2 other child grids are present .I was tryin to implement a hardcoded chat UI and I have also tried using sm md properties but this discards the feature of the grid being wrapped according to the text content in it. Using the sm md properties makes the grid to a constant width which may not be completely filled using the text as the text length keep changing.
export const Chats = () => {
return (
<>
<Grid container display={"wrap"} justifyContent={"space-between"}>
<Grid
style={{
backgroundColor: "white",
padding: "10px",
marginTop: "100px",
borderRadius:"10px"
}}
>
<Box>
<Typography>This is message 1 </Typography>
</Box>
</Grid>
<Grid
style={{
backgroundColor: "#E3F6CB",
padding: "10px",
marginTop: "100px",
borderRadius:"10px"
}}
>
<Typography>This is message 2</Typography>
</Grid>
</Grid>
</>
);
};
You can use the styling CSS property " display: inline-flex " as shown below to make sure that the dynamic text content gets wrapped by the Grid. Make sure to use multiple grid containers for each chat box being created. Make sure to use the predefined properties in material UI for the same as shown below.
export const Chats = () => {
return (
<>
<Grid container xs={12} style={{ display: "inline-flex" }}>
<Grid item xs={6}>
<Box
style={{
backgroundColor: "white",
padding: "10px",
marginTop: "100px",
borderRadius: "10px",
display: "inline-flex",
}}
>
This is message 1
</Box>
</Grid>
<Grid item xs={6}></Grid>
</Grid>
<Grid container justifyContent={"space-between"}>
<Grid item ></Grid>
<Grid item >
<Box
style={{
backgroundColor: "#E3F6CB",
padding: "10px",
borderRadius: "10px",
display: "inline-flex",
}}
>
This is message 2
</Box>
</Grid>
</Grid>
</>
);
};
How do I put the clear icon on the card on the top right side of the card overlapping it.
What is the proper way to do it?
CLICK HERE = CODESANDBOX
<Paper
sx={{
padding: "1em",
background: "black"
}}
>
<IconButton color="error" aria-label="add to shopping cart">
<ClearIcon />
</IconButton>
<Grid
component="div"
container
spacing={2}
sx={{
marginBottom: "1em"
}}
>
<Grid component="div" item sm={12}>
<Alert>SUCCESS</Alert>
</Grid>
</Grid>
</Paper>;
Try this:
<Paper
sx={{
padding: "1em",
background: "black",
position: "relative"
}}
>
<IconButton
sx={{
position: "absolute",
top: "-15px",
right: "-15px",
// not necessary, just added this coz it looks weird
background: "white"
}}
color="error"
aria-label="add to shopping cart"
>
<ClearIcon />
</IconButton>
<Grid
component="div"
container
spacing={2}
sx={{
marginBottom: "1em"
}}
>
<Grid component="div" item sm={12}>
<Alert>SUCCESS</Alert>
</Grid>
</Grid>
</Paper>
What I did is simple, make the Paper position relative, then make the icon button absolute.
This way the button will follow whenever you move/animate the Paper.
The outcome would be something like this: https://wphyd.csb.app/
In Material UI React I'm finding it very difficult to align a text and a text button on the same row and under a box. In my screenshot of what I achieved right now.
What I need is to have the 'Sign using your mouse or touchpad.' and the 'Redo signature' on the same row but under that box on the opposite side.
I have a hard time making it so and the code is as below
I tried the various solution and this the nearest I was able to get but cannot make the button stay under the box as the opposite side of the text.
Link to CodeSandbox
The react HTML
<Box className={classes.counterSignatureContainer}>
<Box className={classes.canvasContainer}>
<canvas ref={canvasRef} height={158} width={510} />
</Box>
</Box>
<Grid container spacing={3}>
<Grid
container
direction="row"
justify="space-between"
alignItems="center"
>
<Grid item xs={6}>
<Box className={classes.instructionContainer}>
<Typography variant="caption">
<FormattedMessage
defaultMessage={'Sign using your mouse or touch pad.'}
/>
</Typography>
</Box>
</Grid>
<Grid item xs={3}>
<Box className={classes.redoContainer}>
<Button
disabled={!signatureData}
color="primary"
title="Redo signature"
onClick={clear}
fullWidth={false}
>
<FormattedMessage defaultMessage={'Redo signature'} />
</Button>
</Box>
</Grid>
</Grid>
</Grid>
<Box className={classes.countersignButtonContainer}>
<Button
disabled={!signatureData}
color="primary"
variant="outlined"
title="Countersign"
onClick={handleCountersign}
fullWidth={false}
>
<FormattedMessage defaultMessage={'Countersign'} />
</Button>
</Box>
The CSS of this
counterSignatureContainer: {
textAlign: 'center',
position: 'relative',
margin: theme.spacing(8, 0, 0, 5),
width: SIGNATURE_CONTAINER_WIDTH,
height: 160,
backgroundColor: '#E1E1E1',
},
canvasContainer: {
position: 'relative',
display: 'flex',
flex: 1,
},
instructionContainer: {
margin: theme.spacing(1, 6),
color: '#393939',
},
countersignButtonContainer: {
margin: theme.spacing(1, 6),
},
signatureContainer: {
textAlign: 'center',
position: 'relative',
margin: theme.spacing(3, 5),
width: 512,
height: 160,
backgroundColor: '#0000000A',
},
signature: {
maxWidth: '100%',
maxHeight: '100%',
},
redoContainer: {
margin: theme.spacing(1, 0, 0, -1),
},