_common.scss
ASCII text
1$asset_suffix: if($variant=='dark', '-dark', ''); 2$extra_background_clip: if($variant == 'light', padding-box, border-box); 3 4$small_size: if($laptop == 'true', 20px, 24px); 5$medium_size: if($laptop == 'true', 32px, 36px); 6$large_size: if($laptop == 'true', 44px, 48px); 7 8$container_padding: 6px; 9 10$bar_size: 4px; 11$menuitem_size: 28px; 12 13$md_radius: 2px; 14$circular_radius: 100px; 15 16$shorter_duration: 0.2s; 17$longer_duration: 0.3s; 18 19$standard_curve: cubic-bezier(0.4, 0.0, 0.2, 1); 20$deceleration_curve: cubic-bezier(0.0, 0.0, 0.2, 1); 21$acceleration_curve: cubic-bezier(0.4, 0.0, 1, 1); 22$sharp_curve: cubic-bezier(0.4, 0.0, 0.6, 1); 23 24$shorter_transition: all $shorter_duration $deceleration_curve; 25$longer_transition: all $longer_duration $deceleration_curve; 26$shadow_transition: box-shadow $shorter_duration $deceleration_curve; 27 28* { 29padding: 0; 30background-clip: padding-box; 31 32-GtkToolButton-icon-spacing: 4; 33-GtkTextView-error-underline-color: $error_color; 34 35// The size for scrollbars. The slider is 2px smaller, but we keep it 36// up so that the whole area is sensitive to button presses for the 37// slider. The stepper button is larger in both directions, the slider 38// only in the width 39 40-GtkScrolledWindow-scrollbar-spacing: 0; 41 42-GtkToolItemGroup-expander-size: 11; 43 44-GtkWidget-text-handle-width: 24; 45-GtkWidget-text-handle-height: 24; 46 47-GtkDialog-button-spacing: 4; 48-GtkDialog-action-area-border: 0; 49 50// We use the outline properties to signal the focus properties 51// to the adwaita engine: using real CSS properties is faster, 52// and we don't use any outlines for now. 53 54outline-style: solid; 55outline-width: 2px; 56outline-color: $track_color; 57outline-offset: -4px; 58-gtk-outline-radius: 2px; 59 60-gtk-secondary-caret-color: $primary_color; 61} 62 63 64/*************** 65* Base States * 66***************/ 67.background { 68background-color: $bg_color; 69color: $fg_color; 70} 71 72/* 73These wildcard seems unavoidable, need to investigate. 74Wildcards are bad and troublesome, use them with care, 75or better, just don't. 76Everytime a wildcard is used a kitten dies, painfully. 77*/ 78 79*:disabled { -gtk-icon-effect: dim; } 80 81.gtkstyle-fallback { 82background-color: $bg_color; 83color: $fg_color; 84 85&:hover { 86background-color: darken($bg_color, 5%); 87color: $fg_color; 88} 89 90&:active { 91background-color: darken($bg_color, 10%); 92color: $fg_color; 93} 94 95&:disabled { 96background-color: $bg_color; 97color: $disabled_fg_color; 98} 99 100&:selected { 101background-color: $primary_color; 102color: $inversed_fg_color; 103} 104} 105 106.view, 107%view { 108@extend row.activatable; 109 110background-color: $base_color; 111color: $fg_color; 112 113&:hover, &:active, &:selected { border-radius: 2px; } 114 115&:disabled { 116// background-color: $alt_base_color; 117color: $disabled_fg_color; 118} 119 120&:selected { @extend %selected_items; } 121} 122 123.view, 124textview { 125text { 126// @extend %view; 127 128background-color: $base_color; 129color: $fg_color; 130 131&:disabled { 132// background-color: $alt_base_color; 133color: $disabled_fg_color; 134} 135 136selection { @extend %selected_items; } 137} 138} 139 140textview border { 141background-color: $alt_base_color; 142color: $tertiary_fg_color; 143} 144 145iconview { @extend .view; } 146 147.rubberband, 148rubberband { 149border: 1px solid $alt_primary_color; 150background-color: scale-alpha($alt_primary_color, $lower_opacity); 151} 152 153flowbox { 154rubberband { @extend rubberband; } 155 156flowboxchild { 157outline-offset: -2px; 158padding: 4px; 159border-radius: 2px; 160 161&:selected { @extend %selected_items; } 162} 163} 164 165label { 166caret-color: currentColor; // this shouldn't be needed. 167 168&.separator { 169@extend .dim-label; 170 171color: $fg_color; 172} 173 174row:selected &, 175&:selected { @extend %nobg_selected_items; } 176 177selection { 178background-color: $primary_color; 179color: $inversed_fg_color; 180} 181 182&:disabled { 183color: $disabled_fg_color; 184 185selection { @extend %selected_items:disabled; } 186} 187} 188 189.dim-label { opacity: $hint_opacity; } 190 191assistant { 192.sidebar { 193padding: 4px 0; 194// background-color: $base_color; 195// border-top: 1px solid $borders_color; 196} 197 198// &.csd .sidebar { border-top-style: none; } 199 200.sidebar label { 201min-height: $medium_size; 202padding: 0 12px; 203color: $tertiary_fg_color; 204font-weight: 500; 205 206&.highlight { color: $fg_color; } 207} 208} 209 210%osd, .osd { opacity: $higher_opacity; } 211 212 213/********************* 214* Spinner Animation * 215*********************/ 216@keyframes spin { 217to { -gtk-icon-transform: rotate(1turn); } 218} 219 220@keyframes spin_colors { 2211% { color: $info_bg_color; } 25% { color: $info_bg_color; } 22226% { color: $question_bg_color; } 50% { color: $question_bg_color; } 22351% { color: $warning_bg_color; } 75% { color: $warning_bg_color; } 22476% { color: $error_bg_color; } 100% { color: $error_bg_color; } 225} 226 227spinner { 228background: none; 229opacity: 0; // non spinning spinner makes no sense 230-gtk-icon-source: -gtk-icontheme('process-working-symbolic'); 231 232&:checked { 233opacity: 1; 234animation: spin 1s linear infinite, spin_colors 4s linear infinite; 235 236&:disabled { opacity: $disabled_opacity; } 237} 238} 239 240 241/**************** 242* Text Entries * 243****************/ 244%entry, 245entry { 246%entry_basic, & { 247min-height: $medium_size; 248padding: 0 8px; 249border-radius: 2px; 250 251@include entry(normal); 252 253&:focus { @include entry(focus); } 254 255&:disabled { @include entry(disabled); } 256 257&.flat { 258border-radius: 0; 259 260@include entry(flat-normal); 261 262&:focus { @include entry(flat-focus); } 263 264&:disabled { @include entry(flat-disabled); } 265} 266 267image { // icons inside the entry 268// @extend %simple_flat_button; 269 270min-height: $small_size; 271min-width: $small_size; 272-gtk-outline-radius: $circular_radius; 273border-radius: $circular_radius; 274color: gtkalpha(currentColor, $enabled_opacity); 275 276&:hover, &:active { color: currentColor; } 277 278&:disabled { color: gtkalpha(currentColor, $hint_opacity); } 279 280&.left { margin-left: -2px; margin-right: 2px; } 281 282&.right { margin-left: 2px; margin-right: -2px; } 283} 284 285undershoot { 286&.left { @include undershoot(left); } 287 288&.right { @include undershoot(right); } 289} 290 291selection { @extend %selected_items; } 292 293// entry error and warning style 294@each $e_type, $e_color in (error, $error_color), 295(warning, $warning_color) { 296&.#{$e_type} { 297@include entry(normal, $e_color); 298 299&:focus { @include entry(focus, $e_color); } 300 301&:disabled { @include entry(disabled, $e_color); } 302 303&.flat { 304@include entry(flat-normal, $e_color); 305 306&:focus { @include entry(flat-focus, $e_color); } 307 308&:disabled { @include entry(flat-disabled, $e_color); } 309} 310} 311} 312 313&:drop(active) { 314// box-shadow: inset 0 0 0 2px $accent_color; 315} 316 317.osd & { 318} 319} 320 321progress { 322margin: 2px (2px - 8px); 323border-style: none none solid; 324border-width: 2px; 325border-color: $primary_color; 326// border-radius: 0; 327// box-shadow: none; 328background-color: transparent; 329// background-image: none; 330} 331 332// linked entries 333.linked:not(.vertical) > & { @extend %linked; } 334 335// Vertically linked entries 336.linked.vertical > & { @extend %linked_vertical; } 337 338.linked:not(.vertical) > &.flat, 339.linked.vertical > &.flat { border-radius: 0; } 340} 341 342treeview entry { 343&.flat, & { 344min-height: 0; 345padding: 2px; 346border-radius: 0; 347background-color: $base_color; 348 349&, &:focus { 350border-image: none; 351box-shadow: none; 352} 353} 354} 355 356 357/*********** 358* Buttons * 359***********/ 360// stuff for .needs-attention 361@keyframes needs_attention { 362from { 363background-image: -gtk-gradient(radial, 364center center, 0, 365center center, 0.001, 366to($accent_color), 367to(transparent)); 368} 369 370to { 371background-image: -gtk-gradient(radial, 372center center, 0, 373center center, 0.5, 374to($accent_color), 375to(transparent)); 376} 377} 378 379%button, 380button { 381@at-root %button_basic, & { 382min-height: 24px; 383min-width: 16px; 384padding: ($medium_size - 24px) / 2 ($medium_size - 16px) / 2; 385border-radius: 2px; 386font-weight: 500; 387 388@include button(normal); 389 390&:hover { @include button(hover); } 391 392&:active { @include button(active); } 393 394&:disabled { @include button(disabled); } 395 396&:checked { @include button(checked); } 397 398&:checked:disabled { @include button(checked-disabled); } 399 400@at-root %flat_button, &.flat { 401@at-root %simple_flat_button, & { 402@include button(flat-normal); 403 404&:hover { @include button(flat-hover); } 405 406&:active { @include button(flat-active); } 407 408&:disabled { @include button(flat-disabled); } 409} 410 411&:checked { @include button(flat-checked); } 412 413&:checked:disabled { @include button(flat-checked-disabled); } 414} 415 416&.image-button { 417min-width: 24px; 418padding: ($medium_size - 24px) / 2; 419-gtk-outline-radius: $circular_radius; 420border-radius: $circular_radius; 421} 422 423&.text-button { 424padding-left: 16px; 425padding-right: 16px; 426} 427 428&.text-button.image-button { 429padding-left: ($medium_size - 16px) / 2; 430padding-right: ($medium_size - 16px) / 2; 431-gtk-outline-radius: 2px; 432border-radius: 2px; 433 434label { 435&:last-child { padding-left: 2px; padding-right: 16px - ($medium_size - 16px) / 2; } 436&:first-child { padding-left: 16px - ($medium_size - 16px) / 2; padding-right: 2px; } 437} 438} 439 440.linked > & { @extend %linked; } 441 442.linked.vertical > & { @extend %linked_vertical; } 443 444.linked > &.flat, 445.linked.vertical > &.flat { 446border-radius: 2px; 447 448&.image-button { 449-gtk-outline-radius: $circular_radius; 450border-radius: $circular_radius; 451} 452 453&.text-button.image-button { 454-gtk-outline-radius: 2px; 455border-radius: 2px; 456} 457} 458 459&:drop(active) { 460// box-shadow: inset 0 0 0 2px $accent_color; 461} 462} 463 464@at-root %button_selected, row:selected & { 465&:disabled { color: $disabled_secondary_inversed_fg_color; } 466} 467 468// big standalone buttons like in Documents pager 469&.osd { 470padding: ($large_size - 24px) / 2 ($large_size - 16px) / 2; 471 472&.image-button { padding: ($large_size - 24px) / 2; } 473 474&:disabled { opacity: 0; } 475} 476 477//overlay / OSD style 478@at-root %osd_button, 479.osd & { 480} 481 482// Suggested and Destructive Action buttons 483@each $b_type, $b_color in (suggested-action, $suggested_color), 484(destructive-action, $destructive_color) { 485&.#{$b_type} { 486background-color: $b_color; 487color: $inversed_fg_color; 488 489// @include button(normal, $b_color, $inversed_fg_color); 490 491// &:hover { @include button(hover, $b_color, $inversed_fg_color); } 492 493// &:active, &:checked { @include button(active, $b_color, $inversed_fg_color); } 494 495&:disabled { @include button(disabled, $b_color, $inversed_fg_color); } 496 497&:checked { background-color: mix($inversed_fg_color, $b_color, percentage($lower_opacity)); } 498 499&.flat { 500background-color: transparent; 501color: $b_color; 502 503// @include button(flat-normal, $b_color, $inversed_fg_color); 504 505// &:hover { @include button(flat-hover, $b_color, $inversed_fg_color); } 506 507// &:active, &:checked { @include button(flat-active, $b_color, $inversed_fg_color); } 508 509&:disabled { @include button(flat-disabled, $b_color, $inversed_fg_color); } 510} 511 512.osd & { 513} 514} 515} 516 517.stack-switcher > & { 518// to position the needs attention dot, padding is added to the button 519// child, a label needs just lateral padding while an icon needs vertical 520// padding added too. 521 522outline-offset: -4px; // needs to be set or it gets overriden by GtkRadioButton outline-offset 523 524> label { 525padding-left: 6px; // label padding 526padding-right: 6px; // 527} 528 529> image { 530padding-left: 6px; // image padding 531padding-right: 6px; // 532padding-top: 3px; // 533padding-bottom: 3px; // 534} 535 536&.text-button { 537// compensate text-button paddings 538padding-left: 16px - 6px; 539padding-right: 16px - 6px; 540} 541 542&.image-button { 543// we want image buttons to have a 1:1 aspect ratio, so compensation 544// of the padding added to the GtkImage is needed 545padding-left: ($medium_size - 16px) / 2 - 6px; 546padding-right: ($medium_size - 16px) / 2 - 6px; 547} 548 549&.needs-attention { 550> label, 551> image { @extend %needs_attention; } 552 553&:checked { 554> label, 555> image { 556animation: none; 557background-image: none; 558} 559} 560} 561} 562 563// hide separators 564separator { 565min-width: 0; 566min-height: 0; 567background: transparent; 568} 569 570// &.font, 571// &.file { separator { background-color: transparent; }} 572 573// &.font { > box > box > label { font-weight: bold; }} 574 575// inline-toolbar buttons 576.inline-toolbar & { 577@extend %button_basic.flat; 578 579&:not(.text-button) { @extend %circular_button; } 580} 581 582.primary-toolbar & { -gtk-icon-shadow: none; } // tango icons don't need shadows 583} 584 585%needs_attention { 586animation: needs_attention $longer_duration $deceleration_curve forwards; 587background-repeat: no-repeat; 588background-position: right 3px; 589background-size: 6px 6px; 590 591&:dir(rtl) { background-position: left 3px; } 592} 593 594// all the following is for the +|- buttons on inline toolbars, that way 595// should really be deprecated... 596.inline-toolbar toolbutton > button { // redefining the button look is 597// needed since those are flat... 598} 599 600// More inline toolbar buttons 601toolbar.inline-toolbar toolbutton { 602// > button.flat { @extend %linked_middle; } 603 604// &:first-child > button.flat { @extend %linked:first-child; } 605 606// &:last-child > button.flat { @extend %linked:last-child; } 607 608// &:only-child > button.flat { @extend %linked:only-child; } 609} 610 611%linked_middle { 612-gtk-outline-radius: 2px; 613border-radius: 0; 614} 615 616%linked { 617@extend %linked_middle; 618 619&:first-child { 620border-top-left-radius: 2px; 621border-bottom-left-radius: 2px; 622} 623 624&:last-child { 625border-top-right-radius: 2px; 626border-bottom-right-radius: 2px; 627} 628 629&:only-child { 630border-radius: 2px; 631} 632} 633 634%linked_vertical_middle { 635-gtk-outline-radius: 2px; 636border-radius: 0; 637} 638 639%linked_vertical{ 640@extend %linked_vertical_middle; 641 642&:first-child { 643border-top-left-radius: 2px; 644border-top-right-radius: 2px; 645} 646 647&:last-child { 648border-bottom-left-radius: 2px; 649border-bottom-right-radius: 2px; 650} 651 652&:only-child { 653border-radius: 2px; 654} 655} 656 657/* menu buttons */ 658modelbutton.flat, 659.menuitem.button.flat { 660min-height: $menuitem_size; 661padding: 0 8px; 662border-radius: 2px; 663color: inherit; 664 665@extend %simple_flat_button; 666 667&:selected { @extend %selected_items; } 668 669check, 670radio { 671&:not(:checked):not(:indeterminate) { color: gtkalpha(currentColor, $hint_opacity); } 672 673&, &:hover { background-image: none; } 674 675&:active { animation: none; } 676 677&:last-child { margin-left: -8px; margin-right: -16px; } 678 679&:first-child { margin-left: -16px; margin-right: -8px; } 680} 681 682check:not(:indeterminate):checked { @extend %check_checked; } 683 684// radio:not(:indeterminate):checked { @extend %radio_checked; } 685 686check:indeterminate:checked, radio:indeterminate:checked { @extend %indeterminate_checked; } 687} 688 689modelbutton.flat arrow { 690background: none; 691 692&:hover { background: none; } 693 694&.left { -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); } 695 696&.right { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); } 697} 698 699button.color { 700min-height: $small_size; 701min-width: $small_size; 702padding: $container_padding; 703 704colorswatch:only-child { 705// &, overlay { border-radius: 0; } 706} 707} 708 709 710/********* 711* Links * 712*********/ 713*:link { 714&, &:hover, &:active { color: $link_color; } 715 716&:visited { 717&, &:hover, &:active { color: $link_visited_color; } 718} 719 720@at-root %link_selected, 721&:selected, 722*:selected & { color: $inversed_fg_color; } 723} 724 725button:link, 726button:visited { 727@extend *:link; 728 729> label { text-decoration-line: underline; } 730} 731 732/***************** 733* GtkSpinButton * 734*****************/ 735spinbutton { 736&:not(.vertical) { 737// in this horizontal configuration, the whole spinbutton 738// behaves as the entry, so we extend the entry styling 739// and nuke the style on the internal entry 740@extend %entry; 741 742padding: 0; 743 744%spinbutton_entry, 745entry { 746min-width: $large_size - 8px * 2; 747// reset all the other props since the spinbutton node is styled here 748margin: 0; 749border-image: none; 750border-radius: 0; 751box-shadow: none; 752background-color: transparent; 753} 754 755button { 756// margin: $container_padding; 757border: solid $container_padding transparent; 758 759@extend %simple_flat_button; 760 761@extend %small_button; 762 763&.up:dir(ltr), 764&.down:dir(rtl) { margin-left: -$container_padding / 2; } 765 766&.up:dir(rtl), 767&.down:dir(ltr) { margin-right: -$container_padding / 2; } 768} 769} 770 771// OSD horizontal 772.osd &:not(.vertical) { 773button { 774} 775} 776 777// Vertical 778&.vertical { 779// in the vertical configuration, we treat the spinbutton 780// as a box, and tweak the style of the entry in the middle 781// so that it's linked 782 783// FIXME: this should not be set at all, but otherwise it gets the wrong 784// color 785&:disabled { color: $disabled_fg_color; } 786 787&:drop(active) { 788box-shadow: none; 789} 790 791entry { 792min-height: $medium_size; 793min-width: $large_size; 794padding: 0; 795} 796 797button { 798min-height: $medium_size; 799min-width: $large_size; 800padding: 0; 801 802@extend %simple_flat_button; 803 804&.up { border-radius: 2px 2px 0 0; } 805 806&.down { border-radius: 0 0 2px 2px; } 807} 808} 809 810// OSD vertical 811.osd &.vertical button:first-child { 812} 813 814// Misc 815treeview &:not(.vertical) { 816min-height: 0; 817border-style: none; 818border-radius: 0; 819 820entry { 821min-height: 0; 822padding: 1px 2px; 823} 824} 825} 826 827 828/************** 829* ComboBoxes * 830**************/ 831combobox { 832arrow { 833-gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); 834min-height: 16px; 835min-width: 16px; 836} 837 838menu, 839.menu, 840.context-menu { 841padding: 2px 0; 842 843menuitem { 844min-height: $medium_size; 845padding: 0 ($medium_size - 16px) / 2; 846} 847} 848 849&.linked { 850button:nth-child(2) { 851&:dir(ltr) { @extend %linked:last-child; } 852&:dir(rtl) { @extend %linked:first-child; } 853} 854} 855 856&:drop(active) { // FIXME: untested 857box-shadow: none; 858 859// button.combo { @extend %button_basic:drop(active); } 860} 861} 862 863.linked > combobox > box > button.combo { 864// the combo is a composite widget so the way we do button linking doesn't 865// work, special case needed. See 866// https://bugzilla.gnome.org/show_bug.cgi?id=733979 867 868&:dir(ltr), 869&:dir(rtl) { @extend %linked_middle; } // specificity bump 870} 871 872.linked:not(.vertical) > combobox:first-child > box > button.combo { @extend %linked:first-child; } 873.linked:not(.vertical) > combobox:last-child > box > button.combo { @extend %linked:last-child; } 874.linked:not(.vertical) > combobox:only-child > box > button.combo { @extend %linked:only-child; } 875 876.linked.vertical > combobox > box > button.combo { @extend %linked_vertical_middle; } 877.linked.vertical > combobox:first-child > box > button.combo { @extend %linked_vertical:first-child;} 878.linked.vertical > combobox:last-child > box > button.combo { @extend %linked_vertical:last-child; } 879.linked.vertical > combobox:only-child > box > button.combo { @extend %linked_vertical:only-child; } 880 881 882/************ 883* Toolbars * 884************/ 885toolbar { 886-GtkWidget-window-dragging: true; 887padding: $container_padding / 2; 888background-color: $bg_color; 889 890// on OSD 891.osd & { background-color: transparent; } 892 893// stand-alone OSD toolbars 894&.osd { 895transition: $shadow_transition; 896padding: $container_padding; 897border-radius: 2px; 898box-shadow: $z-depth-2; 899background-color: $base_color; 900 901&:backdrop { box-shadow: $z-depth-1; } 902 903&.left, 904&.right, 905&.top, 906&.bottom { border-radius: 0; } // positional classes for `attached` osd toolbars 907 908button { @extend %button_basic.flat; } 909} 910 911// toolbar separators 912&.horizontal separator { margin: $container_padding / 2; } 913&.vertical separator { margin: $container_padding / 2; } 914 915&:not(.inline-toolbar):not(.osd) { 916scale, 917entry, 918spinbutton, 919button { margin: $container_padding / 2; } 920 921switch { margin: ($container_padding / 2 + $container_padding) ($container_padding / 2); } 922} 923} 924 925//searchbar, location-bar & inline-toolbar 926.inline-toolbar { 927padding: $container_padding; 928border-style: solid; 929border-width: 0 1px 1px; 930border-color: $borders_color; 931background-color: $alt_base_color; 932} 933 934searchbar, 935.location-bar { 936padding: $container_padding; 937border-style: solid; 938border-width: 0 0 1px; 939border-color: $borders_color; 940background-color: $bg_color; 941background-clip: border-box; 942} 943 944 945/*************** 946* Header bars * 947***************/ 948%titlebar, 949headerbar { 950transition: background-color $shorter_duration $deceleration_curve; 951min-height: $large_size; 952padding: 0 $container_padding; 953box-shadow: $z-depth-1, inset 0 1px $secondary_highlight_color; 954background-color: $headerbar_color; 955color: $inversed_fg_color; 956 957&:backdrop { 958color: $secondary_inversed_fg_color; 959} 960 961.title { 962transition: $longer_transition; 963padding: 0 12px; 964font-weight: bold; 965} 966 967.subtitle { 968transition: $longer_transition; 969padding: 0 12px; 970font-size: smaller; 971 972@extend .dim-label; 973} 974 975button:not(.suggested-action):not(.destructive-action) { 976@extend %button_basic.flat; 977 978border-image: radial-gradient(circle closest-corner at center calc(100% - 1px), 979currentColor 0%, 980transparent 0%) 9810 0 0 / 0 0 0px; 982 983&:checked { 984border-image: radial-gradient(circle closest-corner at center calc(100% - 1px), 985currentColor 100%, 986transparent 0%) 9870 0 2 / 0 0 2px; 988 989&, &:disabled { background-color: transparent; } 990} 991} 992 993button.suggested-action, button.destructive-action { 994&:disabled { 995color: gtkalpha(currentColor, $disabled_opacity); 996 997> label { color: inherit; } 998} 999} 1000 1001&.selection-mode { 1002transition: background-color 0 $longer_duration; 1003animation: header_ripple_effect $longer_duration $deceleration_curve; 1004// box-shadow: $z-depth-1, inset 0 1px $secondary_highlight_color; 1005background-color: $primary_color; 1006color: $inversed_fg_color; 1007 1008&:backdrop { 1009color: $secondary_inversed_fg_color; 1010} 1011 1012.subtitle:link { @extend *:link:selected; } 1013 1014button:not(.suggested-action):not(.destructive-action) { 1015border-image: radial-gradient(circle closest-corner at center calc(100% - 1px), 1016currentColor 0%, 1017transparent 0%) 10180 0 0 / 0 0 0px; 1019color: currentColor; 1020 1021&:disabled { 1022color: gtkalpha(currentColor, $disabled_opacity); 1023 1024> label { color: inherit; } 1025} 1026 1027&:checked { 1028border-image: radial-gradient(circle closest-corner at center calc(100% - 1px), 1029currentColor 100%, 1030transparent 0%) 10310 0 2 / 0 0 2px; 1032color: currentColor; 1033 1034&:disabled { 1035color: gtkalpha(currentColor, $disabled_opacity); 1036 1037> label { color: inherit; } 1038} 1039} 1040} 1041 1042.selection-menu { 1043padding-left: 16px; 1044padding-right: 16px; 1045 1046GtkArrow { -GtkArrow-arrow-scaling: 1; } 1047 1048.arrow { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } 1049} 1050} 1051 1052.fullscreen &, 1053.tiled &, 1054.maximized & { 1055border-radius: 0; // squared corners when the window is fullscreen, maximized or tiled 1056box-shadow: $z-depth-1; 1057} 1058 1059&.default-decoration { 1060min-height: $small_size; 1061padding: $container_padding; 1062border-width: 0; 1063 1064button.titlebutton { 1065min-height: $small_size; 1066min-width: $small_size; 1067margin: 0; 1068padding: 0; 1069 1070&:active { // add fallback 1071background-image: radial-gradient(circle farthest-corner at center, 1072gtkalpha(currentColor, $lower_opacity / 2) 100%, 1073transparent 0%), 1074image(gtkalpha(currentColor, $lower_opacity / 2)); 1075} 1076} 1077} 1078 1079.solid-csd & { 1080&:dir(rtl), &:dir(ltr) { // specificity bump 1081margin-left: -2px; 1082margin-right: -2px; 1083margin-top: -2px; 1084// border-radius: 0; 1085box-shadow: inset 0 1px $secondary_highlight_color; 1086} 1087} 1088} 1089 1090headerbar { 1091// add vertical margins to common widget on the headerbar to avoid them spanning the whole height 1092entry, 1093spinbutton, 1094// separator, 1095button { 1096margin-top: $container_padding; 1097margin-bottom: $container_padding; 1098} 1099 1100switch { 1101margin-top: $container_padding * 2; 1102margin-bottom: $container_padding * 2; 1103} 1104} 1105 1106.background:not(.tiled):not(.maximized):not(.fullscreen) .titlebar { 1107border-top-left-radius: 2px; 1108border-top-right-radius: 2px; 1109} 1110 1111headerbar { 1112window:not(.tiled):not(.maximized):not(.fullscreen) separator:first-child + &, // tackles the paned container case 1113window:not(.tiled):not(.maximized):not(.fullscreen) &:first-child { border-top-left-radius: 2px; } 1114 1115window:not(.tiled):not(.maximized):not(.fullscreen) &:last-child { border-top-right-radius: 2px; } 1116} 1117 1118.titlebar:not(headerbar) { 1119window.csd > & { 1120// in csd we assume every titlebar is a headerbar so reset anything, this is needed for split toolbars cases 1121padding: 0; 1122background-color: transparent; 1123background-image: none; 1124border-style: none; 1125box-shadow: none; 1126} 1127 1128> separator { 1129background-color: $headerbar_color; 1130background-image: image($borders_color); 1131} 1132 1133@extend %titlebar; 1134} 1135 1136 1137/************ 1138* Pathbars * 1139************/ 1140.path-bar button { 1141&.text-button, &.image-button, & { 1142padding-left: 6px; 1143padding-right: 6px; 1144} 1145 1146&.text-button.image-button, & { 1147// label:last-child { padding-left: 2px; padding-right: 8px; } 1148// label:first-child { padding-left: 8px; padding-right: 2px; } 1149} 1150 1151image { 1152padding-left: ($medium_size - 16px) / 2 - 6px; 1153padding-right: ($medium_size - 16px) / 2 - 6px; 1154} 1155 1156&.slider-button { 1157padding-left: 0; 1158padding-right: 0; 1159} 1160 1161:not(headerbar) & { 1162@extend %flat_button; 1163 1164border-image: radial-gradient(circle closest-corner at center calc(100% - 1px), 1165$primary_color 0%, 1166transparent 0%) 11670 0 0 / 0 0 0px; 1168border-radius: 2px; 1169 1170&:checked { 1171border-image: radial-gradient(circle closest-corner at center calc(100% - 1px), 1172$primary_color 100%, 1173transparent 0%) 11740 0 2 / 0 0 2px; 1175 1176&, &:disabled { background-color: transparent; } 1177} 1178} 1179} 1180 1181 1182/************** 1183* Tree Views * 1184**************/ 1185treeview.view { 1186@at-root * { 1187-GtkTreeView-horizontal-separator: 4; 1188-GtkTreeView-grid-line-width: 1; 1189-GtkTreeView-grid-line-pattern: ''; 1190-GtkTreeView-tree-line-width: 1; 1191-GtkTreeView-tree-line-pattern: ''; 1192-GtkTreeView-expander-size: 16; 1193} 1194 1195border-left-color: $track_color; // this is actually the tree lines color, 1196border-top-color: $borders_color; // while this is the grid lines color, better then nothing 1197 1198rubberband { @extend rubberband; } // to avoid borders being overridden by the previously set props 1199 1200&:hover, &:active, &:selected { border-radius: 0; } 1201 1202&.separator { 1203min-height: 1px + 2px * 2; 1204color: $borders_color; 1205} 1206 1207&:drop(active) { 1208border-style: solid none; 1209border-width: 1px; 1210border-color: $accent_color; 1211 1212&.after { border-top-style: none; } 1213 1214&.before { border-bottom-style: none; } 1215} 1216 1217&.expander { 1218-gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); 1219-gtk-icon-transform: rotate(-90deg); 1220 1221&:dir(rtl) { -gtk-icon-transform: rotate(90deg); } 1222 1223&:checked { -gtk-icon-transform: unset; } 1224 1225color: $secondary_fg_color; 1226 1227&:hover, &:active { color: $fg_color; } 1228 1229&:disabled { color: $disabled_secondary_fg_color; } 1230 1231&:selected { 1232color: $secondary_inversed_fg_color; 1233 1234&:hover, &:active { color: $inversed_fg_color; } 1235 1236&:disabled { color: $disabled_secondary_inversed_fg_color; } 1237} 1238} 1239 1240&.progressbar { // progress bar in treeviews 1241border-style: none none solid; 1242border-width: $bar_size; 1243border-color: $primary_color; 1244background-color: transparent; 1245background-image: none; 1246 1247&:selected { border-color: currentColor; } 1248} 1249 1250&.trough { // progress bar trough in treeviews 1251border-style: none none solid; 1252border-width: $bar_size; 1253border-color: scale-alpha($primary_color, $lower_opacity); 1254background-color: transparent; 1255background-image: none; 1256 1257&:selected { border-color: $track_color; } 1258} 1259 1260header { 1261button { 1262@extend row.activatable; 1263 1264padding: 2px 6px; 1265border-style: none solid solid none; 1266border-width: 1px; 1267border-color: $borders_color; 1268border-radius: 0; 1269background-clip: border-box; 1270 1271&, &:hover, &:active { box-shadow: none; } 1272 1273&, &:disabled { background-color: $base_color; } 1274 1275&:last-child { border-right-style: none; } 1276} 1277} 1278 1279button.dnd, 1280header.button.dnd { // for treeview-like derive widgets 1281padding: 2px 6px; 1282border-style: none solid solid; 1283border-width: 1px; 1284border-color: $borders_color; 1285border-radius: 0; 1286box-shadow: none; 1287background-color: $base_color; 1288background-clip: border-box; 1289color: $primary_color; 1290} 1291 1292acceleditor > label { background-color: $primary_color; } // see tests/testaccel to test 1293} 1294 1295 1296/********* 1297* Menus * 1298*********/ 1299menubar, 1300.menubar { 1301-GtkWidget-window-dragging: true; 1302padding: 0; 1303// box-shadow: inset 0 -1px $borders_color; 1304background-color: $headerbar_color; 1305 1306> menuitem { 1307transition: $shorter_transition; 1308min-height: 20px; 1309padding: 4px 8px; 1310color: $secondary_inversed_fg_color; 1311 1312&:hover { //Seems like it :hover even with keyboard focus 1313transition: none; 1314background-color: gtkalpha(currentColor, $lower_opacity / 2); 1315color: $inversed_fg_color; 1316} 1317 1318&:disabled { color: $disabled_secondary_inversed_fg_color; } 1319} 1320} 1321 1322menu, 1323.menu, 1324.context-menu { 1325margin: 4px 0; 1326padding: 4px 0; 1327background-color: $base_color; 1328border: 1px solid $borders_color; // adds borders in a non composited env 1329 1330.csd & { 1331border: none; // axes borders in a composited env 1332border-radius: 2px; 1333} 1334 1335menuitem { 1336transition: $shorter_transition; 1337min-height: 20px; 1338min-width: 40px; 1339padding: 4px 8px; 1340font: initial; 1341text-shadow: none; 1342 1343&:hover { 1344transition: none; 1345background-color: gtkalpha(currentColor, $lower_opacity / 2); 1346} 1347 1348&:disabled { color: $disabled_fg_color; } 1349 1350// submenu indicators 1351arrow { 1352min-height: 16px; 1353min-width: 16px; 1354 1355&:dir(ltr) { 1356-gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); 1357margin-left: 8px; 1358} 1359 1360&:dir(rtl) { 1361-gtk-icon-source:-gtk-icontheme('pan-end-symbolic-rtl'); 1362margin-right: 8px; 1363} 1364} 1365 1366// avoids labels color being overridden, see 1367// https://bugzilla.gnome.org/show_bug.cgi?id=767058 1368label { &:dir(rtl), &:dir(ltr) { color: inherit; }} 1369} 1370 1371// overflow arrows 1372> arrow { 1373min-height: 16px; 1374min-width: 16px; 1375padding: 4px; 1376border-radius: 0; 1377background-color: $base_color; 1378color: $secondary_fg_color; 1379 1380&.top { 1381margin-top: -4px; 1382border-bottom: 1px solid $borders_color; 1383-gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); 1384} 1385 1386&.bottom { 1387margin-bottom: -4px; 1388border-top: 1px solid $borders_color; 1389-gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); 1390} 1391 1392&:hover { 1393background-image: image(gtkalpha(currentColor, $lower_opacity / 2)); 1394color: $fg_color; 1395} 1396 1397&:disabled { 1398border-color: transparent; 1399background-color: transparent; 1400color: transparent; 1401// color: $disabled_secondary_fg_color; 1402} 1403} 1404 1405separator { margin: 4px 0; } 1406} 1407 1408menuitem { 1409accelerator { color: gtkalpha(currentColor, $hint_opacity); } 1410 1411check, 1412radio { 1413&:dir(ltr) { margin-right: -8px; margin-left: -16px; } 1414&:dir(rtl) { margin-right: -16px; margin-left: -8px; } 1415} 1416} 1417 1418.csd.popup { border-radius: 2px; } 1419 1420 1421/*************** 1422* Popovers * 1423***************/ 1424popover.background { 1425transition: $shadow_transition; 1426padding: 0; 1427box-shadow: $z-depth-2; 1428background-color: $lighter_bg_color; 1429 1430&:backdrop { box-shadow: $z-depth-1; } 1431 1432&, .csd & { 1433border-style: solid; 1434border-width: 1px; 1435border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.2) rgba(0, 0, 0, 0.3); 1436border-radius: 2px + 1px; 1437} 1438 1439> list, 1440> .view, 1441> toolbar { 1442border-style: none; 1443box-shadow: none; 1444background-color: transparent; 1445} 1446 1447&, .csd & { 1448&.touch-selection, 1449&.magnifier, 1450&.osd { @extend %osd; } 1451} 1452 1453// entry { @extend %entry.flat; } 1454 1455// button:not(.suggested-action):not(.destructive-action) { @extend %button_basic.flat; } 1456 1457&.menu button.model { 1458@extend %simple_flat_button; 1459 1460min-height: 32px; 1461padding: 0 8px; 1462border-radius: 2px; 1463 1464&:checked { 1465background-color: $primary_color; 1466color: $inversed_fg_color; 1467} 1468} 1469 1470separator { margin: 4px 0; } 1471 1472list separator { margin: 0; } 1473} 1474 1475/************* 1476* Notebooks * 1477*************/ 1478notebook { 1479> header { 1480border-width: 1px; 1481border-color: $borders_color; 1482background-color: $bg_color; 1483background-clip: border-box; 1484 1485&.top { 1486border-bottom-style: solid; 1487> tabs { 1488margin-bottom: -1px; 1489> tab { 1490 1491&:hover { box-shadow: inset 0 -2px $track_color; } 1492 1493&:checked { box-shadow: inset 0 -2px $primary_color; } 1494} 1495} 1496} 1497 1498&.bottom { 1499border-top-style: solid; 1500> tabs { 1501margin-top: -1px; 1502> tab { 1503 1504&:hover { box-shadow: inset 0 2px $track_color; } 1505 1506&:checked { box-shadow: inset 0 2px $primary_color; } 1507} 1508} 1509} 1510 1511&.left { 1512border-right-style: solid; 1513> tabs { 1514margin-right: -1px; 1515> tab { 1516 1517&:hover { box-shadow: inset -2px 0 $track_color; } 1518 1519&:checked { box-shadow: inset -2px 0 $primary_color; } 1520} 1521} 1522} 1523 1524&.right { 1525border-left-style: solid; 1526> tabs { 1527margin-left: -1px; 1528> tab { 1529 1530&:hover { box-shadow: inset 2px 0 $track_color; } 1531 1532&:checked { box-shadow: inset 2px 0 $primary_color; } 1533} 1534} 1535} 1536 1537&.top > tabs > arrow { 1538@extend %notebook_vert_arrows; 1539 1540border-top-style: none; 1541} 1542 1543&.bottom > tabs > arrow { 1544@extend %notebook_vert_arrows; 1545 1546border-bottom-style: none; 1547} 1548 1549@at-root %notebook_vert_arrows { 1550padding-left: 4px; 1551padding-right: 4px; 1552 1553&.down { 1554margin-left: -8px; 1555-gtk-icon-source: -gtk-icontheme('pan-start-symbolic'); 1556} 1557 1558&.up { 1559margin-right: -8px; 1560-gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); 1561} 1562} 1563 1564&.left > tabs > arrow { 1565@extend %notebook_horz_arrows; 1566 1567border-left-style: none; 1568} 1569 1570&.right > tabs > arrow { 1571@extend %notebook_horz_arrows; 1572 1573border-right-style: none; 1574} 1575 1576@at-root %notebook_horz_arrows { 1577padding-top: 4px; 1578padding-bottom: 4px; 1579 1580&.down { 1581margin-top: -8px; 1582-gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); 1583} 1584 1585&.up { 1586margin-bottom: -8px; 1587-gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); 1588} 1589} 1590 1591> tabs > arrow { 1592@extend %simple_flat_button; 1593 1594min-height: 16px; 1595min-width: 16px; 1596border-radius: 0; 1597} 1598 1599tab { 1600transition: $longer_transition; 1601min-height: $small_size; 1602min-width: $small_size; 1603padding: $container_padding 12px; 1604 1605outline-offset: -6px; 1606 1607border-width: 1px; // for reorderable tabs 1608border-color: transparent; // 1609 1610color: $secondary_fg_color; 1611font-weight: 500; 1612 1613&:hover { 1614color: $fg_color; 1615 1616&.reorderable-page { 1617border-color: $borders_color; 1618background-color: $alt_base_color; 1619} 1620} 1621 1622&:disabled { color: $disabled_secondary_fg_color; } 1623 1624&:checked { 1625animation: tab_ripple_effect $longer_duration * 3 $deceleration_curve; 1626color: $fg_color; 1627 1628&:disabled { color: $disabled_fg_color; } 1629 1630&.reorderable-page { 1631border-color: $borders_color; 1632background-color: $base_color; 1633} 1634} 1635 1636// colors the button like the label, overridden otherwise 1637button.flat { 1638@extend %small_button; 1639 1640&:last-child { 1641margin-left: $container_padding; 1642margin-right: $container_padding - 12px; 1643} 1644 1645&:first-child { 1646margin-left: $container_padding - 12px; 1647margin-right: $container_padding; 1648} 1649} 1650} 1651 1652&.top, 1653&.bottom { 1654tabs { 1655padding-left: 8px; 1656padding-right: 8px; 1657 1658&:not(:only-child) { 1659&:first-child { margin-left: 0; } 1660&:last-child { margin-right: 0; } 1661} 1662 1663tab { 1664&.reorderable-page { 1665margin: 0 -1px; 1666border-style: none solid; 1667} 1668} 1669} 1670} 1671 1672&.left, 1673&.right { 1674tabs { 1675padding-top: 8px; 1676padding-bottom: 8px; 1677 1678&:not(:only-child) { 1679&:first-child { margin-top: 0; } 1680&:last-child { margin-bottom: 0; } 1681} 1682 1683tab { 1684&.reorderable-page { 1685margin: -1px 0; 1686border-style: solid none; 1687} 1688} 1689} 1690} 1691} 1692 1693> stack:not(:only-child) { // the :not(:only-child) is for "hidden" notebooks 1694background-color: $base_color; 1695 1696entry, 1697spinbutton:not(.vertical) { @extend %entry.flat; } 1698 1699revealer entry, 1700revealer spinbutton:not(.vertical) { @extend %entry; } 1701 1702spinbutton:not(.vertical) entry { @extend %spinbutton_entry; } 1703} 1704} 1705 1706 1707/************** 1708* Scrollbars * 1709**************/ 1710scrollbar { 1711$_slider_min_length: 24px; 1712 1713// disable steppers 1714@at-root * { 1715-GtkScrollbar-has-backward-stepper: false; 1716-GtkScrollbar-has-forward-stepper: false; 1717} 1718 1719transition: $longer_transition; 1720background-color: $base_color; 1721background-clip: $extra_background_clip; 1722 1723// scrollbar border 1724&.top { border-bottom: 1px solid $borders_color; } 1725&.bottom { border-top: 1px solid $borders_color; } 1726&.left { border-right: 1px solid $borders_color; } 1727&.right { border-left: 1px solid $borders_color; } 1728 1729// slider 1730slider { 1731transition: $shorter_transition, margin 0, border-width 0; 1732min-width: 8px; 1733min-height: 8px; 1734border: 4px solid transparent; 1735border-radius: $circular_radius; 1736background-clip: padding-box; 1737background-color: $tertiary_fg_color; 1738 1739&:hover { background-color: $secondary_fg_color; } 1740 1741&:active { background-color: $fg_color; } 1742 1743&:disabled { background-color: $disabled_tertiary_fg_color; } 1744} 1745 1746&.fine-tune { 1747slider { 1748transition: $shorter_transition, margin 0, border-width 0, min-width 0, min-height 0; 1749min-width: 4px; 1750min-height: 4px; 1751} 1752 1753&.horizontal slider { margin: 2px 0; } 1754 1755&.vertical slider { margin: 0 2px; } 1756} 1757 1758&.overlay-indicator { 1759&:not(.dragging):not(.hovering) { 1760border-color: transparent; 1761background-color: transparent; 1762 1763slider { 1764min-width: 4px; 1765min-height: 4px; 1766margin: 4px - 1px; 1767border: 1px solid scale-alpha($base_color, $lower_opacity); 1768} 1769 1770button { 1771min-width: 4px; 1772min-height: 4px; 1773margin: 4px - 1px; 1774border: 1px solid scale-alpha($base_color, $lower_opacity); 1775border-radius: $circular_radius; 1776background-color: $tertiary_fg_color; 1777background-clip: padding-box; 1778-gtk-icon-source: none; 1779 1780&:disabled { background-color: $disabled_tertiary_fg_color; } 1781} 1782 1783&.horizontal { 1784slider { min-width: $_slider_min_length; } 1785 1786button { min-width: 8px; } 1787} 1788 1789&.vertical { 1790slider { min-height: $_slider_min_length; } 1791 1792button { min-height: 8px; } 1793} 1794} 1795 1796&.dragging, 1797&.hovering { background-color: scale-alpha($base_color, $higher_opacity); } 1798} 1799 1800&.horizontal slider { min-width: $_slider_min_length; } 1801 1802&.vertical slider { min-height: $_slider_min_length; } 1803 1804// button styling 1805button { 1806@extend %simple_flat_button; 1807 1808min-width: 16px; 1809min-height: 16px; 1810padding: 0; 1811border-radius: 0; 1812} 1813 1814// button icons 1815&.vertical { 1816button { 1817&.down { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } 1818 1819&.up { -gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); } 1820} 1821} 1822 1823&.horizontal { 1824button { 1825&.down { -gtk-icon-source: -gtk-icontheme('pan-right-symbolic'); } 1826 1827&.up { -gtk-icon-source: -gtk-icontheme('pan-left-symbolic'); } 1828} 1829} 1830} 1831 1832 1833/********** 1834* Switch * 1835**********/ 1836switch { 1837transition: $longer_transition; 1838margin: $container_padding 0; 1839border: 4px solid transparent; 1840border-radius: $circular_radius; 1841background-color: $track_color; 1842background-clip: padding-box; 1843font-size: 0; 1844 1845&:disabled { color: gtkalpha(currentColor, $disabled_opacity); } 1846 1847&:checked { 1848background-color: scale-alpha($accent_color, 0.5); 1849 1850&:disabled { 1851background-color: scale-alpha($accent_color, 0.5 * $disabled_opacity); 1852color: $disabled_fg_color; 1853} 1854} 1855 1856slider { 1857@include entry(normal); 1858 1859transition: $longer_transition, $shadow_transition, margin 0; 1860min-width: $small_size; 1861min-height: $small_size; 1862margin: -4px 0 -4px -4px; 1863-gtk-outline-radius: $circular_radius; 1864border-radius: $circular_radius; 1865} 1866 1867&:hover slider { @include entry(focus); } 1868 1869&:checked slider { 1870transition: $longer_transition, $shadow_transition, margin 0, background-image 0, background-color 0 $longer_duration; 1871animation: needs_attention $longer_duration $deceleration_curve; 1872margin: -4px -4px -4px 0; 1873background-color: $accent_color; 1874color: $inversed_fg_color; 1875} 1876 1877&:disabled slider { @include entry(disabled); } 1878 1879&:checked:disabled slider { animation: none; } 1880 1881row:selected & { 1882} 1883} 1884 1885 1886/************************* 1887* Check and Radio items * 1888*************************/ 1889// draw regular check and radio items using our PNG assets 1890// all assets are rendered from assets.svg. never add pngs directly 1891 1892//selection-mode 1893@each $s,$as in ('','-selectionmode'), 1894(':hover', '-hover-selectionmode'), 1895(':checked', '-checked-selectionmode'), 1896(':checked:hover', '-checked-hover-selectionmode') { 1897.view.content-view.check#{$s}:not(list) { 1898-gtk-icon-shadow: $z-depth-1; 1899-gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}#{$asset_suffix}.png"), 1900url("assets/checkbox#{$as}#{$asset_suffix}@2.png")); 1901margin: 8px; 1902background-color: transparent; 1903} 1904} 1905 1906checkbutton.text-button, 1907radiobutton.text-button { 1908// this is for a nice focus on check and radios text 1909padding: 2px; 1910outline-offset: 0; 1911 1912label:not(:only-child) { margin: 0 4px; } 1913} 1914 1915check, 1916radio { 1917min-height: 24px; 1918min-width: 24px; 1919margin: -($large_size - 24px) / 2; 1920padding: ($large_size - 24px) / 2; 1921 1922@extend %simple_flat_button; 1923 1924@extend %circular_button; 1925 1926&:checked, &:indeterminate { color: $accent_color; } 1927 1928&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_color, $disabled_opacity); } 1929 1930// &:only-child { margin: -12px; } 1931 1932row &:not(:checked):not(:indeterminate) { 1933color: gtkalpha(currentColor, $enabled_opacity); 1934 1935&:hover, &:active { color: currentColor; } 1936 1937&:disabled { color: gtkalpha(currentColor, $enabled_opacity * $disabled_opacity); } 1938} 1939 1940menu menuitem & { 1941transition: none; 1942margin: -16px; // this is a workaround for a menu check/radio size allocation issue 1943 1944&:not(:checked):not(:indeterminate) { color: gtkalpha(currentColor, $hint_opacity); } 1945 1946&, &:hover, &:disabled { 1947background-image: none; 1948// color: inherit; 1949// animation: none; 1950} 1951} 1952} 1953 1954%check, 1955check { 1956& { -gtk-icon-source: image(-gtk-recolor(url("assets/check-unchecked-symbolic.svg")), 1957-gtk-recolor(url("assets/check-unchecked-symbolic.png"))); } 1958 1959&:checked { -gtk-icon-source: image(-gtk-recolor(url("assets/check-checked-symbolic.svg")), 1960-gtk-recolor(url("assets/check-checked-symbolic.png"))); } 1961 1962&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/check-dash-symbolic.svg")), 1963-gtk-recolor(url("assets/check-dash-symbolic.png"))); } 1964} 1965 1966$radio_indicator: 10 / ($large_size / 1px) / 2; 1967$radio_radius_slice: #{$large_size / 2 / 1px}; 1968$radio_radius_width: #{$large_size / 2}; 1969 1970%radio, 1971radio { 1972& { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-unchecked-symbolic.svg")), 1973-gtk-recolor(url("assets/radio-unchecked-symbolic.png"))); } 1974 1975// &:checked { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-checked-symbolic.svg")), 1976// -gtk-recolor(url("assets/radio-checked-symbolic.png"))); } 1977 1978&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-dash-symbolic.svg")), 1979-gtk-recolor(url("assets/radio-dash-symbolic.png"))); } 1980 1981border-image: -gtk-gradient(radial, 1982center center, 0, 1983center center, 0.001, 1984to($accent_color), 1985to(transparent)) 1986$radio_radius_slice / $radio_radius_width; 1987 1988&:checked { 1989border-image: -gtk-gradient(radial, 1990center center, 0, 1991center center, $radio_indicator, 1992to($accent_color), 1993to(transparent)) 1994$radio_radius_slice / $radio_radius_width; 1995} 1996 1997&:checked:disabled { 1998border-image: -gtk-gradient(radial, 1999center center, 0, 2000center center, $radio_indicator, 2001to(scale-alpha($accent_color, $disabled_opacity)), 2002to(transparent)) 2003$radio_radius_slice / $radio_radius_width; 2004} 2005 2006&:indeterminate:checked { 2007border-image: -gtk-gradient(radial, 2008center center, 0, 2009center center, 0.001, 2010to($accent_color), 2011to(transparent)) 2012$radio_radius_slice / $radio_radius_width; 2013} 2014} 2015 2016// let's animate things 2017@keyframes check_check { 2018from { -gtk-icon-transform: rotate(90deg); } 2019to { -gtk-icon-transform: unset; } 2020} 2021 2022@keyframes check_radio { // FIXME: cannot animate border-image 2023from { 2024border-image: -gtk-gradient(radial, 2025center center, 0, 2026center center, 0.001, 2027to($accent_color), 2028to(transparent)) 2029$radio_radius_slice / $radio_radius_width; 2030} 2031 2032to { 2033border-image: -gtk-gradient(radial, 2034center center, 0, 2035center center, $radio_indicator, 2036to($accent_color), 2037to(transparent)) 2038$radio_radius_slice / $radio_radius_width; 2039} 2040} 2041 2042@keyframes check_indeterminate { 2043from { -gtk-icon-transform: unset; } 204450% { -gtk-icon-transform: scale(0, 1); } 2045to { -gtk-icon-transform: unset; } 2046} 2047 2048%check_checked, 2049check:not(:indeterminate):checked { animation: check_check $longer_duration $standard_curve; } 2050 2051check:not(:indeterminate):checked:active { animation: check_check $longer_duration $standard_curve, flat_ripple_effect $longer_duration $deceleration_curve forwards; } 2052 2053// %radio_checked, 2054// radio:not(:indeterminate):checked { animation: check_radio $longer_duration $standard_curve; } 2055 2056// radio:not(:indeterminate):checked:active { animation: check_radio $longer_duration $standard_curve, flat_ripple_effect $longer_duration $deceleration_curve forwards; } 2057 2058%indeterminate_checked, 2059check:indeterminate:checked, radio:indeterminate:checked { animation: check_indeterminate $longer_duration $standard_curve; } 2060 2061check:indeterminate:checked:active, radio:indeterminate:checked:active { animation: check_indeterminate $longer_duration $standard_curve, flat_ripple_effect $longer_duration $deceleration_curve forwards; } 2062 2063// no animations in menus 2064menu menuitem { 2065check:not(:indeterminate):checked, 2066radio:not(:indeterminate):checked, 2067check:indeterminate:checked, 2068radio:indeterminate:checked { animation: none; } 2069} 2070 2071treeview.view check, 2072treeview.view radio { 2073padding: 0; 2074 2075&:hover { 2076box-shadow: inset 0 0 0 10000px gtkalpha($fg_color, 0.05); 2077background-image: none; 2078 2079&:selected { box-shadow: inset 0 0 0 10000px gtkalpha($inversed_fg_color, 0.05); } 2080} 2081 2082& { 2083color: $secondary_fg_color; 2084 2085&:hover, &:active { color: $fg_color; } 2086 2087&:disabled { color: $disabled_secondary_fg_color; } 2088 2089&:checked, &:indeterminate { color: $accent_color; } 2090 2091&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_color, $disabled_opacity); } 2092} 2093 2094&:selected { 2095color: $secondary_inversed_fg_color; 2096 2097&:hover, &:active { color: $inversed_fg_color; } 2098 2099&:disabled { color: $disabled_secondary_inversed_fg_color; } 2100 2101&:checked, &:indeterminate { color: $accent_color; } 2102 2103&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_color, $disabled_opacity); } 2104} 2105} 2106 2107treeview.view radio:checked { 2108-gtk-icon-source: image(-gtk-recolor(url("assets/radio-checked-symbolic.svg")), 2109-gtk-recolor(url("assets/radio-checked-symbolic.png"))); 2110border-image: none; 2111} 2112 2113 2114/************ 2115* GtkScale * 2116************/ 2117scale { 2118// sizing 2119$_marks_lenght: 8px; 2120$_marks_distance: 8px; 2121 2122min-height: $medium_size - 24px; 2123min-width: $medium_size - 24px; 2124padding: (24px / 2); 2125 2126* { transition: $longer_transition; } 2127 2128// the slider is inside the trough, so to have make it bigger there's a negative margin 2129slider { 2130min-height: 24px; 2131min-width: 24px; 2132margin: ($bar_size - 24px) / 2; 2133} 2134 2135// the backing bit 2136trough { 2137outline-offset: 2px; 2138background-color: $track_color; 2139 2140&:disabled { color: $disabled_fg_color; } 2141} 2142 2143// the colored part of the backing bit 2144highlight { 2145background-color: $accent_color; 2146 2147&:disabled { background-color: transparent; } 2148} 2149 2150// this is another differently styled part of the backing bit, the most relevant use case is for example 2151// in media player to indicate how much video stream as been cached 2152fill { 2153background-color: $track_color; 2154 2155&:disabled { background-color: transparent; } 2156} 2157 2158slider { 2159transition: all $shorter_duration $standard_curve; 2160// border-radius: 100%; 2161// background-color: $accent_color; 2162background-repeat: no-repeat; 2163background-position: center; 2164 2165@each $s,$as in ('',''), 2166(':disabled','-insensitive') { 2167&#{$s} { 2168$_url: 'assets/slider#{$as}#{$asset_suffix}'; 2169background-image: -gtk-scaled(url('#{$_url}.png'), 2170url('#{$_url}@2.png')); 2171} 2172} 2173 2174background-size: calc(100% - 8px); 2175 2176&:hover { background-size: calc(100% - 4px); } 2177 2178&:active { background-size: calc(100% - 0px); } 2179} 2180 2181// click-and-hold the slider to activate 2182&.fine-tune { 2183// to make the slider shrink in fine-tune mode 2184slider { background-size: calc(100% - 12px); } 2185} 2186 2187value { color: gtkalpha(currentColor, $hint_opacity); } 2188 2189marks { 2190color: $track_color; 2191 2192@each $marks_class, $marks_pos, $marks_margin in (top, top, bottom), 2193(bottom, bottom, top), 2194(top, left, right), 2195(bottom, right, left) { 2196&.#{$marks_class} { 2197margin-#{$marks_margin}: $_marks_distance; 2198margin-#{$marks_pos}: -($_marks_distance + $_marks_lenght); 2199} 2200} 2201} 2202 2203&.horizontal { 2204indicator { 2205min-height: $_marks_lenght; 2206min-width: 1px; 2207} 2208} 2209 2210&.vertical { 2211indicator { 2212min-height: 1px; 2213min-width: $_marks_lenght; 2214} 2215} 2216 2217// *WARNING* scale with marks madness following 2218 2219// FIXME: OSD and selected list rows missing, I don't feel like adding the other 144 assets needed for those... 2220$suffix: if($variant == 'light', '', '-dark'); 2221 2222@each $dir_class, $dir_infix in ('horizontal', 'horz'), 2223('vertical', 'vert') { 2224@each $marks_infix, $nth_child in ('scale-has-marks-above', ':last-child:not(:only-child)'), 2225('scale-has-marks-below', ':first-child:not(:only-child)') { 2226@each $state, $state_infix in ('', ''), 2227(':disabled', '-insensitive') { 2228&.#{$dir_class} { 2229%#{$marks_infix}-#{$dir_infix}, 2230contents#{$nth_child} > trough > slider { 2231&#{$state} { 2232$_scale_asset: 'assets/slider-#{$dir_infix}-#{$marks_infix}#{$state_infix}#{$suffix}'; 2233 2234background-image: -gtk-scaled(url('#{$_scale_asset}.png'), url('#{$_scale_asset}@2.png')); 2235} 2236 2237@if $dir_class == 'horizontal' { 2238min-height: 30px; 2239min-width: 24px; 2240 2241@if $marks_infix == 'scale-has-marks-above' { 2242margin-top: -16px; 2243 2244background-position: center calc(100% - 4px); 2245 2246&:hover { background-position: center calc(100% - 2px); } 2247 2248&:active { background-position: center calc(100% - 0px); } 2249} 2250 2251@if $marks_infix == 'scale-has-marks-below' { 2252margin-bottom: -16px; 2253 2254background-position: center calc(4px); 2255 2256&:hover { background-position: center calc(2px); } 2257 2258&:active { background-position: center calc(0px); } 2259} 2260} 2261 2262@if $dir_class == 'vertical' { 2263min-height: 24px; 2264min-width: 30px; 2265 2266@if $marks_infix == 'scale-has-marks-above' { 2267margin-left: -16px; 2268 2269background-position: calc(4px) center; 2270 2271&:hover { background-position: calc(2px) center; } 2272 2273&:active { background-position: calc(0px) center; } 2274} 2275 2276@if $marks_infix == 'scale-has-marks-below' { 2277margin-right: -16px; 2278 2279background-position: calc(100% - 4px) center; 2280 2281&:hover { background-position: calc(100% - 2px) center; } 2282 2283&:active { background-position: calc(100% - 0px) center; } 2284} 2285} 2286} 2287 2288@at-root %#{$marks_infix}-#{$dir_infix}-fine-tune, 2289&.fine-tune contents#{$nth_child} > trough > slider { 2290// bigger negative margins to make the trough grow here as well 2291 2292@if $dir_class == 'horizontal' { 2293@if $marks_infix == 'scale-has-marks-above' { background-position: center calc(100% - 6px); } 2294 2295@if $marks_infix == 'scale-has-marks-below' { background-position: center calc(6px); } 2296} 2297 2298@if $dir_class == 'vertical' { 2299@if $marks_infix == 'scale-has-marks-above' { background-position: calc(6px) center; } 2300 2301@if $marks_infix == 'scale-has-marks-below' { background-position: calc(100% - 6px) center; } 2302} 2303} 2304} 2305} 2306} 2307} 2308 2309&.color { 2310min-height: 0; 2311min-width: 0; 2312 2313&.horizontal { 2314padding: 0 0 12px 0; 2315 2316trough { 2317padding-bottom: $bar_size; 2318} 2319 2320slider { 2321@extend %scale-has-marks-above-horz; 2322 2323margin-bottom: -10px - $bar_size; 2324margin-top: 0; 2325} 2326} 2327 2328&.vertical { 2329&:dir(ltr) { 2330padding: 0 0 0 12px; 2331 2332trough { 2333padding-left: $bar_size; 2334} 2335 2336slider { 2337@extend %scale-has-marks-below-vert; 2338 2339margin-left: -10px - $bar_size; 2340margin-right: 0; 2341} 2342} 2343 2344&:dir(rtl) { 2345padding: 0 12px 0 0; 2346 2347trough { 2348padding-right: $bar_size; 2349} 2350 2351slider { 2352@extend %scale-has-marks-above-vert; 2353 2354margin-right: -10px - $bar_size; 2355margin-left: 0; 2356} 2357} 2358} 2359 2360&.fine-tune { 2361&.horizontal { 2362slider { 2363@extend %scale-has-marks-above-horz-fine-tune; 2364} 2365} 2366 2367&.vertical { 2368&:dir(ltr) { 2369slider { 2370@extend %scale-has-marks-below-vert-fine-tune; 2371} 2372} 2373 2374&:dir(rtl) { 2375slider { 2376@extend %scale-has-marks-above-vert-fine-tune; 2377} 2378} 2379} 2380} 2381} 2382} 2383 2384 2385/***************** 2386* Progress bars * 2387*****************/ 2388progressbar { 2389// sizing 2390&.horizontal { 2391trough, 2392progress { min-height: $bar_size; } 2393} 2394 2395&.vertical { 2396trough, 2397progress { min-width: $bar_size; } 2398} 2399 2400// FIXME: insensitive state missing and some other state should be set probably 2401color: $tertiary_fg_color; 2402font-size: smaller; 2403 2404trough { background-color: scale-alpha($primary_color, $lower_opacity); } 2405 2406progress { background-color: $primary_color; } 2407 2408&.osd { // progressbar.osd used for epiphany page loading progress 2409// min-width: $bar_size; 2410// min-height: $bar_size; 2411// background-color: transparent; 2412 2413// trough { background-color: transparent; } 2414 2415progress { 2416} 2417} 2418} 2419 2420 2421/************* 2422* Level Bar * 2423*************/ 2424levelbar { 2425block { 2426min-width: $medium_size; 2427min-height: $bar_size; 2428} 2429 2430&.vertical block { 2431min-width: $bar_size; 2432min-height: $medium_size; 2433} 2434 2435trough { 2436padding: 2px; 2437border-radius: 2px; 2438 2439@include entry(normal); 2440 2441&:disabled { @include entry(disabled); } 2442} 2443 2444&.horizontal.discrete block { margin: 0 1px; } 2445 2446&.vertical.discrete block { margin: 1px 0; } 2447 2448&.horizontal.discrete trough { padding: 2px 1px; } 2449 2450&.vertical.discrete trough { padding: 1px 2px; } 2451 2452block { 2453&.low { 2454background-color: $warning_color; 2455} 2456 2457&.high, 2458&:not(.empty) { 2459background-color: $primary_color; 2460} 2461 2462&.full { 2463background-color: $success_color; 2464} 2465 2466&.empty { 2467background-color: $track_color; 2468color: $disabled_fg_color; 2469} 2470} 2471} 2472 2473 2474/**************** 2475* Print dialog * 2476*****************/ 2477printdialog { 2478paper { 2479padding: 0; 2480border: 1px solid $borders_color; 2481background: $base_color; 2482color: $fg_color; 2483} 2484 2485.dialog-action-box { margin: 12px; } 2486} 2487 2488 2489/********** 2490* Frames * 2491**********/ 2492frame > border, 2493.frame { 2494margin: 0; 2495padding: 0; 2496border: 1px solid $borders_color; 2497border-radius: 0; 2498box-shadow: none; 2499 2500&.flat { border-style: none; } 2501} 2502 2503actionbar > revealer > box { 2504padding: $container_padding; 2505border-top: 1px solid $borders_color; 2506} 2507 2508scrolledwindow { 2509viewport.frame { // avoid double borders when viewport inside scrolled window 2510border-style: none; 2511} 2512 2513// This is used when content is touch-dragged past boundaries. 2514// draws a box on top of the content, the size changes programmatically. 2515@at-root overshoot { 2516&.top { @include overshoot(top); } 2517 2518&.bottom { @include overshoot(bottom); } 2519 2520&.left { @include overshoot(left); } 2521 2522&.right { @include overshoot(right); } 2523} 2524 2525// Overflow indication, works similarly to the overshoot, the size if fixed tho. 2526@at-root undershoot { 2527&.top { @include undershoot(top); } 2528 2529&.bottom { @include undershoot(bottom); } 2530 2531&.left { @include undershoot(left); } 2532 2533&.right { @include undershoot(right); } 2534} 2535 2536@at-root junction { // the small square between two scrollbars 2537border-style: solid none none solid; 2538border-width: 1px; 2539border-color: $borders_color; 2540background-color: $base_color; 2541 2542&:dir(rtl) { border-style: solid solid none none; } 2543} 2544} 2545 2546//vbox and hbox separators 2547separator { 2548min-width: 1px; 2549min-height: 1px; 2550background: $borders_color; 2551} 2552 2553 2554/********* 2555* Lists * 2556*********/ 2557list { 2558border-color: $borders_color; 2559background-color: $base_color; 2560 2561row { padding: 2px; } 2562} 2563 2564// FIXME 2565$row_transition: $longer_transition, background-color 0, color 0; 2566 2567row { 2568&.activatable { 2569transition: $row_transition; 2570box-shadow: inset 0 0 0 10000px gtkalpha(currentColor, 0); 2571background-image: radial-gradient(circle farthest-corner at center, 2572gtkalpha(currentColor, 0) 100%, 2573transparent 0%), 2574image(gtkalpha(currentColor, 0)); 2575 2576&:hover { 2577transition: $row_transition, box-shadow 0; 2578box-shadow: inset 0 0 0 10000px gtkalpha(currentColor, 0.05); 2579} 2580 2581&.has-open-popup, // this is for indicathing which row generated a popover see https://bugzilla.gnome.org/show_bug.cgi?id=754411 2582&:active { 2583transition: $row_transition, background-image 0; 2584animation: row_ripple_effect $longer_duration $deceleration_curve forwards; 2585box-shadow: inset 0 0 0 10000px gtkalpha(currentColor, $lower_opacity / 2); 2586} 2587} 2588 2589&:selected { @extend %selected_items; } 2590} 2591 2592 2593/********************* 2594* App Notifications * 2595*********************/ 2596.app-notification, 2597.app-notification.frame { 2598@extend %osd; 2599 2600@extend toolbar.osd; 2601 2602margin: 8px; 2603 2604border { border: none; } 2605} 2606 2607 2608/************* 2609* Expanders * 2610*************/ 2611expander { 2612arrow { 2613transition: all $shorter_duration $standard_curve; 2614min-width: 16px; 2615min-height: 16px; 2616-gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); 2617-gtk-icon-transform: rotate(-90deg); 2618 2619&:dir(rtl) { -gtk-icon-transform: rotate(90deg); } 2620 2621&:checked { -gtk-icon-transform: unset; } 2622 2623color: $secondary_fg_color; 2624 2625&:hover, &:active { color: $fg_color; } 2626 2627&:disabled { color: $disabled_secondary_fg_color; } 2628 2629&:selected { 2630color: $secondary_inversed_fg_color; 2631 2632&:hover, &:active { color: $inversed_fg_color; } 2633 2634&:disabled { color: $disabled_secondary_inversed_fg_color; } 2635} 2636} 2637} 2638 2639 2640/************ 2641* Calendar * 2642***********/ 2643calendar { 2644padding: 1px; 2645border: 1px solid $borders_color; 2646color: $fg_color; 2647 2648&:disabled { color: $disabled_fg_color; } 2649 2650&:selected { 2651@extend %selected_items; 2652 2653border-radius: 2px + 1px; 2654} 2655 2656&.header { 2657border-style: none none solid; 2658border-radius: 0; 2659} 2660 2661&.button { @extend %simple_flat_button; } 2662 2663&.highlight { 2664color: gtkalpha(currentColor, $hint_opacity); 2665font-weight: 500; 2666} 2667 2668&:indeterminate { color: gtkalpha(currentColor, $disabled_opacity); } 2669} 2670 2671 2672/*********** 2673* Dialogs * 2674***********/ 2675messagedialog { // Message Dialog styling 2676&.background { background-color: $lighter_bg_color; } 2677 2678.titlebar { 2679min-height: $small_size; 2680border-style: none; 2681box-shadow: inset 0 1px $highlight_color; 2682background-color: $lighter_bg_color; 2683} 2684 2685&.csd { // rounded bottom border styling for csd version 2686&.background { 2687// bigger radius for better antialiasing 2688border-bottom-left-radius: 2px; 2689border-bottom-right-radius: 2px; 2690} 2691 2692.dialog-action-area button { 2693padding: 8px 16px; 2694border-top: 1px solid $borders_color; 2695border-radius: 0; 2696 2697@extend %simple_flat_button; 2698 2699&:first-child { border-bottom-left-radius: 2px; } 2700 2701&:last-child { border-bottom-right-radius: 2px; } 2702} 2703} 2704} 2705 2706filechooser { 2707.dialog-action-box { border-top: 1px solid $borders_color; } 2708 2709#pathbarbox { 2710border-bottom: 1px solid $borders_color; 2711background-color: $bg_color; 2712} 2713} 2714 2715filechooserbutton:drop(active) { 2716box-shadow: none; 2717} 2718 2719 2720/*********** 2721* Sidebar * 2722***********/ 2723.sidebar { 2724border-style: none; 2725background-color: $lighter_bg_color; 2726 2727@at-root %sidebar_left, 2728&:dir(ltr), 2729&.left, 2730&.left:dir(rtl) { 2731border-right: 1px solid $borders_color; 2732border-left-style: none; 2733} 2734 2735@at-root %sidebar_right 2736&:dir(rtl), 2737&.right { 2738border-left: 1px solid $borders_color; 2739border-right-style: none; 2740} 2741 2742list { background-color: transparent; } 2743 2744paned & { &.left, &.right, &.left:dir(rtl), &:dir(rtl), &:dir(ltr), & { border-style: none; }} 2745} 2746 2747stacksidebar { 2748&.sidebar { 2749&:dir(ltr), 2750&.left, 2751&.left:dir(rtl) { list { @extend %sidebar_left; }} 2752 2753&:dir(rtl), 2754&.right { list { @extend %sidebar_right; }} 2755} 2756 2757row { 2758padding: 10px 4px; 2759 2760> label { 2761padding-left: 6px; 2762padding-right: 6px; 2763} 2764 2765&.needs-attention > label { @extend %needs_attention; } 2766} 2767} 2768 2769 2770/**************** 2771* File chooser * 2772****************/ 2773placessidebar { 2774> viewport.frame { border-style: none; } 2775 2776list { padding: (4px - 3px) 0 4px; } 2777 2778row { 2779// Needs overriding of the GtkListBoxRow padding 2780min-height: 32px; 2781margin: -1px 0; // Remove unknown margins 2782padding: 0; 2783 2784// Using margins/padding directly in the SidebarRow 2785// will make the animation of the new bookmark row jump 2786> revealer { padding: 0 12px; } 2787 2788&:selected { color: $inversed_fg_color; } 2789 2790&:disabled { color: $disabled_fg_color; } 2791 2792image.sidebar-icon { 2793opacity: $hint_opacity; // dim the device icons 2794 2795&:dir(ltr) { padding-right: 8px; } 2796&:dir(rtl) { padding-left: 8px; } 2797} 2798 2799label.sidebar-label { 2800&:dir(ltr) { padding-right: 2px; } 2801&:dir(rtl) { padding-left: 2px; } 2802} 2803 2804@at-root button.sidebar-button { 2805@extend %simple_flat_button; 2806 2807@extend %small_button; 2808 2809row:selected & { 2810} 2811} 2812 2813&.sidebar-placeholder-row { 2814min-height: 2px; 2815padding: 0 8px; 2816background-image: image($accent_color); 2817background-clip: content-box; 2818} 2819 2820&.sidebar-new-bookmark-row { color: $accent_color; } 2821 2822&:drop(active):not(:disabled) { 2823box-shadow: inset 0 0 0 2px $accent_color; 2824 2825&:selected { 2826// background-color: $accent_color; 2827// color: $inversed_fg_color; 2828} 2829} 2830} 2831} 2832 2833placesview { 2834.server-list-button > image { -gtk-icon-transform: rotate(0turn); } 2835 2836.server-list-button:checked > image { -gtk-icon-transform: rotate(-0.5turn); } 2837 2838// this selects the "connect to server" label 2839> actionbar > revealer > box > label { 2840padding-left: 8px; 2841padding-right: 8px; 2842} 2843} 2844 2845 2846/********* 2847* Paned * 2848*********/ 2849paned { 2850> separator { 2851min-width: 1px; 2852min-height: 1px; 2853-gtk-icon-source: none; // defeats the ugly default handle decoration 2854border-style: none; // just to be sure 2855background-color: transparent; 2856// workaround, using background istead of a border since the border will get rendered twice (?) 2857background-image: image($borders_color); 2858background-size: 1px 1px; 2859 2860&.wide { 2861min-width: 6px; 2862min-height: 6px; 2863background-color: $bg_color; 2864background-image: image($borders_color), image($borders_color); 2865background-size: 1px 1px, 1px 1px; 2866} 2867} 2868 2869&.horizontal > separator { 2870background-repeat: repeat-y; 2871 2872&:dir(ltr) { 2873margin: 0 -8px 0 0; 2874padding: 0 8px 0 0; 2875background-position: left; 2876} 2877 2878&:dir(rtl) { 2879margin: 0 0 0 -8px; 2880padding: 0 0 0 8px; 2881background-position: right; 2882} 2883 2884&.wide { 2885margin: 0; 2886padding: 0; 2887background-repeat: repeat-y, repeat-y; 2888background-position: left, right; 2889} 2890} 2891 2892&.vertical > separator { 2893margin: 0 0 -8px 0; 2894padding: 0 0 8px 0; 2895background-repeat: repeat-x; 2896background-position: top; 2897 2898&.wide { 2899margin: 0; 2900padding: 0; 2901background-repeat: repeat-x, repeat-x; 2902background-position: bottom, top; 2903} 2904} 2905} 2906 2907 2908/************** 2909* GtkInfoBar * 2910**************/ 2911infobar { 2912border-style: none; 2913 2914&.info { background-color: $info_bg_color; } 2915 2916&.question { background-color: $question_bg_color; } 2917 2918&.warning { background-color: $warning_bg_color; } 2919 2920&.error { background-color: $error_bg_color; } 2921 2922&.info, 2923&.question, 2924&.warning, 2925&.error { 2926> label, & { color: $inversed_fg_color; } 2927 2928button { @extend %button_selected; } 2929 2930selection { } 2931 2932*:link { @extend %link_selected; } 2933} 2934} 2935 2936 2937/************ 2938* Tooltips * 2939************/ 2940tooltip { 2941&.background { 2942// background-color needs to be set this way otherwise it gets drawn twice 2943// see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details. 2944background-color: scale-alpha($base_color, $higher_opacity); 2945} 2946 2947// @extend %osd; 2948 2949// padding: 4px; /* not working */ 2950border-radius: 2px; 2951box-shadow: none; // otherwise it gets inherited by windowframe.csd 2952 2953// FIXME: we need a border or tooltips vanish on black background. 2954decoration { background-color: transparent; } 2955 2956label { 2957// tooltip label has already 6px margins 2958min-height: 32px - 6px * 2; 2959padding: 0 8px - 6px; 2960} 2961 2962* { // Yeah this is ugly 2963padding: 0; 2964background-color: transparent; 2965color: inherit; 2966} 2967} 2968 2969 2970/***************** 2971* Color Chooser * 2972*****************/ 2973colorswatch { 2974// This widget is made of two boxes one on top of the other, the lower box is colorswatch {} the other one 2975// is colorswatch overlay {}, colorswatch has the programmatically set background, so most of the style is 2976// applied to the overlay box. 2977 2978// base color corners rounding 2979// to avoid the artifacts caused by rounded corner anti-aliasing the base color 2980// sports a bigger radius. 2981// nth-child is needed by the custom color strip. 2982 2983&.top { 2984border-top-left-radius: $md_radius + 0.5px; 2985border-top-right-radius: $md_radius + 0.5px; 2986 2987overlay { 2988border-top-left-radius: $md_radius; 2989border-top-right-radius: $md_radius; 2990} 2991} 2992 2993&.bottom { 2994border-bottom-left-radius: $md_radius + 0.5px; 2995border-bottom-right-radius: $md_radius + 0.5px; 2996 2997overlay { 2998border-bottom-left-radius: $md_radius; 2999border-bottom-right-radius: $md_radius; 3000} 3001} 3002 3003&.left, 3004&:first-child:not(.top) { 3005border-top-left-radius: $md_radius + 0.5px; 3006border-bottom-left-radius: $md_radius + 0.5px; 3007 3008overlay { 3009border-top-left-radius: $md_radius; 3010border-bottom-left-radius: $md_radius; 3011} 3012} 3013 3014&.right, 3015&:last-child:not(.bottom) { 3016border-top-right-radius: $md_radius + 0.5px; 3017border-bottom-right-radius: $md_radius + 0.5px; 3018 3019overlay { 3020border-top-right-radius: $md_radius; 3021border-bottom-right-radius: $md_radius; 3022} 3023} 3024 3025&.dark overlay { color: $dark_contrast_color; } 3026 3027&.light overlay { color: $light_contrast_color; } 3028 3029&.dark { color: $dark_contrast_color; } // for focus ring 3030 3031&.light { color: $light_contrast_color; } // for focus ring 3032 3033&:drop(active) { 3034box-shadow: none; 3035 3036&.light overlay { 3037box-shadow: $z-depth-1, 0 0 0 2px $accent_color; 3038} 3039 3040&.dark overlay { 3041box-shadow: $z-depth-1, 0 0 0 2px $accent_color; 3042} 3043} 3044 3045overlay { 3046transition: $shadow_transition; 3047box-shadow: $z-depth-1; 3048 3049&:hover { box-shadow: $z-depth-2; } 3050} 3051 3052&#add-color-button { 3053border-radius: $md_radius $md_radius 0 0; 3054color: $dark_contrast_color; // for focus ring 3055 3056&:only-child { border-radius: $md_radius; } 3057 3058overlay { 3059background-image: linear-gradient(to right, 3060$error_bg_color 25%, 3061$warning_bg_color 25%, $warning_bg_color 50%, 3062$info_bg_color 50%, $info_bg_color 75%, 3063$question_bg_color 75%); 3064color: $dark_contrast_color; 3065} 3066} 3067 3068&:disabled { 3069opacity: $disabled_opacity; 3070 3071overlay { box-shadow: none; } 3072} 3073 3074row:selected & { 3075} 3076 3077&#editor-color-sample { 3078border-radius: $md_radius + 0.5px; 3079 3080overlay { border-radius: $md_radius; } 3081 3082// overlay:hover { box-shadow: $z-depth-1; } 3083} 3084} 3085 3086// colorscale popup 3087colorchooser .popover.osd { 3088transition: $shadow_transition; 3089border-radius: 2px; 3090box-shadow: $z-depth-2; 3091background-color: $base_color; 3092 3093&:backdrop { box-shadow: $z-depth-1; } 3094 3095spinbutton:not(.vertical) { @extend %entry.flat; } 3096} 3097 3098 3099/******** 3100* Misc * 3101********/ 3102//content view (grid/list) 3103.content-view { 3104background-color: $bg_color; 3105 3106// &:hover { -gtk-icon-effect: highlight; } 3107 3108rubberband { @extend rubberband; } 3109} 3110 3111.scale-popup { 3112.osd & { @extend %osd; } 3113 3114.osd & button.flat { //FIXME: quick hack, redo properly 3115} 3116 3117button { // +/- buttons on GtkVolumeButton popup 3118} 3119} 3120 3121 3122/********************** 3123* Window Decorations * 3124*********************/ 3125decoration { 3126transition: $shadow_transition; 3127border-radius: 2px 2px 0 0; 3128box-shadow: $z-depth-4, 0 16px 16px transparent; 3129 3130// FIXME rationalize shadows 3131 3132// this is used for the resize cursor area 3133margin: 8px; 3134 3135&:backdrop { 3136// the transparent shadow here is to enforce that the shadow extents don't 3137// change when we go to backdrop, to prevent jumping windows. 3138// The biggest shadow should be in the same order then in the active state 3139// or the jumping will happen during the transition. 3140box-shadow: $z-depth-2, 0 16px 16px transparent; 3141} 3142 3143.maximized &, 3144.fullscreen &, 3145.tiled & { border-radius: 0; } 3146 3147.popup & { box-shadow: none; } 3148 3149// server-side decorations as used by mutter 3150.ssd & { box-shadow: 0 3px 3px rgba(0, 0, 0, 0.16); } //just doing borders, wm draws actual shadows 3151 3152.csd.popup & { 3153border-radius: 2px; 3154box-shadow: $z-depth-2; 3155} 3156 3157tooltip.csd & { 3158border-radius: 2px; 3159box-shadow: $z-depth-2; 3160} 3161 3162messagedialog.csd & { 3163border-radius: 2px; 3164// box-shadow: $z-depth-4, 0 16px 16px transparent; 3165 3166// &:backdrop { box-shadow: $z-depth-2, 0 16px 16px transparent; } 3167} 3168 3169.solid-csd & { 3170margin: 0; 3171padding: 4px; 3172// border: solid 1px $borders_color; 3173// border-radius: 0; 3174box-shadow: inset 0 0 0 4px $headerbar_color; 3175// background-color: $borders_color; 3176} 3177} 3178 3179// Window Close button 3180button.titlebutton { 3181// @extend %simple_flat_button; 3182 3183@extend %circular_button; 3184 3185.selection-mode & { 3186} 3187} 3188 3189 3190// catch all extend :) 3191 3192%selected_items { 3193background-color: $primary_color; 3194 3195@at-root %nobg_selected_items, & { 3196color: $inversed_fg_color; 3197 3198&:disabled { color: $disabled_inversed_fg_color; } 3199} 3200} 3201 3202.monospace { font-family: monospace; } 3203 3204 3205/********************** 3206* Touch Copy & Paste * 3207*********************/ 3208//touch selection handlebars for the Popover.osd above 3209cursor-handle { 3210border-radius: $circular_radius; 3211background-color: $accent_color; 3212background-image: none; 3213 3214&.top:dir(ltr), &.bottom:dir(rtl) { 3215padding-left: 6px; 3216border-top-right-radius: 0; 3217} 3218 3219&.bottom:dir(ltr), &.top:dir(rtl) { 3220padding-right: 6px; 3221border-top-left-radius: 0; 3222} 3223 3224&.insertion-cursor:dir(ltr), &.insertion-cursor:dir(rtl) { 3225-GtkWidget-text-handle-width: 24; 3226-GtkWidget-text-handle-height: 30; 3227 3228$_url: 'assets/slider-horz-scale-has-marks-above#{$asset_suffix}'; 3229-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'), 3230url('#{$_url}@2.png')); 3231} 3232} 3233 3234.context-menu { font: initial; } // Decouple the font of context menus from their entry/textview 3235 3236%circular_button, 3237button.circular { // FIXME: aggregate to buttons 3238border-radius: $circular_radius; 3239-gtk-outline-radius: $circular_radius; 3240 3241// label { padding: 0; } 3242} 3243 3244%small_button { 3245min-height: $small_size; 3246min-width: $small_size; 3247padding: 0; 3248border-radius: $circular_radius; 3249-gtk-outline-radius: $circular_radius; 3250} 3251 3252// shortcut window keys 3253.keycap { 3254min-width: 28px - 8px * 2; 3255min-height: 28px - 2px; 3256margin-top: 2px; 3257padding-bottom: 2px; 3258padding-left: 8px; 3259padding-right: 8px; 3260 3261border: solid 1px $borders_color; 3262border-radius: 2px + 1px; 3263box-shadow: inset 0 -2px $borders_color; 3264background-color: $base_color; 3265color: $fg_color; 3266font-size: smaller; 3267} 3268 3269*:drop(active) { // FIXME needs to be done widget by widget, this wildcard should really die 3270transition: $longer_transition; 3271box-shadow: $z-depth-1, inset 0 0 0 2px $accent_color; 3272caret-color: $accent_color; 3273} 3274 3275stackswitcher button.text-button { min-width: 100px; } // FIXME aggregate with buttons 3276 3277stackswitcher button.circular, 3278stackswitcher button.text-button.circular { // FIXME aggregate with buttons 3279min-width: $medium_size; 3280min-height: $medium_size; 3281padding: 0; 3282} 3283