_common.scss
Unicode text, UTF-8 text
1$asset_suffix: if($variant=='dark', '-dark', ''); 2 3* { 4padding: 0; 5background-clip: padding-box; 6// transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); 7transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0; //FIXME: 8-GtkToolButton-icon-spacing: 4; 9-GtkTextView-error-underline-color: $error_color; 10 11-GtkCheckButton-indicator-size: 20; 12-GtkCheckMenuItem-indicator-size: 16; 13 14// The size for scrollbars. The slider is 2px smaller, but we keep it 15// up so that the whole area is sensitive to button presses for the 16// slider. The stepper button is larger in both directions, the slider 17// only in the width 18 19-GtkScrolledWindow-scrollbar-spacing: 0; 20-GtkScrolledWindow-scrollbars-within-bevel: 1; 21 22-GtkToolItemGroup-expander-size: 11; 23-GtkExpander-expander-size: 16; 24-GtkTreeView-expander-size: 11; 25 26-GtkTreeView-horizontal-separator: 4; 27 28-GtkMenu-horizontal-padding: 0; 29-GtkMenu-vertical-padding: 0; 30 31-GtkWidget-link-color: $link_color; 32-GtkWidget-visited-link-color: $link_visited_color; 33 34-GtkWidget-focus-padding: 2; // FIXME: do we still need these? 35-GtkWidget-focus-line-width: 1; // 36 37-GtkWidget-text-handle-width: 20; 38-GtkWidget-text-handle-height: 20; 39 40-GtkDialog-button-spacing: 4; 41-GtkDialog-action-area-border: 0; 42 43-GtkStatusbar-shadow-type: none; 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: $fill_color; 52outline-offset: -4px; 53outline-radius: 2px; 54} 55 56 57/*************** 58* Base States * 59***************/ 60 61.background { 62background-color: $bg_color; 63color: $fg_color; 64 65&:backdrop { 66// color: $backdrop_fg_color; 67} 68} 69 70/* 71These wildcard seems unavoidable, need to investigate. 72Wildcards are bad and troublesome, use them with care, 73or better, just don't. 74Everytime a wildcard is used a kitten dies, painfully. 75*/ 76 77*:insensitive { 78-gtk-image-effect: dim; 79} 80 81.gtkstyle-fallback { 82background-color: $bg_color; 83color: $fg_color; 84&:prelight { 85background-color: darken($bg_color, 5%); 86color: $fg_color; 87} 88&:active { 89background-color: darken($bg_color, 10%); 90color: $fg_color; 91} 92&:insensitive { 93background-color: $bg_color; 94color: $insensitive_fg_color; 95} 96&:selected { 97background-color: $selected_bg_color; 98color: $selected_fg_color; 99} 100} 101 102.view { 103@extend .list-row.activatable; 104background-color: $base_color; 105color: $text_color; 106 107&:hover, &:active, &:selected { border-radius: 2px; } 108 109&:insensitive { 110// background-color: $insensitive_base_color; 111color: $insensitive_fg_color; 112} 113 114&:backdrop { 115// color: $backdrop_text_color; 116} 117 118&:selected { @extend %selected_items; } 119} 120 121.rubberband { 122border: 1px solid $selected_bg_color; 123background-color: transparentize($selected_bg_color, 0.8); 124} 125 126.label { 127&.separator { 128color: $fg_color; 129@extend .dim-label; 130// &:backdrop { color: $backdrop_fg_color; } 131} 132&:selected { 133@extend %selected_items; 134} 135&:insensitive { 136color: $insensitive_fg_color; 137// &:backdrop { color: $backdrop_insensitive_fg_color; } 138} 139} 140 141.dim-label { 142opacity: 0.4; 143} 144 145GtkAssistant { 146.sidebar { 147padding: 6px 0; 148border-top: 1px solid $borders_color; 149&:dir(ltr) { border-right: 1px solid $borders_color; } 150&:dir(rtl) { border-left: 1px solid $borders_color; } 151} 152&.csd .sidebar { border-top-style: none; } 153.sidebar .label { 154opacity: 0.5; 155padding: 5px 12px 6px; 156font-weight: bold; 157} 158.sidebar .label.highlight { 159opacity: 1; 160} 161} 162 163GtkTextView { // This will get overridden by .view, needed by gedit line numbers 164background-color: $insensitive_base_color; 165} 166 167.grid-child { 168// outline-offset: -2px; 169padding: 4px; 170border-radius: 2px; 171&:selected { @extend %selected_items; } 172} 173 174%osd, .osd { opacity: 0.9; } 175 176/********************* 177* Spinner Animation * 178*********************/ 179 180@keyframes spin { 181to { -gtk-icon-transform: rotate(1turn); } 182} 183 184.spinner { 185background-color: blue; 186background-image: none; 187opacity: 0; // non spinning spinner makes no sense 188-gtk-icon-source: -gtk-icontheme('process-working-symbolic'); 189&:active { 190opacity: 1; 191animation: spin 1s linear infinite; 192&:insensitive { 193opacity: 0.4; 194} 195} 196} 197 198/**************** 199* Text Entries * 200****************/ 201 202.entry { 203padding: 7px 8px 8px; 204border-radius: 2px; 205@include entry(normal); 206&:focus { @include entry(focus); } 207&:insensitive { @include entry(insensitive); } 208&.flat { 209border-radius: 0; 210@include entry(flat); 211&:focus { @include entry(flat-focus); } 212&:insensitive { @include entry(flat-insensitive); } 213} 214 215&:selected { @extend %selected_items; } 216 217&.image { // icons inside the entry 218&.left { padding-left: 2px; } 219&.right { padding-right: 2px; } 220} 221 222&.progressbar { 223margin: 2px; 224border-style: none none solid; 225border-width: 2px; 226border-color: $selected_bg_color; 227border-radius: 0; 228box-shadow: none; 229background-color: transparent; 230background-image: none; 231} 232 233.linked > &:not(.flat) { @extend %linked; } 234 235.linked.vertical > &:not(.flat) { @extend %linked_vertical; } 236 237// entry error and warning style 238@each $e_type, $e_color in (error, $error_color), 239(warning, $warning_color) { 240&.#{$e_type} { 241@include entry(normal, $e_color); 242&:focus { @include entry(focus, $e_color); } 243&:insensitive { @include entry(insensitive, $e_color); } 244&.flat { 245@include entry(flat, $e_color); 246&:focus { @include entry(flat-focus, $e_color); } 247&:insensitive { @include entry(flat-insensitive, $e_color); } 248} 249} 250} 251 252&.image { // entry icons colors 253&:not(:hover):not(:active) { color: gtkalpha(currentColor, 0.8); } 254&:insensitive { color: gtkalpha(currentColor, 0.4); } 255} 256 257.osd & { 258} 259} 260 261 262/*********** 263* Buttons * 264***********/ 265 266// stuff for .needs-attention 267@keyframes needs_attention { 268from { 269background-image: -gtk-gradient(radial, 270center center, 0, 271center center, 0.001, 272to($selected_bg_color), 273to(transparent)); 274} 275to { 276background-image: -gtk-gradient(radial, 277center center, 0, 278center center, 0.5, 279to($selected_bg_color), 280to(transparent)); 281} 282} 283 284 285.button { 286padding: 7px 10px 8px; 287border-radius: 2px; 288background-repeat: no-repeat; 289background-position: center, center; 290background-size: 36px * 2 / 0.8 36px * 2 / 0.8, auto; 291font-weight: 500; 292@include button(normal); 293&:hover { @include button(hover); } 294&:active { @include button(active); } 295&:insensitive { @include button(insensitive); } 296&:checked { @include button(checked); } 297&:checked:insensitive { @include button(checked-insensitive); } 298&.flat { 299@include button(flat); 300&:hover { @include button(flat-hover); } 301&:active { @include button(flat-active); } 302&:insensitive { @include button(flat-insensitive); } 303&:checked { @include button(flat-checked); } 304&:checked:insensitive { @include button(flat-checked-insensitive); } 305.linked > & { 306border-radius: 2px; 307&.image-button { 308outline-radius: 100px; 309border-radius: 100px; 310} 311} 312} 313// big standalone buttons like in Documents pager 314&.osd { 315&.image-button { padding: 16px; } 316&:insensitive { opacity: 0; } 317} 318//overlay / OSD style 319.osd & { 320} 321 322// Suggested and Destructive Action buttons 323@each $b_type, $b_color in (suggested-action, $selected_bg_color), 324(destructive-action, $destructive_color) { 325&.#{$b_type} { 326background-color: $b_color; 327color: $selected_fg_color; 328// @include button(normal, $b_color, white); 329// &:hover { @include button(hover, $b_color, white); } 330// &:active, &:checked { @include button(active, $b_color, white); } 331&:insensitive { @include button(insensitive, $b_color, white); } 332&:checked { background-color: mix($selected_fg_color, $b_color, 20%); } 333&.flat { 334background-color: transparent; 335color: $b_color; 336// @include button(flat, $b_color, white); 337// &:hover { @include button(flat-hover, $b_color, white); } 338// &:active, &:checked { @include button(flat-active, $b_color, white); } 339&:insensitive { @include button(flat-insensitive, $b_color, white); } 340} 341} 342} 343 344&.image-button { @extend %image_button; } 345 346&.text-button { 347padding-left: 16px; 348padding-right: 16px; 349} 350 351&.text-button.image-button { 352// those buttons needs uneven horizontal padding, we want the icon side 353// to have the image-button padding, while the text side the text-button 354// one, so we're adding the missing padding to the label depending on 355// its position inside the button 356padding: 7px 10px 8px; // same as .button 357outline-radius: 2px; 358border-radius: 2px; 359background-size: 36px * 2 / 0.8 36px * 2 / 0.8, auto; 360.label:first-child { padding-left: 6px; } 361.label:last-child { padding-right: 6px; } 362} 363 364.stack-switcher > & { 365// to position the needs attention dot, padding is added to the button 366// child, a label needs just lateral padding while an icon needs vertical 367// padding added too. 368 369outline-offset: -4px; // needs to be set or it gets overriden by GtkRadioButton outline-offset 370 371> .label { 372padding-left: 6px; // label padding 373padding-right: 6px; // 374} 375> GtkImage { 376padding-left: 6px; // image padding 377padding-right: 6px; // 378padding-top: 3px; // 379padding-bottom: 3px; // 380} 381&.text-button { 382padding: 7px 10px 8px; // needed or it will get overridden 383} 384&.image-button { 385// we want image buttons to have a 1:1 aspect ratio, so compensation 386// of the padding added to the GtkImage is needed 387padding: 7px 4px; 388} 389&.needs-attention > .label, 390&.needs-attention > GtkImage { @extend %needs_attention; } 391&.needs-attention:checked > .label, 392&.needs-attention:checked > GtkImage { 393animation: none; 394background-image: none; 395} 396} 397 398//inline-toolbar buttons 399.inline-toolbar & { 400@extend .button.flat; 401@extend %image_button; 402} 403 404.primary-toolbar & { icon-shadow: none; } // tango icons don't need shadows 405 406.linked > &:not(.flat):not(:only-child) { @extend %linked; } 407 408.linked.vertical > &:not(.flat):not(:only-child) { @extend %linked_vertical; } 409} 410 411%image_button { 412padding: 10px; 413outline-radius: 100px; 414border-radius: 100px; 415background-size: 36px * 1 / 0.8 36px * 1 / 0.8, auto; 416} 417 418%needs_attention { 419transition: none; 420animation: needs_attention 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards; 421background-repeat: no-repeat; 422background-position: right 3px; 423background-size: 6px 6px; 424&:dir(rtl) { background-position: left 3px; } 425} 426 427 428// all the following is for the +|- buttons on inline toolbars, that way 429// should really be deprecated... 430.inline-toolbar GtkToolButton > .button { // redefining the button look is 431// needed since those are flat... 432} 433 434// More inline toolbar buttons 435.inline-toolbar.toolbar GtkToolButton { 436// & > .button.flat { @extend %linked_middle; } 437// &:first-child > .button.flat { @extend %linked:first-child; } 438// &:last-child > .button.flat { @extend %linked:last-child; } 439// &:only-child > .button.flat { @extend %linked:only-child; } 440} 441 442%linked_middle { 443border-radius: 0; 444} 445 446%linked { 447outline-radius: 2px; 448@extend %linked_middle; 449&:first-child { 450border-top-left-radius: 2px; 451border-bottom-left-radius: 2px; 452} 453&:last-child { 454border-top-right-radius: 2px; 455border-bottom-right-radius: 2px; 456} 457&:only-child { 458border-radius: 2px; 459} 460} 461 462%linked_vertical_middle { 463border-radius: 0; 464} 465 466%linked_vertical{ 467outline-radius: 2px; 468@extend %linked_vertical_middle; 469&:first-child { 470border-top-left-radius: 2px; 471border-top-right-radius: 2px; 472} 473&:last-child { 474border-bottom-left-radius: 2px; 475border-bottom-right-radius: 2px; 476} 477&:only-child { 478border-radius: 2px; 479} 480} 481 482/* menu buttons */ 483.menuitem.button.flat { 484&:selected { @extend %selected_items; } 485} 486 487 488GtkColorButton.button { 489padding: 7px 8px 8px; // Uniform padding on the GtkColorButton 490 491GtkColorSwatch:first-child:last-child { // :first-child:last-child for a specificity bump, it gets overridden by the 492// colorpicker style, otherwise 493border-radius: 2px; 494box-shadow: $z-depth-1; 495} 496} 497 498/********* 499* Links * 500*********/ 501 502*:link { 503color: $link_color; 504&:hover, &:active { color: $link_color; } 505&:visited { 506color: $link_visited_color; 507&:hover, &:active { color: $link_visited_color; } 508*:selected & { color: mix($selected_fg_color, $selected_bg_color, 60%); } 509} 510&:selected, *:selected & { 511color: mix($selected_fg_color, $selected_bg_color, 80%); 512} 513} 514 515.button:link, .button:visited { 516@extend *:link; 517& > .label { 518text-decoration-line: underline; 519} 520} 521 522/***************** 523* GtkSpinButton * 524*****************/ 525 526.spinbutton { 527.button { 528padding: 4px; 529border: solid 6px transparent; 530@extend %image_button; 531// @extend .button.flat; 532@include button(flat); 533&:hover { @include button(flat-hover); } 534&:active { @include button(flat-active); } 535&:insensitive { @include button(flat-insensitive); } 536} 537.osd & { 538.button { 539} 540} 541&.vertical { //FIXME: try using linking templates for vertically linked stuff 542.button { 543padding-top: 10px; // Same vertical padding as image-buttons 544padding-bottom: 10px; // 545border: none; 546&:first-child { 547border-radius: 2px 2px 0 0; 548} 549&:last-child { 550border-radius: 0 0 2px 2px; 551} 552} 553&.entry { 554} 555} 556GtkTreeView & { 557&.entry, &.entry:focus { 558// padding: 1px; 559// border-width: 1px 0; 560// border-color: $selected_bg_color; 561// border-radius: 0; 562// box-shadow: none; 563} 564} 565} 566 567/************** 568* ComboBoxes * 569**************/ 570GtkComboBox { 571> .the-button-in-the-combobox { padding: 5px 6px 6px; } // Otherwise combos 572// are bigger then 573// buttons 574-GtkComboBox-arrow-scaling: 0.5; 575-GtkComboBox-shadow-type: none; 576 577.menu .menuitem { padding: 5px 6px 6px; } 578.separator.vertical { 579// always disable separators 580-GtkWidget-wide-separators: true; 581} 582&.combobox-entry .entry { 583&:dir(ltr) { 584border-top-right-radius: 0; 585border-bottom-right-radius: 0; 586} 587&:dir(rtl) { 588border-top-left-radius: 0; 589border-bottom-left-radius: 0; 590} 591} 592&.combobox-entry .button { 593padding: 10px; 594&:dir(ltr) { 595border-top-left-radius: 0; 596border-bottom-left-radius: 0; 597} 598&:dir(rtl) { 599border-top-right-radius: 0; 600border-bottom-right-radius: 0; 601} 602} 603} 604 605.linked > GtkComboBox > .the-button-in-the-combobox, 606.linked > GtkComboBoxText > .the-button-in-the-combobox { 607// the combo is a composite widget so the way we do button linkind doesn't 608// work, special case needed. See 609// https://bugzilla.gnome.org/show_bug.cgi?id=733979 610&:dir(ltr), 611&:dir(rtl) { @extend %linked_middle; } // specificity bump 612} 613.linked > GtkComboBox:first-child > .the-button-in-the-combobox, 614.linked > GtkComboBoxText:first-child > .the-button-in-the-combobox { 615@extend %linked:first-child; 616} 617.linked > GtkComboBox:last-child > .the-button-in-the-combobox, 618.linked > GtkComboBoxText:last-child > .the-button-in-the-combobox { 619@extend %linked:last-child; 620} 621.linked > GtkComboBox:only-child > .the-button-in-the-combobox, 622.linked > GtkComboBoxText:only-child > .the-button-in-the-combobox { 623@extend %linked:only-child; 624} 625 626.linked.vertical > GtkComboBoxText > .the-button-in-the-combobox, 627.linked.vertical > GtkComboBox > .the-button-in-the-combobox { @extend %linked_vertical_middle; } 628.linked.vertical > GtkComboBoxText:first-child > .the-button-in-the-combobox, 629.linked.vertical > GtkComboBox:first-child > .the-button-in-the-combobox { @extend %linked_vertical:first-child; } 630.linked.vertical > GtkComboBoxText:last-child > .the-button-in-the-combobox, 631.linked.vertical > GtkComboBox:last-child > .the-button-in-the-combobox { @extend %linked_vertical:last-child; } 632.linked.vertical > GtkComboBoxText:only-child > .the-button-in-the-combobox, 633.linked.vertical > GtkComboBox:only-child > .the-button-in-the-combobox { @extend %linked_vertical:only-child; } 634 635/************ 636* Toolbars * 637************/ 638.toolbar { 639-GtkWidget-window-dragging: true; 640padding: 4px; 641background-color: $bg_color; 642.osd &, &.osd { 643padding: 6px; 644border-style: solid; 645border-width: 8px; 646border-image: -gtk-scaled(url("assets/osd-shadow#{$asset_suffix}.png"), 647url("assets/osd-shadow#{$asset_suffix}@2.png")) 64810 / 10px stretch; 649border-radius: 2px; 650// box-shadow: $z-depth-2; 651background-color: $base_color; 652&:backdrop { 653border-image: -gtk-scaled(url("assets/osd-shadow-backdrop#{$asset_suffix}.png"), 654url("assets/osd-shadow-backdrop#{$asset_suffix}@2.png")) 65510 / 10px stretch; 656// box-shadow: $z-depth-1; 657} 658& .button { 659@extend .button.flat; 660} 661} 662} 663 664//searchbar, location-bar & inline-toolbar 665.inline-toolbar { 666padding: 6px; 667border-style: solid; 668border-width: 0 1px 1px; 669border-color: $borders_color; 670background-color: $insensitive_base_color; 671} 672 673.search-bar, .location-bar { 674padding: 6px; 675border-style: solid; 676border-width: 0 0 1px; 677border-color: $borders_color; 678background-color: $dark_color; 679} 680 681/*************** 682* Header bars * 683***************/ 684 685.titlebar, 686.header-bar { 687padding: 6px; 688border-width: 0 0 1px; 689border-style: solid; 690border-color: $borders_color; 691border-radius: 2px 2px 0 0; 692box-shadow: inset 0 1px $highlight_color; 693background-color: $dark_color; 694background-clip: border-box; 695 696&:backdrop { 697// background-color: $dark_color; 698} 699 700.title { 701padding-left: 12px; 702padding-right: 12px; 703font-weight: bold; 704} 705 706.subtitle { 707@extend .dim-label; 708padding-left: 12px; 709padding-right: 12px; 710font-size: smaller; 711} 712 713.header-bar-separator, 714& > GtkBox > .separator.vertical { 715-GtkWidget-wide-separators: true; 716-GtkWidget-separator-width: 1px; 717border-style: solid; 718border-width: 0 1px; 719border-color: $borders_color; 720} 721 722& .button:not(.suggested-action):not(.destructive-action) { 723@extend .button.flat; 724border-image: -gtk-gradient(radial, 725center bottom, 0, 726center bottom, 0.001, 727to($selected_bg_color), 728to(transparent)) 7290 0 0 / 0 0 0px; 730&:checked { 731border-image: -gtk-gradient(radial, 732center bottom, 0, 733center bottom, 0.5, 734to($selected_bg_color), 735to(transparent)) 7360 0 2 / 0 0 2px; 737// box-shadow: inset 0 -2px $selected_bg_color; 738background-color: transparent; 739color: $fg_color; 740// transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0 cubic-bezier(0.4, 0, 0.2, 1) 0.2s, color 0; 741// &:active { transition: none; } 742&:insensitive { 743background-color: transparent; 744color: $insensitive_fg_color; 745> .label { color: inherit; } 746} 747} 748} 749 750&.selection-mode { 751box-shadow: inset 0 1px transparentize(white, 0.8); 752background-color: $selected_bg_color; 753color: $selected_fg_color; 754&:backdrop { 755} 756 757.subtitle:link { @extend *:link:selected; } 758 759.button { 760border-image: -gtk-gradient(radial, 761center bottom, 0, 762center bottom, 0.001, 763to($selected_fg_color), 764to(transparent)) 7650 0 0 / 0 0 0px; 766color: $secondary_selected_fg_color; 767&:hover, &:active, &:checked { 768color: $selected_fg_color; 769} 770 771&:insensitive { 772} 773 774&:checked { 775border-image: -gtk-gradient(radial, 776center bottom, 0, 777center bottom, 0.5, 778to($selected_fg_color), 779to(transparent)) 7800 0 2 / 0 0 2px; 781// box-shadow: inset 0 -2px $selected_fg_color; 782color: $selected_fg_color; 783&:insensitive { 784color: $insensitive_selected_fg_color; 785> .label { color: inherit; } 786} 787} 788&.suggested-action { 789// NOTE: do not use @extend .button; 790@include button(normal); 791&:hover { @include button(hover); } 792&:active { @include button(active); } 793&:insensitive { @include button(insensitive); } 794} 795} 796 797.selection-menu { 798padding-left: 16px; 799padding-right: 16px; 800 801GtkArrow { -GtkArrow-arrow-scaling: 1; } 802 803.arrow { 804-gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); 805} 806} 807} 808 809.tiled &, .maximized & { 810border-radius: 0; // squared corners when the window is max'd or tiled 811box-shadow: none; 812} 813 814&.default-decoration { 815padding: 4px; 816border-width: 0; 817.button { padding: 6px; } 818} 819} 820 821/************ 822* Pathbars * 823************/ 824 825.path-bar .button { 826padding: 7px 6px 8px; 827&.image-button { padding: 10px; } 828&:only-child { 829padding-left: 16px; 830padding-right: 16px; 831} 832 833// the following is for spacing the icon and the label inside the home button 834.label:last-child { padding-left: 2px; } 835.label:first-child { padding-right: 2px; } 836.label:only-child { padding-right: 0; padding-left: 0; } 837GtkImage { padding-top: 1px; } 838} 839 840/************** 841* Tree Views * 842**************/ 843GtkTreeView.view { 844-GtkTreeView-grid-line-width: 1; 845-GtkTreeView-grid-line-pattern: ''; 846-GtkTreeView-tree-line-width: 1; 847-GtkTreeView-tree-line-pattern: ''; 848-GtkTreeView-expander-size: 16; 849 850border-left-color: $fill_color; // this is actually the tree lines color, 851border-top-color: $borders_color; // while this is the grid lines color, better then nothing 852 853&.rubberband { @extend .rubberband; } // to avoid borders being overridden by the previously set props 854 855border-radius: 0; // rest border radius in lists 856 857&:hover, &:active, &:selected { border-radius: 0; } 858 859&.dnd { 860border-style: solid none; 861border-width: 1px; 862border-color: mix($fg_color, $selected_bg_color, 50%); 863} 864 865&.expander { 866-gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); 867&:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); } 868&:checked { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } 869&:selected { 870color: transparentize($selected_fg_color, 0.4); 871&:hover, &:active { color: $selected_fg_color; } 872} 873} 874 875&.progressbar { // progress bar in treeviews 876@extend .entry.progressbar; 877border-width: 4px; 878&:selected { 879border-color: currentColor; 880} 881} 882 883&.trough { // progress bar trough in treeviews 884@extend .entry.progressbar; 885border-width: 4px; 886border-color: transparentize($selected_bg_color, 0.8); 887&:selected { 888border-color: $fill_color; 889} 890} 891} 892 893column-header { 894.button { 895@extend .list-row.activatable; 896padding: 3px 6px 4px; 897border-style: none solid solid none; 898border-width: 1px; 899border-color: $borders_color; 900border-radius: 0; 901box-shadow: none; 902background-color: $base_color; 903// font-weight: bold; 904&:hover, &:active { 905box-shadow: none; 906} 907&:insensitive { 908background-color: $base_color; 909} 910&.dnd { 911@extend column-header.button.dnd; 912} 913} 914&:last-child .button, 915&:last-child.button { //treeview-like derived widgets in Banshee and Evolution 916border-right-style: none; 917} 918} 919 920column-header.button.dnd { // for treeview-like derive widgets 921// transition: none; 922border-left-style: solid; 923color: $selected_bg_color; 924} 925 926 927/********* 928* Menus * 929*********/ 930.menubar { 931-GtkWidget-window-dragging: true; 932padding: 0px; 933box-shadow: inset 0 -1px $borders_color; 934background-color: $dark_color; 935& > .menuitem { 936padding: 4px 8px; 937color: $secondary_fg_color; 938&:hover { //Seems like it :hover even with keyboard focus 939box-shadow: inset 0 -2px $selected_bg_color; 940color: $fg_color; 941} 942&:insensitive { 943color: $insensitive_fg_color; 944box-shadow: none; 945} 946} 947} 948 949.menu { 950margin: 4px; 951padding: 0px; 952background-color: $base_color; 953border: 1px solid $borders_color; // adds borders in a non composited env 954.csd & { border: none; } // axes borders in a composited env 955.menuitem { 956transition-duration: 0.1s; 957padding: 3px 4px 4px; 958font: initial; 959text-shadow: none; 960&:hover { 961transition-duration: 0; 962color: $selected_fg_color; 963background-color: $selected_bg_color; 964} 965&:insensitive { 966color: $insensitive_fg_color; 967} 968//submenu indicators 969&.arrow { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); } 970&.arrow:dir(rtl) {-gtk-icon-source:-gtk-icontheme('pan-end-symbolic-rtl'); } 971} 972&.button { // overlow buttons 973border-style: none; 974border-radius: 0; 975&.top { border-bottom: 1px solid $borders_color; } 976&.bottom { border-top: 1px solid $borders_color; } 977&:hover { background-color: $fill_color; } 978&:insensitive { 979color: transparent; 980background-color: transparent; 981border-color: transparent ; 982} 983} 984} 985 986.menuitem .accelerator { color: gtkalpha(currentColor, 0.4); } 987 988 989/*************** 990* Popovers * 991***************/ 992 993.popover { 994padding: 2px; 995border: 1px solid; 996border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.2) rgba(0, 0, 0, 0.3); 997border-radius: 2px + 1px; 998background-color: $insensitive_base_color; 999box-shadow: $z-depth-2; 1000&:backdrop { box-shadow: $z-depth-1; } 1001 1002> .list, 1003> .view, 1004> .toolbar, 1005&.osd > .toolbar { 1006border-style: none; 1007border-image: none; 1008background-color: transparent; 1009} 1010 1011.button.flat { 1012padding: 5px 8px 6px; 1013background-color: transparent; 1014background-size: 128px * 1 / 0.8 128px * 1 / 0.8, auto; 1015color: $fg_color; 1016font: initial; 1017} 1018 1019.linked > .button { 1020border-radius: 2px; 1021// @extend .button.flat; 1022@include button(flat); 1023&:hover { @include button(flat-hover); } 1024&:active { @include button(flat-active); } 1025&:insensitive { @include button(flat-insensitive); } 1026&:checked { @include button(checked); } 1027&:checked:insensitive { @include button(checked-insensitive); } 1028} 1029 1030&.osd { @extend %osd; } 1031} 1032 1033/***************** 1034* Notebooks and * 1035* Tabs * 1036*****************/ 1037 1038.notebook { 1039// Through me you go to the grief wracked city; 1040// Through me you go to everlasting pain; 1041// Through me you go a pass among lost souls. 1042// ... 1043// Abandon all hope — Ye Who Enter Here 1044padding: 0; 1045background-color: $base_color; 1046-GtkNotebook-initial-gap: 6; 1047-GtkNotebook-arrow-spacing: 5; 1048-GtkNotebook-tab-curvature: 0; 1049-GtkNotebook-tab-overlap: 1; 1050-GtkNotebook-has-tab-gap: false; 1051-GtkWidget-focus-padding: 0; 1052-GtkWidget-focus-line-width: 0; 1053&.frame { 1054border: 1px solid $borders_color; 1055// FIXME doesn't work 1056&.top { border-top-width: 0; } 1057&.bottom { border-bottom-width: 0; } 1058&.right { border-right-width: 0; } 1059&.left { border-left-width: 0; } 1060} 1061&.header { 1062// FIXME: double borders in some case, can't fix it w/o a class tho 1063// FIXME: doesn't work on dark var 1064background-color: $dark_color; 1065 1066// this is the shading of the header behind the tabs 1067&.frame { 1068border: 1px solid $borders_color; 1069&.top { border-bottom-width: 0; } 1070&.bottom { border-top-width: 0; } 1071&.right { border-left-width: 0; } 1072&.left { border-right-width: 0; } 1073} 1074 1075&.top { 1076box-shadow: inset 0 -1px $borders_color; // border 1077} 1078&.bottom { 1079box-shadow: inset 0 1px $borders_color; 1080} 1081&.right { 1082box-shadow: inset 1px 0 $borders_color; 1083} 1084&.left { 1085box-shadow: inset -1px 0 $borders_color; 1086} 1087} 1088tab { 1089border-width: 0; 1090border-style: solid; 1091border-color: transparent; 1092background-color: transparent; 1093 1094outline-offset: 0; 1095 1096$tab_indicator_size: 2px; 1097//vertical tab sizing 1098$vt_vpadding: 8px; 1099$vt_hpadding: 20px; 1100// horizontal tab sizing 1101$ht_vpadding: 5px; 1102$ht_hpadding: 20px; 1103 1104//FIXME: we get double border in some cases, not considering the broken 1105//notebook content frame... 1106&.top, &.bottom { padding: $vt_vpadding $vt_hpadding; } 1107&.left, &.right { padding: $ht_vpadding $ht_hpadding; } 1108 1109 1110/* works for testnotebookdnd, but there's a superfluous border 1111in gedit or web, commented out for now, needs gtk fixes 1112&.reorderable-page { 1113&.top { 1114padding-top: ($vt_vpadding - 1px); 1115border-top-width: 1px; 1116border-left-width: 1px; 1117border-right-width: 1px; 1118} 1119&.bottom { 1120padding-bottom: ($vt_vpadding - 1px); 1121border-bottom-width: 1px; 1122border-left-width: 1px; 1123border-right-width: 1px; 1124} 1125&.left { 1126padding-left: ($ht_hpadding - 1px); 1127border-left-width: 1px; 1128border-top-width: 1px; 1129border-bottom-width: 1px; 1130} 1131&.right { 1132padding-right: ($ht_hpadding - 1px); 1133border-right-width: 1px; 1134border-top-width: 1px; 1135border-bottom-width: 1px; 1136} 1137} 1138*/ 1139&.reorderable-page { 1140-GtkNotebook-tab-overlap: 1; 1141&.top, &.bottom { 1142padding-left: 12px; // for a nicer close button 1143padding-right: 12px; // placement 1144border-left-width: 1px; 1145border-right-width: 1px; 1146} 1147&.left, &.right { 1148border-bottom-width: 1px; 1149border-top-width: 1px; 1150} 1151} 1152&.top { 1153//padding-bottom: ($vt_vpadding -$tab_indicator_size); 1154border-bottom-width: $tab_indicator_size; 1155} 1156&.bottom { 1157//padding-top: ($vt_vpadding -$tab_indicator_size); 1158border-top-width: $tab_indicator_size; 1159} 1160&.left { 1161//padding-right: ($ht_hpadding -$tab_indicator_size); 1162border-right-width: $tab_indicator_size; 1163} 1164&.right { 1165//padding-left: ($ht_hpadding -$tab_indicator_size); 1166border-left-width: $tab_indicator_size; 1167} 1168 1169//here's the interesting stuff 1170&:hover, &.prelight-page { 1171border-color: $fill_color; 1172} 1173&:active, &.active-page { 1174border-color: $selected_bg_color; 1175} 1176@each $_tab, $_border in (top, bottom), 1177(bottom, top), 1178(left, right), 1179(right, left) { 1180&.reorderable-page.#{$_tab} { 1181border-color: transparent; 1182&:hover, &.prelight-page { 1183border-color: $borders_color; 1184border-#{$_border}-width: 1px; 1185border-#{$_border}-color: transparent; 1186background-color: $bg_color; 1187} 1188&:active, &.active-page { 1189border-color: $borders_color; 1190border-#{$_border}-width: 1px; 1191border-#{$_border}-color: transparent; 1192background-color: $light_color; 1193} 1194} 1195} 1196.label { //tab text 1197padding: 0 2px; // needed for a nicer focus ring 1198font-weight: bold; 1199color: $secondary_fg_color; 1200} 1201.prelight-page .label, .label.prelight-page { 1202// prelight tab text 1203color: $fg_color; 1204} 1205.active-page .label, .label.active-page { 1206// active tab text 1207color: $fg_color; 1208} 1209.button { //tab close button 1210// &:not(:hover):not(:active) > GtkImage { opacity: 0.6; } 1211padding: 0; 1212@extend %image_button; 1213background-size: 24px * 1 / 0.8 24px * 1 / 0.8, auto; 1214// @extend .button.flat; 1215@include button(flat); 1216&:hover { @include button(flat-hover); } 1217&:active { @include button(flat-active); } 1218&:insensitive { @include button(flat-insensitive); } 1219& > GtkImage { // this is a hack which makes tabs grow 1220padding: 4px; 1221} 1222} 1223} 1224&.arrow { 1225&:not(:hover):not(:active) { color: gtkalpha(currentColor, 0.8); } 1226&:insensitive { 1227color: $insensitive_fg_color; 1228} 1229} 1230&:not(.reorderable-page) > .entry { 1231@extend .entry.flat; 1232} 1233} 1234 1235/************** 1236* Scrollbars * 1237**************/ 1238 1239.scrollbar { 1240-GtkRange-slider-width: 17; 1241-GtkRange-trough-border: 0; 1242-GtkScrollbar-has-backward-stepper: false; 1243-GtkScrollbar-has-forward-stepper: false; 1244-GtkScrollbar-min-slider-length: 32; // minimum size for the slider. 1245// sadly can't be in '.slider' 1246// where it belongs 1247-GtkRange-stepper-spacing: 0; 1248-GtkRange-trough-under-steppers: 1; 1249 1250$_slider_margin: 4px; 1251$_slider_fine_tune_margin: 6px; 1252 1253.button { 1254border: none; 1255} 1256 1257&.overlay-indicator { 1258&:not(.dragging):not(.hovering) { // Overlay scrolling indicator 1259-GtkRange-slider-width: 12px; 1260 1261.slider { 1262margin: 2px; 1263border: 2px solid if($variant==light, transparentize(white, 0.8), transparentize(black, 0.8)); 1264// background-clip: padding-box; 1265} 1266 1267.trough { 1268border-style: none; 1269background-color: transparent; 1270} 1271 1272// w/o the following margin tweaks the slider shrinks when hovering/dragging 1273&.vertical .slider { 1274// margin-top: $_slider_margin - 1px; 1275// margin-bottom: $_slider_margin - 1px; 1276} 1277 1278&.horizontal .slider { 1279// margin-left: $_slider_margin - 1px; 1280// margin-right: $_slider_margin - 1px; 1281} 1282 1283} 1284 1285&.dragging, 1286&.hovering { opacity: 0.8; } 1287} 1288 1289// trough coloring 1290.trough { 1291background-color: $base_color; 1292border: 1px none $borders_color; 1293} 1294 1295// slider coloring 1296.slider { 1297background-color: scale-color($fg_color, $alpha: -40%); 1298&:hover { background-color: $secondary_fg_color; } 1299&:active { background-color: $fg_color; } 1300&:insensitive { 1301background-color: transparent; 1302} 1303} 1304 1305 1306// sizing 1307.slider { 1308border-radius: 100px; 1309margin: $_slider_margin; 1310} 1311 1312&.fine-tune .slider { margin: $_slider_fine_tune_margin; } 1313 1314&.vertical { 1315 1316.slider { 1317margin-left: 1px + $_slider_margin; 1318 1319&:dir(rtl) { 1320margin-left: $_slider_margin; 1321margin-right: 1px + $_slider_margin; 1322} 1323} 1324 1325&.fine-tune .slider { 1326margin-left: 1px + $_slider_fine_tune_margin; 1327 1328&:dir(rtl) { 1329margin-left: $_slider_fine_tune_margin; 1330margin-right: 1px + $_slider_fine_tune_margin; 1331} 1332} 1333 1334.trough { 1335border-left-style: solid; 1336 1337&:dir(rtl) { 1338border-left-style: none; 1339border-right-style: solid; 1340} 1341} 1342} 1343 1344&.horizontal { 1345 1346.slider { margin-top: 1px + $_slider_margin; } 1347 1348&.fine-tune .slider { margin-top: 1px + $_slider_fine_tune_margin; } 1349 1350.trough { border-top-style: solid; } 1351} 1352} 1353 1354.scrollbars-junction, 1355.scrollbars-junction.frame { // the small square between two scrollbars 1356border-style: solid none none solid; 1357background-color: $base_color; 1358 1359&:dir(rtl) { border-style: solid solid none none; } 1360} 1361 1362 1363/********** 1364* Switch * 1365**********/ 1366 1367GtkSwitch { 1368-GtkSwitch-slider-width: 28px; // 55px is the right value to make it as tall 1369// as buttons, not doing that for now 1370-GtkSwitch-slider-height: 28px; 1371 1372outline-offset: -4px; 1373outline-radius: 100px; 1374font-size: 0; 1375&.trough { 1376// similar to the .scale 1377border: 10px solid transparent; 1378border-radius: 100px; 1379background-color: $fill_color; 1380&:insensitive { 1381color: $insensitive_fg_color; 1382} 1383&:active { 1384background-color: $success_color; 1385&:insensitive { 1386background-color: $fill_color; 1387color: $success_color; 1388} 1389} 1390} 1391&.slider { 1392padding: 4px; 1393border-radius: 100px; 1394@include entry(normal); 1395&:hover { @include entry(focus); } 1396&:insensitive { @include entry(insensitive); } 1397} 1398.list-row:selected & { 1399} 1400 1401} 1402 1403/************************* 1404* Check and Radio items * 1405*************************/ 1406 1407// draw regular check and radio items using our PNG assets 1408// all assets are rendered from assets.svg. never add pngs directly 1409 1410@each $w,$a in ('check', 'checkbox'), 1411('radio','radio') { 1412 1413//standard checks and radios 1414@each $s,$as in ('','-unchecked'), 1415(':active', '-unchecked-active'), 1416(':insensitive','-unchecked-insensitive'), 1417(':inconsistent', '-mixed'), 1418(':inconsistent:active', '-mixed-active'), 1419(':inconsistent:insensitive', '-mixed-insensitive'), 1420(':checked', '-checked'), 1421(':checked:active', '-checked-active'), 1422(':checked:insensitive','-checked-insensitive') { 1423.#{$w}#{$s} { 1424-gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}#{$asset_suffix}.png"), 1425url("assets/#{$a}#{$as}#{$asset_suffix}@2.png")); 1426icon-shadow: $z-depth-1; 1427&:hover, &:active { icon-shadow: $z-depth-2; } 1428&:insensitive { icon-shadow: none; } 1429&.button.flat { } 1430} 1431} 1432 1433//menu 1434@each $s,$as in ('',''), 1435// (':active', '-checked'), 1436(':insensitive','-insensitive'), 1437(':inconsistent', '-mixed'), 1438// (':inconsistent:active', '-mixed'), 1439(':inconsistent:insensitive', '-mixed-insensitive'), 1440(':checked', '-checked'), 1441// (':checked:active', '-checked'), 1442(':checked:insensitive','-checked-insensitive') { 1443.menu .menuitem.#{$w}#{$s} { 1444// color: gtkalpha(currentColor, 0.8); 1445// -gtk-icon-source: -gtk-icontheme('#{$a}-symbolic'); 1446// &:active, &:checked { -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic'); } 1447// &:inconsistent { -gtk-icon-source: -gtk-icontheme('#{$a}-mixed-symbolic'); } 1448-gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}.png"), 1449url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}@2.png")); 1450icon-shadow: none; 1451&:hover { 1452-gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}-symbolic-dark.png"), 1453url("assets/#{$a}#{$as}-symbolic-dark@2.png")); 1454} 1455} 1456} 1457} 1458 1459//treeview and list-rows 1460.view.check, .view.radio, 1461.list-row .check, list-row .radio { 1462} 1463 1464//selection-mode 1465@each $s,$as in ('','-selectionmode'), 1466(':active', '-active-selectionmode'), 1467(':insensitive', '-insensitive-selectionmode'), 1468(':checked', '-checked-selectionmode'), 1469(':checked:active', '-checked-active-selectionmode'), 1470(':insensitive:checked', '-checked-insensitive-selectionmode') { 1471.view.content-view.check#{$s}:not(.list) { 1472-gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}.png"), 1473url("assets/checkbox#{$as}@2.png")); 1474background-color: transparent; 1475} 1476} 1477 1478GtkCheckButton.text-button, GtkRadioButton.text-button { 1479// this is for a nice focus on check and radios text 1480padding: 2px 4px; 1481outline-offset: 0; 1482&:insensitive, 1483&:insensitive:active, 1484&:insensitive:inconsistent { 1485// set insensitive color, which is overriden otherwise 1486// color: $insensitive_fg_color; 1487} 1488} 1489 1490/************ 1491* GtkScale * 1492************/ 1493.scale, 1494.scale.scale-has-marks-above.scale-has-marks-below, 1495.scale.vertical.scale-has-marks-above.scale-has-marks-below { 1496// FIXME: rationalize 1497-GtkScale-slider-length: 20; 1498-GtkRange-slider-width: 20; 1499-GtkRange-trough-border: 2; 1500outline-offset: -8px; 1501outline-radius: 100px; 1502 1503&.fine-tune { 1504// outline-offset: -6px; 1505&.slider { background-size: 80%; } 1506&.trough { 1507// margin: 8px; 1508// border-radius: 100px; 1509} 1510} 1511 1512&.slider { 1513&:not(:hover):not(:active) { background-size: 80%; } 1514// @include entry(normal); 1515// border-radius: 50%; 1516// background-color: $success_color; 1517@each $s,$as in ('',''), 1518// (':hover','-hover'), 1519(':active','-active'), 1520(':insensitive','-insensitive') { 1521&.slider#{$s} { 1522$_url: 'assets/slider#{$as}#{$asset_suffix}'; 1523border-style: none; 1524border-radius: 0; 1525background-color: transparent; 1526background-image: -gtk-scaled(url('#{$_url}.png'), 1527url('#{$_url}@2.png')); 1528background-repeat: no-repeat; 1529background-position: center; 1530box-shadow: none; 1531} 1532} 1533&:hover { 1534// @include entry(focus); 1535// border-radius: 50%; // needed for double marks scales 1536} 1537&:insensitive { 1538// @include entry(insensitive); 1539// border-radius: 50%; // overridden 1540} 1541//OSD sliders 1542.osd & { 1543} 1544} 1545&.trough { 1546margin: 10px; 1547border-radius: 100px; 1548background-color: $fill_color; 1549&.highlight { 1550background-color: $success_color; 1551&:insensitive { background-color: $fill_color; } 1552} 1553&:insensitive { color: $insensitive_fg_color; } 1554//OSD troughs 1555.osd & { 1556} 1557} 1558&.separator { 1559// color: gtkalpha(currentColor, 0.5); 1560} 1561// scales on selected list rows 1562.list-row:selected & { 1563} 1564} 1565 1566@each $d,$dn in ('', 'horz'), 1567('.vertical', 'vert') { 1568@each $w,$we in ('scale-has-marks-below','scale_marks_below'), 1569('scale-has-marks-above','scale_marks_above') { 1570.scale#{$d}.#{$w} { 1571-GtkScale-slider-length: 20; 1572-GtkRange-slider-width: 25; 1573-GtkRange-trough-border: 2; 1574 1575// color: gtkalpha(currentColor, 0.5); // marks color 1576 1577@extend %#{$we}_#{$dn}; 1578 1579@each $s,$as in ('',''), 1580// (':hover','-hover'), 1581(':active','-active'), 1582(':insensitive','-insensitive') { 1583&.slider#{$s} { 1584$_url: 'assets/slider-#{$dn}-#{$w}#{$as}#{$asset_suffix}'; 1585border-style: none; 1586border-radius: 0; 1587background-color: transparent; 1588background-image: -gtk-scaled(url('#{$_url}.png'), 1589url('#{$_url}@2.png')); 1590background-repeat: no-repeat; 1591background-position: center; 1592box-shadow: none; 1593} 1594} 1595} 1596} 1597} 1598 1599%scale_marks_above_horz { 1600.trough { margin: 15px 10px 10px; } 1601// &.fine-tune .trough { margin: 13px 8px 8px; } 1602} 1603%scale_marks_below_horz { 1604.trough { margin: 10px 10px 15px; } 1605// &.fine-tune .trough { margin: 8px 8px 13px; } 1606} 1607%scale_marks_above_vert { 1608.trough { margin: 10px 10px 10px 15px; } 1609// &.fine-tune .trough { margin: 8px 8px 8px 13px; } 1610} 1611%scale_marks_below_vert { 1612.trough { margin: 10px 15px 10px 10px; } 1613// &.fine-tune .trough { margin: 8px 13px 8px 8px; } 1614} 1615 1616/***************** 1617* Progress bars * 1618*****************/ 1619 1620GtkProgressBar { 1621-GtkProgressBar-min-horizontal-bar-height: 4; 1622-GtkProgressBar-min-vertical-bar-width: 4; 1623padding: 0; 1624font-size: smaller; 1625color: $secondary_fg_color; 1626&.osd { 1627-GtkProgressBar-xspacing: 0; 1628-GtkProgressBar-yspacing: 0; 1629-GtkProgressBar-min-horizontal-bar-height: 4; 1630} 1631&.trough { // background 1632border-radius: 0; 1633background-color: transparentize($selected_bg_color, 0.8); 1634&.osd { 1635border-style: none; 1636box-shadow: none; 1637// background-color: transparent; 1638} 1639} 1640} 1641 1642// moving bit 1643.progressbar { 1644border-radius: 0; 1645background-color: $selected_bg_color; 1646&.left { 1647border-top-left-radius: 0; 1648border-bottom-left-radius: 0; 1649} 1650&.right { 1651border-top-right-radius: 0; 1652border-bottom-right-radius: 0; 1653} 1654&.left.right { 1655box-shadow: none; 1656} 1657&.vertical { 1658&.bottom { 1659border-bottom-left-radius: 0; 1660border-bottom-right-radius: 0; 1661box-shadow: none; 1662} 1663&.top { 1664border-top-left-radius: 0; 1665border-top-right-radius: 0; 1666} 1667} 1668&.osd { 1669background-image: none; 1670background-color: $selected_bg_color; 1671border-style: none; 1672border-radius: 0; 1673} 1674} 1675 1676 1677/************* 1678* Level Bar * 1679*************/ 1680 1681.level-bar { 1682box-shadow: $z-depth-1; // needs to be set here to avoid clipping 1683-GtkLevelBar-min-block-width: 36; 1684-GtkLevelBar-min-block-height: 4; 1685&.vertical { 1686-GtkLevelBar-min-block-width: 4; 1687-GtkLevelBar-min-block-height: 36; 1688} 1689&.trough { 1690padding: 2px; 1691border-radius: 2px; 1692@include entry(normal); 1693&:insensitive { @include entry(insensitive); } 1694&.indicator-discrete { 1695&.horizontal { padding: 2px 1px; } 1696&.vertical { padding: 1px 2px; } 1697} 1698} 1699&.fill-block { 1700// FIXME: it would be nice to set make fill blocks bigger, but we'd need 1701// :nth-child working on discrete indicators 1702background-color: $selected_bg_color; 1703border-radius: 0; 1704box-shadow: none; 1705&.indicator-discrete { 1706&.horizontal { margin: 0 1px; } 1707&.vertical { margin: 1px 0; } 1708} 1709&.level-high { 1710background-color: $success_color; 1711} 1712&.level-low { 1713background-color: $warning_color; 1714} 1715&.empty-fill-block { 1716background-color: $fill_color; 1717} 1718} 1719} 1720 1721 1722/********** 1723* Frames * 1724**********/ 1725.frame { 1726border: 1px solid $borders_color; 1727&.flat { border-style: none; } 1728padding: 0; 1729&.action-bar { 1730padding: 6px; 1731border-width: 1px 0 0; 1732} 1733} 1734 1735GtkScrolledWindow { 1736GtkViewport.frame { // avoid double borders when viewport inside 1737// scrolled window 1738border-style: none; 1739} 1740} 1741 1742//vbox and hbox separators 1743.separator { 1744// always disable separators 1745// -GtkWidget-wide-separators: true; 1746color: $borders_color; 1747 1748// Font and File button separators 1749GtkFileChooserButton &.vertical, 1750GtkFontButton &.vertical { 1751// always disable separators 1752-GtkWidget-wide-separators: true; 1753} 1754} 1755 1756/********* 1757* Lists * 1758*********/ 1759 1760.list { 1761border-color: $borders_color; 1762background-color: $base_color; 1763} 1764 1765.list-row, 1766.grid-child { 1767padding: 2px; 1768} 1769 1770.list-row.activatable { 1771// let's take care of background colors 1772background-image: -gtk-gradient(radial, 1773center center, 0, 1774center center, 0.5, 1775to(gtkalpha(currentColor, 0)), 1776to(transparent)), 1777linear-gradient(to bottom, gtkalpha(currentColor, 0)); 1778background-repeat: no-repeat; 1779background-position: center, center; 1780background-size: 192px * 1 / 0.8 192px * 1 / 0.8, auto; 1781&:hover { 1782background-image: -gtk-gradient(radial, 1783center center, 0, 1784center center, 0.5, 1785to(gtkalpha(currentColor, 0)), 1786to(transparent)), 1787linear-gradient(to bottom, gtkalpha(currentColor, 0.05)); 1788} 1789&:active { 1790animation: list_ripple_effect 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards; 1791} 1792} 1793 1794.list-row:selected { 1795@extend %selected_items; 1796.button { 1797&:insensitive { color: $insensitive_secondary_selected_fg_color; } 1798&.flat { 1799color: $secondary_selected_fg_color; 1800&:hover, &:active { color: $selected_fg_color; } 1801&:insensitive { color: $insensitive_secondary_selected_fg_color; } 1802} 1803} 1804} 1805 1806// transition 1807.list-row { 1808&:hover { transition: none; } 1809} 1810 1811 1812/********************* 1813* App Notifications * 1814*********************/ 1815 1816.app-notification, 1817.app-notification.frame { 1818@extend %osd; 1819@extend .toolbar.osd; 1820.button { 1821} 1822} 1823 1824/************* 1825* Expanders * 1826*************/ 1827 1828.expander { 1829-gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); 1830&:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); } 1831&:checked { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } 1832&:not(:hover):not(:active) { color: gtkalpha(currentColor, 0.6); } 1833&:selected { color: $selected_fg_color; } 1834} 1835 1836/************ 1837* Calendar * 1838***********/ 1839GtkCalendar { 1840border: 1px solid $borders_color; 1841color: $text_color; 1842 1843&:selected { 1844@extend .view:selected; 1845} 1846 1847&.header { 1848border: 1px solid transparent; 1849border-bottom-color: $borders_color; 1850border-radius: 0; 1851} 1852 1853&.button { 1854// @extend .button.flat; 1855@include button(flat); 1856&:hover { @include button(flat-hover); } 1857&:active { @include button(flat-active); } 1858&:insensitive { @include button(flat-insensitive); } 1859} 1860 1861&:inconsistent { color: gtkalpha(currentColor, 0.5); } 1862&.highlight { 1863font-size: smaller; 1864color: gtkalpha(currentColor, 0.5); 1865} 1866} 1867 1868/*********** 1869* Dialogs * 1870***********/ 1871 1872.message-dialog .dialog-action-area .button { 1873padding: 8px; 1874} 1875 1876.message-dialog { // Message Dialog styling 1877&.background { background-color: $light_color; } 1878.titlebar { 1879border-style: none; 1880// box-shadow: inset 0 1px $highlight_color; 1881background-color: $light_color; 1882} 1883&.csd { // rounded bottom border styling for csd version 1884&.background { 1885// bigger radius for better antialiasing 1886border-bottom-left-radius: 2px; 1887border-bottom-right-radius: 2px; 1888} 1889.dialog-action-area .button { 1890@extend .button.flat; 1891padding: 9px 16px 10px; 1892border-top: 1px solid $borders_color; 1893border-radius: 0; 1894background-size: 192px * 1 / 0.8 192px * 1 / 0.8, auto; 1895// &:first-child{ border-bottom-left-radius: 2px; } 1896// &:last-child { border-bottom-right-radius: 2px; } 1897&:first-child{ border-radius: 0 0 0 2px; } 1898&:last-child { border-radius: 0 0 2px 0; } 1899} 1900} 1901} 1902 1903GtkFileChooserDialog { 1904.search-bar { 1905// background-color: $base_color; 1906// border-color: $bg_color; 1907} 1908.dialog-action-box { 1909border-top: 1px solid $borders_color; 1910} 1911} 1912 1913/*********** 1914* Sidebar * 1915***********/ 1916 1917.sidebar { 1918border: none; 1919background-color: $insensitive_base_color; 1920 1921&:selected { 1922@extend %selected_items; 1923} 1924} 1925 1926$_placesidebar_icons_opacity: 0.8; 1927GtkSidebarRow { 1928// Needs overriding of the GtkListBoxRow padding 1929&.list-row { 1930padding: 0px; 1931} 1932// Using margins/padding directly in the SidebarRow 1933// will make the animation of the new bookmark row jump 1934.sidebar-revealer { 1935padding: 4px 14px 4px 12px; 1936} 1937.sidebar-icon { 1938opacity: $_placesidebar_icons_opacity; // dim the device icons 1939&:dir(ltr) { padding-right: 8px; } 1940&:dir(rtl) { padding-left: 8px; } 1941} 1942.sidebar-label { 1943&:dir(ltr) { padding-right: 2px; } 1944&:dir(rtl) { padding-left: 2px; } 1945} 1946} 1947 1948GtkPlacesSidebar.sidebar { 1949// in the sidebar case it makes no sense to click the selected row 1950// .list-row:selected:active { box-shadow: none; } 1951 1952// looks like the label doesn't get all the states so work around 1953.list-row:selected:insensitive .label { @extend %selected_items:insensitive; } 1954// .list-row:selected:backdrop:insensitive .label { @extend %selected_items:backdrop:insensitive; } 1955 1956.sidebar-placeholder-row { 1957border: solid 1px $selected_bg_color; 1958} 1959 1960.sidebar-new-bookmark-row { 1961color: $selected_bg_color; 1962} 1963 1964@at-root .sidebar-button.button { // @at-root needded to not change the specificity making button styling inheritance broken 1965// so istead of "GtkPlacesSidebar.sidebar .sidebar-button.button" [specificity 0,0,3,1] 1966// the extended selector ".sidebar-button.button" [specificity 0,0,2,0] 1967 1968&.image-button { padding: 4px; } 1969 1970@extend .button.flat; 1971// border-radius: 100%; 1972// outline-radius: 100%; 1973&:not(:hover):not(:active) > GtkImage { opacity: $_placesidebar_icons_opacity }; 1974} 1975// this is for indicating which sidebar row generated a popover 1976// see https://bugzilla.gnome.org/show_bug.cgi?id=754411 1977.has-open-popup { @extend .list-row.activatable:active; transition: none; } 1978} 1979 1980.sidebar-item { 1981padding: 10px 4px; 1982> .label { 1983padding-left: 6px; 1984padding-right: 6px; 1985} 1986&.needs-attention > .label { 1987@extend %needs_attention; 1988} 1989} 1990 1991/********* 1992* Paned * 1993*********/ 1994 1995GtkPaned { // this is for the standard paned separator 1996 1997-GtkPaned-handle-size: 1; // sets separator width 1998 1999-gtk-icon-source: none; // removes handle decoration 2000margin: 0 8px 8px 0; // drag area of the separator, not a real margin 2001&:dir(rtl) { 2002margin-right: 0; 2003margin-left: 8px; 2004} 2005.pane-separator { 2006background-color: $borders_color; 2007} 2008} 2009 2010GtkPaned.wide { // this is for the paned with wide separator 2011-GtkPaned-handle-size: 6; // wider separator here 2012margin: 0; // no need of the invisible drag area so, reset margin 2013.pane-separator { 2014background-color: transparent; 2015border-style: none solid; 2016border-color: $borders_color; 2017border-width: 1px; 2018} 2019&.vertical .pane-separator { border-style: solid none;} 2020} 2021 2022 2023/************** 2024* GtkInfoBar * 2025**************/ 2026GtkInfoBar { 2027border-style: none; 2028} 2029 2030.info, 2031.question, 2032.warning, 2033.error { 2034background-color: $selected_bg_color; 2035color: $selected_fg_color; 2036.button { 2037// @extend .list-row:selected.button; 2038&:insensitive { color: $insensitive_secondary_selected_fg_color; } 2039&.flat { 2040color: $secondary_selected_fg_color; 2041&:hover, &:active { color: $selected_fg_color; } 2042&:insensitive { color: $insensitive_secondary_selected_fg_color; } 2043} 2044} 2045.label:selected, 2046.label:selected:focus, 2047.label:selected:hover { 2048background-color: darken($selected_bg_color, 10%); 2049} 2050} 2051 2052/************ 2053* Tooltips * 2054************/ 2055 2056.tooltip { 2057&.background { 2058// background-color needs to be set this way otherwise it gets drawn twice 2059// see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details. 2060background-color: transparentize($base_color, 0.1); 2061} 2062 2063// @extend %osd; 2064color: $fg_color; 2065padding: 4px; /* not working */ 2066border-radius: 2px; 2067box-shadow: none; // otherwise it gets inherited by windowframe.csd 2068// FIXME: we need a border or tooltips vanish on black background. 2069&.window-frame.csd { 2070background-color: transparent; 2071} 2072} 2073 2074.tooltip * { //Yeah this is ugly 2075padding: 4px; 2076background-color: transparent; 2077color: inherit; // just to be sure 2078} 2079 2080/***************** 2081* Color Chooser * 2082*****************/ 2083 2084GtkColorSwatch { 2085// This widget is made of two boxes one on top of the other, the lower box is GtkColorSwatch {} the other one 2086// is GtkColorSwatch > .overlay {}, GtkColorSwatch has the programmatically set background, so most of the style 2087// is applied to the overlay box. 2088 2089box-shadow: $z-depth-1; 2090 2091// we need to re-set the shadow here since it get axed by the previous bit 2092&:selected { } 2093 2094// base color corners rounding 2095// to avoid the artifacts caused by rounded corner anti-aliasing the base color 2096// sports a bigger radius. 2097// nth-child is needed by the custom color strip. 2098// The :not() madness is needed since actually the overlay is selectable by GtkColorSwatch > .overlay 2099// and GtkColorSwatch.overlay, I know it's weird, but this is gtk+, not a browser. 2100&.top { 2101border-top-left-radius: 2px; 2102border-top-right-radius: 2px; 2103} 2104&.bottom { 2105border-bottom-left-radius: 2px; 2106border-bottom-right-radius: 2px; 2107} 2108&.left, &:first-child:not(.overlay):not(.top) { 2109border-top-left-radius: 2px; 2110border-bottom-left-radius: 2px; 2111} 2112&.right, &:last-child:not(.overlay):not(.bottom) { 2113border-top-right-radius: 2px; 2114border-bottom-right-radius: 2px; 2115} 2116&:only-child:not(.overlay) { border-radius: 2px; } 2117 2118// overlay corner rounding 2119&.top > .overlay { 2120border-top-left-radius: 2px; 2121border-top-right-radius: 2px; 2122} 2123&.bottom > .overlay { 2124border-bottom-left-radius: 2px; 2125border-bottom-right-radius: 2px; 2126} 2127&:first-child:not(.top) > .overlay { 2128border-top-left-radius: 2px; 2129border-bottom-left-radius: 2px; 2130} 2131&:last-child:not(.bottom) > .overlay { 2132border-top-right-radius: 2px; 2133border-bottom-right-radius: 2px; 2134} 2135&:only-child > .overlay { border-radius: 2px; } 2136 2137// hover effect 2138&:hover { box-shadow: $z-depth-2; } 2139 2140// no hover effect for the colorswatch in the color editor 2141GtkColorEditor & { 2142border-radius: 2px; // same radius as the entry 2143&:hover { box-shadow: $z-depth-1; } 2144} 2145 2146// indicator and keynav outline colors 2147&.color-dark { 2148color: white; 2149} 2150&.color-light { 2151color: transparentize(black, 0.2); 2152} 2153 2154// border color 2155&.overlay, 2156&.overlay:selected { 2157} 2158 2159// make the add color button looks like, well, a button 2160&#add-color-button { 2161background-image: if($variant =='light', 2162linear-gradient(to right, 2163#e74c3c 25%, 2164#f1c40f 25%, #f1c40f 50%, 2165#2ecc71 50%, #2ecc71 75%, 2166#3498db 75%), 2167linear-gradient(to right, 2168#c0392b 25%, 2169#f39c12 25%, #f39c12 50%, 2170#27ae60 50%, #27ae60 75%, 2171#2980b9 75%) 2172); 2173color: white; 2174} 2175} 2176 2177 2178/******** 2179* Misc * 2180********/ 2181 2182//content view (grid/list) 2183.content-view { 2184background-color: $bg_color; 2185// &:hover { -gtk-image-effect: highlight; } 2186&.rubberband { @extend .rubberband; } 2187} 2188 2189.scale-popup { 2190 2191.osd & { @extend %osd; } 2192 2193.osd & .button.flat { //FIXME: quick hack, redo properly 2194} 2195 2196.button { // +/- buttons on GtkVolumeButton popup 2197padding: 10px; 2198} 2199} 2200 2201GtkScaleButton.button, 2202GtkVolumeButton.button { 2203// I assume both are image-button *by default* 2204// with the image-button/text-button classes automagically applied depending on the button child these selectors can be deleted. 2205@extend %image_button; 2206 2207&.text-button { @extend .text-button } 2208} 2209 2210.floating-bar { 2211@extend %osd; 2212// @extend .toolbar.osd; 2213padding: 3px 0 4px; 2214border: 1px solid $borders_color; 2215background-color: $base_color; 2216transition: none; 2217} 2218 2219.floating-bar.bottom.left { /* axes left border and border radius */ 2220border-width: 1px 1px 0 0; 2221border-radius: 0 2px + 1px 0 0; 2222// border-width: 8px 8px 0 0; 2223// border-image-width: 10px 10px 0 0; 2224} 2225 2226.floating-bar.bottom.right { /* axes right border and border radius */ 2227border-width: 1px 0 0 1px; 2228border-radius: 2px + 1px 0 0 0; 2229// border-width: 8px 0 0 8px; 2230// border-image-width: 10px 0 0 10px; 2231} 2232 2233/********************** 2234* Window Decorations * 2235*********************/ 2236 2237.window-frame { 2238transition: none; 2239border-radius: 2px 2px 0 0; 2240box-shadow: $z-depth-4; 2241 2242// FIXME rationalize window-frame shadows 2243 2244/* this is used for the resize cursor area */ 2245margin: 8px; 2246 2247&:backdrop { 2248box-shadow: $z-depth-2; 2249} 2250&.tiled { 2251border-radius: 0; 2252} 2253&.popup { 2254box-shadow: none; 2255} 2256// server-side decorations as used by mutter 2257&.ssd { 2258box-shadow: 0 0 0 1px $borders_color; //just doing borders, wm draws actual shadows 2259} 2260&.csd { 2261&.popup { 2262border-radius: 0; 2263box-shadow: $z-depth-2; 2264} 2265&.tooltip { 2266border-radius: 2px; 2267box-shadow: $z-depth-2; 2268} 2269&.message-dialog { 2270border-radius: 2px; 2271box-shadow: $z-depth-4; 2272&:backdrop { box-shadow: $z-depth-2; } 2273} 2274} 2275&.solid-csd { 2276border-radius: 0; 2277margin: 4px; 2278background-color: $warning_color; 2279border: solid 1px $borders_color; 2280box-shadow: none; 2281} 2282} 2283 2284// Window Close button 2285.header-bar .button.titlebutton, 2286.titlebar .button.titlebutton { 2287// @extend .button.flat; 2288@extend %image_button; 2289// &:not(:hover):not(:active) > GtkImage { opacity: 0.6; } 2290} 2291 2292.header-bar.selection-mode .button.titlebutton, 2293.titlebar.selection-mode .button.titlebutton { 2294// &:backdrop { icon-shadow: none; } 2295} 2296 2297 2298// catch all extend :) 2299 2300%selected_items { 2301background-color: $selected_bg_color; 2302color: $selected_fg_color; 2303&:insensitive { color: $insensitive_selected_fg_color; } 2304&:backdrop { 2305// color: $backdrop_selected_fg_color; 2306&:insensitive { 2307color: $insensitive_selected_fg_color; 2308} 2309} 2310} 2311 2312.monospace { 2313font: Monospace; 2314} 2315 2316/********************** 2317* Touch Copy & Paste * 2318*********************/ 2319 2320//touch selection handlebars for the Popover.osd above 2321.entry.cursor-handle, 2322.cursor-handle { 2323background-color: $success_color; 2324background-image: none; 2325box-shadow: none; 2326border-style: none; 2327@each $s,$as in ('',''), 2328(':hover','-hover'), 2329(':active','-active') { //no need for insensitive and backdrop 2330&.top#{$s}:dir(ltr), &.bottom#{$s}:dir(rtl) { 2331$_url: 'assets/text-select-start#{$as}#{$asset_suffix}'; 2332-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'), 2333url('#{$_url}@2.png')); 2334padding-left: 10px; 2335} 2336&.bottom#{$s}:dir(ltr), &.top#{$s}:dir(rtl) { 2337$_url: 'assets/text-select-end#{$as}#{$asset_suffix}'; 2338-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'), 2339url('#{$_url}@2.png')); 2340padding-right: 10px; 2341} 2342&.insertion-cursor#{$s}:dir(ltr), &.insertion-cursor#{$s}:dir(rtl) { 2343$_url: 'assets/slider-horz-scale-has-marks-above#{$as}#{$asset_suffix}'; 2344-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'), 2345url('#{$_url}@2.png')); 2346} 2347} 2348} 2349 2350/* Decouple the font of context menus from their entry/textview */ 2351.context-menu { 2352font: initial; 2353} 2354 2355.touch-selection { 2356font: initial; 2357color: $fg_color; 2358background-color: $base_color; 2359box-shadow: $z-depth-2; 2360&:backdrop { box-shadow: $z-depth-1; } 2361.button { 2362} 2363} 2364 2365// This is used by GtkScrolledWindow, when content is touch-dragged past boundaries. 2366// This draws a box on top of the content, the size changes programmatically. 2367.overshoot { 2368&.top { 2369@include overshoot(top); 2370} 2371&.bottom { 2372@include overshoot(bottom); 2373} 2374&.left { 2375@include overshoot(left); 2376} 2377&.right { 2378@include overshoot(right); 2379} 2380} 2381 2382// Overflow indication, works similarly to the overshoot, the size if fixed tho. 2383.undershoot { 2384&.top { 2385@include undershoot(top); 2386} 2387 2388&.bottom { 2389@include undershoot(bottom); 2390} 2391 2392&.left { 2393@include undershoot(left); 2394} 2395 2396&.right { 2397@include undershoot(right); 2398} 2399} 2400