Change font of react-select component using theme - material-ui

I'm trying to change the font of my entire react-select component (control, drop-down, etc). I'm using material-ui themes, so I tried setting theme:
<Select
theme={theme}
/>
But that didn't work. This also didn't work:
<Select
theme={theme => ({
...theme,
typography: {
...theme.typography,
fontFamily: ["Montserrat", "sans-serif"].join(",")
}
})}
/>
Demo here
I figured out how to do it with styles (demo):
const customStyles = {
container: (provided, state) => ({
...provided,
fontFamily: ["Montserrat", "sans-serif"].join(",")
}),
};
<Select
styles={customStyles}
/>
But it would be nice to use themes, since I already created a theme with my font.

If you take a look at the theme.js file below you will notice that there no font option for now so no way to use this props to achieve what you're looking for.
import type { Theme } from './types';
export const colors = {
primary: '#2684FF',
primary75: '#4C9AFF',
primary50: '#B2D4FF',
primary25: '#DEEBFF',
danger: '#DE350B',
dangerLight: '#FFBDAD',
neutral0: 'hsl(0, 0%, 100%)',
neutral5: 'hsl(0, 0%, 95%)',
neutral10: 'hsl(0, 0%, 90%)',
neutral20: 'hsl(0, 0%, 80%)',
neutral30: 'hsl(0, 0%, 70%)',
neutral40: 'hsl(0, 0%, 60%)',
neutral50: 'hsl(0, 0%, 50%)',
neutral60: 'hsl(0, 0%, 40%)',
neutral70: 'hsl(0, 0%, 30%)',
neutral80: 'hsl(0, 0%, 20%)',
neutral90: 'hsl(0, 0%, 10%)',
};
const borderRadius = 4;
const baseUnit = 4; /* Used to calculate consistent margin/padding on elements */
const controlHeight = 38; /* The minimum height of the control */
const menuGutter = baseUnit * 2; /* The amount of space between the control and menu */
export const spacing = {
baseUnit,
controlHeight,
menuGutter,
};
export const defaultTheme: Theme = {
borderRadius,
colors,
spacing,
};
export type ThemeConfig = Theme | ((theme: Theme) => Theme);

Related

MUI Dialog Background Color

I have a mui dialog and would like to set its background to black. (no color), but I don't succeed.
And I don't understand why it doesn't work.
My Dialog:
export const MyDialog = (props: any) => {
return (
<ThemeProvider theme={TestTheme}>
<CssBaseline />
<Dialog open={true}>
<DialogTitle>Title</DialogTitle>
<DialogContentText>Text</DialogContentText>
</Dialog>
</ThemeProvider>
);
};
My TestTheme looks like this:
export const TestTheme = createTheme(
{palette: {
mode: 'dark',
background: {
paper: '#000000',
// paper: 'red',
default: '#000000',
},
}
}
)
and it looks like this:
As we can see the dialog color has not the same black as the background even I have set the colors for both correctly.
If I set the colors :
paper: 'red',
// paper: '#000000',
// default: '#000000',
default: 'blue',
How can I set the background color of the dialog to black (no color)? (Regardless if it make sence or not, I would like to understand)
You are doing everything right with the way you set the background color.
The reason you see two different black colours is because when the Dialog is open is getting a class of MuiBackdrop-root which has a background-colour of background-color: rgba(0, 0, 0, 0.5); so this additional semi transparent layer is causing this colour difference.
Here is a codesandbox with a solution to your issue.
Code:
<Dialog open={true}
sx={{ //You can copy the code below in your theme
background: '#000',
'& .MuiPaper-root': {
background: '#000'
},
'& .MuiBackdrop-root': {
backgroundColor: 'transparent' // Try to remove this to see the result
}
}}>
<DialogTitle sx={{ color: "white" }}>Title</DialogTitle>
<DialogContentText sx={{ color: "white" }}>Text</DialogContentText>
</Dialog>
Hope it helps.

What is the correct way to extend MUI v5 component with additional components and styled utility?

