diff --git a/install.sh b/install.sh index 60e66796..7b3334e4 100755 --- a/install.sh +++ b/install.sh @@ -557,6 +557,17 @@ link_libadwaita() { ln -sf "${THEME_DIR}/gtk-4.0/gtk-dark.css" "${HOME}/.config/gtk-4.0/gtk-dark.css" } +install_libadwaita() { + rm -rf "${HOME}/.config/gtk-4.0/"{assets,gtk.css,gtk-dark.css} + + echo -e "\nInstalling theme into '${HOME}/.config/gtk-4.0' for libadwaita..." + + mkdir -p "${HOME}/.config/gtk-4.0" + cp -r "${SRC_DIR}/assets/gtk/assets" "${HOME}/.config/gtk-4.0" + cp -r "${SRC_DIR}/assets/gtk/symbolics/"*'.svg' "${HOME}/.config/gtk-4.0/assets" + sassc $SASSC_OPT "${SRC_DIR}/main/libadwaita/libadwaita.scss" "${HOME}/.config/gtk-4.0/gtk.css" +} + link_theme() { for theme in "${themes[@]}"; do for color in "${lcolors[@]}"; do @@ -660,7 +671,7 @@ if [[ "$uninstall" == 'true' ]]; then else install_package && tweaks_temp && gnome_shell_version && install_theme if [[ "$libadwaita" == 'true' ]]; then - uninstall_link && link_theme + uninstall_link && install_libadwaita fi fi diff --git a/src/assets/gtk/symbolics/menu-radio-symbolic.svg b/src/assets/gtk/symbolics/menu-radio-symbolic.svg new file mode 100644 index 00000000..a70839a2 --- /dev/null +++ b/src/assets/gtk/symbolics/menu-radio-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/gtk/symbolics/menu-radio-symbolic@2.svg b/src/assets/gtk/symbolics/menu-radio-symbolic@2.svg new file mode 100644 index 00000000..f55ed393 --- /dev/null +++ b/src/assets/gtk/symbolics/menu-radio-symbolic@2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main/libadwaita/libadwaita.scss b/src/main/libadwaita/libadwaita.scss new file mode 100644 index 00000000..77f57b0a --- /dev/null +++ b/src/main/libadwaita/libadwaita.scss @@ -0,0 +1,13 @@ +$contrast: 'normal'; +$variant: 'light'; +$topbar: 'light'; + +@import '../../sass/colors'; +@import '../../sass/libadwaita/palette'; +@import '../../sass/libadwaita/functions'; +@import '../../sass/libadwaita/variables'; +@import '../../sass/libadwaita/colors'; +@import '../../sass/libadwaita/drawing'; +@import '../../sass/libadwaita/common'; +@import '../../sass/libadwaita/defaults'; +@import '../../sass/libadwaita/compat-colors'; diff --git a/src/sass/gnome-shell/common/_notifications.scss b/src/sass/gnome-shell/common/_notifications.scss index 3e51c5e9..f82e7b47 100644 --- a/src/sass/gnome-shell/common/_notifications.scss +++ b/src/sass/gnome-shell/common/_notifications.scss @@ -5,7 +5,6 @@ width: 34em; min-height: 64px; margin: 12px 5px 8px; - border-radius: $base_radius; color: $text-secondary; background-color: $popover; text-shadow: none; diff --git a/src/sass/gnome-shell/widgets-46-0/_calendar.scss b/src/sass/gnome-shell/widgets-46-0/_calendar.scss index a9c0b92f..ccb92bf8 100644 --- a/src/sass/gnome-shell/widgets-46-0/_calendar.scss +++ b/src/sass/gnome-shell/widgets-46-0/_calendar.scss @@ -26,6 +26,10 @@ padding: $base_padding / 2; } +.datemenu-popover { + border-radius: $base_radius + $base_padding * 2 !important; +} + // Calendar menu side column .datemenu-calendar-column { spacing: $base_spacing; diff --git a/src/sass/gtk/_common-4.0.scss b/src/sass/gtk/_common-4.0.scss index cedbf702..effd20fd 100644 --- a/src/sass/gtk/_common-4.0.scss +++ b/src/sass/gtk/_common-4.0.scss @@ -1740,19 +1740,20 @@ headerbar { box-shadow: none; border: none; outline: none; - background-image: image($titlebar); - - &:backdrop { - background-image: image($titlebar-backdrop); - } windowcontrols { - button, - menubutton { - min-width: 16px; - min-height: 16px; - margin: 0; - padding: 0; + > button { + @if $window_button == 'mac' { + min-width: 16px; + min-height: 16px; + margin: 0 $space-size - 2px; + padding: 0; + } @else { + min-width: 22px; + min-height: 22px; + margin: 0 $space-size - 2px; + padding: 0; + } } menubutton button { @@ -2952,11 +2953,6 @@ switch { &:disabled { opacity: 0.5; } - // hide on/off icons for >=3.24.5 - image { - margin: -8px; - } - > slider { transition: all $duration $ease-out; min-width: $small-size - 6px; @@ -3747,7 +3743,6 @@ row { background-repeat: no-repeat; background-position: center; background-size: 1000% 1000%; - outline: none; &:focus { color: $text; diff --git a/src/sass/libadwaita/_apps.scss b/src/sass/libadwaita/_apps.scss new file mode 100644 index 00000000..6cae7066 --- /dev/null +++ b/src/sass/libadwaita/_apps.scss @@ -0,0 +1,4 @@ +@import 'apps/nautilus'; +@import 'apps/editor'; +@import 'apps/builder'; +@import 'apps/other'; diff --git a/src/sass/libadwaita/_colors.scss b/src/sass/libadwaita/_colors.scss new file mode 100644 index 00000000..83ef4a04 --- /dev/null +++ b/src/sass/libadwaita/_colors.scss @@ -0,0 +1,133 @@ +$border_opacity: 0.12; +$thin_border_opacity: 0.05; +$focus_border_opacity: 0.45; + +// Colors from _drawing.scss + +$text_color: currentColor; +$secondary_text_color: gtkalpha(currentColor, 0.75); +$disabled_text_color: gtkalpha(currentColor, 0.45); +$secondary_disabled_text_color: gtkalpha(currentColor, 0.35); + +$button_color: gtkalpha(currentColor, 0.05); +$button_hover_color: gtkalpha(currentColor, 0.12); +$button_active_color: gtkalpha(currentColor, 0.2); +$button_checked_color: gtkalpha(currentColor, 0.1); +$button_checked_hover_color: gtkalpha(currentColor, 0.15); +$button_checked_active_color: gtkalpha(currentColor, 0.2); + +// Colors from _defaults.scss + +$accent_bg_color: gtkcolor(accent_bg_color); +$accent_fg_color: gtkcolor(accent_fg_color); +$accent_color: gtkcolor(accent_color); + +$destructive_bg_color: gtkcolor(destructive_bg_color); +$destructive_fg_color: gtkcolor(destructive_fg_color); +$destructive_color: gtkcolor(destructive_color); + +$success_bg_color: gtkcolor(success_bg_color); +$success_fg_color: gtkcolor(success_fg_color); +$success_color: gtkcolor(success_color); + +$warning_bg_color: gtkcolor(warning_bg_color); +$warning_fg_color: gtkcolor(warning_fg_color); +$warning_color: gtkcolor(warning_color); + +$error_bg_color: gtkcolor(error_bg_color); +$error_fg_color: gtkcolor(error_fg_color); +$error_color: gtkcolor(error_color); + +$window_bg_color: gtkcolor(window_bg_color); +$window_fg_color: gtkcolor(window_fg_color); + +$view_bg_color: gtkcolor(view_bg_color); +$view_fg_color: gtkcolor(view_fg_color); + +$headerbar_bg_color: gtkcolor(headerbar_bg_color); +$headerbar_fg_color: gtkcolor(headerbar_fg_color); +$headerbar_border_color: gtkalpha(gtkcolor(headerbar_border_color), $border_opacity); +$headerbar_backdrop_color: gtkcolor(headerbar_backdrop_color); +$headerbar_shade_color: gtkcolor(headerbar_shade_color); +$headerbar_darker_shade_color: gtkcolor(headerbar_darker_shade_color); + +$sidebar_bg_color: gtkcolor(sidebar_bg_color); +$sidebar_fg_color: gtkcolor(sidebar_fg_color); +$sidebar_backdrop_color: gtkcolor(sidebar_backdrop_color); +$sidebar_border_color: gtkalpha(currentColor, 0.1); +$sidebar_shade_color: gtkcolor(sidebar_shade_color); + +$secondary_sidebar_bg_color: gtkcolor(secondary_sidebar_bg_color); +$secondary_sidebar_fg_color: gtkcolor(secondary_sidebar_fg_color); +$secondary_sidebar_backdrop_color: gtkcolor(secondary_sidebar_backdrop_color); +$secondary_sidebar_border_color: gtkcolor(secondary_sidebar_border_color); +$secondary_sidebar_shade_color: gtkcolor(secondary_sidebar_shade_color); + +$card_bg_color: gtkcolor(card_bg_color); +$card_fg_color: gtkcolor(card_fg_color); +$card_shade_color: gtkcolor(card_shade_color); + +$dialog_bg_color: gtkcolor(dialog_bg_color); +$dialog_fg_color: gtkcolor(dialog_fg_color); + +$popover_bg_color: gtkcolor(popover_bg_color); +$popover_fg_color: gtkcolor(popover_fg_color); +$popover_shade_color: gtkcolor(popover_shade_color); + +$thumbnail_bg_color: gtkcolor(thumbnail_bg_color); +$thumbnail_fg_color: gtkcolor(thumbnail_fg_color); + +$shade_color: gtkcolor(shade_color); +$scrollbar_outline_color: gtkcolor(scrollbar_outline_color); + +// Other colors + +$border_color: gtkalpha(currentColor, $border_opacity); +$thin_border_color: gtkalpha(currentColor, $thin_border_opacity); +$link_color: $accent_color; +$link_visited_color: gtkmix($accent_color, $view_fg_color, 80%); + +$hover_color: gtkalpha(currentColor, .07); +$active_color: gtkalpha(currentColor, .16); +$selected_color: gtkalpha(currentColor, .1); +$selected_hover_color: gtkalpha(currentColor, .13); +$selected_active_color: gtkalpha(currentColor, .19); + +$view_hover_color: gtkalpha(currentColor, .04); +$view_active_color: gtkalpha(currentColor, .08); +$view_selected_color: gtkalpha($accent_bg_color, .25); +$view_selected_hover_color: gtkalpha($accent_bg_color, .32); +$view_selected_active_color: gtkalpha($accent_bg_color, .39); + +$trough_color: gtkalpha(currentColor, .15); +$trough_hover_color: gtkalpha(currentColor, .2); +$trough_active_color: gtkalpha(currentColor, .25); + +$fill_color: $accent_bg_color; +$fill_text_color: $accent_fg_color; + +$slider_color: gtkmix(white, $view_bg_color, 80%); +$slider_hover_color: white; + +$osd_fg_color: transparentize(white, .1); +$osd_text_color: white; +$osd_bg_color: transparentize(black, 0.3); +$osd_fill_bg_color: transparentize(white, .25); +$osd_fill_fg_color: transparentize(black, .25); +$osd_focus_color: transparentize(white, .5); +$osd_link_color: gtkmix($accent_bg_color, $osd_text_color, 50%); +$osd_link_visited_color: gtkmix($accent_bg_color, $osd_text_color, 75%); + +$tooltip_border_color: transparentize(white, 0.9); +$shadow_color: transparentize(black, 0.9); + +$drop_target_color: $accent_bg_color; + +$window_outline_color: transparentize(white, .92); + +//special cased widget colors +$focus_border_color: gtkalpha($accent_color, $focus_border_opacity); +$dim_label_opacity: 0.55; +$dimmer_opacity: 0.3; +$disabled_opacity: 0.45; +$strong_disabled_opacity: 0.3; diff --git a/src/sass/libadwaita/_common.scss b/src/sass/libadwaita/_common.scss new file mode 100644 index 00000000..8a1b4140 --- /dev/null +++ b/src/sass/libadwaita/_common.scss @@ -0,0 +1,94 @@ + +.background { + color: $window_fg_color; + background-color: $window_bg_color; +} + +dnd { + color: $window_fg_color; +} + +.normal-icons { + -gtk-icon-size: 16px; +} + +.large-icons { + -gtk-icon-size: 32px; +} + +%osd, +.osd { + color: $osd_fg_color; + border: none; + background-color: $osd_bg_color; + background-clip: padding-box; +} + +/* Text selection */ + +selection { + background-color: gtkalpha($view_fg_color, 0.1); + color: transparent; + + &:focus-within { + background-color: gtkalpha($accent_bg_color, 0.3); + } +} + +:not(window):drop(active):focus, +:not(window):drop(active) { // FIXME needs to be done widget by widget, this wildcard should really die + border-color: $drop_target_color; + box-shadow: inset 0 0 0 1px $drop_target_color; + caret-color: $drop_target_color; +} + +.navigation-sidebar, +placessidebar, +stackswitcher, +expander-widget { + :not(window):drop(active):focus, + :not(window):drop(active) { + box-shadow: none; + } +} + +/* Outline for low res icons */ +.lowres-icon { + -gtk-icon-shadow: 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +/* Drop shadow for large icons */ +.icon-dropshadow { + -gtk-icon-shadow: 0 1px 12px rgba(0,0,0,0.05), + 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +@keyframes needs_attention { + from { background-image: radial-gradient(farthest-side, $accent_color 0%, transparent 0%); } + to { background-image: radial-gradient(farthest-side, $accent_color 95%, transparent); } +} + +%needs_attention { + // the dot is drawn by using two radial gradient, the first one is the actual dot, the other + // simulates the shadow labels and icons normally have in buttons. + animation: needs_attention 150ms ease-in; + + background-image: radial-gradient(farthest-side, $accent_color 96%, transparent); + background-size: 6px 6px; + background-repeat: no-repeat; + + background-position: right 3px; + + &:dir(rtl) { + background-position: left 3px; + } +} + +@import 'widgets'; +@import 'apps'; diff --git a/src/sass/libadwaita/_compat-colors.scss b/src/sass/libadwaita/_compat-colors.scss new file mode 100644 index 00000000..dd0a65de --- /dev/null +++ b/src/sass/libadwaita/_compat-colors.scss @@ -0,0 +1,33 @@ +// Sass thinks we're using the colors in the variables as strings and may shoot +// warning, it's innocuous and can be defeated by using #{$var}. + +/* Public colors from Default */ + +@define-color theme_bg_color #{$window_bg_color}; +@define-color theme_fg_color #{$window_fg_color}; + +@define-color theme_base_color #{$view_bg_color}; +@define-color theme_text_color #{$view_fg_color}; + +@define-color theme_selected_bg_color #{$accent_bg_color}; +@define-color theme_selected_fg_color #{$accent_fg_color}; + +@define-color insensitive_bg_color #{gtkmix($window_bg_color, $view_bg_color, 60%)}; +@define-color insensitive_fg_color #{gtkalpha($window_fg_color, .5)}; + +@define-color insensitive_base_color #{$view_bg_color}; + +@define-color borders #{$border_color}; + +@define-color theme_unfocused_bg_color #{$window_bg_color}; +@define-color theme_unfocused_fg_color #{$window_fg_color}; + +@define-color theme_unfocused_base_color #{$view_bg_color}; +@define-color theme_unfocused_text_color #{$view_fg_color}; + +@define-color theme_unfocused_selected_bg_color #{$accent_bg_color}; +@define-color theme_unfocused_selected_fg_color #{$accent_fg_color}; + +@define-color unfocused_insensitive_color #{gtkcolor(insensitive_bg_color)}; + +@define-color unfocused_borders #{$border_color}; diff --git a/src/sass/libadwaita/_defaults.scss b/src/sass/libadwaita/_defaults.scss new file mode 100644 index 00000000..29113312 --- /dev/null +++ b/src/sass/libadwaita/_defaults.scss @@ -0,0 +1,83 @@ +/* GTK NAMED COLORS + ---------------- + use responsibly! */ + +// Sass thinks we're using the colors in the variables as strings and may shoot +// warning, it's innocuous and can be defeated by using #{$var}. + +// These are the colors apps are can override. We define the defaults here and +// define variables for them in _colors.scss + +// // The main accent color and the matching text value +// @define-color accent_bg_color #{$primary}; +// @define-color accent_fg_color #{on($primary)}; +// @define-color accent_color #{$primary}; + +// // destructive-action buttons +// @define-color destructive_bg_color #{if($variant == 'dark', "@red_4", "@red_3")}; +// @define-color destructive_fg_color white; +// @define-color destructive_color #{if($variant == 'dark', #ff7b63, "@red_4")}; + +// // Levelbars, entries, labels and infobars. These don't need text colors +// @define-color success_bg_color #{if($variant == 'dark', "@green_5", "@green_4")}; +// @define-color success_fg_color white; +// @define-color success_color #{if($variant == 'dark', "@green_1", "#1b8553")}; + +// @define-color warning_bg_color #{if($variant == 'dark', #cd9309, "@yellow_5")}; +// @define-color warning_fg_color #{transparentize(black, .2)}; +// @define-color warning_color #{if($variant == 'dark', "@yellow_2", #9c6e03)}; + +// @define-color error_bg_color #{if($variant == 'dark', "@red_4", "@red_3")}; +// @define-color error_fg_color white; +// @define-color error_color #{if($variant == 'dark', #ff7b63, "@red_4")}; + +// // Window +// @define-color window_bg_color #{if($variant == 'light', #fafafa, #242424)}; +// @define-color window_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; + +// // Views - e.g. text view or tree view +// @define-color view_bg_color #{if($variant == 'light', #ffffff, #1e1e1e)}; +// @define-color view_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; + +// // Header bar, search bar, tab bar +// @define-color headerbar_bg_color #{if($variant == 'light', #ffffff, #303030)}; +// @define-color headerbar_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; +// @define-color headerbar_border_color #{if($variant == 'light', transparentize(black, .2), white)}; +// @define-color headerbar_backdrop_color @window_bg_color; +// @define-color headerbar_shade_color #{if($variant == 'light', transparentize(black, .88), transparentize(black, .64))}; +// @define-color headerbar_darker_shade_color #{if($variant == 'light', transparentize(black, .88), transparentize(black, .1))}; + +// // Split pane views +// @define-color sidebar_bg_color #{if($variant == 'light', #ebebeb, #303030)}; +// @define-color sidebar_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; +// @define-color sidebar_backdrop_color #{if($variant == 'light', #f2f2f2, #2a2a2a)}; +// @define-color sidebar_shade_color #{if($variant == 'light', transparentize(black, .93), transparentize(black, .75))}; +// @define-color sidebar_border_color #{if($variant == 'light', transparentize(black, .93), transparentize(black, .64))}; + +// @define-color secondary_sidebar_bg_color #{if($variant == 'light', #f3f3f3, #2a2a2a)}; +// @define-color secondary_sidebar_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; +// @define-color secondary_sidebar_backdrop_color #{if($variant == 'light', #f6f6f6, #272727)}; +// @define-color secondary_sidebar_shade_color #{if($variant == 'light', transparentize(black, .93), transparentize(black, .75))}; +// @define-color secondary_sidebar_border_color #{if($variant == 'light', transparentize(black, .93), transparentize(black, .64))}; + +// // Cards, boxed lists +// @define-color card_bg_color #{if($variant == 'light', #ffffff, transparentize(white, .92))}; +// @define-color card_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; +// @define-color card_shade_color #{if($variant == 'light', transparentize(black, .93), transparentize(black, .64))}; + +// // Dialogs +// @define-color dialog_bg_color #{if($variant == 'light', #fafafa, #383838)}; +// @define-color dialog_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; + +// // Popovers +// @define-color popover_bg_color #{if($variant == 'light', #ffffff, #383838)}; +// @define-color popover_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; +// @define-color popover_shade_color #{if($variant == 'light', transparentize(black, .93), transparentize(black, .75))}; + +// // Thumbnails +// @define-color thumbnail_bg_color #{if($variant == 'light', #ffffff, #383838)}; +// @define-color thumbnail_fg_color #{if($variant == 'light', transparentize(black, .2), white)}; + +// // Miscellaneous +// @define-color shade_color #{if($variant == 'light', transparentize(black, .93), transparentize(black, .75))}; +// @define-color scrollbar_outline_color #{if($variant == 'light', white, transparentize(black, .5))}; diff --git a/src/sass/libadwaita/_drawing.scss b/src/sass/libadwaita/_drawing.scss new file mode 100644 index 00000000..e5022d66 --- /dev/null +++ b/src/sass/libadwaita/_drawing.scss @@ -0,0 +1,394 @@ +// Drawing mixins + +// generic drawing of more complex things + +// +// Ripple keyframes +// + +@keyframes ripple { + to { + background-size: 1000% 1000%; + } +} + +@keyframes ripple-on-slider { + to { + background-size: auto, 1000% 1000%; + } +} + +@keyframes ripple-on-headerbar { + from { + background-image: radial-gradient(circle, $accent_color 0%, transparent 0%); + } + + to { + background-image: radial-gradient(circle, $accent_color 100%, transparent 100%); + } +} + +// +// Helper mixin for drawing visible focus rings +// +// If $target is specified, the focus ring is applied to the specified child element. +// If $outer is true, the focus ring extends outward. Otherwise, it extends inward. +// If $within is true, use focus-within instead of focus:focus-visible +// +@mixin focus-ring($target: null, $width: 2px, $offset: -$width, $outer: false, $focus-state: ':focus:focus-visible', $fc: $focus_border_color, $transition: null) { + & #{$target} { + outline: 0 solid transparent; + outline-offset: if($outer, $offset + 4px, $offset + $width + 4px); + transition: $focus_transition, $transition; + } + + &#{$focus-state} #{$target} { + outline-color: $fc; + outline-width: $width; + outline-offset: $offset; + } +} + +@mixin entry($t, $fc: $accent_color) { +// +// entry +// +// $t: entry type +// $fc: focus color +// + + @if $t == normal { + transition: $transition, + outline $ripple_fade_out_duration $ease_out, + box-shadow $ripple_fade_out_duration $ease_out; + box-shadow: inset 0 0 0 2px transparent; + background-color: if($fc == $accent_color, $button_color, rgba($fc, 0.1)); + color: if($fc == $accent_color, $secondary_text_color, rgba($fc, 0.75)); + outline: 0 solid transparent; + outline-offset: 2px; + } + + @if $t == hover { + transition: $transition, + box-shadow $ripple_fade_out_duration $ease_out; + background-color: $button_hover_color; + box-shadow: inset 0 0 0 2px $button_hover_color; + color: if($fc == $accent_color, $text_color, $fc); + outline: 0 solid transparent; + outline-offset: 2px; + } + + @if $t == focus { + background-color: $button_focus_color; + box-shadow: inset 0 0 0 2px transparent; + color: if($fc == $accent_color, $text_color, $fc); + outline: 2px solid if($fc == $accent_color, $track, $fc); + outline-offset: -2px; + } + + @if $t == checked { + transition: $transition, + outline $ripple_fade_out_duration $ease_out, + box-shadow $ripple_fade_out_duration $ease_out; + background-color: if($fc == $accent_color, $button_color, rgba($fc, 0.1)); + box-shadow: inset 0 0 0 2px transparent; + color: if($fc == $accent_color, $text_color, $fc); + outline: 2px solid if($fc == $accent_color, $accent_color, $fc); + outline-offset: -2px; + } + + @if $t == disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: if($fc == $accent_color, $button_color, rgba($fc, 0.1)); + color: if($fc == $accent_color, $disabled_text_color, rgba($fc, 0.35)); + outline: none; + } + + @if $t == raised-normal { + transition: $transition, box-shadow $ripple_fade_out_duration $ease_out; + border-image: none; + box-shadow: inset 0 0 0 2px transparent; + background-color: if($fc == $accent_color, $surface, $fc); + color: if($fc == $accent_color, $text, on($fc)); + } + + @if $t == raised-hover { + box-shadow: inset 0 0 0 2px $button_hover_color; + } + + @if $t == raised-focus { + border-image: none; + box-shadow: inset 0 0 0 2px if($fc == $accent_color, $accent_color, $fc); + } + + @if $t == raised-disabled { + box-shadow: inset 0 0 0 2px transparent; + background-color: $base-alt; + color: $disabled_text_color; + } +} + + +@mixin button($t) { +// +// button +// +// $t: button type +// + + @if $t == normal { + transition: $transition, + background-size $ripple_fade_out_duration $ease_out, + background-image $ripple-fade-out-opacity-duration $ease_out, + outline $ripple_fade_out_duration $ease_out; + background-color: $button_color; + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + outline: 0 solid transparent; + outline-offset: 2px; + color: $text_color; + } + + @if $t == hover { + background-color: $button_hover_color; + color: $text_color; + outline: 0 solid transparent; + } + + @if $t == focus { + outline: 2px solid gtkalpha($accent_color, 0.35); + outline-offset: 0; + } + + @if $t == active { + transition: $transition, + background-size 0ms, + background-image 0ms, + border 0ms; + animation: ripple $ripple_fade_in_duration $ease_out forwards; + background-image: radial-gradient(circle, $button_hover_color 10%, transparent 0%); + background-size: 0% 0%; + background-color: $button_hover_color; + color: $text_color; + outline: 0 solid transparent; + } + + @if $t == disabled { + background-color: $button_color; + color: $disabled_text_color; + outline-color: transparent; + } + + @if $t == checked { + background-color: $accent_color; + color: $accent_fg_color; + } + + @if $t == checked-hover { + outline-color: transparent; + background-color: gtkmix($accent_fg_color, $accent_color, 5%); + color: $accent_fg_color; + } + + @if $t == checked-active { + animation: none; + outline-color: transparent; + background-color: gtkmix($accent_fg_color, $accent_color, 12%); + background-image: none; + color: $accent_fg_color; + } + + @if $t == checked-disabled { + outline-color: transparent; + background-color: gtkalpha($accent_color, 0.35); + color: gtkalpha($accent_fg_color, 0.35); + } + + @if $t == flat-normal { + transition: $transition, + border-image $ripple_fade_in_duration $ease_out, + background-size $ripple_fade_out_duration $ease_out, + background-image $ripple_fade_out_opacity_duration $ease_out, + outline $ripple_fade_out_duration $ease_out; + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + background-color: transparent; + outline: 0 solid transparent; + outline-offset: 2px; + color: $secondary_text_color; + } + + @if $t == flat-hover { + background-color: $button_hover_color; + color: $text_color; + } + + @if $t == flat-focus { + color: $text_color; + outline: 2px solid $button_color; + outline-offset: -2px; + } + + @if $t == flat-active { + transition: $transition, + border-image $ripple_fade_in_duration $ease_out, + background-size 0ms, + background-image 0ms; + animation: ripple $ripple_fade_in_duration $ease_out forwards; + background-image: radial-gradient(circle, $button_hover_color 10%, transparent 0%); + background-size: 0% 0%; + background-color: $button_hover_color; + color: $text_color; + } + + @if $t == flat-disabled { + color: $secondary_disabled_text_color; + background-color: transparent; + } + + @if $t == flat-checked { + background-color: $button_checked_color; + color: $text_color; + } + + @if $t == flat-checked-hover { + background-color: $button_checked_hover_color; + color: $text_color; + } + + @if $t == flat-checked-active { + animation: none; + outline-color: transparent; + background-color: $button_checked_active_color; + background-image: none; + color: $text_color; + } + + @if $t == flat-checked-disabled { + background-color: $button_checked_color; + color: $disabled_text_color; + } +} + +@mixin undershoot($p, $c: $shade_color, $neighbor: false, $style: default) { +// +// undershoot +// +// $p: position +// $c: shade color +// $neighbor: use ~ instead of > +// +// possible $p values: +// top, bottom, right, left +// + + $_border_pos: ''; + $_direction: ''; + $_selector: if($neighbor, '~', '>'); + + @if $p==top { + $_direction: bottom; + $_border_pos: 0 1px; + } @else if $p==bottom { + $_direction: top; + $_border_pos: 0 -1px; + } @else if $p==left { + $_direction: right; + $_border_pos: 1px 0; + } @else if $p==right { + $_direction: left; + $_border_pos: -1px 0; + } @else { + @error "Unknown position #{$p}" + } + + #{$_selector} undershoot.#{$p} { + @if $style==default { + box-shadow: none; + } @else if $style==frame { + box-shadow: inset $_border_pos $border_color; + } + + background: linear-gradient(to $_direction, gtkalpha($c, .75), transparent 6px); + } +} + +@mixin overshoot($p) { +// +// overshoot +// +// $p: position +// +// possible $p values: +// top, bottom, right, left +// + + $_small_gradient_length: 3%; + $_big_gradient_length: 50%; + + $_small_gradient_size: 100% $_small_gradient_length; + $_big_gradient_size: 100% $_big_gradient_length; + + @if $p==right or $p==left { + $_small_gradient_size: $_small_gradient_length 100%; + $_big_gradient_size: $_big_gradient_length 100%; + } + + $_small_gradient: radial-gradient(farthest-side at $p, + gtkalpha(currentColor, 0.12) 85%, + gtkalpha(currentColor, 0)); + + $_big_gradient: radial-gradient(farthest-side at $p, + gtkalpha(currentColor, 0.05), + gtkalpha(currentColor, 0)); + + background-image: $_small_gradient, $_big_gradient; + background-size: $_small_gradient_size, $_big_gradient_size; + + background-repeat: no-repeat; + background-position: $p; + + background-color: transparent; // reset some properties to be sure to not inherit them somehow + border: none; // + box-shadow: none; // +} + +@mixin background-shadow($direction, $color) { + background-image: + linear-gradient($direction, + gtkalpha($color, 0.7), + gtkalpha($color, 0.14) 40px, + gtkalpha($color, 0) 56px), + linear-gradient($direction, + gtkalpha($color, 0.4), + gtkalpha($color, 0.14) 7px, + gtkalpha($color, 0) 24px); +} + +@mixin transition-shadows($color) { + > dimming { + background: $color; + } + + @if $contrast == 'high' { + > border { + min-width: 1px; + min-height: 1px; + background: $border_color; + } + } + + > shadow { + min-width: 56px; + min-height: 56px; + + &.left { @include background-shadow(to right, $color); } + &.right { @include background-shadow(to left, $color); } + &.up { @include background-shadow(to bottom, $color); } + &.down { @include background-shadow(to top, $color); } + } +} diff --git a/src/sass/libadwaita/_functions.scss b/src/sass/libadwaita/_functions.scss new file mode 100644 index 00000000..c4af658b --- /dev/null +++ b/src/sass/libadwaita/_functions.scss @@ -0,0 +1,16 @@ +@function gtkalpha($c,$a) { + @return unquote("alpha(#{$c},#{$a})"); +} + +@function gtkmix($c1,$c2,$r) { + $ratio: 1 - $r / 100%; // match SCSS mix() + @return unquote("mix(#{$c1},#{$c2},#{$ratio})"); +} + +@function gtkshade($c,$s) { + @return unquote("shade(#{$c},#{$s})"); +} + +@function gtkcolor($c) { + @return unquote("@#{$c}"); +} diff --git a/src/sass/libadwaita/_palette.scss b/src/sass/libadwaita/_palette.scss new file mode 100644 index 00000000..dd59a710 --- /dev/null +++ b/src/sass/libadwaita/_palette.scss @@ -0,0 +1,94 @@ +$blue_1: #99c1f1; +$blue_2: #62a0ea; +$blue_3: #3584e4; +$blue_4: #1c71d8; +$blue_5: #1a5fb4; +$green_1: #8ff0a4; +$green_2: #57e389; +$green_3: #33d17a; +$green_4: #2ec27e; +$green_5: #26a269; +$yellow_1: #f9f06b; +$yellow_2: #f8e45c; +$yellow_3: #f6d32d; +$yellow_4: #f5c211; +$yellow_5: #e5a50a; +$orange_1: #ffbe6f; +$orange_2: #ffa348; +$orange_3: #ff7800; +$orange_4: #e66100; +$orange_5: #c64600; +$red_1: #f66151; +$red_2: #ed333b; +$red_3: #e01b24; +$red_4: #c01c28; +$red_5: #a51d2d; +$purple_1: #dc8add; +$purple_2: #c061cb; +$purple_3: #9141ac; +$purple_4: #813d9c; +$purple_5: #613583; +$brown_1: #cdab8f; +$brown_2: #b5835a; +$brown_3: #986a44; +$brown_4: #865e3c; +$brown_5: #63452c; +$light_1: #ffffff; +$light_2: #f6f5f4; +$light_3: #deddda; +$light_4: #c0bfbc; +$light_5: #9a9996; +$dark_1: #77767b; +$dark_2: #5e5c64; +$dark_3: #3d3846; +$dark_4: #241f31; +$dark_5: #000000; + +// Sass thinks we're using the colors in the variables as strings and may shoot +// warning, it's innocuous and can be defeated by using #{$var}. + +@define-color blue_1 #{$blue_1}; +@define-color blue_2 #{$blue_2}; +@define-color blue_3 #{$blue_3}; +@define-color blue_4 #{$blue_4}; +@define-color blue_5 #{$blue_5}; +@define-color green_1 #{$green_1}; +@define-color green_2 #{$green_2}; +@define-color green_3 #{$green_3}; +@define-color green_4 #{$green_4}; +@define-color green_5 #{$green_5}; +@define-color yellow_1 #{$yellow_1}; +@define-color yellow_2 #{$yellow_2}; +@define-color yellow_3 #{$yellow_3}; +@define-color yellow_4 #{$yellow_4}; +@define-color yellow_5 #{$yellow_5}; +@define-color orange_1 #{$orange_1}; +@define-color orange_2 #{$orange_2}; +@define-color orange_3 #{$orange_3}; +@define-color orange_4 #{$orange_4}; +@define-color orange_5 #{$orange_5}; +@define-color red_1 #{$red_1}; +@define-color red_2 #{$red_2}; +@define-color red_3 #{$red_3}; +@define-color red_4 #{$red_4}; +@define-color red_5 #{$red_5}; +@define-color purple_1 #{$purple_1}; +@define-color purple_2 #{$purple_2}; +@define-color purple_3 #{$purple_3}; +@define-color purple_4 #{$purple_4}; +@define-color purple_5 #{$purple_5}; +@define-color brown_1 #{$brown_1}; +@define-color brown_2 #{$brown_2}; +@define-color brown_3 #{$brown_3}; +@define-color brown_4 #{$brown_4}; +@define-color brown_5 #{$brown_5}; +@define-color light_1 #{$light_1}; +@define-color light_2 #{$light_2}; +@define-color light_3 #{$light_3}; +@define-color light_4 #{$light_4}; +@define-color light_5 #{$light_5}; +@define-color dark_1 #{$dark_1}; +@define-color dark_2 #{$dark_2}; +@define-color dark_3 #{$dark_3}; +@define-color dark_4 #{$dark_4}; +@define-color dark_5 #{$dark_5}; diff --git a/src/sass/libadwaita/_variables.scss b/src/sass/libadwaita/_variables.scss new file mode 100644 index 00000000..dbe0fe83 --- /dev/null +++ b/src/sass/libadwaita/_variables.scss @@ -0,0 +1,96 @@ +@import '../tweaks-temp'; + +$asset_suffix: if($variant == 'dark', '-dark', ''); + +// +// Sizes +// + +$base_padding: if($compact == 'false', 6px, 4px); +$menu_margin: 6px; //margin around menuitems & sidebar items +$menu_padding: 12px; //inner menuitem padding + +$small_size: if($compact == 'false', 24px, 22px); +$medium_size: if($compact == 'false', 36px, 32px); +$large_size: if($compact == 'false', 48px, 40px); + +$menuitem_size: if($compact == 'false', 28px, 24px); + +// +// Radiuses +// + +$button_radius: 6px; +$card_radius: $button_radius + 6px; +$menuitem_radius: $button_radius; +$window_radius: $button_radius + $base_padding; +$popover_radius: $menuitem_radius + $base_padding; +$circular_radius: 9999px; + +// +// Durations +// + +$duration: 75ms; +$ripple_fade_in_duration: 225ms; +$ripple_fade_out_duration: 300ms; +$ripple_fade_out_opacity_duration: 1200ms; + +// +// Timing functions +// + +$ease: cubic-bezier(0.4, 0.0, 0.2, 1); +$ease_out: cubic-bezier(0.0, 0.0, 0.2, 1); +$ease_in: cubic-bezier(0.4, 0.0, 1, 1); +$ease_in_out: cubic-bezier(0.4, 0.0, 0.6, 1); +$ease_out_quad: cubic-bezier(0.25, 0.46, 0.45, 0.94); + +// +// Transition shorthands +// + +$transition: all $duration $ease_out; +$transition_shadow: box-shadow 200ms ease-out; +$backdrop_transition: 200ms ease-out; +$focus_transition: outline-color 200ms $ease_out_quad, + outline-width 200ms $ease_out_quad, + outline-offset 200ms $ease_out_quad; +$button_transition: background 200ms $ease_out_quad, + box-shadow 200ms $ease_out_quad; +// +// Shadows +// + +$shadow-z1: + 0 2px 3px -2px rgba(black, 0.3), + 0 1px 2px -1px rgba(black, 0.24), + 0 1px 2px -1px rgba(black, 0.17); +$shadow-z2: + 0 4px 3px -3px rgba(black, 0.2), + 0 2px 2px -1px rgba(black, 0.24), + 0 1px 3px 0 rgba(black, 0.12); +$shadow-z3: + 0 3px 3px -2px rgba(black, 0.05), + 0 2px 3px -1px rgba(black, 0.06), + 0 1px 4px 0 rgba(black, 0.05); +$shadow-z4: + 0 1px 2px 0 rgba(black, 0.15), + 0 3px 3px 0 rgba(black, 0.18), + 0 3px 6px 0 rgba(black, 0.12); +$shadow-z5: + 0 2px 3px -1px rgba(black, 0.05), + 0 4px 6px 0 rgba(black, 0.06), + 0 1px 10px 0 rgba(black, 0.05); +$shadow-z6: + 0 2px 3px -1px rgba(black, 0.1), + 0 4px 6px 0 rgba(black, 0.12), + 0 1px 10px 0 rgba(black, 0.1); +$shadow-z12: + 0 7px 5px -4px rgba(black, 0.2), + 0 12px 10px 2px rgba(black, 0.14), + 0 5px 13px 4px rgba(black, 0.12); +$shadow-z16: + 0 1px 3px 0 rgba(black, 0.2), + 0 15px 16px 2px rgba(black, 0.14), + 0 6px 18px 5px rgba(black, 0.12); diff --git a/src/sass/libadwaita/_widgets.scss b/src/sass/libadwaita/_widgets.scss new file mode 100644 index 00000000..471d0a90 --- /dev/null +++ b/src/sass/libadwaita/_widgets.scss @@ -0,0 +1,42 @@ +@import 'widgets/avatar'; +@import 'widgets/bottom-sheet'; +@import 'widgets/buttons'; +@import 'widgets/calendar'; +@import 'widgets/checks'; +@import 'widgets/color-chooser'; +@import 'widgets/column-view'; +@import 'widgets/dialogs'; +@import 'widgets/deprecated'; +@import 'widgets/dropdowns'; +@import 'widgets/emoji-chooser'; +@import 'widgets/entries'; +@import 'widgets/expanders'; +@import 'widgets/file-chooser'; +@import 'widgets/header-bar'; +@import 'widgets/labels'; +@import 'widgets/level-bar'; +@import 'widgets/linked'; +@import 'widgets/links'; +@import 'widgets/lists'; +@import 'widgets/menus'; +@import 'widgets/message-dialog'; +@import 'widgets/misc'; +@import 'widgets/notebook'; +@import 'widgets/paned'; +@import 'widgets/popovers'; +@import 'widgets/preferences'; +@import 'widgets/progress-bar'; +@import 'widgets/scale'; +@import 'widgets/scrolling'; +@import 'widgets/shortcuts-window'; +@import 'widgets/sidebars'; +@import 'widgets/spinner'; +@import 'widgets/spin-button'; +@import 'widgets/switch'; +@import 'widgets/tab-view'; +@import 'widgets/text-selection'; +@import 'widgets/toolbars'; +@import 'widgets/tooltip'; +@import 'widgets/views'; +@import 'widgets/view-switcher'; +@import 'widgets/window'; diff --git a/src/sass/libadwaita/apps/_builder.scss b/src/sass/libadwaita/apps/_builder.scss new file mode 100644 index 00000000..420098cc --- /dev/null +++ b/src/sass/libadwaita/apps/_builder.scss @@ -0,0 +1,104 @@ +// +// Builder +// + +popover.background.global-search { + > arrow, > contents { padding: 0; } +} + +panelresizer .top-bar { + box-shadow: inset 0 -1px $border_color; +} + +.frameheader.header { + min-height: $large_size; + padding: 0; + border: none; + border-bottom: 1px solid $border_color; + background-color: $headerbar_backdrop_color; + + &:backdrop { + background-color: $headerbar_bg_color; + } + + tabbar.inline { + tabbox > tabboxchild { + margin: 0; + } + } +} + +panelframeswitcher { + &.frameheader.header { padding: 0 $base_padding; } + + > button.toggle.image-button { + border: none; + margin: $base_padding 0; + } +} + +panelstatusbar { + box-shadow: inset 0 1px $border_color; + + > menubutton > button, + > paneltogglebutton button { + border-radius: 0; + @extend %button_basic_flat; + } +} + +panelwidget entry.statusbar { + background-color: $window_bg_color; + border-radius: 0; + outline: none; + box-shadow: none; + border-top: 1px solid $border_color; + + &:focus-within { + outline: none; + } +} + +.IdeTweaksWindow, +.org-gnome-Builder { + .boxed-list { + box-shadow: inset 0 0 0 1px gtkalpha(currentColor, 0.08); + } +} + +// Setting window +.style-variant { + padding: 0 $base_padding * 2; + + button.toggle { + padding: 0; + + &, &:hover, &:focus, &:active, &:checked { + background: none; + outline: none; + border: none; + box-shadow: none; + } + + > stylevariantpreview > .wallpaper { + border-radius: $button_radius; + outline-color: transparent; + outline-width: 3px; + outline-offset: $base_padding / 2; + outline-style: solid; + box-shadow: none; + } + + &:hover > stylevariantpreview > .wallpaper { + outline-color: gtkalpha(currentColor, 0.05); + } + + &:active > stylevariantpreview > .wallpaper { + outline-color: gtkalpha(currentColor, 0.15); + } + + &:checked > stylevariantpreview > .wallpaper { + outline-color: $accent_color; + } + } +} diff --git a/src/sass/libadwaita/apps/_calculator.scss b/src/sass/libadwaita/apps/_calculator.scss new file mode 100644 index 00000000..7e9381aa --- /dev/null +++ b/src/sass/libadwaita/apps/_calculator.scss @@ -0,0 +1,1595 @@ + +// +// Nautilus +// +.nautilus-window { + placesview { + label { color: $text-secondary; } + } + + .nautilus-grid-view { + child.activatable { + @extend %row_activatable; + } + } + + .floating-bar { + min-height: 32px; + padding: 0; + margin: $space-size; + border-style: none; + border-radius: $corner-radius; + background-color: $primary; + color: on($primary); + box-shadow: $shadow-z3; + + button { + margin: (32px - $small-size) / 2; + color: on($primary); + + @extend %small-button; + } + } +} + +#NautilusQueryEditor { // search entry + > menubutton > button.image-button { + min-width: 24px; + min-height: 24px; + } + + > text, > box, > menubutton > button.image-button { + margin: $space-size 0; + } +} + +#NautilusQueryEditorTag { + background-color: $divider; + + > button.image-button { + margin: 0; + padding: 0; + } +} + +#NautilusPathBar { + background-color: $titlebar-fill; + border-radius: $corner-radius; + margin: $space-size 0; + + .content-pane & { + background-color: $fill; + } +} + +#NautilusPathButton { + margin: 0 $space-size / 2; + border-radius: $corner-radius; + + &.current-dir { + color: $titlebar-text; + + &:hover, &:active { + background: none; + box-shadow: none; + } + } + + .content-pane &.current-dir { + color: $text; + } + + &:first-child { margin-left: 0; } +} + +#NautilusViewCell { + clamp box { + margin: 0; + border-spacing: 0; + } +} + +navigation-view-page { + > toolbarview > scrolledwindow > viewport > clamp > box.medium > box > stack > button { + margin-top: $space-size * 2; + } +} + +// +// Gnome Control Center +// + +window.dialog { + > box > stack > box > box { + > notebook.frame { + border-width: 0 0 0 1px; + border-radius: 0; + } + } +} + +.background-thumbnail { + > button.remove-button { + margin: $space-size; + } +} + +// +// Calculator +// + +.display-container { + .small &.card { + border-radius: 0; + box-shadow: none; + border-width: 0 0 1px 0; + } + + .history-view { background-color: $base; } + + #displayitem { + padding: 0 12px 8px 0; + font-size: 1.4em; + border-top: 1px solid $border; + } +} + +.math-buttons button { + font-size: 1.1em; + padding: 2px $space-size; + + &.text-button { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; + } +} + +leaflet { + button.number-button { + background-color: rgba($text, 0.1); + + &:hover { + background-color: rgba($text, 0.2); + } + + &:active { + background-color: rgba($text, 0.3); + } + } +} + +// +// Calendar +// + +// labels +label { + &.primary-label, &.month-name, &.secondary-label { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2; + } + + &.primary-label, &.month-name { + color: $primary; + } + + &.secondary-label { + color: $text-disabled; + } +} + +calendar-view { + font-size: 10pt; + + &:selected { + color: $primary; + font-weight: bold; + } +} + +calendar-view.header, +label.header { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; +} + +calendar-view.current, +weekgrid.current { + background-color: gtkalpha($primary, 0.3); +} + +popover.events { + background-color: $popover; + padding: 0; + + box { + border-top-left-radius: $corner-radius; + border-top-right-radius: $corner-radius; + } + + list { + background-color: $base; + border-radius: $corner-radius; + } + + scrolledwindow { + border-width: 0; + } + + button { + border-radius: $corner-radius; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-style: solid none none; + box-shadow: none; + } +} + +// Event widget +event { + margin: 1px; + font-size: 0.9rem; + + widget.content { + margin: 4px; + } + + &.timed, + &:not(.slanted):not(.slanted-start):not(.slanted-end) { + border-radius: $corner-radius; + } + + &.timed widget.edge { + border-radius: $corner-radius / 2; + min-width: 5px; + } + + &.slanted-start, + &.slanted-end:dir(rtl) { + padding-left: $space-size * 2 + 4px; + border-radius: 0 $corner-radius / 2 $corner-radius / 2 0; + } + + &.slanted-end, + &.slanted-start:dir(rtl) { + padding-right: $space-size * 2 + 4px; + border-radius: $corner-radius / 2 0 0 $corner-radius / 2; + } + + &:not(.timed).color-dark { + color: white; + outline-color: rgba(0, 0, 0, 0.3); + } + + &.timed, + &:not(.timed).color-light { + color: gtkalpha(black, 0.75); + outline-color: rgba(255, 255, 255, 0.5); + } + +} + +// Event Popover +popover.event-popover, +popover.event-popover > contents { + padding: 0; +} + +.search-viewport { + background-color: $base; +} + +// calendar popover +.calendar-list { + background-color: transparent; + + > list { + border-radius: 4px; + } +} + +// defeats the ugly hover effect of the calendar color dot on buttons +.calendar-color-image { + -gtk-icon-filter: none; +} + +// adds a subtle shadow to the calendar color dot when it makes sense +image.calendar-color-image, +button:active:not(:backdrop) .calendar-color-image, +button:checked:not(:backdrop) .calendar-color-image, +.calendars-list .calendar-color-image:not(:backdrop):not(:disabled), +.calendar-list .calendar-color-image:not(:backdrop):not(:disabled), +.sources-button:not(:backdrop):not(:disabled) .calendar-color-image { + -gtk-icon-shadow: 0 1px gtkalpha(black, 0.1); +} + +// Date chooser + +// month/year controls +datechooser { + navigator { // add some space between the two controls + margin-right: $space-size; + margin-left: $space-size; + margin-bottom: $space-size; + } + + navigator { + label { font-weight: bold; } + + button.flat, + button.toggle, + button.image-button { + min-height: $medium-size; + min-width: $medium-size; + padding: 0; + } + } + + // day names and week numbers + .weeknum, .weekday { + color: $text-disabled; + font-size: smaller; + } + + // days + button.day { + font-size: 10pt; + font-weight: normal; + margin: $space-size / 2; + padding: 0; + min-height: $medium-size; + min-width: $medium-size; + transition: none; + + dot { + background-color: $text; + border-radius: 50%; + min-height: $space-size / 2; + min-width: $space-size / 2; + } + + &:selected, &.today:selected { + background-color: $primary; + color: on($primary); + font-weight: bold; + + dot { background-color: on($primary); } + } + + &.today { + color: $primary; + + dot { background-color: $primary; } + } + + &.other-month { + &:not(:hover), + &:backdrop { + color: gtkalpha(currentColor, 0.1); + + dot { background-color: gtkalpha(currentColor, 0.1); } + } + + &:hover:not(:backdrop) { + color: $text-disabled; + + dot { background-color: $text-disabled; } + } + } + } +} + +// Week View CSS +.week-header { + padding: 0; + + & > box:first-child { + border-bottom: 1px solid $border; + } + + .week-number { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2 $space-size * 2 $space-size * 3 $space-size * 2; + color: $track; + } + + &.week-temperature { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; + } + + &.lines { + color: $border; + } +} + +weekhourbar > label { + font-size: 10pt; + padding: 4px $space-size; +} + +.week-view .lines { + color: $border; +} + +weekgrid > widget.now-strip { + background-color: gtkalpha($primary, 0.8); + margin: 0 0 0 1px; + min-height: 3px; +} + +weekgrid, +.week-header { + &:selected, &.dnd { + background-color: gtkalpha($primary, 0.25); + } +} + +// Month cell +monthcell { + border: solid 1px $border; + border-width: 1px 0 0 1px; + background-color: transparent; + transition: background-color 200ms; + + &:hover:not(.out-of-month):not(.today) { + background-color: $base-alt; + transition: background-color 200ms; + color: $text; + } + + &:selected { + background-color: gtkalpha($primary, 0.1); + + &:hover { + background-color: gtkalpha($primary, 0.2); + } + + label.day-label { font-weight: bold; } + } + + &:nth-child(7n + 1) { border-left-width: 0; } + + &.today { + background-color: gtkalpha($primary, 0.2); + + &:hover { + background-color: gtkalpha($primary, 0.3); + color: $primary; + } + + &:selected { + background-color: gtkalpha($primary, 0.25); + + &:hover { + background-color: gtkalpha($primary, 0.35); + } + } + } + + label { + color: $text; + font-size: 0.9rem; + + &.day-label { + font-size: 1rem; + } + } + + &.out-of-month { + background-color: $fill; + + label { + color: $text-secondary; + } + } + + button { + padding: 0 $space-size; + border-radius: 0; + border-bottom: none; + border-right: none; + } +} + +// Month popover +monthpopover > box { + margin: 0; + padding: 0; + background-color: transparent; +} + +.notes-section box > textview { + border-radius: $corner-radius; + padding: $space-size; + + > text { + background: none; + } +} + +// Agenda View CSS +agenda-view { + list { + > row { + padding: 2px $space-size * 2; + } + + > label { + padding: $space-size $space-size * 2; + } + } + + > scrolledwindow > viewport > list.background { + background-color: transparent; + } +} + +label.no-events { + font-style: italic; +} + +// Search +searchbutton > popover > arrow { + background: none; + border: none; +} + +// Month selector +datechooser { + padding: $space-size; + + .current-week { + background: gtkalpha($titlebar, 0.7); + color: on($titlebar); + border-radius: $corner-radius; + } +} + +menubutton { + &.sources-button { + margin-top: 0; + margin-bottom: 0; + border-radius: 0; + border-top-style: none; + border-bottom-style: none; + + &:hover:not(:backdrop) { + background-image: none; + text-shadow: none; + } + + > button { + border-radius: 0; + + .title { + font-size: 10pt; + font-weight: normal; + padding: 0 $space-size; + } + + .subtitle { + font-size: 8pt; + padding: 0 $space-size; + } + + .calendar-color-image { + -gtk-icon-size: 12px; + } + } + } + + stack > box { + border-spacing: $space-size; + } + + .topbar headerbar &.sources-button { + > button { + border-radius: 0 0 $corner-radius $corner-radius; + } + } +} + +// +// Contacts +// + +.contacts-contact-list list.navigation-sidebar { + background: none; +} + +// +// Gnome Software +// + +.details-page { + margin: $space-size * 4 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: $primary; + border-radius: 0; + color: on($primary); + text-shadow: 0 1px 0 rgba(black, 0.2); +} + +screenshot-carousel box.frame { + border-width: 1px 0; + border-radius: 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: $space-size * 2; +} + +.screenshot-image-main .image1, +.screenshot-image-main .image2 { + margin-top: $space-size; + margin-bottom: $space-size * 2; + margin-left: $space-size; + margin-right: $space-size; +} + +.app-tile-label { + font-size: 105%; +} + +.review-textbox { + padding: $space-size; +} + +.origin-rounded-box { + background-color: $divider; + border-radius: $circular-radius; + padding: $space-size - 2px; +} + +.origin-beta { + color: $warning; +} + +.origin-button > button { + padding: $space-size / 2 $space-size * 1.5; +} + +.card flowboxchild { + &.card { + border: none; + box-shadow: none; + padding: 0; + background: none; + } +} + +.category-tile.card { + padding: $space-size * 3.5; + border: none; + border-radius: $corner-radius; + min-width: 140px; + font-weight: 900; + font-size: larger; + box-shadow: $shadow-z3; + + &.category-tile-iconless { + padding: $space-size * 1.5 $space-size * 2.5; + min-width: 130px; + font-size: 105%; + font-weight: normal; + box-shadow: none; + background-color: $fill; + } + + // Styling for specific category buttons. + &.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#ce8cd7, .95) 0%, shade(#2861c6, .95) 100%); + color: white; + } + } + + &.category-develop { + background: #5e5c64; + color: white; + + &:hover { + background: shade(#5e5c64, 1.2); + color: white; + } + + &:active { + background-color: shade(#5e5c64, .95); + color: white; + } + } + + &.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#2ec27e, .95) 30%, shade(#27a66c, .95) 100%); + color: white; + } + } + + &.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; + + &:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + + &:active { + background: linear-gradient(75deg, shade(#f9e2a7, .97) 0%, shade(#eb5ec3, .95) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + } + + &.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: $text-secondary; + + &:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); + } + + &:active { + background: linear-gradient(90deg, shade(#ef4e9b, .95) 0%, shade(#f77466, .95) 100%); + } + } + + &.category-work { + padding: 1px; /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color:#fdf8d7; + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; + + &:hover { + color: #1c71d8; + background-color: lighten(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + + &:active { + color: #1c71d8; + background-color: darken(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + } +} + +clamp.medium .category-tile:not(.category-tile-iconless), +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +// The rest of the featured-tile CSS is loaded at runtime in gs-feature-tile.c +.featured-tile { + padding: 0; + box-shadow: none; + color: $text; + + label.title-1 { + margin-top: $space-size; + margin-bottom: $space-size; + } + + &.narrow label.title-1 { + font-size: 16pt; + } +} + +.application-details-infobar { + &, &.info { + background-color: $fill; + color: $text; + border: 1px solid $border; + } + + &.warning { + background-color: $warning; + color: on($warning); + border: 1px solid on($warning, divider); + } +} + +@keyframes install-progress-unknown-move { + 0% { background-position: 0%; } + 50% { background-position: 100%; } + 100% { background-position: 0%; } +} + +.application-details-description .button { + padding-left: $space-size * 4; + padding-right: $space-size * 4; +} + +.install-progress { + background-image: linear-gradient(to top, $primary 2px, gtkalpha($primary, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { background-position: 100% bottom; } + +.review-row > * { + margin: $space-size * 2; +} + +.review-row button { font-size: smaller; } + +.review-row .vote-buttons button { + margin-right: -1px; +} + +// this is the separator between yes and no vote buttons, gtk+ 3.20 only +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, $border, $border) 0 0 0 1 / 5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: $text-disabled; + background-image: none; + background-color: $track; +} + +.review-histogram star-image { + color: $text-disabled; +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0 $space-size * 2 + 4px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: $space-size; + border-bottom: 1px solid $border; +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +star-image { + color: $yellow-dark; +} + +.dimmer-label { + opacity: 0.25; +} + +.update-failed-details { + font-family: Monospace; + font-size: smaller; + padding: $space-size * 2 + 4px; +} + +.upgrade-banner { + padding: 0px; + border-radius: $corner-radius; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, $green-light, $blue-light); + color: white; +} + +.upgrade-buttons #button_upgrades_install { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; +} + +scrolledwindow.list-page > viewport > clamp > box { + margin: $space-size * 4 $space-size * 2; + border-spacing: $space-size * 4; +} + +.update-preferences preferencesgroup > box > box { + margin-top: $space-size * 3; +} + +.section > label:not(:first-child) { margin-top: $space-size; } + +.section > box:not(:first-child) { margin-top: $space-size * 2; } + +clamp.status-page { + margin: $space-size * 6 $space-size * 2; +} + +clamp.status-page .iconbox { + min-height: 128px; + min-width: 128px; +} + +clamp.status-page .icon { + color: $text-disabled; + min-height: 32px; + min-width: 32px; +} + +clamp.status-page .icon:not(:last-child) { + margin-bottom: $space-size * 6; +} + +clamp.status-page .title:not(:last-child) { + margin-bottom: $space-size * 2; +} + +app-context-bar { + .context-tile { + border: 1px solid $border; + background-color: transparent; + border-radius: 0; + padding: $space-size * 4 $space-size * 2 $space-size * 3.5 $space-size * 2; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; + + &:hover { + background-image: none; + background-color: $overlay-hover; + } + + &.keyboard-activating, + &:active { + background-color: $overlay-active; + } + + &:focus:focus-visible { + outline-offset: -1px; + } + } + + &.horizontal box:first-child .context-tile:first-child, + &.vertical .context-tile:first-child { + border-left: none; + } + + &.horizontal .context-tile, + &.vertical box:first-child .context-tile { + border-top: none; + } + + > box:not(:first-child) > button.flat { + border-radius: 0; + + &:last-child { + border-radius: 0 $corner-radius $corner-radius 0; + } + } + + > box:first-child > button.flat { + border-radius: 0; + + &:first-child { + border-radius: $corner-radius 0 0 $corner-radius; + } + } + + > box > button.flat { + border-left-color: $border; + } +} + +carousel.card { + border: none; + background-color: $fill; +} + +.context-tile-lozenge { + min-height: 28px; + min-width: 28px; + padding: $space-size; + font-size: 18px; + font-weight: bold; + border-radius: $circular-radius; + + &.large { + font-size: 24px; + padding: 16px; + min-width: 24px; /* 60px minus the left and right padding */ + min-height: 24px; /* 60px minus the top and bottom padding */ + } + + &.wide-image image { + margin-top: -28px; + margin-bottom: -28px; + } + + image { -gtk-icon-style: symbolic; } + + &.grey { + color: $text; + background-color: $divider; + } + + &.green, &.details-rating-0 { + color: darken($success, 15%); + background-color: rgba($success, 0.15); + } + + &.blue, + &.details-rating-5 { + color: $blue-light; + background-color: rgba($blue-light, 0.15); + } + + &.yellow, &.details-rating-12 { + color: darken($warning, 15%); + background-color: rgba($warning, 0.15); + } + + &.details-rating-15 { + color: $orange-light; + background-color: rgba($orange-light, .15); + } + + &.red, &.details-rating-18 { + color: darken($error, 15%); + background-color: rgba($error, 0.15); + } +} + +.eol-red { + font-weight: bold; + color: $error; +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +scrolledwindow.fake-adw-status-page > viewport > box { margin: $space-size * 6 $space-size * 2; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { margin-bottom: $space-size * 2; } + +statuspage.icon-dropshadow image.icon { + -gtk-icon-shadow: 0 1px 12px rgba(0,0,0,0.05), + 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +window.info scrollbar.vertical { + margin-top: 48px; + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + margin-top: 0; +} + +// GsAppRow +row.app > box.header { + margin-left: $space-size * 2; + margin-right: $space-size * 2; +} + +row.app > box.header { + border-spacing: $space-size * 2; +} + +row.app > box.header > image { + margin-top: $space-size * 2; + margin-bottom: $space-size * 2; +} + +row.app label.warning { + color: $error; +} + +// GtkSpinner + +// Ensure the spinner is hidden before the animation is triggered. +@keyframes pre-delay { + from { opacity: 0; } + to { opacity: 0; } +} + +@keyframes fade-in { + from { filter: opacity(0%); } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} + +// Leaflets +window > contents > leaflet { // Gnome control center + > box > stack.background { + background-color: transparent; + background-image: linear-gradient(to bottom, + transparent, + transparent $large-size, + $background $large-size, + $background); + } +} + +// +// Gnome Weather +// + +@define-color weather_temp_chart_fill_color #{rgba($warning, 0.5)}; +@define-color weather_temp_chart_stroke_color #{darken($warning, 10%)}; +@define-color weather_thermometer_warm_color #{if($variant == 'light', $yellow-dark, $yellow-light)}; +@define-color weather_thermometer_cold_color #{if($variant == 'light', $blue-dark, $blue-light)}; + +$weather_thermometer_high_color: $yellow-light; +$weather_thermometer_low_color: $blue-light; +$weather_forecast_color: #ae7b03; + +#places-label { + font-weight: bold; +} + +#temperature-label { + font-size: 32pt; + font-weight: 900; + margin-left: 9px; +} + +#conditions-grid *:backdrop { + color: $text-secondary; +} + +.content-view.cell { + font-weight: bold; +} + +#locationEntry { + margin: $space-size; +} + +.weather-popover { + margin-top: $space-size; +} + +.forecast-card { + transition: border-radius 100ms ease-out; + border-radius: $corner-radius; +} + +.forecast-card separator { + background-color: $border; +} + +#daily-forecast-box { + > separator:last-child { + background-color: transparent; + min-width: 0; + } +} + +#conditions-grid, +#attributionGrid { + margin-left: $space-size * 3; + margin-right: $space-size * 3; +} + +#weather-page .small .forecast-card { + margin-left: 0; + margin-right: 0; + border-radius: 0; + border-width: 1px 0; +} + +.forecast-temperature-label { + font-weight: bold; + color: $weather_forecast_color; +} + +WeatherThermometer { + margin-bottom: $space-size * 2; +} + +WeatherThermometer > label.high { + font-weight: bold; + color: $weather_thermometer_high_color; +} + +WeatherThermometer > label.low { + font-weight: bold; + color: $weather_thermometer_low_color; +} + +.forecast-button { + margin: 0 $space-size * 2; +} + +.forecast-graphic { + margin: $space-size * 3; +} + +button.osd.circular { + border-radius: $circular-radius; + min-width: $small-size; + min-height: $small-size; +} + +button.osd.circular > image { + padding: 0; +} + +scrolledwindow.inline list, +scrolledwindow.inline listview { + background: none; + color: inherit; +} + +scrolledwindow.inline undershoot.top { + box-shadow: inset 0 1px $border; +} + +.search-view { + background-color: $blue-dark; + color: on($blue-dark); +} + +.search-view menubutton button:focus:focus-visible { + outline-color: rgba(white, 0.3); +} + +image.circular { + min-width: $medium-size; + min-height: $medium-size; + padding: 0; + border-radius: $circular-radius; +} + +// WeatherThermometerScale { +// border-radius: $circular-radius; +// background-image: linear-gradient(to bottom, $weather_thermometer_warm_color, $weather_thermometer_cold_color); +// margin: 0 36px; +// padding: 0; +// } + +// +// Gnome Clocks +// + +.large-button { + padding: $space-size; +} + +// alarms +.alarm-time { + font-size: 2.5em; + font-weight: 300; +} + +.clocks-ampm-toggle-button, +.clocks-secondary-standalone-label { + font-size: 18pt; +} + +.clocks-standalone-label, +.clocks-ringing-label { + font-size: 6em; + font-weight: 300; +} + +.clocks-ringing-title { + font-size: 1.5em; + font-weight: bold; +} + +.clocks-alarm-setup-time { + font-size: 32pt; +} + +// Timer Panel +.clocks-timer-label, +.clocks-spinbutton { + font-size: 48pt; +} + +// disguise insensitive spinbuttons as normal labels +.timer-panel .timer-header { + font-size: 20pt; + font-weight: 300; +} + +.timer-countdown { + font-size: 40pt; + font-weight: 300; +} + +/* Stopwatch Panel */ +.lap-time { + font-weight: bold; +} + +.stopped-stopwatch label, +.running-stopwatch label, +.paused-stopwatch label { + font-size: 70px; + font-weight: lighter; +} + +.stopped-stopwatch .seconds-label { + font-weight: 300; +} + +.running-stopwatch .seconds-label, +.running-stopwatch .miliseconds-label { + color: $primary; +} + +.stopped-stopwatch .miliseconds-label, +.running-stopwatch .miliseconds-label, +.paused-stopwatch .miliseconds-label { + font-size: 50px; +} + +.running-stopwatch .seconds-label, +.paused-stopwatch .seconds-label { + font-weight: 300; +} + +// World +.clock-location { + font-weight: bolder; +} + +.hidden { + opacity: 0; +} + +.clock-time { + font-size: 2em; + padding: 0.2em 0.5em; + border-radius: 1em; +} + +.none .clock-time { + background: gtkalpha(currentColor, 0.2); +} + +.night .clock-time { + color: $blue-dark; + background-color: gtkalpha($blue-light, 0.25); +} + +.naut .clock-time, +.astro .clock-time { + color: $orange-dark; + background-color: gtkalpha($orange-light, 0.25); +} + +.civil .clock-time, +.day .clock-time { + color: $yellow-dark; + background: gtkalpha($yellow-light, 0.25); +} + +// +// Builder +// + +headerbar splitbutton { + notification button { + margin: 0; + min-height: $small-size; + min-width: $small-size; + padding: 0; + } +} + +popover.background.global-search { + > arrow, > contents { padding: 0; } +} + +panelframeswitcher { + padding: $space-size; + min-height: $medium-size; +} + +.frameheader.header { + // min-height: $small-size; + background-color: $titlebar; + + &:backdrop { + background-color: $titlebar-backdrop; + } + + > button { + border: none; + margin: 0; + padding: $space-size / 2; + } + + tabbar.inline { + > revealer > box { + min-height: $small-size; + + .start-action { + padding: 0; + border: none; + } + + .end-action { + padding: 0; + border-left: 1px solid $border; + + button { margin: $space-size; } + } + + tabbox { + border: none; + background: none; + } + } + } +} + +panelstatusbar { + > menubutton > button, + > paneltogglebutton button { border-radius: 0; } +} + +// Setting window +.style-variant { + padding: 0 $space-size * 2; + + button.toggle { + padding: 0; + + &, &:hover, &:focus, &:active, &:checked { + background: none; + outline: none; + border: none; + box-shadow: none; + } + + > stylevariantpreview > .wallpaper { + border-radius: $corner-radius; + outline-color: transparent; + outline-width: 3px; + outline-offset: $space-size / 2; + outline-style: solid; + box-shadow: none; + } + + &:hover > stylevariantpreview > .wallpaper { + outline-color: $fill; + } + + &:active > stylevariantpreview > .wallpaper { + outline-color: $track; + } + + &:checked > stylevariantpreview > .wallpaper { + outline-color: $primary; + } + } +} + +// +// Amberol +// + +playlistview { + scrollbar { + &.overlay-indicator { + &.dragging, + &.hovering { background-color: transparent; } + } + } + + queuerow { + picture.cover, + image.card { border: none; } + } +} + +// +// Console +// + +.exit-info { + padding: 6px; + border-top: 2px solid $primary; + background: rgba($primary, 0.9); + color: on($primary); +} + +.error .exit-info { + border-top: 2px solid $error; + background: rgba($error, 0.9); + color: on($error); +} + +// +// dialogs +// + +window.dialog { + > .dialog-vbox > box > scrolledwindow > viewport > widget { + > list.boxed-list { + border: none; + border-radius: 0; + + > row { + &:first-child, &:last-child { border-radius: 0; } + } + } + } +} diff --git a/src/sass/libadwaita/apps/_calendar.scss b/src/sass/libadwaita/apps/_calendar.scss new file mode 100644 index 00000000..7e9381aa --- /dev/null +++ b/src/sass/libadwaita/apps/_calendar.scss @@ -0,0 +1,1595 @@ + +// +// Nautilus +// +.nautilus-window { + placesview { + label { color: $text-secondary; } + } + + .nautilus-grid-view { + child.activatable { + @extend %row_activatable; + } + } + + .floating-bar { + min-height: 32px; + padding: 0; + margin: $space-size; + border-style: none; + border-radius: $corner-radius; + background-color: $primary; + color: on($primary); + box-shadow: $shadow-z3; + + button { + margin: (32px - $small-size) / 2; + color: on($primary); + + @extend %small-button; + } + } +} + +#NautilusQueryEditor { // search entry + > menubutton > button.image-button { + min-width: 24px; + min-height: 24px; + } + + > text, > box, > menubutton > button.image-button { + margin: $space-size 0; + } +} + +#NautilusQueryEditorTag { + background-color: $divider; + + > button.image-button { + margin: 0; + padding: 0; + } +} + +#NautilusPathBar { + background-color: $titlebar-fill; + border-radius: $corner-radius; + margin: $space-size 0; + + .content-pane & { + background-color: $fill; + } +} + +#NautilusPathButton { + margin: 0 $space-size / 2; + border-radius: $corner-radius; + + &.current-dir { + color: $titlebar-text; + + &:hover, &:active { + background: none; + box-shadow: none; + } + } + + .content-pane &.current-dir { + color: $text; + } + + &:first-child { margin-left: 0; } +} + +#NautilusViewCell { + clamp box { + margin: 0; + border-spacing: 0; + } +} + +navigation-view-page { + > toolbarview > scrolledwindow > viewport > clamp > box.medium > box > stack > button { + margin-top: $space-size * 2; + } +} + +// +// Gnome Control Center +// + +window.dialog { + > box > stack > box > box { + > notebook.frame { + border-width: 0 0 0 1px; + border-radius: 0; + } + } +} + +.background-thumbnail { + > button.remove-button { + margin: $space-size; + } +} + +// +// Calculator +// + +.display-container { + .small &.card { + border-radius: 0; + box-shadow: none; + border-width: 0 0 1px 0; + } + + .history-view { background-color: $base; } + + #displayitem { + padding: 0 12px 8px 0; + font-size: 1.4em; + border-top: 1px solid $border; + } +} + +.math-buttons button { + font-size: 1.1em; + padding: 2px $space-size; + + &.text-button { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; + } +} + +leaflet { + button.number-button { + background-color: rgba($text, 0.1); + + &:hover { + background-color: rgba($text, 0.2); + } + + &:active { + background-color: rgba($text, 0.3); + } + } +} + +// +// Calendar +// + +// labels +label { + &.primary-label, &.month-name, &.secondary-label { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2; + } + + &.primary-label, &.month-name { + color: $primary; + } + + &.secondary-label { + color: $text-disabled; + } +} + +calendar-view { + font-size: 10pt; + + &:selected { + color: $primary; + font-weight: bold; + } +} + +calendar-view.header, +label.header { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; +} + +calendar-view.current, +weekgrid.current { + background-color: gtkalpha($primary, 0.3); +} + +popover.events { + background-color: $popover; + padding: 0; + + box { + border-top-left-radius: $corner-radius; + border-top-right-radius: $corner-radius; + } + + list { + background-color: $base; + border-radius: $corner-radius; + } + + scrolledwindow { + border-width: 0; + } + + button { + border-radius: $corner-radius; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-style: solid none none; + box-shadow: none; + } +} + +// Event widget +event { + margin: 1px; + font-size: 0.9rem; + + widget.content { + margin: 4px; + } + + &.timed, + &:not(.slanted):not(.slanted-start):not(.slanted-end) { + border-radius: $corner-radius; + } + + &.timed widget.edge { + border-radius: $corner-radius / 2; + min-width: 5px; + } + + &.slanted-start, + &.slanted-end:dir(rtl) { + padding-left: $space-size * 2 + 4px; + border-radius: 0 $corner-radius / 2 $corner-radius / 2 0; + } + + &.slanted-end, + &.slanted-start:dir(rtl) { + padding-right: $space-size * 2 + 4px; + border-radius: $corner-radius / 2 0 0 $corner-radius / 2; + } + + &:not(.timed).color-dark { + color: white; + outline-color: rgba(0, 0, 0, 0.3); + } + + &.timed, + &:not(.timed).color-light { + color: gtkalpha(black, 0.75); + outline-color: rgba(255, 255, 255, 0.5); + } + +} + +// Event Popover +popover.event-popover, +popover.event-popover > contents { + padding: 0; +} + +.search-viewport { + background-color: $base; +} + +// calendar popover +.calendar-list { + background-color: transparent; + + > list { + border-radius: 4px; + } +} + +// defeats the ugly hover effect of the calendar color dot on buttons +.calendar-color-image { + -gtk-icon-filter: none; +} + +// adds a subtle shadow to the calendar color dot when it makes sense +image.calendar-color-image, +button:active:not(:backdrop) .calendar-color-image, +button:checked:not(:backdrop) .calendar-color-image, +.calendars-list .calendar-color-image:not(:backdrop):not(:disabled), +.calendar-list .calendar-color-image:not(:backdrop):not(:disabled), +.sources-button:not(:backdrop):not(:disabled) .calendar-color-image { + -gtk-icon-shadow: 0 1px gtkalpha(black, 0.1); +} + +// Date chooser + +// month/year controls +datechooser { + navigator { // add some space between the two controls + margin-right: $space-size; + margin-left: $space-size; + margin-bottom: $space-size; + } + + navigator { + label { font-weight: bold; } + + button.flat, + button.toggle, + button.image-button { + min-height: $medium-size; + min-width: $medium-size; + padding: 0; + } + } + + // day names and week numbers + .weeknum, .weekday { + color: $text-disabled; + font-size: smaller; + } + + // days + button.day { + font-size: 10pt; + font-weight: normal; + margin: $space-size / 2; + padding: 0; + min-height: $medium-size; + min-width: $medium-size; + transition: none; + + dot { + background-color: $text; + border-radius: 50%; + min-height: $space-size / 2; + min-width: $space-size / 2; + } + + &:selected, &.today:selected { + background-color: $primary; + color: on($primary); + font-weight: bold; + + dot { background-color: on($primary); } + } + + &.today { + color: $primary; + + dot { background-color: $primary; } + } + + &.other-month { + &:not(:hover), + &:backdrop { + color: gtkalpha(currentColor, 0.1); + + dot { background-color: gtkalpha(currentColor, 0.1); } + } + + &:hover:not(:backdrop) { + color: $text-disabled; + + dot { background-color: $text-disabled; } + } + } + } +} + +// Week View CSS +.week-header { + padding: 0; + + & > box:first-child { + border-bottom: 1px solid $border; + } + + .week-number { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2 $space-size * 2 $space-size * 3 $space-size * 2; + color: $track; + } + + &.week-temperature { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; + } + + &.lines { + color: $border; + } +} + +weekhourbar > label { + font-size: 10pt; + padding: 4px $space-size; +} + +.week-view .lines { + color: $border; +} + +weekgrid > widget.now-strip { + background-color: gtkalpha($primary, 0.8); + margin: 0 0 0 1px; + min-height: 3px; +} + +weekgrid, +.week-header { + &:selected, &.dnd { + background-color: gtkalpha($primary, 0.25); + } +} + +// Month cell +monthcell { + border: solid 1px $border; + border-width: 1px 0 0 1px; + background-color: transparent; + transition: background-color 200ms; + + &:hover:not(.out-of-month):not(.today) { + background-color: $base-alt; + transition: background-color 200ms; + color: $text; + } + + &:selected { + background-color: gtkalpha($primary, 0.1); + + &:hover { + background-color: gtkalpha($primary, 0.2); + } + + label.day-label { font-weight: bold; } + } + + &:nth-child(7n + 1) { border-left-width: 0; } + + &.today { + background-color: gtkalpha($primary, 0.2); + + &:hover { + background-color: gtkalpha($primary, 0.3); + color: $primary; + } + + &:selected { + background-color: gtkalpha($primary, 0.25); + + &:hover { + background-color: gtkalpha($primary, 0.35); + } + } + } + + label { + color: $text; + font-size: 0.9rem; + + &.day-label { + font-size: 1rem; + } + } + + &.out-of-month { + background-color: $fill; + + label { + color: $text-secondary; + } + } + + button { + padding: 0 $space-size; + border-radius: 0; + border-bottom: none; + border-right: none; + } +} + +// Month popover +monthpopover > box { + margin: 0; + padding: 0; + background-color: transparent; +} + +.notes-section box > textview { + border-radius: $corner-radius; + padding: $space-size; + + > text { + background: none; + } +} + +// Agenda View CSS +agenda-view { + list { + > row { + padding: 2px $space-size * 2; + } + + > label { + padding: $space-size $space-size * 2; + } + } + + > scrolledwindow > viewport > list.background { + background-color: transparent; + } +} + +label.no-events { + font-style: italic; +} + +// Search +searchbutton > popover > arrow { + background: none; + border: none; +} + +// Month selector +datechooser { + padding: $space-size; + + .current-week { + background: gtkalpha($titlebar, 0.7); + color: on($titlebar); + border-radius: $corner-radius; + } +} + +menubutton { + &.sources-button { + margin-top: 0; + margin-bottom: 0; + border-radius: 0; + border-top-style: none; + border-bottom-style: none; + + &:hover:not(:backdrop) { + background-image: none; + text-shadow: none; + } + + > button { + border-radius: 0; + + .title { + font-size: 10pt; + font-weight: normal; + padding: 0 $space-size; + } + + .subtitle { + font-size: 8pt; + padding: 0 $space-size; + } + + .calendar-color-image { + -gtk-icon-size: 12px; + } + } + } + + stack > box { + border-spacing: $space-size; + } + + .topbar headerbar &.sources-button { + > button { + border-radius: 0 0 $corner-radius $corner-radius; + } + } +} + +// +// Contacts +// + +.contacts-contact-list list.navigation-sidebar { + background: none; +} + +// +// Gnome Software +// + +.details-page { + margin: $space-size * 4 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: $primary; + border-radius: 0; + color: on($primary); + text-shadow: 0 1px 0 rgba(black, 0.2); +} + +screenshot-carousel box.frame { + border-width: 1px 0; + border-radius: 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: $space-size * 2; +} + +.screenshot-image-main .image1, +.screenshot-image-main .image2 { + margin-top: $space-size; + margin-bottom: $space-size * 2; + margin-left: $space-size; + margin-right: $space-size; +} + +.app-tile-label { + font-size: 105%; +} + +.review-textbox { + padding: $space-size; +} + +.origin-rounded-box { + background-color: $divider; + border-radius: $circular-radius; + padding: $space-size - 2px; +} + +.origin-beta { + color: $warning; +} + +.origin-button > button { + padding: $space-size / 2 $space-size * 1.5; +} + +.card flowboxchild { + &.card { + border: none; + box-shadow: none; + padding: 0; + background: none; + } +} + +.category-tile.card { + padding: $space-size * 3.5; + border: none; + border-radius: $corner-radius; + min-width: 140px; + font-weight: 900; + font-size: larger; + box-shadow: $shadow-z3; + + &.category-tile-iconless { + padding: $space-size * 1.5 $space-size * 2.5; + min-width: 130px; + font-size: 105%; + font-weight: normal; + box-shadow: none; + background-color: $fill; + } + + // Styling for specific category buttons. + &.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#ce8cd7, .95) 0%, shade(#2861c6, .95) 100%); + color: white; + } + } + + &.category-develop { + background: #5e5c64; + color: white; + + &:hover { + background: shade(#5e5c64, 1.2); + color: white; + } + + &:active { + background-color: shade(#5e5c64, .95); + color: white; + } + } + + &.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#2ec27e, .95) 30%, shade(#27a66c, .95) 100%); + color: white; + } + } + + &.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; + + &:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + + &:active { + background: linear-gradient(75deg, shade(#f9e2a7, .97) 0%, shade(#eb5ec3, .95) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + } + + &.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: $text-secondary; + + &:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); + } + + &:active { + background: linear-gradient(90deg, shade(#ef4e9b, .95) 0%, shade(#f77466, .95) 100%); + } + } + + &.category-work { + padding: 1px; /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color:#fdf8d7; + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; + + &:hover { + color: #1c71d8; + background-color: lighten(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + + &:active { + color: #1c71d8; + background-color: darken(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + } +} + +clamp.medium .category-tile:not(.category-tile-iconless), +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +// The rest of the featured-tile CSS is loaded at runtime in gs-feature-tile.c +.featured-tile { + padding: 0; + box-shadow: none; + color: $text; + + label.title-1 { + margin-top: $space-size; + margin-bottom: $space-size; + } + + &.narrow label.title-1 { + font-size: 16pt; + } +} + +.application-details-infobar { + &, &.info { + background-color: $fill; + color: $text; + border: 1px solid $border; + } + + &.warning { + background-color: $warning; + color: on($warning); + border: 1px solid on($warning, divider); + } +} + +@keyframes install-progress-unknown-move { + 0% { background-position: 0%; } + 50% { background-position: 100%; } + 100% { background-position: 0%; } +} + +.application-details-description .button { + padding-left: $space-size * 4; + padding-right: $space-size * 4; +} + +.install-progress { + background-image: linear-gradient(to top, $primary 2px, gtkalpha($primary, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { background-position: 100% bottom; } + +.review-row > * { + margin: $space-size * 2; +} + +.review-row button { font-size: smaller; } + +.review-row .vote-buttons button { + margin-right: -1px; +} + +// this is the separator between yes and no vote buttons, gtk+ 3.20 only +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, $border, $border) 0 0 0 1 / 5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: $text-disabled; + background-image: none; + background-color: $track; +} + +.review-histogram star-image { + color: $text-disabled; +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0 $space-size * 2 + 4px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: $space-size; + border-bottom: 1px solid $border; +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +star-image { + color: $yellow-dark; +} + +.dimmer-label { + opacity: 0.25; +} + +.update-failed-details { + font-family: Monospace; + font-size: smaller; + padding: $space-size * 2 + 4px; +} + +.upgrade-banner { + padding: 0px; + border-radius: $corner-radius; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, $green-light, $blue-light); + color: white; +} + +.upgrade-buttons #button_upgrades_install { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; +} + +scrolledwindow.list-page > viewport > clamp > box { + margin: $space-size * 4 $space-size * 2; + border-spacing: $space-size * 4; +} + +.update-preferences preferencesgroup > box > box { + margin-top: $space-size * 3; +} + +.section > label:not(:first-child) { margin-top: $space-size; } + +.section > box:not(:first-child) { margin-top: $space-size * 2; } + +clamp.status-page { + margin: $space-size * 6 $space-size * 2; +} + +clamp.status-page .iconbox { + min-height: 128px; + min-width: 128px; +} + +clamp.status-page .icon { + color: $text-disabled; + min-height: 32px; + min-width: 32px; +} + +clamp.status-page .icon:not(:last-child) { + margin-bottom: $space-size * 6; +} + +clamp.status-page .title:not(:last-child) { + margin-bottom: $space-size * 2; +} + +app-context-bar { + .context-tile { + border: 1px solid $border; + background-color: transparent; + border-radius: 0; + padding: $space-size * 4 $space-size * 2 $space-size * 3.5 $space-size * 2; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; + + &:hover { + background-image: none; + background-color: $overlay-hover; + } + + &.keyboard-activating, + &:active { + background-color: $overlay-active; + } + + &:focus:focus-visible { + outline-offset: -1px; + } + } + + &.horizontal box:first-child .context-tile:first-child, + &.vertical .context-tile:first-child { + border-left: none; + } + + &.horizontal .context-tile, + &.vertical box:first-child .context-tile { + border-top: none; + } + + > box:not(:first-child) > button.flat { + border-radius: 0; + + &:last-child { + border-radius: 0 $corner-radius $corner-radius 0; + } + } + + > box:first-child > button.flat { + border-radius: 0; + + &:first-child { + border-radius: $corner-radius 0 0 $corner-radius; + } + } + + > box > button.flat { + border-left-color: $border; + } +} + +carousel.card { + border: none; + background-color: $fill; +} + +.context-tile-lozenge { + min-height: 28px; + min-width: 28px; + padding: $space-size; + font-size: 18px; + font-weight: bold; + border-radius: $circular-radius; + + &.large { + font-size: 24px; + padding: 16px; + min-width: 24px; /* 60px minus the left and right padding */ + min-height: 24px; /* 60px minus the top and bottom padding */ + } + + &.wide-image image { + margin-top: -28px; + margin-bottom: -28px; + } + + image { -gtk-icon-style: symbolic; } + + &.grey { + color: $text; + background-color: $divider; + } + + &.green, &.details-rating-0 { + color: darken($success, 15%); + background-color: rgba($success, 0.15); + } + + &.blue, + &.details-rating-5 { + color: $blue-light; + background-color: rgba($blue-light, 0.15); + } + + &.yellow, &.details-rating-12 { + color: darken($warning, 15%); + background-color: rgba($warning, 0.15); + } + + &.details-rating-15 { + color: $orange-light; + background-color: rgba($orange-light, .15); + } + + &.red, &.details-rating-18 { + color: darken($error, 15%); + background-color: rgba($error, 0.15); + } +} + +.eol-red { + font-weight: bold; + color: $error; +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +scrolledwindow.fake-adw-status-page > viewport > box { margin: $space-size * 6 $space-size * 2; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { margin-bottom: $space-size * 2; } + +statuspage.icon-dropshadow image.icon { + -gtk-icon-shadow: 0 1px 12px rgba(0,0,0,0.05), + 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +window.info scrollbar.vertical { + margin-top: 48px; + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + margin-top: 0; +} + +// GsAppRow +row.app > box.header { + margin-left: $space-size * 2; + margin-right: $space-size * 2; +} + +row.app > box.header { + border-spacing: $space-size * 2; +} + +row.app > box.header > image { + margin-top: $space-size * 2; + margin-bottom: $space-size * 2; +} + +row.app label.warning { + color: $error; +} + +// GtkSpinner + +// Ensure the spinner is hidden before the animation is triggered. +@keyframes pre-delay { + from { opacity: 0; } + to { opacity: 0; } +} + +@keyframes fade-in { + from { filter: opacity(0%); } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} + +// Leaflets +window > contents > leaflet { // Gnome control center + > box > stack.background { + background-color: transparent; + background-image: linear-gradient(to bottom, + transparent, + transparent $large-size, + $background $large-size, + $background); + } +} + +// +// Gnome Weather +// + +@define-color weather_temp_chart_fill_color #{rgba($warning, 0.5)}; +@define-color weather_temp_chart_stroke_color #{darken($warning, 10%)}; +@define-color weather_thermometer_warm_color #{if($variant == 'light', $yellow-dark, $yellow-light)}; +@define-color weather_thermometer_cold_color #{if($variant == 'light', $blue-dark, $blue-light)}; + +$weather_thermometer_high_color: $yellow-light; +$weather_thermometer_low_color: $blue-light; +$weather_forecast_color: #ae7b03; + +#places-label { + font-weight: bold; +} + +#temperature-label { + font-size: 32pt; + font-weight: 900; + margin-left: 9px; +} + +#conditions-grid *:backdrop { + color: $text-secondary; +} + +.content-view.cell { + font-weight: bold; +} + +#locationEntry { + margin: $space-size; +} + +.weather-popover { + margin-top: $space-size; +} + +.forecast-card { + transition: border-radius 100ms ease-out; + border-radius: $corner-radius; +} + +.forecast-card separator { + background-color: $border; +} + +#daily-forecast-box { + > separator:last-child { + background-color: transparent; + min-width: 0; + } +} + +#conditions-grid, +#attributionGrid { + margin-left: $space-size * 3; + margin-right: $space-size * 3; +} + +#weather-page .small .forecast-card { + margin-left: 0; + margin-right: 0; + border-radius: 0; + border-width: 1px 0; +} + +.forecast-temperature-label { + font-weight: bold; + color: $weather_forecast_color; +} + +WeatherThermometer { + margin-bottom: $space-size * 2; +} + +WeatherThermometer > label.high { + font-weight: bold; + color: $weather_thermometer_high_color; +} + +WeatherThermometer > label.low { + font-weight: bold; + color: $weather_thermometer_low_color; +} + +.forecast-button { + margin: 0 $space-size * 2; +} + +.forecast-graphic { + margin: $space-size * 3; +} + +button.osd.circular { + border-radius: $circular-radius; + min-width: $small-size; + min-height: $small-size; +} + +button.osd.circular > image { + padding: 0; +} + +scrolledwindow.inline list, +scrolledwindow.inline listview { + background: none; + color: inherit; +} + +scrolledwindow.inline undershoot.top { + box-shadow: inset 0 1px $border; +} + +.search-view { + background-color: $blue-dark; + color: on($blue-dark); +} + +.search-view menubutton button:focus:focus-visible { + outline-color: rgba(white, 0.3); +} + +image.circular { + min-width: $medium-size; + min-height: $medium-size; + padding: 0; + border-radius: $circular-radius; +} + +// WeatherThermometerScale { +// border-radius: $circular-radius; +// background-image: linear-gradient(to bottom, $weather_thermometer_warm_color, $weather_thermometer_cold_color); +// margin: 0 36px; +// padding: 0; +// } + +// +// Gnome Clocks +// + +.large-button { + padding: $space-size; +} + +// alarms +.alarm-time { + font-size: 2.5em; + font-weight: 300; +} + +.clocks-ampm-toggle-button, +.clocks-secondary-standalone-label { + font-size: 18pt; +} + +.clocks-standalone-label, +.clocks-ringing-label { + font-size: 6em; + font-weight: 300; +} + +.clocks-ringing-title { + font-size: 1.5em; + font-weight: bold; +} + +.clocks-alarm-setup-time { + font-size: 32pt; +} + +// Timer Panel +.clocks-timer-label, +.clocks-spinbutton { + font-size: 48pt; +} + +// disguise insensitive spinbuttons as normal labels +.timer-panel .timer-header { + font-size: 20pt; + font-weight: 300; +} + +.timer-countdown { + font-size: 40pt; + font-weight: 300; +} + +/* Stopwatch Panel */ +.lap-time { + font-weight: bold; +} + +.stopped-stopwatch label, +.running-stopwatch label, +.paused-stopwatch label { + font-size: 70px; + font-weight: lighter; +} + +.stopped-stopwatch .seconds-label { + font-weight: 300; +} + +.running-stopwatch .seconds-label, +.running-stopwatch .miliseconds-label { + color: $primary; +} + +.stopped-stopwatch .miliseconds-label, +.running-stopwatch .miliseconds-label, +.paused-stopwatch .miliseconds-label { + font-size: 50px; +} + +.running-stopwatch .seconds-label, +.paused-stopwatch .seconds-label { + font-weight: 300; +} + +// World +.clock-location { + font-weight: bolder; +} + +.hidden { + opacity: 0; +} + +.clock-time { + font-size: 2em; + padding: 0.2em 0.5em; + border-radius: 1em; +} + +.none .clock-time { + background: gtkalpha(currentColor, 0.2); +} + +.night .clock-time { + color: $blue-dark; + background-color: gtkalpha($blue-light, 0.25); +} + +.naut .clock-time, +.astro .clock-time { + color: $orange-dark; + background-color: gtkalpha($orange-light, 0.25); +} + +.civil .clock-time, +.day .clock-time { + color: $yellow-dark; + background: gtkalpha($yellow-light, 0.25); +} + +// +// Builder +// + +headerbar splitbutton { + notification button { + margin: 0; + min-height: $small-size; + min-width: $small-size; + padding: 0; + } +} + +popover.background.global-search { + > arrow, > contents { padding: 0; } +} + +panelframeswitcher { + padding: $space-size; + min-height: $medium-size; +} + +.frameheader.header { + // min-height: $small-size; + background-color: $titlebar; + + &:backdrop { + background-color: $titlebar-backdrop; + } + + > button { + border: none; + margin: 0; + padding: $space-size / 2; + } + + tabbar.inline { + > revealer > box { + min-height: $small-size; + + .start-action { + padding: 0; + border: none; + } + + .end-action { + padding: 0; + border-left: 1px solid $border; + + button { margin: $space-size; } + } + + tabbox { + border: none; + background: none; + } + } + } +} + +panelstatusbar { + > menubutton > button, + > paneltogglebutton button { border-radius: 0; } +} + +// Setting window +.style-variant { + padding: 0 $space-size * 2; + + button.toggle { + padding: 0; + + &, &:hover, &:focus, &:active, &:checked { + background: none; + outline: none; + border: none; + box-shadow: none; + } + + > stylevariantpreview > .wallpaper { + border-radius: $corner-radius; + outline-color: transparent; + outline-width: 3px; + outline-offset: $space-size / 2; + outline-style: solid; + box-shadow: none; + } + + &:hover > stylevariantpreview > .wallpaper { + outline-color: $fill; + } + + &:active > stylevariantpreview > .wallpaper { + outline-color: $track; + } + + &:checked > stylevariantpreview > .wallpaper { + outline-color: $primary; + } + } +} + +// +// Amberol +// + +playlistview { + scrollbar { + &.overlay-indicator { + &.dragging, + &.hovering { background-color: transparent; } + } + } + + queuerow { + picture.cover, + image.card { border: none; } + } +} + +// +// Console +// + +.exit-info { + padding: 6px; + border-top: 2px solid $primary; + background: rgba($primary, 0.9); + color: on($primary); +} + +.error .exit-info { + border-top: 2px solid $error; + background: rgba($error, 0.9); + color: on($error); +} + +// +// dialogs +// + +window.dialog { + > .dialog-vbox > box > scrolledwindow > viewport > widget { + > list.boxed-list { + border: none; + border-radius: 0; + + > row { + &:first-child, &:last-child { border-radius: 0; } + } + } + } +} diff --git a/src/sass/libadwaita/apps/_clocks.scss b/src/sass/libadwaita/apps/_clocks.scss new file mode 100644 index 00000000..7e9381aa --- /dev/null +++ b/src/sass/libadwaita/apps/_clocks.scss @@ -0,0 +1,1595 @@ + +// +// Nautilus +// +.nautilus-window { + placesview { + label { color: $text-secondary; } + } + + .nautilus-grid-view { + child.activatable { + @extend %row_activatable; + } + } + + .floating-bar { + min-height: 32px; + padding: 0; + margin: $space-size; + border-style: none; + border-radius: $corner-radius; + background-color: $primary; + color: on($primary); + box-shadow: $shadow-z3; + + button { + margin: (32px - $small-size) / 2; + color: on($primary); + + @extend %small-button; + } + } +} + +#NautilusQueryEditor { // search entry + > menubutton > button.image-button { + min-width: 24px; + min-height: 24px; + } + + > text, > box, > menubutton > button.image-button { + margin: $space-size 0; + } +} + +#NautilusQueryEditorTag { + background-color: $divider; + + > button.image-button { + margin: 0; + padding: 0; + } +} + +#NautilusPathBar { + background-color: $titlebar-fill; + border-radius: $corner-radius; + margin: $space-size 0; + + .content-pane & { + background-color: $fill; + } +} + +#NautilusPathButton { + margin: 0 $space-size / 2; + border-radius: $corner-radius; + + &.current-dir { + color: $titlebar-text; + + &:hover, &:active { + background: none; + box-shadow: none; + } + } + + .content-pane &.current-dir { + color: $text; + } + + &:first-child { margin-left: 0; } +} + +#NautilusViewCell { + clamp box { + margin: 0; + border-spacing: 0; + } +} + +navigation-view-page { + > toolbarview > scrolledwindow > viewport > clamp > box.medium > box > stack > button { + margin-top: $space-size * 2; + } +} + +// +// Gnome Control Center +// + +window.dialog { + > box > stack > box > box { + > notebook.frame { + border-width: 0 0 0 1px; + border-radius: 0; + } + } +} + +.background-thumbnail { + > button.remove-button { + margin: $space-size; + } +} + +// +// Calculator +// + +.display-container { + .small &.card { + border-radius: 0; + box-shadow: none; + border-width: 0 0 1px 0; + } + + .history-view { background-color: $base; } + + #displayitem { + padding: 0 12px 8px 0; + font-size: 1.4em; + border-top: 1px solid $border; + } +} + +.math-buttons button { + font-size: 1.1em; + padding: 2px $space-size; + + &.text-button { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; + } +} + +leaflet { + button.number-button { + background-color: rgba($text, 0.1); + + &:hover { + background-color: rgba($text, 0.2); + } + + &:active { + background-color: rgba($text, 0.3); + } + } +} + +// +// Calendar +// + +// labels +label { + &.primary-label, &.month-name, &.secondary-label { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2; + } + + &.primary-label, &.month-name { + color: $primary; + } + + &.secondary-label { + color: $text-disabled; + } +} + +calendar-view { + font-size: 10pt; + + &:selected { + color: $primary; + font-weight: bold; + } +} + +calendar-view.header, +label.header { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; +} + +calendar-view.current, +weekgrid.current { + background-color: gtkalpha($primary, 0.3); +} + +popover.events { + background-color: $popover; + padding: 0; + + box { + border-top-left-radius: $corner-radius; + border-top-right-radius: $corner-radius; + } + + list { + background-color: $base; + border-radius: $corner-radius; + } + + scrolledwindow { + border-width: 0; + } + + button { + border-radius: $corner-radius; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-style: solid none none; + box-shadow: none; + } +} + +// Event widget +event { + margin: 1px; + font-size: 0.9rem; + + widget.content { + margin: 4px; + } + + &.timed, + &:not(.slanted):not(.slanted-start):not(.slanted-end) { + border-radius: $corner-radius; + } + + &.timed widget.edge { + border-radius: $corner-radius / 2; + min-width: 5px; + } + + &.slanted-start, + &.slanted-end:dir(rtl) { + padding-left: $space-size * 2 + 4px; + border-radius: 0 $corner-radius / 2 $corner-radius / 2 0; + } + + &.slanted-end, + &.slanted-start:dir(rtl) { + padding-right: $space-size * 2 + 4px; + border-radius: $corner-radius / 2 0 0 $corner-radius / 2; + } + + &:not(.timed).color-dark { + color: white; + outline-color: rgba(0, 0, 0, 0.3); + } + + &.timed, + &:not(.timed).color-light { + color: gtkalpha(black, 0.75); + outline-color: rgba(255, 255, 255, 0.5); + } + +} + +// Event Popover +popover.event-popover, +popover.event-popover > contents { + padding: 0; +} + +.search-viewport { + background-color: $base; +} + +// calendar popover +.calendar-list { + background-color: transparent; + + > list { + border-radius: 4px; + } +} + +// defeats the ugly hover effect of the calendar color dot on buttons +.calendar-color-image { + -gtk-icon-filter: none; +} + +// adds a subtle shadow to the calendar color dot when it makes sense +image.calendar-color-image, +button:active:not(:backdrop) .calendar-color-image, +button:checked:not(:backdrop) .calendar-color-image, +.calendars-list .calendar-color-image:not(:backdrop):not(:disabled), +.calendar-list .calendar-color-image:not(:backdrop):not(:disabled), +.sources-button:not(:backdrop):not(:disabled) .calendar-color-image { + -gtk-icon-shadow: 0 1px gtkalpha(black, 0.1); +} + +// Date chooser + +// month/year controls +datechooser { + navigator { // add some space between the two controls + margin-right: $space-size; + margin-left: $space-size; + margin-bottom: $space-size; + } + + navigator { + label { font-weight: bold; } + + button.flat, + button.toggle, + button.image-button { + min-height: $medium-size; + min-width: $medium-size; + padding: 0; + } + } + + // day names and week numbers + .weeknum, .weekday { + color: $text-disabled; + font-size: smaller; + } + + // days + button.day { + font-size: 10pt; + font-weight: normal; + margin: $space-size / 2; + padding: 0; + min-height: $medium-size; + min-width: $medium-size; + transition: none; + + dot { + background-color: $text; + border-radius: 50%; + min-height: $space-size / 2; + min-width: $space-size / 2; + } + + &:selected, &.today:selected { + background-color: $primary; + color: on($primary); + font-weight: bold; + + dot { background-color: on($primary); } + } + + &.today { + color: $primary; + + dot { background-color: $primary; } + } + + &.other-month { + &:not(:hover), + &:backdrop { + color: gtkalpha(currentColor, 0.1); + + dot { background-color: gtkalpha(currentColor, 0.1); } + } + + &:hover:not(:backdrop) { + color: $text-disabled; + + dot { background-color: $text-disabled; } + } + } + } +} + +// Week View CSS +.week-header { + padding: 0; + + & > box:first-child { + border-bottom: 1px solid $border; + } + + .week-number { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2 $space-size * 2 $space-size * 3 $space-size * 2; + color: $track; + } + + &.week-temperature { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; + } + + &.lines { + color: $border; + } +} + +weekhourbar > label { + font-size: 10pt; + padding: 4px $space-size; +} + +.week-view .lines { + color: $border; +} + +weekgrid > widget.now-strip { + background-color: gtkalpha($primary, 0.8); + margin: 0 0 0 1px; + min-height: 3px; +} + +weekgrid, +.week-header { + &:selected, &.dnd { + background-color: gtkalpha($primary, 0.25); + } +} + +// Month cell +monthcell { + border: solid 1px $border; + border-width: 1px 0 0 1px; + background-color: transparent; + transition: background-color 200ms; + + &:hover:not(.out-of-month):not(.today) { + background-color: $base-alt; + transition: background-color 200ms; + color: $text; + } + + &:selected { + background-color: gtkalpha($primary, 0.1); + + &:hover { + background-color: gtkalpha($primary, 0.2); + } + + label.day-label { font-weight: bold; } + } + + &:nth-child(7n + 1) { border-left-width: 0; } + + &.today { + background-color: gtkalpha($primary, 0.2); + + &:hover { + background-color: gtkalpha($primary, 0.3); + color: $primary; + } + + &:selected { + background-color: gtkalpha($primary, 0.25); + + &:hover { + background-color: gtkalpha($primary, 0.35); + } + } + } + + label { + color: $text; + font-size: 0.9rem; + + &.day-label { + font-size: 1rem; + } + } + + &.out-of-month { + background-color: $fill; + + label { + color: $text-secondary; + } + } + + button { + padding: 0 $space-size; + border-radius: 0; + border-bottom: none; + border-right: none; + } +} + +// Month popover +monthpopover > box { + margin: 0; + padding: 0; + background-color: transparent; +} + +.notes-section box > textview { + border-radius: $corner-radius; + padding: $space-size; + + > text { + background: none; + } +} + +// Agenda View CSS +agenda-view { + list { + > row { + padding: 2px $space-size * 2; + } + + > label { + padding: $space-size $space-size * 2; + } + } + + > scrolledwindow > viewport > list.background { + background-color: transparent; + } +} + +label.no-events { + font-style: italic; +} + +// Search +searchbutton > popover > arrow { + background: none; + border: none; +} + +// Month selector +datechooser { + padding: $space-size; + + .current-week { + background: gtkalpha($titlebar, 0.7); + color: on($titlebar); + border-radius: $corner-radius; + } +} + +menubutton { + &.sources-button { + margin-top: 0; + margin-bottom: 0; + border-radius: 0; + border-top-style: none; + border-bottom-style: none; + + &:hover:not(:backdrop) { + background-image: none; + text-shadow: none; + } + + > button { + border-radius: 0; + + .title { + font-size: 10pt; + font-weight: normal; + padding: 0 $space-size; + } + + .subtitle { + font-size: 8pt; + padding: 0 $space-size; + } + + .calendar-color-image { + -gtk-icon-size: 12px; + } + } + } + + stack > box { + border-spacing: $space-size; + } + + .topbar headerbar &.sources-button { + > button { + border-radius: 0 0 $corner-radius $corner-radius; + } + } +} + +// +// Contacts +// + +.contacts-contact-list list.navigation-sidebar { + background: none; +} + +// +// Gnome Software +// + +.details-page { + margin: $space-size * 4 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: $primary; + border-radius: 0; + color: on($primary); + text-shadow: 0 1px 0 rgba(black, 0.2); +} + +screenshot-carousel box.frame { + border-width: 1px 0; + border-radius: 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: $space-size * 2; +} + +.screenshot-image-main .image1, +.screenshot-image-main .image2 { + margin-top: $space-size; + margin-bottom: $space-size * 2; + margin-left: $space-size; + margin-right: $space-size; +} + +.app-tile-label { + font-size: 105%; +} + +.review-textbox { + padding: $space-size; +} + +.origin-rounded-box { + background-color: $divider; + border-radius: $circular-radius; + padding: $space-size - 2px; +} + +.origin-beta { + color: $warning; +} + +.origin-button > button { + padding: $space-size / 2 $space-size * 1.5; +} + +.card flowboxchild { + &.card { + border: none; + box-shadow: none; + padding: 0; + background: none; + } +} + +.category-tile.card { + padding: $space-size * 3.5; + border: none; + border-radius: $corner-radius; + min-width: 140px; + font-weight: 900; + font-size: larger; + box-shadow: $shadow-z3; + + &.category-tile-iconless { + padding: $space-size * 1.5 $space-size * 2.5; + min-width: 130px; + font-size: 105%; + font-weight: normal; + box-shadow: none; + background-color: $fill; + } + + // Styling for specific category buttons. + &.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#ce8cd7, .95) 0%, shade(#2861c6, .95) 100%); + color: white; + } + } + + &.category-develop { + background: #5e5c64; + color: white; + + &:hover { + background: shade(#5e5c64, 1.2); + color: white; + } + + &:active { + background-color: shade(#5e5c64, .95); + color: white; + } + } + + &.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#2ec27e, .95) 30%, shade(#27a66c, .95) 100%); + color: white; + } + } + + &.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; + + &:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + + &:active { + background: linear-gradient(75deg, shade(#f9e2a7, .97) 0%, shade(#eb5ec3, .95) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + } + + &.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: $text-secondary; + + &:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); + } + + &:active { + background: linear-gradient(90deg, shade(#ef4e9b, .95) 0%, shade(#f77466, .95) 100%); + } + } + + &.category-work { + padding: 1px; /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color:#fdf8d7; + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; + + &:hover { + color: #1c71d8; + background-color: lighten(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + + &:active { + color: #1c71d8; + background-color: darken(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + } +} + +clamp.medium .category-tile:not(.category-tile-iconless), +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +// The rest of the featured-tile CSS is loaded at runtime in gs-feature-tile.c +.featured-tile { + padding: 0; + box-shadow: none; + color: $text; + + label.title-1 { + margin-top: $space-size; + margin-bottom: $space-size; + } + + &.narrow label.title-1 { + font-size: 16pt; + } +} + +.application-details-infobar { + &, &.info { + background-color: $fill; + color: $text; + border: 1px solid $border; + } + + &.warning { + background-color: $warning; + color: on($warning); + border: 1px solid on($warning, divider); + } +} + +@keyframes install-progress-unknown-move { + 0% { background-position: 0%; } + 50% { background-position: 100%; } + 100% { background-position: 0%; } +} + +.application-details-description .button { + padding-left: $space-size * 4; + padding-right: $space-size * 4; +} + +.install-progress { + background-image: linear-gradient(to top, $primary 2px, gtkalpha($primary, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { background-position: 100% bottom; } + +.review-row > * { + margin: $space-size * 2; +} + +.review-row button { font-size: smaller; } + +.review-row .vote-buttons button { + margin-right: -1px; +} + +// this is the separator between yes and no vote buttons, gtk+ 3.20 only +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, $border, $border) 0 0 0 1 / 5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: $text-disabled; + background-image: none; + background-color: $track; +} + +.review-histogram star-image { + color: $text-disabled; +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0 $space-size * 2 + 4px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: $space-size; + border-bottom: 1px solid $border; +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +star-image { + color: $yellow-dark; +} + +.dimmer-label { + opacity: 0.25; +} + +.update-failed-details { + font-family: Monospace; + font-size: smaller; + padding: $space-size * 2 + 4px; +} + +.upgrade-banner { + padding: 0px; + border-radius: $corner-radius; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, $green-light, $blue-light); + color: white; +} + +.upgrade-buttons #button_upgrades_install { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; +} + +scrolledwindow.list-page > viewport > clamp > box { + margin: $space-size * 4 $space-size * 2; + border-spacing: $space-size * 4; +} + +.update-preferences preferencesgroup > box > box { + margin-top: $space-size * 3; +} + +.section > label:not(:first-child) { margin-top: $space-size; } + +.section > box:not(:first-child) { margin-top: $space-size * 2; } + +clamp.status-page { + margin: $space-size * 6 $space-size * 2; +} + +clamp.status-page .iconbox { + min-height: 128px; + min-width: 128px; +} + +clamp.status-page .icon { + color: $text-disabled; + min-height: 32px; + min-width: 32px; +} + +clamp.status-page .icon:not(:last-child) { + margin-bottom: $space-size * 6; +} + +clamp.status-page .title:not(:last-child) { + margin-bottom: $space-size * 2; +} + +app-context-bar { + .context-tile { + border: 1px solid $border; + background-color: transparent; + border-radius: 0; + padding: $space-size * 4 $space-size * 2 $space-size * 3.5 $space-size * 2; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; + + &:hover { + background-image: none; + background-color: $overlay-hover; + } + + &.keyboard-activating, + &:active { + background-color: $overlay-active; + } + + &:focus:focus-visible { + outline-offset: -1px; + } + } + + &.horizontal box:first-child .context-tile:first-child, + &.vertical .context-tile:first-child { + border-left: none; + } + + &.horizontal .context-tile, + &.vertical box:first-child .context-tile { + border-top: none; + } + + > box:not(:first-child) > button.flat { + border-radius: 0; + + &:last-child { + border-radius: 0 $corner-radius $corner-radius 0; + } + } + + > box:first-child > button.flat { + border-radius: 0; + + &:first-child { + border-radius: $corner-radius 0 0 $corner-radius; + } + } + + > box > button.flat { + border-left-color: $border; + } +} + +carousel.card { + border: none; + background-color: $fill; +} + +.context-tile-lozenge { + min-height: 28px; + min-width: 28px; + padding: $space-size; + font-size: 18px; + font-weight: bold; + border-radius: $circular-radius; + + &.large { + font-size: 24px; + padding: 16px; + min-width: 24px; /* 60px minus the left and right padding */ + min-height: 24px; /* 60px minus the top and bottom padding */ + } + + &.wide-image image { + margin-top: -28px; + margin-bottom: -28px; + } + + image { -gtk-icon-style: symbolic; } + + &.grey { + color: $text; + background-color: $divider; + } + + &.green, &.details-rating-0 { + color: darken($success, 15%); + background-color: rgba($success, 0.15); + } + + &.blue, + &.details-rating-5 { + color: $blue-light; + background-color: rgba($blue-light, 0.15); + } + + &.yellow, &.details-rating-12 { + color: darken($warning, 15%); + background-color: rgba($warning, 0.15); + } + + &.details-rating-15 { + color: $orange-light; + background-color: rgba($orange-light, .15); + } + + &.red, &.details-rating-18 { + color: darken($error, 15%); + background-color: rgba($error, 0.15); + } +} + +.eol-red { + font-weight: bold; + color: $error; +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +scrolledwindow.fake-adw-status-page > viewport > box { margin: $space-size * 6 $space-size * 2; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { margin-bottom: $space-size * 2; } + +statuspage.icon-dropshadow image.icon { + -gtk-icon-shadow: 0 1px 12px rgba(0,0,0,0.05), + 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +window.info scrollbar.vertical { + margin-top: 48px; + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + margin-top: 0; +} + +// GsAppRow +row.app > box.header { + margin-left: $space-size * 2; + margin-right: $space-size * 2; +} + +row.app > box.header { + border-spacing: $space-size * 2; +} + +row.app > box.header > image { + margin-top: $space-size * 2; + margin-bottom: $space-size * 2; +} + +row.app label.warning { + color: $error; +} + +// GtkSpinner + +// Ensure the spinner is hidden before the animation is triggered. +@keyframes pre-delay { + from { opacity: 0; } + to { opacity: 0; } +} + +@keyframes fade-in { + from { filter: opacity(0%); } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} + +// Leaflets +window > contents > leaflet { // Gnome control center + > box > stack.background { + background-color: transparent; + background-image: linear-gradient(to bottom, + transparent, + transparent $large-size, + $background $large-size, + $background); + } +} + +// +// Gnome Weather +// + +@define-color weather_temp_chart_fill_color #{rgba($warning, 0.5)}; +@define-color weather_temp_chart_stroke_color #{darken($warning, 10%)}; +@define-color weather_thermometer_warm_color #{if($variant == 'light', $yellow-dark, $yellow-light)}; +@define-color weather_thermometer_cold_color #{if($variant == 'light', $blue-dark, $blue-light)}; + +$weather_thermometer_high_color: $yellow-light; +$weather_thermometer_low_color: $blue-light; +$weather_forecast_color: #ae7b03; + +#places-label { + font-weight: bold; +} + +#temperature-label { + font-size: 32pt; + font-weight: 900; + margin-left: 9px; +} + +#conditions-grid *:backdrop { + color: $text-secondary; +} + +.content-view.cell { + font-weight: bold; +} + +#locationEntry { + margin: $space-size; +} + +.weather-popover { + margin-top: $space-size; +} + +.forecast-card { + transition: border-radius 100ms ease-out; + border-radius: $corner-radius; +} + +.forecast-card separator { + background-color: $border; +} + +#daily-forecast-box { + > separator:last-child { + background-color: transparent; + min-width: 0; + } +} + +#conditions-grid, +#attributionGrid { + margin-left: $space-size * 3; + margin-right: $space-size * 3; +} + +#weather-page .small .forecast-card { + margin-left: 0; + margin-right: 0; + border-radius: 0; + border-width: 1px 0; +} + +.forecast-temperature-label { + font-weight: bold; + color: $weather_forecast_color; +} + +WeatherThermometer { + margin-bottom: $space-size * 2; +} + +WeatherThermometer > label.high { + font-weight: bold; + color: $weather_thermometer_high_color; +} + +WeatherThermometer > label.low { + font-weight: bold; + color: $weather_thermometer_low_color; +} + +.forecast-button { + margin: 0 $space-size * 2; +} + +.forecast-graphic { + margin: $space-size * 3; +} + +button.osd.circular { + border-radius: $circular-radius; + min-width: $small-size; + min-height: $small-size; +} + +button.osd.circular > image { + padding: 0; +} + +scrolledwindow.inline list, +scrolledwindow.inline listview { + background: none; + color: inherit; +} + +scrolledwindow.inline undershoot.top { + box-shadow: inset 0 1px $border; +} + +.search-view { + background-color: $blue-dark; + color: on($blue-dark); +} + +.search-view menubutton button:focus:focus-visible { + outline-color: rgba(white, 0.3); +} + +image.circular { + min-width: $medium-size; + min-height: $medium-size; + padding: 0; + border-radius: $circular-radius; +} + +// WeatherThermometerScale { +// border-radius: $circular-radius; +// background-image: linear-gradient(to bottom, $weather_thermometer_warm_color, $weather_thermometer_cold_color); +// margin: 0 36px; +// padding: 0; +// } + +// +// Gnome Clocks +// + +.large-button { + padding: $space-size; +} + +// alarms +.alarm-time { + font-size: 2.5em; + font-weight: 300; +} + +.clocks-ampm-toggle-button, +.clocks-secondary-standalone-label { + font-size: 18pt; +} + +.clocks-standalone-label, +.clocks-ringing-label { + font-size: 6em; + font-weight: 300; +} + +.clocks-ringing-title { + font-size: 1.5em; + font-weight: bold; +} + +.clocks-alarm-setup-time { + font-size: 32pt; +} + +// Timer Panel +.clocks-timer-label, +.clocks-spinbutton { + font-size: 48pt; +} + +// disguise insensitive spinbuttons as normal labels +.timer-panel .timer-header { + font-size: 20pt; + font-weight: 300; +} + +.timer-countdown { + font-size: 40pt; + font-weight: 300; +} + +/* Stopwatch Panel */ +.lap-time { + font-weight: bold; +} + +.stopped-stopwatch label, +.running-stopwatch label, +.paused-stopwatch label { + font-size: 70px; + font-weight: lighter; +} + +.stopped-stopwatch .seconds-label { + font-weight: 300; +} + +.running-stopwatch .seconds-label, +.running-stopwatch .miliseconds-label { + color: $primary; +} + +.stopped-stopwatch .miliseconds-label, +.running-stopwatch .miliseconds-label, +.paused-stopwatch .miliseconds-label { + font-size: 50px; +} + +.running-stopwatch .seconds-label, +.paused-stopwatch .seconds-label { + font-weight: 300; +} + +// World +.clock-location { + font-weight: bolder; +} + +.hidden { + opacity: 0; +} + +.clock-time { + font-size: 2em; + padding: 0.2em 0.5em; + border-radius: 1em; +} + +.none .clock-time { + background: gtkalpha(currentColor, 0.2); +} + +.night .clock-time { + color: $blue-dark; + background-color: gtkalpha($blue-light, 0.25); +} + +.naut .clock-time, +.astro .clock-time { + color: $orange-dark; + background-color: gtkalpha($orange-light, 0.25); +} + +.civil .clock-time, +.day .clock-time { + color: $yellow-dark; + background: gtkalpha($yellow-light, 0.25); +} + +// +// Builder +// + +headerbar splitbutton { + notification button { + margin: 0; + min-height: $small-size; + min-width: $small-size; + padding: 0; + } +} + +popover.background.global-search { + > arrow, > contents { padding: 0; } +} + +panelframeswitcher { + padding: $space-size; + min-height: $medium-size; +} + +.frameheader.header { + // min-height: $small-size; + background-color: $titlebar; + + &:backdrop { + background-color: $titlebar-backdrop; + } + + > button { + border: none; + margin: 0; + padding: $space-size / 2; + } + + tabbar.inline { + > revealer > box { + min-height: $small-size; + + .start-action { + padding: 0; + border: none; + } + + .end-action { + padding: 0; + border-left: 1px solid $border; + + button { margin: $space-size; } + } + + tabbox { + border: none; + background: none; + } + } + } +} + +panelstatusbar { + > menubutton > button, + > paneltogglebutton button { border-radius: 0; } +} + +// Setting window +.style-variant { + padding: 0 $space-size * 2; + + button.toggle { + padding: 0; + + &, &:hover, &:focus, &:active, &:checked { + background: none; + outline: none; + border: none; + box-shadow: none; + } + + > stylevariantpreview > .wallpaper { + border-radius: $corner-radius; + outline-color: transparent; + outline-width: 3px; + outline-offset: $space-size / 2; + outline-style: solid; + box-shadow: none; + } + + &:hover > stylevariantpreview > .wallpaper { + outline-color: $fill; + } + + &:active > stylevariantpreview > .wallpaper { + outline-color: $track; + } + + &:checked > stylevariantpreview > .wallpaper { + outline-color: $primary; + } + } +} + +// +// Amberol +// + +playlistview { + scrollbar { + &.overlay-indicator { + &.dragging, + &.hovering { background-color: transparent; } + } + } + + queuerow { + picture.cover, + image.card { border: none; } + } +} + +// +// Console +// + +.exit-info { + padding: 6px; + border-top: 2px solid $primary; + background: rgba($primary, 0.9); + color: on($primary); +} + +.error .exit-info { + border-top: 2px solid $error; + background: rgba($error, 0.9); + color: on($error); +} + +// +// dialogs +// + +window.dialog { + > .dialog-vbox > box > scrolledwindow > viewport > widget { + > list.boxed-list { + border: none; + border-radius: 0; + + > row { + &:first-child, &:last-child { border-radius: 0; } + } + } + } +} diff --git a/src/sass/libadwaita/apps/_console.scss b/src/sass/libadwaita/apps/_console.scss new file mode 100644 index 00000000..7e9381aa --- /dev/null +++ b/src/sass/libadwaita/apps/_console.scss @@ -0,0 +1,1595 @@ + +// +// Nautilus +// +.nautilus-window { + placesview { + label { color: $text-secondary; } + } + + .nautilus-grid-view { + child.activatable { + @extend %row_activatable; + } + } + + .floating-bar { + min-height: 32px; + padding: 0; + margin: $space-size; + border-style: none; + border-radius: $corner-radius; + background-color: $primary; + color: on($primary); + box-shadow: $shadow-z3; + + button { + margin: (32px - $small-size) / 2; + color: on($primary); + + @extend %small-button; + } + } +} + +#NautilusQueryEditor { // search entry + > menubutton > button.image-button { + min-width: 24px; + min-height: 24px; + } + + > text, > box, > menubutton > button.image-button { + margin: $space-size 0; + } +} + +#NautilusQueryEditorTag { + background-color: $divider; + + > button.image-button { + margin: 0; + padding: 0; + } +} + +#NautilusPathBar { + background-color: $titlebar-fill; + border-radius: $corner-radius; + margin: $space-size 0; + + .content-pane & { + background-color: $fill; + } +} + +#NautilusPathButton { + margin: 0 $space-size / 2; + border-radius: $corner-radius; + + &.current-dir { + color: $titlebar-text; + + &:hover, &:active { + background: none; + box-shadow: none; + } + } + + .content-pane &.current-dir { + color: $text; + } + + &:first-child { margin-left: 0; } +} + +#NautilusViewCell { + clamp box { + margin: 0; + border-spacing: 0; + } +} + +navigation-view-page { + > toolbarview > scrolledwindow > viewport > clamp > box.medium > box > stack > button { + margin-top: $space-size * 2; + } +} + +// +// Gnome Control Center +// + +window.dialog { + > box > stack > box > box { + > notebook.frame { + border-width: 0 0 0 1px; + border-radius: 0; + } + } +} + +.background-thumbnail { + > button.remove-button { + margin: $space-size; + } +} + +// +// Calculator +// + +.display-container { + .small &.card { + border-radius: 0; + box-shadow: none; + border-width: 0 0 1px 0; + } + + .history-view { background-color: $base; } + + #displayitem { + padding: 0 12px 8px 0; + font-size: 1.4em; + border-top: 1px solid $border; + } +} + +.math-buttons button { + font-size: 1.1em; + padding: 2px $space-size; + + &.text-button { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; + } +} + +leaflet { + button.number-button { + background-color: rgba($text, 0.1); + + &:hover { + background-color: rgba($text, 0.2); + } + + &:active { + background-color: rgba($text, 0.3); + } + } +} + +// +// Calendar +// + +// labels +label { + &.primary-label, &.month-name, &.secondary-label { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2; + } + + &.primary-label, &.month-name { + color: $primary; + } + + &.secondary-label { + color: $text-disabled; + } +} + +calendar-view { + font-size: 10pt; + + &:selected { + color: $primary; + font-weight: bold; + } +} + +calendar-view.header, +label.header { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; +} + +calendar-view.current, +weekgrid.current { + background-color: gtkalpha($primary, 0.3); +} + +popover.events { + background-color: $popover; + padding: 0; + + box { + border-top-left-radius: $corner-radius; + border-top-right-radius: $corner-radius; + } + + list { + background-color: $base; + border-radius: $corner-radius; + } + + scrolledwindow { + border-width: 0; + } + + button { + border-radius: $corner-radius; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-style: solid none none; + box-shadow: none; + } +} + +// Event widget +event { + margin: 1px; + font-size: 0.9rem; + + widget.content { + margin: 4px; + } + + &.timed, + &:not(.slanted):not(.slanted-start):not(.slanted-end) { + border-radius: $corner-radius; + } + + &.timed widget.edge { + border-radius: $corner-radius / 2; + min-width: 5px; + } + + &.slanted-start, + &.slanted-end:dir(rtl) { + padding-left: $space-size * 2 + 4px; + border-radius: 0 $corner-radius / 2 $corner-radius / 2 0; + } + + &.slanted-end, + &.slanted-start:dir(rtl) { + padding-right: $space-size * 2 + 4px; + border-radius: $corner-radius / 2 0 0 $corner-radius / 2; + } + + &:not(.timed).color-dark { + color: white; + outline-color: rgba(0, 0, 0, 0.3); + } + + &.timed, + &:not(.timed).color-light { + color: gtkalpha(black, 0.75); + outline-color: rgba(255, 255, 255, 0.5); + } + +} + +// Event Popover +popover.event-popover, +popover.event-popover > contents { + padding: 0; +} + +.search-viewport { + background-color: $base; +} + +// calendar popover +.calendar-list { + background-color: transparent; + + > list { + border-radius: 4px; + } +} + +// defeats the ugly hover effect of the calendar color dot on buttons +.calendar-color-image { + -gtk-icon-filter: none; +} + +// adds a subtle shadow to the calendar color dot when it makes sense +image.calendar-color-image, +button:active:not(:backdrop) .calendar-color-image, +button:checked:not(:backdrop) .calendar-color-image, +.calendars-list .calendar-color-image:not(:backdrop):not(:disabled), +.calendar-list .calendar-color-image:not(:backdrop):not(:disabled), +.sources-button:not(:backdrop):not(:disabled) .calendar-color-image { + -gtk-icon-shadow: 0 1px gtkalpha(black, 0.1); +} + +// Date chooser + +// month/year controls +datechooser { + navigator { // add some space between the two controls + margin-right: $space-size; + margin-left: $space-size; + margin-bottom: $space-size; + } + + navigator { + label { font-weight: bold; } + + button.flat, + button.toggle, + button.image-button { + min-height: $medium-size; + min-width: $medium-size; + padding: 0; + } + } + + // day names and week numbers + .weeknum, .weekday { + color: $text-disabled; + font-size: smaller; + } + + // days + button.day { + font-size: 10pt; + font-weight: normal; + margin: $space-size / 2; + padding: 0; + min-height: $medium-size; + min-width: $medium-size; + transition: none; + + dot { + background-color: $text; + border-radius: 50%; + min-height: $space-size / 2; + min-width: $space-size / 2; + } + + &:selected, &.today:selected { + background-color: $primary; + color: on($primary); + font-weight: bold; + + dot { background-color: on($primary); } + } + + &.today { + color: $primary; + + dot { background-color: $primary; } + } + + &.other-month { + &:not(:hover), + &:backdrop { + color: gtkalpha(currentColor, 0.1); + + dot { background-color: gtkalpha(currentColor, 0.1); } + } + + &:hover:not(:backdrop) { + color: $text-disabled; + + dot { background-color: $text-disabled; } + } + } + } +} + +// Week View CSS +.week-header { + padding: 0; + + & > box:first-child { + border-bottom: 1px solid $border; + } + + .week-number { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2 $space-size * 2 $space-size * 3 $space-size * 2; + color: $track; + } + + &.week-temperature { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; + } + + &.lines { + color: $border; + } +} + +weekhourbar > label { + font-size: 10pt; + padding: 4px $space-size; +} + +.week-view .lines { + color: $border; +} + +weekgrid > widget.now-strip { + background-color: gtkalpha($primary, 0.8); + margin: 0 0 0 1px; + min-height: 3px; +} + +weekgrid, +.week-header { + &:selected, &.dnd { + background-color: gtkalpha($primary, 0.25); + } +} + +// Month cell +monthcell { + border: solid 1px $border; + border-width: 1px 0 0 1px; + background-color: transparent; + transition: background-color 200ms; + + &:hover:not(.out-of-month):not(.today) { + background-color: $base-alt; + transition: background-color 200ms; + color: $text; + } + + &:selected { + background-color: gtkalpha($primary, 0.1); + + &:hover { + background-color: gtkalpha($primary, 0.2); + } + + label.day-label { font-weight: bold; } + } + + &:nth-child(7n + 1) { border-left-width: 0; } + + &.today { + background-color: gtkalpha($primary, 0.2); + + &:hover { + background-color: gtkalpha($primary, 0.3); + color: $primary; + } + + &:selected { + background-color: gtkalpha($primary, 0.25); + + &:hover { + background-color: gtkalpha($primary, 0.35); + } + } + } + + label { + color: $text; + font-size: 0.9rem; + + &.day-label { + font-size: 1rem; + } + } + + &.out-of-month { + background-color: $fill; + + label { + color: $text-secondary; + } + } + + button { + padding: 0 $space-size; + border-radius: 0; + border-bottom: none; + border-right: none; + } +} + +// Month popover +monthpopover > box { + margin: 0; + padding: 0; + background-color: transparent; +} + +.notes-section box > textview { + border-radius: $corner-radius; + padding: $space-size; + + > text { + background: none; + } +} + +// Agenda View CSS +agenda-view { + list { + > row { + padding: 2px $space-size * 2; + } + + > label { + padding: $space-size $space-size * 2; + } + } + + > scrolledwindow > viewport > list.background { + background-color: transparent; + } +} + +label.no-events { + font-style: italic; +} + +// Search +searchbutton > popover > arrow { + background: none; + border: none; +} + +// Month selector +datechooser { + padding: $space-size; + + .current-week { + background: gtkalpha($titlebar, 0.7); + color: on($titlebar); + border-radius: $corner-radius; + } +} + +menubutton { + &.sources-button { + margin-top: 0; + margin-bottom: 0; + border-radius: 0; + border-top-style: none; + border-bottom-style: none; + + &:hover:not(:backdrop) { + background-image: none; + text-shadow: none; + } + + > button { + border-radius: 0; + + .title { + font-size: 10pt; + font-weight: normal; + padding: 0 $space-size; + } + + .subtitle { + font-size: 8pt; + padding: 0 $space-size; + } + + .calendar-color-image { + -gtk-icon-size: 12px; + } + } + } + + stack > box { + border-spacing: $space-size; + } + + .topbar headerbar &.sources-button { + > button { + border-radius: 0 0 $corner-radius $corner-radius; + } + } +} + +// +// Contacts +// + +.contacts-contact-list list.navigation-sidebar { + background: none; +} + +// +// Gnome Software +// + +.details-page { + margin: $space-size * 4 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: $primary; + border-radius: 0; + color: on($primary); + text-shadow: 0 1px 0 rgba(black, 0.2); +} + +screenshot-carousel box.frame { + border-width: 1px 0; + border-radius: 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: $space-size * 2; +} + +.screenshot-image-main .image1, +.screenshot-image-main .image2 { + margin-top: $space-size; + margin-bottom: $space-size * 2; + margin-left: $space-size; + margin-right: $space-size; +} + +.app-tile-label { + font-size: 105%; +} + +.review-textbox { + padding: $space-size; +} + +.origin-rounded-box { + background-color: $divider; + border-radius: $circular-radius; + padding: $space-size - 2px; +} + +.origin-beta { + color: $warning; +} + +.origin-button > button { + padding: $space-size / 2 $space-size * 1.5; +} + +.card flowboxchild { + &.card { + border: none; + box-shadow: none; + padding: 0; + background: none; + } +} + +.category-tile.card { + padding: $space-size * 3.5; + border: none; + border-radius: $corner-radius; + min-width: 140px; + font-weight: 900; + font-size: larger; + box-shadow: $shadow-z3; + + &.category-tile-iconless { + padding: $space-size * 1.5 $space-size * 2.5; + min-width: 130px; + font-size: 105%; + font-weight: normal; + box-shadow: none; + background-color: $fill; + } + + // Styling for specific category buttons. + &.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#ce8cd7, .95) 0%, shade(#2861c6, .95) 100%); + color: white; + } + } + + &.category-develop { + background: #5e5c64; + color: white; + + &:hover { + background: shade(#5e5c64, 1.2); + color: white; + } + + &:active { + background-color: shade(#5e5c64, .95); + color: white; + } + } + + &.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#2ec27e, .95) 30%, shade(#27a66c, .95) 100%); + color: white; + } + } + + &.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; + + &:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + + &:active { + background: linear-gradient(75deg, shade(#f9e2a7, .97) 0%, shade(#eb5ec3, .95) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + } + + &.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: $text-secondary; + + &:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); + } + + &:active { + background: linear-gradient(90deg, shade(#ef4e9b, .95) 0%, shade(#f77466, .95) 100%); + } + } + + &.category-work { + padding: 1px; /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color:#fdf8d7; + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; + + &:hover { + color: #1c71d8; + background-color: lighten(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + + &:active { + color: #1c71d8; + background-color: darken(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + } +} + +clamp.medium .category-tile:not(.category-tile-iconless), +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +// The rest of the featured-tile CSS is loaded at runtime in gs-feature-tile.c +.featured-tile { + padding: 0; + box-shadow: none; + color: $text; + + label.title-1 { + margin-top: $space-size; + margin-bottom: $space-size; + } + + &.narrow label.title-1 { + font-size: 16pt; + } +} + +.application-details-infobar { + &, &.info { + background-color: $fill; + color: $text; + border: 1px solid $border; + } + + &.warning { + background-color: $warning; + color: on($warning); + border: 1px solid on($warning, divider); + } +} + +@keyframes install-progress-unknown-move { + 0% { background-position: 0%; } + 50% { background-position: 100%; } + 100% { background-position: 0%; } +} + +.application-details-description .button { + padding-left: $space-size * 4; + padding-right: $space-size * 4; +} + +.install-progress { + background-image: linear-gradient(to top, $primary 2px, gtkalpha($primary, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { background-position: 100% bottom; } + +.review-row > * { + margin: $space-size * 2; +} + +.review-row button { font-size: smaller; } + +.review-row .vote-buttons button { + margin-right: -1px; +} + +// this is the separator between yes and no vote buttons, gtk+ 3.20 only +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, $border, $border) 0 0 0 1 / 5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: $text-disabled; + background-image: none; + background-color: $track; +} + +.review-histogram star-image { + color: $text-disabled; +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0 $space-size * 2 + 4px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: $space-size; + border-bottom: 1px solid $border; +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +star-image { + color: $yellow-dark; +} + +.dimmer-label { + opacity: 0.25; +} + +.update-failed-details { + font-family: Monospace; + font-size: smaller; + padding: $space-size * 2 + 4px; +} + +.upgrade-banner { + padding: 0px; + border-radius: $corner-radius; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, $green-light, $blue-light); + color: white; +} + +.upgrade-buttons #button_upgrades_install { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; +} + +scrolledwindow.list-page > viewport > clamp > box { + margin: $space-size * 4 $space-size * 2; + border-spacing: $space-size * 4; +} + +.update-preferences preferencesgroup > box > box { + margin-top: $space-size * 3; +} + +.section > label:not(:first-child) { margin-top: $space-size; } + +.section > box:not(:first-child) { margin-top: $space-size * 2; } + +clamp.status-page { + margin: $space-size * 6 $space-size * 2; +} + +clamp.status-page .iconbox { + min-height: 128px; + min-width: 128px; +} + +clamp.status-page .icon { + color: $text-disabled; + min-height: 32px; + min-width: 32px; +} + +clamp.status-page .icon:not(:last-child) { + margin-bottom: $space-size * 6; +} + +clamp.status-page .title:not(:last-child) { + margin-bottom: $space-size * 2; +} + +app-context-bar { + .context-tile { + border: 1px solid $border; + background-color: transparent; + border-radius: 0; + padding: $space-size * 4 $space-size * 2 $space-size * 3.5 $space-size * 2; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; + + &:hover { + background-image: none; + background-color: $overlay-hover; + } + + &.keyboard-activating, + &:active { + background-color: $overlay-active; + } + + &:focus:focus-visible { + outline-offset: -1px; + } + } + + &.horizontal box:first-child .context-tile:first-child, + &.vertical .context-tile:first-child { + border-left: none; + } + + &.horizontal .context-tile, + &.vertical box:first-child .context-tile { + border-top: none; + } + + > box:not(:first-child) > button.flat { + border-radius: 0; + + &:last-child { + border-radius: 0 $corner-radius $corner-radius 0; + } + } + + > box:first-child > button.flat { + border-radius: 0; + + &:first-child { + border-radius: $corner-radius 0 0 $corner-radius; + } + } + + > box > button.flat { + border-left-color: $border; + } +} + +carousel.card { + border: none; + background-color: $fill; +} + +.context-tile-lozenge { + min-height: 28px; + min-width: 28px; + padding: $space-size; + font-size: 18px; + font-weight: bold; + border-radius: $circular-radius; + + &.large { + font-size: 24px; + padding: 16px; + min-width: 24px; /* 60px minus the left and right padding */ + min-height: 24px; /* 60px minus the top and bottom padding */ + } + + &.wide-image image { + margin-top: -28px; + margin-bottom: -28px; + } + + image { -gtk-icon-style: symbolic; } + + &.grey { + color: $text; + background-color: $divider; + } + + &.green, &.details-rating-0 { + color: darken($success, 15%); + background-color: rgba($success, 0.15); + } + + &.blue, + &.details-rating-5 { + color: $blue-light; + background-color: rgba($blue-light, 0.15); + } + + &.yellow, &.details-rating-12 { + color: darken($warning, 15%); + background-color: rgba($warning, 0.15); + } + + &.details-rating-15 { + color: $orange-light; + background-color: rgba($orange-light, .15); + } + + &.red, &.details-rating-18 { + color: darken($error, 15%); + background-color: rgba($error, 0.15); + } +} + +.eol-red { + font-weight: bold; + color: $error; +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +scrolledwindow.fake-adw-status-page > viewport > box { margin: $space-size * 6 $space-size * 2; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { margin-bottom: $space-size * 2; } + +statuspage.icon-dropshadow image.icon { + -gtk-icon-shadow: 0 1px 12px rgba(0,0,0,0.05), + 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +window.info scrollbar.vertical { + margin-top: 48px; + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + margin-top: 0; +} + +// GsAppRow +row.app > box.header { + margin-left: $space-size * 2; + margin-right: $space-size * 2; +} + +row.app > box.header { + border-spacing: $space-size * 2; +} + +row.app > box.header > image { + margin-top: $space-size * 2; + margin-bottom: $space-size * 2; +} + +row.app label.warning { + color: $error; +} + +// GtkSpinner + +// Ensure the spinner is hidden before the animation is triggered. +@keyframes pre-delay { + from { opacity: 0; } + to { opacity: 0; } +} + +@keyframes fade-in { + from { filter: opacity(0%); } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} + +// Leaflets +window > contents > leaflet { // Gnome control center + > box > stack.background { + background-color: transparent; + background-image: linear-gradient(to bottom, + transparent, + transparent $large-size, + $background $large-size, + $background); + } +} + +// +// Gnome Weather +// + +@define-color weather_temp_chart_fill_color #{rgba($warning, 0.5)}; +@define-color weather_temp_chart_stroke_color #{darken($warning, 10%)}; +@define-color weather_thermometer_warm_color #{if($variant == 'light', $yellow-dark, $yellow-light)}; +@define-color weather_thermometer_cold_color #{if($variant == 'light', $blue-dark, $blue-light)}; + +$weather_thermometer_high_color: $yellow-light; +$weather_thermometer_low_color: $blue-light; +$weather_forecast_color: #ae7b03; + +#places-label { + font-weight: bold; +} + +#temperature-label { + font-size: 32pt; + font-weight: 900; + margin-left: 9px; +} + +#conditions-grid *:backdrop { + color: $text-secondary; +} + +.content-view.cell { + font-weight: bold; +} + +#locationEntry { + margin: $space-size; +} + +.weather-popover { + margin-top: $space-size; +} + +.forecast-card { + transition: border-radius 100ms ease-out; + border-radius: $corner-radius; +} + +.forecast-card separator { + background-color: $border; +} + +#daily-forecast-box { + > separator:last-child { + background-color: transparent; + min-width: 0; + } +} + +#conditions-grid, +#attributionGrid { + margin-left: $space-size * 3; + margin-right: $space-size * 3; +} + +#weather-page .small .forecast-card { + margin-left: 0; + margin-right: 0; + border-radius: 0; + border-width: 1px 0; +} + +.forecast-temperature-label { + font-weight: bold; + color: $weather_forecast_color; +} + +WeatherThermometer { + margin-bottom: $space-size * 2; +} + +WeatherThermometer > label.high { + font-weight: bold; + color: $weather_thermometer_high_color; +} + +WeatherThermometer > label.low { + font-weight: bold; + color: $weather_thermometer_low_color; +} + +.forecast-button { + margin: 0 $space-size * 2; +} + +.forecast-graphic { + margin: $space-size * 3; +} + +button.osd.circular { + border-radius: $circular-radius; + min-width: $small-size; + min-height: $small-size; +} + +button.osd.circular > image { + padding: 0; +} + +scrolledwindow.inline list, +scrolledwindow.inline listview { + background: none; + color: inherit; +} + +scrolledwindow.inline undershoot.top { + box-shadow: inset 0 1px $border; +} + +.search-view { + background-color: $blue-dark; + color: on($blue-dark); +} + +.search-view menubutton button:focus:focus-visible { + outline-color: rgba(white, 0.3); +} + +image.circular { + min-width: $medium-size; + min-height: $medium-size; + padding: 0; + border-radius: $circular-radius; +} + +// WeatherThermometerScale { +// border-radius: $circular-radius; +// background-image: linear-gradient(to bottom, $weather_thermometer_warm_color, $weather_thermometer_cold_color); +// margin: 0 36px; +// padding: 0; +// } + +// +// Gnome Clocks +// + +.large-button { + padding: $space-size; +} + +// alarms +.alarm-time { + font-size: 2.5em; + font-weight: 300; +} + +.clocks-ampm-toggle-button, +.clocks-secondary-standalone-label { + font-size: 18pt; +} + +.clocks-standalone-label, +.clocks-ringing-label { + font-size: 6em; + font-weight: 300; +} + +.clocks-ringing-title { + font-size: 1.5em; + font-weight: bold; +} + +.clocks-alarm-setup-time { + font-size: 32pt; +} + +// Timer Panel +.clocks-timer-label, +.clocks-spinbutton { + font-size: 48pt; +} + +// disguise insensitive spinbuttons as normal labels +.timer-panel .timer-header { + font-size: 20pt; + font-weight: 300; +} + +.timer-countdown { + font-size: 40pt; + font-weight: 300; +} + +/* Stopwatch Panel */ +.lap-time { + font-weight: bold; +} + +.stopped-stopwatch label, +.running-stopwatch label, +.paused-stopwatch label { + font-size: 70px; + font-weight: lighter; +} + +.stopped-stopwatch .seconds-label { + font-weight: 300; +} + +.running-stopwatch .seconds-label, +.running-stopwatch .miliseconds-label { + color: $primary; +} + +.stopped-stopwatch .miliseconds-label, +.running-stopwatch .miliseconds-label, +.paused-stopwatch .miliseconds-label { + font-size: 50px; +} + +.running-stopwatch .seconds-label, +.paused-stopwatch .seconds-label { + font-weight: 300; +} + +// World +.clock-location { + font-weight: bolder; +} + +.hidden { + opacity: 0; +} + +.clock-time { + font-size: 2em; + padding: 0.2em 0.5em; + border-radius: 1em; +} + +.none .clock-time { + background: gtkalpha(currentColor, 0.2); +} + +.night .clock-time { + color: $blue-dark; + background-color: gtkalpha($blue-light, 0.25); +} + +.naut .clock-time, +.astro .clock-time { + color: $orange-dark; + background-color: gtkalpha($orange-light, 0.25); +} + +.civil .clock-time, +.day .clock-time { + color: $yellow-dark; + background: gtkalpha($yellow-light, 0.25); +} + +// +// Builder +// + +headerbar splitbutton { + notification button { + margin: 0; + min-height: $small-size; + min-width: $small-size; + padding: 0; + } +} + +popover.background.global-search { + > arrow, > contents { padding: 0; } +} + +panelframeswitcher { + padding: $space-size; + min-height: $medium-size; +} + +.frameheader.header { + // min-height: $small-size; + background-color: $titlebar; + + &:backdrop { + background-color: $titlebar-backdrop; + } + + > button { + border: none; + margin: 0; + padding: $space-size / 2; + } + + tabbar.inline { + > revealer > box { + min-height: $small-size; + + .start-action { + padding: 0; + border: none; + } + + .end-action { + padding: 0; + border-left: 1px solid $border; + + button { margin: $space-size; } + } + + tabbox { + border: none; + background: none; + } + } + } +} + +panelstatusbar { + > menubutton > button, + > paneltogglebutton button { border-radius: 0; } +} + +// Setting window +.style-variant { + padding: 0 $space-size * 2; + + button.toggle { + padding: 0; + + &, &:hover, &:focus, &:active, &:checked { + background: none; + outline: none; + border: none; + box-shadow: none; + } + + > stylevariantpreview > .wallpaper { + border-radius: $corner-radius; + outline-color: transparent; + outline-width: 3px; + outline-offset: $space-size / 2; + outline-style: solid; + box-shadow: none; + } + + &:hover > stylevariantpreview > .wallpaper { + outline-color: $fill; + } + + &:active > stylevariantpreview > .wallpaper { + outline-color: $track; + } + + &:checked > stylevariantpreview > .wallpaper { + outline-color: $primary; + } + } +} + +// +// Amberol +// + +playlistview { + scrollbar { + &.overlay-indicator { + &.dragging, + &.hovering { background-color: transparent; } + } + } + + queuerow { + picture.cover, + image.card { border: none; } + } +} + +// +// Console +// + +.exit-info { + padding: 6px; + border-top: 2px solid $primary; + background: rgba($primary, 0.9); + color: on($primary); +} + +.error .exit-info { + border-top: 2px solid $error; + background: rgba($error, 0.9); + color: on($error); +} + +// +// dialogs +// + +window.dialog { + > .dialog-vbox > box > scrolledwindow > viewport > widget { + > list.boxed-list { + border: none; + border-radius: 0; + + > row { + &:first-child, &:last-child { border-radius: 0; } + } + } + } +} diff --git a/src/sass/libadwaita/apps/_editor.scss b/src/sass/libadwaita/apps/_editor.scss new file mode 100644 index 00000000..1e58a487 --- /dev/null +++ b/src/sass/libadwaita/apps/_editor.scss @@ -0,0 +1,11 @@ +// +// Text Editor +// + +window.org-gnome-TextEditor { + popover.open-popover { + > contents { + padding: 0; + } + } +} diff --git a/src/sass/libadwaita/apps/_libadwaita.scss b/src/sass/libadwaita/apps/_libadwaita.scss new file mode 100644 index 00000000..13346d6e --- /dev/null +++ b/src/sass/libadwaita/apps/_libadwaita.scss @@ -0,0 +1,748 @@ + +// +// avatar +// + +avatar { + border-radius: $circular-radius; + font-weight: bold; + + // The list of colors to generate avatars. + // Each avatar color is represented by a font color, a gradient start color and a gradient stop color. + // There are 8 different colors for avtars in the list if you change the number of them you + // need to update the NUMBER_OF_COLORS in src/adw-avatar.c. + // The 2D list has this form: ((font-color, gradient-top-color, gradient-bottom-color)). + $avatarcolorlist: ( + (#cfe1f5, #83b6ec, #337fdc), // blue + (#caeaf2, #7ad9f1, #0f9ac8), // cyan + (#cef8d8, #8de6b1, #29ae74), // green + (#e6f9d7, #b5e98a, #6ab85b), // lime + (#f9f4e1, #f8e359, #d29d09), // yellow + (#ffead1, #ffcb62, #d68400), // gold + (#ffe5c5, #ffa95a, #ed5b00), // orange + (#f8d2ce, #f78773, #e62d42), // raspberry + (#fac7de, #e973ab, #e33b6a), // magenta + (#e7c2e8, #cb78d4, #9945b5), // purple + (#d5d2f5, #9e91e8, #7a59ca), // violet + (#f2eade, #e3cf9c, #b08952), // beige + (#e5d6ca, #be916d, #785336), // brown + (#d8d7d3, #c0bfbc, #6e6d71), // gray + ); + + @for $i from 1 through length($avatarcolorlist) { + &.color#{$i} { + $avatarcolor: nth($avatarcolorlist, $i); + background-image: linear-gradient(nth($avatarcolor, 2), nth($avatarcolor, 3)); + color: nth($avatarcolor, 1); + } + } + + &.contrasted { color: white; } + + &.image { background: none; } +} + +// Card +.card { + @at-root %card, & { + border-radius: $corner-radius; + border: 1px solid $border; + background-clip: border-box; + color: $text-secondary; + box-shadow: none; + outline: none; + background-color: $base; + color: $text; + } + + &.activatable { + transition: $transition; + + &:hover { + background-image: none; + @include button(hover); + } + + &:active { + background-image: none; + @include button(active); + } + } +} + +// +// Toasts +// + +toast { + margin: $space-size * 2; + margin-bottom: $space-size * 4; + border-radius: $circular-radius; + border-spacing: $space-size; + padding: $space-size; + box-shadow: $shadow-z6, inset 0 1px highlight($popover); + background-color: $popover; + color: on($popover); + border: none; + + &:dir(ltr) { padding-left: $space-size * 2; } + &:dir(rtl) { padding-right: $space-size * 2; } + + > label { + margin: 0 $space-size; + } +} + +// +// viewswitcher +// + +viewswitcher { + margin: 0; + border-spacing: $space-size / 2; + + &.wide { + margin-top: $space-size; + margin-bottom: $space-size; + + button.toggle { + margin: 0; + } + } + + &.narrow button.toggle { + border-radius: 0; + margin: 0; + + &:focus-within, &:focus { box-shadow: none; } + } + + button.toggle { + font-weight: bold; + padding: 0; + + > stack > box { + &.narrow { + font-size: 0.75rem; + padding-top: $space-size; + padding-bottom: $space-size - 2px; + border-spacing: $space-size - 2px; + + > stack > label { + padding-left: $space-size; + padding-right: $space-size; + } + } + + &.wide { + padding: 2px $space-size * 2; + border-spacing: $space-size; + } + } + } +} + +// AdwViewSwitcherBar +viewswitcherbar actionbar > revealer > box { + padding: 0; +} + +// AdwViewSwitcherTitle +viewswitchertitle { + margin-top: 0; + margin-bottom: 0; + + viewswitcher { + margin-left: $space-size * 2; + margin-right: $space-size * 2; + + &.narrow { + margin-top: 0; + margin-bottom: 0; + + button.toggle { + > stack > box { + &.narrow { + padding-top: 0; + padding-bottom: 0; + border-spacing: 0; + } + } + } + } + + &.wide { + margin-top: $space-size; + margin-bottom: $space-size; + } + } + + windowtitle { + margin-top: 0; + margin-bottom: 0; + } + + .top-bar headerbar & viewswitcher { + &.narrow { + button.toggle { + border-radius: 0 0 $corner-radius $corner-radius; + } + } + } +} + +// AdwIndicatorBin +indicatorbin { + > indicator, > mask { + min-width: $space-size; + min-height: $space-size; + border-radius: $circular-radius; + } + + > indicator { + margin: 1px; + background-color: gtkalpha(currentColor, .4); + + > label { + font-size: 0.6rem; + font-weight: bold; + padding: 1px 4px; + color: white; + } + } + + > mask { + padding: 1px; + background: black; + } + + &.needs-attention > indicator { + background-color: $primary; + + > label { color: on($primary); } + } +} + + +// +// preferencespage +// + +preferencespage > scrolledwindow > viewport > clamp > box { + margin: $space-size * 4 $space-size * 2; + border-spacing: $space-size *4; +} + +preferencesgroup > box { + &, .labels { + border-spacing: $space-size; + } + + > box.header:not(.single-line) { + margin-bottom: $space-size; + } + + > box.single-line { + min-height: 34px; + } + + button.background-preview-button.toggle { + padding: 0; + background: none; + box-shadow: none; + outline-color: transparent; + outline-width: 3px; + outline-offset: $space-size / 2; + outline-style: solid; + + &, > background-preview { + border-radius: $corner-radius; + } + + &:hover { + outline-color: $fill; + } + + &:active { + outline-color: $track; + } + + &:checked { + outline-color: $primary; + } + } + + .cutout-button { background-color: $base-alt; } +} + +// +// AdwAboutWindow +// + + window.about { + .main-page { + > viewport > clamp > box { + margin: $space-size * 2; + border-spacing: $space-size; + + > box { + margin-top: $space-size * 3; + border-spacing: $space-size * 3; + margin-bottom: $space-size; + } + } + + .app-version { + padding: $space-size / 2 $space-size * 3; + color: $primary; + border-radius: $corner-radius; + margin-top: $space-size / 2; + } + } + + .subpage { + > viewport > clamp > box { + margin: $space-size * 3 $space-size * 2; + border-spacing: $space-size * 3; + } + + > clamp > textview { + background: none; + color: inherit; + } + } +} + +// +// AdwStatusPage +// + +statuspage { + > scrolledwindow > viewport > box { + margin: $space-size * 6 $space-size * 2; + border-spacing: $space-size * 6; + + > clamp > box { + border-spacing: $space-size * 2; + + > .icon { + -gtk-icon-size: 128px; + + color: gtkalpha(currentColor, 0.55); + + &:disabled { + opacity: 0.35; + } + + &:not(:last-child) { + margin-bottom: $space-size * 4; + } + } + } + } + + &.compact > scrolledwindow > viewport > box { + margin: $space-size * 4 $space-size * 2; + border-spacing: $space-size * 4; + + > clamp > box { + > .icon { + -gtk-icon-size: 96px; + + &:not(:last-child) { + margin-bottom: $space-size * 2; + } + } + + > .title { + font-size: 18pt; + } + } + } +} + +// Transition shadows +flap, +leaflet, +navigation-view, +overlay-split-view { + @include transition-shadows($frame); +} + +toolbarview.undershoot-top scrolledwindow { + @include undershoot(top); +} + +toolbarview.undershoot-bottom scrolledwindow { + @include undershoot(bottom); +} + +// Sidebar +.unfolded stacksidebar.sidebar { border: none; } + +$sidebar: if($topbar == 'dark' and $variant == 'light', $titlebar, $base-alt); +$sidebar-backdrop: if($topbar == 'dark' and $variant == 'light', $titlebar-backdrop, $background); + +.sidebar-pane { + background-color: $sidebar; + color: on($sidebar); + + &:backdrop { + color: on($sidebar, disabled); + background-color: $sidebar-backdrop; + transition: background-color $duration $ease-out; + } + + .sidebar-pane { + background-color: transparent; + color: inherit; + } + + .toolbar, + .sidebar, + .navigation-sidebar, + searchbar > revealer > box { + background-color: transparent; + box-shadow: none; + border: none; + } + + @if $topbar == 'dark' and $variant == 'light' { + button:not(.suggested-action):not(.destructive-action) { @extend %titlebar-button; } + + entry { @extend %titlebar-entry; } + + .dim-label { color: on($sidebar, disabled); } + + .navigation-sidebar { + > row { + color: on($sidebar, secondary); + + &:hover, &:active, &:focus, &:selected { + color: on($sidebar); + } + + &:disabled { + color: on($sidebar, secondary-disabled); + } + + button { @extend %titlebar-button; } + } + } + + placessidebar { + background-color: transparent; + + .navigation-sidebar { + > row { + color: on($sidebar, secondary); + + image.sidebar-icon, + label.sidebar-label { + color: on($sidebar, secondary); + } + + &:hover, &:active, &:focus, &:selected { + color: on($sidebar); + + image.sidebar-icon, + label.sidebar-label { + color: on($sidebar); + } + } + + &:disabled { + color: on($sidebar, secondary-disabled); + + image.sidebar-icon, + label.sidebar-label { + color: on($sidebar, secondary-disabled); + } + } + + button { @extend %titlebar-button; } + } + } + } + + scrollbar { + background-color: transparent; + + > range > trough { + > slider { + background-color: on($sidebar, disabled); + + &:hover { background-color: on($sidebar, secondary); } + + &:active { background-color: on($sidebar); } + + &:disabled { background-color: on($sidebar, secondary-disabled); } + } + } + + &.overlay-indicator { + &:not(.dragging):not(.hovering) { + > range > trough > slider { + border: none; + } + } + + &.dragging, + &.hovering { + background-color: transparent; + } + } + } + } + + banner > revealer > widget { + background-color: gtkmix($primary, $sidebar, 30%); + color: $text; + + &:backdrop { + background-color: gtkmix($primary, $sidebar, 30%); + } + } +} + +%content-button-reset { + color: $text-secondary; + + &:hover, &:focus:not(:hover):not(:active), &:active, &:checked { color: $text; } + + &:disabled { color: $text-secondary-disabled; } + + &:checked { + &:disabled { + color: $text-disabled; + } + } + + &:backdrop { + color: $text-disabled; + + &:focus, &:hover, &:active { color: $text-secondary; } + + &:disabled { color: $text-secondary-disabled; } + + &:checked { + color: $text-secondary; + + &:disabled { color: $text-secondary-disabled; } + } + } +} + +.content-pane { + @if $topbar == 'dark' and $variant == 'light' { + headerbar { + color: $text; + + .subtitle, + .dim-label { + color: $text-secondary; + + &:backdrop { color: $text-disabled; } + } + + @if $window_button == 'mac' { + button:not(.suggested-action):not(.destructive-action):not(.close):not(.minimize):not(.maximize) { + @extend %content-button-reset; + } + + windowcontrols { + > button:not(.suggested-action):not(.destructive-action) { + &.minimize, &.maximize, &.close { + &:backdrop { + > image { background-color: $track; } + + &:hover, &:active { + color: $text-disabled; + } + } + } + } + } + } @else { + button:not(.suggested-action):not(.destructive-action) { + @extend %content-button-reset; + } + } + + entry { + background-color: $fill; + color: $text-secondary; + + &:hover, &:focus-within { + color: $text; + } + + &:disabled { + background-color: $fill; + color: $text-disabled; + } + + > text { + > placeholder { + color: $text-disabled; + } + + > block-cursor { + color: $fill; + background-color: $text; + } + } + + > image { + color: $text-secondary; + + &:hover, &:active { color: $text; } + + &:disabled { color: $text-disabled; } + } + } + } + } +} + +/* Middle pane in three-pane setups */ +.content-pane .sidebar-pane, +.sidebar-pane .content-pane { + background-color: $base; + color: $text; + + &:backdrop { + background-color: $background; + transition: background-color $duration $ease-out; + } + + banner > revealer > widget { + background-color: gtkmix($primary, $base, 30%); + color: $text; + + &:backdrop { + background-color: gtkmix($primary, $base, 30%); + } + } +} + +.sidebar-pane, +.content-pane .sidebar-pane, +.sidebar-pane .content-pane { + &:dir(ltr), &.end:dir(rtl) { + &, banner > revealer > widget { + box-shadow: none; + border-right: 1px solid $border; + } + } + + &:dir(rtl), &.end:dir(ltr) { + &, banner > revealer > widget { + box-shadow: none; + border-left: 1px solid $border; + } + } +} + +.sidebar-pane, +.content-pane, +.content-pane .sidebar-pane, +.sidebar-pane .content-pane { + toolbarview.undershoot-top scrolledwindow { + @include undershoot(top, $style: 'border'); + } + + toolbarview.undershoot-bottom scrolledwindow { + @include undershoot(bottom, $style: 'border'); + } + + scrolledwindow { + &.undershoot-top { + @include undershoot(top, $style: 'border'); + } + + &.undershoot-bottom { + @include undershoot(bottom, $style: 'border'); + } + + &.undershoot-start { + &:dir(ltr) { @include undershoot(left, $style: 'border'); } + &:dir(rtl) { @include undershoot(right, $style: 'border'); } + } + + &.undershoot-end { + &:dir(ltr) { @include undershoot(right, $style: 'border'); } + &:dir(rtl) { @include undershoot(left, $style: 'border'); } + } + } + + flap, + leaflet, + navigation-view, + overlay-split-view { + @include transition-shadows($frame); + } +} + +.sidebar-pane, +.content-pane { + headerbar, .top-bar { + &, &:backdrop { + background-color: transparent; + box-shadow: none; + } + } + + tabbar { + .box { + &, &:backdrop { + background-color: transparent; + box-shadow: none; + } + } + + tab { + color: $text-secondary; + + &:hover:not(:selected), &:active { + color: $text; + } + + &:selected:not(:active) { + background-color: $overlay-selected; + color: $text; + box-shadow: none; + } + + &:disabled { + color: $text-secondary-disabled; + } + } + + button.image-button { + color: $text-secondary; + + &:hover, &:active { + color: $text; + } + + &:disabled { + color: $text-secondary-disabled; + } + } + } +} + +// Gnome >= 45.0 +.top-bar { + box-shadow: inset 0 -1px $border; + background-color: $titlebar; + + &:backdrop { + background-color: $titlebar-backdrop; + } + + .collapse-spacing { + padding: 0; + } +} diff --git a/src/sass/libadwaita/apps/_nautilus.scss b/src/sass/libadwaita/apps/_nautilus.scss new file mode 100644 index 00000000..ae048502 --- /dev/null +++ b/src/sass/libadwaita/apps/_nautilus.scss @@ -0,0 +1,46 @@ +// +// Nautilus +// +.nautilus-window { + .floating-bar { + min-height: 32px; + padding: 0; + margin: $base_padding; + border-style: none; + border-radius: $button_radius; + background-color: $accent_color; + color: $accent_fg_color; + box-shadow: $shadow-z3; + + button { + margin: (32px - $small_size) / 2; + color: $accent_fg_color; + + @extend %small_button; + } + } +} + +#NautilusQueryEditor { // search entry + > menubutton { + margin: $base_padding 0; + + > button.image-button { + min-width: 24px; + min-height: 24px; + padding: $medium_size / 2 - $base_padding - 12px; + } + } +} + +#NautilusPathBar { + background-color: gtkalpha(currentColor, 0.05); + border-radius: $button_radius; + padding: 0; +} + +#NautilusPathButton { + margin: 0; + border-radius: $button_radius; + @extend %button_basic_flat; +} \ No newline at end of file diff --git a/src/sass/libadwaita/apps/_other.scss b/src/sass/libadwaita/apps/_other.scss new file mode 100644 index 00000000..f74273df --- /dev/null +++ b/src/sass/libadwaita/apps/_other.scss @@ -0,0 +1,148 @@ +// +// Amberol +// + +playlistview { + scrollbar { + &.overlay-indicator { + &.dragging, + &.hovering { background-color: transparent; } + } + } + + queuerow { + picture.cover, + image.card { border: none; } + } +} + +// +// Theme Selectors +// + +themeselector, // Gnome text editor +panelthemeselector { // Gnome builder + margin: $base_padding * 1.5; + + checkbutton { + padding: 0; + min-height: 44px; + min-width: 44px; + padding: 1px; + background-clip: content-box; + border-radius: $circular_radius; + box-shadow: inset 0 0 0 1px $border_color; + + &.follow:checked, + &.light:checked, + &.dark:checked { + box-shadow: inset 0 0 0 2px $accent_bg_color; + } + + &.follow { + background-image: linear-gradient(to bottom right, #ffffff 50%, #202020 50%); + } + + &.light { + background-color: #ffffff; + } + + &.dark { + background-color: #202020; + } + + &.theme-selector radio { + -gtk-icon-source: none; + border: none; + box-shadow: none; + min-height: 20px; + min-width: 20px; + padding: 0; + + &, &:hover, &:active, &:checked { + background-color: transparent; + background-image: none; + } + + &:checked { + -gtk-icon-size: 20px; + -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/checkbox-checked-symbolic@2.svg"))); + + &, &:hover, &:active { + color: $accent_fg_color; + background-color: $accent_bg_color; + box-shadow: 0 2px 3px -1px rgba(black, 0.08), 0 1px 2px 0 rgba(black, 0.1); + } + } + } + } +} + +popover.menu themeswitcher { // Gnome console + padding: $base_padding; + + .check { + min-height: 20px; + min-width: 20px; + background: none; + padding: 0; + margin: 0; + border-radius: $circular_radius; + color: $accent_fg_color; + background-color: $accent_bg_color; + + &, &:hover, &:active { + box-shadow: 0 2px 3px -1px rgba(black, 0.08), 0 1px 2px 0 rgba(black, 0.1); + } + } + + checkbutton { + padding: 0; + min-height: 44px; + min-width: 44px; + padding: 1px; + border: none; + background-clip: content-box; + border-radius: $circular_radius; + box-shadow: inset 0 0 0 1px $border_color; + + &:checked { + box-shadow: inset 0 0 0 2px $accent_color; + } + + radio { + padding: 0; + border: none; + + &, + &:hover, + &:active, + &:checked, + &:indeterminate { + background-color: transparent; + background-image: none; + box-shadow: none; + color: transparent; + } + + &:checked, &:indeterminate { + -gtk-icon-source: none; + -gtk-icon-size: 0; + } + } + + &.system { + background: linear-gradient(-45deg, #1e1e1e 50%, white 50%); + } + + &.light { + color: gtkalpha(black, .8); + background-color: white; + } + + &.dark { + color: white; + background-color: #1e1e1e; + } + } +} diff --git a/src/sass/libadwaita/apps/_software.scss b/src/sass/libadwaita/apps/_software.scss new file mode 100644 index 00000000..7e9381aa --- /dev/null +++ b/src/sass/libadwaita/apps/_software.scss @@ -0,0 +1,1595 @@ + +// +// Nautilus +// +.nautilus-window { + placesview { + label { color: $text-secondary; } + } + + .nautilus-grid-view { + child.activatable { + @extend %row_activatable; + } + } + + .floating-bar { + min-height: 32px; + padding: 0; + margin: $space-size; + border-style: none; + border-radius: $corner-radius; + background-color: $primary; + color: on($primary); + box-shadow: $shadow-z3; + + button { + margin: (32px - $small-size) / 2; + color: on($primary); + + @extend %small-button; + } + } +} + +#NautilusQueryEditor { // search entry + > menubutton > button.image-button { + min-width: 24px; + min-height: 24px; + } + + > text, > box, > menubutton > button.image-button { + margin: $space-size 0; + } +} + +#NautilusQueryEditorTag { + background-color: $divider; + + > button.image-button { + margin: 0; + padding: 0; + } +} + +#NautilusPathBar { + background-color: $titlebar-fill; + border-radius: $corner-radius; + margin: $space-size 0; + + .content-pane & { + background-color: $fill; + } +} + +#NautilusPathButton { + margin: 0 $space-size / 2; + border-radius: $corner-radius; + + &.current-dir { + color: $titlebar-text; + + &:hover, &:active { + background: none; + box-shadow: none; + } + } + + .content-pane &.current-dir { + color: $text; + } + + &:first-child { margin-left: 0; } +} + +#NautilusViewCell { + clamp box { + margin: 0; + border-spacing: 0; + } +} + +navigation-view-page { + > toolbarview > scrolledwindow > viewport > clamp > box.medium > box > stack > button { + margin-top: $space-size * 2; + } +} + +// +// Gnome Control Center +// + +window.dialog { + > box > stack > box > box { + > notebook.frame { + border-width: 0 0 0 1px; + border-radius: 0; + } + } +} + +.background-thumbnail { + > button.remove-button { + margin: $space-size; + } +} + +// +// Calculator +// + +.display-container { + .small &.card { + border-radius: 0; + box-shadow: none; + border-width: 0 0 1px 0; + } + + .history-view { background-color: $base; } + + #displayitem { + padding: 0 12px 8px 0; + font-size: 1.4em; + border-top: 1px solid $border; + } +} + +.math-buttons button { + font-size: 1.1em; + padding: 2px $space-size; + + &.text-button { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; + } +} + +leaflet { + button.number-button { + background-color: rgba($text, 0.1); + + &:hover { + background-color: rgba($text, 0.2); + } + + &:active { + background-color: rgba($text, 0.3); + } + } +} + +// +// Calendar +// + +// labels +label { + &.primary-label, &.month-name, &.secondary-label { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2; + } + + &.primary-label, &.month-name { + color: $primary; + } + + &.secondary-label { + color: $text-disabled; + } +} + +calendar-view { + font-size: 10pt; + + &:selected { + color: $primary; + font-weight: bold; + } +} + +calendar-view.header, +label.header { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; +} + +calendar-view.current, +weekgrid.current { + background-color: gtkalpha($primary, 0.3); +} + +popover.events { + background-color: $popover; + padding: 0; + + box { + border-top-left-radius: $corner-radius; + border-top-right-radius: $corner-radius; + } + + list { + background-color: $base; + border-radius: $corner-radius; + } + + scrolledwindow { + border-width: 0; + } + + button { + border-radius: $corner-radius; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-style: solid none none; + box-shadow: none; + } +} + +// Event widget +event { + margin: 1px; + font-size: 0.9rem; + + widget.content { + margin: 4px; + } + + &.timed, + &:not(.slanted):not(.slanted-start):not(.slanted-end) { + border-radius: $corner-radius; + } + + &.timed widget.edge { + border-radius: $corner-radius / 2; + min-width: 5px; + } + + &.slanted-start, + &.slanted-end:dir(rtl) { + padding-left: $space-size * 2 + 4px; + border-radius: 0 $corner-radius / 2 $corner-radius / 2 0; + } + + &.slanted-end, + &.slanted-start:dir(rtl) { + padding-right: $space-size * 2 + 4px; + border-radius: $corner-radius / 2 0 0 $corner-radius / 2; + } + + &:not(.timed).color-dark { + color: white; + outline-color: rgba(0, 0, 0, 0.3); + } + + &.timed, + &:not(.timed).color-light { + color: gtkalpha(black, 0.75); + outline-color: rgba(255, 255, 255, 0.5); + } + +} + +// Event Popover +popover.event-popover, +popover.event-popover > contents { + padding: 0; +} + +.search-viewport { + background-color: $base; +} + +// calendar popover +.calendar-list { + background-color: transparent; + + > list { + border-radius: 4px; + } +} + +// defeats the ugly hover effect of the calendar color dot on buttons +.calendar-color-image { + -gtk-icon-filter: none; +} + +// adds a subtle shadow to the calendar color dot when it makes sense +image.calendar-color-image, +button:active:not(:backdrop) .calendar-color-image, +button:checked:not(:backdrop) .calendar-color-image, +.calendars-list .calendar-color-image:not(:backdrop):not(:disabled), +.calendar-list .calendar-color-image:not(:backdrop):not(:disabled), +.sources-button:not(:backdrop):not(:disabled) .calendar-color-image { + -gtk-icon-shadow: 0 1px gtkalpha(black, 0.1); +} + +// Date chooser + +// month/year controls +datechooser { + navigator { // add some space between the two controls + margin-right: $space-size; + margin-left: $space-size; + margin-bottom: $space-size; + } + + navigator { + label { font-weight: bold; } + + button.flat, + button.toggle, + button.image-button { + min-height: $medium-size; + min-width: $medium-size; + padding: 0; + } + } + + // day names and week numbers + .weeknum, .weekday { + color: $text-disabled; + font-size: smaller; + } + + // days + button.day { + font-size: 10pt; + font-weight: normal; + margin: $space-size / 2; + padding: 0; + min-height: $medium-size; + min-width: $medium-size; + transition: none; + + dot { + background-color: $text; + border-radius: 50%; + min-height: $space-size / 2; + min-width: $space-size / 2; + } + + &:selected, &.today:selected { + background-color: $primary; + color: on($primary); + font-weight: bold; + + dot { background-color: on($primary); } + } + + &.today { + color: $primary; + + dot { background-color: $primary; } + } + + &.other-month { + &:not(:hover), + &:backdrop { + color: gtkalpha(currentColor, 0.1); + + dot { background-color: gtkalpha(currentColor, 0.1); } + } + + &:hover:not(:backdrop) { + color: $text-disabled; + + dot { background-color: $text-disabled; } + } + } + } +} + +// Week View CSS +.week-header { + padding: 0; + + & > box:first-child { + border-bottom: 1px solid $border; + } + + .week-number { + font-size: 16pt; + font-weight: bold; + padding: $space-size * 2 $space-size * 2 $space-size * 3 $space-size * 2; + color: $track; + } + + &.week-temperature { + font-size: 10pt; + font-weight: bold; + color: $text-disabled; + } + + &.lines { + color: $border; + } +} + +weekhourbar > label { + font-size: 10pt; + padding: 4px $space-size; +} + +.week-view .lines { + color: $border; +} + +weekgrid > widget.now-strip { + background-color: gtkalpha($primary, 0.8); + margin: 0 0 0 1px; + min-height: 3px; +} + +weekgrid, +.week-header { + &:selected, &.dnd { + background-color: gtkalpha($primary, 0.25); + } +} + +// Month cell +monthcell { + border: solid 1px $border; + border-width: 1px 0 0 1px; + background-color: transparent; + transition: background-color 200ms; + + &:hover:not(.out-of-month):not(.today) { + background-color: $base-alt; + transition: background-color 200ms; + color: $text; + } + + &:selected { + background-color: gtkalpha($primary, 0.1); + + &:hover { + background-color: gtkalpha($primary, 0.2); + } + + label.day-label { font-weight: bold; } + } + + &:nth-child(7n + 1) { border-left-width: 0; } + + &.today { + background-color: gtkalpha($primary, 0.2); + + &:hover { + background-color: gtkalpha($primary, 0.3); + color: $primary; + } + + &:selected { + background-color: gtkalpha($primary, 0.25); + + &:hover { + background-color: gtkalpha($primary, 0.35); + } + } + } + + label { + color: $text; + font-size: 0.9rem; + + &.day-label { + font-size: 1rem; + } + } + + &.out-of-month { + background-color: $fill; + + label { + color: $text-secondary; + } + } + + button { + padding: 0 $space-size; + border-radius: 0; + border-bottom: none; + border-right: none; + } +} + +// Month popover +monthpopover > box { + margin: 0; + padding: 0; + background-color: transparent; +} + +.notes-section box > textview { + border-radius: $corner-radius; + padding: $space-size; + + > text { + background: none; + } +} + +// Agenda View CSS +agenda-view { + list { + > row { + padding: 2px $space-size * 2; + } + + > label { + padding: $space-size $space-size * 2; + } + } + + > scrolledwindow > viewport > list.background { + background-color: transparent; + } +} + +label.no-events { + font-style: italic; +} + +// Search +searchbutton > popover > arrow { + background: none; + border: none; +} + +// Month selector +datechooser { + padding: $space-size; + + .current-week { + background: gtkalpha($titlebar, 0.7); + color: on($titlebar); + border-radius: $corner-radius; + } +} + +menubutton { + &.sources-button { + margin-top: 0; + margin-bottom: 0; + border-radius: 0; + border-top-style: none; + border-bottom-style: none; + + &:hover:not(:backdrop) { + background-image: none; + text-shadow: none; + } + + > button { + border-radius: 0; + + .title { + font-size: 10pt; + font-weight: normal; + padding: 0 $space-size; + } + + .subtitle { + font-size: 8pt; + padding: 0 $space-size; + } + + .calendar-color-image { + -gtk-icon-size: 12px; + } + } + } + + stack > box { + border-spacing: $space-size; + } + + .topbar headerbar &.sources-button { + > button { + border-radius: 0 0 $corner-radius $corner-radius; + } + } +} + +// +// Contacts +// + +.contacts-contact-list list.navigation-sidebar { + background: none; +} + +// +// Gnome Software +// + +.details-page { + margin: $space-size * 4 0px; +} + +.installed-overlay-box { + font-size: smaller; + background-color: $primary; + border-radius: 0; + color: on($primary); + text-shadow: 0 1px 0 rgba(black, 0.2); +} + +screenshot-carousel box.frame { + border-width: 1px 0; + border-radius: 0; +} + +screenshot-carousel button, +.featured-carousel button { + margin: $space-size * 2; +} + +.screenshot-image-main .image1, +.screenshot-image-main .image2 { + margin-top: $space-size; + margin-bottom: $space-size * 2; + margin-left: $space-size; + margin-right: $space-size; +} + +.app-tile-label { + font-size: 105%; +} + +.review-textbox { + padding: $space-size; +} + +.origin-rounded-box { + background-color: $divider; + border-radius: $circular-radius; + padding: $space-size - 2px; +} + +.origin-beta { + color: $warning; +} + +.origin-button > button { + padding: $space-size / 2 $space-size * 1.5; +} + +.card flowboxchild { + &.card { + border: none; + box-shadow: none; + padding: 0; + background: none; + } +} + +.category-tile.card { + padding: $space-size * 3.5; + border: none; + border-radius: $corner-radius; + min-width: 140px; + font-weight: 900; + font-size: larger; + box-shadow: $shadow-z3; + + &.category-tile-iconless { + padding: $space-size * 1.5 $space-size * 2.5; + min-width: 130px; + font-size: 105%; + font-weight: normal; + box-shadow: none; + background-color: $fill; + } + + // Styling for specific category buttons. + &.category-create { + background: linear-gradient(180deg, #ce8cd7 0%, #2861c6 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#ce8cd7, 1.07) 0%, shade(#2861c6, 1.1) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#ce8cd7, .95) 0%, shade(#2861c6, .95) 100%); + color: white; + } + } + + &.category-develop { + background: #5e5c64; + color: white; + + &:hover { + background: shade(#5e5c64, 1.2); + color: white; + } + + &:active { + background-color: shade(#5e5c64, .95); + color: white; + } + } + + &.category-learn { + background: linear-gradient(180deg, #2ec27e 30%, #27a66c 100%); + color: white; + + &:hover { + background: linear-gradient(180deg, shade(#2ec27e, 1.06) 30%, shade(#27a66c, 1.06) 100%); + color: white; + } + + &:active { + background: linear-gradient(180deg, shade(#2ec27e, .95) 30%, shade(#27a66c, .95) 100%); + color: white; + } + } + + &.category-play { + background: linear-gradient(75deg, #f9e2a7 0%, #eb5ec3 50%, #6d53e0 100%); + color: #393484; + + &:hover { + background: linear-gradient(75deg, shade(#f9e2a7, 1.07) 0%, shade(#eb5ec3, 1.07) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + + &:active { + background: linear-gradient(75deg, shade(#f9e2a7, .97) 0%, shade(#eb5ec3, .95) 50%, shade(#6d53e0, 1.07) 100%); + color: #393484; + } + } + + &.category-socialize { + background: linear-gradient(90deg, #ef4e9b 0%, #f77466 100%); + color: $text-secondary; + + &:hover { + background: linear-gradient(90deg, shade(#ef4e9b, 1.08) 0%, shade(#f77466, 1.08) 100%); + } + + &:active { + background: linear-gradient(90deg, shade(#ef4e9b, .95) 0%, shade(#f77466, .95) 100%); + } + } + + &.category-work { + padding: 1px; /* FIXME: work around https://gitlab.gnome.org/GNOME/gtk/-/issues/4324 */ + color: #1c71d8; + background-color:#fdf8d7; + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + background-size: 10px 10px, 10px 10px; + background-position: -1px -4px, center -1px; + + &:hover { + color: #1c71d8; + background-color: lighten(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + + &:active { + color: #1c71d8; + background-color: darken(#fdf8d7, 5%); + background-image: linear-gradient($border 1px, transparent 1px), + linear-gradient(90deg, $border 1px, transparent 1px); + } + } +} + +clamp.medium .category-tile:not(.category-tile-iconless), +clamp.large .category-tile:not(.category-tile-iconless) { + font-size: larger; +} + +// The rest of the featured-tile CSS is loaded at runtime in gs-feature-tile.c +.featured-tile { + padding: 0; + box-shadow: none; + color: $text; + + label.title-1 { + margin-top: $space-size; + margin-bottom: $space-size; + } + + &.narrow label.title-1 { + font-size: 16pt; + } +} + +.application-details-infobar { + &, &.info { + background-color: $fill; + color: $text; + border: 1px solid $border; + } + + &.warning { + background-color: $warning; + color: on($warning); + border: 1px solid on($warning, divider); + } +} + +@keyframes install-progress-unknown-move { + 0% { background-position: 0%; } + 50% { background-position: 100%; } + 100% { background-position: 0%; } +} + +.application-details-description .button { + padding-left: $space-size * 4; + padding-right: $space-size * 4; +} + +.install-progress { + background-image: linear-gradient(to top, $primary 2px, gtkalpha($primary, 0) 2px); + background-repeat: no-repeat; + background-position: 0 bottom; + background-size: 0; + transition: none; +} + +.install-progress:dir(rtl) { background-position: 100% bottom; } + +.review-row > * { + margin: $space-size * 2; +} + +.review-row button { font-size: smaller; } + +.review-row .vote-buttons button { + margin-right: -1px; +} + +// this is the separator between yes and no vote buttons, gtk+ 3.20 only +.review-row .vote-buttons button:not(:first-child) { + border-image: linear-gradient(to top, $border, $border) 0 0 0 1 / 5px 0 5px 1px; +} + +.review-row .vote-buttons button:hover, +.review-row .vote-buttons button:active, +.review-row .vote-buttons button:hover + button, +.review-row .vote-buttons button:active + button { + border-image: none; +} + +review-bar { + color: $text-disabled; + background-image: none; + background-color: $track; +} + +.review-histogram star-image { + color: $text-disabled; +} + +.version-arrow-label { + font-size: x-small; +} + +.overview-more-button { + font-size: smaller; + padding: 0 $space-size * 2 + 4px; +} + +.app-row-origin-text { + font-size: smaller; +} + +.app-listbox-header { + padding: $space-size; + border-bottom: 1px solid $border; +} + +.image-list { + background-color: transparent; +} + +box.star { + background-color: transparent; + background-image: none; +} + +button.star { + outline-offset: 0; + background-color: transparent; + background-image: none; + border-image: none; + border-radius: 0; + border-width: 0; + padding: 0; + box-shadow: none; + outline-offset: -1px; +} + +star-image { + color: $yellow-dark; +} + +.dimmer-label { + opacity: 0.25; +} + +.update-failed-details { + font-family: Monospace; + font-size: smaller; + padding: $space-size * 2 + 4px; +} + +.upgrade-banner { + padding: 0px; + border-radius: $corner-radius; + border: none; +} + +.upgrade-banner-background { + background: linear-gradient(to bottom, $green-light, $blue-light); + color: white; +} + +.upgrade-buttons #button_upgrades_install { + padding-left: $space-size * 2 + 4px; + padding-right: $space-size * 2 + 4px; +} + +scrolledwindow.list-page > viewport > clamp > box { + margin: $space-size * 4 $space-size * 2; + border-spacing: $space-size * 4; +} + +.update-preferences preferencesgroup > box > box { + margin-top: $space-size * 3; +} + +.section > label:not(:first-child) { margin-top: $space-size; } + +.section > box:not(:first-child) { margin-top: $space-size * 2; } + +clamp.status-page { + margin: $space-size * 6 $space-size * 2; +} + +clamp.status-page .iconbox { + min-height: 128px; + min-width: 128px; +} + +clamp.status-page .icon { + color: $text-disabled; + min-height: 32px; + min-width: 32px; +} + +clamp.status-page .icon:not(:last-child) { + margin-bottom: $space-size * 6; +} + +clamp.status-page .title:not(:last-child) { + margin-bottom: $space-size * 2; +} + +app-context-bar { + .context-tile { + border: 1px solid $border; + background-color: transparent; + border-radius: 0; + padding: $space-size * 4 $space-size * 2 $space-size * 3.5 $space-size * 2; + outline-offset: 5px; + transition-property: outline, outline-offset, background-image; + border-bottom: none; + border-right: none; + + &:hover { + background-image: none; + background-color: $overlay-hover; + } + + &.keyboard-activating, + &:active { + background-color: $overlay-active; + } + + &:focus:focus-visible { + outline-offset: -1px; + } + } + + &.horizontal box:first-child .context-tile:first-child, + &.vertical .context-tile:first-child { + border-left: none; + } + + &.horizontal .context-tile, + &.vertical box:first-child .context-tile { + border-top: none; + } + + > box:not(:first-child) > button.flat { + border-radius: 0; + + &:last-child { + border-radius: 0 $corner-radius $corner-radius 0; + } + } + + > box:first-child > button.flat { + border-radius: 0; + + &:first-child { + border-radius: $corner-radius 0 0 $corner-radius; + } + } + + > box > button.flat { + border-left-color: $border; + } +} + +carousel.card { + border: none; + background-color: $fill; +} + +.context-tile-lozenge { + min-height: 28px; + min-width: 28px; + padding: $space-size; + font-size: 18px; + font-weight: bold; + border-radius: $circular-radius; + + &.large { + font-size: 24px; + padding: 16px; + min-width: 24px; /* 60px minus the left and right padding */ + min-height: 24px; /* 60px minus the top and bottom padding */ + } + + &.wide-image image { + margin-top: -28px; + margin-bottom: -28px; + } + + image { -gtk-icon-style: symbolic; } + + &.grey { + color: $text; + background-color: $divider; + } + + &.green, &.details-rating-0 { + color: darken($success, 15%); + background-color: rgba($success, 0.15); + } + + &.blue, + &.details-rating-5 { + color: $blue-light; + background-color: rgba($blue-light, 0.15); + } + + &.yellow, &.details-rating-12 { + color: darken($warning, 15%); + background-color: rgba($warning, 0.15); + } + + &.details-rating-15 { + color: $orange-light; + background-color: rgba($orange-light, .15); + } + + &.red, &.details-rating-18 { + color: darken($error, 15%); + background-color: rgba($error, 0.15); + } +} + +.eol-red { + font-weight: bold; + color: $error; +} + +window.narrow .app-title { + font-size: 16pt; +} + +window.narrow .app-developer { + font-size: small; +} + +.install-progress-label { + font-size: smaller; + font-feature-settings: "tnum"; +} + +scrolledwindow.fake-adw-status-page > viewport > box { margin: $space-size * 6 $space-size * 2; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp:not(:last-child) > box { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .icon:not(:last-child) { margin-bottom: $space-size * 6; } +scrolledwindow.fake-adw-status-page > viewport > box > clamp > box > .title:not(:last-child) { margin-bottom: $space-size * 2; } + +statuspage.icon-dropshadow image.icon { + -gtk-icon-shadow: 0 1px 12px rgba(0,0,0,0.05), + 0 -1px rgba(0,0,0,0.05), + 1px 0 rgba(0,0,0,0.1), + 0 1px rgba(0,0,0,0.3), + -1px 0 rgba(0,0,0,0.1); +} + +window.info scrollbar.vertical { + margin-top: 48px; + background: none; + box-shadow: none; +} + +window.info scrollbar.vertical trough { + margin-top: 0; +} + +// GsAppRow +row.app > box.header { + margin-left: $space-size * 2; + margin-right: $space-size * 2; +} + +row.app > box.header { + border-spacing: $space-size * 2; +} + +row.app > box.header > image { + margin-top: $space-size * 2; + margin-bottom: $space-size * 2; +} + +row.app label.warning { + color: $error; +} + +// GtkSpinner + +// Ensure the spinner is hidden before the animation is triggered. +@keyframes pre-delay { + from { opacity: 0; } + to { opacity: 0; } +} + +@keyframes fade-in { + from { filter: opacity(0%); } +} + +/* Give a fade-in animation to spinners. */ +spinner.fade-in:checked { + animation: pre-delay 0.5s linear 1, fade-in 1s linear 1, spin 1s linear infinite; + animation-delay: 0s, 0.5s, 0.5s; +} + +// Leaflets +window > contents > leaflet { // Gnome control center + > box > stack.background { + background-color: transparent; + background-image: linear-gradient(to bottom, + transparent, + transparent $large-size, + $background $large-size, + $background); + } +} + +// +// Gnome Weather +// + +@define-color weather_temp_chart_fill_color #{rgba($warning, 0.5)}; +@define-color weather_temp_chart_stroke_color #{darken($warning, 10%)}; +@define-color weather_thermometer_warm_color #{if($variant == 'light', $yellow-dark, $yellow-light)}; +@define-color weather_thermometer_cold_color #{if($variant == 'light', $blue-dark, $blue-light)}; + +$weather_thermometer_high_color: $yellow-light; +$weather_thermometer_low_color: $blue-light; +$weather_forecast_color: #ae7b03; + +#places-label { + font-weight: bold; +} + +#temperature-label { + font-size: 32pt; + font-weight: 900; + margin-left: 9px; +} + +#conditions-grid *:backdrop { + color: $text-secondary; +} + +.content-view.cell { + font-weight: bold; +} + +#locationEntry { + margin: $space-size; +} + +.weather-popover { + margin-top: $space-size; +} + +.forecast-card { + transition: border-radius 100ms ease-out; + border-radius: $corner-radius; +} + +.forecast-card separator { + background-color: $border; +} + +#daily-forecast-box { + > separator:last-child { + background-color: transparent; + min-width: 0; + } +} + +#conditions-grid, +#attributionGrid { + margin-left: $space-size * 3; + margin-right: $space-size * 3; +} + +#weather-page .small .forecast-card { + margin-left: 0; + margin-right: 0; + border-radius: 0; + border-width: 1px 0; +} + +.forecast-temperature-label { + font-weight: bold; + color: $weather_forecast_color; +} + +WeatherThermometer { + margin-bottom: $space-size * 2; +} + +WeatherThermometer > label.high { + font-weight: bold; + color: $weather_thermometer_high_color; +} + +WeatherThermometer > label.low { + font-weight: bold; + color: $weather_thermometer_low_color; +} + +.forecast-button { + margin: 0 $space-size * 2; +} + +.forecast-graphic { + margin: $space-size * 3; +} + +button.osd.circular { + border-radius: $circular-radius; + min-width: $small-size; + min-height: $small-size; +} + +button.osd.circular > image { + padding: 0; +} + +scrolledwindow.inline list, +scrolledwindow.inline listview { + background: none; + color: inherit; +} + +scrolledwindow.inline undershoot.top { + box-shadow: inset 0 1px $border; +} + +.search-view { + background-color: $blue-dark; + color: on($blue-dark); +} + +.search-view menubutton button:focus:focus-visible { + outline-color: rgba(white, 0.3); +} + +image.circular { + min-width: $medium-size; + min-height: $medium-size; + padding: 0; + border-radius: $circular-radius; +} + +// WeatherThermometerScale { +// border-radius: $circular-radius; +// background-image: linear-gradient(to bottom, $weather_thermometer_warm_color, $weather_thermometer_cold_color); +// margin: 0 36px; +// padding: 0; +// } + +// +// Gnome Clocks +// + +.large-button { + padding: $space-size; +} + +// alarms +.alarm-time { + font-size: 2.5em; + font-weight: 300; +} + +.clocks-ampm-toggle-button, +.clocks-secondary-standalone-label { + font-size: 18pt; +} + +.clocks-standalone-label, +.clocks-ringing-label { + font-size: 6em; + font-weight: 300; +} + +.clocks-ringing-title { + font-size: 1.5em; + font-weight: bold; +} + +.clocks-alarm-setup-time { + font-size: 32pt; +} + +// Timer Panel +.clocks-timer-label, +.clocks-spinbutton { + font-size: 48pt; +} + +// disguise insensitive spinbuttons as normal labels +.timer-panel .timer-header { + font-size: 20pt; + font-weight: 300; +} + +.timer-countdown { + font-size: 40pt; + font-weight: 300; +} + +/* Stopwatch Panel */ +.lap-time { + font-weight: bold; +} + +.stopped-stopwatch label, +.running-stopwatch label, +.paused-stopwatch label { + font-size: 70px; + font-weight: lighter; +} + +.stopped-stopwatch .seconds-label { + font-weight: 300; +} + +.running-stopwatch .seconds-label, +.running-stopwatch .miliseconds-label { + color: $primary; +} + +.stopped-stopwatch .miliseconds-label, +.running-stopwatch .miliseconds-label, +.paused-stopwatch .miliseconds-label { + font-size: 50px; +} + +.running-stopwatch .seconds-label, +.paused-stopwatch .seconds-label { + font-weight: 300; +} + +// World +.clock-location { + font-weight: bolder; +} + +.hidden { + opacity: 0; +} + +.clock-time { + font-size: 2em; + padding: 0.2em 0.5em; + border-radius: 1em; +} + +.none .clock-time { + background: gtkalpha(currentColor, 0.2); +} + +.night .clock-time { + color: $blue-dark; + background-color: gtkalpha($blue-light, 0.25); +} + +.naut .clock-time, +.astro .clock-time { + color: $orange-dark; + background-color: gtkalpha($orange-light, 0.25); +} + +.civil .clock-time, +.day .clock-time { + color: $yellow-dark; + background: gtkalpha($yellow-light, 0.25); +} + +// +// Builder +// + +headerbar splitbutton { + notification button { + margin: 0; + min-height: $small-size; + min-width: $small-size; + padding: 0; + } +} + +popover.background.global-search { + > arrow, > contents { padding: 0; } +} + +panelframeswitcher { + padding: $space-size; + min-height: $medium-size; +} + +.frameheader.header { + // min-height: $small-size; + background-color: $titlebar; + + &:backdrop { + background-color: $titlebar-backdrop; + } + + > button { + border: none; + margin: 0; + padding: $space-size / 2; + } + + tabbar.inline { + > revealer > box { + min-height: $small-size; + + .start-action { + padding: 0; + border: none; + } + + .end-action { + padding: 0; + border-left: 1px solid $border; + + button { margin: $space-size; } + } + + tabbox { + border: none; + background: none; + } + } + } +} + +panelstatusbar { + > menubutton > button, + > paneltogglebutton button { border-radius: 0; } +} + +// Setting window +.style-variant { + padding: 0 $space-size * 2; + + button.toggle { + padding: 0; + + &, &:hover, &:focus, &:active, &:checked { + background: none; + outline: none; + border: none; + box-shadow: none; + } + + > stylevariantpreview > .wallpaper { + border-radius: $corner-radius; + outline-color: transparent; + outline-width: 3px; + outline-offset: $space-size / 2; + outline-style: solid; + box-shadow: none; + } + + &:hover > stylevariantpreview > .wallpaper { + outline-color: $fill; + } + + &:active > stylevariantpreview > .wallpaper { + outline-color: $track; + } + + &:checked > stylevariantpreview > .wallpaper { + outline-color: $primary; + } + } +} + +// +// Amberol +// + +playlistview { + scrollbar { + &.overlay-indicator { + &.dragging, + &.hovering { background-color: transparent; } + } + } + + queuerow { + picture.cover, + image.card { border: none; } + } +} + +// +// Console +// + +.exit-info { + padding: 6px; + border-top: 2px solid $primary; + background: rgba($primary, 0.9); + color: on($primary); +} + +.error .exit-info { + border-top: 2px solid $error; + background: rgba($error, 0.9); + color: on($error); +} + +// +// dialogs +// + +window.dialog { + > .dialog-vbox > box > scrolledwindow > viewport > widget { + > list.boxed-list { + border: none; + border-radius: 0; + + > row { + &:first-child, &:last-child { border-radius: 0; } + } + } + } +} diff --git a/src/sass/libadwaita/base.scss b/src/sass/libadwaita/base.scss new file mode 100644 index 00000000..0911b61c --- /dev/null +++ b/src/sass/libadwaita/base.scss @@ -0,0 +1,10 @@ +$contrast: 'normal'; +$variant: 'light'; + +@import 'palette'; +@import 'functions'; +@import 'variables'; +@import 'colors'; +@import 'drawing'; +@import 'common'; +@import 'compat-colors'; diff --git a/src/sass/libadwaita/defaults-dark.scss b/src/sass/libadwaita/defaults-dark.scss new file mode 100644 index 00000000..7c56516c --- /dev/null +++ b/src/sass/libadwaita/defaults-dark.scss @@ -0,0 +1,3 @@ +$variant: 'dark'; + +@import 'defaults'; diff --git a/src/sass/libadwaita/defaults-light.scss b/src/sass/libadwaita/defaults-light.scss new file mode 100644 index 00000000..97159a23 --- /dev/null +++ b/src/sass/libadwaita/defaults-light.scss @@ -0,0 +1,3 @@ +$variant: 'light'; + +@import 'defaults'; diff --git a/src/sass/libadwaita/widgets/_avatar.scss b/src/sass/libadwaita/widgets/_avatar.scss new file mode 100644 index 00000000..9eaea476 --- /dev/null +++ b/src/sass/libadwaita/widgets/_avatar.scss @@ -0,0 +1,38 @@ +avatar { + border-radius: 9999px; + font-weight: bold; + + // The list of colors to generate avatars. + // Each avatar color is represented by a font color, a gradient start color and a gradient stop color. + // There are 8 different colors for avtars in the list if you change the number of them you + // need to update the NUMBER_OF_COLORS in src/adw-avatar.c. + // The 2D list has this form: ((font-color, gradient-top-color, gradient-bottom-color)). + $avatarcolorlist: ( + (#cfe1f5, #83b6ec, #337fdc), // blue + (#caeaf2, #7ad9f1, #0f9ac8), // cyan + (#cef8d8, #8de6b1, #29ae74), // green + (#e6f9d7, #b5e98a, #6ab85b), // lime + (#f9f4e1, #f8e359, #d29d09), // yellow + (#ffead1, #ffcb62, #d68400), // gold + (#ffe5c5, #ffa95a, #ed5b00), // orange + (#f8d2ce, #f78773, #e62d42), // raspberry + (#fac7de, #e973ab, #e33b6a), // magenta + (#e7c2e8, #cb78d4, #9945b5), // purple + (#d5d2f5, #9e91e8, #7a59ca), // violet + (#f2eade, #e3cf9c, #b08952), // beige + (#e5d6ca, #be916d, #785336), // brown + (#d8d7d3, #c0bfbc, #6e6d71), // gray + ); + + @for $i from 1 through length($avatarcolorlist) { + &.color#{$i} { + $avatarcolor: nth($avatarcolorlist, $i); + background-image: linear-gradient(nth($avatarcolor, 2), nth($avatarcolor, 3)); + color: nth($avatarcolor, 1); + } + } + + &.contrasted { color: white; } + + &.image { background: none; } +} diff --git a/src/sass/libadwaita/widgets/_bottom-sheet.scss b/src/sass/libadwaita/widgets/_bottom-sheet.scss new file mode 100644 index 00000000..0616dce8 --- /dev/null +++ b/src/sass/libadwaita/widgets/_bottom-sheet.scss @@ -0,0 +1,45 @@ + +bottom-sheet { + > dimming { + background-color: gtkalpha($shade_color, 2); + } + + > sheet { + border-top-left-radius: $window_radius; + border-top-right-radius: $window_radius; + box-shadow: 0 2px 8px 2px transparentize(black, 0.93), + 0 3px 20px 10px transparentize(black, 0.95), + 0 6px 32px 16px transparentize(black, 0.98), + 0 0 0 1px $shade_color; + + > drag-handle { + background-color: gtkalpha(currentColor, .25); + min-width: 60px; + min-height: 4px; + margin: $base_padding; + border-radius: $circular_radius; + } + + > outline { + border-top-left-radius: $window_radius; + border-top-right-radius: $window_radius; + box-shadow: inset 1px 0 $window_outline_color, + inset -1px 0 $window_outline_color, + inset 0 1px $window_outline_color; + + &.flush-left { + box-shadow: inset -1px 0 $window_outline_color, + inset 0 1px $window_outline_color; + } + + &.flush-right { + box-shadow: inset 1px 0 $window_outline_color, + inset 0 1px $window_outline_color; + } + + &.flush-left.flush-right { + box-shadow: inset 0 1px $window_outline_color; + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_buttons.scss b/src/sass/libadwaita/widgets/_buttons.scss new file mode 100644 index 00000000..7a98bbaf --- /dev/null +++ b/src/sass/libadwaita/widgets/_buttons.scss @@ -0,0 +1,620 @@ + +%button_basic { + @include button(normal); + + &:focus { @include button(focus); } + + &:hover { @include button(hover); -gtk-icon-filter: brightness(1.2); } + + &.keyboard-activating, &:active { @include button(active); } + + &:disabled { @include button(disabled); } + + &:checked { + @include button(checked); + + &:hover { @include button(checked-hover); } + + &:active { @include button(checked-active); } + + &:disabled { @include button(checked-disabled); } + } +} + +%button_basic_flat { + @include button(flat-normal); + + &:focus:not(:hover):not(:active) { @include button(flat-focus); } + + &:hover { @include button(flat-hover); } + + &.keyboard-activating, &:active { @include button(flat-active); } + + &:disabled { @include button(flat-disabled); } + + &:checked { + @include button(flat-checked); + + &:hover { @include button(flat-checked-hover); } + + &:active { @include button(flat-checked-active); } + + &:disabled { @include button(flat-checked-disabled); } + } +} + +%button_basic_raised { + background-color: $button_color; + + &:hover { + background-color: $button_hover_color; + } + + &.keyboard-activating, + &:active { + background-color: $button_active_color; + } + + &:checked { + background-color: $button_checked_color; + + &:hover { + background-color: $button_checked_hover_color; + } + + &.keyboard-activating, + &:active { + background-color: $button_checked_active_color; + } + } +} + +@at-root %opaque_button { + box-shadow: none; + + @include focus-ring($outer: true, $offset: 1px, $transition: $button_transition); + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + &:hover { + background-image: image(gtkalpha(currentColor, .1)); + } + + &.keyboard-activating, + &:active { + background-image: image(transparentize(black, .8)); + } + + &:checked { + background-image: image(transparentize(black, .85)); + + &:hover { + background-image: image(transparentize(black, .95)); + } + + &.keyboard-activating, + &:active { + background-image: image(transparentize(black, .7)); + } + } +} + +%small_button { + min-height: $small_size; + min-width: $small_size; + padding: 0; + border-radius: $circular_radius; +} + +$opaque_button_default_bg: gtkmix($window_bg_color, $window_fg_color, 85%); + +%button, +button { + min-height: 24px; + min-width: 16px; + padding: ($medium_size - 24px) / 2 ($medium_size - 16px) / 2; + border-radius: $button_radius; + font-weight: bold; + @extend %button_basic; + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + &:disabled { + filter: opacity($disabled_opacity); + + label { + filter: none; + } + } + + &.image-button { + min-width: 24px; + padding-left: ($medium_size - 24px) / 2; + padding-right: ($medium_size - 24px) / 2; + } + + &.text-button { + padding-left: $base_padding * 2 + 4px; + padding-right: $base_padding * 2 + 4px; + } + + &.text-button.image-button, + &.image-text-button { + padding-left: $base_padding * 1.5; + padding-right: $base_padding * 1.5; + + > box, + > box > box { + border-spacing: 4px; + + > label { + padding-left: 2px; + padding-right: 2px; + } + } + } + + &.arrow-button { + padding-left: $base_padding * 1.5; + padding-right: $base_padding * 1.5; + + > box { border-spacing: 4px; } + + &.text-button { + > box { border-spacing: 4px; } + } + } + + @at-root %button_basic_drop_active, + &:drop(active) { + color: $drop_target_color; + box-shadow: inset 0 0 0 2px $drop_target_color; + } + + // big standalone buttons like in Documents pager + @at-root %osd_button, + &.osd { + min-width: 32px; + min-height: 32px; + @include focus-ring($outer: true, $offset: 1px, $transition: $button_transition); + + color: $osd_fg_color; + background-color: transparentize(black, .35); + + &:hover { + color: white; + background-color: gtkalpha(gtkmix(black, currentColor, 85%), .65); + } + + &.keyboard-activating, + &:active { + color: white; + background-color: gtkalpha(gtkmix(black, currentColor, 75%), .65); + } + + &:checked { + background-color: gtkalpha(gtkmix(black, currentColor, 80%), .65); + + &:hover { + background-color: gtkalpha(gtkmix(black, currentColor, 75%), .65); + } + + &.keyboard-activating, + &:active { + background-color: gtkalpha(gtkmix(black, currentColor, 65%), .65); + } + } + + // Specificity bump + &:drop(active) { + @extend %button_basic_drop_active; + } + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } + } + + &.opaque { + @extend %opaque_button; + + background-color: $opaque_button_default_bg; + color: $window_fg_color; + } + + &.destructive-action { + @extend %opaque_button; + + color: $destructive_fg_color; + + &, &:checked { + background-color: $destructive_bg_color; + } + } + + &.suggested-action { + @extend %opaque_button; + + color: $accent_fg_color; + + &, &:checked { + background-color: $accent_bg_color; + } + } + + &.flat { + @extend %button_basic_flat; + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + // Specificity bump + &:drop(active) { + @extend %button_basic_drop_active; + } + } + + stackswitcher > & { + // to position the needs attention dot, padding is added to the button + // child, a label needs just lateral padding while an icon needs vertical + // padding added too. + + > label { + padding: 0 6px; + margin: 0 -6px; + } + + > image { + padding: 3px 6px; + margin: -3px -6px; + } + + &.text-button { min-width: 100px; } + + &.needs-attention { + > label, + > image { @extend %needs_attention; } + } + } + + // hide separators + &.font { + separator { background-color: transparent; } + > box { border-spacing: 6px; } + > box > box > label { font-weight: bold; } + } + + @at-root %circular_button, + &.circular { // force circular button shape + min-width: 34px; + min-height: 34px; + padding: 0; + border-radius: 9999px; + + label { padding: 0; } + } + + @at-root %pill_button, + &.pill { + padding: 10px 32px; + border-radius: 9999px; + } + + &.card { + background-color: $card_bg_color; + background-clip: padding-box; + font-weight: inherit; + padding: 0; + + @include focus-ring($offset: -1px, $transition: $button_transition); + + &:hover { + background-image: image($view_hover_color); + } + + &.keyboard-activating, + &:active { + background-image: image($view_active_color); + } + + &:checked { + background-color: $card_bg_color; + background-image: image($view_selected_color); + + &:hover { background-image: image($view_selected_hover_color); } + + &.keyboard-activating, + &:active { background-image: image($view_selected_active_color); } + + &.has-open-popup { background-image: image($view_selected_hover_color); } + + .osd & { + background-color: gtkalpha(currentColor, .1); + } + } + + &:drop(active) { + color: $drop_target_color; + box-shadow: inset 0 0 0 1px $drop_target_color; + } + } +} + +%undecorated_button { + background-color: transparent; +} + +button.color { + padding: 5px; + + > colorswatch:only-child { + border-radius: 2.5px; + + > overlay { + border-radius: 2px; + } + + &:disabled { + filter: none; + } + + &.light > overlay { + border-color: gtkalpha($view_fg_color, 0.1); + } + } +} + +menubutton { + &.osd { + background: none; + color: inherit; + + > button { @extend %osd_button; } + } + + &.circular > button { @extend %circular_button; } + &.flat > button { @extend %button_basic_flat; } + &.pill > button { @extend %pill_button; } + + &.suggested-action { + background-color: $accent_bg_color; + color: $accent_fg_color; + } + + &.destructive-action { + background-color: $destructive_bg_color; + color: $destructive_fg_color; + } + + &.opaque { + background-color: $opaque_button_default_bg; + color: $window_fg_color; + } + + &.suggested-action, + &.destructive-action, + &.opaque { + border-radius: $button_radius; + + &.circular, &.pill { + border-radius: $circular_radius; + } + + > button { + @extend %opaque_button; + + &, &:checked { + background-color: transparent; + color: inherit; + } + } + } + + &.image-button > button { + min-width: 24px; + padding-left: 5px; + padding-right: 5px; + } + + &.card > button { + border-radius: $card_radius; + } + + arrow { + min-height: 16px; + min-width: 16px; + &.none { + -gtk-icon-source: -gtk-icontheme('open-menu-symbolic'); + } + &.down { + -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); + } + &.up { + -gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); + } + &.left { + -gtk-icon-source: -gtk-icontheme('pan-start-symbolic'); + } + &.right { + -gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); + } + } +} + +splitbutton { + border-radius: $button_radius; + + &, & > separator { + transition: $button_transition; + transition-property: background; + } + + > separator { + margin-top: 6px; + margin-bottom: 6px; + background: none; + } + + > menubutton > button { + padding-left: 4px; + padding-right: 4px; + } + + // Since the inner button doesn't have any style classes on it, + // we have to add them manually + &.image-button > button { + min-width: 24px; + padding-left: 5px; + padding-right: 5px; + } + + &.text-button.image-button > button, + &.image-text-button > button { + padding-left: 9px; + padding-right: 9px; + + > box { + border-spacing: 6px; + } + } + + &:disabled { + filter: opacity($disabled_opacity); + + > button, > menubutton > button { + filter: none; + } + } + + // Reimplementing linked so we don't blow up css + > button:dir(ltr), + > menubutton > button:dir(rtl) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: -1px; + } + + > button:dir(rtl), + > menubutton > button:dir(ltr) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: -1px; + } + + @at-root %flat_split_button, + &.flat { + > separator { + background: $border_color; + } + + &:hover, + &:active, + &:checked { + background: $hover_color; + + > separator { + background: none; + } + } + + &:disabled { + filter: opacity($strong_disabled_opacity); + + > button:disabled, > menubutton > button:disabled { + filter: none; + } + } + + &:focus-within:focus-visible > separator { + background: none; + } + + > button, + > menubutton > button { + @extend %button_basic_flat; + + border-radius: $button_radius; + } + } + + &.suggested-action { + background-color: $accent_bg_color; + color: $accent_fg_color; + } + + &.destructive-action { + background-color: $destructive_bg_color; + color: $destructive_fg_color; + } + + &.opaque { + background-color: $opaque_button_default_bg; + color: $window_fg_color; + } + + &.suggested-action, + &.destructive-action, + &.opaque { + > button, > menubutton > button { + @extend %opaque_button; + + &, &:checked { + color: inherit; + background-color: transparent; + } + } + + $_separator_color: gtkalpha(currentColor, $dimmer_opacity); + + > menubutton > button { + &:dir(ltr) { box-shadow: inset 1px 0 $_separator_color; } + &:dir(rtl) { box-shadow: inset -1px 0 $_separator_color; } + } + } + + > menubutton > button > arrow.none { + -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); + } +} + +buttoncontent { + > box { + border-spacing: $base_padding; + + > label { + font-weight: bold; + + &:dir(ltr) { padding-right: 2px; } + &:dir(rtl) { padding-left: 2px; } + } + } + + .arrow-button > box > &, + splitbutton > button > & { + > box > label { + &:dir(ltr) { padding-right: 0; } + &:dir(rtl) { padding-left: 0; } + } + } +} + +tabbutton { + label { + font-weight: 800; + font-size: 8pt; + + &.small { + font-size: 6pt; + } + } + + indicatorbin > indicator, + indicatorbin > mask { + transform: translate(-1px, 1px); + } +} diff --git a/src/sass/libadwaita/widgets/_calendar.scss b/src/sass/libadwaita/widgets/_calendar.scss new file mode 100644 index 00000000..e2fdc04c --- /dev/null +++ b/src/sass/libadwaita/widgets/_calendar.scss @@ -0,0 +1,54 @@ +calendar { + color: $view_fg_color; + background-clip: padding-box; + border: 1px solid $border_color; + font-feature-settings: "tnum"; + + > header { + border-bottom: 1px solid $border_color; + + > button { + @extend %button_basic_flat; + border-radius: 0; + } + } + + > grid { + padding-left: 3px; + padding-bottom: 3px; + + > label.today { + box-shadow: inset 0px -2px $border_color; + + &:selected { + box-shadow: none; + } + } + + > label { + @include focus-ring($focus-state: ':focus'); + margin-top: 3px; + margin-right: 3px; + + &.day-number { + padding: 3px; + + &:checked { + border-radius: $button_radius; + background-color: gtkalpha($accent_bg_color, 0.3); + } + + &:selected { + border-radius: $button_radius; + + background-color: $accent_bg_color; + color: $accent_fg_color; + } + } + + &.day-number.other-month { + color: gtkalpha(currentColor, 0.3); + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_checks.scss b/src/sass/libadwaita/widgets/_checks.scss new file mode 100644 index 00000000..e0cadb24 --- /dev/null +++ b/src/sass/libadwaita/widgets/_checks.scss @@ -0,0 +1,90 @@ +checkbutton { + border-spacing: $base_padding / 2 + 1px; + border-radius: $button_radius + 3px; + padding: $base_padding / 2; + + @include focus-ring(); + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + &.text-button { + // this is for a nice focus on check and radios text + padding: $base_padding / 2 + 1px; + } +} + +check, +radio { + min-height: 20px; + min-width: 20px; + -gtk-icon-size: 20px; + padding: 0; + box-shadow: 0 0 0 6px transparent; + background-color: gtkalpha(currentColor, 0.12); + transition: $transition, + box-shadow $ripple-fade-out-duration / 2 $ease-out; + + &:not(:checked):not(:indeterminate) { + &:hover { + box-shadow: 0 0 0 6px gtkalpha(currentColor, 0.05); + background-color: gtkalpha(currentColor, 0.15); + } + + &:active { + box-shadow: 0 0 0 6px gtkalpha(currentColor, 0.12); + background-color: gtkalpha(currentColor, 0.20); + } + } + + &:checked, + &:indeterminate { + background-color: $accent_bg_color; + color: $accent_fg_color; + box-shadow: none; + + &:hover { background-image: image(gtkalpha(currentColor, 0.1)); } + &:active { background-image: image(gtkalpha(currentColor, 0.2)); } + } + + &:disabled { + filter: opacity($disabled_opacity); + } + + .osd & { + &:checked, + &:indeterminate { + background-color: $osd_fill_bg_color; + color: $osd_fill_fg_color; + } + } +} + +check { + border-radius: 100%; + + &:checked { -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/checkbox-checked-symbolic.svg")), -gtk-recolor(url("assets/checkbox-checked-symbolic@2.svg"))); } + &:indeterminate { -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/checkbox-mixed-symbolic.svg")), -gtk-recolor(url("assets/checkbox-mixed-symbolic@2.svg"))); } +} + +radio { + border-radius: 100%; + + &:checked { -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/radio-checked-symbolic.svg")), -gtk-recolor(url("assets/radio-checked-symbolic@2.svg"))); } + &:indeterminate { -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/radio-mixed-symbolic.svg")), -gtk-recolor(url("assets/radio-mixed-symbolic@2.svg"))); } +} + +checkbutton.selection-mode { + border-radius: $circular_radius; + + check, radio { + padding: $base_padding / 2; + border-radius: $circular_radius; + } + + label { + &:dir(ltr) { margin-right: $base_padding; } + &:dir(rtl) { margin-left: $base_padding; } + } +} diff --git a/src/sass/libadwaita/widgets/_color-chooser.scss b/src/sass/libadwaita/widgets/_color-chooser.scss new file mode 100644 index 00000000..514d33e8 --- /dev/null +++ b/src/sass/libadwaita/widgets/_color-chooser.scss @@ -0,0 +1,109 @@ +colorswatch { + // This widget is made of two boxes one on top of the other, the lower box is colorswatch {} the other one + // is colorswatch overlay {}, colorswatch has the programmatically set background, so most of the style is + // applied to the overlay box. + + @include focus-ring($width: 4px, $offset: -2px); + + // base color corners rounding + // to avoid the artifacts caused by rounded corner anti-aliasing the base color + // sports a bigger radius. + // nth-child is needed by the custom color strip. + + &.top { + border-top-left-radius: $button_radius + 0.5px; + border-top-right-radius: $button_radius + 0.5px; + + > overlay { + border-top-left-radius: $button_radius; + border-top-right-radius: $button_radius; + } + } + + &.bottom { + border-bottom-left-radius: $button_radius + 0.5px; + border-bottom-right-radius: $button_radius + 0.5px; + + > overlay { + border-bottom-left-radius: $button_radius; + border-bottom-right-radius: $button_radius; + } + } + + &.left, + &:first-child:not(.top) { + border-top-left-radius: $button_radius + 0.5px; + border-bottom-left-radius: $button_radius + 0.5px; + + > overlay { + border-top-left-radius: $button_radius; + border-bottom-left-radius: $button_radius; + } + } + + &.right, + &:last-child:not(.bottom) { + border-top-right-radius: $button_radius + 0.5px; + border-bottom-right-radius: $button_radius + 0.5px; + + > overlay { + border-top-right-radius: $button_radius; + border-bottom-right-radius: $button_radius; + } + } + + @if $contrast == 'high' { + > overlay { + box-shadow: inset 0 0 0 1px gtkalpha($view_fg_color, .5); + } + } + + &.dark > overlay { + color: white; + } + + &.light > overlay { + color: transparentize(black, .25); + + @if $contrast != 'high' { + box-shadow: inset 0 0 0 1px gtkalpha($view_fg_color, 0.1); + } + } + + &:drop(active) { + &.light > overlay { + box-shadow: inset 0 0 0 2px $drop_target_color; + } + + &.dark > overlay { + box-shadow: inset 0 0 0 2px $drop_target_color; + } + } + + &#add-color-button { + > overlay { + @extend %button_basic; + + border-radius: $button_radius 0 0 $button_radius; + } + + &:only-child > overlay { border-radius: $button_radius; } + } + + &:disabled { + filter: opacity($disabled_opacity); + } + + &#editor-color-sample { + border-radius: $button_radius; + + > overlay { border-radius: $button_radius + 0.5px; } + } +} + +plane { + @include focus-ring($offset: 2px, $outer: true); +} + +// colorscale popup +colorchooser .popover.osd { border-radius: $popover_radius; } diff --git a/src/sass/libadwaita/widgets/_column-view.scss b/src/sass/libadwaita/widgets/_column-view.scss new file mode 100644 index 00000000..486bd03a --- /dev/null +++ b/src/sass/libadwaita/widgets/_column-view.scss @@ -0,0 +1,112 @@ +columnview { + @include focus-ring(); + + &:drop(active) { + box-shadow: none; + } + + > header > button { + @extend %undecorated_button; + padding: $base_padding / 2 $base_padding; + border-radius: 0; + box-shadow: none; + line-height: 100%; + border-left: 1px solid $border_color; + + &:first-child { + border-left-width: 0; + } + + > box { + color: gtkalpha(currentColor, 0.4); + font-weight: 700; + font-size: 9pt; + border-spacing: $base_padding; + } + + &:hover > box { + color: gtkalpha(currentColor, 0.7); + box-shadow: none; + } + + &:active > box { + color: currentColor; + } + + sort-indicator { + &.ascending { + -gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); + } + &.descending { + -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); + } + + min-height: 16px; + min-width: 16px; + } + } + + button.dnd, + header.button.dnd { // for treeview-like derive widgets + &:active, &:selected, &:hover, & { + color: $accent_fg_color; + background-color: $accent_bg_color; + transition: none; + } + } + + // Remove the default background of the internal list view + // since we already apply a background to the column view + // with the .view class. Doing this will avoid overdraw. + &.view > listview.view { + background: none; + color: inherit; + } + + // move padding to child cells + > listview > row { + padding: 0; + + // align horizontal sizing with header buttons + > cell { + padding: 8px 6px; + + &:not(:first-child) { + border-left: 1px solid transparent; + } + } + } + + // make column separators visible when :show-column-separators is true + &.column-separators { + > listview > row > cell, + > header > button { + border-left-color: $border_color; + } + } + + > listview:not(.horizontal).separators > row:not(.separator) { + border-top: 1px solid $border_color; + border-bottom: none; + } + + // shrink vertically for .data-table + &.data-table > listview > row > cell { + padding-top: $base_padding / 2; + padding-bottom: $base_padding / 2; + } + + @include undershoot(top, $shade_color, true); +} + +columnview row:not(:selected) cell editablelabel:not(.editing):focus-within { + outline: 2px solid $focus_border_color; +} + +columnview row:not(:selected) cell editablelabel.editing:focus-within { + outline: 2px solid $accent_color; +} + +treeexpander { + border-spacing: $base_padding / 2 + 1px; +} diff --git a/src/sass/libadwaita/widgets/_deprecated.scss b/src/sass/libadwaita/widgets/_deprecated.scss new file mode 100644 index 00000000..0abf24b4 --- /dev/null +++ b/src/sass/libadwaita/widgets/_deprecated.scss @@ -0,0 +1,343 @@ +// The following styles are deprecated in GTK and should be removed for GTK 5.x + +// .linked > element child +$deprecated_linked_widgets: ("combobox", "> box > button.combo"), + ("appchooserbutton", "> combobox > box > button.combo"); + +/*********************** + * GtkAppChooserDialog * + ***********************/ + +window.appchooser { + headerbar.titlebar { + @extend .flat; + @extend %headerbar-shrunk; + + > windowhandle { + padding-top: 3px; + } + + box.start + box { + margin-top: -6px; + margin-bottom: -6px; + min-height: 12px; + } + } + + searchbar { + @extend %searchbar-flat; + + background: none; + } + + &.csd searchbar { + @extend %searchbar-shrunk; + } + + .dialog-vbox > box > box:not(.dialog-action-area) { + margin: 6px; + } + + .dialog-action-area { + margin-top: 0; + } +} + +/**************** + * GtkAssistant * + ****************/ + +window.assistant { + .sidebar { + padding: $menu-margin; + background-color: $sidebar_bg_color; + color: $sidebar_fg_color; + + &:not(separator) { + &:dir(ltr) { + border-right: none; + box-shadow: inset -1px 0 $border_color; + } + + &:dir(rtl) { + box-shadow: inset 1px 0 $border_color; + } + } + + &:backdrop { + background-color: $sidebar_backdrop_color; + transition: background-color $backdrop_transition; + } + + > label { + padding: 6px 12px; + border-radius: $menuitem_radius; + + &.highlight { + background-color: $selected_color; + } + } + } +} + +/*************** + * GtkComboBox * + ***************/ + +combobox { + @extend dropdown; + + // Since cell view is taller than a plain label, make sure + // the button doesn't get stretched with a larger font + button { + padding-top: 2px; + padding-bottom: 2px; + min-height: 30px; + } +} + +/*************** + * GtkIconView * + ***************/ + +iconview { + @extend %view; + + @if $contrast == 'high' { + &:selected { + box-shadow: inset 0 0 0 1px $border_color; + } + } + + @include focus-ring(); + + &:drop(active) { + box-shadow: none; + } + + > dndtarget:drop(active) { + border-style: solid; + border-width: 1px; + border-color: $drop_target_color; + } +} + +/************** + * GtkInfoBar * + **************/ + +infobar { + > revealer > box { + padding: 6px; + padding-bottom: 7px; + border-spacing: 6px; + box-shadow: inset 0 -1px $border_color; + + > box { + border-spacing: 6px; + } + } + + &.action:hover > revealer > box { + background-image: image(gtkalpha(currentColor, .05)); + } + + &.action:active > revealer > box { + background-image: image(gtkalpha(currentColor, .1)); + } + + @each $i_type, $i_color in (info, $accent_bg_color), + (question, $accent_bg_color), + (warning, $warning_bg_color), + (error, $error_bg_color) { + &.#{$i_type} > revealer > box { + background-color: gtkmix($i_color, $window_bg_color, 30%); + color: $window_fg_color; + } + } + + .close { + min-width: 18px; + min-height: 18px; + padding: 4px; + border-radius: 50%; + @extend %button_basic_flat; + } +} + +/**************** + * GtkStatusBar * + ****************/ + +statusbar { + padding: 6px 10px 6px 10px; +} + +/*************** + * GtkTreeView * + ***************/ + +// To be used for opaque elements overlaid atop the selected row +$treeview_selection_opaque: gtkmix(currentColor, $view_bg_color, 10%); +$treeview_borders_opaque: gtkmix(currentColor, $view_bg_color, if($contrast == 'high', 40%, 20%)); + +treeview.view { + @extend columnview; + + border-left-color: $treeview_borders_opaque; // this is actually the tree lines color, + border-top-color: $treeview_borders_opaque; // while this is the grid lines color, better then nothing + + &:selected { + &:focus, & { + border-radius: 0; + } + } + + &.separator { + min-height: 2px; + color: $border_color; + } + + &.expander { + // GtkTreeView uses the larger of the expander’s min-width and min-height + min-width: 16px; + min-height: 16px; + -gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); + + &:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); } + + color: gtkalpha(currentColor, .7); + + &:hover, &:active { color: currentColor; } + + &:checked { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } + + &:disabled { color: gtkalpha(currentColor, $disabled_opacity); } + } + + > dndtarget:drop(active) { + border-style: solid none; + border-width: 1px; + border-color: $drop_target_color; + + &.after { border-top-style: none; } + + &.before { border-bottom-style: none; } + } + + > header > button { + padding-left: 4px; + padding-right: 4px; + border-bottom: 1px solid $border_color; + } + + &.progressbar { // progress bar in treeviews + &, &:selected { + background-color: $accent_bg_color; + color: $accent_fg_color; + } + + box-shadow: none; + } + + &.trough { // progress bar trough in treeviews + background-color: gtkalpha(currentColor, 0.1); + } + + ~ undershoot.top { + box-shadow: none; + background: none; + } + + acceleditor > label { + // see tests/testaccel in GTK to test + background-color: $treeview_selection_opaque; + } +} + +treeview.navigation-sidebar { + padding: 0; + + &:selected { + &:focus, & { + background-color: $selected_color; + } + } +} + +treeview entry { + &:focus-within { + &:dir(rtl), &:dir(ltr) { // specificity bump hack + background-color: $view_bg_color; + transition-property: color, background; + } + } + + &.flat, & { + border-radius: 0; + background-image: none; + background-color: $view_bg_color; + + &:focus-within { border-color: $accent_color; } + } +} + +treeview spinbutton:not(.vertical) { + min-height: 0; + border-style: none; + border-radius: 0; + + > text { + min-height: 0; + padding: 1px 2px; + } +} + +// The following styles are deprecated in libadwaita and should be removed in 2.x + +// Deprecated: use .boxed-list instead +list.content { + @extend .boxed-list; +} + +// Deprecated: use .navigation-sidebar instead +.sidebar { + &:not(separator) { + &:dir(ltr), + &.left, + &.left:dir(rtl) { + border-right: 1px solid $border_color; + border-left-style: none; + } + + &:dir(rtl), + &.right { + border-left: 1px solid $border_color; + border-right-style: none; + } + } + + listview.view, + list { + background-color: transparent; + color: inherit; + } + + paned &, + .sidebar-pane & { + &.left, &.right, + &.left:dir(rtl), + &:dir(rtl), &:dir(ltr), & { border-style: none; }} +} + +// Deprecated: use .title-1 +.large-title { + font-weight: 300; + font-size: 24pt; +} + +// Deprecated: use AdwToolbarView + +headerbar.flat { + @extend %headerbar-flat; +} diff --git a/src/sass/libadwaita/widgets/_dialogs.scss b/src/sass/libadwaita/widgets/_dialogs.scss new file mode 100644 index 00000000..0a1cb7d9 --- /dev/null +++ b/src/sass/libadwaita/widgets/_dialogs.scss @@ -0,0 +1,125 @@ +.dialog-action-area { + margin: $base_padding; + border-spacing: $base_padding; +} + +/**************** + * Print dialog * +*****************/ + +window.print { + drawing { + color: $window_fg_color; + background: none; + border: none; + padding: 0; + + paper { + background-color: white; + color: transparentize(black, .2); + background-clip: padding-box; + border: 1px solid $border_color; + } + } + + headerbar.titlebar { + @extend .flat; + } + + .dialog-action-box { + @extend .view; + } +} + +/******************** + * Page setup dalog * + ********************/ + +window.pagesetup { + headerbar.titlebar { + @extend .flat; + } +} + +/****************** + * GtkAboutDialog * + ******************/ + +window.aboutdialog { + headerbar.titlebar { + @extend .flat; + } + + image.large-icons { + -gtk-icon-size: 128px; + } +} + +/************************* + * GtkColorChooserDialog * + *************************/ +window.colorchooser { + headerbar.titlebar { + @extend .flat; + } +} + +/************* + * AdwDialog * + *************/ + +floating-sheet { + > dimming { + background-color: gtkalpha($shade_color, 2); + } + + > sheet { + border-radius: $window_radius; + box-shadow: 0 2px 8px 2px transparentize(black, 0.93), + 0 3px 20px 10px transparentize(black, 0.95), + 0 6px 32px 16px transparentize(black, 0.98), + 0 0 0 1px $shade_color; + outline: 1px solid $window_outline_color; + outline-offset: -1px; + } +} + +dialog.bottom-sheet { + &.landscape sheet { + margin-left: 30px; + margin-right: 30px; + + > outline { + &.flush-left, &.flush-right, &.flush-left.flush-right { + box-shadow: inset 1px 0 $window_outline_color, + inset -1px 0 $window_outline_color, + inset 0 1px $window_outline_color; + } + } + } +} + +dialog-host > dialog.background { + background: none; + + sheet { + background-color: $window_bg_color; + color: $window_fg_color; + } +} + +dialog-host > dialog.view { + background: none; + + sheet { + @extend %view; + } +} + +dialog-host > dialog.osd { + background: none; + + sheet { + @extend %osd; + } +} diff --git a/src/sass/libadwaita/widgets/_dropdowns.scss b/src/sass/libadwaita/widgets/_dropdowns.scss new file mode 100644 index 00000000..efdb07b7 --- /dev/null +++ b/src/sass/libadwaita/widgets/_dropdowns.scss @@ -0,0 +1,38 @@ +dropdown { + > button > box { + border-spacing: 6px; + + > stack > row.activatable { + &:hover, &:active { background: none; } + } + } + + arrow { + -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); + min-height: 16px; + min-width: 16px; + } + + &:drop(active) { // FIXME: untested + box-shadow: none; + + button.combo { @extend %button_basic_drop_active; } + } + + popover.menu { + padding-top: 6px; + + listview > row { + min-width: 0; + } + + // dropdowns with searchboxes on top + .dropdown-searchbar { + padding: 6px; + + + scrolledwindow { + @include undershoot(top, $popover_shade_color); + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_emoji-chooser.scss b/src/sass/libadwaita/widgets/_emoji-chooser.scss new file mode 100644 index 00000000..4718ac29 --- /dev/null +++ b/src/sass/libadwaita/widgets/_emoji-chooser.scss @@ -0,0 +1,91 @@ +popover.emoji-picker > contents { + padding: 0; +} + +.emoji-searchbar { + padding: 6px; +} + +.emoji-toolbar { + // flowbox children already have 3px padding, so we only need 3px more to + // get the regular 6px. We also don't need spacing, for the same reason. + padding: 3px; +} + +button.emoji-section.image-button:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + @extend %circular_button; + @extend %button_basic_flat; + + min-width: 32px; + min-height: 32px; +} + +popover.emoji-picker emoji { + font-size: x-large; + padding: 6px; + border-radius: $button_radius; + + &:focus, + &:hover { + background: $hover_color; + } + + &:active { + background: $active_color; + } + + @if $contrast == 'high' { + &:focus, + &:hover, + &:active { + box-shadow: inset 0 0 0 1px $border_color; + } + } +} + +popover.emoji-picker scrolledwindow.view { + background: none; + color: inherit; + + @include undershoot(top, $popover_shade_color); + @include undershoot(bottom, $popover_shade_color); +} + +// Emoji completion popover + +popover.emoji-completion > contents { + padding: $menu_margin; + padding-bottom: $menu_margin - 2px; +} + +emoji-completion-row { + // emoji extends quite a bit into the padding, so we can't use the same padding on all sides + padding: $menu_padding - 6px; + margin-bottom: 2px; + border-radius: $menuitem_radius; + + &:dir(ltr) { padding-right: $menu_padding; } + &:dir(rtl) { padding-left: $menu_padding; } + + > box { + border-spacing: $menu_padding - 6px; + } + + &:focus, + &:hover { + background-color: $selected_color; + color: $popover_fg_color; + } + + &:active { + background-color: $active_color; // matching buttons + } + + @if $contrast == 'high' { + &:focus, + &:hover, + &:active { + box-shadow: inset 0 0 0 1px $border_color; + } + } +} diff --git a/src/sass/libadwaita/widgets/_entries.scss b/src/sass/libadwaita/widgets/_entries.scss new file mode 100644 index 00000000..c7e47f1c --- /dev/null +++ b/src/sass/libadwaita/widgets/_entries.scss @@ -0,0 +1,103 @@ +%entry, +entry { + %entry_basic, & { + min-height: $medium_size; + padding-left: $base_padding * 1.5; + padding-right: $base_padding * 1.5; + border-radius: $button_radius; + border-spacing: $base_padding; + background-color: $button_color; + background-clip: padding-box; + caret-color: currentColor; + + @include focus-ring($focus-state: ':focus-within'); + + .osd &:focus-within { + outline-color: $osd_focus_color; + } + + > text { + > placeholder { + @extend .dim-label; + } + + > block-cursor { + color: $view_bg_color; + background-color: $view_fg_color; + } + } + + &.flat { + &:focus-within, &:disabled, & { + min-height: 0; + padding: 2px; + background-color: transparent; + box-shadow: none; + border-radius: 0; + } + } + + &:disabled { filter: opacity($disabled_opacity); } + + // entry error and warning style + @each $e_type, $e_color in (error, $error_color), + (warning, $warning_color), + (success, $success_color) { + &.#{$e_type} { + @include focus-ring($focus-state: ':focus-within', $fc: gtkalpha(currentColor, $focus_border_opacity)); + + > text { + > selection:focus-within { background-color: gtkalpha($e_color, .2); } + + > cursor-handle > contents { background-color: currentColor; } + } + + > progress > trough > progress { + border-color: currentColor; + } + } + } + + > image { // icons inside the entry + opacity: if($contrast == 'high', .85, .7); + + &:hover { opacity: 1; } + + &:active { + opacity: if($contrast == 'high', .9, .8); + } + + &.left { margin-right: 6px; } + &.right { margin-left: 6px; } + } + + &.password image.caps-lock-indicator { + opacity: $dimmer_opacity; + } + + &:drop(active) { + &:focus-within, & { + border-color: $drop_target_color; + box-shadow: inset 0 0 0 1px $drop_target_color; + } + } + } + + > progress { + margin-bottom: 3px; + + > trough > progress { + background-color: transparent; + background-image: none; + border-radius: 0; + border-width: 0 0 2px; + border-color: $accent_bg_color; + border-style: solid; + box-shadow: none; + } + } + + .osd & > progress > trough > progress { + border-color: $osd_fill_bg_color; + } +} diff --git a/src/sass/libadwaita/widgets/_expanders.scss b/src/sass/libadwaita/widgets/_expanders.scss new file mode 100644 index 00000000..77de60c7 --- /dev/null +++ b/src/sass/libadwaita/widgets/_expanders.scss @@ -0,0 +1,27 @@ +expander { + min-width: 16px; + min-height: 16px; + -gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); + &:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); } + + &:disabled { filter: opacity($disabled_opacity); } + + &:checked { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } +} + +expander-widget { + @include focus-ring("> box > title"); + + > box > title { + border-radius: $button_radius; + + > expander { + opacity: .7; + } + + &:hover > expander, + &:active > expander { + opacity: 1; + } + } +} diff --git a/src/sass/libadwaita/widgets/_file-chooser.scss b/src/sass/libadwaita/widgets/_file-chooser.scss new file mode 100644 index 00000000..cc5aa65e --- /dev/null +++ b/src/sass/libadwaita/widgets/_file-chooser.scss @@ -0,0 +1,229 @@ +placessidebar { + .navigation-sidebar > row { + // Needs overriding of the `.navigation-sidebar > row` padding + padding: 0; + + // Using margins/padding directly in the SidebarRow + // will make the animation of the new bookmark row jump + > revealer { padding: 0 14px; } + + image.sidebar-icon { + &:dir(ltr) { padding-right: 8px; } + &:dir(rtl) { padding-left: 8px; } + } + + label.sidebar-label { + &:dir(ltr) { padding-right: 2px; } + &:dir(rtl) { padding-left: 2px; } + } + + @at-root button.sidebar-button { + @extend %button_basic_flat; + + min-height: 26px; + min-width: 26px; + margin-top: $base_padding / 2; + margin-bottom: $base_padding / 2; + padding: 0; + border-radius: 100%; + } + + // in the sidebar case it makes no sense to click the selected row + &:selected:active { box-shadow: none; } + + &.sidebar-placeholder-row { + padding: 0 8px; + min-height: 2px; + background-image: image($drop_target_color); + background-clip: content-box; + } + + &.sidebar-new-bookmark-row { color: $accent_color; } + + &:drop(active):not(:disabled) { + color: $drop_target_color; + box-shadow: inset 0 0 0 1px $drop_target_color; + } + } +} + +row { + image.sidebar-icon { + opacity: 0.7; // see bug #786613 for details on this oddity + } + + .sidebar-button { + opacity: 0.7; + + &:hover, + &:active, + &.keyboard-activating { + opacity: 1; + } + } +} + +placesview { + .server-list-button > image { + transition: -gtk-icon-transform 200ms $ease-out-quad; + -gtk-icon-transform: rotate(0turn); + } + + .server-list-button:checked > image { + -gtk-icon-transform: rotate(-0.5turn); + } + + > actionbar > revealer > box > box { + border-spacing: $base_padding; + } +} + +filechooser { + box-shadow: 0 1px $border_color; + + // Make the toolbar buttons flat like on an actual toolbar + #pathbarbox > stack > box > { + button, + box > button, + menubutton > button { + @extend %button_basic_flat; + } + } + + pathbar button { + &:not(.image-button) { + padding-left: $base_padding * 1.5; + padding-right: $base_padding * 1.5; + } + + // Icon + label buttons + > box { + border-spacing: 4px; + + > label { + padding-left: 2px; + padding-right: 2px; + } + } + } + + columnview > listview > row > cell { + padding: 0; + + > filelistcell { + padding: 8px $base_padding; + } + } + + gridview { + @include undershoot(top, $shade_color, true); + padding: $base_padding * 2.5; + + > child { + border-radius: $card_radius; + padding: 0; + margin: $base_padding / 2; + + > filelistcell { + padding: $base_padding $base_padding * 2; + } + + & filethumbnail image { + filter: drop-shadow(0px 1px 1px rgba(0,0,0,0.3)); + } + + & box { + border-spacing: $base_padding; + } + } + } + + // Style the outer action bar with a toolbar view-like shadow + > box > actionbar { + box-shadow: 0 -1px $border_color; + + > revealer > box { + box-shadow: none; + padding-top: $base_padding; + } + } + + // Style the remote search action bar like a banner + scrolledwindow + actionbar > revealer > box { + background-color: gtkmix($accent_bg_color, $view_bg_color, 30%); + color: $window_fg_color; + box-shadow: none; + padding-top: $base_padding; + font-weight: bold; + + &:backdrop { + background-color: gtkmix($accent_bg_color, $view_bg_color, 15%); + } + } + + placesview { + // Only the bottom undershoot, since the action bar is guaranteed to be + // there, while the search bar can show and hide. That's a problem, since + // we only need top undershoot when it's visible, to avoid a double shadow. + > stack > scrolledwindow { + @include undershoot(bottom); + } + + // Make the Connect to Server action bar flat + > actionbar > revealer > box { + background: $view_bg_color; + color: $view_fg_color; + box-shadow: none; + padding-top: $base_padding; + + &:backdrop { + background: $view_bg_color; + transition: none; + } + } + } + + placessidebar { + background-color: $sidebar_bg_color; + color: $sidebar_fg_color; + + &:backdrop { + background-color: $sidebar_backdrop_color; + transition: background-color $backdrop_transition; + } + } + + // The separator is a part of GtkPaned, so it needs to be styled separately + paned.horizontal > separator { + &:dir(ltr) { + box-shadow: inset 1px 0 $sidebar_bg_color, + inset 1px 0 $border_color; + + &:backdrop { + box-shadow: inset 1px 0 $sidebar_backdrop_color, + inset 1px 0 $border_color; + } + } + + &:dir(rtl) { + box-shadow: inset -1px 0 $sidebar_bg_color, + inset -1px 0 $border_color; + + &:backdrop { + box-shadow: inset -1px 0 $sidebar_backdrop_color, + inset -1px 0 $border_color; + } + } + + &:backdrop { + transition: box-shadow $backdrop_transition; + } + } +} + +/* Fix header bar height in the file chooser */ +window.filechooser headerbar box.start + box.vertical { + margin-top: -$base_padding; + margin-bottom: -$base_padding; + min-height: 12px; +} diff --git a/src/sass/libadwaita/widgets/_header-bar.scss b/src/sass/libadwaita/widgets/_header-bar.scss new file mode 100644 index 00000000..a7db42c2 --- /dev/null +++ b/src/sass/libadwaita/widgets/_header-bar.scss @@ -0,0 +1,336 @@ +headerbar { + min-height: $large_size; + background-color: $headerbar_backdrop_color; + color: $headerbar_fg_color; + box-shadow: inset 0 -1px $headerbar_border_color; + margin: 0 -1px; + @extend %toolbar; + + > windowhandle > box { + padding: $base_padding $base_padding + 1px; + + > box.start, + > box.end { + border-spacing: $base_padding; + } + + &, > widget { + > box.start:dir(ltr), + > box.end:dir(rtl) { + margin-right: $base_padding; + } + + > box.start:dir(rtl), + > box.end:dir(ltr) { + margin-left: $base_padding; + } + } + } + + &:backdrop { + background-color: $headerbar_bg_color; + transition: background-color $backdrop_transition; + + > windowhandle { + // opacity looks weird with GtkSwitch, but filter works fine + filter: opacity(0.5); + + transition: filter $backdrop_transition; + } + } + + &.default-decoration { + padding: 0; + margin: 0; + box-shadow: none; + border: none; + min-height: $medium_size; + + > windowhandle > box { + padding: $base_padding / 2; + } + + windowcontrols { + > button { + @if $window_button == 'mac' { + min-width: 16px; + min-height: 16px; + margin: 0 $base_padding - 2px; + padding: 0; + } @else { + min-width: 22px; + min-height: 22px; + margin: 0 $base_padding - 2px; + padding: 0; + } + } + + > .icon { + margin: $base_padding; + } + } + } +} + +window > { + .titlebar:not(.flat) { + box-shadow: inset 0 -1px $headerbar_border_color; + } + + .titlebar headerbar:not(.flat) { + box-shadow: inset 0 -1px $headerbar_border_color; + } + + headerbar.titlebar, + .titlebar headerbar { + min-height: $large_size; + + > windowhandle > box { + padding-bottom: $base_padding; + } + + &.default-decoration { + min-height: $medium_size; + + > windowhandle > box { + padding: $base_padding / 2; + } + } + } +} + +%headerbar-flat { + background: none; + box-shadow: none; + color: inherit; + min-height: $large_size; + + > windowhandle > box { + padding-bottom: $base_padding; + } + + &.default-decoration { + min-height: $medium_size; + + > windowhandle > box { + padding: $base_padding / 2; + } + } +} + +%headerbar-inline { + @extend %headerbar-flat; + + &:backdrop { + transition: none; + + > windowhandle { + filter: none; + transition: none; + } + } + + window.devel & > windowhandle { + background-image: none; + } +} + +%headerbar-shrunk { + min-height: $large_size - $base_padding; + + > windowhandle > box { + padding-top: $base_padding / 2; + padding-bottom: $base_padding / 2; + } + + &.default-decoration { + min-height: $medium_size; + + > windowhandle > box { + padding-top: 0px; + padding-bottom: 0px; + } + } +} + +.titlebar:not(headerbar) { + separator { background-color: $headerbar_border_color; } +} + +/********************* + * GtkWindowControls * + *********************/ + +$titlebutton_min: $button-min; +$titlebutton_max: $button-max; +$titlebutton_close: $button-close; + +%mac_window_button { + min-height: 16px; + min-width: 16px; + padding: ($medium_size - 16px) / 2 0; + margin-left: $base_padding - 2px; + margin-right: $base_padding - 2px; + box-shadow: none; + + &.minimize, &.maximize, &.close { + color: transparent; + background: none; + + &:hover, &:active { + box-shadow: none; + } + + &:active > image { + background-color: gtkalpha(black, if($topbar == 'dark', 0.25, 0.12)); + } + + &:hover, &:active { + color: if($colorscheme != 'dracula', white, rgba(black, 0.5)); + } + + &:backdrop { + > image { background-color: gtkalpha($headerbar_fg_color, 0.3); } + + &:hover, &:active { + color: gtkalpha($headerbar_fg_color, 0.45); + } + } + } + + &.minimize { // Window minimize button + > image { background-color: $titlebutton_min; } + + &:active > image { + background-color: gtkmix($headerbar_fg_color, $titlebutton_min, 25%); + } + } + + &.maximize { // Window maximize button + > image { background-color: $titlebutton_max; } + + &:active > image { + background-color: gtkmix($headerbar_fg_color, $titlebutton_max, 25%); + } + } + + &.close { // Window close button + > image { background-color: $titlebutton_close; } + + &:active > image { + background-color: gtkmix($headerbar_fg_color, $titlebutton_close, 25%); + } + } +} + +%normal_window_button { + min-height: 22px; + min-width: 22px; + padding: ($medium-size - 22px) / 2 0; + margin-left: $base_padding - 2px; + margin-right: $base_padding - 2px; + + &.minimize, &.maximize, &.close { + color: gtkalpha($headerbar_fg_color, 0.75); + + &, &:hover, &:active, &:backdrop { + background: none; + box-shadow: none; + } + + > image { background-color: gtkalpha(currentColor, 0.1); } + + &:hover { + color: $headerbar_fg_color; + + > image { background-color: gtkalpha(currentColor, 0.15); } + } + + &:active { + color: $headerbar_fg_color; + + > image { background-color: gtkalpha(currentColor, 0.2); } + } + + &:backdrop { + opacity: 0.65; + } + } +} + +windowcontrols { + border-spacing: $base_padding; + + &:not(.empty) { + &.start:dir(ltr), + &.end:dir(rtl) { + margin-right: $base_padding; + margin-left: $base_padding; + } + + &.start:dir(rtl), + &.end:dir(ltr) { + margin-left: $base_padding; + margin-right: $base_padding; + } + } + + > button { + @if $window_button == 'mac' { + @extend %mac_window_button; + } @else { + @extend %normal_window_button; + } + + > image { + padding: 0; + border-radius: 100%; + transition: $button_transition; + } + } + + > .icon { + margin: 9px; + } +} + +/****************** + * AdwWindowTitle * + ******************/ + +headerbar, +windowtitle { + .title { + padding-left: 12px; + padding-right: 12px; + font-weight: bold; + } + + .subtitle { + font-size: smaller; + padding-left: 12px; + padding-right: 12px; + @extend .dim-label; + } +} + +windowtitle { + margin-top: -6px; + margin-bottom: -6px; + min-height: 12px; +} + +// Development versions of apps to use a differently styled headerbar + +window.devel { + headerbar > windowhandle { + background-image: cross-fade(5% -gtk-recolor(url("assets/devel-symbolic.svg")), + image(transparent)); + background-repeat: repeat-x; + } + + dialog headerbar > windowhandle { + background-image: unset; + background-repeat: unset; + } +} diff --git a/src/sass/libadwaita/widgets/_labels.scss b/src/sass/libadwaita/widgets/_labels.scss new file mode 100644 index 00000000..10f3a187 --- /dev/null +++ b/src/sass/libadwaita/widgets/_labels.scss @@ -0,0 +1,92 @@ +label { + caret-color: currentColor; + + &.separator { + @extend .dim-label; + } + + &:disabled { + filter: opacity($disabled_opacity); + } +} + +.dim-label { + opacity: $dim_label_opacity; +} + +.accent { + color: $accent_color; +} + +.success { + color: $success_color; +} + +.warning { + color: $warning_color; +} + +.error { + color: $error_color; +} + +/********************** + * General Typography * + **********************/ + +.title-1 { + font-weight: 800; + font-size: 20pt; +} + +.title-2 { + font-weight: 800; + font-size: 15pt; +} + +.title-3 { + font-weight: 700; + font-size: 15pt; +} + +.title-4 { + font-weight: 700; + font-size: 13pt; +} + +.heading { + font-weight: 700; + font-size: 11pt; +} + +.body { + font-weight: 400; + font-size: 11pt; +} + +.caption-heading { + font-weight: 700; + font-size: 9pt; +} + +.caption { + font-weight: 400; + font-size: 9pt; +} + +.monospace { + font-family: monospace; +} + +.numeric { + font-feature-settings: "tnum"; +} + +/******************* + * Editable Labels * + *******************/ + +editablelabel > stack > text { + color: $view_fg_color; + background-color: $view_bg_color; +} diff --git a/src/sass/libadwaita/widgets/_level-bar.scss b/src/sass/libadwaita/widgets/_level-bar.scss new file mode 100644 index 00000000..bf75593d --- /dev/null +++ b/src/sass/libadwaita/widgets/_level-bar.scss @@ -0,0 +1,100 @@ +$_levelbar_size: 8px; +$_levelbar_border_radius: 99px; + +levelbar { + &:disabled { + filter: opacity($disabled_opacity); + } + + &.horizontal { + trough > block { + min-height: $_levelbar_size; + border-radius: $_levelbar_border_radius; + + &.empty, + &.full { + border-radius: $_levelbar_border_radius; + } + } + + // segmented level bar + &.discrete > trough > block { + min-height: $_levelbar_size; + margin-right: 2px; + min-width: 26px; + border-radius: 0; + + &:first-child { + border-radius: $_levelbar_border_radius 0 0 $_levelbar_border_radius; + } + + &:last-child { + border-radius: 0 $_levelbar_border_radius $_levelbar_border_radius 0; + margin-right: 0; + } + } + } + + &.vertical { + trough > block { + min-width: $_levelbar_size; + border-radius: $_levelbar_border_radius; + + &.empty, + &.full { + border-radius: $_levelbar_border_radius; + } + } + + // segmented level bar + &.discrete > trough > block { + min-width: $_levelbar_size; + margin-bottom: 2px; + min-height: 26px; + border-radius: 0; + + &:first-child { + border-radius: $_levelbar_border_radius $_levelbar_border_radius 0 0; + } + + &:last-child { + border-radius: 0 0 $_levelbar_border_radius $_levelbar_border_radius; + margin-bottom: 0; + } + } + } + + > trough { + padding: 0; + + // level bar colours + > block { + &.low { + background-color: $warning_bg_color; + } + + &.high, + &:not(.empty) { + background-color: $fill_color; + } + + &.full { + background-color: $success_bg_color; + } + + &.empty { + background-color: $trough_color; + + @if $contrast == "high" { + box-shadow: inset 0 0 0 1px $border_color; + } + } + } + } + + .osd & > trough > block { + &.high, &:not(.empty) { + background-color: $osd_fill_bg_color; + } + } +} diff --git a/src/sass/libadwaita/widgets/_linked.scss b/src/sass/libadwaita/widgets/_linked.scss new file mode 100644 index 00000000..90e71884 --- /dev/null +++ b/src/sass/libadwaita/widgets/_linked.scss @@ -0,0 +1,46 @@ +// .linked > element child +$_linked_widgets: ("%button", ""), + ("button", ""), + ("menubutton", "> button"), + ("dropdown", "> button"), + ("colorbutton", "> button"), + ("fontbutton", "> button"), + ("tabbutton", "> button"), + ("%entry", ""), + ("entry", ""); + +$_linked_widgets: join($_linked_widgets, $deprecated_linked_widgets); + +@each $widget, $child in $_linked_widgets { + .linked:not(.vertical) > { + #{$widget} { + &:dir(ltr):not(:first-child) #{$child}, + &:dir(rtl):not(:last-child) #{$child} { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: -1px; + } + + &:dir(ltr):not(:last-child) #{$child}, + &:dir(rtl):not(:first-child) #{$child} { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + } + + .linked.vertical { + #{$widget} { + &:not(:first-child) #{$child} { + border-top-left-radius: 0; + border-top-right-radius: 0; + margin-top: -1px; + } + + &:not(:last-child) #{$child} { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_links.scss b/src/sass/libadwaita/widgets/_links.scss new file mode 100644 index 00000000..3377f266 --- /dev/null +++ b/src/sass/libadwaita/widgets/_links.scss @@ -0,0 +1,53 @@ +link, +button.link { + color: $link_color; + text-decoration: underline; + font-weight: inherit; + + &:visited { + color: $link_visited_color; + } + + &:hover { + color: gtkshade($link_color, 1.1); + } + + &:active { + color: $link_color; + } + + &:disabled { color: gtkalpha(currentColor, $disabled_opacity); } + + .osd & { + color: $osd_link_color; + + &:visited { + color: $osd_link_visited_color; + } + + &:active { + color: $osd_link_color; + } + } +} + +link { + @include focus-ring(); + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } +} + +button.link { + &, + &:hover, + &:active, + &:checked { + @extend %undecorated_button; + } + + > label { + text-decoration: underline; + } +} diff --git a/src/sass/libadwaita/widgets/_lists.scss b/src/sass/libadwaita/widgets/_lists.scss new file mode 100644 index 00000000..3f63a116 --- /dev/null +++ b/src/sass/libadwaita/widgets/_lists.scss @@ -0,0 +1,576 @@ +$row_transition: background-color 200ms $ease-out-quad, + background-image 200ms $ease-out-quad, + border-radius 200ms $ease-out-quad; + +listview, +list { + color: $view_fg_color; + background-color: $view_bg_color; + background-clip: padding-box; + border-color: $border_color; + + > row { + padding: $base_padding / 2; + background-clip: padding-box; + } + + > row.expander { padding: 0px; } + > row.expander .row-header { padding: $base_padding / 2; } + + &.horizontal row.separator, + &.separators.horizontal > row:not(.separator) { + border-left: 1px solid $border_color; + } + + &:not(.horizontal) row.separator, + &.separators:not(.horizontal) > row:not(.separator) { + border-bottom: 1px solid $border_color; + } +} + +list.frame { border-radius: $button_radius; } + +listview > header { + @extend .heading; + padding: $base_padding / 2; + padding-top: $base_padding * 3; + padding-bottom: $base_padding; +} + +row { + @include focus-ring(); + + .osd & { + &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + &.activatable { + &:hover { background-color: $hover_color; } + + &:active { background-color: $active_color; } + + // this is for indicathing which row generated a popover see https://bugzilla.gnome.org/show_bug.cgi?id=754411 + &.has-open-popup { background-color: $hover_color; } + + &:selected { + &:hover { background-color: $selected_hover_color; } + + &:active { background-color: $selected_active_color; } + + &.has-open-popup { background-color: $selected_hover_color; } + } + } + + &:selected { + background-color: $selected_color; + } + } + + background-clip: padding-box; + + &.activatable { + transition: $transition, + background-size $ripple_fade_out_duration $ease_out, + background-image $ripple_fade_out_opacity_duration $ease_out, + font-weight 0; + box-shadow: none; + background-color: transparent; + background-image: radial-gradient(circle, transparent 10%, transparent 0%); + background-repeat: no-repeat; + background-position: center; + background-size: 1000% 1000%; + + &:hover { background-color: $view_hover_color; } + + &:active { + transition: $transition, + background-size 0ms, + background-image 0ms, + font-weight 0ms; + animation: ripple $ripple_fade_in_duration $ease_out forwards; + background-image: radial-gradient(circle, $view_hover_color 10%, transparent 0%); + background-size: 0% 0%; + background-color: $view_hover_color; + box-shadow: none; + } + + // this is for indicathing which row generated a popover see https://bugzilla.gnome.org/show_bug.cgi?id=754411 + &.has-open-popup { background-color: $view_hover_color; } + + &:selected { + &:hover { background-color: $view_selected_hover_color; } + + &:active { background-color: $view_selected_active_color; } + + &.has-open-popup { background-color: $view_selected_hover_color; } + } + } + + &:selected { + background-color: $view_selected_color; + } +} + +/******************************************************* + * Rich Lists * + * Large list usually containing lots of widgets * + * https://gitlab.gnome.org/GNOME/gtk/-/issues/3073 * + *******************************************************/ + +.rich-list { /* rich lists usually containing other widgets than just labels/text */ + > row { + padding: $base_padding + 2px $base_padding * 2; + min-height: 32px; /* should be tall even when only containing a label */ + + > box { + border-spacing: 12px; + } + } + + > header { + padding-left: 12px; + padding-right: 12px; + } +} + +/**************** + * AdwActionRow * + ****************/ + +row { + label.subtitle { + font-size: smaller; + @extend .dim-label; + } + + > box.header { + margin-left: 12px; + margin-right: 12px; + border-spacing: 6px; + min-height: 50px; + + > .icon:disabled { + filter: opacity($disabled_opacity); + } + + > box.title { + margin-top: 6px; + margin-bottom: 6px; + border-spacing: 3px; + padding: 0; + + // Specificity bump for header bar + &, + > .title, + > .subtitle { + padding: 0; + font-weight: inherit; + } + } + + > .prefixes, + > .suffixes { + border-spacing: 6px; + } + + > .icon, + > .prefixes { + &:dir(ltr) { margin-right: 6px; } + &:dir(rtl) { margin-left: 6px; } + } + } + + &.property > box.header > box.title > { + .title { + font-size: smaller; + @extend .dim-label; + } + + .subtitle { + font-size: inherit; + opacity: 1; + } + } +} + +/****************************** + * AdwEntryRow and AdwSpinRow * + ******************************/ + +row.entry { + &:disabled { + text { + opacity: $disabled_opacity; + } + + .dim-label, .subtitle { + opacity: 1; + } + } + + .edit-icon, .indicator { + min-width: 24px; + min-height: 24px; + padding: 5px; + } + + .edit-icon:disabled { + opacity: $strong_disabled_opacity; + } + + .indicator { + opacity: $dimmer_opacity; + } + + &.monospace { + font-family: inherit; + + text { + font-family: monospace; + } + } +} + +row.spin { + spinbutton { + background: none; + border-spacing: 6px; + box-shadow: none; + + &, &:focus { + outline: none; + } + + > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, + > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &, &:dir(ltr):last-child, &:dir(rtl):first-child { + @extend %button_basic; + @extend %circular_button; + min-width: 30px; + min-height: 30px; + margin: 10px 2px; + border: none; + } + } + } + + &:disabled spinbutton { + > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque):last-child, + > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &, &:dir(ltr):last-child, &:dir(rtl):first-child { + &:disabled { + filter: none; + } + } + } + } +} + +row.entry, +row.spin { + @include focus-ring($focus-state: '.focused', $offset: -1px, $transition: $row_transition); + + &:not(:selected).activatable.focused:hover, + &:not(:selected).activatable.focused:active { + background-color: transparent; + } + + @each $e_type, $e_color, $e_bg_color, $e_fg_color in (error, $error_color, $error_bg_color, $error_fg_color), + (warning, $warning_color, $warning_bg_color, $warning_fg_color), + (success, $success_color, $success_bg_color, $success_fg_color) { + &.#{$e_type} { + @include focus-ring($focus-state: '.focused', $offset: -1px, $fc: gtkalpha(currentColor, $focus_border_opacity), $transition: $row_transition); + + text { + > selection:focus-within { background-color: gtkalpha($e_color, .2); } + + > cursor-handle > contents { background-color: currentColor; } + } + + .dim-label, .subtitle { + opacity: 1; + } + + .suggested-action { + background-color: $e_bg_color; + color: $e_fg_color; + } + } + } +} + +/*************** + * AdwComboRow * + ***************/ + +row.combo { + image.dropdown-arrow:disabled { + filter: opacity($disabled_opacity); + } + + listview.inline { + background: none; + border: none; + box-shadow: none; + color: inherit; + + &, &:disabled { + background: none; + color: inherit; + } + } + + popover > contents { + min-width: 120px; + + .combo-searchbar { + margin: 6px; + + + scrolledwindow { + @include undershoot(top, $popover_shade_color); + } + } + } +} + +/****************** + * AdwExpanderRow * + ******************/ + +@mixin margin-start($margin) { + &:dir(ltr) { + margin-left: $margin; + } + + &:dir(rtl) { + margin-right: $margin; + } +} + +%boxed_list { + background-color: $card_bg_color; + color: $card_fg_color; + border-radius: $button_radius; + box-shadow: 0 0 0 1px $border_color; +} + +%boxed_list_row { + @include focus-ring($offset: -1px, $transition: $row_transition); + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + border-bottom: 1px solid gtkalpha(currentColor, .08); + + &:not(:selected).activatable { + &:hover { + background-color: gtkalpha(currentColor, .03); + } + + &:active { + background-color: gtkalpha(currentColor, .08); + } + + &.has-open-popup { + background-color: gtkalpha(currentColor, .03); + } + } +} + +row.expander { + // Drop transparent background on expander rows to let nested rows handle it, + // avoiding double highlights. + background: none; + padding: 0px; + + > box > list { + background: none; + color: inherit; + } + + list.nested { + background-color: gtkalpha($card_shade_color, .5); + color: inherit; + } + + list.nested > row { + @extend %boxed_list_row; + } + + // AdwExpanderRow arrow rotation + + image.expander-row-arrow { + @extend .dim-label; + + transition: -gtk-icon-transform 200ms $ease-out-quad; + @include margin-start(3px); + + &:dir(ltr) { + -gtk-icon-transform: rotate(0.5turn); + } + + &:dir(rtl) { + -gtk-icon-transform: rotate(-0.5turn); + } + + &:disabled { + filter: opacity($disabled_opacity); + } + } + + &:checked image.expander-row-arrow { + -gtk-icon-transform: rotate(0turn); + opacity: 1; + + &:not(:disabled) { + color: $accent_color; + } + } + + .osd &:checked image.expander-row-arrow:not(:disabled) { + color: inherit; + } + + &.property box > list > row { + @extend .property; + } +} + +/*************** + * AdwButtonRow * + ***************/ + +row.button { + > box { + margin-left: 12px; + margin-right: 12px; + border-spacing: 6px; + min-height: 50px; + } + + .title { + @extend .heading; + } + + &.suggested-action { + color: $accent_color; + } + + &.destructive-action { + color: $destructive_color; + } +} + +/***************** + * Boxed Lists * + *****************/ + +list.boxed-list { + @extend %boxed_list; + + > row { + // Regular rows and expander header rows background + &, &.expander row.header { + @extend %boxed_list_row; + } + + &.expander { + border: none; + } + + // Rounded top + &:first-child { + &, &.expander row.header { + border-top-left-radius: $button_radius; + border-top-right-radius: $button_radius; + } + } + + // Rounded bottom + &:last-child { + &, + &.expander:not(:checked), + &.expander:not(:checked) row.header, + &.expander:checked list.nested, + &.expander:checked list.nested > row:last-child { + border-bottom-left-radius: $button_radius; + border-bottom-right-radius: $button_radius; + border-bottom-width: 0; + } + } + } +} + +list.boxed-list-separate { + background: none; + color: $card_fg_color; + + > row { + @extend %boxed_list; + border: none; + margin-bottom: 12px; + + &:last-child { + margin-bottom: 0; + } + + @include focus-ring($offset: -1px, $transition: $row_transition); + + .osd &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + &:not(.expander) { + &:not(:selected).activatable { + &:hover { + background-color: $card_bg_color; + background-image: image(gtkalpha(currentColor, .03)); + } + + &:active { + background-color: $card_bg_color; + background-image: image(gtkalpha(currentColor, .08)); + } + + &.has-open-popup { + background-color: $card_bg_color; + background-image: image(gtkalpha(currentColor, .03)); + } + } + } + + &.entry, &.spin { + &:not(:selected).activatable.focused:hover, + &:not(:selected).activatable.focused:active { + background-color: $card_bg_color; + background-image: none; + } + + @each $e_type, $e_color in (error, $error_color), + (warning, $warning_color), + (success, $success_color) { + &.#{$e_type} { + color: $e_color; + } + } + } + + &.expander { + row.header { + @extend %boxed_list_row; + border-top-left-radius: $button_radius; + border-top-right-radius: $button_radius; + } + + &:not(:checked) row.header, + &.expander:checked list.nested, + &.expander:checked list.nested > row:last-child { + border-bottom-left-radius: $button_radius; + border-bottom-right-radius: $button_radius; + border-bottom: none; + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_menus.scss b/src/sass/libadwaita/widgets/_menus.scss new file mode 100644 index 00000000..038f09b7 --- /dev/null +++ b/src/sass/libadwaita/widgets/_menus.scss @@ -0,0 +1,252 @@ +popover.menu { + > contents { + min-width: 120px; + } + + scrollbar.vertical > range > trough > slider { + min-height: 30px; + } + + box.inline-buttons { + padding: 0 $menu_padding; + + button.image-button.model { + @extend %button_basic_flat; + min-height: 32px; + min-width: 32px; + padding: 0; + border: none; + outline: none; + transition: none; + + &:selected { + background-color: $selected_color; + + &:active { + background-color: $selected_active_color; + } + } + } + } + + box.circular-buttons { + padding: $menu_padding $menu_padding $base_padding; + + button.circular.image-button.model { + @extend %button_basic_flat; + outline: none; + padding: 11px; + box-shadow: inset 0 0 0 1px $border_color; + + &:selected { + background-color: $selected_hover_color; + + &:active { + background-color: $selected_active_color; + } + } + } + } + + > contents { + padding: 0; + + &, > scrolledwindow > viewport { + > stack > box { + padding: $menu_margin; + } + } + } + + separator { + margin: $base_padding 0; + } + + list separator { + margin: 0; + } + + accelerator { + color: gtkalpha(currentColor, $dim_label_opacity); + + &:dir(ltr) { margin-left: $menu_padding; } + &:dir(rtl) { margin-right: $menu_padding; } + } + + check, + radio { + min-width: 16px; + min-height: 16px; + -gtk-icon-size: 16px; + padding: 0; + + &, + &:hover:checked, + &:hover:indeterminate, + &:hover:not(:checked):not(:indeterminate), + &:active:checked, + &:active:indeterminate, + &:active:not(:checked):not(:indeterminate), { + background: none; + box-shadow: none; + color: inherit; + } + } + + radio { + &:checked, &:indeterminate { -gtk-icon-source: -gtk-scaled(-gtk-recolor(url("assets/menu-radio-symbolic.svg")), -gtk-recolor(url("assets/menu-radio-symbolic@2.svg"))); } + } + + .osd & { + check, radio { + background: none; + color: inherit; + } + } + + radio, check { + padding: 0; + border: 1px solid gtkalpha(currentColor, $dimmer_opacity); + } + + check, + radio, + arrow { + &.left { + margin-left: -2px; + margin-right: $base_padding; + } + + &.right { + margin-left: $base_padding; + margin-right: -2px; + } + } + + modelbutton { + min-height: 32px; + min-width: 40px; + padding: 0 $menu_padding; + border-radius: $menuitem_radius; + @include button(flat-normal); + + &:focus:not(:hover):not(:active) { + outline: none; + background: none; + transition: none; + } + + &:hover, + &:selected { @include button(flat-hover); } + + &:active { @include button(flat-active); } + + arrow { + background: none; + min-width: 16px; + min-height: 16px; + opacity: $dimmer_opacity; + + &:hover { background: none; } + + &:disabled { + filter: opacity($disabled_opacity); + } + + &.left { -gtk-icon-source: -gtk-icontheme("go-previous-symbolic"); } + + &.right { -gtk-icon-source: -gtk-icontheme("go-next-symbolic"); } + } + } + + label.title { + font-weight: bold; + padding: 4px ($menu_padding + 20px); //this will fall apart with font sizing + } + + list, listview { + background: none; + color: inherit; + + > row { + border-radius: $menuitem_radius; + padding: 0 $menu_padding; + min-height: 32px; + min-width: 40px; + + &:selected { + background: none; + } + + &:hover { + &, &:selected.activatable { + background-color: $selected_color; + } + } + + &:active { + &, &:selected.activatable { + background-color: $selected_active_color; + } + } + + &.has-open-popup { + &, &:selected.activatable { + background-color: $selected_color; + } + } + + > box { + border-spacing: $base_padding; + } + } + } + + // Standalone lists should have same margins as menu sections, + // but we don't want that on lists inside sections themselves + contents > list, + contents > listview, + scrolledwindow > viewport > list, + scrolledwindow > listview { + padding: $menu_margin 0; //only vertical padding. horizontal row size would clip + + > row { + margin: 0 $menu_margin; + + padding: 9px $menu_padding; + min-height: 0; + } + } +} + +menubar { + box-shadow: inset 0 -1px $border_color; + padding-bottom: 1px; + + > item { + min-height: 16px; + padding: 4px 8px; + border-radius: $button_radius; + + &:selected { //Seems like it :hover even with keyboard focus + background-color: $selected_color; + } + + //nested submenus + popover.menu popover.menu { + padding: 0 0 4px 0; + } + + popover.menu popover.menu > contents { + margin: 0; + border-radius: $popover_radius; //including top + } + } +} + +%menubar-inline { + box-shadow: none; + padding-bottom: 0; +} + +%menubar-shrunk {} diff --git a/src/sass/libadwaita/widgets/_message-dialog.scss b/src/sass/libadwaita/widgets/_message-dialog.scss new file mode 100644 index 00000000..7d82f715 --- /dev/null +++ b/src/sass/libadwaita/widgets/_message-dialog.scss @@ -0,0 +1,155 @@ +/******************** + * GtkMessageDialog * + ********************/ + +window.dialog.message { + .titlebar { + min-height: 20px; + background: none; + box-shadow: none; + border-style: none; + border-top-left-radius: 7px; + border-top-right-radius: 7px; + } + + box.dialog-vbox.vertical { + margin-top: 6px; + border-spacing: 24px; + + > box > box > box > label.title { + font-weight: 800; + font-size: 15pt; + } + } + + &.csd { + // bigger radius for better antialiasing + border-bottom-left-radius: $window_radius+1; + border-bottom-right-radius: $window_radius+1; + + .dialog-action-area { + border-top: 1px solid $border_color; + margin: 0; + border-spacing: 0; + + > button { + @extend %button_basic_flat; + padding: 10px 14px; // labels are not vertically centered on message dialog, this is a workaround + border-radius: 0; + border: none; + background-clip: padding-box; + border-left: 1px solid $border_color; + + &:first-child { + border-bottom-left-radius: $window_radius+1; + border-left: none; + } + + &:last-child { + border-bottom-right-radius: $window_radius+1; + } + + &.suggested-action { + color: $accent_color; + } + + &.destructive-action { + color: $destructive_color; + } + } + } + } +} + +/******************** + * AdwMessageDialog * + ********************/ + +window.messagedialog, +dialog-host > dialog.alert sheet, +window.dialog-window.alert { + background-color: $dialog_bg_color; + color: $dialog_fg_color; +} + +dialog-host > dialog.alert.floating sheet, +window.dialog-window.alert { + border-radius: $window_radius+1; + outline: none; +} + +window.messagedialog, +dialog.alert { + .message-area { + padding: 24px 30px; + border-spacing: 24px; + + &.has-heading.has-body { + border-spacing: 10px; + } + } + + .response-area > button { + padding: 10px 14px; + border-radius: 0; + + &.suggested { + color: $accent_color; + } + + &.destructive { + color: $destructive_color; + } + } + + .response-area { + &:not(.compact) > button { + margin-top: -1px; + margin-right: -1px; + margin-left: -1px; + + &:first-child:dir(ltr), + &:last-child:dir(rtl) { + margin-left: 0; + } + + &:last-child:dir(ltr), + &:first-child:dir(rtl) { + margin-right: 0; + } + } + + &.compact > button { + margin-top: -1px; + margin-bottom: -1px; + + &:first-child { + margin-bottom: 0; + } + } + } +} + +window.messagedialog, +dialog.alert.floating { + .response-area { + &:not(.compact) > button { + &:first-child:dir(ltr), + &:last-child:dir(rtl) { + border-bottom-left-radius: $window_radius+1; + } + + &:last-child:dir(ltr), + &:first-child:dir(rtl) { + border-bottom-right-radius: $window_radius+1; + } + } + + &.compact > button { + &:first-child { + border-bottom-left-radius: $window_radius+1; + border-bottom-right-radius: $window_radius+1; + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_misc.scss b/src/sass/libadwaita/widgets/_misc.scss new file mode 100644 index 00000000..23d55c54 --- /dev/null +++ b/src/sass/libadwaita/widgets/_misc.scss @@ -0,0 +1,215 @@ +/********** + * Frames * + **********/ +frame, +.frame { + border: 1px solid $border_color; +} + +frame { + border-radius: $button_radius; + + > label { + margin: $base_padding / 2 + 1px; + } +} + +/************** + * Separators * + **************/ + +separator { + background: $border_color; + min-width: 1px; + min-height: 1px; + + &.spacer { + background: none; + + &.horizontal { min-width: 12px; } + &.vertical { min-height: 12px; } + } +} + +/********************* + * App Notifications * + *********************/ + +.app-notification { + @extend %osd; + + padding: 10px; + border-spacing: 10px; + border-radius: 0 0 $card_radius $card_radius; + background-color: $osd_bg_color; + background-image: linear-gradient(to bottom, transparentize(black, 0.8), + transparent 2px); + background-clip: padding-box; + + border { border: none; } +} + +/********** + * Toasts * + **********/ + +toast { + @extend %osd; + margin: $base_padding * 2; + margin-bottom: $base_padding * 4; + border-radius: 150px; + border-spacing: $base_padding; + padding: $base_padding; + + &:dir(ltr) { padding-left: $base_padding * 2; } + &:dir(rtl) { padding-right: $base_padding * 2; } + + > widget { + margin: 0 $base_padding; + } +} + +/************** + * GtkVideo * + **************/ + +video { + & image.osd { + min-width: 64px; + min-height: 64px; + border-radius: 32px; + } +} + +/****************** + * AdwAboutWindow * + ******************/ + +window.about, +dialog.about { + .main-page { + > viewport > clamp > box { + margin: $base_padding * 2; + border-spacing: $base_padding; + + > box { + margin-top: 18px; + border-spacing: 18px; + margin-bottom: $base_padding; + } + } + + .app-version { + padding: $base_padding / 2 $base_padding * 3; + color: $accent_color; + border-radius: $circular_radius; + margin-top: $base_padding / 2; + } + } + + .subpage { + > viewport > clamp > box { + margin: 18px 12px; + border-spacing: 18px; + } + + > clamp > textview { + background: none; + color: inherit; + } + } +} + +/***************** + * AdwStatusPage * + *****************/ + +statuspage { + > scrolledwindow > viewport > box { + margin: 36px 12px; + border-spacing: 36px; + + > clamp > box { + border-spacing: $base_padding * 2; + + > .icon { + -gtk-icon-size: 128px; + + color: gtkalpha(currentColor, $dim_label_opacity); + + &:disabled { + opacity: $disabled_opacity; + } + + &:not(:last-child) { + margin-bottom: 24px; + } + } + } + } + + &.compact > scrolledwindow > viewport > box { + margin: 24px 12px; + border-spacing: 24px; + + > clamp > box { + > .icon { + -gtk-icon-size: 96px; + + &:not(:last-child) { + margin-bottom: 12px; + } + } + + > .title { + font-size: 18pt; + } + } + } +} + +/* Cards */ + +.card { + @at-root %card, & { + background-color: $card_bg_color; + color: $card_fg_color; + border-radius: $card_radius; + box-shadow: 0 0 0 1px $border; + + .osd &, &.osd { + background-color: gtkalpha(currentColor, .1); + color: inherit; + box-shadow: none; + } + } + + @include focus-ring($offset: -1px); + + .osd &, &.osd { + &:focus:focus-visible { + outline-color: $osd_focus_color; + } + } + + &.activatable { + transition: $focus_transition, $button_transition; + + &:hover { + background-image: image(gtkalpha(currentColor, .03)); + } + + &:active { + background-image: image(gtkalpha(currentColor, .08)); + } + } +} + +/* Transition shadows */ + +flap, +leaflet, +navigation-view, +overlay-split-view { + @include transition-shadows($shade_color); +} diff --git a/src/sass/libadwaita/widgets/_notebook.scss b/src/sass/libadwaita/widgets/_notebook.scss new file mode 100644 index 00000000..3bade472 --- /dev/null +++ b/src/sass/libadwaita/widgets/_notebook.scss @@ -0,0 +1,216 @@ +notebook { + @include focus-ring("> header > tabs > tab:checked", $offset: -2px, $focus-state: ':focus:focus-visible'); + + > header { + padding: 1px; + border-color: $border_color; + border-width: 1px; + background-clip: padding-box; + + > tabs { margin: -1px; } + + &.top { + border-bottom-style: solid; + > tabs { + margin-bottom: -2px; + > tab { + &:hover { box-shadow: inset 0 -4px $border_color; } + + &:checked { box-shadow: inset 0 -4px $accent_bg_color; } + } + } + } + + &.bottom { + border-top-style: solid; + > tabs { + margin-top: -2px; + > tab { + &:hover { box-shadow: inset 0 4px $border_color; } + + &:checked { box-shadow: inset 0 4px $accent_bg_color; } + } + } + } + + &.left { + border-right-style: solid; + > tabs { + margin-right: -2px; + > tab { + &:hover { box-shadow: inset -4px 0 $border_color; } + + &:checked { box-shadow: inset -4px 0 $accent_bg_color; } + } + } + } + + &.right { + border-left-style: solid; + > tabs { + margin-left: -2px; + > tab { + &:hover { box-shadow: inset 4px 0 $border_color; } + + &:checked { box-shadow: inset 4px 0 $accent_bg_color; } + } + } + } + + &.top > tabs > arrow { + @extend %notebook_vert_arrows; + + border-top-style: none; + } + + &.bottom > tabs > arrow { + @extend %notebook_vert_arrows; + + border-bottom-style: none; + } + + @at-root %notebook_vert_arrows { + margin-left: -5px; + margin-right: -5px; + padding-left: 4px; + padding-right: 4px; + + &.down { -gtk-icon-source: -gtk-icontheme('pan-start-symbolic'); } + + &.up { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); } + } + + &.left > tabs > arrow { + @extend %notebook_horz_arrows; + + border-left-style: none; + } + + &.right > tabs > arrow { + @extend %notebook_horz_arrows; + + border-right-style: none; + } + + @at-root %notebook_horz_arrows { + margin-top: -5px; + margin-bottom: -5px; + padding-top: 4px; + padding-bottom: 4px; + + &.down { -gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); } + + &.up { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } + } + + > tabs > arrow { + @extend %button_basic; + @extend %button_basic_flat; + + min-height: 16px; + min-width: 16px; + border-radius: 0; + + &:hover:not(:active) { + box-shadow: none; + } + } + + > tabs > tab { + transition: $focus_transition; + min-height: 30px; + min-width: 30px; + padding: 3px 12px; + + font-weight: normal; + + &:hover, &:active { + background-color: $hover_color; + } + + &:not(:checked) { + outline-color: transparent; + } + + &:disabled { + filter: opacity($disabled_opacity); + + label, button { + filter: none; + } + } + + // colors the button like the label, overridden otherwise + button.flat { + color: gtkalpha(currentColor, 0.3); + &:hover, &:active { color: currentColor; } + + padding: 0; + margin-top: 4px; + margin-bottom: 4px; + // FIXME: generalize .small-button? + min-width: 20px; + min-height: 20px; + + &:last-child { + margin-left: 4px; + margin-right: -4px; + } + + &:first-child { + margin-left: -4px; + margin-right: 4px; + } + } + } + + &.top, + &.bottom { + > tabs { + padding-left: 4px; + padding-right: 4px; + + &:not(:only-child) { + margin-left: 3px; + margin-right: 3px; + + &:first-child { margin-left: -1px; } + &:last-child { margin-right: -1px; } + } + + > tab { + margin-left: 4px; + margin-right: 4px; + } + } + } + + &.left, + &.right { + > tabs { + padding-top: 4px; + padding-bottom: 4px; + + &:not(:only-child) { + margin-top: 3px; + margin-bottom: 3px; + + &:first-child { margin-top: -1px; } + &:last-child { margin-bottom: -1px; } + } + + > tab { + margin-top: 4px; + margin-bottom: 4px; + } + } + } + + &.top > tabs > tab { padding-bottom: 4px; } + &.bottom > tabs > tab { padding-top: 4px; } + } + + > stack:not(:only-child) { // the :not(:only-child) is for "hidden" notebooks + background-color: $view_bg_color; + } +} diff --git a/src/sass/libadwaita/widgets/_paned.scss b/src/sass/libadwaita/widgets/_paned.scss new file mode 100644 index 00000000..baf320af --- /dev/null +++ b/src/sass/libadwaita/widgets/_paned.scss @@ -0,0 +1,46 @@ +paned { + > separator { + min-width: 1px; + min-height: 1px; + background: none; + background-size: 1px 1px; + + &.wide { + min-width: 5px; + min-height: 5px; + } + } + + &.horizontal > separator { + &:dir(ltr) { + margin: 0 -8px 0 0; + padding: 0 8px 0 0; + box-shadow: inset 1px 0 $border_color; + } + &:dir(rtl) { + margin: 0 0 0 -8px; + padding: 0 0 0 8px; + box-shadow: inset -1px 0 $border_color; + } + + &.wide { + margin: 0; + padding: 0; + box-shadow: inset 1px 0 $border_color, + inset -1px 0 $border_color; + } + } + + &.vertical > separator { + margin: 0 0 -8px 0; + padding: 0 0 8px 0; + box-shadow: inset 0 1px $border_color; + + &.wide { + margin: 0; + padding: 0; + box-shadow: inset 0 1px $border_color, + inset 0 -1px $border_color; + } + } +} diff --git a/src/sass/libadwaita/widgets/_popovers.scss b/src/sass/libadwaita/widgets/_popovers.scss new file mode 100644 index 00000000..380c6650 --- /dev/null +++ b/src/sass/libadwaita/widgets/_popovers.scss @@ -0,0 +1,88 @@ +toolbarview.undershoot-top popover scrolledwindow undershoot.top, +toolbarview.undershoot-bottom popover scrolledwindow undershoot.bottom { + background: none; + box-shadow: none; +} + +popover { + &.background { + background-color: transparent; + font: initial; + } + + > arrow, + > contents { + background-color: $popover_bg_color; + color: $popover_fg_color; + background-clip: border-box; + border: 1px solid gtkmix(white, $popover_bg_color, 8%); + box-shadow: 0 1px 5px 1px transparentize(black, .91), + 0 2px 14px 3px transparentize(black, .95), + 0 0 0 1px $headerbar_darker_shade_color; + } + + > contents { + padding: $base_padding; + border-radius: $popover_radius; + + > list, + > .view, + > toolbar { + border-style: none; + background-color: transparent; + } + + separator { + background-color: gtkalpha(currentColor, 0.08); + } + } + + .osd &, + &.touch-selection, + &.magnifier { + background-color: transparent; + + > arrow, + > contents { + @extend %osd; + + border: 1px solid transparentize(white, 0.9); + box-shadow: none; + } + } + + toolbarview.undershoot-top scrolledwindow { + @include undershoot(top, $popover_shade_color); + } + + toolbarview.undershoot-bottom scrolledwindow { + @include undershoot(bottom, $popover_shade_color); + } + + scrolledwindow { + &.undershoot-top { + @include undershoot(top, $popover_shade_color); + } + + &.undershoot-bottom { + @include undershoot(bottom, $popover_shade_color) + } + + &.undershoot-start { + &:dir(ltr) { @include undershoot(left, $popover_shade_color); } + &:dir(rtl) { @include undershoot(right, $popover_shade_color); } + } + + &.undershoot-end { + &:dir(ltr) { @include undershoot(right, $popover_shade_color); } + &:dir(rtl) { @include undershoot(left, $popover_shade_color); } + } + } + + flap, + leaflet, + navigation-view, + overlay-split-view { + @include transition-shadows($popover_shade_color); + } +} diff --git a/src/sass/libadwaita/widgets/_preferences.scss b/src/sass/libadwaita/widgets/_preferences.scss new file mode 100644 index 00000000..32acce52 --- /dev/null +++ b/src/sass/libadwaita/widgets/_preferences.scss @@ -0,0 +1,18 @@ +preferencespage > scrolledwindow > viewport > clamp > box { + margin: 24px 12px; + border-spacing: 24px; +} + +preferencesgroup > box { + &, .labels { + border-spacing: $base_padding; + } + + > box.header:not(.single-line) { + margin-bottom: $base_padding; + } + + > box.single-line { + min-height: 34px; + } +} diff --git a/src/sass/libadwaita/widgets/_progress-bar.scss b/src/sass/libadwaita/widgets/_progress-bar.scss new file mode 100644 index 00000000..8386f952 --- /dev/null +++ b/src/sass/libadwaita/widgets/_progress-bar.scss @@ -0,0 +1,93 @@ +progressbar { + // sizing + &.horizontal { + > trough { + min-width: 150px; + &, > progress { min-height: 8px; } + } + } + + &.vertical { + > trough { + min-height: 80px; + &, > progress { min-width: 8px; } + } + } + + > text { + @extend .dim-label; + @extend .numeric; + font-size: smaller; + } + + &:disabled { + filter: opacity($disabled_opacity); + } + + > trough { + @extend %scale_trough; + + > progress { + @extend %scale_highlight; /* share most of scales' */ + + $_progress-radius: 99px; + + border-radius: $_progress-radius; + + &.left { + border-top-left-radius: $_progress-radius; + border-bottom-left-radius: $_progress-radius; + } + + &.right { + border-top-right-radius: $_progress-radius; + border-bottom-right-radius: $_progress-radius; + } + + &.top { + border-top-right-radius: $_progress-radius; + border-top-left-radius: $_progress-radius; + } + + &.bottom { + border-bottom-right-radius: $_progress-radius; + border-bottom-left-radius: $_progress-radius; + } + } + } + + &.osd { + // Thin progress bar with no trough, usually goes under the header bar + min-width: 2px; + min-height: 2px; + background-color: transparent; + color: inherit; + + > trough { + border-style: none; + border-radius: 0; + background-color: transparent; + box-shadow: none; + + > progress { + border-style: none; + border-radius: 0; + } + + } + + &.horizontal { + > trough, > trough > progress { min-height: 2px; } + } + + &.vertical { + > trough, > trough > progress { min-width: 2px; } + } + } + + > trough.empty > progress { all: unset; } // makes the progress indicator disappear, when the fraction is 0 + + .osd & > trough > progress { + background-color: $osd_fill_bg_color; + } +} diff --git a/src/sass/libadwaita/widgets/_scale.scss b/src/sass/libadwaita/widgets/_scale.scss new file mode 100644 index 00000000..bb3155e6 --- /dev/null +++ b/src/sass/libadwaita/widgets/_scale.scss @@ -0,0 +1,232 @@ +$_slider_border_color: transparentize(black, if($contrast == 'high', .65, .9)); + +%scale_trough { + border-radius: 99px; + background-color: $trough_color; + + @if $contrast == "high" { + box-shadow: inset 0 0 0 1px $border_color; + } +} + +%scale_highlight { + border-radius: 99px; + background-color: $fill_color; + color: $fill_text_color; +} + +scale { + // sizing + $_marks_length: 6px; + $_marks_distance: 6px; + + min-height: 10px; + min-width: 10px; + padding: 12px; + + @include focus-ring("> trough > slider", $offset: 0); + + > trough { + @extend %scale_trough; + + // the colored part of the backing bit + > highlight { @extend %scale_highlight; } + + // this is another differently styled part of the backing bit, the most relevant use case is for example + // in media player to indicate how much video stream as been cached + > fill { + @extend %scale_trough; + } + + > slider { + background-color: $slider_color; + box-shadow: 0 0 0 1px $_slider_border_color, 0 2px 4px transparentize(black, .8); + + border-radius: 100%; + + // the slider is inside the trough, so to have make it bigger there's a negative margin + min-width: 20px; + min-height: 20px; + margin: -8px; + } + } + + &:hover, &:active { + > trough { + background-color: $trough_hover_color; + + > highlight { + background-image: image(gtkalpha(currentColor, .1)); + } + + > slider { + background-color: $slider_hover_color; + } + } + } + + .osd & { + &:focus:focus-visible > trough { + outline-color: $osd_focus_color; + } + + > trough > highlight { + background-color: $osd_fill_bg_color; + color: $osd_fill_fg_color; + } + } + + &:disabled { + filter: opacity($disabled_opacity); + + > trough > slider { + box-shadow: 0 0 0 1px $_slider_border_color, 0 2px 4px transparent; + outline-color: transparentize(black, if($contrast == 'high', .5, .8)); + } + } + + // click-and-hold the slider to activate + &.fine-tune { + padding: 9px; + + &.horizontal { + min-height: 16px; + } + + &.vertical { + min-width: 16px; + } + + > trough { + // to make the trough grow in fine-tune mode + > slider { margin: -5px; } + } + } + + > value { + @extend .dim-label; + @extend .numeric; + } + + &.marks-before:not(.marks-after), + &.marks-after:not(.marks-before) { + > trough > slider { + transform: rotate(45deg); + + // Adjust box-shadow for the 45deg rotation, for 0px 2px we ideally want + // 1/√2px 1/√2px, round that to 1px 1px + box-shadow: 0 0 0 1px $_slider_border_color, 1px 1px 4px transparentize(black, .8); + + &:disabled { + box-shadow: 0 0 0 1px $_slider_border_color, 1px 1px 4px transparent; + } + } + } + + &.horizontal { + > marks { + color: gtkalpha(currentColor, $dim_label_opacity); + &.top { margin-bottom: $_marks_distance; } + &.bottom { margin-top: $_marks_distance; } + + indicator { + background-color: currentColor; + min-height: $_marks_length; + min-width: 1px; + } + } + + > value.left { margin-right: 9px; } + > value.right { margin-left: 9px; } + + &.fine-tune > marks { + &.top { margin-top: 3px; } + &.bottom { margin-bottom: 3px; } + + indicator { min-height: ($_marks_length - 3px); } + } + + &.marks-before { + padding-top: 0; + + > trough > slider { + border-top-left-radius: 0; + } + } + + &.marks-after { + padding-bottom: 0; + + > trough > slider { + border-bottom-right-radius: 0; + } + } + + &.marks-before.marks-after > trough > slider { + border-radius: 100%; + } + } + + &.vertical { + > marks { + color: gtkalpha(currentColor, $dim_label_opacity); + &.top { margin-right: $_marks_distance; } + &.bottom { margin-left: $_marks_distance; } + + indicator { + background-color: currentColor; + min-height: 1px; + min-width: $_marks_length; + } + } + + > value.top { margin-bottom: 9px; } + > value.bottom { margin-top: 9px; } + + &.fine-tune > marks { + &.top { margin-left: 3px; } + &.bottom { margin-right: 3px; } + + indicator { min-height: ($_marks_length - 3px); } + } + + &.marks-before { + padding-left: 0; + + > trough > slider { + border-bottom-left-radius: 0; + } + } + + &.marks-after { + padding-right: 0; + + > trough > slider { + border-top-right-radius: 0; + } + } + } + + &.color { + padding: 0; + + > trough { + border: none; + background: none; + border-radius: 10px; + + > slider { + margin: 0; + background-color: transparentize(white, .2); + } + } + + &.fine-tune { + padding: 2px; + + > trough > slider { + margin: -2px; + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_scrolling.scss b/src/sass/libadwaita/widgets/_scrolling.scss new file mode 100644 index 00000000..536307e4 --- /dev/null +++ b/src/sass/libadwaita/widgets/_scrolling.scss @@ -0,0 +1,172 @@ +$osd_scrollbar_outline_color: transparentize(black, .5); + +scrollbar { + $_slider_min_length: 40px; + $_slider_width: 8px; + $_scrollbar_transition: all 200ms linear; + + > range > trough { + margin: 7px; + transition: $_scrollbar_transition; + border-radius: 10px; + + > slider { + min-width: $_slider_width; + min-height: $_slider_width; + margin: -6px; + border: 6px solid transparent; + border-radius: 10px; + background-clip: padding-box; + transition: $_scrollbar_transition; + background-color: gtkalpha(currentColor, .2); + + &:hover { background-color: gtkalpha(currentColor, .4); } + + &:active { background-color: gtkalpha(currentColor, .6); } + + &:disabled { opacity: 0; } + } + } + + &.horizontal > range > trough { + margin-top: 6px; + margin-bottom: 6px; + } + + &.vertical > range > trough { + margin-left: 6px; + margin-right: 6px; + } + + &.overlay-indicator { + background: none; + color: inherit; + box-shadow: none; + padding: 0; + + > range > trough { + outline: 1px solid transparent; + + > slider { + outline: 1px solid gtkalpha($scrollbar_outline_color, .6); + + .osd & { + outline: 1px solid gtkalpha($osd_scrollbar_outline_color, .6); + } + + outline-offset: -6px; + } + } + + &:not(.hovering) > range > trough > slider { + min-width: 3px; + min-height: 3px; + outline-color: gtkalpha($scrollbar_outline_color, .35); + + .osd & { + outline-color: gtkalpha($osd_scrollbar_outline_color, .35); + } + } + + &.hovering > range > trough { + background-color: gtkalpha(currentColor, .1); + } + + &.horizontal { + > range > trough > slider { + min-width: $_slider_min_length; + } + + &.hovering > range > trough > slider { + min-height: $_slider_width; + } + + &:not(.hovering) > range > trough { + margin-top: 3px; + margin-bottom: 3px; + } + } + + &.vertical { + > range > trough > slider { + min-height: $_slider_min_length; + } + + &.hovering > range > trough > slider { + min-width: $_slider_width; + } + + &:not(.hovering) > range > trough { + margin-left: 3px; + margin-right: 3px; + } + } + } + + &.horizontal > range > trough > slider { min-width: $_slider_min_length; } + &.vertical > range > trough > slider { min-height: $_slider_min_length; } + + > range.fine-tune > trough > slider { + &, &:hover, &:active { + background-color: gtkalpha($accent_color, .6); + } + } +} + +scrolledwindow { + // This is used when content is touch-dragged past boundaries. + // draws a box on top of the content, the size changes programmatically. + > overshoot { + &.top { + @include overshoot(top); + } + + &.bottom { + @include overshoot(bottom); + } + + &.left { + @include overshoot(left); + } + + &.right { + @include overshoot(right); + } + } + + &.undershoot-top { + @include undershoot(top); + } + + &.undershoot-bottom { + @include undershoot(bottom); + } + + &.undershoot-start { + &:dir(ltr) { @include undershoot(left); } + &:dir(rtl) { @include undershoot(right); } + } + + &.undershoot-end { + &:dir(ltr) { @include undershoot(right); } + &:dir(rtl) { @include undershoot(left); } + } +} + +toolbarview.undershoot-top scrolledwindow { + @include undershoot(top); +} + +toolbarview.undershoot-bottom scrolledwindow { + @include undershoot(bottom); +} + +.about { + toolbarview.undershoot-top scrolledwindow { + @include undershoot(top, $style: frame); + } + + toolbarview.undershoot-bottom scrolledwindow { + @include undershoot(bottom, $style: frame); + } +} diff --git a/src/sass/libadwaita/widgets/_shortcuts-window.scss b/src/sass/libadwaita/widgets/_shortcuts-window.scss new file mode 100644 index 00000000..04f3b04f --- /dev/null +++ b/src/sass/libadwaita/widgets/_shortcuts-window.scss @@ -0,0 +1,55 @@ +shortcuts-section { + margin: 20px; +} + +.shortcuts-search-results { + margin: 20px; + border-spacing: 24px; +} + +// shortcut window keys +shortcut { + border-spacing: 6px; + border-radius: 6px; + @include focus-ring($outer: true, $offset: 4px); + + > .keycap { + min-width: 20px; + min-height: 25px; + padding: 2px 6px; + + @extend %card; + + border-radius: $button_radius; + font-size: smaller; + } +} + +shortcuts-section stackswitcher.circular { + border-spacing: 12px; + + > button.circular, + > button.text-button.circular { + min-width: 32px; + min-height: 32px; + padding: 0; + } +} + +window.shortcuts { + headerbar.titlebar { + @extend .flat; + @extend %headerbar-shrunk; + + > windowhandle { + padding-top: 3px; + } + } + + searchbar { + @extend %searchbar-flat; + @extend %searchbar-shrunk; + + background: none; + } +} diff --git a/src/sass/libadwaita/widgets/_sidebars.scss b/src/sass/libadwaita/widgets/_sidebars.scss new file mode 100644 index 00000000..cd7b48a9 --- /dev/null +++ b/src/sass/libadwaita/widgets/_sidebars.scss @@ -0,0 +1,210 @@ + +.sidebar-pane { + background-color: $sidebar_bg_color; + color: $sidebar_fg_color; + + &:backdrop { + background-color: $sidebar_backdrop_color; + transition: background-color $backdrop_transition; + } + + flap, + leaflet, + navigation-view, + overlay-split-view { + @include transition-shadows($sidebar_shade_color); + } + + banner > revealer > widget { + background-color: gtkmix($accent_bg_color, $sidebar_bg_color, 30%); + color: $sidebar_fg_color; + + &:backdrop { + background-color: gtkmix($accent_bg_color, $sidebar_backdrop_color, 15%); + } + } + + &:dir(ltr), &.end:dir(rtl) { + &, banner > revealer > widget { + box-shadow: inset -1px 0 $sidebar_border_color; + } + } + + &:dir(rtl), &.end:dir(ltr) { + &, banner > revealer > widget { + box-shadow: inset 1px 0 $sidebar_border_color; + } + } +} + +.sidebar-pane, .content-pane { + toolbarview.undershoot-top scrolledwindow { + @include undershoot(top, $sidebar_shade_color, $style: frame); + } + + toolbarview.undershoot-bottom scrolledwindow { + @include undershoot(bottom, $sidebar_shade_color, $style: frame); + } + + scrolledwindow { + &.undershoot-top { + @include undershoot(top, $sidebar_shade_color, $style: frame); + } + + &.undershoot-bottom { + @include undershoot(bottom, $sidebar_shade_color, $style: frame); + } + + &.undershoot-start { + &:dir(ltr) { @include undershoot(left, $sidebar_shade_color, $style: frame); } + &:dir(rtl) { @include undershoot(right, $sidebar_shade_color, $style: frame); } + } + + &.undershoot-end { + &:dir(ltr) { @include undershoot(right, $sidebar_shade_color, $style: frame); } + &:dir(rtl) { @include undershoot(left, $sidebar_shade_color, $style: frame); } + } + } +} + +/* Middle pane in three-pane setups */ +.content-pane .sidebar-pane, +.sidebar-pane .content-pane { + background-color: $secondary_sidebar_bg_color; + color: $secondary_sidebar_fg_color; + + &:backdrop { + background-color: $secondary_sidebar_backdrop_color; + transition: background-color $backdrop_transition; + } + + toolbarview.undershoot-top scrolledwindow { + @include undershoot(top, $secondary_sidebar_shade_color); + } + + toolbarview.undershoot-bottom scrolledwindow { + @include undershoot(bottom, $secondary_sidebar_shade_color); + } + + scrolledwindow { + &.undershoot-top { + @include undershoot(top, $secondary_sidebar_shade_color); + } + + &.undershoot-bottom { + @include undershoot(bottom, $secondary_sidebar_shade_color) + } + + &.undershoot-start { + &:dir(ltr) { @include undershoot(left, $secondary_sidebar_shade_color); } + &:dir(rtl) { @include undershoot(right, $secondary_sidebar_shade_color); } + } + + &.undershoot-end { + &:dir(ltr) { @include undershoot(right, $secondary_sidebar_shade_color); } + &:dir(rtl) { @include undershoot(left, $secondary_sidebar_shade_color); } + } + } + + flap, + leaflet, + navigation-view, + overlay-split-view { + @include transition-shadows($secondary_sidebar_shade_color); + } + + banner > revealer > widget { + background-color: gtkmix($accent_bg_color, $secondary_sidebar_bg_color, 30%); + color: $secondary_sidebar_fg_color; + + &:backdrop { + background-color: gtkmix($accent_bg_color, $secondary_sidebar_backdrop_color, 15%); + } + } + + &:dir(ltr), &.end:dir(rtl) { + &, banner > revealer > widget { + box-shadow: inset -1px 0 $sidebar_border_color; + } + } + + &:dir(rtl), &.end:dir(ltr) { + &, banner > revealer > widget { + box-shadow: inset 1px 0 $sidebar_border_color; + } + } +} + +.sidebar-pane .sidebar-pane { + background-color: transparent; + color: inherit; +} + +stacksidebar row { + padding: 10px 4px; + + > label { + padding-left: 6px; + padding-right: 6px; + } + + &.needs-attention > label { + @extend %needs_attention; + background-size: 6px 6px, 0 0; + } +} + +/********************** + * Navigation Sidebar * + **********************/ + +.navigation-sidebar { + &, &.view, &.view:disabled { + background-color: transparent; + color: inherit; + } + + &.background { + &, &:disabled { + background-color: $window_bg_color; + color: $window_fg_color; + } + } + + row { + &.activatable { + &:hover { background-color: $hover_color; } + + &:active { background-color: $active_color; } + + // this is for indicathing which row generated a popover see https://bugzilla.gnome.org/show_bug.cgi?id=754411 + &.has-open-popup { background-color: $hover_color; } + + &:selected { + &:hover { background-color: $selected_hover_color; } + + &:active { background-color: $selected_active_color; } + + &.has-open-popup { background-color: $selected_hover_color; } + } + } + + &:selected { + background-color: $selected_color; + } + } + + padding: $menu-margin 0; //only vertical padding. horizontal row size would clip + + > separator { + margin: $menu-margin; + background: none; + } + + > row { + min-height: 36px; + padding: 0 8px; + border-radius: $menuitem_radius; + margin: 0 $menu_margin 2px; + } +} diff --git a/src/sass/libadwaita/widgets/_spin-button.scss b/src/sass/libadwaita/widgets/_spin-button.scss new file mode 100644 index 00000000..4f806add --- /dev/null +++ b/src/sass/libadwaita/widgets/_spin-button.scss @@ -0,0 +1,72 @@ +spinbutton { + @extend %entry; + @extend .numeric; + + padding: 0; + border-spacing: 0; + + /* :not here just to bump specificity above that of the list button styling */ + > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), + > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + @extend %button_basic_flat; + + margin: 0; + + border-radius: 0; + box-shadow: none; + + border-style: solid; + border-color: gtkalpha(currentColor, if($contrast == 'high', .5, .1)); + } + + &:not(.vertical) { + > text { + min-width: 28px; + padding: 6px; + } + + /* :not here just to bump specificity above that of the list button styling */ + > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), + > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + min-height: 16px; + min-width: 22px; + padding-bottom: 0; + padding-top: 0; + border-left-width: 1px; + + &:dir(rtl) { + border-left-width: 0; + border-right-width: 1px; + } + + &:dir(ltr):last-child { + border-radius: 0 $button_radius $button_radius 0; + } + + &:dir(rtl):first-child { + border-radius: $button_radius 0 0 $button_radius; + } + } + } + + &.vertical { + > text { + min-height: 30px; + min-width: 30px; + } + + /* :not here just to bump specificity above that of the list button styling */ + > button.image-button.up:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque), + > button.image-button.down:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &:last-child { + border-top-width: 1px; + border-radius: 0 0 $button_radius $button_radius; + } + + &:first-child { + border-bottom-width: 1px; + border-radius: $button_radius $button_radius 0 0; + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_spinner.scss b/src/sass/libadwaita/widgets/_spinner.scss new file mode 100644 index 00000000..ab1f0202 --- /dev/null +++ b/src/sass/libadwaita/widgets/_spinner.scss @@ -0,0 +1,16 @@ +@keyframes spin { + to { transform: rotate(1turn); } +} + +spinner { + background: none; + opacity: 0; // non spinning spinner makes no sense + -gtk-icon-source: -gtk-icontheme('process-working-symbolic'); + + &:checked { + opacity: 1; + animation: spin 1s linear infinite; + + &:disabled { opacity: $disabled_opacity; } + } +} diff --git a/src/sass/libadwaita/widgets/_switch.scss b/src/sass/libadwaita/widgets/_switch.scss new file mode 100644 index 00000000..e6163093 --- /dev/null +++ b/src/sass/libadwaita/widgets/_switch.scss @@ -0,0 +1,52 @@ +switch { + // similar to GtkScale + border-radius: $circular_radius; + padding: $base_padding / 2; + background-color: $trough_color; + transition: all $duration $ease-out; + + &:hover { background-color: $trough_hover_color; } + &:active { background-color: $trough_active_color; } + + // @include focus-ring($offset: 1px, $outer: true); + + &:disabled { + filter: opacity($disabled_opacity); + } + + > slider { + min-width: $small_size - 6px; + min-height: $small_size - 6px; + border-radius: 50%; + background-color: $slider_color; + box-shadow: $shadow-z3; + } + + &:hover > slider, + &:active > slider { + box-shadow: 0 0 0 6px gtkalpha(currentColor, .1); + } + + &:checked { + color: $accent_fg_color; + background-color: $accent_bg_color; + + &:hover { background-image: image(gtkalpha(currentColor, .1)); } + &:active { background-image: image(transparentize(black, .8)); } + + > slider { + background-color: $slider_hover_color; + } + } + + .osd & { + &:focus:focus-visible { + outline-color: $osd_focus_color; + } + + &:checked { + background-color: transparentize($osd_fill_bg_color, .15); + color: $osd_fill_fg_color; + } + } +} diff --git a/src/sass/libadwaita/widgets/_tab-view.scss b/src/sass/libadwaita/widgets/_tab-view.scss new file mode 100644 index 00000000..5c4324a9 --- /dev/null +++ b/src/sass/libadwaita/widgets/_tab-view.scss @@ -0,0 +1,268 @@ +tabbar { + .box { + background-color: $headerbar_bg_color; + color: $headerbar_fg_color; + box-shadow: inset 0 -1px $headerbar_border_color; + padding: 1px; + padding-top: 0; + + &:backdrop { + background-color: $headerbar_backdrop_color; + transition: background-color $backdrop_transition; + + > scrolledwindow, + > .start-action, + > .end-action { + filter: opacity(0.5); + transition: filter $backdrop_transition; + } + } + } + + tabbox { + padding-bottom: 6px; + padding-top: 6px; + min-height: 34px; + + > tabboxchild { + @include focus-ring($focus-state: ':focus-within:focus-visible'); + border-radius: $button_radius; + } + + > separator { + margin-top: 3px; + margin-bottom: 3px; + transition: opacity 150ms ease-in-out; + + &.hidden { + opacity: 0; + } + } + + > revealer > indicator { + min-width: 2px; + border-radius: 2px; + margin: 3px 6px; + background: gtkalpha($accent_color, 0.5); + } + } + + tab { + transition: background 150ms ease-in-out; + + @if $contrast == 'high' { + &:hover, + &:active, + &:selected { + box-shadow: inset 0 0 0 1px $border_color; + } + } + + &:selected { + background-color: $selected_color; + + &:hover { background-color: $selected_hover_color; } + &:active { background-color: $selected_active_color; } + } + + &:hover { background-color: $hover_color; } + &:active { background-color: $active_color; } + } + + tabbox.single-tab tab { + &, &:hover, &:active { + background: none; + + @if $contrast == 'high' { + box-shadow: none; + } + } + } + + .start-action, + .end-action { + padding: 6px 5px; + } + + .start-action:dir(ltr), + .end-action:dir(rtl) { + padding-right: 0; + } + + .start-action:dir(rtl), + .end-action:dir(ltr) { + padding-left: 0; + } + + &.inline { + @extend %tabbar-inline; + } +} + +%tabbar-inline .box { + background-color: transparent; + color: inherit; + box-shadow: none; + padding-bottom: 0; + + &:backdrop { + background-color: transparent; + transition: none; + + > scrolledwindow, + > .start-action, + > .end-action { + filter: none; + transition: none; + } + } +} + +%tabbar-shrunk { + tabbox, + .start-action, + .end-action { + padding-top: 3px; + padding-bottom: 3px; + } +} + +dnd tab { + background-color: $headerbar_bg_color; + background-image: image($selected_active_color); + color: $headerbar_fg_color; + + box-shadow: 0 0 0 1px transparentize(black, 0.97), + 0 1px 3px 1px transparentize(black, .93), + 0 2px 6px 2px transparentize(black, .97); + + @if $contrast == 'high' { + outline: 1px solid $border_color; + outline-offset: -1px; + } + + margin: 25px; +} + +tabbar, +dnd { + tab { + min-height: 26px; + padding: 4px; + border-radius: $button_radius; + + button.image-button { + padding: 0; + margin: 0; + min-width: 24px; + min-height: 24px; + border-radius: 99px; + } + + indicator { + min-height: 2px; + border-radius: 2px; + background: gtkalpha($accent_color, 0.5); + transform: translateY(4px); + } + } +} + +tabgrid > tabgridchild { + @include focus-ring(".card", $offset: 0, $outer: true); +} + +tabthumbnail { + border-radius: $card_radius + 4px; + + > box { + margin: 6px; + } + + &:drop(active) { + box-shadow: inset 0 0 0 2px gtkalpha($drop_target_color, .4); + background-color: gtkalpha($drop_target_color, .1); + } + + transition: box-shadow 200ms $ease-out-quad, background-color $ease-out-quad; + + .needs-attention { + &:dir(ltr) { transform: translate(8px, -8px); } + &:dir(rtl) { transform: translate(-8px, -8px); } + + > widget { + background: $accent_color; + min-width: 12px; + min-height: 12px; + border-radius: 8px; + margin: 3px; + box-shadow: 0 1px 2px gtkalpha($accent_color, .4); + } + } + + .card { + picture { + outline: 1px solid $window_outline_color; + outline-offset: -1px; + border-radius: $card_radius; + } + + background: none; + color: inherit; + + @if $contrast == 'high' { + box-shadow: 0 0 0 1px transparentize(black, 0.5), + 0 1px 3px 1px transparentize(black, .93), + 0 2px 6px 2px transparentize(black, .97); + } + } + + &.pinned .card { + background-color: $thumbnail_bg_color; + color: $thumbnail_fg_color; + + @if $contrast == 'high' { + outline: 1px solid $window_outline_color; + outline-offset: -1px; + } + } + + .icon-title-box { + border-spacing: 6px; + } + + .tab-unpin-icon { + margin: 6px; + min-width: 24px; + min-height: 24px; + } + + button.circular { + margin: 6px; + background-color: gtkalpha($thumbnail_bg_color, .75); + min-width: 24px; + min-height: 24px; + + @if $contrast == 'high' { + box-shadow: 0 0 0 1px currentColor; + } + + &:hover { + background-color: gtkalpha(gtkmix($thumbnail_bg_color, currentColor, 90%), .75); + } + + &:active { + background-color: gtkalpha(gtkmix($thumbnail_bg_color, currentColor, 80%), .75); + } + } +} + +taboverview > .overview .new-tab-button { + margin: 18px; +} + +tabview:drop(active), +tabbox:drop(active), +tabgrid:drop(active) { + box-shadow: none; +} diff --git a/src/sass/libadwaita/widgets/_text-selection.scss b/src/sass/libadwaita/widgets/_text-selection.scss new file mode 100644 index 00000000..2d596f5b --- /dev/null +++ b/src/sass/libadwaita/widgets/_text-selection.scss @@ -0,0 +1,30 @@ +cursor-handle { + all: unset; + padding: 24px 20px; + + > contents { + min-width: 20px; + min-height: 20px; + border-radius: 50%; + + background-color: $accent_bg_color; + } + + &.top > contents { + border-top-right-radius: 0; + } + + &.bottom > contents { + border-top-left-radius: 0; + transform: translateX(1px); + } + + &.insertion-cursor > contents { + border-top-left-radius: 0; + transform: translateX(1px) translateY(4px) rotate(45deg); + } +} + +magnifier { + background-color: $view_bg_color; +} diff --git a/src/sass/libadwaita/widgets/_toolbars.scss b/src/sass/libadwaita/widgets/_toolbars.scss new file mode 100644 index 00000000..65653319 --- /dev/null +++ b/src/sass/libadwaita/widgets/_toolbars.scss @@ -0,0 +1,319 @@ +%toolbar { + button:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &.arrow-button, + &.image-button, + &.image-text-button { + @extend %button_basic_flat; + } + } + + &.osd button:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &:focus:focus-visible { + outline-color: $osd_focus_color; + } + } + + menubutton:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &.image-button > button { + @extend %button_basic_flat; + } + } + + .linked button:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &.arrow-button, + &.image-button, + &.image-text-button { + @extend %button_basic_raised; + } + } + + menubutton.raised > button:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &.arrow-button, + &.image-button, + &.image-text-button { + @extend %button_basic_raised; + } + } + + menubutton.suggested-action, + menubutton.destructive-action, + menubutton.opaque { + > button:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + @extend %opaque_button; + + color: inherit; + background-color: transparent; + } + } + + splitbutton:not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + @extend %flat_split_button; + } + + switch { + margin-top: 4px; + margin-bottom: 4px; + } + + // Reset styles for popovers + popover { + button:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &.arrow-button, + &.image-button, + &.image-text-button { + @extend %button_basic_raised; + } + } + + menubutton:not(.flat):not(.raised):not(.suggested-action):not(.destructive-action):not(.opaque) { + &.image-button > button { + @extend %button_basic_raised; + } + } + } +} + +.toolbar { + padding: 6px; + border-spacing: 6px; + @extend %toolbar; + + // stand-alone OSD toolbars + &.osd { + padding: 12px; + border-radius: $card_radius; + } +} + +%toolbar-shrunk { + padding-top: 3px; + padding-bottom: 3px; +} + +/**************** + * GtkSearchBar * + ****************/ + +searchbar { + > revealer > box { + padding: 6px 6px 7px 6px; + background-color: $headerbar_backdrop_color; + color: $headerbar_fg_color; + box-shadow: inset 0 -1px $headerbar_border_color; + + &:backdrop { + background-color: $headerbar_bg_color; + transition: background-color $backdrop_transition; + + > * { + filter: opacity(.5); + transition: filter $backdrop_transition; + } + } + + @extend %toolbar; + + .close { + min-width: 18px; + min-height: 18px; + padding: 4px; + border-radius: 50%; + @extend %button_basic_flat; + + &:dir(ltr) { + margin-left: 10px; + margin-right: 4px; + } + + &:dir(rtl) { + margin-left: 4px; + margin-right: 10px; + } + } + } + + &.inline { + @extend %searchbar-inline; + } +} + +%searchbar-flat > revealer > box { + background-color: transparent; + color: inherit; + box-shadow: none; + padding-bottom: 6px; +} + +%searchbar-inline { + @extend %searchbar-flat; + + > revealer > box:backdrop { + background-color: transparent; + transition: none; + + > * { + filter: none; + transition: none; + } + } +} + +%searchbar-shrunk > revealer > box { + padding-top: 3px; + padding-bottom: 3px; +} + +/**************** + * GtkActionBar * + ****************/ + +actionbar > revealer > box { + background-color: $headerbar_backdrop_color; + color: $headerbar_fg_color; + box-shadow: inset 0 1px $headerbar_border_color; + padding: 7px 6px 6px 6px; + @extend %toolbar; + + &, > box.start, > box.end { + border-spacing: $base_padding; + } + + &:backdrop { + background-color: $headerbar_bg_color; + transition: background-color $backdrop_transition; + + > * { + filter: opacity(.5); + transition: filter $backdrop_transition; + } + } +} + +%actionbar-inline > revealer > box { + background-color: transparent; + color: inherit; + box-shadow: none; + padding-top: $base_padding; + + &:backdrop { + background-color: transparent; + transition: none; + + > * { + filter: none; + transition: none; + } + } +} + +%actionbar-shrunk > revealer > box { + padding-top: $base_padding / 2; + padding-bottom: $base_padding / 2; +} + +/************* + * AdwBanner * + *************/ +banner > revealer > widget { + /* There are 2 more instances in _sidebars.css, keep in sync with that */ + background-color: gtkmix($accent_bg_color, $window_bg_color, 30%); + color: $window_fg_color; + padding: $base_padding; + + &:backdrop { + background-color: gtkmix($accent_bg_color, $window_bg_color, 15%); + transition: background-color $backdrop_transition; + + > label, > button { + filter: opacity(.5); + transition: filter $backdrop_transition; + } + } +} + +/****************** + * AdwToolbarView * + ******************/ +toolbarview { + > .top-bar, + > .bottom-bar { + headerbar { @extend %headerbar-inline; } + searchbar { @extend %searchbar-inline; } + actionbar { @extend %actionbar-inline; } + menubar { @extend %menubar-inline; } + tabbar { @extend %tabbar-inline; } + + .collapse-spacing { + padding-top: $base_padding / 2; + padding-bottom: $base_padding / 2; + + headerbar { @extend %headerbar-shrunk; } + searchbar { @extend %searchbar-shrunk; } + actionbar { @extend %actionbar-shrunk; } + menubar { @extend %menubar-shrunk; } + .toolbar { @extend %toolbar-shrunk; } + tabbar { @extend %tabbar-shrunk; } + + viewswitcherbar { @extend %viewswitcherbar-shrunk; } + } + } + + &.undershoot-top scrolledwindow { @include undershoot(top); } + &.undershoot-bottom scrolledwindow { @include undershoot(bottom); } + + window.devel & > .top-bar { + background-image: cross-fade(5% -gtk-recolor(url("assets/devel-symbolic.svg")), + image(transparent)); + background-repeat: repeat-x; + } + + window.devel dialog & > .top-bar { + background-image: unset; + background-repeat: unset; + } + + > .top-bar, + > .bottom-bar { + background-color: $headerbar_backdrop_color; + color: $headerbar_fg_color; + + &:backdrop { + background-color: $headerbar_bg_color; + transition: background-color $backdrop_transition; + + > windowhandle { + filter: opacity(.5); + transition: filter $backdrop_transition; + } + } + } + + > .top-bar { + box-shadow: 0 1px $border_color; + + &.border { + box-shadow: 0 1px $border_color; + } + } + + > .bottom-bar { + box-shadow: 0 -1px $border_color; + + &.border { + box-shadow: 0 -1px $border_color; + } + } + + .sidebar-pane &, + .content-pane &, + .about & { // reset + > .top-bar, + > .bottom-bar { + box-shadow: none; + + &, &:backdrop { + background-color: transparent; + } + } + } +} diff --git a/src/sass/libadwaita/widgets/_tooltip.scss b/src/sass/libadwaita/widgets/_tooltip.scss new file mode 100644 index 00000000..2ed45776 --- /dev/null +++ b/src/sass/libadwaita/widgets/_tooltip.scss @@ -0,0 +1,20 @@ +tooltip { + &.background { + // background-color needs to be set this way otherwise it gets drawn twice + // see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details. + background-color: transparentize(black, 0.2); + background-clip: padding-box; + border: 1px solid $tooltip_border_color; // this subtle border is meant to + // not make the tooltip melt with + // very dark backgrounds + color: white; + } + + padding: 6px 10px; + border-radius: 9px; + box-shadow: none; // otherwise it gets inherited by windowframe.csd + + > box { + border-spacing: $base_padding; + } +} diff --git a/src/sass/libadwaita/widgets/_view-switcher.scss b/src/sass/libadwaita/widgets/_view-switcher.scss new file mode 100644 index 00000000..afc708fd --- /dev/null +++ b/src/sass/libadwaita/widgets/_view-switcher.scss @@ -0,0 +1,123 @@ +viewswitcher { + border-spacing: 3px; + + &.narrow { + margin-top: -3px; + margin-bottom: -3px; + min-height: 6px; + } + + button.toggle { + padding: 0; + + > stack > box { + &.narrow { + font-size: 0.75rem; + padding-top: 4px; + + > label { + min-height: 18px; + padding-left: 3px; + padding-right: 3px; + padding-bottom: 2px; + } + } + + &.wide { + padding: 2px 12px; + border-spacing: 6px; + } + } + } +} + +/********************** + * AdwViewSwitcherBar * + **********************/ + +viewswitcherbar actionbar > revealer > box { + padding-left: 0; + padding-right: 0; + padding-top: 7px; +} + +%viewswitcherbar-shrunk actionbar > revealer > box { + // Not 0px because view switcher has negative margin + padding-top: 6px; +} + +/************************ + * AdwViewSwitcherTitle * + ************************/ + +viewswitchertitle { + margin-top: -6px; + margin-bottom: -6px; + + viewswitcher { + margin-left: 12px; + margin-right: 12px; + + &.narrow { + margin-top: 3px; + margin-bottom: 3px; + } + + &.wide { + margin-top: 6px; + margin-bottom: 6px; + } + } + + windowtitle { + margin-top: 0; + margin-bottom: 0; + } +} + +/******************* + * AdwIndicatorBin * + *******************/ + +indicatorbin { + > indicator, > mask { + min-width: 6px; + min-height: 6px; + border-radius: 100px; + } + + > indicator { + margin: 1px; + background: gtkalpha(currentColor, .4); + } + + > mask { + padding: 1px; + background: black; + } + + &.needs-attention > indicator { + background: $accent_color; + } + + &.badge { + > indicator, + > mask { + min-height: 13px; + } + + > indicator > label { + font-size: 0.6rem; + font-weight: bold; + padding-left: 4px; + padding-right: 4px; + color: white; + } + + &.needs-attention > indicator { + background: $accent_bg_color; + + > label { color: $accent_fg_color; } + } + } +} diff --git a/src/sass/libadwaita/widgets/_views.scss b/src/sass/libadwaita/widgets/_views.scss new file mode 100644 index 00000000..8dd24e48 --- /dev/null +++ b/src/sass/libadwaita/widgets/_views.scss @@ -0,0 +1,80 @@ +.view, +%view { + color: $view_fg_color; + background-color: $view_bg_color; + + &:disabled { + color: gtkalpha(currentColor, .5); + background-color: gtkmix($window_bg_color, $view_bg_color, 60%); + } + + &:selected { + &:focus, & { + background-color: $view_selected_color; + + border-radius: $button_radius; + } + } +} + +// window.view { // reset +// color: $window_fg_color; +// background-color: $window_bg_color; +// } + +textview { + caret-color: currentColor; + + > text { + @extend %view; + + background-color: transparent; + } + + > border { + background-color: gtkmix($window_bg_color, $view_bg_color, 50%); + } + + &:drop(active) { + caret-color: $drop_target_color; + } +} + +rubberband { + border: 1px solid $accent_color; + background-color: gtkalpha($accent_color, 0.2); +} + +flowbox > flowboxchild, +gridview > child { + padding: 3px; + border-radius: $button_radius; + + @include focus-ring(); + + &:selected { + background-color: $view_selected_color; + + @if $contrast == 'high' { + box-shadow: inset 0 0 0 1px $border_color; + } + } +} + +gridview > child.activatable { + &:hover { background-color: $view_hover_color; } + + &:active { background-color: $view_active_color; } + + &:selected { + &:hover { background-color: $view_selected_hover_color; } + + &:active { background-color: $view_selected_active_color; } + } + + @if $contrast == 'high' { + &:hover, &:active { + box-shadow: inset 0 0 0 1px $border_color; + } + } +} diff --git a/src/sass/libadwaita/widgets/_window.scss b/src/sass/libadwaita/widgets/_window.scss new file mode 100644 index 00000000..9352bf64 --- /dev/null +++ b/src/sass/libadwaita/widgets/_window.scss @@ -0,0 +1,71 @@ + +window { + border: none; + + &.csd { + margin: 0; + border-radius: $window_radius; + outline: 1px solid $window_outline_color; + outline-offset: -1px; + + @if $rimless == 'true' { + box-shadow: $shadow-z16, + 0 0 36px transparent; + } @else { + box-shadow: $shadow-z16, + 0 0 36px transparent, + 0 0 0 1px $headerbar_darker_shade_color; + } + + &:backdrop { + // the transparent shadow here is to enforce that the shadow extents don't + // change when we go to backdrop, to prevent jumping windows. + // The biggest shadow should be in the same order then in the active state + // or the jumping will happen during the transition. + transition: box-shadow $backdrop_transition; + + @if $rimless == 'true' { + box-shadow: $shadow-z4, + 0 0 36px transparent; + } @else { + box-shadow: $shadow-z4, + 0 0 36px transparent, + 0 0 0 1px $headerbar_darker_shade_color; + } + } + + // &.dialog.message, + // &.messagedialog { } + + &.tiled, + &.tiled-top, + &.tiled-left, + &.tiled-right, + &.tiled-bottom { + border-radius: 0; + outline: none; + } + + &.maximized, + &.fullscreen { + border-radius: 0; + outline: none; + box-shadow: none; + transition: none; + } + } + + &.solid-csd { + margin: 0; + padding: 2px; + border-radius: 0; + background-color: $headerbar_bg_color; + border: 1px solid $headerbar_darker_shade_color; + } + + // server-side decorations as used by mutter + &.ssd { + // just doing borders, wm draws actual shadows + box-shadow: 0 0 0 1px $headerbar_darker_shade_color; + } +}