Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
343 changes: 29 additions & 314 deletions crates/bevy_feathers/src/dark_theme.rs
Original file line number Diff line number Diff line change
@@ -1,319 +1,34 @@
//! The standard `bevy_feathers` dark theme.
use crate::{palette, tokens};
use bevy_color::{Alpha, Color, Luminance};
use bevy_platform::collections::HashMap;
use crate::theme::{
build_theme, default_axis_colors, default_token_slots, EditablePalette, OklchaArray, ThemeProps,
};
use bevy_color::Oklcha;

use crate::theme::ThemeProps;

/// Create a [`ThemeProps`] object and populate it with the colors for the default dark theme.
/// Default feathers dark palette
pub fn create_dark_theme() -> ThemeProps {
ThemeProps {
color: HashMap::from([
(tokens::WINDOW_BG, palette::GRAY_0),
(tokens::FOCUS_RING, palette::ACCENT.with_alpha(0.5)),
(tokens::TEXT_MAIN, palette::LIGHT_GRAY_1),
(tokens::TEXT_DIM, palette::LIGHT_GRAY_2),
// Button (normal)
(tokens::BUTTON_BG, palette::GRAY_3),
(tokens::BUTTON_BG_HOVER, palette::GRAY_3.lighter(0.05)),
(tokens::BUTTON_BG_PRESSED, palette::GRAY_3.lighter(0.1)),
(tokens::BUTTON_BG_DISABLED, palette::GRAY_2),
// Button (primary)
(tokens::BUTTON_PRIMARY_BG, palette::ACCENT),
(
tokens::BUTTON_PRIMARY_BG_HOVER,
palette::ACCENT.lighter(0.05),
),
(
tokens::BUTTON_PRIMARY_BG_PRESSED,
palette::ACCENT.lighter(0.1),
),
(tokens::BUTTON_PRIMARY_BG_DISABLED, palette::GRAY_2),
// Button (plain)
(tokens::BUTTON_PLAIN_BG, Color::NONE),
(tokens::BUTTON_PLAIN_BG_HOVER, palette::GRAY_2),
(tokens::BUTTON_PLAIN_BG_PRESSED, palette::GRAY_3),
(tokens::BUTTON_PLAIN_BG_DISABLED, Color::NONE),
// Button text
(tokens::BUTTON_TEXT, palette::WHITE),
(tokens::BUTTON_TEXT_DISABLED, palette::WHITE.with_alpha(0.5)),
(tokens::BUTTON_PRIMARY_TEXT, palette::WHITE),
(
tokens::BUTTON_PRIMARY_TEXT_DISABLED,
palette::WHITE.with_alpha(0.5),
),
// Slider
(tokens::SLIDER_BG, palette::LIGHT_GRAY_MIX.with_alpha(0.028)),
(
tokens::SLIDER_BG_HOVER,
palette::LIGHT_GRAY_MIX.with_alpha(0.045),
),
(
tokens::SLIDER_BG_PRESSED,
palette::LIGHT_GRAY_MIX.with_alpha(0.045),
),
(tokens::SLIDER_BG_DISABLED, palette::GRAY_1),
(tokens::SLIDER_BAR, palette::ACCENT),
(tokens::SLIDER_BAR_HOVER, palette::ACCENT.lighter(0.05)),
(tokens::SLIDER_BAR_PRESSED, palette::ACCENT.lighter(0.05)),
(tokens::SLIDER_BAR_DISABLED, palette::GRAY_2),
(tokens::SLIDER_TEXT, palette::WHITE),
(tokens::SLIDER_TEXT_DISABLED, palette::WHITE.with_alpha(0.5)),
// Scrollbar
(tokens::SCROLLBAR_BG, palette::GRAY_2),
(tokens::SCROLLBAR_THUMB, palette::ACCENT),
(tokens::SCROLLBAR_THUMB_HOVER, palette::ACCENT.lighter(0.1)),
// Checkbox
(tokens::CHECKBOX_BG, palette::GRAY_3),
(tokens::CHECKBOX_BG_HOVER, palette::GRAY_3),
(tokens::CHECKBOX_BG_PRESSED, palette::GRAY_3),
(
tokens::CHECKBOX_BG_DISABLED,
palette::GRAY_1.with_alpha(0.5),
),
(tokens::CHECKBOX_BG_CHECKED, palette::ACCENT),
(
tokens::CHECKBOX_BG_CHECKED_HOVER,
palette::ACCENT.lighter(0.05),
),
(
tokens::CHECKBOX_BG_CHECKED_PRESSED,
palette::ACCENT.lighter(0.1),
),
(
tokens::CHECKBOX_BG_CHECKED_DISABLED,
palette::GRAY_1.with_alpha(0.5),
),
(tokens::CHECKBOX_BORDER, palette::GRAY_3),
(tokens::CHECKBOX_BORDER_HOVER, palette::GRAY_3.lighter(0.05)),
(
tokens::CHECKBOX_BORDER_PRESSED,
palette::GRAY_3.lighter(0.1),
),
(
tokens::CHECKBOX_BORDER_DISABLED,
palette::GRAY_3.with_alpha(0.5),
),
(tokens::CHECKBOX_BORDER_CHECKED, palette::ACCENT),
(
tokens::CHECKBOX_BORDER_CHECKED_HOVER,
palette::ACCENT.lighter(0.05),
),
(
tokens::CHECKBOX_BORDER_CHECKED_PRESSED,
palette::ACCENT.lighter(0.1),
),
(
tokens::CHECKBOX_BORDER_CHECKED_DISABLED,
palette::GRAY_3.with_alpha(0.5),
),
(tokens::CHECKBOX_MARK, palette::WHITE),
(tokens::CHECKBOX_MARK_DISABLED, palette::LIGHT_GRAY_2),
(tokens::CHECKBOX_TEXT, palette::LIGHT_GRAY_1),
(
tokens::CHECKBOX_TEXT_DISABLED,
palette::LIGHT_GRAY_1.with_alpha(0.5),
),
// Radio (default look is no background)
(tokens::RADIO_BG, Color::NONE),
(tokens::RADIO_BG_HOVER, Color::NONE),
(tokens::RADIO_BG_PRESSED, Color::NONE),
(tokens::RADIO_BG_DISABLED, Color::NONE),
(tokens::RADIO_BG_CHECKED, Color::NONE),
(tokens::RADIO_BG_CHECKED_HOVER, Color::NONE),
(tokens::RADIO_BG_CHECKED_PRESSED, Color::NONE),
(tokens::RADIO_BG_CHECKED_DISABLED, Color::NONE),
(tokens::RADIO_BORDER, palette::GRAY_3),
(tokens::RADIO_BORDER_HOVER, palette::GRAY_3.lighter(0.05)),
(tokens::RADIO_BORDER_PRESSED, palette::GRAY_3.lighter(0.1)),
(
tokens::RADIO_BORDER_DISABLED,
palette::GRAY_3.with_alpha(0.5),
),
(tokens::RADIO_BORDER_CHECKED, palette::ACCENT),
(
tokens::RADIO_BORDER_CHECKED_HOVER,
palette::ACCENT.lighter(0.05),
),
(
tokens::RADIO_BORDER_CHECKED_PRESSED,
palette::ACCENT.lighter(0.1),
),
(
tokens::RADIO_BORDER_CHECKED_DISABLED,
palette::GRAY_3.with_alpha(0.5),
),
(tokens::RADIO_MARK, palette::ACCENT),
(tokens::RADIO_MARK_HOVER, palette::ACCENT.lighter(0.05)),
(tokens::RADIO_MARK_PRESSED, palette::ACCENT.lighter(0.1)),
(tokens::RADIO_MARK_DISABLED, palette::GRAY_3.with_alpha(0.5)),
(tokens::RADIO_TEXT, palette::LIGHT_GRAY_1),
(
tokens::RADIO_TEXT_DISABLED,
palette::LIGHT_GRAY_1.with_alpha(0.5),
),
// Toggle Switch
(tokens::SWITCH_BG, palette::GRAY_3),
(tokens::SWITCH_BG_HOVER, palette::GRAY_3.lighter(0.05)),
(tokens::SWITCH_BG_PRESSED, palette::GRAY_3.lighter(0.1)),
(tokens::SWITCH_BG_DISABLED, palette::GRAY_1.with_alpha(0.5)),
(tokens::SWITCH_BG_CHECKED, palette::ACCENT),
(
tokens::SWITCH_BG_CHECKED_HOVER,
palette::ACCENT.lighter(0.05),
),
(
tokens::SWITCH_BG_CHECKED_PRESSED,
palette::ACCENT.lighter(0.1),
),
(
tokens::SWITCH_BG_CHECKED_DISABLED,
palette::GRAY_1.with_alpha(0.5),
),
(tokens::SWITCH_BORDER, palette::GRAY_3),
(tokens::SWITCH_BORDER_HOVER, palette::GRAY_3.lighter(0.05)),
(tokens::SWITCH_BORDER_PRESSED, palette::GRAY_3.lighter(0.1)),
(
tokens::SWITCH_BORDER_DISABLED,
palette::GRAY_3.with_alpha(0.5),
),
(tokens::SWITCH_BORDER_CHECKED, palette::ACCENT),
(
tokens::SWITCH_BORDER_CHECKED_HOVER,
palette::ACCENT.lighter(0.05),
),
(
tokens::SWITCH_BORDER_CHECKED_PRESSED,
palette::ACCENT.lighter(0.1),
),
(
tokens::SWITCH_BORDER_CHECKED_DISABLED,
palette::GRAY_3.with_alpha(0.5),
),
(tokens::SWITCH_SLIDE_BG, palette::LIGHT_GRAY_1.lighter(0.1)),
(
tokens::SWITCH_SLIDE_BG_HOVER,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BG_PRESSED,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BG_DISABLED,
palette::GRAY_1.with_alpha(0.5),
),
(
tokens::SWITCH_SLIDE_BG_CHECKED,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BG_CHECKED_HOVER,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BG_CHECKED_PRESSED,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BG_CHECKED_DISABLED,
palette::LIGHT_GRAY_2.with_alpha(0.3),
),
(
tokens::SWITCH_SLIDE_BORDER,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BORDER_HOVER,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BORDER_PRESSED,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BORDER_DISABLED,
palette::GRAY_2.with_alpha(0.5),
),
(
tokens::SWITCH_SLIDE_BORDER_CHECKED,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BORDER_CHECKED_HOVER,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BORDER_CHECKED_PRESSED,
palette::LIGHT_GRAY_1.lighter(0.1),
),
(
tokens::SWITCH_SLIDE_BORDER_CHECKED_DISABLED,
palette::LIGHT_GRAY_2.with_alpha(0.3),
),
(tokens::COLOR_PLANE_BG, palette::GRAY_1),
// Menus
(tokens::MENU_BG, palette::GRAY_1),
(tokens::MENU_BORDER, palette::WARM_GRAY_1),
(tokens::MENUITEM_BG_HOVER, palette::GRAY_1.lighter(0.05)),
(tokens::MENUITEM_BG_PRESSED, palette::GRAY_1.lighter(0.1)),
(tokens::MENUITEM_BG_FOCUSED, palette::GRAY_1.lighter(0.1)),
(tokens::MENUITEM_TEXT, palette::WHITE),
(
tokens::MENUITEM_TEXT_DISABLED,
palette::WHITE.with_alpha(0.5),
),
// Text Input
(
tokens::TEXT_INPUT_BG,
palette::LIGHT_GRAY_MIX.with_alpha(0.028),
),
(
tokens::TEXT_INPUT_LABEL_BG,
palette::LIGHT_GRAY_MIX.with_alpha(0.09),
),
(tokens::TEXT_INPUT_TEXT, palette::WHITE),
(
tokens::TEXT_INPUT_TEXT_DISABLED,
palette::WHITE.with_alpha(0.5),
),
(tokens::TEXT_INPUT_CURSOR, palette::ACCENT.lighter(0.2)),
(tokens::TEXT_INPUT_SELECTION, palette::ACCENT),
(tokens::TEXT_INPUT_SELECTION_UNFOCUSED, palette::TRANSPARENT),
(tokens::TEXT_INPUT_X_AXIS, palette::X_AXIS),
(tokens::TEXT_INPUT_Y_AXIS, palette::Y_AXIS),
(tokens::TEXT_INPUT_Z_AXIS, palette::Z_AXIS),
// Pane
(tokens::PANE_HEADER_BG, palette::GRAY_0),
(tokens::PANE_HEADER_BORDER, palette::WARM_GRAY_1),
(tokens::PANE_HEADER_TEXT, palette::LIGHT_GRAY_1),
(tokens::PANE_HEADER_DIVIDER, palette::WARM_GRAY_1),
(tokens::PANE_BODY_BG, palette::GRAY_1),
// Subpane
(tokens::SUBPANE_HEADER_BG, palette::GRAY_2),
(tokens::SUBPANE_HEADER_BORDER, palette::GRAY_3),
(tokens::SUBPANE_HEADER_TEXT, palette::LIGHT_GRAY_1),
(tokens::SUBPANE_BODY_BG, palette::GRAY_1),
(tokens::SUBPANE_BODY_BORDER, palette::GRAY_2),
// Group
(tokens::GROUP_HEADER_BG, palette::GRAY_2),
(tokens::GROUP_HEADER_BORDER, palette::GRAY_3),
(tokens::GROUP_HEADER_TEXT, palette::LIGHT_GRAY_1),
(tokens::GROUP_BODY_BG, palette::GRAY_2),
(tokens::GROUP_BODY_BORDER, palette::GRAY_3),
// Listview
(tokens::LISTROW_BG, Color::NONE),
(tokens::LISTROW_BG_HOVER, palette::GRAY_3.with_alpha(0.5)),
(tokens::LISTROW_BG_SELECTED, palette::GRAY_3),
(tokens::LISTROW_TEXT, palette::WHITE),
(
tokens::LISTROW_TEXT_DISABLED,
palette::WHITE.with_alpha(0.5),
),
(tokens::DIALOG_BG, palette::GRAY_1),
(tokens::DIALOG_BORDER, palette::BLACK),
(tokens::DIALOG_HEADER_BG, palette::GRAY_0),
(tokens::DIALOG_TEXT, palette::LIGHT_GRAY_1),
]),
build_theme(&default_dark_palette().resolve(), default_token_slots())
}

/// Default feathers dark palette editable inputs
pub fn default_dark_palette() -> EditablePalette {
EditablePalette {
neutrals: OklchaArray {
hue: 280.0,
chroma: 0.008,
l: [0.2414, 0.287, 0.3120, 0.3373, 0.399, 0.452, 0.485],
},
accent: OklchaArray {
hue: 255.4,
chroma: 0.1594,
l: [0.542, 0.592, 0.642, 0.742],
},
text: OklchaArray {
hue: 286.37,
chroma: 0.0014,
l: [1.0, 0.7607],
},
contrast: Oklcha::new(1.0, 0.0, 0.0, 1.0),
axes: default_axis_colors(),
dim_text_alpha_modifier: 0.2,
}
}
1 change: 1 addition & 0 deletions crates/bevy_feathers/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ pub mod dark_theme;
pub mod display;
pub mod focus;
pub mod font_styles;
pub mod light_theme;
pub mod palette;
pub mod rounded_corners;
pub mod theme;
Expand Down
34 changes: 34 additions & 0 deletions crates/bevy_feathers/src/light_theme.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//! The standard `bevy_feathers` light theme. NOT APPROVED YET
use crate::theme::{
build_theme, default_axis_colors, default_token_slots, EditablePalette, OklchaArray, ThemeProps,
};
use bevy_color::Oklcha;

/// Default feathers light palette
pub fn create_light_theme() -> ThemeProps {
build_theme(&default_light_palette().resolve(), default_token_slots())
}

/// Default feathers light palette editable inputs
pub fn default_light_palette() -> EditablePalette {
EditablePalette {
neutrals: OklchaArray {
hue: 266.0,
chroma: 0.02,
l: [0.99, 0.95, 0.90, 0.83, 0.76, 0.70, 0.66],
},
accent: OklchaArray {
hue: 255.4,
chroma: 0.1594,
l: [0.61, 0.55, 0.50, 0.45],
},
text: OklchaArray {
hue: 266.0,
chroma: 0.0014,
l: [0.07, 0.14],
},
contrast: Oklcha::new(1.0, 0.0, 0.0, 1.0),
axes: default_axis_colors(),
dim_text_alpha_modifier: 0.4,
}
}
Loading
Loading