1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-06 00:07:44 +01:00
unleash.unleash/frontend/src/themes/dark-theme.ts

658 lines
22 KiB
TypeScript
Raw Normal View History

import { createTheme } from '@mui/material/styles';
import { alpha } from '@mui/material';
import { focusable } from 'themes/themeStyles';
import { colors } from './colors';
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 theme = {
breakpoints: {
values: {
xs: 0,
sm: 600,
md: 960,
lg: 1280,
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 4px rgba(32, 32, 33, 0.12)', // Notifications header
accordionFooter: 'inset 0px 2px 4px rgba(32, 32, 33, 0.05)',
},
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,
},
h2: {
fontSize: `${20 / 16}rem`,
fontWeight: '700',
},
h3: {
fontSize: '1rem',
fontWeight: '700',
},
h4: {
fontSize: '1rem',
fontWeight: '400',
},
caption: {
fontSize: `${12 / 16}rem`,
},
},
fontSizes: {
extraLargeHeader: '2.5rem',
largeHeader: '2rem',
mediumHeader: '1.5rem',
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,
},
zIndex: {
sticky: 1400,
},
palette: {
common: {
white: '#EEEEFC', // Switch base (OFF) // Tooltips text color // Text color
black: '#A0A0B1', // Switch track (OFF)
},
text: {
primary: '#EEEEFC',
secondary: '#A0A0B1',
disabled: '#888799',
},
primary: {
main: '#9792ED',
light: '#4C4992',
// Maybe to move links color to another variable????
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: {
// Used for purple badges and puple light elements
main: '#9792ED', // used on icons on these elements
light: '#34325E', // used as a bakground on these elements
dark: '#EEEEFC', // used for text on these elements
border: '#4C4992',
contrastText: '#EEEEFC', // Color used for content when info.main is used as a background
},
info: {
// main: '#5483C9', // used on icons on these elements
main: '#a2bbe2', // used on icons on these elements
light: '#1A2641', // used as a bakground on these elements
dark: '#a2bbe2', // used for text on these elements
border: '#1B407A',
contrastText: '#EEEEFC', // Color used for content when info.main is used as a background
},
success: {
// main: '#62872F', // used on icons on these elements
main: '#94ae6f', // used on icons on these elements
light: '#333D30', // used as a bakground on these elements
dark: '#94ae6f', // used for text on these elements
border: '#3D600C',
contrastText: '#EEEEFC', // Color used for content when success.main is used as a background
},
warning: {
// main: '#9E691C', // used on icons on these elements
main: '#bc7d21', // used on icons on these elements
light: '#3B302C', // used as a bakground on these elements
dark: '#bc7d21', // used for text on these elements
contrastText: '#EEEEFC', // Color used for content when warning.main is used as a background
border: '#6C4A19',
},
error: {
// main: '#B93F4A', // used on error buttons // used on icons on these elements
main: '#ff6472', // used on error buttons // used on icons on these elements
light: '#3F2835', // used as a bakground on these elements
// dark: '#F15260', // used for text on these elements
dark: '#ff6472', // used for text on these elements
border: '#8A3E45',
contrastText: '#EEEEFC', // Color used for content when error.main is used as a background
},
web: {
main: '#1A4049', // used on sales-related elements
contrastText: '#EEEEFC', // Color used for inner text
},
/**
* Used for grey badges, hover elements, and grey light elements
*/
neutral: {
main: '#858699', // used on icons on these elements
light: '#2B2A3C', // used as a bakground on these elements
dark: '#EEEEFC', // used for text on these elements
border: '#454360',
contrastText: '#EEEEFC', // Color used for text inside badge
},
background: {
paper: '#222130', // Background color for all containers
default: '#222130',
application: '#1A1924',
sidebar: '#4C4992',
alternative: '#4C4992', // used on the dark theme to shwitch primary main to a darker shade
elevation1: '#2B2A3C',
elevation2: '#2B2A3C',
// elevation2: '#302E42',
},
action: {
// Colors used for Icons and Buttons -> this comes from MUI and we overwriting it with our colors
active: actionColors[0.54],
hover: actionColors[0.05],
hoverOpacity: 0.05,
selected: actionColors[0.08],
selectedOpacity: 0.08,
disabled: actionColors[0.32],
disabledBackground: actionColors[0.12],
disabledOpacity: 0.38,
focus: actionColors[0.12],
focusOpacity: 0.12,
activatedOpacity: 0.12,
feat: add "my projects" filter to projects list (#6831) This PR adds the buttons (only UI, no functionality) to show either "all projects" or "my projects". The buttons use a styled button group and are hidden behind the new `projectListFilterMyProjects` flag. The button placement breaks with the previously established page header pattern of having all actions moved to the right. To accommodate this new placement, I created a new flex container in the header called `leftActions`, which is essentially just a mirror of the normal actions. I went with `leftActions` instead of `inlineStartActions` or something similar because I think it's clearer, and I don't see us adapting Unleash for different writing directions right now. We can always change it later. I have also slightly increased the end margin of the page header to accommodate the new designs and to adjust the spacing before the buttons. I adjusted the margin of the text instead of the padding of the left actions because this will keep the spacing to the page header the same on every page. Without it, we could end up in situations where the spacing changes from page to page based on whether it has left actions or not, which is probably undesirable. ![image](https://github.com/Unleash/unleash/assets/17786332/7d6ba98c-a34b-45d4-85f4-2b1c2f3dc0c8) ## Still to do: ### Hover colors ~~Find out what the right hover color variable is. I'm using the light mode hover color for now, which works well in both light and dark modes (looks nice and is AAccessible), but it's not the same as the hover color for other buttons in dark mode.~~ Fixed ☝🏼 ### Small windows Also worth noting: at around 500px, the layout shift starts to cause problems and we end up with overlapping elements. How do we want to deal with narrower screens? Today, the UI is pretty functional until we reach about 250px. It would be nice to not increase that size. The new version breaking at about 500px: ![image](https://github.com/Unleash/unleash/assets/17786332/bf4f70d7-13b7-410a-9de4-30f4873a2ab8) The old version breaking at about 250px: ![image](https://github.com/Unleash/unleash/assets/17786332/2d4e1e9c-8442-471c-91e4-67c024736234) ### Margins We also need to figure out how much space we want on smaller windows: ![image](https://github.com/Unleash/unleash/assets/17786332/b12804b1-a2db-4547-88d5-0d9d49221fe2)
2024-04-12 12:35:47 +02:00
alternative: colors.purple[1000],
},
/**
* General divider
*/
divider: '#39384C',
/**
* Table colors.
*/
table: {
headerBackground: '#2B2A3C',
headerHover: '#313045',
divider: '#323144',
rowHover: '#262536',
},
/**
* Text highlight effect color. Used when filtering/searching over content
*/
highlight: 'rgba(255, 234, 204, 0.7)',
/**
* Used for the interactive guide spotlight
*/
spotlight: {
border: '#8c89bf',
outline: '#bcb9f3',
pulse: '#bcb9f3',
},
/**
* Background color used for the API command in the sidebar
*/
codebox: 'rgba(52, 50, 94, 0.3)',
/**
* Links color
*/
links: '#9792ED',
/**
* Gradient for the login page
*/
loginGradient: {
from: '#4C4992',
to: '#4944a7',
},
/**
* Colors for event log output
*/
eventLog: {
diffAdd: '#77AB2E',
diffSub: '#df626c',
edited: '#EEEEFC',
},
/**
* For 'Seen' column on feature flags list and other
*/
seen: {
unknown: '#2B2A3C',
recent: '#4E6131',
inactive: '#875D21',
abandoned: '#8A3E45',
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',
},
variants: colors.variants,
/**
* Dashboard and charts
*/
charts: {
gauge: {
gradientStart: '#4C4992',
gradientEnd: '#9792ED',
background: '#39384C',
sectionLine: '#8c89bf',
text: colors.grey[800],
},
2024-02-23 09:05:59 +01:00
health: {
mainCircleBackground: '#34325E',
orbit: '#4C4992',
circles: '#2B2A3C',
text: colors.grey[500],
title: colors.grey[50],
healthy: colors.purple[800],
stale: colors.red[800],
potentiallyStale: colors.orange[800],
2024-02-23 09:05:59 +01:00
gradientStale: '#8A3E45',
gradientPotentiallyStale: '#875D21',
2024-02-23 09:05:59 +01:00
},
series: colors.chartSeries,
},
},
};
export default createTheme({
...theme,
components: {
// Skeleton
MuiCssBaseline: {
styleOverrides: {
'#react-joyride-portal ~ .MuiDialog-root': {
zIndex: 1399,
},
'.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
MuiLink: {
styleOverrides: {
root: ({ theme }) => ({
...focusable(theme),
color: theme.palette.links,
'&:hover': {
textDecoration: 'none',
},
}),
},
},
// Breadcrumb
MuiBreadcrumbs: {
styleOverrides: {
root: ({ theme }) => ({
color: theme.palette.text.primary,
fontSize: '0.875rem',
'& a': {
color: theme.palette.links,
textDecoration: 'none',
'&:hover': {
textDecoration: 'underline',
},
},
}),
},
},
// Tables
MuiTableHead: {
styleOverrides: {
root: ({ theme }) => ({
'& th': {
height: theme.shape.tableRowHeightCompact,
backgroundColor: theme.palette.table.headerBackground,
border: 0,
'&:first-of-type': {
borderTopLeftRadius: theme.shape.borderRadiusMedium,
borderBottomLeftRadius:
theme.shape.borderRadiusMedium,
},
'&:last-of-type': {
borderTopRightRadius:
theme.shape.borderRadiusMedium,
borderBottomRightRadius:
theme.shape.borderRadiusMedium,
},
},
}),
},
},
MuiTableRow: {
styleOverrides: {
root: ({ theme }) => ({
'&.MuiTableRow-root:hover': {
//Not all the tables have row hover background. This will add background color on row hover for all the tables
background: theme.palette.table.rowHover, //overwrite action.hover
},
}),
},
},
MuiTableCell: {
styleOverrides: {
root: ({ theme }) => ({
borderBottomColor: theme.palette.table.divider,
}),
},
},
// Alerts
MuiAlert: {
styleOverrides: {
root: ({ theme }) => ({
padding: theme.spacing(2, 3),
borderRadius: theme.shape.borderRadiusMedium,
a: {
color: 'inherit',
},
'> .MuiAlert-icon': {
padding: 0,
opacity: 1,
fontSize: '24px',
},
'> .MuiAlert-message': {
padding: '3px 0 0 0',
},
'&.MuiAlert-standardInfo': {
backgroundColor: theme.palette.info.light,
color: theme.palette.info.contrastText,
border: `1px solid ${theme.palette.info.border}`,
'& .MuiAlert-icon': {
color: theme.palette.info.main,
},
},
'&.MuiAlert-standardSuccess': {
backgroundColor: theme.palette.success.light,
color: theme.palette.success.contrastText,
border: `1px solid ${theme.palette.success.border}`,
'& .MuiAlert-icon': {
color: theme.palette.success.main,
},
},
'&.MuiAlert-standardWarning': {
backgroundColor: theme.palette.warning.light,
color: theme.palette.warning.contrastText,
border: `1px solid ${theme.palette.warning.border}`,
'& .MuiAlert-icon': {
color: theme.palette.warning.main,
},
},
'&.MuiAlert-standardError': {
backgroundColor: theme.palette.error.light,
color: theme.palette.error.contrastText,
border: `1px solid ${theme.palette.error.border}`,
'& .MuiAlert-icon': {
color: theme.palette.error.main,
},
},
}),
},
},
// Horizontal menu tabs
MuiTabs: {
styleOverrides: {
root: ({ theme }) => ({
'& .MuiTabs-indicator': {
backgroundColor: theme.palette.background.alternative,
height: '4px',
},
'& .MuiTabs-flexContainer': {
minHeight: '70px',
maxHeight: '70px',
},
}),
},
},
MuiTab: {
styleOverrides: {
root: ({ theme }) => ({
color: theme.palette.text.primary,
fontSize: '1rem',
textTransform: 'none',
fontWeight: 400,
lineHeight: '1',
minHeight: '62px',
'&:hover': {
backgroundColor: theme.palette.action.hover,
},
'&.Mui-selected': {
color: theme.palette.text.primary,
fontWeight: 700,
},
'& > span': {
color: theme.palette.primary.main, //Based on this color is created the focus color/effect
},
[theme.breakpoints.down('md')]: {
padding: '12px 0px',
},
}),
},
},
// Environment accordion
MuiAccordion: {
styleOverrides: {
root: ({ theme }) => ({
'&:first-of-type, &:last-of-type': {
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}`,
},
}),
},
},
MuiAccordionSummary: {
styleOverrides: {
root: {
'& > .MuiAccordionSummary-content.Mui-expanded': {
margin: '12px 0',
},
'&.Mui-expanded': {
minHeight: '0',
},
},
},
},
// Project overview, improve switch (ON - state) hover effect color
MuiSwitch: {
styleOverrides: {
root: ({ theme }) => ({
zIndex: 1,
'&&& > .Mui-checked:hover': {
backgroundColor: actionColors[0.08],
},
'&&& > .Mui-checked.Mui-disabled': {
color: '#423F6E',
},
}),
},
},
// Overwiteing the action.disabledOpacity from MUI
MuiMenuItem: {
styleOverrides: {
root: {
'&.Mui-disabled': {
opacity: 0.4,
},
},
},
},
// Inputs background - This is used when we have inputs on a darker background (e.g. edit contstraints, playground)
MuiInputBase: {
styleOverrides: {
root: ({ theme }) => ({
backgroundColor: theme.palette.background.paper,
}),
},
},
// Top menu text color
MuiAppBar: {
styleOverrides: {
root: ({ theme }) => ({
color: theme.palette.text.primary,
}),
},
},
// 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.light,
},
},
}),
},
},
// 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}`,
},
}),
},
},
MuiIcon: {
defaultProps: {
baseClassName: 'material-symbols-outlined',
},
},
},
});