What is the correct way to extend build-in components of MaterialUI v5? What I'd like to do:
Style the build-in component
Make a wrapper on top of my styled component with additional components
The current code:
import {Box, Link, LinkProps} from '#mui/material';
import {styled} from '#mui/material/styles';
const StyledLink = styled(Link)<LinkProps>({
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
color: '#6b7688',
fontWeight: 500,
fontSize: '12.8px',
textTransform: 'uppercase',
textDecoration: 'none',
'&:hover, &.Mui-focusVisible': {
color: '#313bac',
transition: 'all 0.3s ease-in-out',
// LinkHoverElement
'& .MuiBox-root': {
backgroundColor: '#313bac',
},
},
});
const LinkHoverElement = styled(Box)({
width: '5px',
height: '5px',
marginBottom: '5px',
borderRadius: '50%',
backgroundColor: 'transparent',
});
const MenuLink = ({children, ...restProps}: LinkProps) => {
return (
<StyledLink {...restProps}>
<LinkHoverElement />
{children}
</StyledLink>
);
};
export default MenuLink;
It works, I also may use all props ('sx' prop as well)
<MenuLink
sx={{mx: '1rem'}}
key={page}
href={`#${page}`}>
{page}
</MenuLink>
seems like a 'god object', I've read documentation and uses this articles:
Reusable component
styled()
but haven't found an complicated example and feel like the code above isn't a best practice
The codesandbox example

Conditionally add styles properties on MUI

On styled-components we can have something like this
import syled, { css } from 'styled-components';
const StyledButton = styled.button<StyledButtonProps>`
display: flex;
${textStyles.styledButton}
${props =>
props.disabled &&
css`
opacity: 0.5;
`}
`
I'm trying to use MUI's styled but can't find how to conditionally add the opacity property based on the props passed to the button. I'm trying something like this, but don't want to define the default value of every conditional styles as on opacity here (since there could be a LOT of conditional properties based on the value of a passed prop)
import { styled } from '#material-ui/core/styles';
// eslint-disable-next-line #typescript-eslint/no-unused-vars
const StyledMUIButton = styled(({ disabled, disclosure, whiteButton, fullWidth, noMarginTop, ...rest }: StyledButtonProps) => (
<button {...rest} />
))({
display: 'flex',
...textStyles.button,
opacity: (props: StyledButtonProps) => props.disabled ? 0.5 : 1
})
Another case would be something like this in styled-components, how can be that applied to MUI's styled?
${props =>
props.whiteButton
? css`
background-color: transparent;
border: none;
${textStyles.styledLink}
`
: css`
&:focus {
background: transparent;
border: 1px solid ${colors.textLink};
color: ${colors.textLink};
}
`}
I ended up using makeStyles the following way
const useStyles = makeStyles({
button: (props: StyledButtonProps) => ({
display: 'flex',
...textStyles.button,
...props.disabled && { opacity: 0.5 },
})
})

ionic 5 forcing light theme for the browser app

