material-ui 警告:填充的变体文本颜色应该使用theme.palette[color].contrastText,而不是theme.palette.getContrastText,

dvtswwa3  于 4个月前  发布在  其他
关注(0)|答案(8)|浏览(65)

重复问题

  • 我已搜索现有的问题

最新版本

  • 我已测试了最新版本

当前行为 😯

目前使用theme.palette.getContrastText来计算文本颜色。

预期行为 🤔

预期从theme.palette[color].contrastText提供颜色。

重现步骤 🕹

https://codesandbox.io/s/clever-almeida-u36ek8?file=/src/App.tsx

上下文 🔦

拉取请求破坏了Alert的文本颜色。如果提供了contrastText,它不应该计算theme.palette.getContrastText或者应该考虑提供的contrastText

你的环境 🌎

  • 无响应*
tyg4sfes

tyg4sfes1#

Thanks for the report. #29813 did change the behavior, but it was for solving an issue. The contrast color in the cases where the colors changed is because the black gives better contrast than the white color for the text. We could use contrastText for light mode, but that won't work for dark mode, mainly because we use the color.palette[color].dark as a background, and the color.palette[color].contrastText is meant as a contrast text for the main color:

index 5cfcd0492e..6ce845f83e 100644
--- a/packages/mui-material/src/Alert/Alert.js
+++ b/packages/mui-material/src/Alert/Alert.js
@@ -95,11 +95,14 @@ const AlertRoot = styled(Paper, {
                 theme.palette.mode === 'dark'
                   ? theme.palette[color].dark
                   : theme.palette[color].main,
-              color: theme.palette.getContrastText(
-                theme.palette.mode === 'dark'
-                  ? theme.palette[color].dark
-                  : theme.palette[color].main,
-              ),
+              color:
+                theme.palette.mode === 'light' && theme.palette[color].contrastText
+                  ? theme.palette[color].contrastText
+                  : theme.palette.getContrastText(
+                      theme.palette.mode === 'dark'
+                        ? theme.palette[color].dark
+                        : theme.palette[color].main,
+                    ),
             }),
       }),
   };

@siriwatknp what do you think about this change?

nnt7mjpx

nnt7mjpx2#

So the problem maybe is that theme.palette[color].contrastText only with theme.palette[color].main.
Kinda sticky situation because theme.palette[color].light need to have theme.palette[color].lightContrastText and theme.palette[color].dark need to have theme.palette[color].darkContrastText. Problem maybe can be solve if each color would have it's own contrastText color and it would be already resolve in createPalette function also it can be overriden by what actual color you passed.

{
  light?: string;
  main: string;
  dark?: string;
  contrastText?: string;
  lightContrastText?: string;
  darkContrastText?: string;
}

It would leave you with

{

function resolveContrastColor(color: any, theme: any) {
     const isLightMode = theme.palette.mode === 'light';
     const contrastText = isLightMode? theme.palette[color].contrastText ? theme.palette[color].darkContrastText;
     return contrastText ?? theme.palette.getContrastText(isLightMode? theme.palette[color].main: theme.palette[color].dark,)
}

color: resolveContrastColor(color, theme)
}

Or this should be resolve in theme palette after createPalette

{
success: {
            main: '#00C796',
            dark: '#008B69',
            light: '#33D2AB',
            contrastText: paletteMode === 'light' ? '#fff' : getContrastText('#008B69'),
        },
}

And you only left with

+     color: theme.palette[color].contrastText
+                  ? theme.palette[color].contrastText
+                  : theme.palette.getContrastText(
+                      theme.palette.mode === 'dark'
+                        ? theme.palette[color].dark
+                        : theme.palette[color].main,
+                    ),
6jjcrrmo

6jjcrrmo3#

We haven't had so far the need to have a contrast text color for each color in the palette, so I wouldn't add it until we see this required in more than one place. I feel this would be overengineering for the problem we have.
For the extendTheme util that is based on CSS variables, maybe we can create automatically contrast text for each color if we see the need for it.
Let's also consider what @siriwatknp thinks.

jslywgbw

jslywgbw4#

我此时不会做任何事情,因为对比度是预期的(应该是黑色):

我们可以做的事情是在警报页面添加一条评论,说明 filled 变体从默认背景计算颜色,并提供一个示例说明如何更改行为:

const theme = createTheme({
  components: {
    MuiAlert: {
      styleOverrides: {
        root: ({ ownerState }) => ({
          ...(ownerState.variant === "filled" && {
            color: "#fff"
          })
        })
      }
    }
  }
});

这里是: https://codesandbox.io/s/admiring-shape-rzm6lw?file=/src/App.tsx:341-884

vddsk6oq

vddsk6oq5#

我同意不采取任何行动。但是,如果调色板本身已经计算出了对比色,我们是否需要在组件中添加额外的逻辑来解决对比色问题?
material-ui/packages/mui-material/src/styles/createPalette.js
第258行:| color.contrastText=getContrastText(color.main); |
也许我们只需要计算深色并直接使用它,这样可以减少某些组件的bundle大小。目前我只看到了每个组件中没有原因的代码重复,以及到处都是相同的逻辑。
另一个选择是删除theme中的contrastText属性,将其更改为getModeContrastText,并在所有地方使用它。您不需要两种解决颜色问题的方法。

q3aa0525

q3aa05256#

感谢@povilass,这是一个很好的观点。我们可能会在未来使用CSS变量来解决这个问题。@povilass,目前我们不需要在其他组件中添加这个功能,这就是为什么我认为我们不应该立即添加它。cc @siriwatknp,到目前为止,你是否需要类似这样的joy功能?

dwthyt8l

dwthyt8l7#

当然可以!这是一个关于计算机的问题,我会尽力帮助您解答。

问题:文档中的示例不再受支持了吗?现在对比文本总是白色或黑色吗?当使用自定义主题时,contrastText属性是否无效?

答案:文档中的示例可能已经更新,但它们仍然受支持。对比文本的颜色取决于您的应用程序的主题设置。如果您使用的是自定义主题,那么contrastText属性可能会有所不同。建议您查阅相关文档或寻求开发者的帮助以获取更准确的信息。

7uzetpgm

7uzetpgm8#

对不起,忽略我-我已经意识到上面的示例可以通过不使用填充变体来实现。

相关问题