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