i have built this app https://cvirus.app and build and deployed on browser.
on chrome browser on android phones it renders dark background (as dark theme is being applied by default it seems).
I want to force light theme everywhere no matter what device what browser. how do I do that?
commenting dark colors portins in theme/variables.scss did not work
To resolve this, you have to go to theme/variable.scss at the src folder and locate
#media (prefers-color-scheme: dark)
And change from dark to light. If you have not modified the variable.scss. it should be in line 79. Click to see the screenshot of my own code I hope this helps.
Since version 79 of the Chrome browser, you can choose between CSS prefers-color-sheme media feature values. Ionic respects this media feature and reacts to changes to it.
To change it without changing your OS preference and color theme, you need to open the Rendering panel in the Chrome Dev Tools:
Open the the Chrome Dev Tools.
Press Crtl+Shift+P on PC or Cmd+Shift+P on Mac.
Type "Show rendering" in the Command Palette.
Press Enter with the option Drawer | Show rendering selected, which should be already selected.
The Rendering drawer opens. Then on the "Emulate CSS media..." option, select the color scheme you prefer.
you should comment ios body and md body classes at the theme/variables.scss then it will become light mode.
In ionic 5+ Just rename prefers-color-scheme: dark to prefers-color-scheme: light Then It will not switch to dark theme no matter what.
In my case, commenting the dark theme in theme/variables.scss works well.
I comment on line 70 #media (prefers-color-scheme: dark) {
Until the end of the file.
Here is my file
// Ionic Variables and Theming. For more info, please see:
// http://ionicframework.com/docs/theming/
/** Ionic CSS Variables **/
:root {
--ion-color-primary : #633A82;
--ion-color-primary-rgb : 99, 58, 130;
--ion-color-primary-contrast : #FFFFFF;
--ion-color-primary-contrast-rgb : 255, 255, 255;
--ion-color-primary-shade : #573372;
--ion-color-primary-tint : #734E8F;
--ion-color-secondary : #72B5B7;
--ion-color-secondary-rgb : 114, 181, 183;
--ion-color-secondary-contrast : #000000;
--ion-color-secondary-contrast-rgb : 0, 0, 0;
--ion-color-secondary-shade : #649FA1;
--ion-color-secondary-tint : #80BCBE;
--ion-color-tertiary : #F1FCFC;
--ion-color-tertiary-rgb : 241, 252, 252;
--ion-color-tertiary-contrast : #000000;
--ion-color-tertiary-contrast-rgb : 0, 0, 0;
--ion-color-tertiary-shade : #D4DEDE;
--ion-color-tertiary-tint : #F2FCFC;
--ion-color-success : #10DC60;
--ion-color-success-rgb : 16, 220, 96;
--ion-color-success-contrast : #FFFFFF;
--ion-color-success-contrast-rgb : 255, 255, 255;
--ion-color-success-shade : #0EC254;
--ion-color-success-tint : #28E070;
--ion-color-warning : #FFCE00;
--ion-color-warning-rgb : 255, 206, 0;
--ion-color-warning-contrast : #FFFFFF;
--ion-color-warning-contrast-rgb : 255, 255, 255;
--ion-color-warning-shade : #E0B500;
--ion-color-warning-tint : #FFD31A;
--ion-color-danger : #F04141;
--ion-color-danger-rgb : 245, 61, 61;
--ion-color-danger-contrast : #FFFFFF;
--ion-color-danger-contrast-rgb : 255, 255, 255;
--ion-color-danger-shade : #D33939;
--ion-color-danger-tint : #F25454;
--ion-color-dark : #222428;
--ion-color-dark-rgb : 34, 34, 34;
--ion-color-dark-contrast : #FFFFFF;
--ion-color-dark-contrast-rgb : 255, 255, 255;
--ion-color-dark-shade : #1E2023;
--ion-color-dark-tint : #383A3E;
--ion-color-medium : #989AA2;
--ion-color-medium-rgb : 152, 154, 162;
--ion-color-medium-contrast : #FFFFFF;
--ion-color-medium-contrast-rgb : 255, 255, 255;
--ion-color-medium-shade : #86888F;
--ion-color-medium-tint : #A2A4AB;
--ion-color-light : #F4F5F8;
--ion-color-light-rgb : 244, 244, 244;
--ion-color-light-contrast : #000000;
--ion-color-light-contrast-rgb : 0, 0, 0;
--ion-color-light-shade : #D7D8DA;
--ion-color-light-tint : #F5F6F9;
}
//#media (prefers-color-scheme: dark) {
// /*
// * Dark Colors
// * -------------------------------------------
// */
//
// body {
// --ion-color-primary: #428cff;
// --ion-color-primary-rgb: 66,140,255;
// --ion-color-primary-contrast: #ffffff;
// --ion-color-primary-contrast-rgb: 255,255,255;
// --ion-color-primary-shade: #3a7be0;
// --ion-color-primary-tint: #5598ff;
//
// --ion-color-secondary: #50c8ff;
// --ion-color-secondary-rgb: 80,200,255;
// --ion-color-secondary-contrast: #ffffff;
// --ion-color-secondary-contrast-rgb: 255,255,255;
// --ion-color-secondary-shade: #46b0e0;
// --ion-color-secondary-tint: #62ceff;
//
// --ion-color-tertiary: #6a64ff;
// --ion-color-tertiary-rgb: 106,100,255;
// --ion-color-tertiary-contrast: #ffffff;
// --ion-color-tertiary-contrast-rgb: 255,255,255;
// --ion-color-tertiary-shade: #5d58e0;
// --ion-color-tertiary-tint: #7974ff;
//
// --ion-color-success: #2fdf75;
// --ion-color-success-rgb: 47,223,117;
// --ion-color-success-contrast: #000000;
// --ion-color-success-contrast-rgb: 0,0,0;
// --ion-color-success-shade: #29c467;
// --ion-color-success-tint: #44e283;
//
// --ion-color-warning: #ffd534;
// --ion-color-warning-rgb: 255,213,52;
// --ion-color-warning-contrast: #000000;
// --ion-color-warning-contrast-rgb: 0,0,0;
// --ion-color-warning-shade: #e0bb2e;
// --ion-color-warning-tint: #ffd948;
//
// --ion-color-danger: #ff4961;
// --ion-color-danger-rgb: 255,73,97;
// --ion-color-danger-contrast: #ffffff;
// --ion-color-danger-contrast-rgb: 255,255,255;
// --ion-color-danger-shade: #e04055;
// --ion-color-danger-tint: #ff5b71;
//
// --ion-color-dark: #f4f5f8;
// --ion-color-dark-rgb: 244,245,248;
// --ion-color-dark-contrast: #000000;
// --ion-color-dark-contrast-rgb: 0,0,0;
// --ion-color-dark-shade: #d7d8da;
// --ion-color-dark-tint: #f5f6f9;
//
// --ion-color-medium: #989aa2;
// --ion-color-medium-rgb: 152,154,162;
// --ion-color-medium-contrast: #000000;
// --ion-color-medium-contrast-rgb: 0,0,0;
// --ion-color-medium-shade: #86888f;
// --ion-color-medium-tint: #a2a4ab;
//
// --ion-color-light: #222428;
// --ion-color-light-rgb: 34,36,40;
// --ion-color-light-contrast: #ffffff;
// --ion-color-light-contrast-rgb: 255,255,255;
// --ion-color-light-shade: #1e2023;
// --ion-color-light-tint: #383a3e;
// }
//
// /*
// * iOS Dark Theme
// * -------------------------------------------
// */
//
// .ios body {
// --ion-background-color: #000000;
// --ion-background-color-rgb: 0,0,0;
//
// --ion-text-color: #ffffff;
// --ion-text-color-rgb: 255,255,255;
//
// --ion-color-step-50: #0d0d0d;
// --ion-color-step-100: #1a1a1a;
// --ion-color-step-150: #262626;
// --ion-color-step-200: #333333;
// --ion-color-step-250: #404040;
// --ion-color-step-300: #4d4d4d;
// --ion-color-step-350: #595959;
// --ion-color-step-400: #666666;
// --ion-color-step-450: #737373;
// --ion-color-step-500: #808080;
// --ion-color-step-550: #8c8c8c;
// --ion-color-step-600: #999999;
// --ion-color-step-650: #a6a6a6;
// --ion-color-step-700: #b3b3b3;
// --ion-color-step-750: #bfbfbf;
// --ion-color-step-800: #cccccc;
// --ion-color-step-850: #d9d9d9;
// --ion-color-step-900: #e6e6e6;
// --ion-color-step-950: #f2f2f2;
//
// --ion-toolbar-background: #0d0d0d;
//
// --ion-item-background: #1c1c1c;
// --ion-item-background-activated: #313131;
// }
//
//
// /*
// * Material Design Dark Theme
// * -------------------------------------------
// */
//
// .md body {
// --ion-background-color: #121212;
// --ion-background-color-rgb: 18,18,18;
//
// --ion-text-color: #ffffff;
// --ion-text-color-rgb: 255,255,255;
//
// --ion-border-color: #222222;
//
// --ion-color-step-50: #1e1e1e;
// --ion-color-step-100: #2a2a2a;
// --ion-color-step-150: #363636;
// --ion-color-step-200: #414141;
// --ion-color-step-250: #4d4d4d;
// --ion-color-step-300: #595959;
// --ion-color-step-350: #656565;
// --ion-color-step-400: #717171;
// --ion-color-step-450: #7d7d7d;
// --ion-color-step-500: #898989;
// --ion-color-step-550: #949494;
// --ion-color-step-600: #a0a0a0;
// --ion-color-step-650: #acacac;
// --ion-color-step-700: #b8b8b8;
// --ion-color-step-750: #c4c4c4;
// --ion-color-step-800: #d0d0d0;
// --ion-color-step-850: #dbdbdb;
// --ion-color-step-900: #e7e7e7;
// --ion-color-step-950: #f3f3f3;
//
// --ion-item-background: #1A1B1E;
// }
//
// ion-title.title-large {
// --color: white;
// }
//}
Hope to help you
One way to do this is to force light styles by using media queries. On devices that prefer light, you can supply your dark theme variables, but you need to override #media (prefers-color-scheme: dark) scope with your light theme variables.
One way to do this is to use a mixin for your theme, and include it in both :root scope and #media (prefers-color-scheme: dark).
Conversely, if you want to force dark theme, use a mixin for your theme, and include it in both :root scope and #media (prefers-color-scheme: light).
Note: Ionic (ionic/cli#6.10.0) and SCSS
/**
* {#mixin} - Supplies dark theme variables to the included scope
*/
#mixin eternal-darkness() {
// Dark theme variables...
}
:root {
#include eternal-darkness;
}
#media (prefers-color-scheme: light) {
#include eternal-darkness;
}
In my web browser, the theme was light. Which is what I wanted.
In the ios emulator, it was dark. To make it light I did this:
In variables.css
#media (prefers-color-scheme: lights) {
...
}
Simply have this tag placed in index.html file
<meta name="color-scheme" content="light dark" />
It works for me! Thanks

