ladybird/UI/Qt/ChromeStyle.cpp
Andreas Kling 8d4493a789 UI/Qt: Tint missing find-in-page results
Mark the search field with a dynamic property when a find-in-page query
has zero matches, and let the chrome stylesheet show a red-tinted
background. Clear the state immediately for empty searches.
2026-06-11 11:15:25 +02:00

921 lines
26 KiB
C++

/*
* Copyright (c) 2026-present, the Ladybird developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <UI/Qt/ChromeStyle.h>
#include <UI/Qt/StringUtils.h>
#include <AK/Platform.h>
#include <QGuiApplication>
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
# include <QStyleHints>
#endif
namespace Ladybird::ChromeStyle {
static bool color_is_dark(QColor const& color)
{
return color.lightness() < 128;
}
static bool palette_is_dark(QPalette const& palette)
{
return color_is_dark(palette.color(QPalette::Window));
}
bool is_dark(QPalette const& palette)
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
auto color_scheme = QGuiApplication::styleHints()->colorScheme();
if (color_scheme != Qt::ColorScheme::Unknown)
return color_scheme == Qt::ColorScheme::Dark;
#endif
return palette_is_dark(palette);
}
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
static bool palette_roles_match_color_scheme(QPalette const& palette, bool dark)
{
return color_is_dark(palette.color(QPalette::Window)) == dark
&& color_is_dark(palette.color(QPalette::Base)) == dark
&& color_is_dark(palette.color(QPalette::Text)) != dark
&& color_is_dark(palette.color(QPalette::ButtonText)) != dark;
}
#endif
static bool palette_matches_current_color_scheme(QPalette const& palette)
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
auto color_scheme = QGuiApplication::styleHints()->colorScheme();
if (color_scheme == Qt::ColorScheme::Dark)
return palette_roles_match_color_scheme(palette, true);
if (color_scheme == Qt::ColorScheme::Light)
return palette_roles_match_color_scheme(palette, false);
#endif
Q_UNUSED(palette);
return true;
}
static QColor chrome_window(QPalette const& palette)
{
if (palette_matches_current_color_scheme(palette))
return palette.color(QPalette::Window);
return is_dark(palette) ? QColor(24, 25, 28) : QColor(245, 245, 246);
}
static QColor chrome_base(QPalette const& palette)
{
if (palette_matches_current_color_scheme(palette))
return palette.color(QPalette::Base);
return is_dark(palette) ? QColor(22, 23, 26) : QColor(255, 255, 255);
}
struct MaterialColorAnchors {
QColor background;
QColor surface;
QColor recessed;
QColor hover;
QColor pressed;
QColor border;
};
static MaterialColorAnchors material_color_anchors(bool dark)
{
if (dark) {
return {
.background = QColor(13, 15, 18),
.surface = QColor(34, 36, 40),
.recessed = QColor(55, 58, 63),
.hover = QColor(57, 61, 66),
.pressed = QColor(70, 74, 80),
.border = QColor(150, 155, 162),
};
}
return {
.background = QColor(236, 236, 237),
.surface = QColor(255, 255, 255),
.recessed = QColor(150, 150, 152),
.hover = QColor(229, 229, 230),
.pressed = QColor(219, 220, 221),
.border = QColor(95, 96, 98),
};
}
QColor mix(QColor const& from, QColor const& to, double amount)
{
auto channel = [&](int from_channel, int to_channel) {
return static_cast<int>(from_channel + (to_channel - from_channel) * amount);
};
return QColor {
channel(from.red(), to.red()),
channel(from.green(), to.green()),
channel(from.blue(), to.blue()),
};
}
QColor chrome_background(QPalette const& palette)
{
auto window = chrome_window(palette);
auto dark = is_dark(palette);
return mix(window, material_color_anchors(dark).background, dark ? 0.34 : 0.68);
}
QColor chrome_surface(QPalette const& palette)
{
auto base = chrome_base(palette);
auto dark = is_dark(palette);
return mix(base, material_color_anchors(dark).surface, dark ? 0.64 : 0.72);
}
QColor chrome_surface_recessed(QPalette const& palette)
{
auto dark = is_dark(palette);
if (dark)
return chrome_background(palette).lighter(108);
return mix(chrome_background(palette), material_color_anchors(dark).recessed, 0.42);
}
QColor chrome_surface_hover(QPalette const& palette)
{
auto dark = is_dark(palette);
return mix(chrome_surface(palette), material_color_anchors(dark).hover, dark ? 0.34 : 0.52);
}
QColor chrome_surface_pressed(QPalette const& palette)
{
auto dark = is_dark(palette);
return mix(chrome_surface(palette), material_color_anchors(dark).pressed, dark ? 0.48 : 0.56);
}
static QColor chrome_control_surface_hover(QPalette const& palette)
{
auto dark = is_dark(palette);
return mix(chrome_surface(palette), material_color_anchors(dark).hover, dark ? 0.82 : 0.62);
}
static QColor chrome_control_surface_pressed(QPalette const& palette)
{
auto dark = is_dark(palette);
return mix(chrome_surface(palette), material_color_anchors(dark).pressed, dark ? 0.86 : 0.66);
}
QColor chrome_control_border(QPalette const& palette)
{
auto dark = is_dark(palette);
if (dark)
return mix(chrome_control_surface_hover(palette), material_color_anchors(dark).border, 0.42);
return mix(chrome_border(palette), material_color_anchors(dark).border, 0.18);
}
QColor chrome_active_tab_surface_top(QPalette const& palette)
{
auto dark = is_dark(palette);
if (!dark)
return QColor(255, 255, 255);
auto background = chrome_background(palette);
return mix(background, QColor(255, 255, 255), 0.22);
}
QColor chrome_active_tab_surface_bottom(QPalette const& palette)
{
auto dark = is_dark(palette);
if (!dark)
return QColor(251, 251, 251);
auto background = chrome_background(palette);
return mix(background, QColor(255, 255, 255), 0.20);
}
QColor chrome_border(QPalette const& palette)
{
auto dark = is_dark(palette);
return mix(dark ? chrome_surface(palette) : chrome_background(palette), material_color_anchors(dark).border, 0.22);
}
QColor chrome_accent(QPalette const& palette)
{
return palette.color(QPalette::Highlight);
}
QColor chrome_text(QPalette const& palette)
{
if (palette_matches_current_color_scheme(palette))
return palette.color(QPalette::Text);
return is_dark(palette) ? QColor(238, 241, 246) : QColor(24, 29, 36);
}
QColor chrome_button_text(QPalette const& palette)
{
if (palette_matches_current_color_scheme(palette))
return palette.color(QPalette::ButtonText);
return chrome_text(palette);
}
QColor chrome_muted_text(QPalette const& palette)
{
if (!palette_matches_current_color_scheme(palette))
return is_dark(palette) ? QColor(154, 163, 176) : QColor(98, 108, 122);
return palette.color(QPalette::PlaceholderText);
}
static QColor chrome_destructive_hover()
{
return QColor(196, 43, 28);
}
static QColor chrome_destructive_text()
{
return QColor(255, 255, 255);
}
QString style_sheet_color(QColor const& color)
{
return qformatted("rgb({}, {}, {})", color.red(), color.green(), color.blue());
}
QString application_style_sheet(QPalette const& palette)
{
auto surface_color = chrome_surface(palette);
auto text_color = chrome_text(palette);
auto surface = style_sheet_color(surface_color);
auto hover = style_sheet_color(chrome_control_surface_hover(palette));
auto pressed = style_sheet_color(chrome_control_surface_pressed(palette));
auto border = style_sheet_color(chrome_border(palette));
auto separator = style_sheet_color(mix(chrome_surface(palette), chrome_border(palette), is_dark(palette) ? 0.42 : 0.54));
auto text = style_sheet_color(text_color);
auto disabled_text = style_sheet_color(mix(text_color, surface_color, is_dark(palette) ? 0.58 : 0.48));
return qformatted(R"(
QMenu {{
color: {5};
background: {0};
border: 1px solid {3};
border-radius: 7px;
padding: 5px;
}}
QMenu::item {{
color: {5};
background: transparent;
border-radius: 5px;
min-height: 20px;
padding: 5px 14px;
}}
QMenu::item:selected {{
background: {1};
}}
QMenu::item:pressed {{
background: {2};
}}
QMenu::item:disabled {{
color: {6};
}}
QMenu::icon {{
left: 8px;
}}
)"
#if defined(AK_OS_MACOS)
R"(
QMenu::right-arrow,
QMenu::left-arrow {{
width: 8px;
height: 8px;
}}
)"
#endif
R"(
QMenu::separator {{
background: {4};
height: 1px;
margin: 5px 8px;
}}
)",
surface, hover, pressed, border, separator, text, disabled_text);
}
QString toolbar_container_style_sheet(QPalette const& palette)
{
auto background = style_sheet_color(chrome_background(palette));
auto surface_hover = style_sheet_color(chrome_control_surface_hover(palette));
auto surface_pressed = style_sheet_color(chrome_control_surface_pressed(palette));
auto control_border = style_sheet_color(chrome_control_border(palette));
auto separator = style_sheet_color(chrome_border(palette));
auto window_controls_separator = style_sheet_color(mix(chrome_background(palette), chrome_border(palette), is_dark(palette) ? 0.36 : 0.46));
auto text = style_sheet_color(chrome_button_text(palette));
auto disabled_text = style_sheet_color(chrome_muted_text(palette));
auto close_hover = style_sheet_color(chrome_destructive_hover());
auto close_text = style_sheet_color(chrome_destructive_text());
return qformatted(R"(
QWidget#LadybirdToolbarContainer {{
background: {0};
border: 0;
border-bottom: 1px solid {4};
}}
QWidget#LadybirdToolbarContainer[fullWidthToolbar="true"] {{
border-bottom: 0;
}}
QWidget#LadybirdNavigationToolbar QToolButton {{
color: {5};
background: transparent;
border: 1px solid transparent;
border-radius: 17px;
min-width: 34px;
min-height: 34px;
margin: 1px 0;
padding: 0;
}}
QWidget#LadybirdNavigationToolbar QToolButton:hover {{
background: {1};
border-color: {3};
}}
QWidget#LadybirdNavigationToolbar QToolButton:pressed,
QWidget#LadybirdNavigationToolbar QToolButton:checked {{
background: {2};
border-color: {3};
}}
QWidget#LadybirdNavigationToolbar QToolButton:disabled {{
color: {6};
background: transparent;
border-color: transparent;
}}
QWidget#LadybirdNavigationToolbar QToolButton::menu-indicator {{
image: none;
}}
QWidget#LadybirdToolbarWindowControlsSeparator {{
background: {9};
}}
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdWindowButton,
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdCloseWindowButton {{
color: {5};
background: transparent;
border: 0;
border-radius: 0;
min-width: 38px;
min-height: 38px;
max-width: 38px;
max-height: 38px;
margin: 0;
padding: 0;
}}
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdWindowButton:hover {{
background: {1};
}}
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdWindowButton:pressed {{
background: {2};
}}
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdCloseWindowButton:hover {{
color: {8};
background: {7};
}}
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdCloseWindowButton:pressed {{
color: {8};
background: {7};
}}
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdWindowButton[pressedOutside="true"],
QWidget#LadybirdNavigationToolbar QToolButton#LadybirdCloseWindowButton[pressedOutside="true"] {{
color: {5};
background: transparent;
}}
)",
background, surface_hover, surface_pressed, control_border, separator, text, disabled_text, close_hover, close_text, window_controls_separator);
}
QString menu_bar_style_sheet(QPalette const& palette)
{
auto background = style_sheet_color(chrome_background(palette));
auto background_bottom = background;
auto hover = style_sheet_color(chrome_control_surface_hover(palette));
auto pressed = style_sheet_color(chrome_control_surface_pressed(palette));
auto control_border = style_sheet_color(chrome_control_border(palette));
auto text = style_sheet_color(chrome_button_text(palette));
auto disabled_text = style_sheet_color(chrome_muted_text(palette));
auto close_hover = style_sheet_color(chrome_destructive_hover());
auto close_text = style_sheet_color(chrome_destructive_text());
return qformatted(R"(
QMenuBar#LadybirdMenuBar {{
color: {5};
background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 {0}, stop:1 {1});
border: 0;
padding: 0 4px 0 8px;
spacing: 2px;
}}
QMenuBar#LadybirdMenuBar::item {{
color: {5};
background: transparent;
border: 1px solid transparent;
border-radius: 6px;
padding: 4px 9px;
}}
QMenuBar#LadybirdMenuBar::item:selected {{
background: {2};
border-color: {4};
}}
QMenuBar#LadybirdMenuBar::item:pressed {{
background: {3};
border-color: {4};
}}
QMenuBar#LadybirdMenuBar::item:disabled {{
color: {6};
}}
QMenuBar#LadybirdMenuBar QWidget#LadybirdMenuBarWindowControls {{
background: transparent;
}}
QMenuBar#LadybirdMenuBar QToolButton#LadybirdWindowButton,
QMenuBar#LadybirdMenuBar QToolButton#LadybirdCloseWindowButton {{
color: {5};
background: transparent;
border: 0;
border-radius: 0;
min-width: 40px;
min-height: 30px;
max-height: 30px;
padding: 0;
}}
QMenuBar#LadybirdMenuBar QToolButton#LadybirdWindowButton:hover {{
background: {2};
}}
QMenuBar#LadybirdMenuBar QToolButton#LadybirdWindowButton:pressed {{
background: {3};
}}
QMenuBar#LadybirdMenuBar QToolButton#LadybirdCloseWindowButton:hover {{
color: {8};
background: {7};
}}
QMenuBar#LadybirdMenuBar QToolButton#LadybirdCloseWindowButton:pressed {{
color: {8};
background: {7};
}}
QMenuBar#LadybirdMenuBar QToolButton#LadybirdWindowButton[pressedOutside="true"],
QMenuBar#LadybirdMenuBar QToolButton#LadybirdCloseWindowButton[pressedOutside="true"] {{
color: {5};
background: transparent;
}}
)",
background, background_bottom, hover, pressed, control_border, text, disabled_text, close_hover, close_text);
}
QString location_edit_style_sheet(QPalette const& palette)
{
auto dark = is_dark(palette);
auto surface_color = chrome_surface(palette);
if (dark)
surface_color = mix(chrome_background(palette), material_color_anchors(true).background, 0.34);
auto hover_color = surface_color;
auto focus_color = dark ? mix(surface_color, QColor(255, 255, 255), 0.035) : surface_color;
auto border_color = dark ? mix(chrome_background(palette), chrome_border(palette), 0.36) : chrome_border(palette);
auto hover_border_color = border_color;
auto focus_border_color = mix(chrome_border(palette), chrome_accent(palette), dark ? 0.50 : 0.54);
auto surface = style_sheet_color(surface_color);
auto hover = style_sheet_color(hover_color);
auto focus = style_sheet_color(focus_color);
auto border = style_sheet_color(border_color);
auto hover_border = style_sheet_color(hover_border_color);
auto focus_border = style_sheet_color(focus_border_color);
auto text = style_sheet_color(dark ? mix(chrome_text(palette), QColor(255, 255, 255), 0.08) : chrome_text(palette));
auto placeholder = style_sheet_color(mix(chrome_muted_text(palette), surface_color, dark ? 0.46 : 0.34));
auto selection = style_sheet_color(chrome_accent(palette));
auto selection_text = style_sheet_color(palette.color(QPalette::HighlightedText));
auto not_secure_text = style_sheet_color(dark ? QColor(224, 142, 136) : QColor(144, 62, 56));
auto not_secure_background = style_sheet_color(dark ? mix(surface_color, QColor(102, 52, 48), 0.28) : QColor(246, 235, 233));
auto not_secure_hover = style_sheet_color(dark ? mix(surface_color, QColor(104, 55, 51), 0.34) : QColor(242, 226, 223));
auto not_secure_pressed = style_sheet_color(dark ? mix(surface_color, QColor(112, 60, 55), 0.40) : QColor(236, 215, 211));
auto not_secure_border = style_sheet_color(dark ? mix(QColor(92, 48, 45), chrome_border(palette), 0.52) : QColor(224, 203, 199));
auto zoom_text = style_sheet_color(chrome_muted_text(palette));
auto zoom_background = style_sheet_color(dark ? mix(surface_color, chrome_surface_recessed(palette), 0.28) : mix(surface_color, chrome_surface_recessed(palette), 0.14));
auto zoom_hover = style_sheet_color(dark ? mix(surface_color, chrome_surface_recessed(palette), 0.36) : mix(surface_color, chrome_surface_recessed(palette), 0.20));
auto zoom_pressed = style_sheet_color(dark ? mix(surface_color, chrome_surface_recessed(palette), 0.44) : mix(surface_color, chrome_surface_recessed(palette), 0.28));
auto zoom_border = style_sheet_color(dark ? mix(chrome_border(palette), surface_color, 0.38) : mix(chrome_border(palette), surface_color, 0.54));
return qformatted(R"(
QLineEdit#LadybirdLocationEdit {{
color: {4};
background: {0};
border: 1px solid {2};
border-radius: 16px;
min-height: 32px;
padding: 0 16px;
selection-background-color: {6};
selection-color: {7};
placeholder-text-color: {5};
}}
QLineEdit#LadybirdLocationEdit:hover {{
background: {1};
border-color: {8};
}}
QLineEdit#LadybirdLocationEdit:focus {{
background: {19};
border-color: {3};
}}
QLineEdit#LadybirdLocationEdit:disabled {{
color: {5};
border-color: {2};
}}
QToolButton#LadybirdLocationIcon {{
background: transparent;
border: 0;
padding: 0;
}}
QToolButton#LadybirdLocationIcon[notSecure="true"] {{
color: {9};
background: {10};
border: 1px solid {13};
border-radius: 10px;
padding: 0 7px;
font-weight: 500;
}}
QToolButton#LadybirdLocationIcon[notSecure="true"]:hover {{
background: {11};
}}
QToolButton#LadybirdLocationIcon[notSecure="true"]:pressed {{
background: {12};
}}
QToolButton#LadybirdLocationZoomIndicator {{
color: {14};
background: {15};
border: 1px solid {18};
border-radius: 10px;
padding: 0 7px;
font-weight: 500;
}}
QToolButton#LadybirdLocationZoomIndicator:hover {{
background: {16};
}}
QToolButton#LadybirdLocationZoomIndicator:pressed {{
background: {17};
}}
QToolButton#LadybirdLocationAction {{
background: transparent;
border: 0;
margin: 1px;
padding: 0;
}}
)",
surface, hover, border, focus_border, text, placeholder, selection, selection_text, hover_border,
not_secure_text, not_secure_background, not_secure_hover, not_secure_pressed, not_secure_border, zoom_text, zoom_background, zoom_hover, zoom_pressed, zoom_border, focus);
}
QString bookmarks_bar_style_sheet(QPalette const& palette)
{
auto hover = style_sheet_color(chrome_control_surface_hover(palette));
auto pressed = style_sheet_color(chrome_control_surface_pressed(palette));
auto control_border = style_sheet_color(chrome_control_border(palette));
auto text = style_sheet_color(chrome_button_text(palette));
return qformatted(R"(
QToolBar#LadybirdBookmarksBar {{
color: {2};
border: 0;
padding: 1px 4px;
spacing: 3px;
}}
QToolBar#LadybirdBookmarksBar QToolButton {{
color: {2};
background: transparent;
border: 1px solid transparent;
border-radius: 7px;
}}
QToolBar#LadybirdBookmarksBar QToolButton:hover {{
background: {0};
border-color: {3};
}}
QToolBar#LadybirdBookmarksBar QToolButton:pressed,
QToolBar#LadybirdBookmarksBar QToolButton:checked {{
background: {1};
border-color: {3};
}}
)",
hover, pressed, text, control_border);
}
QString find_in_page_style_sheet(QPalette const& palette)
{
auto background = style_sheet_color(chrome_background(palette));
auto surface_color = chrome_surface(palette);
auto surface = style_sheet_color(surface_color);
auto hover = style_sheet_color(chrome_control_surface_hover(palette));
auto pressed = style_sheet_color(chrome_control_surface_pressed(palette));
auto border = style_sheet_color(chrome_border(palette));
auto control_border_color = chrome_control_border(palette);
auto control_border = style_sheet_color(control_border_color);
auto accent = style_sheet_color(chrome_accent(palette));
auto text = style_sheet_color(chrome_text(palette));
auto muted = style_sheet_color(chrome_muted_text(palette));
auto no_results_background = style_sheet_color(mix(surface_color, chrome_destructive_hover(), is_dark(palette) ? 0.34 : 0.18));
auto no_results_border = style_sheet_color(mix(control_border_color, chrome_destructive_hover(), is_dark(palette) ? 0.72 : 0.58));
return qformatted(R"(
QWidget#LadybirdFindInPageBar {{
background: {0};
border-top: 1px solid {4};
}}
QWidget#LadybirdFindInPageBar QLineEdit {{
color: {7};
background: {1};
border: 1px solid {4};
border-radius: 8px;
min-height: 26px;
padding: 2px 9px;
selection-background-color: {6};
}}
QWidget#LadybirdFindInPageBar QLineEdit:focus {{
border-color: {6};
}}
QWidget#LadybirdFindInPageBar QLineEdit[noResults="true"] {{
background: {9};
border-color: {10};
}}
QWidget#LadybirdFindInPageBar QPushButton {{
color: {7};
background: transparent;
border: 1px solid transparent;
border-radius: 7px;
min-height: 26px;
}}
QWidget#LadybirdFindInPageBar QPushButton:hover {{
background: {2};
border-color: {5};
}}
QWidget#LadybirdFindInPageBar QPushButton:pressed {{
background: {3};
border-color: {5};
}}
QWidget#LadybirdFindInPageBar QCheckBox,
QWidget#LadybirdFindInPageBar QLabel {{
color: {8};
}}
)",
background, surface, hover, pressed, border, control_border, accent, text, muted, no_results_background, no_results_border);
}
QString devtools_banner_style_sheet(QPalette const& palette)
{
auto background = style_sheet_color(chrome_background(palette));
auto border = style_sheet_color(chrome_border(palette));
auto control_border = style_sheet_color(chrome_control_border(palette));
auto hover = style_sheet_color(chrome_surface_hover(palette));
auto pressed = style_sheet_color(chrome_surface_pressed(palette));
auto text = style_sheet_color(chrome_text(palette));
return qformatted(R"(
QWidget#LadybirdDevToolsBanner {{
background: {0};
border-top: 1px solid {1};
}}
QWidget#LadybirdDevToolsBanner QLabel,
QWidget#LadybirdDevToolsBanner QPushButton {{
background: transparent;
color: {5};
}}
QWidget#LadybirdDevToolsBanner QPushButton:hover {{
background: {3};
border-color: {2};
}}
QWidget#LadybirdDevToolsBanner QPushButton:pressed {{
background: {4};
border-color: {2};
}}
)",
background, border, control_border, hover, pressed, text);
}
QString tab_widget_style_sheet(QPalette const& palette)
{
auto dark = is_dark(palette);
auto chrome_background_color = chrome_background(palette);
auto background = style_sheet_color(chrome_background_color);
auto hover = style_sheet_color(chrome_control_surface_hover(palette));
auto pressed = style_sheet_color(chrome_control_surface_pressed(palette));
auto control_border = style_sheet_color(chrome_control_border(palette));
auto text = style_sheet_color(chrome_button_text(palette));
auto close_hover = style_sheet_color(chrome_destructive_hover());
auto close_text = style_sheet_color(chrome_destructive_text());
auto strip_separator = style_sheet_color(chrome_border(palette));
auto sidebar_separator = style_sheet_color(mix(chrome_background_color, chrome_border(palette), dark ? 0.44 : 0.58));
auto sidebar_separator_hover = style_sheet_color(mix(chrome_background_color, chrome_border(palette), dark ? 0.64 : 0.76));
auto vertical_tab_button_background_color = style_sheet_color(chrome_active_tab_surface_top(palette));
return qformatted(R"(
QWidget#LadybirdTabStrip {{
color: {4};
background: {0};
border: 0;
border-bottom: 1px solid {7};
}}
QWidget#LadybirdVerticalTabBar {{
color: {4};
background: {0};
border-right: 1px solid {8};
}}
QWidget#LadybirdVerticalTabBar[hovered="true"],
QWidget#LadybirdVerticalTabBar[active="true"] {{
border-right: 1px solid {9};
}}
QWidget#LadybirdVerticalTabsResizeHandle {{
background: transparent;
border: 0;
}}
QWidget#LadybirdVerticalTabsContentSeparator {{
background: {7};
border: 0;
min-height: 1px;
max-height: 1px;
}}
QPushButton#LadybirdAudioState,
QToolButton#LadybirdNewTabButton,
QPushButton#LadybirdTabButton {{
color: {4};
background: transparent;
border: 1px solid transparent;
border-radius: 11px;
padding: 0;
}}
QToolButton#LadybirdNewTabButton {{
min-width: 30px;
min-height: 30px;
border-radius: 16px;
}}
QPushButton#LadybirdAudioState,
QPushButton#LadybirdTabButton {{
min-width: 22px;
min-height: 22px;
max-width: 22px;
max-height: 22px;
}}
QPushButton#LadybirdAudioState[collapsedVerticalTabButton="true"] {{
min-width: 18px;
min-height: 18px;
max-width: 18px;
max-height: 18px;
border-radius: 9px;
}}
QPushButton#LadybirdTabButton[collapsedVerticalTabButton="true"] {{
min-width: 16px;
min-height: 16px;
max-width: 16px;
max-height: 16px;
background: {10};
border-color: {1};
border-radius: 8px;
}}
QPushButton#LadybirdAudioState:hover,
QToolButton#LadybirdNewTabButton[verticalTabsButton="false"]:hover,
QPushButton#LadybirdTabButton:hover {{
color: {4};
background: {1};
border-color: {3};
}}
QPushButton#LadybirdAudioState:pressed,
QPushButton#LadybirdAudioState:checked,
QToolButton#LadybirdNewTabButton[verticalTabsButton="false"]:pressed,
QPushButton#LadybirdTabButton:pressed,
QPushButton#LadybirdTabButton:checked {{
color: {4};
background: {2};
border-color: {3};
}}
QToolButton#LadybirdWindowButton,
QToolButton#LadybirdCloseWindowButton {{
color: {4};
background: transparent;
border: 0;
border-radius: 0;
min-width: 40px;
min-height: 40px;
padding: 0;
}}
QToolButton#LadybirdWindowButton:hover {{
background: {1};
}}
QToolButton#LadybirdWindowButton:pressed {{
background: {2};
}}
QToolButton#LadybirdCloseWindowButton:hover {{
color: {6};
background: {5};
}}
QToolButton#LadybirdCloseWindowButton:pressed {{
color: {6};
background: {5};
}}
QToolButton#LadybirdWindowButton[pressedOutside="true"],
QToolButton#LadybirdCloseWindowButton[pressedOutside="true"] {{
color: {4};
background: transparent;
}}
)",
background, hover, pressed, control_border, text, close_hover, close_text, strip_separator,
sidebar_separator, sidebar_separator_hover, vertical_tab_button_background_color);
}
QString autocomplete_popup_style_sheet(QPalette const& palette)
{
auto surface = style_sheet_color(chrome_surface(palette));
auto border = style_sheet_color(chrome_border(palette));
auto text = style_sheet_color(chrome_text(palette));
return qformatted(R"(
QFrame#LadybirdAutocompletePopup {{
color: {2};
background: {0};
border: 1px solid {1};
border-radius: 8px;
}}
QListView#LadybirdAutocompleteList {{
color: {2};
background: transparent;
border: 0;
outline: 0;
}}
)",
surface, border, text);
}
}