let skip_label = btn.label.as_str().is_empty() && (has_icon || has_image || has_trailing_icon);
let mut label_style: Vec<CssPropertyWithConditions> = resolved_label_style.as_slice().to_vec();
let Some(state) = data.downcast_ref::<crate::widgets::progressbar::ProgressBarLocalDataset>()
CssPropertyWithConditions::simple(CssProperty::const_flex_direction(LayoutFlexDirection::Row)),
pub const ROW_HOVER_DARK: CssPropertyWithConditions = CssPropertyWithConditions::dark_on_hover(
pub const FOCUS_BORDER_BOTTOM: CssPropertyWithConditions = CssPropertyWithConditions::on_focus(
pub const OPTION_HOVER_DARK: CssPropertyWithConditions = CssPropertyWithConditions::dark_on_hover(
pub const HOVER_BORDER_BOTTOM: CssPropertyWithConditions = CssPropertyWithConditions::on_hover(
/// * `Default` is the neutral grey button, so its surface belongs to the PAGE and its dark states
/// * Every other type carries its own semantic colour — a Primary button is blue whichever mode the
/// app is in — so the same hover and pressed colours apply in dark mode. A neutral grey hover on
// * fills: `DARK_HT` for the hovered header face and `DARK_PT` for the pressed one (a header is a
// `DARK_GLOW`, the translucent accent, for the focused row, so it stays distinguishable from a
// hover underline and the hover ring, `DARK_ACC` for the focus ring — and the pressed header's
const LIST_EDGE_TOP_1PX: CssProperty = CssProperty::const_border_top_width(LayoutBorderTopWidth {
const LIST_EDGE_TOP_SOLID: CssProperty = CssProperty::const_border_top_style(StyleBorderTopStyle {
pub const LIST_HEADER_ACTIVE_BG: CssPropertyWithConditions = CssPropertyWithConditions::on_active(
pub const fn hover_border_both(light: ColorU, dark: ColorU) -> [CssPropertyWithConditions; 8] {
pub const fn focus_border_both(light: ColorU, dark: ColorU) -> [CssPropertyWithConditions; 8] {
pub const fn hover_text_color_both(light: ColorU, dark: ColorU) -> [CssPropertyWithConditions; 2] {