Styling react-select v2 with material-ui - Replace Input component

I'm having an issue with replacing the Input component for react-select v2 with the Input component from Material UI.
I've made an attempt so far in the codesandbox below, but unable to invoke the filtering upon typing into the Input?
https://codesandbox.io/s/jjjwoj3yz9
Also, any feedback on the Option replacement implementation would be appreciated. Am I going about it the right way with grabbing the text of the clicked option and search for the Option object from my options list to pass to the selectOption function?
Much appreciated,
Eric
V1
refer the documentation from here : https://material-ui.com/demos/autocomplete/
it provides clear documentation about how to use react-select with material-ui
here is a working example for your question: https://codesandbox.io/s/p9jpl9l827
as you can see material-ui Input component can take react-select as inputComponent.
V2
It's almost same as the previous approach :
implement the Input component:
<div className={classes.root}>
<Input
fullWidth
inputComponent={SelectWrapped}
value={this.state.value}
onChange={this.handleChange}
placeholder="Search your color"
id="react-select-single"
inputProps={{
options: colourOptions
}}
/>
</div>
and then SelectWrapped component implementation should be:
function SelectWrapped(props) {
const { classes, ...other } = props;
return (
<Select
components={{
Option: Option,
DropdownIndicator: ArrowDropDownIcon
}}
styles={customStyles}
isClearable={true}
{...other}
/>
);
}
and I overrides the component Option and DropdownIndicator to make it more material and added customStyles also:
const customStyles = {
control: () => ({
display: "flex",
alignItems: "center",
border: 0,
height: "auto",
background: "transparent",
"&:hover": {
boxShadow: "none"
}
}),
menu: () => ({
backgroundColor: "white",
boxShadow: "1px 2px 6px #888888", // should be changed as material-ui
position: "absolute",
left: 0,
top: `calc(100% + 1px)`,
width: "100%",
zIndex: 2,
maxHeight: ITEM_HEIGHT * 4.5
}),
menuList: () => ({
maxHeight: ITEM_HEIGHT * 4.5,
overflowY: "auto"
})
};
and Option:
class Option extends React.Component {
handleClick = event => {
this.props.selectOption(this.props.data, event);
};
render() {
const { children, isFocused, isSelected, onFocus } = this.props;
console.log(this.props);
return (
<MenuItem
onFocus={onFocus}
selected={isFocused}
onClick={this.handleClick}
component="div"
style={{
fontWeight: isSelected ? 500 : 400
}}
>
{children}
</MenuItem>
);
}
}
please find the example from here: https://codesandbox.io/s/7k82j5j1qx
refer the documentation from react select and you can add more changes if you wish.
hope these will help you.