_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: gtkopacity($selected_bg_color, 0.2); 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.6; 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.75; 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.75); } 254&:insensitive { color: gtkalpha(currentColor, 0.6); } 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 gtkopacity(white, 0.2); 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: gtkopacity($selected_fg_color, 0.75); 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: gtkopacity($selected_bg_color, 0.2); 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.6); } 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 1210padding: 0; 1211@extend %image_button; 1212background-size: 24px * 1 / 0.8 24px * 1 / 0.8, auto; 1213// @extend .button.flat; 1214@include button(flat); 1215&:hover { @include button(flat-hover); } 1216&:active { @include button(flat-active); } 1217&:insensitive { @include button(flat-insensitive); } 1218& > GtkImage { // this is a hack which makes tabs grow 1219padding: 4px; 1220} 1221} 1222} 1223&.arrow { 1224&:not(:hover):not(:active) { color: gtkalpha(currentColor, 0.75); } 1225&:insensitive { 1226color: $insensitive_fg_color; 1227} 1228} 1229&:not(.reorderable-page) > .entry { 1230@extend .entry.flat; 1231} 1232} 1233 1234/************** 1235* Scrollbars * 1236**************/ 1237 1238.scrollbar { 1239-GtkRange-slider-width: 17; 1240-GtkRange-trough-border: 0; 1241-GtkScrollbar-has-backward-stepper: false; 1242-GtkScrollbar-has-forward-stepper: false; 1243-GtkScrollbar-min-slider-length: 32; // minimum size for the slider. 1244// sadly can't be in '.slider' 1245// where it belongs 1246-GtkRange-stepper-spacing: 0; 1247-GtkRange-trough-under-steppers: 1; 1248 1249$_slider_margin: 4px; 1250$_slider_fine_tune_margin: 6px; 1251 1252.button { 1253border: none; 1254} 1255 1256&.overlay-indicator { 1257&:not(.dragging):not(.hovering) { // Overlay scrolling indicator 1258-GtkRange-slider-width: 12px; 1259 1260.slider { 1261margin: 2px; 1262border: 2px solid if($variant==light, gtkopacity(white, 0.2), gtkopacity(black, 0.2)); 1263// background-clip: padding-box; 1264} 1265 1266.trough { 1267border-style: none; 1268background-color: transparent; 1269} 1270 1271// w/o the following margin tweaks the slider shrinks when hovering/dragging 1272&.vertical .slider { 1273// margin-top: $_slider_margin - 1px; 1274// margin-bottom: $_slider_margin - 1px; 1275} 1276 1277&.horizontal .slider { 1278// margin-left: $_slider_margin - 1px; 1279// margin-right: $_slider_margin - 1px; 1280} 1281 1282} 1283 1284&.dragging, 1285&.hovering { opacity: 0.8; } 1286} 1287 1288// trough coloring 1289.trough { 1290background-color: $base_color; 1291border: 1px none $borders_color; 1292} 1293 1294// slider coloring 1295.slider { 1296background-color: $tertiary_fg_color; 1297&:hover { background-color: $secondary_fg_color; } 1298&:active { background-color: $fg_color; } 1299&:insensitive { 1300background-color: transparent; 1301} 1302} 1303 1304 1305// sizing 1306.slider { 1307border-radius: 100px; 1308margin: $_slider_margin; 1309} 1310 1311&.fine-tune .slider { margin: $_slider_fine_tune_margin; } 1312 1313&.vertical { 1314 1315.slider { 1316margin-left: 1px + $_slider_margin; 1317 1318&:dir(rtl) { 1319margin-left: $_slider_margin; 1320margin-right: 1px + $_slider_margin; 1321} 1322} 1323 1324&.fine-tune .slider { 1325margin-left: 1px + $_slider_fine_tune_margin; 1326 1327&:dir(rtl) { 1328margin-left: $_slider_fine_tune_margin; 1329margin-right: 1px + $_slider_fine_tune_margin; 1330} 1331} 1332 1333.trough { 1334border-left-style: solid; 1335 1336&:dir(rtl) { 1337border-left-style: none; 1338border-right-style: solid; 1339} 1340} 1341} 1342 1343&.horizontal { 1344 1345.slider { margin-top: 1px + $_slider_margin; } 1346 1347&.fine-tune .slider { margin-top: 1px + $_slider_fine_tune_margin; } 1348 1349.trough { border-top-style: solid; } 1350} 1351} 1352 1353.scrollbars-junction, 1354.scrollbars-junction.frame { // the small square between two scrollbars 1355border-style: solid none none solid; 1356background-color: $base_color; 1357 1358&:dir(rtl) { border-style: solid solid none none; } 1359} 1360 1361 1362/********** 1363* Switch * 1364**********/ 1365 1366GtkSwitch { 1367-GtkSwitch-slider-width: 28px; // 55px is the right value to make it as tall 1368// as buttons, not doing that for now 1369-GtkSwitch-slider-height: 28px; 1370 1371outline-offset: -4px; 1372outline-radius: 100px; 1373font-size: 0; 1374&.trough { 1375// similar to the .scale 1376border: 10px solid transparent; 1377border-radius: 100px; 1378background-color: $fill_color; 1379&:insensitive { 1380color: $insensitive_fg_color; 1381} 1382&:active { 1383background-color: $success_color; 1384&:insensitive { 1385background-color: $fill_color; 1386color: $success_color; 1387} 1388} 1389} 1390&.slider { 1391padding: 4px; 1392border-radius: 100px; 1393@include entry(normal); 1394&:hover { @include entry(focus); } 1395&:insensitive { @include entry(insensitive); } 1396} 1397.list-row:selected & { 1398} 1399 1400} 1401 1402/************************* 1403* Check and Radio items * 1404*************************/ 1405 1406// draw regular check and radio items using our PNG assets 1407// all assets are rendered from assets.svg. never add pngs directly 1408 1409@each $w,$a in ('check', 'checkbox'), 1410('radio','radio') { 1411 1412//standard checks and radios 1413@each $s,$as in ('','-unchecked'), 1414(':active', '-unchecked-active'), 1415(':insensitive','-unchecked-insensitive'), 1416(':inconsistent', '-mixed'), 1417(':inconsistent:active', '-mixed-active'), 1418(':inconsistent:insensitive', '-mixed-insensitive'), 1419(':checked', '-checked'), 1420(':checked:active', '-checked-active'), 1421(':checked:insensitive','-checked-insensitive') { 1422.#{$w}#{$s} { 1423-gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}#{$asset_suffix}.png"), 1424url("assets/#{$a}#{$as}#{$asset_suffix}@2.png")); 1425icon-shadow: $z-depth-1; 1426&:hover, &:active { icon-shadow: $z-depth-2; } 1427&:insensitive { icon-shadow: none; } 1428&.button.flat { } 1429} 1430} 1431 1432//menu 1433@each $s,$as in ('',''), 1434// (':active', '-checked'), 1435(':insensitive','-insensitive'), 1436(':inconsistent', '-mixed'), 1437// (':inconsistent:active', '-mixed'), 1438(':inconsistent:insensitive', '-mixed-insensitive'), 1439(':checked', '-checked'), 1440// (':checked:active', '-checked'), 1441(':checked:insensitive','-checked-insensitive') { 1442.menu .menuitem.#{$w}#{$s} { 1443// color: gtkalpha(currentColor, 0.75); 1444// -gtk-icon-source: -gtk-icontheme('#{$a}-symbolic'); 1445// &:active, &:checked { -gtk-icon-source: -gtk-icontheme('#{$a}-checked-symbolic'); } 1446// &:inconsistent { -gtk-icon-source: -gtk-icontheme('#{$a}-mixed-symbolic'); } 1447-gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}.png"), 1448url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}@2.png")); 1449icon-shadow: none; 1450&:hover { 1451-gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}-symbolic-dark.png"), 1452url("assets/#{$a}#{$as}-symbolic-dark@2.png")); 1453} 1454} 1455} 1456} 1457 1458//treeview and list-rows 1459.view.check, .view.radio, 1460.list-row .check, list-row .radio { 1461} 1462 1463//selection-mode 1464@each $s,$as in ('','-selectionmode'), 1465(':active', '-active-selectionmode'), 1466(':insensitive', '-insensitive-selectionmode'), 1467(':checked', '-checked-selectionmode'), 1468(':checked:active', '-checked-active-selectionmode'), 1469(':insensitive:checked', '-checked-insensitive-selectionmode') { 1470.view.content-view.check#{$s}:not(.list) { 1471-gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}.png"), 1472url("assets/checkbox#{$as}@2.png")); 1473background-color: transparent; 1474} 1475} 1476 1477GtkCheckButton.text-button, GtkRadioButton.text-button { 1478// this is for a nice focus on check and radios text 1479padding: 2px 4px; 1480outline-offset: 0; 1481&:insensitive, 1482&:insensitive:active, 1483&:insensitive:inconsistent { 1484// set insensitive color, which is overriden otherwise 1485// color: $insensitive_fg_color; 1486} 1487} 1488 1489/************ 1490* GtkScale * 1491************/ 1492.scale, 1493.scale.scale-has-marks-above.scale-has-marks-below, 1494.scale.vertical.scale-has-marks-above.scale-has-marks-below { 1495// FIXME: rationalize 1496-GtkScale-slider-length: 20; 1497-GtkRange-slider-width: 20; 1498-GtkRange-trough-border: 2; 1499outline-offset: -8px; 1500outline-radius: 100px; 1501 1502&.fine-tune { 1503// outline-offset: -6px; 1504&.slider { background-size: 80%; } 1505&.trough { 1506// margin: 8px; 1507// border-radius: 100px; 1508} 1509} 1510 1511&.slider { 1512&:not(:hover):not(:active) { background-size: 80%; } 1513// @include entry(normal); 1514// border-radius: 50%; 1515// background-color: $success_color; 1516@each $s,$as in ('',''), 1517// (':hover','-hover'), 1518(':active','-active'), 1519(':insensitive','-insensitive') { 1520&.slider#{$s} { 1521$_url: 'assets/slider#{$as}#{$asset_suffix}'; 1522border-style: none; 1523border-radius: 0; 1524background-color: transparent; 1525background-image: -gtk-scaled(url('#{$_url}.png'), 1526url('#{$_url}@2.png')); 1527background-repeat: no-repeat; 1528background-position: center; 1529box-shadow: none; 1530} 1531} 1532&:hover { 1533// @include entry(focus); 1534// border-radius: 50%; // needed for double marks scales 1535} 1536&:insensitive { 1537// @include entry(insensitive); 1538// border-radius: 50%; // overridden 1539} 1540//OSD sliders 1541.osd & { 1542} 1543} 1544&.trough { 1545margin: 10px; 1546border-radius: 100px; 1547background-color: $fill_color; 1548&.highlight { 1549background-color: $success_color; 1550&:insensitive { background-color: $fill_color; } 1551} 1552&:insensitive { color: $insensitive_fg_color; } 1553//OSD troughs 1554.osd & { 1555} 1556} 1557// marks color 1558&.separator { 1559color: $fill_color; 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@extend %#{$we}_#{$dn}; 1576 1577@each $s,$as in ('',''), 1578// (':hover','-hover'), 1579(':active','-active'), 1580(':insensitive','-insensitive') { 1581&.slider#{$s} { 1582$_url: 'assets/slider-#{$dn}-#{$w}#{$as}#{$asset_suffix}'; 1583border-style: none; 1584border-radius: 0; 1585background-color: transparent; 1586background-image: -gtk-scaled(url('#{$_url}.png'), 1587url('#{$_url}@2.png')); 1588background-repeat: no-repeat; 1589background-position: center; 1590box-shadow: none; 1591} 1592} 1593} 1594} 1595} 1596 1597%scale_marks_above_horz { 1598.trough { margin: 15px 10px 10px; } 1599// &.fine-tune .trough { margin: 13px 8px 8px; } 1600} 1601%scale_marks_below_horz { 1602.trough { margin: 10px 10px 15px; } 1603// &.fine-tune .trough { margin: 8px 8px 13px; } 1604} 1605%scale_marks_above_vert { 1606.trough { margin: 10px 10px 10px 15px; } 1607// &.fine-tune .trough { margin: 8px 8px 8px 13px; } 1608} 1609%scale_marks_below_vert { 1610.trough { margin: 10px 15px 10px 10px; } 1611// &.fine-tune .trough { margin: 8px 13px 8px 8px; } 1612} 1613 1614/***************** 1615* Progress bars * 1616*****************/ 1617 1618GtkProgressBar { 1619-GtkProgressBar-min-horizontal-bar-height: 4; 1620-GtkProgressBar-min-vertical-bar-width: 4; 1621padding: 0; 1622font-size: smaller; 1623color: $tertiary_fg_color; 1624&.osd { 1625-GtkProgressBar-xspacing: 0; 1626-GtkProgressBar-yspacing: 0; 1627-GtkProgressBar-min-horizontal-bar-height: 4; 1628} 1629&.trough { // background 1630border-radius: 0; 1631background-color: gtkopacity($selected_bg_color, 0.2); 1632&.osd { 1633border-style: none; 1634box-shadow: none; 1635// background-color: transparent; 1636} 1637} 1638} 1639 1640// moving bit 1641.progressbar { 1642border-radius: 0; 1643background-color: $selected_bg_color; 1644&.left { 1645border-top-left-radius: 0; 1646border-bottom-left-radius: 0; 1647} 1648&.right { 1649border-top-right-radius: 0; 1650border-bottom-right-radius: 0; 1651} 1652&.left.right { 1653box-shadow: none; 1654} 1655&.vertical { 1656&.bottom { 1657border-bottom-left-radius: 0; 1658border-bottom-right-radius: 0; 1659box-shadow: none; 1660} 1661&.top { 1662border-top-left-radius: 0; 1663border-top-right-radius: 0; 1664} 1665} 1666&.osd { 1667background-image: none; 1668background-color: $selected_bg_color; 1669border-style: none; 1670border-radius: 0; 1671} 1672} 1673 1674 1675/************* 1676* Level Bar * 1677*************/ 1678 1679.level-bar { 1680box-shadow: $z-depth-1; // needs to be set here to avoid clipping 1681-GtkLevelBar-min-block-width: 36; 1682-GtkLevelBar-min-block-height: 4; 1683&.vertical { 1684-GtkLevelBar-min-block-width: 4; 1685-GtkLevelBar-min-block-height: 36; 1686} 1687&.trough { 1688padding: 2px; 1689border-radius: 2px; 1690@include entry(normal); 1691&:insensitive { @include entry(insensitive); } 1692&.indicator-discrete { 1693&.horizontal { padding: 2px 1px; } 1694&.vertical { padding: 1px 2px; } 1695} 1696} 1697&.fill-block { 1698// FIXME: it would be nice to set make fill blocks bigger, but we'd need 1699// :nth-child working on discrete indicators 1700background-color: $selected_bg_color; 1701border-radius: 0; 1702box-shadow: none; 1703&.indicator-discrete { 1704&.horizontal { margin: 0 1px; } 1705&.vertical { margin: 1px 0; } 1706} 1707&.level-high { 1708background-color: $success_color; 1709} 1710&.level-low { 1711background-color: $warning_color; 1712} 1713&.empty-fill-block { 1714background-color: $fill_color; 1715} 1716} 1717} 1718 1719 1720/********** 1721* Frames * 1722**********/ 1723.frame { 1724border: 1px solid $borders_color; 1725&.flat { border-style: none; } 1726padding: 0; 1727&.action-bar { 1728padding: 6px; 1729border-width: 1px 0 0; 1730} 1731} 1732 1733GtkScrolledWindow { 1734GtkViewport.frame { // avoid double borders when viewport inside 1735// scrolled window 1736border-style: none; 1737} 1738} 1739 1740//vbox and hbox separators 1741.separator { 1742// always disable separators 1743// -GtkWidget-wide-separators: true; 1744color: $borders_color; 1745 1746// Font and File button separators 1747GtkFileChooserButton &.vertical, 1748GtkFontButton &.vertical { 1749// always disable separators 1750-GtkWidget-wide-separators: true; 1751} 1752} 1753 1754/********* 1755* Lists * 1756*********/ 1757 1758.list { 1759border-color: $borders_color; 1760background-color: $base_color; 1761} 1762 1763.list-row, 1764.grid-child { 1765padding: 2px; 1766} 1767 1768.list-row.activatable { 1769// let's take care of background colors 1770background-image: -gtk-gradient(radial, 1771center center, 0, 1772center center, 0.5, 1773to(gtkalpha(currentColor, 0)), 1774to(transparent)), 1775linear-gradient(to bottom, gtkalpha(currentColor, 0)); 1776background-repeat: no-repeat; 1777background-position: center, center; 1778background-size: 192px * 1 / 0.8 192px * 1 / 0.8, auto; 1779&:hover { 1780background-image: -gtk-gradient(radial, 1781center center, 0, 1782center center, 0.5, 1783to(gtkalpha(currentColor, 0)), 1784to(transparent)), 1785linear-gradient(to bottom, gtkalpha(currentColor, 0.05)); 1786} 1787&:active { 1788animation: list_ripple_effect 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards; 1789} 1790} 1791 1792.list-row:selected { 1793@extend %selected_items; 1794.button { 1795&:insensitive { color: $insensitive_secondary_selected_fg_color; } 1796&.flat { 1797color: $secondary_selected_fg_color; 1798&:hover, &:active { color: $selected_fg_color; } 1799&:insensitive { color: $insensitive_secondary_selected_fg_color; } 1800} 1801} 1802} 1803 1804// transition 1805.list-row { 1806&:hover { transition: none; } 1807} 1808 1809 1810/********************* 1811* App Notifications * 1812*********************/ 1813 1814.app-notification, 1815.app-notification.frame { 1816@extend %osd; 1817@extend .toolbar.osd; 1818.button { 1819} 1820} 1821 1822/************* 1823* Expanders * 1824*************/ 1825 1826.expander { 1827-gtk-icon-source: -gtk-icontheme('pan-end-symbolic'); 1828&:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); } 1829&:checked { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); } 1830&:not(:hover):not(:active) { color: gtkalpha(currentColor, 0.75); } 1831&:selected { color: $selected_fg_color; } 1832} 1833 1834/************ 1835* Calendar * 1836***********/ 1837GtkCalendar { 1838border: 1px solid $borders_color; 1839color: $text_color; 1840 1841&:selected { 1842@extend .view:selected; 1843} 1844 1845&.header { 1846border: 1px solid transparent; 1847border-bottom-color: $borders_color; 1848border-radius: 0; 1849} 1850 1851&.button { 1852// @extend .button.flat; 1853@include button(flat); 1854&:hover { @include button(flat-hover); } 1855&:active { @include button(flat-active); } 1856&:insensitive { @include button(flat-insensitive); } 1857} 1858 1859&:inconsistent { color: gtkalpha(currentColor, 0.6); } 1860&.highlight { 1861font-size: smaller; 1862color: gtkalpha(currentColor, 0.6); 1863} 1864} 1865 1866/*********** 1867* Dialogs * 1868***********/ 1869 1870.message-dialog .dialog-action-area .button { 1871padding: 8px; 1872} 1873 1874.message-dialog { // Message Dialog styling 1875&.background { background-color: $light_color; } 1876.titlebar { 1877border-style: none; 1878// box-shadow: inset 0 1px $highlight_color; 1879background-color: $light_color; 1880} 1881&.csd { // rounded bottom border styling for csd version 1882&.background { 1883// bigger radius for better antialiasing 1884border-bottom-left-radius: 2px; 1885border-bottom-right-radius: 2px; 1886} 1887.dialog-action-area .button { 1888@extend .button.flat; 1889padding: 9px 16px 10px; 1890border-top: 1px solid $borders_color; 1891border-radius: 0; 1892background-size: 192px * 1 / 0.8 192px * 1 / 0.8, auto; 1893// &:first-child{ border-bottom-left-radius: 2px; } 1894// &:last-child { border-bottom-right-radius: 2px; } 1895&:first-child{ border-radius: 0 0 0 2px; } 1896&:last-child { border-radius: 0 0 2px 0; } 1897} 1898} 1899} 1900 1901GtkFileChooserDialog { 1902.search-bar { 1903// background-color: $base_color; 1904// border-color: $bg_color; 1905} 1906.dialog-action-box { 1907border-top: 1px solid $borders_color; 1908} 1909} 1910 1911/*********** 1912* Sidebar * 1913***********/ 1914 1915.sidebar { 1916border: none; 1917background-color: $insensitive_base_color; 1918 1919&:selected { 1920@extend %selected_items; 1921} 1922} 1923 1924GtkSidebarRow { 1925// Needs overriding of the GtkListBoxRow padding 1926&.list-row { 1927padding: 0px; 1928} 1929// Using margins/padding directly in the SidebarRow 1930// will make the animation of the new bookmark row jump 1931.sidebar-revealer { 1932padding: 4px 14px 4px 12px; 1933} 1934.sidebar-icon { 1935opacity: 0.75; // dim the device icons 1936&:dir(ltr) { padding-right: 8px; } 1937&:dir(rtl) { padding-left: 8px; } 1938} 1939.sidebar-label { 1940&:dir(ltr) { padding-right: 2px; } 1941&:dir(rtl) { padding-left: 2px; } 1942} 1943} 1944 1945GtkPlacesSidebar.sidebar { 1946// in the sidebar case it makes no sense to click the selected row 1947// .list-row:selected:active { box-shadow: none; } 1948 1949// looks like the label doesn't get all the states so work around 1950.list-row:selected:insensitive .label { @extend %selected_items:insensitive; } 1951// .list-row:selected:backdrop:insensitive .label { @extend %selected_items:backdrop:insensitive; } 1952 1953.sidebar-placeholder-row { 1954border: solid 1px $selected_bg_color; 1955} 1956 1957.sidebar-new-bookmark-row { 1958color: $selected_bg_color; 1959} 1960 1961@at-root .sidebar-button.button { // @at-root needded to not change the specificity making button styling inheritance broken 1962// so istead of "GtkPlacesSidebar.sidebar .sidebar-button.button" [specificity 0,0,3,1] 1963// the extended selector ".sidebar-button.button" [specificity 0,0,2,0] 1964 1965&.image-button { padding: 4px; } 1966 1967@extend .button.flat; 1968// border-radius: 100%; 1969// outline-radius: 100%; 1970} 1971// this is for indicating which sidebar row generated a popover 1972// see https://bugzilla.gnome.org/show_bug.cgi?id=754411 1973.has-open-popup { @extend .list-row.activatable:active; transition: none; } 1974} 1975 1976.sidebar-item { 1977padding: 10px 4px; 1978> .label { 1979padding-left: 6px; 1980padding-right: 6px; 1981} 1982&.needs-attention > .label { 1983@extend %needs_attention; 1984} 1985} 1986 1987/********* 1988* Paned * 1989*********/ 1990 1991GtkPaned { // this is for the standard paned separator 1992 1993-GtkPaned-handle-size: 1; // sets separator width 1994 1995-gtk-icon-source: none; // removes handle decoration 1996margin: 0 8px 8px 0; // drag area of the separator, not a real margin 1997&:dir(rtl) { 1998margin-right: 0; 1999margin-left: 8px; 2000} 2001.pane-separator { 2002background-color: $borders_color; 2003} 2004} 2005 2006GtkPaned.wide { // this is for the paned with wide separator 2007-GtkPaned-handle-size: 6; // wider separator here 2008margin: 0; // no need of the invisible drag area so, reset margin 2009.pane-separator { 2010background-color: transparent; 2011border-style: none solid; 2012border-color: $borders_color; 2013border-width: 1px; 2014} 2015&.vertical .pane-separator { border-style: solid none;} 2016} 2017 2018 2019/************** 2020* GtkInfoBar * 2021**************/ 2022GtkInfoBar { 2023border-style: none; 2024} 2025 2026.info, 2027.question, 2028.warning, 2029.error { 2030background-color: $selected_bg_color; 2031color: $selected_fg_color; 2032.button { 2033// @extend .list-row:selected.button; 2034&:insensitive { color: $insensitive_secondary_selected_fg_color; } 2035&.flat { 2036color: $secondary_selected_fg_color; 2037&:hover, &:active { color: $selected_fg_color; } 2038&:insensitive { color: $insensitive_secondary_selected_fg_color; } 2039} 2040} 2041.label:selected, 2042.label:selected:focus, 2043.label:selected:hover { 2044background-color: darken($selected_bg_color, 10%); 2045} 2046} 2047 2048/************ 2049* Tooltips * 2050************/ 2051 2052.tooltip { 2053&.background { 2054// background-color needs to be set this way otherwise it gets drawn twice 2055// see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details. 2056background-color: gtkopacity($base_color, 0.9); 2057} 2058 2059// @extend %osd; 2060color: $fg_color; 2061padding: 4px; /* not working */ 2062border-radius: 2px; 2063box-shadow: none; // otherwise it gets inherited by windowframe.csd 2064// FIXME: we need a border or tooltips vanish on black background. 2065&.window-frame.csd { 2066background-color: transparent; 2067} 2068} 2069 2070.tooltip * { //Yeah this is ugly 2071padding: 4px; 2072background-color: transparent; 2073color: inherit; // just to be sure 2074} 2075 2076/***************** 2077* Color Chooser * 2078*****************/ 2079 2080GtkColorSwatch { 2081// This widget is made of two boxes one on top of the other, the lower box is GtkColorSwatch {} the other one 2082// is GtkColorSwatch > .overlay {}, GtkColorSwatch has the programmatically set background, so most of the style 2083// is applied to the overlay box. 2084 2085box-shadow: $z-depth-1; 2086 2087// we need to re-set the shadow here since it get axed by the previous bit 2088&:selected { } 2089 2090// base color corners rounding 2091// to avoid the artifacts caused by rounded corner anti-aliasing the base color 2092// sports a bigger radius. 2093// nth-child is needed by the custom color strip. 2094// The :not() madness is needed since actually the overlay is selectable by GtkColorSwatch > .overlay 2095// and GtkColorSwatch.overlay, I know it's weird, but this is gtk+, not a browser. 2096&.top { 2097border-top-left-radius: 2px; 2098border-top-right-radius: 2px; 2099} 2100&.bottom { 2101border-bottom-left-radius: 2px; 2102border-bottom-right-radius: 2px; 2103} 2104&.left, &:first-child:not(.overlay):not(.top) { 2105border-top-left-radius: 2px; 2106border-bottom-left-radius: 2px; 2107} 2108&.right, &:last-child:not(.overlay):not(.bottom) { 2109border-top-right-radius: 2px; 2110border-bottom-right-radius: 2px; 2111} 2112&:only-child:not(.overlay) { border-radius: 2px; } 2113 2114// overlay corner rounding 2115&.top > .overlay { 2116border-top-left-radius: 2px; 2117border-top-right-radius: 2px; 2118} 2119&.bottom > .overlay { 2120border-bottom-left-radius: 2px; 2121border-bottom-right-radius: 2px; 2122} 2123&:first-child:not(.top) > .overlay { 2124border-top-left-radius: 2px; 2125border-bottom-left-radius: 2px; 2126} 2127&:last-child:not(.bottom) > .overlay { 2128border-top-right-radius: 2px; 2129border-bottom-right-radius: 2px; 2130} 2131&:only-child > .overlay { border-radius: 2px; } 2132 2133// hover effect 2134&:hover { box-shadow: $z-depth-2; } 2135 2136// no hover effect for the colorswatch in the color editor 2137GtkColorEditor & { 2138border-radius: 2px; // same radius as the entry 2139&:hover { box-shadow: $z-depth-1; } 2140} 2141 2142// indicator and keynav outline colors 2143&.color-dark { 2144color: white; 2145} 2146&.color-light { 2147color: gtkopacity(black, 0.8); 2148} 2149 2150// border color 2151&.overlay, 2152&.overlay:selected { 2153} 2154 2155// make the add color button looks like, well, a button 2156&#add-color-button { 2157background-image: if($variant =='light', 2158linear-gradient(to right, 2159#e74c3c 25%, 2160#f1c40f 25%, #f1c40f 50%, 2161#2ecc71 50%, #2ecc71 75%, 2162#3498db 75%), 2163linear-gradient(to right, 2164#c0392b 25%, 2165#f39c12 25%, #f39c12 50%, 2166#27ae60 50%, #27ae60 75%, 2167#2980b9 75%) 2168); 2169color: white; 2170} 2171} 2172 2173 2174/******** 2175* Misc * 2176********/ 2177 2178//content view (grid/list) 2179.content-view { 2180background-color: $bg_color; 2181// &:hover { -gtk-image-effect: highlight; } 2182&.rubberband { @extend .rubberband; } 2183} 2184 2185.scale-popup { 2186 2187.osd & { @extend %osd; } 2188 2189.osd & .button.flat { //FIXME: quick hack, redo properly 2190} 2191 2192.button { // +/- buttons on GtkVolumeButton popup 2193padding: 10px; 2194} 2195} 2196 2197GtkScaleButton.button, 2198GtkVolumeButton.button { 2199// I assume both are image-button *by default* 2200// with the image-button/text-button classes automagically applied depending on the button child these selectors can be deleted. 2201@extend %image_button; 2202 2203&.text-button { @extend .text-button } 2204} 2205 2206.floating-bar { 2207@extend %osd; 2208// @extend .toolbar.osd; 2209padding: 3px 0 4px; 2210border: 1px solid $borders_color; 2211background-color: $base_color; 2212transition: none; 2213} 2214 2215.floating-bar.bottom.left { /* axes left border and border radius */ 2216border-width: 1px 1px 0 0; 2217border-radius: 0 2px + 1px 0 0; 2218// border-width: 8px 8px 0 0; 2219// border-image-width: 10px 10px 0 0; 2220} 2221 2222.floating-bar.bottom.right { /* axes right border and border radius */ 2223border-width: 1px 0 0 1px; 2224border-radius: 2px + 1px 0 0 0; 2225// border-width: 8px 0 0 8px; 2226// border-image-width: 10px 0 0 10px; 2227} 2228 2229/********************** 2230* Window Decorations * 2231*********************/ 2232 2233.window-frame { 2234transition: none; 2235border-radius: 2px 2px 0 0; 2236box-shadow: $z-depth-4; 2237 2238// FIXME rationalize window-frame shadows 2239 2240/* this is used for the resize cursor area */ 2241margin: 8px; 2242 2243&:backdrop { 2244box-shadow: $z-depth-2; 2245} 2246&.tiled { 2247border-radius: 0; 2248} 2249&.popup { 2250box-shadow: none; 2251} 2252// server-side decorations as used by mutter 2253&.ssd { 2254box-shadow: 0 0 0 1px $borders_color; //just doing borders, wm draws actual shadows 2255} 2256&.csd { 2257&.popup { 2258border-radius: 0; 2259box-shadow: $z-depth-2; 2260} 2261&.tooltip { 2262border-radius: 2px; 2263box-shadow: $z-depth-2; 2264} 2265&.message-dialog { 2266border-radius: 2px; 2267box-shadow: $z-depth-4; 2268&:backdrop { box-shadow: $z-depth-2; } 2269} 2270} 2271&.solid-csd { 2272border-radius: 0; 2273margin: 4px; 2274background-color: $warning_color; 2275border: solid 1px $borders_color; 2276box-shadow: none; 2277} 2278} 2279 2280// Window Close button 2281.header-bar .button.titlebutton, 2282.titlebar .button.titlebutton { 2283// @extend .button.flat; 2284@extend %image_button; 2285} 2286 2287.header-bar.selection-mode .button.titlebutton, 2288.titlebar.selection-mode .button.titlebutton { 2289// &:backdrop { icon-shadow: none; } 2290} 2291 2292 2293// catch all extend :) 2294 2295%selected_items { 2296background-color: $selected_bg_color; 2297color: $selected_fg_color; 2298&:insensitive { color: $insensitive_selected_fg_color; } 2299&:backdrop { 2300// color: $backdrop_selected_fg_color; 2301&:insensitive { 2302color: $insensitive_selected_fg_color; 2303} 2304} 2305} 2306 2307.monospace { 2308font: Monospace; 2309} 2310 2311/********************** 2312* Touch Copy & Paste * 2313*********************/ 2314 2315//touch selection handlebars for the Popover.osd above 2316.entry.cursor-handle, 2317.cursor-handle { 2318background-color: $success_color; 2319background-image: none; 2320box-shadow: none; 2321border-style: none; 2322@each $s,$as in ('',''), 2323(':hover','-hover'), 2324(':active','-active') { //no need for insensitive and backdrop 2325&.top#{$s}:dir(ltr), &.bottom#{$s}:dir(rtl) { 2326$_url: 'assets/text-select-start#{$as}#{$asset_suffix}'; 2327-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'), 2328url('#{$_url}@2.png')); 2329padding-left: 10px; 2330} 2331&.bottom#{$s}:dir(ltr), &.top#{$s}:dir(rtl) { 2332$_url: 'assets/text-select-end#{$as}#{$asset_suffix}'; 2333-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'), 2334url('#{$_url}@2.png')); 2335padding-right: 10px; 2336} 2337&.insertion-cursor#{$s}:dir(ltr), &.insertion-cursor#{$s}:dir(rtl) { 2338$_url: 'assets/slider-horz-scale-has-marks-above#{$as}#{$asset_suffix}'; 2339-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'), 2340url('#{$_url}@2.png')); 2341} 2342} 2343} 2344 2345/* Decouple the font of context menus from their entry/textview */ 2346.context-menu { 2347font: initial; 2348} 2349 2350.touch-selection { 2351font: initial; 2352color: $fg_color; 2353background-color: $base_color; 2354box-shadow: $z-depth-2; 2355&:backdrop { box-shadow: $z-depth-1; } 2356.button { 2357} 2358} 2359 2360// This is used by GtkScrolledWindow, when content is touch-dragged past boundaries. 2361// This draws a box on top of the content, the size changes programmatically. 2362.overshoot { 2363&.top { 2364@include overshoot(top); 2365} 2366&.bottom { 2367@include overshoot(bottom); 2368} 2369&.left { 2370@include overshoot(left); 2371} 2372&.right { 2373@include overshoot(right); 2374} 2375} 2376 2377// Overflow indication, works similarly to the overshoot, the size if fixed tho. 2378.undershoot { 2379&.top { 2380@include undershoot(top); 2381} 2382 2383&.bottom { 2384@include undershoot(bottom); 2385} 2386 2387&.left { 2388@include undershoot(left); 2389} 2390 2391&.right { 2392@include undershoot(right); 2393} 2394} 2395