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