blob: dd2187e11f27d3d693a08fe12897ca85423edfa6 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/color/new_tab_page_color_mixer.h"
#include "base/logging.h"
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/browser/ui/color/chrome_color_provider_utils.h"
#include "chrome/common/themes/autogenerated_theme_util.h"
#include "components/search/ntp_features.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/ui_base_features.h"
#include "ui/color/color_id.h"
#include "ui/color/color_mixer.h"
#include "ui/color/color_provider.h"
#include "ui/color/color_provider_utils.h"
#include "ui/color/color_recipe.h"
#include "ui/color/color_transform.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/color_utils.h"
namespace {
constexpr float kNtpElementLuminosityChangeForLightBackgroundParam = 0.1f;
constexpr float kNtpElementLuminosityChangeForDarkBackgroundParam = 0.2f;
ui::ColorTransform GetContrastingColorTransform(
ui::ColorTransform input_transform,
absl::optional<float> luminosity_change = absl::nullopt) {
const auto generator = [](ui::ColorTransform input_transform,
const absl::optional<float> luminosity_change,
SkColor input_color, const ui::ColorMixer& mixer) {
const SkColor color = input_transform.Run(input_color, mixer);
const float default_luminosity_change =
color_utils::IsDark(color)
? kNtpElementLuminosityChangeForDarkBackgroundParam
: kNtpElementLuminosityChangeForLightBackgroundParam;
return GetContrastingColor(
color, luminosity_change.value_or(default_luminosity_change));
};
return base::BindRepeating(generator, std::move(input_transform),
std::move(luminosity_change));
}
ui::ColorTransform IncreaseLightness(ui::ColorTransform input_transform,
double percent) {
const auto generator = [](ui::ColorTransform input_transform, double percent,
SkColor input_color, const ui::ColorMixer& mixer) {
const SkColor color = input_transform.Run(input_color, mixer);
color_utils::HSL result;
color_utils::SkColorToHSL(color, &result);
result.l += (1 - result.l) * percent;
const SkColor result_color =
color_utils::HSLToSkColor(result, SkColorGetA(color));
DVLOG(2) << "ColorTransform IncreaseLightness:"
<< " Percent: " << percent
<< " Transform Color: " << ui::SkColorName(color)
<< " Result Color: " << ui::SkColorName(result_color);
return result_color;
};
return base::BindRepeating(generator, std::move(input_transform), percent);
}
ui::ColorTransform SelectBasedOnNtpBackground(
ui::ColorTransform output_transform_for_white_input,
ui::ColorTransform output_transform_for_black_input,
ui::ColorTransform default_output_transform_for_input) {
const auto generator =
[](ui::ColorTransform output_transform_for_white_input,
ui::ColorTransform output_transform_for_black_input,
ui::ColorTransform default_output_transform_for_input,
SkColor input_color, const ui::ColorMixer& mixer) {
const ui::ColorTransform input_transform = {kColorNewTabPageBackground};
const SkColor color = input_transform.Run(input_color, mixer);
const auto& output_transform =
(color == SK_ColorWHITE)
? output_transform_for_white_input
: ((color == SK_ColorBLACK)
? output_transform_for_black_input
: default_output_transform_for_input);
const SkColor result_color = output_transform.Run(input_color, mixer);
DVLOG(2) << "ColorTransform SelectBasedOnNtpBackground:"
<< " Input Color: " << ui::SkColorName(input_color)
<< " Input Transform: " << ui::SkColorName(color)
<< " IsWhite: " << (color == SK_ColorWHITE ? "true" : "false")
<< " IsBlack: " << (color == SK_ColorBLACK ? "true" : "false")
<< " Result Color: " << ui::SkColorName(result_color);
return result_color;
};
return base::BindRepeating(generator,
std::move(output_transform_for_white_input),
std::move(output_transform_for_black_input),
std::move(default_output_transform_for_input));
}
ui::ColorTransform SelectBasedOnWhiteInput(
const ui::ColorTransform input_transform,
ui::ColorTransform output_transform_for_white_input,
ui::ColorTransform output_transform_for_non_white_input) {
const auto generator =
[](ui::ColorTransform input_transform,
ui::ColorTransform output_transform_for_white_input,
ui::ColorTransform output_transform_for_non_white_input,
SkColor input_color, const ui::ColorMixer& mixer) {
const SkColor color = input_transform.Run(input_color, mixer);
const auto& output_transform =
(color == SK_ColorWHITE) ? output_transform_for_white_input
: output_transform_for_non_white_input;
const SkColor result_color = output_transform.Run(input_color, mixer);
DVLOG(2) << "ColorTransform SelectBasedOnWhiteInput:"
<< " Input Color: " << ui::SkColorName(input_color)
<< " Input Transform: " << ui::SkColorName(color)
<< " IsWhite: " << (color == SK_ColorWHITE ? "true" : "false")
<< " Result Color: " << ui::SkColorName(result_color);
return result_color;
};
return base::BindRepeating(generator, std::move(input_transform),
std::move(output_transform_for_white_input),
std::move(output_transform_for_non_white_input));
}
ui::ColorTransform SelectBasedOnWhiteNtpBackground(
ui::ColorTransform output_transform_for_white_input,
ui::ColorTransform output_transform_for_non_white_input) {
return SelectBasedOnWhiteInput({kColorNewTabPageBackground},
output_transform_for_white_input,
output_transform_for_non_white_input);
}
// Comprehensive theming colors follow two different color conventions depending
// on the background color. On white backgrounds, we theme a few select
// elements with an accent color, while, on non-white background colors we
// compute appropriate contrasting background and foreground element colors and
// use these to style elements.
void AddGeneratedThemeComprehensiveColors(ui::ColorMixer& mixer) {
ui::ColorTransform element_background_color =
base::FeatureList::IsEnabled(ntp_features::kNtpModulesRedesigned)
? SelectBasedOnNtpBackground(
kColorNewTabPageBackground, {gfx::kGoogleGrey900},
GetContrastingColorTransform(kColorNewTabPageBackground))
: SelectBasedOnWhiteNtpBackground(
kColorNewTabPageBackground,
GetContrastingColorTransform(kColorNewTabPageBackground));
ui::ColorTransform primary_foreground_color =
ui::GetColorWithMaxContrast(element_background_color);
ui::ColorTransform themed_foreground_color = SelectBasedOnWhiteNtpBackground(
gfx::kGoogleBlue600,
ui::PickGoogleColor(element_background_color, element_background_color,
color_utils::kMinimumReadableContrastRatio));
const ui::ColorTransform select_topmost_element_background_color =
themed_foreground_color;
const ui::ColorTransform select_topmost_element_foreground_color =
GetColorWithMaxContrast(select_topmost_element_background_color);
mixer[kColorNewTabPageActionButtonBackground] =
select_topmost_element_background_color;
mixer[kColorNewTabPageActionButtonForeground] =
select_topmost_element_foreground_color;
mixer[kColorNewTabPageBorder] = SelectBasedOnWhiteNtpBackground(
gfx::kGoogleGrey300, element_background_color);
mixer[kColorNewTabPageChipBackground] = element_background_color;
mixer[kColorNewTabPageButtonBackground] = element_background_color;
mixer[kColorNewTabPageButtonBackgroundHovered] = {
kColorNewTabPageControlBackgroundHovered};
mixer[kColorNewTabPageButtonForeground] = themed_foreground_color;
mixer[kColorNewTabPageCartModuleDiscountChipBackground] =
SelectBasedOnDarkInput(element_background_color, gfx::kGoogleGrey800,
gfx::kGoogleGreen050);
mixer[kColorNewTabPageCartModuleDiscountChipForeground] =
SelectBasedOnDarkInput(element_background_color, gfx::kGoogleGreen300,
gfx::kGoogleGreen700);
mixer[kColorNewTabPageControlBackgroundHovered] = SelectBasedOnDarkInput(
element_background_color,
ui::SetAlpha(SK_ColorWHITE,
/* 10% opacity */ 0.1 * SK_AlphaOPAQUE),
ui::SetAlpha(gfx::kGoogleGrey900,
/* 10% opacity */ 0.1 * SK_AlphaOPAQUE));
mixer[kColorNewTabPageFocusRing] = ui::PickGoogleColorTwoBackgrounds(
ui::kColorFocusableBorderFocused, element_background_color,
kColorNewTabPageBackground, color_utils::kMinimumVisibleContrastRatio);
mixer[kColorNewTabPageLogo] = element_background_color;
mixer[kColorNewTabPageLink] = themed_foreground_color;
mixer[kColorNewTabPageFirstRunBackground] = {kColorNewTabPageBackground};
mixer[kColorNewTabPageChipBackground] =
select_topmost_element_background_color;
mixer[kColorNewTabPageChipForeground] =
select_topmost_element_foreground_color;
if (base::FeatureList::IsEnabled(ntp_features::kNtpModulesRedesigned)) {
mixer[kColorNewTabPageModuleBackground] =
SelectBasedOnWhiteInput({kColorNewTabPageBackground},
gfx::kGoogleGrey100, element_background_color);
} else {
mixer[kColorNewTabPageModuleBackground] = element_background_color;
}
mixer[kColorNewTabPageModuleItemBackground] = {kColorNewTabPageBackground};
mixer[kColorNewTabPageHistoryClustersModuleItemBackground] =
SelectBasedOnWhiteInput(element_background_color, gfx::kGoogleGrey100,
kColorNewTabPageBackground);
mixer[kColorNewTabPageModuleControlBorder] = SelectBasedOnWhiteNtpBackground(
gfx::kGoogleGrey300, kColorNewTabPageBackground);
mixer[kColorNewTabPageModuleElementDivider] = {
kColorNewTabPageModuleBackground};
mixer[kColorNewTabPageMostVisitedForeground] = SelectBasedOnDarkInput(
element_background_color, SK_ColorWHITE, gfx::kGoogleGrey800);
mixer[kColorNewTabPageMostVisitedTileBackground] =
SelectBasedOnWhiteNtpBackground(gfx::kGoogleGrey100,
element_background_color);
mixer[kColorNewTabPageMostVisitedTileBackgroundThemed] = {
element_background_color};
mixer[kColorNewTabPageOnThemeForeground] = themed_foreground_color;
mixer[kColorNewTabPagePrimaryForeground] = primary_foreground_color;
mixer[kColorNewTabPagePromoBackground] = element_background_color;
mixer[kColorNewTabPagePromoImageBackground] = SelectBasedOnDarkInput(
element_background_color, gfx::kGoogleGrey200, SK_ColorWHITE);
mixer[kColorNewTabPageSecondaryForeground] = SelectBasedOnDarkInput(
element_background_color,
ui::PickGoogleColor(gfx::kGoogleGrey700, element_background_color,
color_utils::kMinimumReadableContrastRatio),
ui::PickGoogleColor(gfx::kGoogleGrey500, element_background_color,
color_utils::kMinimumReadableContrastRatio));
mixer[kColorNewTabPageTagBackground] =
ui::SetAlpha(element_background_color,
/* 90% opacity */ 0.9 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageText] = SelectBasedOnDarkInput(
element_background_color, gfx::kGoogleGrey200, gfx::kGoogleGrey900);
if (base::FeatureList::IsEnabled(
ntp_features::kNtpComprehensiveThemeRealbox)) {
ui::ColorTransform background_color =
ui::GetColorWithMaxContrast(primary_foreground_color);
mixer[kColorRealboxBackground] = element_background_color;
mixer[kColorRealboxBackgroundHovered] = {
kColorToolbarBackgroundSubtleEmphasisHovered};
mixer[kColorRealboxForeground] = primary_foreground_color;
const ui::ColorTransform secondary_foreground_color =
SelectBasedOnWhiteNtpBackground(gfx::kGoogleGrey700,
primary_foreground_color);
mixer[kColorRealboxPlaceholder] = secondary_foreground_color;
}
}
// Dialog colors currently track the native theme and not the browser theme.
void AddNewTabPageDialogColors(ui::ColorMixer& mixer, bool dark_mode) {
// TODO(crbug.com/1376226): Colors defined below should come from core color
// mixer definitions to be inline with how other browser surfaces look. For
// now, until 'Customize Chrome' UI is refined, we rely on colors that match
// other WebUI surfaces.
const SkColor accent_color =
dark_mode ? gfx::kGoogleBlue300 : gfx::kGoogleBlue600;
const SkColor background_inverse =
dark_mode ? gfx::kGoogleGrey200 : gfx::kGoogleGrey900;
const SkColor border_color =
dark_mode ? gfx::kGoogleGrey700 : gfx::kGoogleGrey300;
mixer[kColorNewTabPageActionButtonBorder] = {border_color};
mixer[kColorNewTabPageActionButtonBorderHovered] = {
dark_mode ? gfx::kGoogleGrey700 : gfx::kGoogleBlue100};
mixer[kColorNewTabPageControlBackgroundSelected] =
ui::SetAlpha(accent_color,
/* 24% opacity */ 0.24 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageDialogBackgroundActive] =
ui::SetAlpha(background_inverse,
/* 16% opacity */ 0.16 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageDialogBackground] = {
kColorNewTabPageBackgroundOverride};
mixer[kColorNewTabPageDialogBorder] = {border_color};
mixer[kColorNewTabPageDialogBorderSelected] = {accent_color};
mixer[kColorNewTabPageDialogControlBackgroundHovered] =
ui::SetAlpha(background_inverse,
/* 10% opacity */ 0.1 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageDialogForeground] = {dark_mode ? gfx::kGoogleGrey200
: gfx::kGoogleGrey900};
mixer[kColorNewTabPageDialogSecondaryForeground] = {
dark_mode ? gfx::kGoogleGrey500 : gfx::kGoogleGrey700};
mixer[kColorNewTabPageSelectedBackground] =
ui::SetAlpha(dark_mode ? gfx::kGoogleBlue300 : gfx::kGoogleBlue700,
/* 16% opacity */ 0.16 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageSelectedForeground] = {dark_mode ? gfx::kGoogleBlue300
: gfx::kGoogleBlue700};
}
} // namespace
void AddNewTabPageColorMixer(ui::ColorProvider* provider,
const ui::ColorProviderKey& key) {
using ThemeType = ui::ColorProviderKey::ThemeInitializerSupplier::ThemeType;
const bool dark_mode =
key.color_mode == ui::ColorProviderKey::ColorMode::kDark;
// Non-native surfaces in GM3 rely on a prominent color that may or may not
// match the accent color.
const SkColor prominent_color =
dark_mode ? gfx::kGoogleBlue300 : gfx::kGoogleBlue600;
ui::ColorMixer& mixer = provider->AddMixer();
mixer[kColorNewTabPageActionButtonBackground] = {prominent_color};
mixer[kColorNewTabPageActionButtonForeground] =
ui::GetColorWithMaxContrast(kColorNewTabPageActionButtonBackground);
mixer[kColorNewTabPageBackground] = {kColorToolbar};
mixer[kColorNewTabPageHeader] = {SkColorSetRGB(0x96, 0x96, 0x96)};
mixer[kColorNewTabPageLogoUnthemedDark] = {gfx::kGoogleGrey700};
mixer[kColorNewTabPageLogoUnthemedLight] = {SkColorSetRGB(0xEE, 0xEE, 0xEE)};
// See GM2 spec (go/google-material) for shadow color and elevation details.
ui::ColorTransform menu_shadow_color = ui::SelectBasedOnDarkInput(
kColorNewTabPageBackground, SK_ColorBLACK, gfx::kGoogleGrey800);
mixer[kColorNewTabPageMenuInnerShadow] =
ui::SetAlpha(menu_shadow_color, /* 30% opacity */ 0.3 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageMenuOuterShadow] =
ui::SetAlpha(menu_shadow_color, /* 15% opacity */ 0.15 * SK_AlphaOPAQUE);
if (key.custom_theme) {
mixer[kColorNewTabPageMostVisitedTileBackground] =
SelectBasedOnWhiteNtpBackground(
kColorNewTabPageMostVisitedTileBackgroundUnthemed,
GetContrastingColorTransform(kColorNewTabPageBackground, 0.2f));
} else if (dark_mode) {
mixer[kColorNewTabPageMostVisitedTileBackground] = {gfx::kGoogleGrey900};
} else {
mixer[kColorNewTabPageMostVisitedTileBackground] = {
kColorNewTabPageMostVisitedTileBackgroundUnthemed};
}
mixer[kColorNewTabPageAddShortcutBackground] = {
kColorNewTabPageMostVisitedTileBackground};
mixer[kColorNewTabPageAddShortcutForeground] =
ui::SelectBasedOnDarkInput(kColorNewTabPageAddShortcutBackground,
SK_ColorWHITE, gfx::kGoogleGrey900);
mixer[kColorNewTabPageMostVisitedTileBackgroundUnthemed] = {
gfx::kGoogleGrey100};
mixer[kColorNewTabPageSectionBorder] =
ui::SetAlpha(kColorNewTabPageHeader, 0x50);
mixer[kColorNewTabPageTextUnthemed] = {gfx::kGoogleGrey050};
mixer[kColorNewTabPageTextLight] =
IncreaseLightness(kColorNewTabPageText, 0.40);
mixer[kColorRealboxBackground] = {SK_ColorWHITE};
mixer[kColorRealboxBackgroundHovered] = {SK_ColorWHITE};
mixer[kColorRealboxBorder] = {
key.contrast_mode == ui::ColorProviderKey::ContrastMode::kHigh
? kColorLocationBarBorder
: gfx::kGoogleGrey300};
mixer[kColorRealboxForeground] = {SK_ColorBLACK};
mixer[kColorRealboxPlaceholder] = {gfx::kGoogleGrey700};
mixer[kColorRealboxResultsBackground] = {SK_ColorWHITE};
mixer[kColorRealboxResultsBackgroundHovered] =
ui::SetAlpha(gfx::kGoogleGrey900,
/* 10% opacity */ 0.1 * SK_AlphaOPAQUE);
mixer[kColorRealboxResultsControlBackgroundHovered] =
ui::SetAlpha(gfx::kGoogleGrey900, /* 10% opacity */ 0.1 * SK_AlphaOPAQUE);
mixer[kColorRealboxResultsDimSelected] = {gfx::kGoogleGrey700};
mixer[kColorRealboxResultsForeground] = {SK_ColorBLACK};
mixer[kColorRealboxResultsForegroundDimmed] = {gfx::kGoogleGrey700};
mixer[kColorRealboxResultsIconSelected] = {gfx::kGoogleGrey700};
mixer[kColorRealboxResultsUrl] = {gfx::kGoogleBlue700};
mixer[kColorRealboxResultsUrlSelected] = {gfx::kGoogleBlue700};
mixer[kColorRealboxSearchIconBackground] = {gfx::kGoogleGrey700};
mixer[kColorRealboxResultsIcon] = {gfx::kGoogleGrey700};
mixer[kColorRealboxResultsIconFocusedOutline] = {gfx::kGoogleBlue600};
mixer[kColorRealboxShadow] =
ui::SetAlpha(gfx::kGoogleGrey900,
(dark_mode ? /* % opacity */ 0.32 : 0.28) * SK_AlphaOPAQUE);
if (base::FeatureList::IsEnabled(
ntp_features::kNtpComprehensiveThemeRealbox)) {
if (dark_mode) {
mixer[kColorRealboxBackground] = {kColorToolbarBackgroundSubtleEmphasis};
mixer[kColorRealboxBackgroundHovered] = {
kColorToolbarBackgroundSubtleEmphasisHovered};
}
mixer[kColorRealboxForeground] = {ui::kColorTextfieldForeground};
mixer[kColorRealboxPlaceholder] = {kColorOmniboxTextDimmed};
mixer[kColorRealboxResultsBackground] = {kColorOmniboxResultsBackground};
mixer[kColorRealboxResultsBackgroundHovered] = {
kColorOmniboxResultsBackgroundHovered};
mixer[kColorRealboxResultsControlBackgroundHovered] = ui::SetAlpha(
ui::SelectBasedOnDarkInput(kColorRealboxBackground, gfx::kGoogleGrey200,
gfx::kGoogleGrey900),
/* 10% opacity */ 0.1 * SK_AlphaOPAQUE);
mixer[kColorRealboxResultsDimSelected] = {
kColorOmniboxResultsTextDimmedSelected};
mixer[kColorRealboxResultsForeground] = {kColorOmniboxText};
mixer[kColorRealboxResultsForegroundDimmed] = {
kColorOmniboxResultsTextDimmed};
mixer[kColorRealboxResultsIcon] = {kColorOmniboxResultsIcon};
mixer[kColorRealboxResultsIconSelected] = {
kColorOmniboxResultsIconSelected};
mixer[kColorRealboxResultsUrl] = {kColorOmniboxResultsUrl};
mixer[kColorRealboxResultsUrlSelected] = {kColorOmniboxResultsUrlSelected};
mixer[kColorRealboxSearchIconBackground] = {kColorOmniboxResultsIcon};
}
AddWebThemeNewTabPageColors(mixer, dark_mode);
if (key.custom_theme &&
(key.custom_theme->get_theme_type() == ThemeType::kAutogenerated ||
features::IsChromeWebuiRefresh2023())) {
AddGeneratedThemeComprehensiveColors(mixer);
} else {
const SkColor border_color =
dark_mode ? gfx::kGoogleGrey700 : gfx::kGoogleGrey300;
mixer[kColorNewTabPageBorder] = {border_color};
mixer[kColorNewTabPageLogo] = {kColorNewTabPageLogoUnthemedLight};
mixer[kColorNewTabPageModuleControlBorder] = {border_color};
mixer[kColorNewTabPageMostVisitedForeground] = {
dark_mode ? SK_ColorWHITE : gfx::kGoogleGrey800};
mixer[kColorNewTabPageText] = {dark_mode ? gfx::kGoogleGrey200
: SK_ColorBLACK};
}
}
void AddWebThemeNewTabPageColors(ui::ColorMixer& mixer, bool dark_mode) {
// TODO(crbug.com/1375876): Once the NTP Comprehensive Theming feature has
// fully launched, remove these variables used to preserve the current GTK+
// 'Customize Chrome" appearance and instead use core mixer colors.
const SkColor accent_color =
dark_mode ? gfx::kGoogleBlue300 : gfx::kGoogleBlue600;
const SkColor primary_foreground_color =
dark_mode ? gfx::kGoogleGrey200 : gfx::kGoogleGrey900;
const SkColor secondary_foreground_color =
dark_mode ? gfx::kGoogleGrey500 : gfx::kGoogleGrey700;
mixer[kColorNewTabPageAttributionForeground] = {
dark_mode ? SK_ColorWHITE : gfx::kGoogleGrey800};
mixer[kColorNewTabPageActiveBackground] =
ui::SetAlpha(dark_mode ? gfx::kGoogleGrey200 : gfx::kGoogleGrey900,
/* 16% opacity */ 0.16 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageBackgroundOverride] = {dark_mode ? gfx::kGoogleGrey900
: SK_ColorWHITE};
mixer[kColorNewTabPageButtonBackground] = {
kColorNewTabPageBackgroundOverride};
// Matches the button hover background colors defined in
// cr_elements/cr_button/cr_button.html
mixer[kColorNewTabPageButtonBackgroundHovered] =
dark_mode ? ui::SetAlpha(gfx::kGoogleBlue300,
/* 8% opacity */ 0.08 * SK_AlphaOPAQUE)
: ui::SetAlpha(gfx::kGoogleBlue500,
/* 4% opacity */ 0.04 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageButtonForeground] = {accent_color};
mixer[kColorNewTabPageCartModuleDiscountChipBackground] = {
dark_mode ? gfx::kGoogleGrey800 : gfx::kGoogleGreen050};
mixer[kColorNewTabPageCartModuleDiscountChipForeground] = {
dark_mode ? gfx::kGoogleGreen300 : gfx::kGoogleGreen700};
mixer[kColorNewTabPageChipBackground] = {accent_color};
mixer[kColorNewTabPageChipForeground] = {kColorNewTabPageBackgroundOverride};
mixer[kColorNewTabPageControlBackgroundHovered] =
ui::SetAlpha(dark_mode ? gfx::kGoogleGrey200 : gfx::kGoogleGrey900,
/* 10% opacity */ 0.1 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageFirstRunBackground] = {
kColorNewTabPageBackgroundOverride};
mixer[kColorNewTabPageFocusRing] =
dark_mode ? ui::SetAlpha(gfx::kGoogleBlue300,
/* 50% opacity */ 0.5 * SK_AlphaOPAQUE)
: ui::SetAlpha(gfx::kGoogleBlue600,
/* 40% opacity */ 0.4 * SK_AlphaOPAQUE);
mixer[kColorNewTabPagePromoBackground] = {dark_mode ? gfx::kGoogleGrey900
: SK_ColorWHITE};
mixer[kColorNewTabPagePromoImageBackground] = {dark_mode ? gfx::kGoogleGrey200
: SK_ColorWHITE};
mixer[kColorNewTabPageIconButtonBackground] = {
dark_mode ? SK_ColorWHITE : gfx::kGoogleGrey600};
mixer[kColorNewTabPageIconButtonBackgroundActive] = {
dark_mode ? gfx::kGoogleGrey300 : gfx::kGoogleGrey700};
mixer[kColorNewTabPageLink] = {dark_mode ? gfx::kGoogleBlue300
: gfx::kGoogleBlue700};
mixer[kColorNewTabPageMicBorderColor] = {dark_mode ? gfx::kGoogleGrey100
: gfx::kGoogleGrey300};
mixer[kColorNewTabPageMicIconColor] = {dark_mode ? gfx::kGoogleGrey100
: gfx::kGoogleGrey700};
if (base::FeatureList::IsEnabled(ntp_features::kNtpModulesRedesigned)) {
if (dark_mode) {
mixer[kColorNewTabPageModuleBackground] = {gfx::kGoogleGrey800};
} else {
mixer[kColorNewTabPageModuleBackground] = {gfx::kGoogleGrey100};
}
mixer[kColorNewTabPageModuleItemBackgroundHovered] = {
kColorNewTabPageControlBackgroundHovered};
} else {
mixer[kColorNewTabPageModuleBackground] = {
kColorNewTabPageBackgroundOverride};
}
mixer[kColorNewTabPageModuleContextMenuDivider] = {
{dark_mode ? SK_ColorWHITE : gfx::kGoogleGrey600}};
mixer[kColorNewTabPageModuleElementDivider] = {
{dark_mode ? SK_ColorWHITE : gfx::kGoogleGrey600}};
mixer[kColorNewTabPageModuleItemBackground] = {
kColorNewTabPageBackgroundOverride};
if (dark_mode) {
mixer[kColorNewTabPageHistoryClustersModuleItemBackground] = {
kColorNewTabPageBackground};
} else {
mixer[kColorNewTabPageHistoryClustersModuleItemBackground] = {
gfx::kGoogleGrey100};
}
mixer[kColorNewTabPageModuleIconContainerBackground] =
ui::SetAlpha(accent_color,
/* 24% opacity */ 0.24 * SK_AlphaOPAQUE);
mixer[kColorNewTabPageModuleScrollButtonBackground] = {
dark_mode ? gfx::kGoogleGrey700 : gfx::kGoogleGrey100};
mixer[kColorNewTabPageModuleScrollButtonBackgroundHovered] = {
dark_mode ? gfx::kGoogleGrey600 : gfx::kGoogleGrey300};
mixer[kColorNewTabPagePrimaryForeground] = {primary_foreground_color};
mixer[kColorNewTabPageSecondaryForeground] = {secondary_foreground_color};
mixer[kColorNewTabPageOverlayBackground] = {
kColorNewTabPageBackgroundOverride};
mixer[kColorNewTabPageOverlayForeground] = {primary_foreground_color};
mixer[kColorNewTabPageOverlaySecondaryForeground] = {
secondary_foreground_color};
mixer[kColorNewTabPageSelectedBorder] = {accent_color};
mixer[kColorNewTabPageTagBackground] =
ui::SetAlpha(kColorNewTabPageBackgroundOverride,
/* 90% opacity */ 0.9 * SK_AlphaOPAQUE);
AddNewTabPageDialogColors(mixer, dark_mode);
}