1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-07 01:16:28 +02:00

feat: dark theme v1 (#3298)

## About the changes

Creating the first version of the Dark theme

Refactor: colors variables
Refactor: use theme variable instead 
- this change will help us to use MuiCssBaseline, and we can use classes
directly for easy customization when we can't identify MUI classes

Refactor: adjusting some files components
- i’ve touched also the structure of some files, not only the colors
variables (but only to adjust the style, not functionality)

Fix: dark mode persistence on refresh (by Nuno)

Feat: dark mode sees light logos, and light mode sees dark logos (by
Nuno)

---------

Co-authored-by: Nuno Góis <github@nunogois.com>
This commit is contained in:
NicolaeUnleash 2023-03-22 16:37:40 +02:00 committed by GitHub
parent 5585a9bed0
commit 705462f0cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
95 changed files with 827 additions and 889 deletions

View File

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.739.811a1 1 0 0 0-1.479 0L9.947 2.253a1 1 0 0 1-1.043.28L7.045 1.94a1 1 0 0 0-1.28.739l-.417 1.906a1 1 0 0 1-.763.763l-1.906.417a1 1 0 0 0-.739 1.28l.592 1.859a1 1 0 0 1-.28 1.042L.812 11.261a1 1 0 0 0 0 1.478l1.442 1.314a1 1 0 0 1 .28 1.043l-.593 1.858a1 1 0 0 0 .74 1.28l1.905.417a1 1 0 0 1 .763.764l.417 1.905a1 1 0 0 0 1.28.74l1.859-.592a1 1 0 0 1 1.043.279l1.313 1.442a1 1 0 0 0 1.479 0l1.313-1.442a1 1 0 0 1 1.043-.28l1.859.592a1 1 0 0 0 1.28-.739l.417-1.905a1 1 0 0 1 .763-.764l1.906-.416a1 1 0 0 0 .739-1.28l-.592-1.86a1 1 0 0 1 .28-1.042l1.441-1.314a1 1 0 0 0 0-1.478l-1.442-1.314a1 1 0 0 1-.279-1.042l.592-1.86a1 1 0 0 0-.74-1.28l-1.905-.416a1 1 0 0 1-.763-.763l-.417-1.906a1 1 0 0 0-1.28-.74l-1.859.593a1 1 0 0 1-1.043-.28L12.74.811ZM7 7h3.434v6.565h3.13V7h3.436v10H7V7Z" fill="#E2E1F5"/><path d="M13.565 13.565H17V17h-3.435v-3.435Z" fill="#817AFE"/></svg>

After

Width:  |  Height:  |  Size: 995 B

View File

@ -1,4 +1,4 @@
import { IconButton, Tooltip } from '@mui/material'; import { Box, IconButton, Tooltip } from '@mui/material';
import CopyIcon from '@mui/icons-material/FileCopy'; import CopyIcon from '@mui/icons-material/FileCopy';
import copy from 'copy-to-clipboard'; import copy from 'copy-to-clipboard';
import useToast from 'hooks/useToast'; import useToast from 'hooks/useToast';
@ -24,18 +24,17 @@ export const UserToken = ({ token }: IUserTokenProps) => {
}; };
return ( return (
<div <Box
style={{ sx={theme => ({
backgroundColor: '#efefef', backgroundColor: theme.palette.background.elevation2,
padding: '2rem', padding: theme.spacing(4),
borderRadius: '3px', borderRadius: `${theme.shape.borderRadius}px`,
margin: '0', marginTop: theme.spacing(2),
marginTop: '1rem',
display: 'flex', display: 'flex',
justifyContent: 'space-between', justifyContent: 'space-between',
alignItems: 'center', alignItems: 'center',
wordBreak: 'break-all', wordBreak: 'break-all',
}} })}
> >
{token} {token}
<Tooltip title="Copy token" arrow> <Tooltip title="Copy token" arrow>
@ -43,6 +42,6 @@ export const UserToken = ({ token }: IUserTokenProps) => {
<CopyIcon /> <CopyIcon />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
</div> </Box>
); );
}; };

View File

