Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[colorManipulator][perf] Fast color manipulation #43289

Open
wants to merge 52 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
6f646c0
perf: fast color manipulation [draft]
romgrk Aug 14, 2024
4528659
lint
romgrk Aug 14, 2024
2f0f155
lint
romgrk Aug 14, 2024
1669b6a
lint
romgrk Aug 14, 2024
604f231
refactor: separate folder
romgrk Aug 14, 2024
e0f2573
lint
romgrk Aug 14, 2024
e857db8
feat: add hwb
romgrk Aug 14, 2024
7b20c24
update
romgrk Aug 14, 2024
6a6d557
feat: test fast getLuminance
romgrk Aug 14, 2024
50207ce
refactor: use bitwise when possible
romgrk Aug 14, 2024
091c677
lint
romgrk Aug 14, 2024
39f4045
test: cleanup
romgrk Aug 14, 2024
8045ca7
cleanup
romgrk Aug 14, 2024
c9e560d
perf: parse using regex
romgrk Aug 14, 2024
591d30b
lint
romgrk Aug 14, 2024
76f806d
feat: darken
romgrk Aug 14, 2024
02d02d9
lint
romgrk Aug 14, 2024
c7ec791
lint
romgrk Aug 14, 2024
6b8c3d6
fix
romgrk Aug 15, 2024
c9a4cb2
perf: better bitwise usage
romgrk Aug 15, 2024
0a4d155
perf: fast hex parsing
romgrk Aug 15, 2024
dfb3db5
lint
romgrk Aug 15, 2024
1acad10
fix: hwb
romgrk Aug 15, 2024
8381b5c
feat: colorspaces, lab, lch, oklab, oklch
romgrk Aug 16, 2024
e7696aa
perf: make it *fast*
romgrk Aug 17, 2024
f333445
lint
romgrk Aug 17, 2024
eeb428b
fix: test implementation
romgrk Aug 17, 2024
0063647
lint
romgrk Aug 17, 2024
6928cbe
refactor: fit to constraints
romgrk Aug 19, 2024
9bd0c97
fix
romgrk Aug 19, 2024
16f8375
fix
romgrk Aug 19, 2024
ad928df
lint
romgrk Aug 19, 2024
0e66380
test: make them pass
romgrk Aug 20, 2024
a7fb1b8
test: fixes
romgrk Aug 20, 2024
13c10cb
Merge branch 'next' into perf-color-manipulator
romgrk Aug 20, 2024
c3628b7
fix: merge conflict
romgrk Aug 20, 2024
a81e64b
lint
romgrk Aug 20, 2024
91e9cf6
lint
romgrk Aug 20, 2024
812e8cd
lint
romgrk Aug 20, 2024
01fe0fa
fix
romgrk Aug 20, 2024
fea13c7
fix: docs
romgrk Aug 20, 2024
45c5f5a
Merge branch 'next' into perf-color-manipulator
romgrk Aug 21, 2024
01d4ad2
refactor: restore colorManipulator
romgrk Aug 21, 2024
cf07f5d
fix path
siriwatknp Aug 22, 2024
dc79939
move color to colorManipulator/fast
siriwatknp Aug 22, 2024
a5d508d
Merge branch 'next' of https://github.com/mui/material-ui into perf-c…
siriwatknp Aug 22, 2024
79c2c15
export fast manipulator as unstable
siriwatknp Aug 22, 2024
a2129fb
use unstable manipulators
siriwatknp Aug 22, 2024
66e4c56
fix lint
siriwatknp Aug 22, 2024
d222aa6
revert change
siriwatknp Aug 22, 2024
65a7c0c
remove extractHex
siriwatknp Aug 22, 2024
fa1d91a
Merge branch 'next' of https://github.com/mui/material-ui into perf-c…
siriwatknp Aug 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion packages/mui-material/src/Alert/Alert.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { darken, lighten } from '@mui/system/colorManipulator';
import {
unstable_darken as darken,
unstable_lighten as lighten,
} from '@mui/system/colorManipulator';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import { useDefaultProps } from '../DefaultPropsProvider';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Autocomplete/Autocomplete.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import clsx from 'clsx';
import integerPropType from '@mui/utils/integerPropType';
import chainPropTypes from '@mui/utils/chainPropTypes';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import useAutocomplete, { createFilterOptions } from '../useAutocomplete';
import Popper from '../Popper';
import ListSubheader from '../ListSubheader';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client';
import * as React from 'react';
import PropTypes from 'prop-types';
import { emphasize } from '@mui/system/colorManipulator';
import { unstable_emphasize as emphasize } from '@mui/system/colorManipulator';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import MoreHorizIcon from '../internal/svg-icons/MoreHoriz';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Button/Button.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
import clsx from 'clsx';
import resolveProps from '@mui/utils/resolveProps';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import rootShouldForwardProp from '../styles/rootShouldForwardProp';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/ButtonGroup/ButtonGroup.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import getValidReactChildren from '@mui/utils/getValidReactChildren';
import capitalize from '../utils/capitalize';
import { styled } from '../zero-styled';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Checkbox/Checkbox.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
import clsx from 'clsx';
import refType from '@mui/utils/refType';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import SwitchBase from '../internal/SwitchBase';
import CheckBoxOutlineBlankIcon from '../internal/svg-icons/CheckBoxOutlineBlank';
import CheckBoxIcon from '../internal/svg-icons/CheckBox';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Chip/Chip.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import CancelIcon from '../internal/svg-icons/Cancel';
import useForkRef from '../utils/useForkRef';
import unsupportedProp from '../utils/unsupportedProp';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Divider/Divider.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import { useDefaultProps } from '../DefaultPropsProvider';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/IconButton/IconButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
import clsx from 'clsx';
import chainPropTypes from '@mui/utils/chainPropTypes';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import { useDefaultProps } from '../DefaultPropsProvider';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/IconButton/IconButton.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ describe('<IconButton />', () => {
clientX: 19,
});
expect(getByTestId('icon-button')).toHaveComputedStyle({
backgroundColor: 'rgba(0, 0, 0, 0.04)',
backgroundColor: 'rgba(0, 0, 0, 0.039)',
Copy link
Contributor Author

@romgrk romgrk Aug 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rounding error on 8-bits value, but this is not noticeable for the human eye (1/1000th of luminosity change) and most monitors probably can't even represent that difference.

});
});

