diff --git a/.changeset/strong-bikes-cheer.md b/.changeset/strong-bikes-cheer.md new file mode 100644 index 000000000..e1add0e7c --- /dev/null +++ b/.changeset/strong-bikes-cheer.md @@ -0,0 +1,5 @@ +--- +'@keystar/ui': patch +--- + +Improve "neutral" `Toast` appearance, esp. for dark mode. diff --git a/design-system/pkg/src/toast/Toast.tsx b/design-system/pkg/src/toast/Toast.tsx index b57b2b9de..e4022ba6d 100644 --- a/design-system/pkg/src/toast/Toast.tsx +++ b/design-system/pkg/src/toast/Toast.tsx @@ -9,12 +9,19 @@ import { checkCircle2Icon } from '@keystar/ui/icon/icons/checkCircle2Icon'; import { infoIcon } from '@keystar/ui/icon/icons/infoIcon'; import { alertTriangleIcon } from '@keystar/ui/icon/icons/alertTriangleIcon'; import { SlotProvider } from '@keystar/ui/slots'; -import { classNames, css, tokenSchema, useStyleProps } from '@keystar/ui/style'; +import { + classNames, + css, + tokenSchema, + useMediaQuery, + useStyleProps, +} from '@keystar/ui/style'; import { Text } from '@keystar/ui/typography'; import { isReactText } from '@keystar/ui/utils'; import intlMessages from './l10n'; import { ToastProps } from './types'; +import { useProvider } from '../core'; const ICONS = { info: infoIcon, @@ -45,6 +52,10 @@ function Toast(props: ToastProps, ref: ForwardedRef) { tone && tone !== 'neutral' ? stringFormatter.format(tone) : null; let icon = tone && tone !== 'neutral' ? ICONS[tone] : null; + const colorScheme = useColorScheme(); + const staticColor = + tone === 'neutral' && colorScheme === 'dark' ? 'dark' : 'light'; + const handleAction = () => { if (onAction) { onAction(); @@ -83,7 +94,8 @@ function Toast(props: ToastProps, ref: ForwardedRef) { // tones color: tokenSchema.color.foreground.onEmphasis, '&[data-tone=neutral]': { - background: tokenSchema.color.scale['slate9'], + backgroundColor: tokenSchema.color.background.inverse, + color: tokenSchema.color.foreground.inverse, }, '&[data-tone=info]': { background: tokenSchema.color.background.accentEmphasis, @@ -135,13 +147,7 @@ function Toast(props: ToastProps, ref: ForwardedRef) { {isReactText(children) ? {children} : children} {actionLabel && ( - )} @@ -149,16 +155,28 @@ function Toast(props: ToastProps, ref: ForwardedRef) {
- +
); } +function useColorScheme() { + const prefersDark = useMediaQuery('(prefers-color-scheme: dark)'); + const preferred = useProvider(); + + if (preferred.colorScheme === 'auto') { + return prefersDark ? 'dark' : 'light'; + } + + return preferred.colorScheme; +} + let _Toast = forwardRef(Toast); export { _Toast as Toast };