@ -5,8 +5,9 @@ import { useSearchHighlightContext } from 'component/common/Table/SearchHighligh
import { Fragment, VFC } from 'react'; import { Fragment, VFC } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
const StyledLink = styled(Link)(() => ({ const StyledLink = styled(Link)(({ theme }) => ({
textDecoration: 'none', textDecoration: 'none',
color: theme.palette.links,
'&:hover, &:focus': { '&:hover, &:focus': {
textDecoration: 'underline', textDecoration: 'underline',
}, },

View File

@ -240,7 +240,7 @@ export const GoogleAuth = () => {
Save Save
</Button>{' '} </Button>{' '}
<p> <p>
<small style={{ color: 'red' }}> <small style={{ color: 'error.dark' }}>
{errors?.message} {errors?.message}
</small> </small>
</p> </p>

View File

@ -57,6 +57,10 @@ const StyledDescriptionBlock = styled('div')(({ theme }) => ({
fontSize: theme.fontSizes.smallBody, fontSize: theme.fontSizes.smallBody,
borderRadius: theme.shape.borderRadiusMedium, borderRadius: theme.shape.borderRadiusMedium,
marginBottom: theme.spacing(2), marginBottom: theme.spacing(2),
a: {
color: theme.palette.links,
},
})); }));
interface IGroupForm { interface IGroupForm {

View File

@ -26,7 +26,7 @@ export const GroupEmpty = () => {
to="/admin/groups/create-group" to="/admin/groups/create-group"
component={Link} component={Link}
variant="outlined" variant="outlined"
color="secondary" color="primary"
> >
Create your first group Create your first group
</Button> </Button>

View File

@ -69,7 +69,7 @@ const InvoiceList = () => {
style={{ style={{
backgroundColor: backgroundColor:
item.status === 'past-due' item.status === 'past-due'
? '#ff9194' ? 'error.dark'
: 'inherit', : 'inherit',
}} }}
> >

View File

@ -35,7 +35,7 @@ export const InviteLinkBar: VFC = () => {
<Typography <Typography
component="span" component="span"
variant="body2" variant="body2"
color={willExpireSoon ? 'warning.main' : 'inherit'} color={willExpireSoon ? 'warning.dark' : 'inherit'}
fontWeight="bold" fontWeight="bold"
> >
{expiresIn} {expiresIn}
@ -56,17 +56,17 @@ export const InviteLinkBar: VFC = () => {
return ( return (
<Box <Box
sx={{ sx={theme => ({
backgroundColor: 'background.paper', backgroundColor: theme.palette.background.paper,
py: 2, py: 2,
px: 4, px: 4,
mb: 2, mb: 2,
borderRadius: theme => `${theme.shape.borderRadiusLarge}px`, borderRadius: `${theme.shape.borderRadiusLarge}px`,
display: 'flex', display: 'flex',
flexDirection: { xs: 'column', md: 'row' }, flexDirection: { xs: 'column', md: 'row' },
border: '2px solid', border: '2px solid',
borderColor: 'primary.main', borderColor: theme.palette.background.alternative,
}} })}
ref={ref} ref={ref}
> >
<Box <Box

View File

@ -1,5 +1,5 @@
import { useEffect, useMemo, useState } from 'react'; import { useEffect, useMemo, useState } from 'react';
import { CircularProgress } from '@mui/material'; import { CircularProgress, Link } from '@mui/material';
import { Warning } from '@mui/icons-material'; import { Warning } from '@mui/icons-material';
import { AppsLinkList, styles as themeStyles } from 'component/common'; import { AppsLinkList, styles as themeStyles } from 'component/common';
import { PageContent } from 'component/common/PageContent/PageContent'; import { PageContent } from 'component/common/PageContent/PageContent';
@ -49,9 +49,9 @@ export const ApplicationList = () => {
<br /> <br />
You can read more about how to use Unleash in your application You can read more about how to use Unleash in your application
in the{' '} in the{' '}
<a href="https://docs.getunleash.io/docs/sdks/"> <Link href="https://docs.getunleash.io/docs/sdks/">
documentation. documentation.
</a> </Link>
</section> </section>
</> </>
); );

View File

@ -108,7 +108,7 @@ export const ReviewButton: FC<{ disabled: boolean }> = ({ disabled }) => {
: 'center bottom', : 'center bottom',
}} }}
> >
<Paper> <Paper className="dropdown-outline">
<ClickAwayListener onClickAway={onClose}> <ClickAwayListener onClickAway={onClose}>
<MenuList <MenuList
id="review-options-menu" id="review-options-menu"

View File

@ -11,7 +11,14 @@ import {
TableCell, TableCell,
TablePlaceholder, TablePlaceholder,
} from 'component/common/Table'; } from 'component/common/Table';
import { Box, Table, TableBody, TableRow, useMediaQuery } from '@mui/material'; import {
Box,
Table,
TableBody,
TableRow,
useMediaQuery,
Link,
} from '@mui/material';
import { SearchHighlightProvider } from 'component/common/Table/SearchHighlightContext/SearchHighlightContext'; import { SearchHighlightProvider } from 'component/common/Table/SearchHighlightContext/SearchHighlightContext';
import { ApiTokenDocs } from 'component/admin/apiToken/ApiTokenDocs/ApiTokenDocs'; import { ApiTokenDocs } from 'component/admin/apiToken/ApiTokenDocs/ApiTokenDocs';
@ -117,13 +124,13 @@ export const ApiTokenTable = ({
<TablePlaceholder> <TablePlaceholder>
<span> <span>
{'No tokens available. Read '} {'No tokens available. Read '}
<a <Link
href="https://docs.getunleash.io/how-to/api" href="https://docs.getunleash.io/how-to/api"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
> >
API How-to guides API How-to guides
</a>{' '} </Link>{' '}
{' to learn more.'} {' to learn more.'}
</span> </span>
</TablePlaceholder> </TablePlaceholder>

View File

@ -37,7 +37,7 @@ const StyledBadge = styled('div')<IBadgeProps>(
fontWeight: theme.fontWeight.bold, fontWeight: theme.fontWeight.bold,
lineHeight: 1, lineHeight: 1,
backgroundColor: theme.palette[color].light, backgroundColor: theme.palette[color].light,
color: theme.palette[color].dark, color: theme.palette[color].contrastText,
border: `1px solid ${theme.palette[color].border}`, border: `1px solid ${theme.palette[color].border}`,
}) })
); );

View File

@ -36,7 +36,7 @@ const StyledBar = styled(Paper)(({ theme }) => ({
const StyledCount = styled('span')(({ theme }) => ({ const StyledCount = styled('span')(({ theme }) => ({
background: theme.palette.secondary.main, background: theme.palette.secondary.main,
color: theme.palette.background.paper, color: theme.palette.common.white,
padding: theme.spacing(0.5, 1), padding: theme.spacing(0.5, 1),
borderRadius: theme.shape.borderRadius, borderRadius: theme.shape.borderRadius,
})); }));

View File

@ -7,7 +7,7 @@ interface ICheckMarkBadgeProps {
} }
const StyledBatch = styled('div')(({ theme }) => ({ const StyledBatch = styled('div')(({ theme }) => ({
backgroundColor: theme.palette.primary.main, backgroundColor: theme.palette.background.alternative,
width: '75px', width: '75px',
height: '75px', height: '75px',
borderRadius: '50px', borderRadius: '50px',
@ -21,12 +21,12 @@ const StyledBatch = styled('div')(({ theme }) => ({
})); }));
const StyledClose = styled(Close)(({ theme }) => ({ const StyledClose = styled(Close)(({ theme }) => ({
color: theme.palette.background.paper, color: theme.palette.common.white,
width: '35px', width: '35px',
height: '35px', height: '35px',
})); }));
const StyledCheck = styled(Check)(({ theme }) => ({ const StyledCheck = styled(Check)(({ theme }) => ({
color: theme.palette.background.paper, color: theme.palette.common.white,
width: '35px', width: '35px',
height: '35px', height: '35px',
})); }));

View File

@ -19,7 +19,6 @@ interface IConstraintAccordionBody {
const StyledInputContainer = styled('div')(({ theme }) => ({ const StyledInputContainer = styled('div')(({ theme }) => ({
padding: theme.spacing(2), padding: theme.spacing(2),
backgroundColor: theme.palette.neutral.light,
})); }));
const StyledButtonContainer = styled('div')(({ theme }) => ({ const StyledButtonContainer = styled('div')(({ theme }) => ({

View File

@ -111,7 +111,7 @@ export const FreeTextInput = ({
<Button <Button
className={styles.button} className={styles.button}
variant="outlined" variant="outlined"
color="secondary" color="primary"
onClick={() => addValues()} onClick={() => addValues()}
> >
Add values Add values

View File

@ -39,6 +39,7 @@ export const CaseSensitiveButton = ({
} }
elseShow={ elseShow={
<StyledToggleButtonOn <StyledToggleButtonOn
className="operator-is-active"
onClick={setCaseInsensitive} onClick={setCaseInsensitive}
disableRipple disableRipple
> >

View File

@ -7,7 +7,6 @@ import {
StyledToggleButtonOn, StyledToggleButtonOn,
} from '../StyledToggleButton'; } from '../StyledToggleButton';
import { ConditionallyRender } from '../../../../ConditionallyRender/ConditionallyRender'; import { ConditionallyRender } from '../../../../ConditionallyRender/ConditionallyRender';
import { ThemeMode } from 'component/common/ThemeMode/ThemeMode';
interface InvertedOperatorButtonProps { interface InvertedOperatorButtonProps {
localConstraint: IConstraint; localConstraint: IConstraint;
@ -17,59 +16,36 @@ interface InvertedOperatorButtonProps {
export const InvertedOperatorButton = ({ export const InvertedOperatorButton = ({
localConstraint, localConstraint,
setInvertedOperator, setInvertedOperator,
}: InvertedOperatorButtonProps) => { }: InvertedOperatorButtonProps) => (
const theme = useTheme(); <Tooltip
title={
return ( Boolean(localConstraint.inverted)
<Tooltip ? 'Remove negation'
title={ : 'Negate operator'
Boolean(localConstraint.inverted) }
? 'Remove negation' arrow
: 'Negate operator' >
} <Box sx={{ display: 'flex', alignItems: 'stretch' }}>
arrow <ConditionallyRender
> condition={Boolean(localConstraint.inverted)}
<Box sx={{ display: 'flex', alignItems: 'stretch' }}> show={
<ConditionallyRender <StyledToggleButtonOn
condition={Boolean(localConstraint.inverted)} className="operator-is-active"
show={ onClick={setInvertedOperator}
<StyledToggleButtonOn disableRipple
onClick={setInvertedOperator} >
disableRipple <NegatedIcon />
> </StyledToggleButtonOn>
<ThemeMode }
darkmode={ elseShow={
<NegatedIcon <StyledToggleButtonOff
style={{ onClick={setInvertedOperator}
fill: theme.palette.background disableRipple
.paper, >
}} <NegatedIconOff />
/> </StyledToggleButtonOff>
} }
lightmode={<NegatedIcon />} />
/> </Box>
</StyledToggleButtonOn> </Tooltip>
} );
elseShow={
<StyledToggleButtonOff
onClick={setInvertedOperator}
disableRipple
>
<ThemeMode
darkmode={
<NegatedIconOff
style={{
fill: theme.palette.background
.paper,
}}
/>
}
lightmode={<NegatedIconOff />}
/>
</StyledToggleButtonOff>
}
/>
</Box>
</Tooltip>
);
};

View File

@ -170,7 +170,10 @@ export const ConstraintAccordionList = forwardRef<
<div> <div>
<StyledAddCustomLabel> <StyledAddCustomLabel>
<p>Add any number of constraints</p> <p>Add any number of constraints</p>
<StyledHelpWrapper title="Help" arrow> <StyledHelpWrapper
title="View constraints documentation"
arrow
>
<a <a
href={ href={
'https://docs.getunleash.io/reference/strategy-constraints' 'https://docs.getunleash.io/reference/strategy-constraints'
@ -186,7 +189,7 @@ export const ConstraintAccordionList = forwardRef<
type="button" type="button"
onClick={onAdd} onClick={onAdd}
variant="outlined" variant="outlined"
color="secondary" color="primary"
> >
Add constraint Add constraint
</Button> </Button>

View File

@ -32,11 +32,8 @@ const StyledAccordion = styled(Accordion)(({ theme }) => ({
backgroundColor: theme.palette.background.paper, backgroundColor: theme.palette.background.paper,
boxShadow: 'none', boxShadow: 'none',
margin: 0, margin: 0,
'&:before': {
'& .root': { opacity: '0',
'&:before': {
opacity: '0 !important',
},
}, },
})); }));

View File

@ -44,7 +44,7 @@ const StyledHeaderValuesContainer = styled('div')(({ theme }) => ({
const StyledHeaderValuesExpand = styled('p')(({ theme }) => ({ const StyledHeaderValuesExpand = styled('p')(({ theme }) => ({
fontSize: theme.fontSizes.smallBody, fontSize: theme.fontSizes.smallBody,
marginTop: theme.spacing(0.5), marginTop: theme.spacing(0.5),
color: theme.palette.primary.dark, color: theme.palette.links,
[theme.breakpoints.down('sm')]: { [theme.breakpoints.down('sm')]: {
textAlign: 'center', textAlign: 'center',
}, },

View File

@ -18,12 +18,12 @@ export const ConstraintIcon: VFC<IConstraintIconProps> = ({ compact }) => (
}} }}
> >
<TrackChanges <TrackChanges
sx={{ sx={theme => ({
fill: 'white', fill: theme.palette.common.white,
display: 'block', display: 'block',
width: compact ? '16px' : '20px', width: compact ? theme.spacing(2) : theme.spacing(2.5),
height: compact ? '16px' : '20px', height: compact ? theme.spacing(2) : theme.spacing(2.5),
}} })}
/> />
</Box> </Box>
); );

View File

@ -20,7 +20,7 @@ const StyledDialog = styled(Dialog)(({ theme, maxWidth }) => ({
})); }));
const StyledDialogTitle = styled(DialogTitle)(({ theme }) => ({ const StyledDialogTitle = styled(DialogTitle)(({ theme }) => ({
backgroundColor: theme.palette.primary.main, backgroundColor: theme.palette.background.alternative,
color: theme.palette.primary.contrastText, color: theme.palette.primary.contrastText,
padding: theme.spacing(3.5, 6), padding: theme.spacing(3.5, 6),
fontWeight: theme.fontWeight.medium, fontWeight: theme.fontWeight.medium,

View File

@ -26,7 +26,7 @@ const EnvironmentIcon = ({ enabled, className }: IEnvironmentIcon) => {
}; };
const icon = { const icon = {
fill: '#fff', fill: theme.palette.common.white,
width: '16px', width: '16px',
height: '16px', height: '16px',
}; };

View File

@ -37,6 +37,7 @@ export const FavoriteIconButton: VFC<IFavoriteIconButtonProps> = ({
} }
elseShow={ elseShow={
<StarBorderIcon <StarBorderIcon
color="primary"
sx={{ sx={{
fontSize: theme => fontSize: theme =>
size === 'medium' size === 'medium'

View File

@ -20,7 +20,7 @@ export const FeatureStatusChip = ({
return ( return (
<div data-loading style={{ marginLeft: '8px' }}> <div data-loading style={{ marginLeft: '8px' }}>
<Badge color={stale ? 'neutral' : 'secondary'} title={title}> <Badge color={stale ? 'error' : 'success'} title={title}>
{value} {value}
</Badge> </Badge>
</div> </div>

View File

@ -5,7 +5,7 @@ const StyledIndicator = styled('div')(({ style, theme }) => ({
width: '25px', width: '25px',
height: '25px', height: '25px',
borderRadius: '50%', borderRadius: '50%',
color: theme.palette.primary.contrastText, color: theme.palette.common.white,
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
@ -27,9 +27,13 @@ export const GuidanceIndicator: FC<IGuidanceIndicatorProps> = ({
}) => { }) => {
const theme = useTheme(); const theme = useTheme();
const defaults = { backgroundColor: theme.palette.primary.main }; const defaults = {
backgroundColor: theme.palette.background.alternative,
color: theme.palette.common.white,
};
if (type === 'secondary') { if (type === 'secondary') {
defaults.backgroundColor = theme.palette.text.disabled; defaults.backgroundColor = theme.palette.background.paper;
defaults.color = theme.palette.text.secondary;
} }
return ( return (

View File

@ -16,7 +16,7 @@ const StyledContainer = styled('span')(({ theme }) => ({
}, },
'& svg': { '& svg': {
fontSize: theme.fontSizes.mainHeader, fontSize: theme.fontSizes.mainHeader,
color: theme.palette.neutral.main, color: theme.palette.action.active,
marginLeft: theme.spacing(0.5), marginLeft: theme.spacing(0.5),
}, },
})); }));

View File

@ -2,7 +2,7 @@
exports[`InstanceStatusBar should warn when the trial has churned 1`] = ` exports[`InstanceStatusBar should warn when the trial has churned 1`] = `
<aside <aside
class="css-jmsogz" class="css-163g6kh"
data-testid="INSTANCE_STATUS_BAR_ID" data-testid="INSTANCE_STATUS_BAR_ID"
> >
<svg <svg
@ -42,7 +42,7 @@ exports[`InstanceStatusBar should warn when the trial has churned 1`] = `
exports[`InstanceStatusBar should warn when the trial has expired 1`] = ` exports[`InstanceStatusBar should warn when the trial has expired 1`] = `
<aside <aside
class="css-jmsogz" class="css-163g6kh"
data-testid="INSTANCE_STATUS_BAR_ID" data-testid="INSTANCE_STATUS_BAR_ID"
> >
<svg <svg
@ -82,7 +82,7 @@ exports[`InstanceStatusBar should warn when the trial has expired 1`] = `
exports[`InstanceStatusBar should warn when the trial is about to expire 1`] = ` exports[`InstanceStatusBar should warn when the trial is about to expire 1`] = `
<aside <aside
class="css-yx2rkt" class="css-f22srx"
data-testid="INSTANCE_STATUS_BAR_ID" data-testid="INSTANCE_STATUS_BAR_ID"
> >
<svg <svg
@ -117,7 +117,7 @@ exports[`InstanceStatusBar should warn when the trial is about to expire 1`] = `
exports[`InstanceStatusBar should warn when the trial is far from expired 1`] = ` exports[`InstanceStatusBar should warn when the trial is far from expired 1`] = `
<aside <aside
class="css-yx2rkt" class="css-f22srx"
data-testid="INSTANCE_STATUS_BAR_ID" data-testid="INSTANCE_STATUS_BAR_ID"
> >
<svg <svg
@ -147,7 +147,7 @@ exports[`InstanceStatusBar should warn when the trial is far from expired 1`] =
exports[`InstanceStatusBar should warn when trialExpiry has passed 1`] = ` exports[`InstanceStatusBar should warn when trialExpiry has passed 1`] = `
<aside <aside
class="css-jmsogz" class="css-163g6kh"
data-testid="INSTANCE_STATUS_BAR_ID" data-testid="INSTANCE_STATUS_BAR_ID"
> >
<svg <svg

View File

@ -19,6 +19,7 @@ const StyledContainerBox = styled(Box, {
shouldForwardProp: prop => prop !== 'readAt', shouldForwardProp: prop => prop !== 'readAt',
})<{ readAt: boolean }>(({ theme, readAt }) => ({ })<{ readAt: boolean }>(({ theme, readAt }) => ({
padding: theme.spacing(0.5), padding: theme.spacing(0.5),
marginRight: theme.spacing(1.5),
backgroundColor: readAt backgroundColor: readAt
? theme.palette.neutral.light ? theme.palette.neutral.light
: theme.palette.secondary.light, : theme.palette.secondary.light,
@ -28,7 +29,6 @@ const StyledContainerBox = styled(Box, {
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
borderRadius: `${theme.shape.borderRadius}px`, borderRadius: `${theme.shape.borderRadius}px`,
position: 'absolute',
top: 3, top: 3,
left: 7, left: 7,
})); }));
@ -36,15 +36,20 @@ const StyledContainerBox = styled(Box, {
const StyledListItemButton = styled(ListItemButton)(({ theme }) => ({ const StyledListItemButton = styled(ListItemButton)(({ theme }) => ({
position: 'relative', position: 'relative',
cursor: 'pointer', cursor: 'pointer',
margin: theme.spacing(2, 0), padding: theme.spacing(2.5, 2, 3, 2),
'&:not(:last-child)': { borderRadius: theme.shape.borderRadiusMedium,
borderBottom: `2px solid ${theme.palette.divider}`,
},
width: '100%', width: '100%',
'&:after': {
content: '""',
width: `calc(100% - ${theme.spacing(4)})`,
height: '1px',
position: 'absolute',
bottom: 0,
backgroundColor: theme.palette.divider,
},
})); }));
const StyledNotificationMessageBox = styled(Box)(({ theme }) => ({ const StyledNotificationMessageBox = styled(Box)(({ theme }) => ({
marginLeft: theme.spacing(4),
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
width: '100%', width: '100%',
@ -54,12 +59,14 @@ const StyledSecondaryInfoBox = styled(Box)(({ theme }) => ({
display: 'flex', display: 'flex',
justifyContent: 'space-between', justifyContent: 'space-between',
alignItems: 'center', alignItems: 'center',
margin: theme.spacing(1.5, 0, 1.5, 0), margin: theme.spacing(1, 0, 0, 5.25),
})); }));
const StyledMessageTypography = styled(Typography, { const StyledMessageTypography = styled(Typography, {
shouldForwardProp: prop => prop !== 'readAt', shouldForwardProp: prop => prop !== 'readAt',
})<{ readAt: boolean }>(({ theme, readAt }) => ({ })<{ readAt: boolean }>(({ theme, readAt }) => ({
display: 'flex',
alignItems: 'center',
fontSize: theme.fontSizes.smallBody, fontSize: theme.fontSizes.smallBody,
fontWeight: readAt ? 'normal' : 'bold', fontWeight: readAt ? 'normal' : 'bold',
textDecoration: 'none', textDecoration: 'none',
@ -81,7 +88,7 @@ const StyledAvatar = styled(Avatar)(({ theme }) => ({
})); }));
const StyledCreatedBy = styled(Typography)(({ theme }) => ({ const StyledCreatedBy = styled(Typography)(({ theme }) => ({
fontSize: theme.fontSizes.smallerBody, fontSize: theme.fontSizes.smallBody,
color: theme.palette.neutral.main, color: theme.palette.neutral.main,
marginLeft: theme.spacing(1), marginLeft: theme.spacing(1),
})); }));
@ -133,9 +140,9 @@ export const Notification = ({
return ( return (
<StyledListItemButton onClick={() => onNotificationClick(notification)}> <StyledListItemButton onClick={() => onNotificationClick(notification)}>
{resolveIcon(notification.notificationType)}{' '}
<StyledNotificationMessageBox> <StyledNotificationMessageBox>
<StyledMessageTypography readAt={Boolean(readAt)}> <StyledMessageTypography readAt={Boolean(readAt)}>
{resolveIcon(notification.notificationType)}{' '}
{notification.message} {notification.message}
</StyledMessageTypography> </StyledMessageTypography>
<StyledSecondaryInfoBox> <StyledSecondaryInfoBox>

View File

@ -29,8 +29,7 @@ const StyledPrimaryContainerBox = styled(Box)(() => ({
})); }));
const StyledInnerContainerBox = styled(Box)(({ theme }) => ({ const StyledInnerContainerBox = styled(Box)(({ theme }) => ({
backgroundColor: theme.palette.neutral.light, backgroundColor: theme.palette.background.elevation1,
padding: theme.spacing(1, 3),
display: 'flex', display: 'flex',
justifyContent: 'center', justifyContent: 'center',
})); }));
@ -43,7 +42,7 @@ const StyledTypography = styled(Typography)(({ theme }) => ({
})); }));
const StyledPaper = styled(Paper)(({ theme }) => ({ const StyledPaper = styled(Paper)(({ theme }) => ({
width: '400px', width: '420px',
boxShadow: theme.boxShadows.popup, boxShadow: theme.boxShadows.popup,
borderRadius: `${theme.shape.borderRadiusLarge}px`, borderRadius: `${theme.shape.borderRadiusLarge}px`,
position: 'absolute', position: 'absolute',
@ -68,7 +67,7 @@ const StyledHeaderBox = styled(Box)(() => ({
})); }));
const StyledHeaderTypography = styled(Typography)(({ theme }) => ({ const StyledHeaderTypography = styled(Typography)(({ theme }) => ({
fontSize: theme.fontSizes.smallerBody, fontSize: theme.fontSizes.smallBody,
})); }));
const StyledIconButton = styled(IconButton)(({ theme }) => ({ const StyledIconButton = styled(IconButton)(({ theme }) => ({
@ -190,6 +189,7 @@ export const Notifications = () => {
onClickAway={() => setShowNotifications(false)} onClickAway={() => setShowNotifications(false)}
> >
<StyledPaper <StyledPaper
className="dropdown-outline"
onKeyDown={onKeyDown} onKeyDown={onKeyDown}
data-testid="NOTIFICATIONS_MODAL" data-testid="NOTIFICATIONS_MODAL"
> >

View File

@ -2,16 +2,12 @@ import { Typography, styled, Box } from '@mui/material';
import { FC } from 'react'; import { FC } from 'react';
const StyledOuterContainerBox = styled(Box)(({ theme }) => ({ const StyledOuterContainerBox = styled(Box)(({ theme }) => ({
padding: theme.spacing(1.5, 3, 0.5, 3), padding: theme.spacing(1, 1.5, 1, 3),
display: 'flex', display: 'flex',
justifyContent: 'space-between', justifyContent: 'space-between',
alignItems: 'center', alignItems: 'center',
})); position: 'relative',
const StyledInnerBox = styled(Box)(({ theme }) => ({
boxShadow: theme.boxShadows.separator, boxShadow: theme.boxShadows.separator,
width: '100%',
height: '4px',
})); }));
export const NotificationsHeader: FC = ({ children }) => { export const NotificationsHeader: FC = ({ children }) => {
@ -21,8 +17,6 @@ export const NotificationsHeader: FC = ({ children }) => {
<Typography fontWeight="bold">Notifications</Typography> <Typography fontWeight="bold">Notifications</Typography>
{children} {children}
</StyledOuterContainerBox> </StyledOuterContainerBox>
<StyledInnerBox />
</> </>
); );
}; };

View File

@ -2,7 +2,7 @@ import { List, styled } from '@mui/material';
import { FC } from 'react'; import { FC } from 'react';
const StyledListContainer = styled(List)(({ theme }) => ({ const StyledListContainer = styled(List)(({ theme }) => ({
padding: theme.spacing(2, 3), padding: theme.spacing(1, 1, 3, 1),
})); }));
export const NotificationsList: FC = ({ children }) => { export const NotificationsList: FC = ({ children }) => {

View File

@ -15,7 +15,6 @@ const OperatorDocsLink = () => {
href="https://docs.getunleash.io/reference/strategy-constraints#strategy-constraint-operators" href="https://docs.getunleash.io/reference/strategy-constraints#strategy-constraint-operators"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
style={{ color: 'inherit' }}
> >
Read more Read more
</a> </a>

View File

@ -1,7 +1,9 @@
import { ReactComponent as ProPlanIcon } from 'assets/icons/pro-enterprise-feature-badge.svg'; import { ReactComponent as ProPlanIcon } from 'assets/icons/pro-enterprise-feature-badge.svg';
import { ReactComponent as ProPlanIconLight } from 'assets/icons/pro-enterprise-feature-badge-light.svg';
import { Box, Button, Link, styled, Typography } from '@mui/material'; import { Box, Button, Link, styled, Typography } from '@mui/material';
import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
import { ConditionallyRender } from '../ConditionallyRender/ConditionallyRender'; import { ConditionallyRender } from '../ConditionallyRender/ConditionallyRender';
import { ThemeMode } from '../ThemeMode/ThemeMode';
const PremiumFeatureWrapper = styled(Box, { const PremiumFeatureWrapper = styled(Box, {
shouldForwardProp: prop => prop !== 'tooltip', shouldForwardProp: prop => prop !== 'tooltip',
@ -111,7 +113,10 @@ export const PremiumFeature = ({ feature, tooltip }: PremiumFeatureProps) => {
return ( return (
<PremiumFeatureWrapper tooltip={tooltip}> <PremiumFeatureWrapper tooltip={tooltip}>
<StyledTitle> <StyledTitle>
<ProPlanIcon /> <ThemeMode
darkmode={<ProPlanIconLight />}
lightmode={<ProPlanIcon />}
/>
{`${plan} feature`} {`${plan} feature`}
</StyledTitle> </StyledTitle>
<ConditionallyRender <ConditionallyRender

View File

@ -35,20 +35,21 @@ const StyledContainer = styled('div')(({ theme }) => ({
const StyledSearch = styled('div')(({ theme }) => ({ const StyledSearch = styled('div')(({ theme }) => ({
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
backgroundColor: theme.palette.background.paper, backgroundColor: theme.palette.background.elevation1,
border: `1px solid ${theme.palette.neutral.border}`, border: `1px solid ${theme.palette.neutral.border}`,
borderRadius: theme.shape.borderRadiusExtraLarge, borderRadius: theme.shape.borderRadiusExtraLarge,
padding: '3px 5px 3px 12px', padding: '3px 5px 3px 12px',
width: '100%', width: '100%',
zIndex: 3, zIndex: 3,
'&:focus-within': { '&:focus-within': {
borderColor: theme.palette.primary.light, borderColor: theme.palette.primary.main,
boxShadow: theme.boxShadows.main, boxShadow: theme.boxShadows.main,
}, },
})); }));
const StyledInputBase = styled(InputBase)(({ theme }) => ({ const StyledInputBase = styled(InputBase)(({ theme }) => ({
width: '100%', width: '100%',
backgroundColor: theme.palette.background.elevation1,
})); }));
const StyledClose = styled(Close)(({ theme }) => ({ const StyledClose = styled(Close)(({ theme }) => ({

View File

@ -102,7 +102,7 @@ export const SearchSuggestions: VFC<SearchSuggestionsProps> = ({
: 'example-search-text'; : 'example-search-text';
return ( return (
<StyledPaper> <StyledPaper className="dropdown-outline">
<StyledBox> <StyledBox>
<StyledFilterList /> <StyledFilterList />
<Box> <Box>

View File

@ -1,4 +1,5 @@
import { styled, TableCell } from '@mui/material'; import { styled, TableCell } from '@mui/material';
import { focusable } from 'themes/themeStyles';
export const StyledTableCell = styled(TableCell, { export const StyledTableCell = styled(TableCell, {
shouldForwardProp: prop => shouldForwardProp: prop =>
@ -36,13 +37,13 @@ export const StyledTableCell = styled(TableCell, {
export const StyledButton = styled('button', { export const StyledButton = styled('button', {
shouldForwardProp: prop => prop !== 'isSorted', shouldForwardProp: prop => prop !== 'isSorted',
})<{ isSorted?: boolean }>(({ theme, isSorted }) => ({ })<{ isSorted?: boolean }>(({ theme, isSorted }) => ({
...focusable(theme),
all: 'unset', all: 'unset',
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
width: '100%', width: '100%',
position: 'relative', position: 'relative',
zIndex: 1, zIndex: 1,
':hover, :focus, &:focus-visible, &:active': { ':hover, :focus, &:focus-visible, &:active': {
outline: 'revert',
'.hover-only': { '.hover-only': {
display: 'inline-block', display: 'inline-block',
}, },

View File

@ -17,7 +17,6 @@ interface ISortArrowProps {
const iconStyle = (theme: Theme) => ({ const iconStyle = (theme: Theme) => ({
marginLeft: theme.spacing(0.25), marginLeft: theme.spacing(0.25),
marginRight: theme.spacing(-0.5), marginRight: theme.spacing(-0.5),
color: theme.palette.neutral.main,
fontSize: theme.fontSizes.mainHeader, fontSize: theme.fontSizes.mainHeader,
verticalAlign: 'middle', verticalAlign: 'middle',
}); });
@ -36,7 +35,6 @@ export const SortArrow: VFC<ISortArrowProps> = ({
<KeyboardArrowDown <KeyboardArrowDown
sx={theme => ({ sx={theme => ({
...iconStyle(theme), ...iconStyle(theme),
color: theme.palette.table.headerColor,
})} })}
className={className} className={className}
fontSize="inherit" fontSize="inherit"
@ -46,7 +44,6 @@ export const SortArrow: VFC<ISortArrowProps> = ({
<KeyboardArrowUp <KeyboardArrowUp
sx={theme => ({ sx={theme => ({
...iconStyle(theme), ...iconStyle(theme),
color: theme.palette.table.headerColor,
})} })}
className={className} className={className}
fontSize="inherit" fontSize="inherit"

View File

@ -4,8 +4,8 @@ import { Box } from '@mui/material';
export const TablePlaceholder: FC = ({ children }) => ( export const TablePlaceholder: FC = ({ children }) => (
<Box <Box
sx={{ sx={{
border: theme => `2px dashed ${theme.palette.neutral.light}`, border: theme => `2px dashed ${theme.palette.divider}`,
p: 1.6, p: 8,
textAlign: 'center', textAlign: 'center',
display: 'flex', display: 'flex',
justifyContent: 'center', justifyContent: 'center',

View File

@ -4,7 +4,7 @@ export const useStyles = makeStyles()(theme => ({
container: { container: {
maxWidth: '450px', maxWidth: '450px',
background: theme.palette.background.paper, background: theme.palette.background.paper,
boxShadow: '2px 2px 4px rgba(0,0,0,0.4)', boxShadow: theme.boxShadows.popup,
zIndex: 500, zIndex: 500,
margin: '0 0.8rem', margin: '0 0.8rem',
borderRadius: '12.5px', borderRadius: '12.5px',

View File

@ -10,7 +10,7 @@ const StyledTab = styled(Button)<{ selected: boolean }>(
? theme.palette.background.paper ? theme.palette.background.paper
: 'transparent', : 'transparent',
borderLeft: `${theme.spacing(1)} solid ${ borderLeft: `${theme.spacing(1)} solid ${
selected ? theme.palette.primary.main : 'transparent' selected ? theme.palette.background.alternative : 'transparent'
}`, }`,
borderRadius: theme.shape.borderRadiusMedium, borderRadius: theme.shape.borderRadiusMedium,
justifyContent: 'start', justifyContent: 'start',

View File

@ -6,6 +6,7 @@ import {
Typography, Typography,
styled, styled,
Theme, Theme,
Link,
} from '@mui/material'; } from '@mui/material';
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Add } from '@mui/icons-material'; import { Add } from '@mui/icons-material';
@ -246,13 +247,13 @@ export const ContextForm: React.FC<IContextForm> = ({
guarantee a consistent behavior for specific values of this guarantee a consistent behavior for specific values of this
context field. PS! Not all client SDK's support this feature context field. PS! Not all client SDK's support this feature
yet!{' '} yet!{' '}
<a <Link
href="https://docs.getunleash.io/reference/stickiness" href="https://docs.getunleash.io/reference/stickiness"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
> >
Read more Read more
</a> </Link>
</p> </p>
<StyledSwitchContainer> <StyledSwitchContainer>
<Switch <Switch

View File

@ -38,10 +38,14 @@ const StyledContainerListItem = styled('li')(({ theme }) => ({
padding: theme.spacing(4), padding: theme.spacing(4),
}, },
}, },
a: {
color: theme.palette.links,
},
})); }));
export const StyledCodeSection = styled('div')(({ theme }) => ({ export const StyledCodeSection = styled('div')(({ theme }) => ({
backgroundColor: 'white', backgroundColor: theme.palette.background.paper,
overflowX: 'auto', overflowX: 'auto',
padding: theme.spacing(2), padding: theme.spacing(2),
borderBottomLeftRadius: theme.shape.borderRadiusLarge, borderBottomLeftRadius: theme.shape.borderRadiusLarge,

View File

@ -7,11 +7,11 @@ import {
Paper, Paper,
FormControlLabel, FormControlLabel,
Alert, Alert,
styled,
} from '@mui/material'; } from '@mui/material';
import { FileCopy } from '@mui/icons-material'; import { FileCopy } from '@mui/icons-material';
import { styles as themeStyles } from 'component/common'; import { styles as themeStyles } from 'component/common';
import { formatUnknownError } from 'utils/formatUnknownError'; import { formatUnknownError } from 'utils/formatUnknownError';
import styles from './CopyFeature.module.scss';
import { trim } from 'component/common/util'; import { trim } from 'component/common/util';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { getTogglePath } from 'utils/routePathHelpers'; import { getTogglePath } from 'utils/routePathHelpers';
@ -19,6 +19,42 @@ import useFeatureApi from 'hooks/api/actions/useFeatureApi/useFeatureApi';
import { useFeature } from 'hooks/api/getters/useFeature/useFeature'; import { useFeature } from 'hooks/api/getters/useFeature/useFeature';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
const StyledPage = styled(Paper)(({ theme }) => ({
overflow: 'visible',
borderRadius: theme.shape.borderRadiusLarge,
}));
const StyledHeader = styled('div')(({ theme }) => ({
padding: theme.spacing(3, 4),
borderBottom: `1px solid ${theme.palette.divider}`,
}));
const StyledTitle = styled('h1')(({ theme }) => ({
fontSize: theme.fontSizes.mainHeader,
fontWeight: theme.fontWeight.medium,
}));
const StyledSection = styled('section')(({ theme }) => ({
padding: theme.spacing(4),
}));
const StyledDescription = styled('p')(({ theme }) => ({
marginTop: 0,
marginBottom: theme.spacing(4),
}));
const StyledForm = styled('form')(({ theme }) => ({
display: 'flex',
flexDirection: 'column',
marginBottom: theme.spacing(3),
maxWidth: theme.spacing(50),
}));
const StyledFormControlLabel = styled(FormControlLabel)(({ theme }) => ({
marginTop: theme.spacing(2),
marginBottom: theme.spacing(4),
}));
export const CopyFeatureToggle = () => { export const CopyFeatureToggle = () => {
const [replaceGroupId, setReplaceGroupId] = useState(true); const [replaceGroupId, setReplaceGroupId] = useState(true);
const [apiError, setApiError] = useState(''); const [apiError, setApiError] = useState('');
@ -73,19 +109,16 @@ export const CopyFeatureToggle = () => {
if (!feature || !feature.name) return <span>Toggle not found</span>; if (!feature || !feature.name) return <span>Toggle not found</span>;
return ( return (
<Paper <StyledPage className={themeStyles.fullwidth}>
className={themeStyles.fullwidth} <StyledHeader>
style={{ overflow: 'visible' }} <StyledTitle>Copy&nbsp;{featureId}</StyledTitle>
> </StyledHeader>
<div className={styles.header}>
<h1>Copy&nbsp;{featureId}</h1>
</div>
<ConditionallyRender <ConditionallyRender
condition={Boolean(apiError)} condition={Boolean(apiError)}
show={<Alert severity="error">{apiError}</Alert>} show={<Alert severity="error">{apiError}</Alert>}
/> />
<section className={styles.content}> <StyledSection>
<p className={styles.text}> <StyledDescription>
You are about to create a new feature toggle by cloning the You are about to create a new feature toggle by cloning the
configuration of feature toggle&nbsp; configuration of feature toggle&nbsp;
<Link to={getTogglePath(projectId, featureId)}> <Link to={getTogglePath(projectId, featureId)}>
@ -93,8 +126,8 @@ export const CopyFeatureToggle = () => {
</Link> </Link>
. You must give the new feature toggle a unique name before . You must give the new feature toggle a unique name before
you can proceed. you can proceed.
</p> </StyledDescription>
<form onSubmit={onSubmit}> <StyledForm onSubmit={onSubmit}>
<TextField <TextField
label="Name" label="Name"
name="name" name="name"
@ -108,7 +141,7 @@ export const CopyFeatureToggle = () => {
aria-required aria-required
autoFocus autoFocus
/> />
<FormControlLabel <StyledFormControlLabel
control={ control={
<Switch <Switch
value={replaceGroupId} value={replaceGroupId}
@ -123,8 +156,8 @@ export const CopyFeatureToggle = () => {
<FileCopy /> <FileCopy />
&nbsp;&nbsp;&nbsp; Create from copy &nbsp;&nbsp;&nbsp; Create from copy
</Button> </Button>
</form> </StyledForm>
</section> </StyledSection>
</Paper> </StyledPage>
); );
}; };

View File

@ -6,6 +6,7 @@ import {
Switch, Switch,
Theme, Theme,
Typography, Typography,
Link,
} from '@mui/material'; } from '@mui/material';
import FeatureTypeSelect from '../FeatureView/FeatureSettings/FeatureSettingsMetadata/FeatureTypeSelect/FeatureTypeSelect'; import FeatureTypeSelect from '../FeatureView/FeatureSettings/FeatureSettingsMetadata/FeatureTypeSelect/FeatureTypeSelect';
import { CF_DESC_ID, CF_NAME_ID, CF_TYPE_ID } from 'utils/testIds'; import { CF_DESC_ID, CF_NAME_ID, CF_TYPE_ID } from 'utils/testIds';
@ -52,7 +53,6 @@ const StyledContainer = styled('div')({
const StyledInputDescription = styled('p')(({ theme }) => ({ const StyledInputDescription = styled('p')(({ theme }) => ({
marginBottom: theme.spacing(1), marginBottom: theme.spacing(1),
color: theme.palette.text.secondary,
})); }));
const StyledInput = styled(Input)(({ theme }) => ({ const StyledInput = styled(Input)(({ theme }) => ({
@ -210,13 +210,13 @@ const FeatureForm: React.FC<IFeatureToggleForm> = ({
When you enable impression data for a feature toggle, When you enable impression data for a feature toggle,
your client SDKs will emit events you can listen for your client SDKs will emit events you can listen for
every time this toggle gets triggered. Learn more in{' '} every time this toggle gets triggered. Learn more in{' '}
<a <Link
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
href="https://docs.getunleash.io/advanced/impression_data" href="https://docs.getunleash.io/advanced/impression_data"
> >
the impression data documentation the impression data documentation
</a> </Link>
</p> </p>
<StyledRow> <StyledRow>
<FormControlLabel <FormControlLabel

View File

@ -42,6 +42,10 @@ const StyledDescription = styled('p')(({ theme }) => ({
fontSize: theme.fontSizes.smallBody, fontSize: theme.fontSizes.smallBody,
textAlign: 'center', textAlign: 'center',
marginBottom: theme.spacing(3), marginBottom: theme.spacing(3),
a: {
color: theme.palette.links,
},
})); }));
export const FeatureStrategyEmpty = ({ export const FeatureStrategyEmpty = ({

View File

@ -22,9 +22,7 @@ export const FeatureStrategyEnabled: FC<IFeatureStrategyEnabledProps> = ({
const { feature } = useFeature(projectId, featureId); const { feature } = useFeature(projectId, featureId);
const featurePageLink = ( const featurePageLink = (
<Link to={featurePagePath} style={{ color: 'inherit' }}> <Link to={featurePagePath}>feature toggle page</Link>
feature toggle page
</Link>
); );
return ( return (

View File

@ -254,7 +254,7 @@ export const FeatureStrategyForm = ({
</PermissionButton> </PermissionButton>
<Button <Button
type="button" type="button"
color="secondary" color="primary"
onClick={onCancel} onClick={onCancel}
disabled={loading} disabled={loading}
> >

View File

@ -36,6 +36,7 @@ import FileDownload from '@mui/icons-material/FileDownload';
import { useEnvironments } from 'hooks/api/getters/useEnvironments/useEnvironments'; import { useEnvironments } from 'hooks/api/getters/useEnvironments/useEnvironments';
import { ExportDialog } from './ExportDialog'; import { ExportDialog } from './ExportDialog';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { focusable } from 'themes/themeStyles';
export const featuresPlaceholder: FeatureSchema[] = Array(15).fill({ export const featuresPlaceholder: FeatureSchema[] = Array(15).fill({
name: 'Name of the feature', name: 'Name of the feature',
@ -306,7 +307,7 @@ export const FeatureToggleListTable: VFC = () => {
component={RouterLink} component={RouterLink}
to="/archive" to="/archive"
underline="always" underline="always"
sx={{ marginRight: 2 }} sx={{ marginRight: 2, ...focusable(theme) }}
> >
View archive View archive
</Link> </Link>

View File

@ -20,9 +20,9 @@ export const createChartOptions = (
}, },
plugins: { plugins: {
tooltip: { tooltip: {
backgroundColor: 'white', backgroundColor: theme.palette.background.paper,
bodyColor: theme.palette.text.primary, bodyColor: theme.palette.text.primary,
titleColor: theme.palette.action.active, titleColor: theme.palette.text.secondary,
borderColor: theme.palette.primary.main, borderColor: theme.palette.primary.main,
borderWidth: 1, borderWidth: 1,
padding: 10, padding: 10,

View File

@ -28,7 +28,7 @@ const StyledList = styled('ul')(({ theme }) => ({
const StyledItem = styled('li')(({ theme }) => ({ const StyledItem = styled('li')(({ theme }) => ({
'& > [aria-pressed=true]': { '& > [aria-pressed=true]': {
backgroundColor: theme.palette.primary.main, backgroundColor: theme.palette.background.alternative,
color: theme.palette.primary.contrastText, color: theme.palette.primary.contrastText,
}, },
'& > [aria-pressed=true]:hover': { '& > [aria-pressed=true]:hover': {

View File

@ -32,10 +32,9 @@ const StyledFeatureOverviewEnvironment = styled('div', {
})<{ enabled: boolean }>(({ theme, enabled }) => ({ })<{ enabled: boolean }>(({ theme, enabled }) => ({
borderRadius: theme.shape.borderRadiusLarge, borderRadius: theme.shape.borderRadiusLarge,
marginBottom: theme.spacing(2), marginBottom: theme.spacing(2),
backgroundColor: theme.palette.background.paper, backgroundColor: enabled
background: enabled
? theme.palette.background.paper ? theme.palette.background.paper
: theme.palette.neutral.light, : theme.palette.envAccordion.disabled,
})); }));
const StyledAccordion = styled(Accordion)({ const StyledAccordion = styled(Accordion)({
@ -53,14 +52,12 @@ const StyledAccordionSummary = styled(AccordionSummary)(({ theme }) => ({
const StyledAccordionDetails = styled(AccordionDetails, { const StyledAccordionDetails = styled(AccordionDetails, {
shouldForwardProp: prop => prop !== 'enabled', shouldForwardProp: prop => prop !== 'enabled',
})<{ enabled: boolean }>(({ theme, enabled }) => ({ })<{ enabled: boolean }>(({ theme }) => ({
padding: theme.spacing(3), padding: theme.spacing(3),
background: theme.palette.background.elevation2, background: theme.palette.envAccordion.expanded,
borderBottomLeftRadius: theme.shape.borderRadiusLarge, borderBottomLeftRadius: theme.shape.borderRadiusLarge,
borderBottomRightRadius: theme.shape.borderRadiusLarge, borderBottomRightRadius: theme.shape.borderRadiusLarge,
borderBottom: `4px solid ${ boxShadow: 'inset 0px 2px 4px rgba(32, 32, 33, 0.05)', // replace this with variable
enabled ? theme.palette.primary.light : theme.palette.neutral.border
}`,
[theme.breakpoints.down('md')]: { [theme.breakpoints.down('md')]: {
padding: theme.spacing(2, 1), padding: theme.spacing(2, 1),
@ -143,6 +140,9 @@ const FeatureOverviewEnvironment = ({
<StyledFeatureOverviewEnvironment enabled={env.enabled}> <StyledFeatureOverviewEnvironment enabled={env.enabled}>
<StyledAccordion <StyledAccordion
data-testid={`${FEATURE_ENVIRONMENT_ACCORDION}_${env.name}`} data-testid={`${FEATURE_ENVIRONMENT_ACCORDION}_${env.name}`}
className={`environment-accordion ${
env.enabled ? '' : 'accordion-disabled'
}`}
> >
<StyledAccordionSummary <StyledAccordionSummary
expandIcon={<ExpandMore titleAccess="Toggle" />} expandIcon={<ExpandMore titleAccess="Toggle" />}

View File

@ -40,7 +40,7 @@ const StyledInfoParagraph = styled('p')(({ theme }) => ({
})); }));
const StyledIcon = styled(FiberManualRecord)(({ theme }) => ({ const StyledIcon = styled(FiberManualRecord)(({ theme }) => ({
fill: theme.palette.background.application, fill: theme.palette.background.elevation2,
height: '75px', height: '75px',
width: '75px', width: '75px',
[theme.breakpoints.down(500)]: { [theme.breakpoints.down(500)]: {

View File

@ -22,7 +22,7 @@ const SeparatorContent = styled('span')(({ theme }) => ({
fontSize: theme.fontSizes.bodySize, fontSize: theme.fontSizes.bodySize,
textAlign: 'center', textAlign: 'center',
padding: '0 1rem', padding: '0 1rem',
background: theme.palette.background.elevation2, background: theme.palette.envAccordion.expanded,
position: 'relative', position: 'relative',
maxWidth: '80%', maxWidth: '80%',
color: theme.palette.text.primary, color: theme.palette.text.primary,

View File

@ -11,7 +11,7 @@ import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
const StyledContainer = styled('div')(({ theme }) => ({ const StyledContainer = styled('div')(({ theme }) => ({
borderRadius: theme.shape.borderRadiusLarge, borderRadius: theme.shape.borderRadiusLarge,
color: theme.palette.primary.contrastText, color: theme.palette.primary.contrastText,
backgroundColor: theme.palette.background.sidebar, backgroundColor: theme.palette.background.alternative,
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
maxWidth: '350px', maxWidth: '350px',

View File

@ -8,9 +8,11 @@ const StyledVisibilityToggle = styled(IconButton, {
})<{ visibilityOff: boolean }>(({ theme, visibilityOff }) => ({ })<{ visibilityOff: boolean }>(({ theme, visibilityOff }) => ({
marginLeft: 'auto', marginLeft: 'auto',
marginRight: theme.spacing(-1), marginRight: theme.spacing(-1),
color: visibilityOff ? theme.palette.neutral.main : theme.palette.divider, color: visibilityOff
? theme.palette.action.active
: theme.palette.action.focus,
'&:hover': { '&:hover': {
color: theme.palette.neutral.main, color: theme.palette.action.active,
}, },
})); }));

View File

@ -1,5 +1,5 @@
import { CloudCircle } from '@mui/icons-material'; import { CloudCircle } from '@mui/icons-material';
import { styled } from '@mui/material'; import { styled, Link } from '@mui/material';
import { IFeatureEnvironment } from 'interfaces/featureToggle'; import { IFeatureEnvironment } from 'interfaces/featureToggle';
import { EnvironmentVariantsTable } from './EnvironmentVariantsTable/EnvironmentVariantsTable'; import { EnvironmentVariantsTable } from './EnvironmentVariantsTable/EnvironmentVariantsTable';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
@ -107,13 +107,13 @@ export const EnvironmentVariantsCard = ({
control which parameter is used to control which parameter is used to
ensure consistent traffic allocation ensure consistent traffic allocation
across variants.{' '} across variants.{' '}
<a <Link
href="https://docs.getunleash.io/reference/feature-toggle-variants" href="https://docs.getunleash.io/reference/feature-toggle-variants"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
> >
Read more Read more
</a> </Link>
</StyledDescription> </StyledDescription>
</> </>
} }

View File

@ -1,4 +1,4 @@
import { Alert, Button, Divider, styled } from '@mui/material'; import { Alert, Button, Divider, Link, styled } from '@mui/material';
import FormTemplate from 'component/common/FormTemplate/FormTemplate'; import FormTemplate from 'component/common/FormTemplate/FormTemplate';
import { SidebarModal } from 'component/common/SidebarModal/SidebarModal'; import { SidebarModal } from 'component/common/SidebarModal/SidebarModal';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
@ -406,13 +406,13 @@ export const EnvironmentVariantsModal = ({
By overriding the stickiness you can control By overriding the stickiness you can control
which parameter is used to ensure consistent which parameter is used to ensure consistent
traffic allocation across variants.{' '} traffic allocation across variants.{' '}
<a <Link
href="https://docs.getunleash.io/reference/feature-toggle-variants" href="https://docs.getunleash.io/reference/feature-toggle-variants"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
> >
Read more Read more
</a> </Link>
</StyledDescription> </StyledDescription>
<div> <div>
<StyledStickinessSelect <StyledStickinessSelect

View File

@ -68,7 +68,7 @@ const StyledToolbarContainer = styled('div')({
const StyledSeparator = styled('div')(({ theme }) => ({ const StyledSeparator = styled('div')(({ theme }) => ({
width: '100%', width: '100%',
backgroundColor: theme.palette.background.elevation2, backgroundColor: theme.palette.divider,
height: '1px', height: '1px',
})); }));

View File

@ -10,7 +10,7 @@ const StyledSlider = withStyles(Slider, theme => ({
thumb: { thumb: {
height: 24, height: 24,
width: 24, width: 24,
backgroundColor: '#fff', backgroundColor: theme.palette.background.paper,
border: '2px solid currentColor', border: '2px solid currentColor',
}, },
active: {}, active: {},

View File

@ -27,7 +27,7 @@ const StyledModal = styled('div')(({ theme }) => ({
position: 'relative', position: 'relative',
padding: theme.spacing(8), padding: theme.spacing(8),
background: theme.palette.background.paper, background: theme.palette.background.paper,
boxShadow: '0 0 1rem rgba(0, 0, 0, 0.25)', boxShadow: theme.boxShadows.popup,
borderRadius: theme.spacing(2), borderRadius: theme.spacing(2),
[theme.breakpoints.down('md')]: { [theme.breakpoints.down('md')]: {
padding: theme.spacing(4), padding: theme.spacing(4),
@ -43,7 +43,7 @@ const StyledClose = styled('div')({
const StyledCloseIcon = styled(CloseOutlined)(({ theme }) => ({ const StyledCloseIcon = styled(CloseOutlined)(({ theme }) => ({
fontSize: '1.5rem', fontSize: '1.5rem',
color: theme.palette.action.disabled, color: theme.palette.action.active,
})); }));
export const FeedbackCES = ({ state }: IFeedbackCESProps) => { export const FeedbackCES = ({ state }: IFeedbackCESProps) => {

View File

@ -78,10 +78,10 @@ export const FeedbackNPS = ({ openUrl }: IFeedbackNPSProps) => {
> >
<Box <Box
sx={{ sx={{
borderRadius: '12.5px', borderRadius: `${theme.shape.borderRadiusLarge}px`,
backgroundColor: theme.palette.background.paper, backgroundColor: theme.palette.background.paper,
zIndex: 9999, zIndex: 9999,
boxShadow: '2px 2px 4px 4px rgba(143,143,143, 0.25)', boxShadow: theme.boxShadows.elevated,
padding: theme.spacing(3), padding: theme.spacing(3),
maxWidth: '400px', maxWidth: '400px',
}} }}
@ -101,10 +101,10 @@ export const FeedbackNPS = ({ openUrl }: IFeedbackNPSProps) => {
right: '-38px', right: '-38px',
top: '-47px', top: '-47px',
backgroundColor: theme.palette.background.paper, backgroundColor: theme.palette.background.paper,
boxShadow: boxShadow: theme.boxShadows.elevated,
'2px 2px 4px 4px rgba(143,143,143, 0.25)',
'&:hover': { '&:hover': {
backgroundColor: '#fff', backgroundColor:
theme.palette.background.paper,
}, },
}} }}
onClick={() => setShowFeedback(false)} onClick={() => setShowFeedback(false)}

View File

@ -17,7 +17,6 @@ const DraftBannerContentWrapper = styled(Box)(({ theme }) => ({
[theme.breakpoints.down('lg')]: { [theme.breakpoints.down('lg')]: {
padding: theme.spacing(1, 2), padding: theme.spacing(1, 2),
}, },
color: theme.palette.warning.main,
})); }));
const StyledBox = styled(Box)(({ theme }) => ({ const StyledBox = styled(Box)(({ theme }) => ({
@ -87,6 +86,7 @@ const StickyBanner = styled(Box)(({ theme }) => ({
zIndex: 250 /* has to lower than header.zIndex and higher than body.zIndex */, zIndex: 250 /* has to lower than header.zIndex and higher than body.zIndex */,
borderTop: `1px solid ${theme.palette.warning.border}`, borderTop: `1px solid ${theme.palette.warning.border}`,
borderBottom: `1px solid ${theme.palette.warning.border}`, borderBottom: `1px solid ${theme.palette.warning.border}`,
color: theme.palette.warning.contrastText,
backgroundColor: theme.palette.warning.light, backgroundColor: theme.palette.warning.light,
})); }));

View File

@ -13,6 +13,7 @@ import { useOptionalPathParam } from 'hooks/useOptionalPathParam';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled'; import { useChangeRequestsEnabled } from 'hooks/useChangeRequestsEnabled';
import { DraftBanner } from './DraftBanner/DraftBanner'; import { DraftBanner } from './DraftBanner/DraftBanner';
import { ThemeMode } from 'component/common/ThemeMode/ThemeMode';
interface IMainLayoutProps { interface IMainLayoutProps {
children: ReactNode; children: ReactNode;
@ -100,7 +101,21 @@ export const MainLayout = forwardRef<HTMLDivElement, IMainLayoutProps>(
{children} {children}
</MainLayoutContentContainer> </MainLayoutContentContainer>
</MainLayoutContent> </MainLayoutContent>
<StyledImg src={formatAssetPath(textureImage)} alt="" /> <ThemeMode
darkmode={
<StyledImg
style={{ opacity: 0.06 }}
src={formatAssetPath(textureImage)}
alt=""
/>
}
lightmode={
<StyledImg
src={formatAssetPath(textureImage)}
alt=""
/>
}
/>
</MainLayoutContentWrapper> </MainLayoutContentWrapper>
<Footer /> <Footer />
</MainLayoutContainer> </MainLayoutContainer>

View File

@ -2,6 +2,7 @@ import { styled } from '@mui/material';
import { ErrorOutlineRounded } from '@mui/icons-material'; import { ErrorOutlineRounded } from '@mui/icons-material';
const StyledErrorRoundedIcon = styled(ErrorOutlineRounded)(({ theme }) => ({ const StyledErrorRoundedIcon = styled(ErrorOutlineRounded)(({ theme }) => ({
color: theme.palette.error.main,
height: '20px', height: '20px',
width: '20px', width: '20px',
marginRight: theme.spacing(1), marginRight: theme.spacing(1),
@ -12,7 +13,7 @@ const StyledDiv = styled('div')(({ theme }) => ({
fontSize: theme.fontSizes.smallBody, fontSize: theme.fontSizes.smallBody,
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
color: theme.palette.error.main, color: theme.palette.error.contrastText,
backgroundColor: theme.palette.error.light, backgroundColor: theme.palette.error.light,
height: '65px', height: '65px',
borderBottom: `1px solid ${theme.palette.error.border}`, borderBottom: `1px solid ${theme.palette.error.border}`,

View File

@ -5,6 +5,7 @@ import { List, ListItem, ListItemText, Grid, styled } from '@mui/material';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { ApiDetails } from './ApiDetails/ApiDetails'; import { ApiDetails } from './ApiDetails/ApiDetails';
import { FooterTitle } from './FooterTitle'; import { FooterTitle } from './FooterTitle';
import { focusable } from 'themes/themeStyles';
const StyledFooter = styled('footer')(({ theme }) => ({ const StyledFooter = styled('footer')(({ theme }) => ({
padding: theme.spacing(4, 8), padding: theme.spacing(4, 8),
@ -23,8 +24,12 @@ const StyledListItem = styled(ListItem)(({ theme }) => ({
padding: 0, padding: 0,
margin: 0, margin: 0,
'& a': { '& a': {
...focusable(theme),
textDecoration: 'none', textDecoration: 'none',
color: theme.palette.text.primary, color: theme.palette.text.primary,
'&:hover': {
textDecoration: 'underline',
},
}, },
})); }));

View File

@ -53,7 +53,7 @@ exports[`should render DrawerMenu 1`] = `
className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root" className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root"
> >
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -72,7 +72,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -91,7 +91,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -111,7 +111,7 @@ exports[`should render DrawerMenu 1`] = `
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -131,7 +131,7 @@ exports[`should render DrawerMenu 1`] = `
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -150,7 +150,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -169,7 +169,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -188,7 +188,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -224,7 +224,7 @@ exports[`should render DrawerMenu 1`] = `
className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root" className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root"
> >
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -243,7 +243,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -262,7 +262,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -281,7 +281,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -300,7 +300,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -334,7 +334,7 @@ exports[`should render DrawerMenu 1`] = `
className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root" className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root"
> >
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -353,7 +353,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -372,7 +372,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -391,7 +391,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -410,7 +410,7 @@ exports[`should render DrawerMenu 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -498,7 +498,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root" className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root"
> >
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -517,7 +517,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -536,7 +536,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -556,7 +556,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -576,7 +576,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -595,7 +595,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -614,7 +614,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -633,7 +633,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -669,7 +669,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root" className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root"
> >
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -688,7 +688,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -707,7 +707,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -726,7 +726,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -745,7 +745,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -779,7 +779,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root" className="MuiList-root MuiList-padding MuiList-dense css-zin4jp-MuiList-root"
> >
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -798,7 +798,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -817,7 +817,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -836,7 +836,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div
@ -855,7 +855,7 @@ exports[`should render DrawerMenu with "features" selected 1`] = `
</div> </div>
</li> </li>
<li <li
className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-1j1wl1e-MuiListItem-root" className="MuiListItem-root MuiListItem-dense MuiListItem-gutters MuiListItem-padding css-rw9v7e-MuiListItem-root"
disabled={false} disabled={false}
> >
<div <div

View File

@ -87,6 +87,7 @@ const StyledLinks = styled('div')(({ theme }) => ({
})); }));
const StyledAdvancedNavButton = styled('button')(({ theme }) => ({ const StyledAdvancedNavButton = styled('button')(({ theme }) => ({
...focusable(theme),
border: 'none', border: 'none',
background: 'transparent', background: 'transparent',
height: '100%', height: '100%',

View File

@ -23,7 +23,7 @@ const StyledLink = styled(RouterLink)(({ theme }) => ({
width: '100%', width: '100%',
'&&': { '&&': {
// Override MenuItem's built-in padding. // Override MenuItem's built-in padding.
color: 'black', color: theme.palette.text.primary,
padding: theme.spacing(1, 2), padding: theme.spacing(1, 2),
}, },
})); }));

View File

@ -17,7 +17,7 @@ interface IPlaygroundEditorProps {
const StyledEditorHeader = styled('aside')(({ theme }) => ({ const StyledEditorHeader = styled('aside')(({ theme }) => ({
height: '50px', height: '50px',
backgroundColor: theme.palette.neutral.light, backgroundColor: theme.palette.background.paper,
borderTopRightRadius: theme.shape.borderRadiusMedium, borderTopRightRadius: theme.shape.borderRadiusMedium,
borderTopLeftRadius: theme.shape.borderRadiusMedium, borderTopLeftRadius: theme.shape.borderRadiusMedium,
padding: theme.spacing(1, 2), padding: theme.spacing(1, 2),
@ -26,24 +26,23 @@ const StyledEditorHeader = styled('aside')(({ theme }) => ({
justifyContent: 'space-between', justifyContent: 'space-between',
alignItems: 'center', alignItems: 'center',
border: `1px solid ${theme.palette.divider}`, border: `1px solid ${theme.palette.divider}`,
borderBottom: 'none',
})); }));
const StyledEditorStatusContainer = styled('div')(({ theme, style }) => ({ const StyledEditorStatusContainer = styled('div')(({ theme, style }) => ({
width: '28px', width: theme.spacing(3),
height: '28px', height: theme.spacing(3),
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
color: theme.palette.background.paper,
justifyContent: 'center', justifyContent: 'center',
transition: `background-color 0.5s ease-in-out`, transition: `background-color 0.5s ease-in-out`,
borderRadius: '50%', borderRadius: '50%',
opacity: 0.8,
...style, ...style,
})); }));
const StyledErrorSpan = styled('div')(({ theme }) => ({ const StyledErrorSpan = styled('div')(({ theme }) => ({
fontSize: '0.9rem', fontSize: theme.fontSizes.smallBody,
color: theme.palette.error.main, color: theme.palette.error.dark,
marginRight: theme.spacing(1), marginRight: theme.spacing(1),
})); }));
@ -52,11 +51,15 @@ const EditorStatusOk = () => {
return ( return (
<StyledEditorStatusContainer <StyledEditorStatusContainer
style={{ style={{
color: theme.palette.success.contrastText,
backgroundColor: theme.palette.success.main, backgroundColor: theme.palette.success.main,
}} }}
> >
<Check sx={{ width: '20px', height: '20px' }} /> <Check
sx={theme => ({
width: theme.spacing(2),
height: theme.spacing(2),
})}
/>
</StyledEditorStatusContainer> </StyledEditorStatusContainer>
); );
}; };
@ -67,7 +70,6 @@ const EditorStatusError = () => {
return ( return (
<StyledEditorStatusContainer <StyledEditorStatusContainer
style={{ style={{
color: theme.palette.error.contrastText,
backgroundColor: theme.palette.error.main, backgroundColor: theme.palette.error.main,
}} }}
> >
@ -119,8 +121,6 @@ export const PlaygroundEditor: VFC<IPlaygroundEditorProps> = ({
style={{ style={{
border: `1px solid ${theme.palette.divider}`, border: `1px solid ${theme.palette.divider}`,
borderTop: 'none', borderTop: 'none',
borderBottomLeftRadius: theme.shape.borderRadiusMedium,
borderBottomRightRadius: theme.shape.borderRadiusMedium,
}} }}
placeholder={JSON.stringify( placeholder={JSON.stringify(
{ {

View File

@ -1,7 +1,7 @@
import { styled } from '@mui/material'; import { styled } from '@mui/material';
export const ImportLayoutContainer = styled('div')(({ theme }) => ({ export const ImportLayoutContainer = styled('div')(({ theme }) => ({
backgroundColor: '#fff', backgroundColor: theme.palette.background.paper,
padding: theme.spacing(5, 8, 3, 8), padding: theme.spacing(5, 8, 3, 8),
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',

View File

@ -21,18 +21,17 @@ const ModalContentContainer = styled('div')(({ theme }) => ({
})); }));
const TimelineContainer = styled('div')(({ theme }) => ({ const TimelineContainer = styled('div')(({ theme }) => ({
backgroundColor: theme.palette.primary.main, backgroundColor: theme.palette.background.sidebar,
padding: theme.spacing(6, 8, 3, 4), padding: theme.spacing(8),
flexBasis: '30%', flexBasis: '30%',
})); }));
const TimelineHeader = styled('div')(({ theme }) => ({ const TimelineHeader = styled('div')(({ theme }) => ({
textTransform: 'uppercase', textTransform: 'uppercase',
fontSize: theme.fontSizes.smallBody, fontSize: theme.fontSizes.smallBody,
color: theme.palette.primary.contrastText, color: theme.palette.common.white,
fontWeight: theme.typography.fontWeightBold, fontWeight: theme.typography.fontWeightBold,
paddingLeft: theme.spacing(2), marginBottom: theme.spacing(3),
marginBottom: theme.spacing(4),
})); }));
const isValidJSON = (json: string) => { const isValidJSON = (json: string) => {

View File

@ -1,7 +1,7 @@
import TimelineSeparator from '@mui/lab/TimelineSeparator'; import TimelineSeparator from '@mui/lab/TimelineSeparator';
import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem';
import React, { FC } from 'react'; import React, { FC } from 'react';
import { Box, styled } from '@mui/material'; import { alpha, Box, styled } from '@mui/material';
import TimelineConnector from '@mui/lab/TimelineConnector'; import TimelineConnector from '@mui/lab/TimelineConnector';
import TimelineDot from '@mui/lab/TimelineDot'; import TimelineDot from '@mui/lab/TimelineDot';
import TimelineContent from '@mui/lab/TimelineContent'; import TimelineContent from '@mui/lab/TimelineContent';
@ -9,42 +9,58 @@ import Timeline from '@mui/lab/Timeline';
import { StageName } from './StageName'; import { StageName } from './StageName';
const StyledTimeline = styled(Timeline)(() => ({ const StyledTimeline = styled(Timeline)(() => ({
padding: 0,
margin: 0,
[`& .${timelineItemClasses.root}:before`]: { [`& .${timelineItemClasses.root}:before`]: {
flex: 0, flex: 0,
padding: 0, padding: 0,
}, },
})); }));
const StyledTimelineConnector = styled(TimelineConnector)(({ theme }) => ({ const StyledTimelineConnector = styled(TimelineConnector, {
shouldForwardProp: prop => prop !== 'active',
})<{ active: boolean }>(({ theme, active }) => ({
width: '1px', width: '1px',
backgroundColor: theme.palette.neutral.border, backgroundColor: active
? theme.palette.common.white
: `${alpha(theme.palette.common.white, 0.5)}`,
})); }));
const StyledTimelineDot = styled(TimelineDot, { const StyledTimelineDot = styled(TimelineDot, {
shouldForwardProp: prop => prop !== 'active', shouldForwardProp: prop => prop !== 'active',
})<{ active: boolean }>(({ theme, active }) => ({ })<{ active: boolean }>(({ theme, active }) => ({
color: active ? theme.palette.primary.main : theme.palette.neutral.border, color: active
backgroundColor: active ? theme.palette.primary.contrastText : 'initial', ? theme.palette.background.sidebar
fontWeight: active ? theme.fontWeight.bold : theme.fontWeight.medium, : `${alpha(theme.palette.common.white, 0.8)}`,
borderColor: theme.palette.neutral.border, backgroundColor: active ? theme.palette.common.white : 'initial',
width: '40px', fontWeight: active ? theme.fontWeight.bold : 'normal',
height: '40px', borderColor: active
? theme.palette.common.white
: `${alpha(theme.palette.common.white, 0.8)}`,
width: theme.spacing(5),
height: theme.spacing(5),
lineHeight: theme.spacing(5),
borderWidth: '1px', borderWidth: '1px',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
margin: theme.spacing(1, 0),
})); }));
const StyledTimelineContent = styled(TimelineContent, { const StyledTimelineContent = styled(TimelineContent, {
shouldForwardProp: prop => prop !== 'active', shouldForwardProp: prop => prop !== 'active',
})<{ active: boolean }>(({ theme, active }) => ({ })<{ active: boolean }>(({ theme, active }) => ({
marginBottom: theme.spacing(6), padding: theme.spacing(2, 2, 6, 2),
color: active ? theme.palette.common.white : theme.palette.neutral.border, color: active
marginTop: theme.spacing(2), ? theme.palette.common.white
: `${alpha(theme.palette.common.white, 0.8)}`,
})); }));
const TimelineItemTitle = styled(Box)(({ theme }) => ({ const TimelineItemTitle = styled(Box, {
fontWeight: theme.fontWeight.bold, shouldForwardProp: prop => prop !== 'active',
})<{ active: boolean }>(({ theme, active }) => ({
fontWeight: active ? theme.fontWeight.bold : 'normal',
fontSize: theme.fontSizes.bodySize, fontSize: theme.fontSizes.bodySize,
})); }));
@ -65,10 +81,12 @@ export const ImportTimeline: FC<{
> >
1 1
</StyledTimelineDot> </StyledTimelineDot>
<StyledTimelineConnector /> <StyledTimelineConnector active={stage === 'configure'} />
</TimelineSeparator> </TimelineSeparator>
<StyledTimelineContent active={stage === 'configure'}> <StyledTimelineContent active={stage === 'configure'}>
<TimelineItemTitle>Import file</TimelineItemTitle> <TimelineItemTitle active={stage === 'configure'}>
Import file
</TimelineItemTitle>
<TimelineItemDescription> <TimelineItemDescription>
Import previously exported toggle configuration from Import previously exported toggle configuration from
another Unleash instance as a JSON file another Unleash instance as a JSON file
@ -83,10 +101,10 @@ export const ImportTimeline: FC<{
> >
2 2
</StyledTimelineDot> </StyledTimelineDot>
<StyledTimelineConnector /> <StyledTimelineConnector active={stage === 'validate'} />
</TimelineSeparator> </TimelineSeparator>
<StyledTimelineContent active={stage === 'validate'}> <StyledTimelineContent active={stage === 'validate'}>
<TimelineItemTitle> <TimelineItemTitle active={stage === 'validate'}>
Validate configuration Validate configuration
</TimelineItemTitle> </TimelineItemTitle>
<TimelineItemDescription> <TimelineItemDescription>
@ -104,7 +122,9 @@ export const ImportTimeline: FC<{
</StyledTimelineDot> </StyledTimelineDot>
</TimelineSeparator> </TimelineSeparator>
<StyledTimelineContent active={stage === 'import'}> <StyledTimelineContent active={stage === 'import'}>
<TimelineItemTitle>Finish import</TimelineItemTitle> <TimelineItemTitle active={stage === 'import'}>
Finish import
</TimelineItemTitle>
<TimelineItemDescription> <TimelineItemDescription>
Feature toggle configuration will be imported to your Feature toggle configuration will be imported to your
new Unleash instance new Unleash instance

View File

@ -4,6 +4,7 @@ export const PulsingAvatar = styled(Avatar, {
shouldForwardProp: prop => prop !== 'active', shouldForwardProp: prop => prop !== 'active',
})<{ active: boolean }>(({ theme, active }) => ({ })<{ active: boolean }>(({ theme, active }) => ({
transition: 'background-color 0.5s ease', transition: 'background-color 0.5s ease',
color: theme.palette.common.white,
backgroundColor: active backgroundColor: active
? theme.palette.primary.main ? theme.palette.primary.main
: theme.palette.divider, : theme.palette.divider,

View File

@ -64,7 +64,7 @@ export const StyledProjectTitle = styled('span')(({ theme }) => ({
export const StyledSeparator = styled('div')(({ theme }) => ({ export const StyledSeparator = styled('div')(({ theme }) => ({
width: '100%', width: '100%',
backgroundColor: theme.palette.background.elevation2, backgroundColor: theme.palette.divider,
height: '1px', height: '1px',
})); }));

View File

@ -20,7 +20,7 @@ const StyledBoxChangeContainer = styled(Box)(({ theme }) => ({
})); }));
const StyledTypographySubtext = styled(Typography)(({ theme }) => ({ const StyledTypographySubtext = styled(Typography)(({ theme }) => ({
color: theme.palette.neutral.main, color: theme.palette.text.secondary,
fontSize: theme.typography.body2.fontSize, fontSize: theme.typography.body2.fontSize,
})); }));

View File

@ -12,7 +12,9 @@ export const useStyles = makeStyles()(theme => ({
backgroundColor: theme.palette.divider, backgroundColor: theme.palette.divider,
margin: theme.spacing(4, -4, 3), margin: theme.spacing(4, -4, 3),
}, },
inputLabel: { backgroundColor: '#fff' }, inputLabel: {
backgroundColor: theme.palette.background.paper,
},
roleName: { roleName: {
fontWeight: 'bold', fontWeight: 'bold',
padding: '5px 0px', padding: '5px 0px',

View File

@ -22,7 +22,9 @@ import { Search } from 'component/common/Search/Search';
import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature'; import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature';
import { ITooltipResolverProps } from 'component/common/TooltipResolver/TooltipResolver'; import { ITooltipResolverProps } from 'component/common/TooltipResolver/TooltipResolver';
import { ReactComponent as ProPlanIcon } from 'assets/icons/pro-enterprise-feature-badge.svg'; import { ReactComponent as ProPlanIcon } from 'assets/icons/pro-enterprise-feature-badge.svg';
import { ReactComponent as ProPlanIconLight } from 'assets/icons/pro-enterprise-feature-badge-light.svg';
import { safeRegExp } from '@server/util/escape-regex'; import { safeRegExp } from '@server/util/escape-regex';
import { ThemeMode } from 'component/common/ThemeMode/ThemeMode';
const StyledDivContainer = styled('div')(({ theme }) => ({ const StyledDivContainer = styled('div')(({ theme }) => ({
display: 'flex', display: 'flex',
@ -75,7 +77,12 @@ function resolveCreateButtonData(
sx: { maxWidth: '320px' }, sx: { maxWidth: '320px' },
variant: 'custom', variant: 'custom',
}, },
endIcon: <ProPlanIcon />, endIcon: (
<ThemeMode
darkmode={<ProPlanIconLight />}
lightmode={<ProPlanIcon />}
/>
),
}; };
} else if (!hasAccess) { } else if (!hasAccess) {
return { return {

View File

@ -21,7 +21,7 @@ const StyledContent = styled('div')(({ theme }) => ({
padding: theme.spacing(4), padding: theme.spacing(4),
borderRadius: theme.spacing(1), borderRadius: theme.spacing(1),
backgroundColor: theme.palette.primary.main, backgroundColor: theme.palette.primary.main,
color: 'white', color: theme.palette.common.white,
[theme.breakpoints.up('md')]: { [theme.breakpoints.up('md')]: {
padding: theme.spacing(8), padding: theme.spacing(8),
}, },

View File

@ -5,6 +5,7 @@ import {
IconButton, IconButton,
styled, styled,
Tooltip, Tooltip,
Link,
} from '@mui/material'; } from '@mui/material';
import { Delete } from '@mui/icons-material'; import { Delete } from '@mui/icons-material';
import GeneralSelect from 'component/common/GeneralSelect/GeneralSelect'; import GeneralSelect from 'component/common/GeneralSelect/GeneralSelect';
@ -109,13 +110,13 @@ export const StrategyParameter = ({
<StyledParagraph> <StyledParagraph>
Parameters let you provide arguments to your strategy Parameters let you provide arguments to your strategy
that it can access for evaluation. Read more in the{' '} that it can access for evaluation. Read more in the{' '}
<a <Link
href="https://docs.getunleash.io/reference/custom-activation-strategies#parameter-types" href="https://docs.getunleash.io/reference/custom-activation-strategies#parameter-types"
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
> >
parameter types documentation parameter types documentation
</a> </Link>
. .
</StyledParagraph> </StyledParagraph>
} }

View File

@ -35,7 +35,7 @@ exports[`renders an empty list correctly 1`] = `
className="css-non55o" className="css-non55o"
> >
<div <div
className="css-1phd8d6" className="css-16ldy6v"
> >
<svg <svg
aria-hidden={true} aria-hidden={true}
@ -49,7 +49,7 @@ exports[`renders an empty list correctly 1`] = `
/> />
</svg> </svg>
<div <div
className="MuiInputBase-root MuiInputBase-colorPrimary css-4a25hy-MuiInputBase-root" className="MuiInputBase-root MuiInputBase-colorPrimary css-tv3fxu-MuiInputBase-root"
onClick={[Function]} onClick={[Function]}
> >
<input <input
@ -153,7 +153,7 @@ exports[`renders an empty list correctly 1`] = `
<button <button
aria-label="" aria-label=""
aria-labelledby={null} aria-labelledby={null}
className=" css-1xwc11x" className=" css-sskrcd"
data-mui-internal-clone-element={true} data-mui-internal-clone-element={true}
onBlur={[Function]} onBlur={[Function]}
onClick={[Function]} onClick={[Function]}
@ -177,7 +177,7 @@ exports[`renders an empty list correctly 1`] = `
</span> </span>
<svg <svg
aria-hidden={true} aria-hidden={true}
className="MuiSvgIcon-root MuiSvgIcon-fontSizeInherit css-57xzpo-MuiSvgIcon-root" className="MuiSvgIcon-root MuiSvgIcon-fontSizeInherit css-18chwvk-MuiSvgIcon-root"
data-testid="KeyboardArrowUpIcon" data-testid="KeyboardArrowUpIcon"
focusable="false" focusable="false"
viewBox="0 0 24 24" viewBox="0 0 24 24"
@ -199,7 +199,7 @@ exports[`renders an empty list correctly 1`] = `
</span> </span>
<svg <svg
aria-hidden={true} aria-hidden={true}
className="MuiSvgIcon-root MuiSvgIcon-fontSizeInherit sort-arrow css-57xzpo-MuiSvgIcon-root" className="MuiSvgIcon-root MuiSvgIcon-fontSizeInherit sort-arrow css-18chwvk-MuiSvgIcon-root"
data-testid="KeyboardArrowUpIcon" data-testid="KeyboardArrowUpIcon"
focusable="false" focusable="false"
viewBox="0 0 24 24" viewBox="0 0 24 24"

View File

@ -26,7 +26,7 @@ const StyledHeader = styled('div')(({ theme }) => ({
alignItems: 'center', alignItems: 'center',
padding: theme.spacing(6), padding: theme.spacing(6),
borderRadius: theme.shape.borderRadiusLarge, borderRadius: theme.shape.borderRadiusLarge,
backgroundColor: theme.palette.primary.main, backgroundColor: theme.palette.background.alternative,
color: theme.palette.primary.contrastText, color: theme.palette.primary.contrastText,
marginBottom: theme.spacing(3), marginBottom: theme.spacing(3),
boxShadow: theme.boxShadows.primaryHeader, boxShadow: theme.boxShadows.primaryHeader,

View File

@ -13,18 +13,21 @@ interface IStandaloneBannerProps {
const StyledGradient = styled(Gradient)(({ theme }) => ({ const StyledGradient = styled(Gradient)(({ theme }) => ({
display: 'flex', display: 'flex',
justifyContent: 'center', justifyContent: 'center',
[theme.breakpoints.up('sm')]: { borderTopLeftRadius: theme.shape.borderRadiusLarge,
borderBottomLeftRadius: '3px', [theme.breakpoints.down('md')]: {
borderTopLeftRadius: '3px', borderTopLeftRadius: theme.shape.borderRadiusLarge,
borderTopRightRadius: theme.shape.borderRadiusLarge,
},
[theme.breakpoints.down('sm')]: {
borderTopLeftRadius: '0',
borderTopRightRadius: '0',
}, },
})); }));
const StyledContainer = styled('div')(({ theme }) => ({ const StyledContainer = styled('div')(({ theme }) => ({
padding: theme.spacing(12, 8), padding: theme.spacing(12, 8),
color: '#fff', color: theme.palette.common.white,
position: 'relative', position: 'relative',
borderTopLeftRadius: '3px',
borderBottomLeftRadius: '3px',
textAlign: 'right', textAlign: 'right',
[theme.breakpoints.down('md')]: { [theme.breakpoints.down('md')]: {
padding: theme.spacing(6, 4), padding: theme.spacing(6, 4),
@ -35,7 +38,7 @@ const StyledContainer = styled('div')(({ theme }) => ({
})); }));
const StyledTitle = styled(Typography)(({ theme }) => ({ const StyledTitle = styled(Typography)(({ theme }) => ({
color: '#fff', color: theme.palette.common.white,
marginBottom: theme.spacing(2), marginBottom: theme.spacing(2),
fontSize: theme.spacing(4), fontSize: theme.spacing(4),
marginTop: theme.spacing(10), marginTop: theme.spacing(10),
@ -48,9 +51,6 @@ const StyledSubtitle = styled(Typography)(({ theme }) => ({
[theme.breakpoints.down('md')]: { [theme.breakpoints.down('md')]: {
display: 'none', display: 'none',
}, },
[theme.breakpoints.down('sm')]: {
display: 'none',
},
fontSize: theme.spacing(4), fontSize: theme.spacing(4),
fontWeight: 'normal', fontWeight: 'normal',
})); }));
@ -62,6 +62,9 @@ const StyledLogoContainer = styled('div')(({ theme }) => ({
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
}, },
[theme.breakpoints.down('md')]: {
top: '9px',
},
})); }));
const logoStyles = (theme: Theme) => ({ const logoStyles = (theme: Theme) => ({

View File

@ -45,7 +45,7 @@ const StyledLink = styled(Link<typeof RouterLink | 'a'>)(({ theme }) => ({
alignItems: 'center', alignItems: 'center',
gap: theme.spacing(1), gap: theme.spacing(1),
padding: 0, padding: 0,
color: theme.palette.primary.dark, color: theme.palette.links,
fontWeight: theme.fontWeight.medium, fontWeight: theme.fontWeight.medium,
'&:hover, &:focus': { '&:hover, &:focus': {
textDecoration: 'underline', textDecoration: 'underline',
@ -87,7 +87,7 @@ export const UserProfileContent = ({
<ConditionallyRender <ConditionallyRender
condition={showProfile} condition={showProfile}
show={ show={
<StyledPaper id={id}> <StyledPaper className="dropdown-outline" id={id}>
<StyledProfileInfo> <StyledProfileInfo>
<StyledUserAvatar user={profile} /> <StyledUserAvatar user={profile} />
<div> <div>

View File

@ -30,7 +30,9 @@ const AuthOptions = ({ options }: IAuthOptionProps) => {
href={o.path} href={o.path}
size="small" size="small"
data-testid={`${SSO_LOGIN_BUTTON}-${o.type}`} data-testid={`${SSO_LOGIN_BUTTON}-${o.type}`}
style={{ height: '40px', color: '#000' }} style={{
height: '40px',
}}
startIcon={ startIcon={
<ConditionallyRender <ConditionallyRender
condition={o.type === 'google'} condition={o.type === 'google'}

View File

@ -44,11 +44,12 @@ const StyledTitle = styled(Typography)(({ theme }) => ({
})); }));
const StyledContainer = styled('div')(({ theme }) => ({ const StyledContainer = styled('div')(({ theme }) => ({
border: '1px solid #f1f1f1', backgroundColor: theme.palette.background.elevation2,
borderRadius: theme.shape.borderRadius, borderRadius: theme.shape.borderRadius,
position: 'relative', position: 'relative',
maxWidth: '350px', maxWidth: '350px',
color: '#44606e', color: theme.palette.text.secondary,
padding: theme.spacing(0.5, 0, 1.5),
})); }));
const StyledHeaderContainer = styled('div')(({ theme }) => ({ const StyledHeaderContainer = styled('div')(({ theme }) => ({
@ -86,7 +87,9 @@ const StyledStatusBar = styled('div', {
width: '50px', width: '50px',
borderRadius: theme.shape.borderRadius, borderRadius: theme.shape.borderRadius,
height: '6px', height: '6px',
backgroundColor: error ? 'red' : theme.palette.primary.main, backgroundColor: error
? theme.palette.error.main
: theme.palette.primary.main,
})); }));
const PasswordChecker = ({ const PasswordChecker = ({

View File

@ -33,16 +33,21 @@ const StyledHeader = styled('header')(({ theme }) => ({
const StyledMain = styled('main')(({ theme }) => ({ const StyledMain = styled('main')(({ theme }) => ({
width: '60%', width: '60%',
flex: '1', flex: '1',
borderTopRightRadius: '3px', borderTopRightRadius: theme.shape.borderRadiusLarge,
borderBottomRightRadius: '3px', borderBottomRightRadius: theme.shape.borderRadiusLarge,
backgroundColor: theme.palette.background.paper, backgroundColor: theme.palette.background.paper,
position: 'relative', position: 'relative',
[theme.breakpoints.down('md')]: { [theme.breakpoints.down('md')]: {
borderRadius: '0', borderTopRightRadius: '0',
borderBottomLeftRadius: theme.shape.borderRadiusLarge,
borderBottomRightRadius: theme.shape.borderRadiusLarge,
width: '100%', width: '100%',
position: 'static', position: 'static',
minHeight: 'auto', minHeight: 'auto',
}, },
[theme.breakpoints.down('sm')]: {
borderRadius: '0',
},
})); }));
const StyledInnerRightContainer = styled('div')(({ theme }) => ({ const StyledInnerRightContainer = styled('div')(({ theme }) => ({

View File

@ -4,7 +4,6 @@ import { setLocalStorageItem } from 'utils/storage';
import mainTheme from 'themes/theme'; import mainTheme from 'themes/theme';
import darkTheme from 'themes/dark-theme'; import darkTheme from 'themes/dark-theme';
import { Theme } from '@emotion/react'; import { Theme } from '@emotion/react';
import useUiConfig from './api/getters/useUiConfig/useUiConfig';
interface IUseThemeModeOutput { interface IUseThemeModeOutput {
resolveTheme: () => Theme; resolveTheme: () => Theme;
@ -14,8 +13,7 @@ interface IUseThemeModeOutput {
export const useThemeMode = (): IUseThemeModeOutput => { export const useThemeMode = (): IUseThemeModeOutput => {
const { themeMode, setThemeMode } = useContext(UIContext); const { themeMode, setThemeMode } = useContext(UIContext);
const { uiConfig } = useUiConfig(); const key = 'unleash-theme';
const key = `${uiConfig.baseUriPath}:unleash-theme`;
const resolveTheme = () => { const resolveTheme = () => {
if (themeMode === 'light') { if (themeMode === 'light') {

View File

@ -36,7 +36,6 @@ button {
.skeleton { .skeleton {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
background-color: #e2e8f0;
z-index: 9999; z-index: 9999;
box-shadow: none; box-shadow: none;
fill: none; fill: none;
@ -44,7 +43,6 @@ button {
} }
.skeleton::before { .skeleton::before {
background-color: #e2e8f0;
content: ''; content: '';
position: absolute; position: absolute;
top: 0px; top: 0px;
@ -62,13 +60,13 @@ button {
bottom: 0; bottom: 0;
left: 0; left: 0;
transform: translateX(-100%); transform: translateX(-100%);
background-image: linear-gradient( /* background-image: linear-gradient(
90deg, 90deg,
rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0) 0,
rgba(255, 255, 255, 0.2) 100%, rgba(255, 255, 255, 0.2) 100%,
rgba(255, 255, 255, 0.5) 100%, rgba(255, 255, 255, 0.5) 100%,
rgba(255, 255, 255, 0) rgba(255, 255, 255, 0)
); ); */
animation: shimmer 3s infinite; animation: shimmer 3s infinite;
content: ''; content: '';
z-index: 5001; z-index: 5001;
@ -134,7 +132,6 @@ p {
a { a {
cursor: pointer; cursor: pointer;
color: #615bc2;
} }
a:hover { a:hover {

View File

@ -16,8 +16,8 @@ export const colors = {
100: '#F7F7FA', 100: '#F7F7FA',
50: '#FFFFFF', 50: '#FFFFFF',
}, },
// In MUI there colors are used with transparency, and we keep them here for a better overview // In MUI these colors are used with transparency, and we keep them here for a better overview
// We can use there for other places if needed // We can use these colors for other places if needed
action: { action: {
0.54: 'rgba(25, 24, 41, 0.54)', 0.54: 'rgba(25, 24, 41, 0.54)',
0.32: 'rgba(25, 24, 41, 0.32)', 0.32: 'rgba(25, 24, 41, 0.32)',
@ -51,7 +51,7 @@ export const colors = {
50: '#FFF2F3', 50: '#FFF2F3',
}, },
orange: { orange: {
900: '#B35300', 900: '#A34C00',
800: '#D76500', 800: '#D76500',
700: '#F28D00', 700: '#F28D00',
600: '#FFAA33', 600: '#FFAA33',

View File

@ -1,7 +1,19 @@
import { createTheme } from '@mui/material/styles'; import { createTheme } from '@mui/material/styles';
import { colors } from './colors'; import { alpha } from '@mui/material';
import { focusable } from 'themes/themeStyles';
export default createTheme({ const actionColors = {
0.54: 'rgba(223, 222, 255, 0.54)',
0.32: 'rgba(223, 222, 255, 0.32)',
0.12: 'rgba(223, 222, 255, 0.12)',
0.08: 'rgba(223, 222, 255, 0.08)',
0.05: 'rgba(223, 222, 255, 0.05)',
};
const purpleColor = {
0.5: 'rgba(151, 146, 237, 0.5))',
};
const theme = {
breakpoints: { breakpoints: {
values: { values: {
xs: 0, xs: 0,
@ -17,7 +29,7 @@ export default createTheme({
elevated: '0px 1px 20px rgba(45, 42, 89, 0.1)', elevated: '0px 1px 20px rgba(45, 42, 89, 0.1)',
popup: '0px 2px 6px rgba(0, 0, 0, 0.25)', popup: '0px 2px 6px rgba(0, 0, 0, 0.25)',
primaryHeader: '0px 8px 24px rgba(97, 91, 194, 0.2)', primaryHeader: '0px 8px 24px rgba(97, 91, 194, 0.2)',
separator: '0px 2px 3px hsl(0deg 0% 78% / 50%)', separator: '0px 2px 4px rgba(32, 32, 33, 0.12)', // Notifications header
}, },
typography: { typography: {
fontFamily: 'Sen, Roboto, sans-serif', fontFamily: 'Sen, Roboto, sans-serif',
@ -66,86 +78,96 @@ export default createTheme({
palette: { palette: {
common: { common: {
// Used for text color white: '#EEEEFC', // Switch base (OFF) // Tooltips text color // Text color
white: colors.grey[50], black: '#A0A0B1', // Switch track (OFF)
}, },
text: { text: {
primary: colors.grey[900], primary: '#EEEEFC',
secondary: colors.grey[800], secondary: '#A0A0B1',
disabled: colors.grey[600], disabled: '#888799',
}, },
primary: { primary: {
main: colors.purple[800], main: '#9792ED',
light: colors.purple[700], light: '#4C4992',
dark: colors.purple[900], // Maybe to move links color to another variable????
contrastText: colors.grey[50], // Color used for content when primary.main is used as a background dark: '#9792ED', // Color used for links and on hover for primary buttons
contrastText: '#EEEEFC', // Color used for content when primary.main is used as a background
}, },
secondary: { secondary: {
// Used for purple badges and puple light elements // Used for purple badges and puple light elements
light: colors.purple[50], main: '#57549C', // used on icons on these elements
main: colors.purple[800], light: '#34325E', // used as a bakground on these elements
dark: colors.purple[900], dark: '#EEEEFC', // used for text on these elements
border: colors.purple[300], border: '#4C4992',
contrastText: '#EEEEFC', // Color used for content when info.main is used as a background
}, },
info: { info: {
light: colors.blue[50], // main: '#5483C9', // used on icons on these elements
main: colors.blue[500], main: '#a2bbe2', // used on icons on these elements
dark: colors.blue[700], light: '#1A2641', // used as a bakground on these elements
contrastText: colors.grey[50], // Color used for content when info.main is used as a background dark: '#a2bbe2', // used for text on these elements
border: colors.blue[200], border: '#1B407A',
contrastText: '#EEEEFC', // Color used for content when info.main is used as a background
}, },
success: { success: {
light: colors.green[50], // main: '#62872F', // used on icons on these elements
main: colors.green[600], main: '#94ae6f', // used on icons on these elements
dark: colors.green[800], light: '#333D30', // used as a bakground on these elements
contrastText: colors.grey[50], // Color used for content when success.main is used as a background dark: '#94ae6f', // used for text on these elements
border: colors.green[300], border: '#3D600C',
contrastText: '#EEEEFC', // Color used for content when success.main is used as a background
}, },
warning: { warning: {
light: colors.orange[100], // main: '#9E691C', // used on icons on these elements
main: colors.orange[800], main: '#bc7d21', // used on icons on these elements
dark: colors.orange[900], light: '#3B302C', // used as a bakground on these elements
contrastText: colors.grey[50], // Color used for content when warning.main is used as a background dark: '#bc7d21', // used for text on these elements
border: colors.orange[500], contrastText: '#EEEEFC', // Color used for content when warning.main is used as a background
border: '#6C4A19',
}, },
error: { error: {
light: colors.red[50], // main: '#B93F4A', // used on error buttons // used on icons on these elements
main: colors.red[700], main: '#ff6472', // used on error buttons // used on icons on these elements
dark: colors.red[800], light: '#3F2835', // used as a bakground on these elements
contrastText: colors.grey[50], // Color used for content when error.main is used as a background // dark: '#F15260', // used for text on these elements
border: colors.red[300], dark: '#ff6472', // used for text on these elements
border: '#8A3E45',
contrastText: '#EEEEFC', // Color used for content when error.main is used as a background
}, },
/** /**
* Used for grey badges, hover elements, and grey light elements * Used for grey badges, hover elements, and grey light elements
*/ */
neutral: { neutral: {
light: colors.grey[100], main: '#858699', // used on icons on these elements
main: colors.grey[700], light: '#2B2A3C', // used as a bakground on these elements
dark: colors.grey[800], dark: '#EEEEFC', // used for text on these elements
border: colors.grey[400], border: '#454360',
contrastText: '#EEEEFC', // Color used for text inside badge
}, },
background: { background: {
paper: colors.grey[50], paper: '#222130', // Background color for all containers
default: colors.grey[50], default: '#222130',
application: colors.grey[300], application: '#1A1924',
sidebar: colors.purple[800], sidebar: '#4C4992',
elevation1: colors.grey[100], alternative: '#4C4992', // used on the dark theme to shwitch primary main to a darker shade
elevation2: colors.grey[200], elevation1: '#2B2A3C',
elevation2: '#2B2A3C',
// elevation2: '#302E42',
}, },
action: { action: {
// Colors used for Icons and Buttons -> this comes from MUI and we overwriting it with our colors // Colors used for Icons and Buttons -> this comes from MUI and we overwriting it with our colors
active: colors.action[0.54], active: actionColors[0.54],
hover: colors.action[0.05], hover: actionColors[0.05],
hoverOpacity: 0.05, hoverOpacity: 0.05,
selected: colors.action[0.08], selected: actionColors[0.08],
selectedOpacity: 0.08, selectedOpacity: 0.08,
disabled: colors.action[0.32], disabled: actionColors[0.32],
disabledBackground: colors.action[0.12], disabledBackground: actionColors[0.12],
disabledOpacity: 0.38, disabledOpacity: 0.38,
focus: colors.action[0.12], focus: actionColors[0.12],
focusOpacity: 0.12, focusOpacity: 0.12,
activatedOpacity: 0.12, activatedOpacity: 0.12,
}, },
@ -153,64 +175,123 @@ export default createTheme({
/** /**
* General divider * General divider
*/ */
divider: colors.grey[400], divider: '#39384C',
/** /**
* Table colors. * Table colors.
*/ */
table: { table: {
headerColor: colors.grey[900], //New - Is needed? ###CHECK headerBackground: '#2B2A3C',
headerBackground: colors.grey[200], headerHover: '#313045',
headerHover: colors.grey[300], divider: '#323144',
divider: colors.grey[300], rowHover: '#262536',
rowHover: colors.grey[100],
}, },
/** /**
* Text highlight effect color. Used when filtering/searching over content. * Text highlight effect color. Used when filtering/searching over content
*/ */
highlight: colors.orange[200], highlight: 'rgba(255, 234, 204, 0.7)',
/** /**
* Background color used for the API command in the sidebar * Background color used for the API command in the sidebar
*/ */
codebox: colors.action[0.12], codebox: 'rgba(52, 50, 94, 0.3)',
/**
* Links color
*/
links: '#9792ED',
/** /**
* Gradient for the login page * Gradient for the login page
*/ */
loginGradient: { loginGradient: {
from: colors.purple[800], from: '#4C4992',
to: colors.purple[950], to: '#4944a7',
}, },
/** /**
* Colors for event log output. * Colors for event log output
*/ */
eventLog: { eventLog: {
diffAdd: colors.green[800], diffAdd: '#77AB2E',
diffSub: colors.red[800], diffSub: '#df626c',
edited: colors.grey[900], edited: '#EEEEFC',
}, },
/** /**
* For 'Seen' column on feature toggles list and other. * For 'Seen' column on feature toggles list and other
*/ */
seen: { seen: {
unknown: colors.grey[100], unknown: '#2B2A3C',
recent: colors.green[100], recent: '#4E6131',
inactive: colors.orange[200], inactive: '#875D21',
abandoned: colors.red[200], abandoned: '#8A3E45',
primary: colors.purple[100], primary: '#302E42',
},
/**
* For Environment Accordion
*/
envAccordion: {
disabled: '#2B2A3C',
expanded: '#1A1924',
},
/**
* MUI grey colors
*/
grey: {
// This was to see were these colors are used from MUI
// 50: '#A6000E',
100: '#888799', // Disabled Switch base (OFF)
// 200: '#A6000E',
// 300: '#A6000E',
// 400: '#A6000E',
// 500: '#A6000E',
600: '#343348', // slider tooltip background
700: '#343348', // Dark tooltip background
// 800: '#A6000E',
// 900: '#A6000E',
// A100: '#A6000E',
// A200: '#A6000E',
// A400: '#A6000E',
// A700: '#A6000E',
}, },
}, },
};
export default createTheme({
...theme,
components: { components: {
// Skeleton
MuiCssBaseline: {
styleOverrides: {
'.skeleton': {
'&::before': {
backgroundColor: theme.palette.background.elevation1,
},
'&::after': {
background:
'linear-gradient(90deg, rgba(223, 222, 255, 0) 0, rgba(223, 222, 255, 0.2) 100%, rgba(223, 222, 255, 0.5) 100%, rgba(223, 222, 255, 0))',
},
},
a: {
color: theme.palette.links,
},
'.dropdown-outline, .MuiAutocomplete-popper': {
// used for user dropdown, autocomplete, and change request primary button dropdown, notifications dropdown
outline: `1px solid ${theme.palette.divider}`,
},
},
},
// Links // Links
MuiLink: { MuiLink: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
color: theme.palette.primary.dark, ...focusable(theme),
color: theme.palette.links,
'&:hover': { '&:hover': {
textDecoration: 'none', textDecoration: 'none',
}, },
@ -225,7 +306,7 @@ export default createTheme({
color: theme.palette.text.primary, color: theme.palette.text.primary,
fontSize: '0.875rem', fontSize: '0.875rem',
'& a': { '& a': {
color: theme.palette.primary.dark, color: theme.palette.links,
textDecoration: 'none', textDecoration: 'none',
'&:hover': { '&:hover': {
textDecoration: 'underline', textDecoration: 'underline',
@ -239,7 +320,6 @@ export default createTheme({
MuiTableHead: { MuiTableHead: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
// background: 'transparent',
'& th': { '& th': {
height: theme.shape.tableRowHeightCompact, height: theme.shape.tableRowHeightCompact,
backgroundColor: theme.palette.table.headerBackground, backgroundColor: theme.palette.table.headerBackground,
@ -281,13 +361,22 @@ export default createTheme({
MuiAlert: { MuiAlert: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
padding: theme.spacing(2, 3),
borderRadius: theme.shape.borderRadiusMedium, borderRadius: theme.shape.borderRadiusMedium,
a: { a: {
color: 'inherit', color: 'inherit',
}, },
'> .MuiAlert-icon': {
padding: 0,
opacity: 1,
fontSize: '24px',
},
'> .MuiAlert-message': {
padding: '3px 0 0 0',
},
'&.MuiAlert-standardInfo': { '&.MuiAlert-standardInfo': {
backgroundColor: theme.palette.info.light, backgroundColor: theme.palette.info.light,
color: theme.palette.info.dark, color: theme.palette.info.contrastText,
border: `1px solid ${theme.palette.info.border}`, border: `1px solid ${theme.palette.info.border}`,
'& .MuiAlert-icon': { '& .MuiAlert-icon': {
color: theme.palette.info.main, color: theme.palette.info.main,
@ -295,7 +384,7 @@ export default createTheme({
}, },
'&.MuiAlert-standardSuccess': { '&.MuiAlert-standardSuccess': {
backgroundColor: theme.palette.success.light, backgroundColor: theme.palette.success.light,
color: theme.palette.success.dark, color: theme.palette.success.contrastText,
border: `1px solid ${theme.palette.success.border}`, border: `1px solid ${theme.palette.success.border}`,
'& .MuiAlert-icon': { '& .MuiAlert-icon': {
color: theme.palette.success.main, color: theme.palette.success.main,
@ -303,7 +392,7 @@ export default createTheme({
}, },
'&.MuiAlert-standardWarning': { '&.MuiAlert-standardWarning': {
backgroundColor: theme.palette.warning.light, backgroundColor: theme.palette.warning.light,
color: theme.palette.warning.dark, color: theme.palette.warning.contrastText,
border: `1px solid ${theme.palette.warning.border}`, border: `1px solid ${theme.palette.warning.border}`,
'& .MuiAlert-icon': { '& .MuiAlert-icon': {
color: theme.palette.warning.main, color: theme.palette.warning.main,
@ -311,7 +400,7 @@ export default createTheme({
}, },
'&.MuiAlert-standardError': { '&.MuiAlert-standardError': {
backgroundColor: theme.palette.error.light, backgroundColor: theme.palette.error.light,
color: theme.palette.error.dark, color: theme.palette.error.contrastText,
border: `1px solid ${theme.palette.error.border}`, border: `1px solid ${theme.palette.error.border}`,
'& .MuiAlert-icon': { '& .MuiAlert-icon': {
color: theme.palette.error.main, color: theme.palette.error.main,
@ -326,6 +415,7 @@ export default createTheme({
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
'& .MuiTabs-indicator': { '& .MuiTabs-indicator': {
backgroundColor: theme.palette.background.alternative,
height: '4px', height: '4px',
}, },
'& .MuiTabs-flexContainer': { '& .MuiTabs-flexContainer': {
@ -345,7 +435,7 @@ export default createTheme({
lineHeight: '1', lineHeight: '1',
minHeight: '62px', minHeight: '62px',
'&:hover': { '&:hover': {
backgroundColor: theme.palette.background.elevation2, backgroundColor: theme.palette.action.hover,
}, },
'&.Mui-selected': { '&.Mui-selected': {
color: theme.palette.text.primary, color: theme.palette.text.primary,
@ -361,13 +451,31 @@ export default createTheme({
}, },
}, },
// Constraint accordion / cards // Environment accordion
MuiAccordion: { MuiAccordion: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
'&:first-of-type, &:last-of-type': { '&:first-of-type, &:last-of-type': {
borderRadius: theme.shape.borderRadiusMedium, borderRadius: theme.shape.borderRadiusLarge,
}, },
'&.environment-accordion.Mui-expanded': {
outline: `2px solid ${alpha(
theme.palette.background.alternative,
0.6
)}`,
boxShadow: `0px 2px 8px ${alpha(
theme.palette.primary.main,
0.2
)}`,
},
'&.accordion-disabled': {
outline: `1px solid ${alpha('#39384C', 0.5)}`,
backgroundColor: theme.palette.background.application,
},
'&.accordion-disabled.Mui-expanded .MuiAccordionSummary-root':
{
borderBottom: `1px solid ${theme.palette.divider}`,
},
}), }),
}, },
}, },
@ -384,30 +492,33 @@ export default createTheme({
}, },
}, },
// Project overview, improve toggle/switch disabled focus effect color // Project overview, improve switch (ON - state) hover effect color
MuiSwitch: { MuiSwitch: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
zIndex: 1, zIndex: 1,
'&:not(.Mui-checked) .MuiTouchRipple-child': { '&&& > .Mui-checked:hover': {
color: theme.palette.neutral.border, backgroundColor: actionColors[0.08],
},
'&&& > .Mui-checked.Mui-disabled': {
color: '#423F6E',
}, },
}), }),
}, },
}, },
// Overwiteing the action.disabledOpacity from MU // Overwiteing the action.disabledOpacity from MUI
MuiMenuItem: { MuiMenuItem: {
styleOverrides: { styleOverrides: {
root: { root: {
'&.Mui-disabled': { '&.Mui-disabled': {
opacity: 0.66, opacity: 0.4,
}, },
}, },
}, },
}, },
// Inputs background - This is used when we have inputs on a grey background (e.g. edit contstraints, playground) // Inputs background - This is used when we have inputs on a darker background (e.g. edit contstraints, playground)
MuiInputBase: { MuiInputBase: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
@ -424,429 +535,64 @@ export default createTheme({
}), }),
}, },
}, },
// For dark theme, primary buttons are a bit darker then the primary.main that we use as a primary color
MuiButton: {
styleOverrides: {
root: ({ theme }) => ({
'&:not(.Mui-disabled).MuiButton-containedPrimary': {
backgroundColor: theme.palette.background.alternative,
'&:hover': {
backgroundColor: theme.palette.secondary.main,
},
},
}),
},
},
// Constraints negation icon
MuiIconButton: {
styleOverrides: {
root: ({ theme }) => ({
'&.operator-is-active svg': {
fill: theme.palette.background.application,
},
}),
},
},
// Inputs
MuiOutlinedInput: {
styleOverrides: {
root: ({ theme }) => ({
fieldset: {
borderColor: '#646382',
},
'&&&:hover fieldset': {
borderColor: '#8B8BA7',
},
'&&&.Mui-focused fieldset': {
borderColor: '#9792ED',
},
'&&&.Mui-disabled fieldset': {
borderColor: '#47475D',
},
}),
},
},
// Popovers
MuiPopover: {
styleOverrides: {
root: ({ theme }) => ({
'.MuiPopover-paper': {
outline: `1px solid ${theme.palette.divider}`,
},
}),
},
},
}, },
}); });
// Old dark theme below:
// import { createTheme } from '@mui/material/styles';
// import { colors } from './colors';
// const themeColors = {
// main: colors.darkblue[900],
// secondary: colors.darkblue[800],
// textColor: '#ffffffe6',
// hover: 'rgb(255, 255, 255, 0.7)',
// };
// export default createTheme({
// breakpoints: {
// values: {
// xs: 0,
// sm: 600,
// md: 960,
// lg: 1260,
// xl: 1536,
// },
// },
// boxShadows: {
// main: '0px 2px 4px rgba(129, 122, 254, 0.2)',
// card: '0px 2px 10px rgba(28, 25, 78, 0.12)',
// elevated: '0px 1px 20px rgba(45, 42, 89, 0.1)',
// popup: '0px 2px 6px rgba(0, 0, 0, 0.25)',
// primaryHeader: '0px 8px 24px rgba(97, 91, 194, 0.2)',
// separator: '0px 2px 3px hsl(0deg 0% 78% / 50%)',
// },
// typography: {
// fontFamily: 'Sen, Roboto, sans-serif',
// fontWeightBold: '700',
// fontWeightMedium: '700',
// allVariants: { lineHeight: 1.4 },
// button: { lineHeight: 1.75 },
// h1: {
// fontSize: '1.5rem',
// lineHeight: 1.875,
// },
// h3: {
// fontSize: '1rem',
// fontWeight: '700',
// },
// caption: {
// fontSize: `${12 / 16}rem`,
// },
// },
// fontSizes: {
// largeHeader: '2.25rem',
// mainHeader: '1.25rem',
// bodySize: '1rem',
// smallBody: `${14 / 16}rem`,
// smallerBody: `${12 / 16}rem`,
// },
// fontWeight: {
// thin: 300,
// medium: 400,
// semi: 700,
// bold: 700,
// },
// shape: {
// borderRadius: 4,
// borderRadiusMedium: 8,
// borderRadiusLarge: 12,
// borderRadiusExtraLarge: 20,
// tableRowHeight: 64,
// tableRowHeightCompact: 56,
// tableRowHeightDense: 48,
// },
// palette: {
// primary: {
// main: themeColors.textColor,
// light: colors.purple[700],
// dark: colors.purple[900],
// },
// secondary: {
// main: colors.purple[800],
// light: colors.purple[700],
// dark: colors.purple[900],
// },
// info: {
// light: colors.blue[50],
// main: colors.blue[500],
// dark: colors.blue[700],
// border: colors.blue[200],
// },
// success: {
// light: colors.green[50],
// main: colors.green[600],
// dark: themeColors.main,
// border: colors.green[300],
// },
// warning: {
// light: colors.orange[100],
// main: colors.orange[800],
// dark: colors.orange[900],
// border: colors.orange[500],
// },
// error: {
// light: colors.red[50],
// main: colors.red[700],
// dark: colors.red[800],
// border: colors.red[300],
// },
// background: {
// paper: themeColors.main,
// },
// divider: themeColors.secondary,
// // dividerAlternative: colors.grey[400],
// tableHeaderHover: colors.darkblue[700],
// tableHeaderBackground: themeColors.secondary,
// tableHeaderColor: themeColors.textColor,
// highlight: '#FFEACC',
// secondaryContainer: themeColors.secondary,
// contentWrapper: colors.darkblue[800],
// formBackground: themeColors.main,
// formSidebar: colors.darkblue[1000],
// headerBackground: themeColors.main,
// footerBackground: themeColors.main,
// sidebarContainer: 'rgba(32,32,33, 0.2)',
// codebox: colors.darkblue[600],
// featureMetaData: colors.darkblue[1000],
// playgroundBackground: colors.darkblue[600],
// playgroundFormBackground: themeColors.secondary,
// standaloneBackground: colors.black,
// featureStrategySegmentChipBackground: themeColors.secondary,
// featureSegmentSearchBackground: themeColors.secondary,
// dialogHeaderBackground: themeColors.secondary,
// dialogHeaderText: themeColors.textColor,
// lightBorder: colors.darkblue[500],
// constraintAccordion: {
// editBackground: colors.darkblue[600],
// background: themeColors.secondary,
// operatorBackground: themeColors.main,
// },
// standaloneBannerGradient: {
// from: colors.darkblue[1000],
// to: colors.black,
// },
// projectCard: {
// hover: themeColors.secondary,
// textColor: themeColors.textColor,
// },
// formSidebarTextColor: themeColors.textColor,
// checkmarkBadge: themeColors.secondary,
// inputLabelBackground: 'transparent',
// grey: colors.grey,
// text: {
// primary: themeColors.textColor,
// secondary: colors.grey[800],
// disabled: colors.grey[600],
// },
// code: {
// main: '#0b8c8f',
// diffAdd: 'green',
// diffSub: 'red',
// diffNeutral: 'black',
// edited: 'blue',
// },
// neutral: {
// light: colors.darkblue[500],
// main: colors.grey[700],
// dark: colors.grey[800],
// border: colors.grey[500],
// },
// activityIndicators: {
// primary: themeColors.secondary,
// unknown: themeColors.secondary,
// recent: themeColors.secondary,
// inactive: themeColors.secondary,
// abandoned: themeColors.secondary,
// },
// // tertiary: {
// // light: themeColors.secondary,
// // main: colors.grey[400],
// // dark: colors.grey[600],
// // background: 'white',
// // contrast: colors.grey[300],
// // },
// inactiveIcon: colors.grey[600],
// },
// components: {
// MuiAppBar: {
// styleOverrides: {
// root: {
// color: themeColors.textColor,
// },
// },
// },
// MuiInputLabel: {
// styleOverrides: {
// root: {
// color: themeColors.textColor,
// },
// },
// },
// MuiIconButton: {
// styleOverrides: {
// root: {
// color: colors.grey[50],
// '&:hover': {
// backgroundColor: themeColors.hover,
// },
// '&.Mui-disabled': {
// '& .MuiSvgIcon-root': {
// color: colors.grey[700],
// },
// },
// },
// },
// },
// MuiLink: {
// styleOverrides: {
// root: {
// color: colors.grey[50],
// '&:hover': {
// textDecoration: 'none',
// },
// },
// },
// },
// MuiBreadcrumbs: {
// styleOverrides: {
// root: {
// color: themeColors.textColor,
// fontSize: '0.875rem',
// '& a': {
// color: themeColors.textColor,
// textDecoration: 'underline',
// '&:hover': {
// textDecoration: 'none',
// },
// },
// },
// },
// },
// MuiTableHead: {
// styleOverrides: {
// root: {
// background: 'transparent',
// '& th': {
// background: colors.grey[200],
// },
// },
// },
// },
// MuiTableRow: {
// styleOverrides: {
// root: {
// '&.MuiTableRow-hover:hover': {
// background: themeColors.secondary,
// },
// },
// },
// },
// MuiTableCell: {
// styleOverrides: {
// root: {
// borderBottomColor: themeColors.main,
// },
// },
// },
// MuiAlert: {
// styleOverrides: {
// root: {
// borderRadius: '8px',
// a: {
// color: 'inherit',
// },
// '&.MuiAlert-standardInfo': {
// backgroundColor: colors.blue[50],
// color: colors.blue[700],
// border: `1px solid ${colors.blue[200]}`,
// '& .MuiAlert-icon .MuiSvgIcon-root': {
// color: colors.blue[500],
// },
// },
// '&.MuiAlert-standardSuccess': {
// backgroundColor: colors.green[50],
// color: colors.green[800],
// border: `1px solid ${colors.green[300]}`,
// '& .MuiAlert-icon .MuiSvgIcon-root': {
// color: colors.green[500],
// },
// },
// '&.MuiAlert-standardWarning': {
// backgroundColor: colors.orange[100],
// color: colors.orange[900],
// border: `1px solid ${colors.orange[500]}`,
// '& .MuiAlert-icon .MuiSvgIcon-root': {
// color: colors.orange[800],
// },
// },
// '&.MuiAlert-standardError': {
// backgroundColor: colors.red[50],
// color: colors.red[800],
// border: `1px solid ${colors.red[300]}`,
// '& .MuiAlert-icon .MuiSvgIcon-root': {
// color: colors.red[700],
// },
// },
// },
// },
// },
// MuiButton: {
// styleOverrides: {
// root: {
// '&.Mui-disabled': {
// backgroundColor: colors.grey[400],
// },
// },
// },
// },
// MuiSvgIcon: {
// styleOverrides: {
// root: {
// color: themeColors.textColor,
// },
// },
// },
// MuiTabs: {
// styleOverrides: {
// root: {
// backgroundColor: themeColors.main,
// color: themeColors.textColor,
// '& .MuiTabs-indicator': {
// height: '4px',
// },
// },
// },
// },
// MuiTab: {
// styleOverrides: {
// root: {
// color: themeColors.textColor,
// fontSize: '1rem',
// textTransform: 'none',
// fontWeight: 400,
// minHeight: '62px',
// '&:hover': {
// backgroundColor: themeColors.secondary,
// },
// '&.Mui-selected': {
// color: themeColors.textColor,
// fontWeight: 700,
// },
// '& > span': {
// color: colors.purple[900],
// },
// },
// },
// },
// MuiAccordionSummary: {
// styleOverrides: {
// root: {
// '& > .MuiAccordionSummary-content.Mui-expanded': {
// margin: '12px 0',
// },
// },
// },
// },
// MuiSwitch: {
// styleOverrides: {
// switchBase: {
// zIndex: 1,
// '&:not(.Mui-checked) .MuiTouchRipple-child': {
// color: colors.grey['500'],
// },
// },
// },
// },
// MuiIcon: {
// styleOverrides: {
// root: {
// color: colors.grey[50],
// },
// colorDisabled: {
// color: colors.grey[50],
// },
// },
// },
// MuiMenu: {
// styleOverrides: {
// root: {
// '.MuiMenu-list': {
// backgroundColor: colors.darkblue[600],
// },
// },
// },
// },
// MuiMenuItem: {
// styleOverrides: {
// root: {
// '&.Mui-disabled': {
// opacity: 0.66,
// },
// '&:hover': {
// backgroundColor: themeColors.secondary,
// },
// },
// },
// },
// MuiInputBase: {
// styleOverrides: {
// root: {
// backgroundColor: colors.darkblue[1000],
// '.MuiSvgIcon-root': {
// color: '#fff',
// },
// },
// },
// },
// MuiPaper: {
// styleOverrides: {
// root: {
// backgroundColor: themeColors.main,
// color: themeColors.textColor,
// },
// },
// },
// },
// });

View File

@ -1,7 +1,9 @@
import { createTheme } from '@mui/material/styles'; import { createTheme } from '@mui/material/styles';
import { colors } from './colors'; import { colors } from './colors';
import { alpha } from '@mui/material';
import { focusable } from 'themes/themeStyles';
export default createTheme({ const theme = {
breakpoints: { breakpoints: {
values: { values: {
xs: 0, xs: 0,
@ -17,7 +19,7 @@ export default createTheme({
elevated: '0px 1px 20px rgba(45, 42, 89, 0.1)', elevated: '0px 1px 20px rgba(45, 42, 89, 0.1)',
popup: '0px 2px 6px rgba(0, 0, 0, 0.25)', popup: '0px 2px 6px rgba(0, 0, 0, 0.25)',
primaryHeader: '0px 8px 24px rgba(97, 91, 194, 0.2)', primaryHeader: '0px 8px 24px rgba(97, 91, 194, 0.2)',
separator: '0px 2px 3px hsl(0deg 0% 78% / 50%)', separator: '0px 2px 4px rgba(32, 32, 33, 0.12)', // Notifications header
}, },
typography: { typography: {
fontFamily: 'Sen, Roboto, sans-serif', fontFamily: 'Sen, Roboto, sans-serif',
@ -66,8 +68,8 @@ export default createTheme({
palette: { palette: {
common: { common: {
// Used for text color white: colors.grey[50], // Tooltips text color // Switch base (OFF) // Text color
white: colors.grey[50], black: colors.grey[900], // Switch track (OFF)
}, },
text: { text: {
primary: colors.grey[900], primary: colors.grey[900],
@ -82,48 +84,50 @@ export default createTheme({
}, },
secondary: { secondary: {
// Used for purple badges and puple light elements // Used for purple badges and puple light elements
light: colors.purple[50],
main: colors.purple[800], main: colors.purple[800],
dark: colors.purple[900], light: colors.purple[50],
dark: colors.purple[900], // Color used for text
border: colors.purple[300], border: colors.purple[300],
contrastText: colors.purple[900], // Color used for text inside badge
}, },
info: { info: {
light: colors.blue[50],
main: colors.blue[500], main: colors.blue[500],
dark: colors.blue[700], light: colors.blue[50],
contrastText: colors.grey[50], // Color used for content when info.main is used as a background dark: colors.blue[800], // Color used for text
border: colors.blue[200], border: colors.blue[200],
contrastText: colors.blue[800], // Color used for text inside alert
}, },
success: { success: {
light: colors.green[50],
main: colors.green[600], main: colors.green[600],
dark: colors.green[800], light: colors.green[50],
contrastText: colors.grey[50], // Color used for content when success.main is used as a background dark: colors.green[800], // Color used for text
border: colors.green[300], border: colors.green[300],
contrastText: colors.green[800], // Color used for text inside alert
}, },
warning: { warning: {
light: colors.orange[100],
main: colors.orange[800], main: colors.orange[800],
dark: colors.orange[900], light: colors.orange[100],
contrastText: colors.grey[50], // Color used for content when warning.main is used as a background dark: colors.orange[900], // Color used for text
border: colors.orange[500], border: colors.orange[500],
contrastText: colors.orange[900], // Color used for text inside alert
}, },
error: { error: {
main: colors.red[700], // used on error buttons // used on icons on these elements
light: colors.red[50], light: colors.red[50],
main: colors.red[700], dark: colors.red[800], // Color used for text
dark: colors.red[800],
contrastText: colors.grey[50], // Color used for content when error.main is used as a background
border: colors.red[300], border: colors.red[300],
contrastText: colors.red[800], // Color used for text inside alert
}, },
/** /**
* Used for grey badges, hover elements, and grey light elements * Used for grey badges, hover elements, and grey light elements
*/ */
neutral: { neutral: {
light: colors.grey[100],
main: colors.grey[700], main: colors.grey[700],
light: colors.grey[100],
dark: colors.grey[800], dark: colors.grey[800],
border: colors.grey[400], border: colors.grey[400],
contrastText: colors.grey[800], // Color used for text inside badge
}, },
background: { background: {
@ -131,6 +135,7 @@ export default createTheme({
default: colors.grey[50], default: colors.grey[50],
application: colors.grey[300], application: colors.grey[300],
sidebar: colors.purple[800], sidebar: colors.purple[800],
alternative: colors.purple[800], // used on the dark theme to shwitch primary main to a darker shade
elevation1: colors.grey[100], elevation1: colors.grey[100],
elevation2: colors.grey[200], elevation2: colors.grey[200],
}, },
@ -159,7 +164,6 @@ export default createTheme({
* Table colors. * Table colors.
*/ */
table: { table: {
headerColor: colors.grey[900], //New - Is needed? ###CHECK
headerBackground: colors.grey[200], headerBackground: colors.grey[200],
headerHover: colors.grey[300], headerHover: colors.grey[300],
divider: colors.grey[300], divider: colors.grey[300],
@ -167,7 +171,7 @@ export default createTheme({
}, },
/** /**
* Text highlight effect color. Used when filtering/searching over content. * Text highlight effect color. Used when filtering/searching over content
*/ */
highlight: colors.orange[200], highlight: colors.orange[200],
@ -176,6 +180,11 @@ export default createTheme({
*/ */
codebox: colors.action[0.12], codebox: colors.action[0.12],
/**
* Links color
*/
links: colors.purple[900],
/** /**
* Gradient for the login page * Gradient for the login page
*/ */
@ -185,7 +194,7 @@ export default createTheme({
}, },
/** /**
* Colors for event log output. * Colors for event log output
*/ */
eventLog: { eventLog: {
diffAdd: colors.green[800], diffAdd: colors.green[800],
@ -194,7 +203,7 @@ export default createTheme({
}, },
/** /**
* For 'Seen' column on feature toggles list and other. * For 'Seen' column on feature toggles list and other
*/ */
seen: { seen: {
unknown: colors.grey[100], unknown: colors.grey[100],
@ -203,14 +212,66 @@ export default createTheme({
abandoned: colors.red[200], abandoned: colors.red[200],
primary: colors.purple[100], primary: colors.purple[100],
}, },
},
/**
* For Environment Accordion.
*/
envAccordion: {
disabled: colors.grey[100],
expanded: colors.grey[200],
},
/**
* MUI grey colors
*/
grey: {
// This was to see were these colors are used from MUI
// 50: '#A6000E',
100: colors.grey[100], // Disabled Switch base (OFF)
// 200: '#A6000E',
// 300: '#A6000E',
// 400: '#A6000E',
// 500: '#A6000E',
600: colors.grey[800], // slider tooltip background
700: colors.grey[800], // Dark tooltip background
// 800: '#A6000E',
// 900: '#A6000E',
// A100: '#A6000E',
// A200: '#A6000E',
// A400: '#A6000E',
// A700: '#A6000E',
},
},
};
export default createTheme({
...theme,
components: { components: {
// Skeleton
MuiCssBaseline: {
styleOverrides: {
'.skeleton': {
'&::before': {
backgroundColor: theme.palette.background.elevation1,
},
'&::after': {
background:
'linear-gradient(90deg, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.2) 100%, rgba(255, 255, 255, 0.5) 100%, rgba(255, 255, 255, 0))',
},
},
a: {
color: theme.palette.links,
},
},
},
// Links // Links
MuiLink: { MuiLink: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
color: theme.palette.primary.dark, ...focusable(theme),
color: theme.palette.links,
'&:hover': { '&:hover': {
textDecoration: 'none', textDecoration: 'none',
}, },
@ -225,7 +286,7 @@ export default createTheme({
color: theme.palette.text.primary, color: theme.palette.text.primary,
fontSize: '0.875rem', fontSize: '0.875rem',
'& a': { '& a': {
color: theme.palette.primary.dark, color: theme.palette.links,
textDecoration: 'none', textDecoration: 'none',
'&:hover': { '&:hover': {
textDecoration: 'underline', textDecoration: 'underline',
@ -239,7 +300,6 @@ export default createTheme({
MuiTableHead: { MuiTableHead: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
// background: 'transparent',
'& th': { '& th': {
height: theme.shape.tableRowHeightCompact, height: theme.shape.tableRowHeightCompact,
backgroundColor: theme.palette.table.headerBackground, backgroundColor: theme.palette.table.headerBackground,
@ -281,10 +341,19 @@ export default createTheme({
MuiAlert: { MuiAlert: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
padding: theme.spacing(2, 3),
borderRadius: theme.shape.borderRadiusMedium, borderRadius: theme.shape.borderRadiusMedium,
a: { a: {
color: 'inherit', color: 'inherit',
}, },
'> .MuiAlert-icon': {
padding: 0,
opacity: 1,
fontSize: '24px',
},
'> .MuiAlert-message': {
padding: '3px 0 0 0',
},
'&.MuiAlert-standardInfo': { '&.MuiAlert-standardInfo': {
backgroundColor: theme.palette.info.light, backgroundColor: theme.palette.info.light,
color: theme.palette.info.dark, color: theme.palette.info.dark,
@ -345,7 +414,7 @@ export default createTheme({
lineHeight: '1', lineHeight: '1',
minHeight: '62px', minHeight: '62px',
'&:hover': { '&:hover': {
backgroundColor: theme.palette.background.elevation2, backgroundColor: theme.palette.action.hover,
}, },
'&.Mui-selected': { '&.Mui-selected': {
color: theme.palette.text.primary, color: theme.palette.text.primary,
@ -361,12 +430,22 @@ export default createTheme({
}, },
}, },
// Constraint accordion / cards // Environment accordion
MuiAccordion: { MuiAccordion: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
'&:first-of-type, &:last-of-type': { '&:first-of-type, &:last-of-type': {
borderRadius: theme.shape.borderRadiusMedium, borderRadius: theme.shape.borderRadiusLarge,
},
'&.environment-accordion.Mui-expanded': {
outline: `2px solid ${alpha(
theme.palette.background.alternative,
0.6
)}`,
boxShadow: `0px 2px 8px ${alpha(
theme.palette.primary.main,
0.2
)}`,
}, },
}), }),
}, },
@ -384,19 +463,20 @@ export default createTheme({
}, },
}, },
// Project overview, improve toggle/switch disabled focus effect color // Project overview, improve switch (OFF - state) focus effect color
MuiSwitch: { MuiSwitch: {
styleOverrides: { styleOverrides: {
root: ({ theme }) => ({ root: ({ theme }) => ({
zIndex: 1, zIndex: 1,
'&:not(.Mui-checked) .MuiTouchRipple-child': { '.MuiSwitch-switchBase:not(.Mui-checked) .MuiTouchRipple-child':
color: theme.palette.neutral.border, {
}, color: theme.palette.action.disabled,
},
}), }),
}, },
}, },
// Overwiteing the action.disabledOpacity from MU // Overwiteing the action.disabledOpacity from MUI
MuiMenuItem: { MuiMenuItem: {
styleOverrides: { styleOverrides: {
root: { root: {

View File

@ -9,6 +9,7 @@ export const focusable = (theme: Theme) => ({
outlineWidth: 2, outlineWidth: 2,
outlineOffset: 2, outlineOffset: 2,
outlineColor: theme.palette.primary.main, outlineColor: theme.palette.primary.main,
borderRadius: '2px',
}, },
}); });

View File

@ -34,15 +34,14 @@ declare module '@mui/material/styles' {
interface CustomPalette { interface CustomPalette {
/** /**
* Generic neutral palette color. * Generic neutral palette color
*/ */
neutral: PaletteColorOptions; neutral: PaletteColorOptions;
/** /**
* Table colors. * Table colors
*/ */
table: { table: {
headerColor: string;
headerBackground: string; headerBackground: string;
headerHover: string; headerHover: string;
divider: string; divider: string;
@ -50,7 +49,7 @@ declare module '@mui/material/styles' {
}; };
/** /**
* Colors for event log output. * Colors for event log output
*/ */
eventLog: { eventLog: {
diffAdd: string; diffAdd: string;
@ -59,7 +58,7 @@ declare module '@mui/material/styles' {
}; };
/** /**
* For 'Seen' column on feature toggles list and other. * For 'Seen' column on feature toggles list and other
*/ */
seen: { seen: {
unknown: string; unknown: string;
@ -69,8 +68,6 @@ declare module '@mui/material/styles' {
primary: string; primary: string;
}; };
// dividerAlternative: string;
/** /**
* Background color for the API command in the sidebar * Background color for the API command in the sidebar
*/ */
@ -85,9 +82,22 @@ declare module '@mui/material/styles' {
}; };
/** /**
* Text highlight effect color. Used when filtering/searching over content. * Text highlight effect color. Used when filtering/searching over content
*/ */
highlight: string; highlight: string;
/**
* For Links
*/
links: string;
/**
* For Environment Accordion
*/
envAccordion: {
disabled: string;
expanded: string;
};
} }
interface Theme extends CustomTheme {} interface Theme extends CustomTheme {}
@ -102,23 +112,24 @@ declare module '@mui/material/styles' {
interface CustomTypeBackground { interface CustomTypeBackground {
application: string; application: string;
sidebar: string; sidebar: string;
alternative: string;
elevation1: string; elevation1: string;
elevation2: string; elevation2: string;
} }
interface PaletteColor { interface PaletteColor {
light: string;
main: string; main: string;
light: string;
dark: string; dark: string;
contrastText: string;
border?: string; border?: string;
contrastText: string;
} }
interface PaletteColorOptions { interface PaletteColorOptions {
light?: string;
main?: string; main?: string;
light?: string;
dark?: string; dark?: string;
contrastText?: string;
border?: string; border?: string;
contrastText?: string;
} }
} }