Expand Down
5 changes: 4 additions & 1 deletion packages/mui-material/src/LinearProgress/LinearProgress.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { darken, lighten } from '@mui/system/colorManipulator';
import {
unstable_darken as darken,
unstable_lighten as lighten,
} from '@mui/system/colorManipulator';
import { useRtl } from '@mui/system/RtlProvider';
import { keyframes, css, styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Link/Link.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef';
import composeClasses from '@mui/utils/composeClasses';
import isFocusVisible from '@mui/utils/isFocusVisible';
Expand Down
4 changes: 2 additions & 2 deletions packages/mui-material/src/Link/getTextDecoration.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { getPath } from '@mui/system/style';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha, hexToRgb } from '@mui/system/colorManipulator';
import type { Theme } from '../styles';

const getTextDecoration = <T extends Theme>({
Expand All @@ -16,7 +16,7 @@ const getTextDecoration = <T extends Theme>({
if ('vars' in theme && channelColor) {
return `rgba(${channelColor} / 0.4)`;
}
return alpha(color, 0.4);
return hexToRgb(alpha(color, 0.4));
};

export default getTextDecoration;
2 changes: 1 addition & 1 deletion packages/mui-material/src/ListItemButton/ListItemButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import { useDefaultProps } from '../DefaultPropsProvider';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/MenuItem/MenuItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import rootShouldForwardProp from '../styles/rootShouldForwardProp';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/PaginationItem/PaginationItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import { useRtl } from '@mui/system/RtlProvider';
import paginationItemClasses, { getPaginationItemUtilityClass } from './paginationItemClasses';
import ButtonBase from '../ButtonBase';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Paper/Paper.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import clsx from 'clsx';
import integerPropType from '@mui/utils/integerPropType';
import chainPropTypes from '@mui/utils/chainPropTypes';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import { styled, useTheme } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import { useDefaultProps } from '../DefaultPropsProvider';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Radio/Radio.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
import clsx from 'clsx';
import refType from '@mui/utils/refType';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import SwitchBase from '../internal/SwitchBase';
import RadioButtonIcon from './RadioButtonIcon';
import capitalize from '../utils/capitalize';
Expand Down
6 changes: 5 additions & 1 deletion packages/mui-material/src/Slider/Slider.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ import PropTypes from 'prop-types';
import clsx from 'clsx';
import chainPropTypes from '@mui/utils/chainPropTypes';
import composeClasses from '@mui/utils/composeClasses';
import { alpha, lighten, darken } from '@mui/system/colorManipulator';
import {
unstable_alpha as alpha,
unstable_lighten as lighten,
unstable_darken as darken,
} from '@mui/system/colorManipulator';
import { useRtl } from '@mui/system/RtlProvider';
import useSlotProps from '@mui/utils/useSlotProps';
import { useSlider, valueToPercent } from './useSlider';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { emphasize } from '@mui/system/colorManipulator';
import { unstable_emphasize as emphasize } from '@mui/system/colorManipulator';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import { useDefaultProps } from '../DefaultPropsProvider';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { emphasize } from '@mui/system/colorManipulator';
import { unstable_emphasize as emphasize } from '@mui/system/colorManipulator';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
import { useDefaultProps } from '../DefaultPropsProvider';
Expand Down
6 changes: 5 additions & 1 deletion packages/mui-material/src/Switch/Switch.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import PropTypes from 'prop-types';
import clsx from 'clsx';
import refType from '@mui/utils/refType';
import composeClasses from '@mui/utils/composeClasses';
import { alpha, darken, lighten } from '@mui/system/colorManipulator';
import {
unstable_alpha as alpha,
unstable_darken as darken,
unstable_lighten as lighten,
} from '@mui/system/colorManipulator';
import capitalize from '../utils/capitalize';
import SwitchBase from '../internal/SwitchBase';
import { styled } from '../zero-styled';
Expand Down
6 changes: 5 additions & 1 deletion packages/mui-material/src/TableCell/TableCell.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { darken, alpha, lighten } from '@mui/system/colorManipulator';
import {
unstable_darken as darken,
unstable_alpha as alpha,
unstable_lighten as lighten,
} from '@mui/system/colorManipulator';
import capitalize from '../utils/capitalize';
import TableContext from '../Table/TableContext';
import Tablelvl2Context from '../Table/Tablelvl2Context';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/TableRow/TableRow.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import Tablelvl2Context from '../Table/Tablelvl2Context';
import { styled } from '../zero-styled';
import memoTheme from '../utils/memoTheme';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/ToggleButton/ToggleButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import PropTypes from 'prop-types';
import clsx from 'clsx';
import resolveProps from '@mui/utils/resolveProps';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import ButtonBase from '../ButtonBase';
import capitalize from '../utils/capitalize';
import { styled } from '../zero-styled';
Expand Down
2 changes: 1 addition & 1 deletion packages/mui-material/src/Tooltip/Tooltip.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import clsx from 'clsx';
import useTimeout, { Timeout } from '@mui/utils/useTimeout';
import elementAcceptingRef from '@mui/utils/elementAcceptingRef';
import composeClasses from '@mui/utils/composeClasses';
import { alpha } from '@mui/system/colorManipulator';
import { unstable_alpha as alpha } from '@mui/system/colorManipulator';
import { useRtl } from '@mui/system/RtlProvider';
import isFocusVisible from '@mui/utils/isFocusVisible';
import appendOwnerState from '@mui/utils/appendOwnerState';
Expand Down
11 changes: 8 additions & 3 deletions packages/mui-material/src/styles/createPalette.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import deepmerge from '@mui/utils/deepmerge';
import MuiError from '@mui/internal-babel-macros/MuiError.macro';
import { darken, getContrastRatio, lighten } from '@mui/system/colorManipulator';
import {
unstable_darken as darken,
unstable_lighten as lighten,
getContrastRatio,
hexToRgb,
} from '@mui/system/colorManipulator';
import common from '../colors/common';
import grey from '../colors/grey';
import purple from '../colors/purple';
Expand Down Expand Up @@ -84,9 +89,9 @@ function addLightOrDark(intent, direction, shade, tonalOffset) {
if (intent.hasOwnProperty(shade)) {
intent[direction] = intent[shade];
} else if (direction === 'light') {
intent.light = lighten(intent.main, tonalOffsetLight);
intent.light = hexToRgb(lighten(intent.main, tonalOffsetLight));
} else if (direction === 'dark') {
intent.dark = darken(intent.main, tonalOffsetDark);
intent.dark = hexToRgb(darken(intent.main, tonalOffsetDark));
}
}
}
Expand Down
18 changes: 11 additions & 7 deletions packages/mui-material/src/styles/createPalette.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { expect } from 'chai';
import { darken, lighten } from '@mui/system/colorManipulator';
import {
unstable_darken as darken,
unstable_lighten as lighten,
hexToRgb,
} from '@mui/system/colorManipulator';
import { deepOrange, blue, purple, indigo } from '../colors';
import createPalette, { dark, light } from './createPalette';

Expand Down Expand Up @@ -37,8 +41,8 @@ describe('createPalette()', () => {

expect(palette.primary).to.deep.include({
main: deepOrange[500],
light: lighten(deepOrange[500], 0.2),
dark: darken(deepOrange[500], 0.3),
light: hexToRgb(lighten(deepOrange[500], 0.2)),
dark: hexToRgb(darken(deepOrange[500], 0.3)),
});
});

Expand All @@ -50,8 +54,8 @@ describe('createPalette()', () => {

expect(palette.primary).to.deep.include({
main: deepOrange[500],
light: lighten(deepOrange[500], 0.1),
dark: darken(deepOrange[500], 0.15),
light: hexToRgb(lighten(deepOrange[500], 0.1)),
dark: hexToRgb(darken(deepOrange[500], 0.15)),
});
});

Expand All @@ -66,8 +70,8 @@ describe('createPalette()', () => {

expect(palette.primary).to.deep.include({
main: deepOrange[500],
light: lighten(deepOrange[500], 0.8),
dark: darken(deepOrange[500], 0.5),
light: hexToRgb(lighten(deepOrange[500], 0.8)),
dark: hexToRgb(darken(deepOrange[500], 0.5)),
});
});

Expand Down
Loading
Loading