themes/whitey/gtk-3.0/_common.scss (view raw)
1//
2// Suffix
3//
4
5$asset_suffix: if($variant == 'dark', '-dark', '');
6
7
8//
9// transitions
10//
11
12%transition {
13 // do not include sizing factors and text colors/shadows
14 transition-property: opacity,
15 border-color,
16 border-image,
17 background-color,
18 background-image,
19 box-shadow,
20 icon-shadow;
21 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
22 transition-duration: 0.2s;
23}
24
25
26/*****************
27 * Common States *
28 *****************/
29
30* {
31 @extend %transition; // global transition setting
32
33 padding: 0;
34 background-clip: padding-box;
35
36 -GtkToolButton-icon-spacing: 4;
37 -GtkTextView-error-underline-color: $error_color;
38
39 -GtkCheckButton-indicator-size: 16;
40 -GtkCheckMenuItem-indicator-size: 16;
41
42 // The size for scrollbars. The slider is 2px smaller, but we keep it
43 // up so that the whole area is sensitive to button presses for the
44 // slider. The stepper button is larger in both directions, the slider
45 // only in the width
46
47 -GtkScrolledWindow-scrollbar-spacing: 0;
48 -GtkScrolledWindow-scrollbars-within-bevel: 1;
49
50 -GtkToolItemGroup-expander-size: 11;
51 -GtkExpander-expander-size: 16;
52
53 -GtkMenu-horizontal-padding: 0;
54 -GtkMenu-vertical-padding: 0;
55
56 -GtkWidget-link-color: $link_color;
57 -GtkWidget-visited-link-color: $link_visited_color;
58
59 -GtkWidget-text-handle-width: 16;
60 -GtkWidget-text-handle-height: 16;
61
62 -GtkDialog-button-spacing: 4;
63 -GtkDialog-action-area-border: 0;
64
65 -GtkStatusbar-shadow-type: none;
66
67 // We use the outline properties to signal the focus properties
68 // to the adwaita engine: using real CSS properties is faster,
69 // and we don't use any outlines for now.
70
71 outline-style: solid;
72 outline-width: 2px;
73 outline-color: $track_color;
74 outline-offset: -4px;
75 outline-radius: 2px;
76
77 // disable foreground-shadows as default
78 text-shadow: none;
79 icon-shadow: none;
80}
81
82
83/***************
84 * Base States *
85 ***************/
86
87.background {
88 background-color: $bg_color;
89 color: $fg_color;
90}
91
92// These wildcard seems unavoidable, need to investigate.
93// Wildcards are bad and troublesome, use them with care,
94// or better, just don't.
95// Everytime a wildcard is used a kitten dies, painfully.
96
97*:insensitive {
98 -gtk-image-effect: dim;
99}
100
101// for backdrop, tone down element surfaces with transparentize
102%fade_effect {
103 *:backdrop {
104 opacity: 0.75;
105 transition: 0.2s;
106 }
107}
108
109.gtkstyle-fallback {
110 background-color: $bg_color;
111 color: $fg_color;
112 &:prelight {
113 background-color: darken($bg_color, 5%);
114 color: $fg_color;
115 }
116 &:active {
117 background-color: darken($bg_color, 10%);
118 color: $fg_color;
119 }
120 &:insensitive {
121 background-color: $bg_color;
122 color: $insensitive_fg_color;
123 }
124 &:selected {
125 background-color: $selected_bg_color;
126 color: $selected_fg_color;
127 }
128}
129
130.view {
131 @extend .list-row.activatable;
132 background-color: $base_color;
133 color: $fg_color;
134 &:hover,
135 &:active,
136 &:selected { border-radius: 2px; }
137 &:insensitive {
138 color: $insensitive_fg_color;
139 }
140 &:selected { @extend %selected_items; }
141}
142
143.rubberband {
144 border: 1px solid $secondary_selected_bg_color;
145 background-color: gtkopacity($secondary_selected_bg_color, 0.2);
146}
147
148.label {
149 &.separator {
150 color: $fg_color;
151 @extend .dim-label;
152 }
153
154 &:selected,
155 &:selected:focus,
156 &:selected:hover {
157 @extend %selected_items;
158 }
159 &:insensitive { color: $insensitive_fg_color; }
160
161 // always use dark foreground in Gnome-Software
162 &.kudo-label {
163 color: $fixed_fg_color;
164 }
165}
166
167.dim-label {
168 opacity: 0.55;
169}
170
171GtkAssistant {
172 // sidebar styling
173 .sidebar {
174 padding: 0.5em 0;
175 &:dir(ltr) { border-right: 1px solid $borders_color; }
176 &:dir(rtl) { border-left: 1px solid $borders_color; }
177
178 .label {
179 padding: 0.7em 1em 0.8em;
180 color: $secondary_fg_color;
181 font-weight: 500;
182 &.highlight { color: $selected_bg_color; }
183 }
184 }
185
186 // header-bar styling
187 .header-bar {
188 // apply suggested-action button for "Next" and "Back"
189 // last -> "cancel", nth -> "Next" and "Back", that's weird.
190 .button.flat:not(:last-child) {
191 @include button(normal);
192 background-color: $suggested_color;
193 color: $secondary_selected_fg_color;
194 &:hover {
195 @include button(hover);
196 color: $selected_fg_color;
197 }
198 &:active {
199 @include button(active);
200 color: $selected_fg_color;
201 background-color: $selected_bg_color;
202 }
203 &:checked {
204 @include button(checked);
205 background-color: mix($selected_fg_color, $suggested_color, 20%);
206 color: $selected_fg_color;
207 }
208 &:insensitive { @include button(insensitive); }
209 }
210 }
211}
212
213GtkTextView { // This will get overridden by .view,
214 // needed by gedit line numbers
215 background-color: $secondary_dark_color;
216}
217
218.grid-child {
219 // outline-offset: -2px;
220 padding: 4px;
221 border-radius: 2px;
222 &:selected { @extend %selected_items; }
223}
224
225%osd, .osd {
226 opacity: 0.9;
227}
228
229
230/*********************
231 * Spinner Animation *
232 *********************/
233
234@keyframes colorful_bar {
235 0% {
236 -gtk-icon-source: url("assets/bar-red.svg");
237 -gtk-icon-transform: scale(0, 1.0);
238 }
239 24.9% {
240 -gtk-icon-source: url("assets/bar-red.svg");
241 -gtk-icon-transform: scale(1.0, 1.0);
242 }
243 25% {
244 -gtk-icon-source: url("assets/bar-yellow.svg");
245 -gtk-icon-transform: scale(1.0, 1.0);
246 }
247 49.9% {
248 -gtk-icon-source: url("assets/bar-yellow.svg");
249 -gtk-icon-transform: scale(0, 1.0);
250 }
251 50% {
252 -gtk-icon-source: url("assets/bar-green.svg");
253 -gtk-icon-transform: scale(0, 1.0);
254 }
255 74.9% {
256 -gtk-icon-source: url("assets/bar-green.svg");
257 -gtk-icon-transform: scale(1.0, 1.0);
258 }
259 75% {
260 -gtk-icon-source: url("assets/bar-blue.svg");
261 -gtk-icon-transform: scale(1.0, 1.0);
262 }
263 99.9% {
264 -gtk-icon-source: url("assets/bar-blue.svg");
265 -gtk-icon-transform: scale(0, 1.0);
266 }
267 100% {
268 -gtk-icon-source: url("assets/bar-red.svg");
269 -gtk-icon-transform: scale(0, 1.0);
270 }
271}
272
273.spinner {
274 background-color: blue;
275 background-image: none;
276 opacity: 0; // non spinning spinner makes no sense
277 -gtk-icon-source: url("assets/bar-red.svg");
278 &:active {
279 opacity: 1.0;
280 animation: colorful_bar 2s linear infinite;
281 &:insensitive { opacity: 0.4; }
282 &:backdrop { opacity: 1.0; }
283 }
284 &:backdrop { opacity: 0; }
285}
286
287
288/****************
289 * Text Entries *
290 ****************/
291
292.entry {
293 padding: 0.75em 1em 0.8em;
294 @include entry(normal);
295 &:focus { @include entry(focus); }
296 &:insensitive { @include entry(insensitive); }
297
298 &.flat {
299 @include entry(flat-normal);
300 &:focus { @include entry(flat-focus); }
301 &:insensitive { @include entry(flat-insensitive); }
302 }
303
304 &:selected { @extend %selected_items; }
305
306 &.image { // icons inside the entry
307 &.left { padding-left: 0.1em; }
308 &.right { padding-right: 0.1em; }
309 }
310
311 &.progressbar { @extend %entry_progressbar; }
312
313 .linked > &:not(.flat),
314 .linked.vertical > &:not(.flat) {
315 @extend .entry.flat;
316 border-radius: 0;
317 outline-radius: 0;
318 }
319
320 // entry error and warning style
321 @each $e_type, $e_color in (error, $error_color),
322 (warning, $warning_color) {
323 &.#{$e_type} {
324 @include entry(normal, $e_color);
325 &:focus { @include entry(focus, $e_color); }
326 &:insensitive { @include entry(insensitive, $e_color); }
327 &.flat {
328 @include entry(flat-normal, $e_color);
329 &:focus { @include entry(flat-focus, $e_color); }
330 &:insensitive { @include entry(flat-insensitive, $e_color); }
331 }
332 }
333 }
334
335 &.image { // entry icons colors
336 &:not(:hover):not(:active) { color: gtkalpha(currentColor, 0.75); }
337 &:active { color: $selected_bg_color; }
338 &:insensitive { color: gtkalpha(currentColor, 0.6); }
339 }
340
341 GtkTreeView & { // reset styling inside tree-view
342 &.flat:focus {
343 padding: 1px;
344 border-radius: 0;
345 border-image: none;
346 background-color: $base_color;
347 color: $fg_color;
348 box-shadow: none;
349 transition: none;
350 &:selected { @extend %selected_items; }
351 }
352 &:insensitive,
353 &.flat:insensitive { color: $insensitive_fg_color; }
354 }
355
356 .osd & {
357 }
358}
359
360
361/***********
362 * Buttons *
363 ***********/
364
365// stuff for .needs-attention
366@keyframes needs_attention {
367 from {
368 background-image: -gtk-gradient(radial,
369 center center, 0,
370 center center, 0.001,
371 to($selected_bg_color),
372 to(transparent));
373 }
374 to {
375 background-image: -gtk-gradient(radial,
376 center center, 0,
377 center center, 0.5,
378 to($selected_bg_color),
379 to(transparent));
380 }
381}
382
383.button {
384 padding: 0.7em 1em 0.8em;
385 border-radius: 2px;
386 background-repeat: no-repeat;
387 background-position: center, center;
388 background-size: 3em * 2 / 0.8 3em * 2 / 0.8, auto;
389 font-weight: 500;
390 @include button(normal);
391 &:hover { @include button(hover); }
392 &:active { @include button(active); }
393 &:insensitive { @include button(insensitive); }
394 &:checked { @include button(checked); }
395 &:checked:insensitive { @include button(checked-insensitive); }
396
397 &.flat {
398 @include button(flat-normal);
399 &:hover { @include button(flat-hover); }
400 &:active { @include button(flat-active); }
401 &:insensitive { @include button(flat-insensitive); }
402 &:checked { @include button(flat-checked); }
403 &:checked:insensitive { @include button(flat-checked-insensitive); }
404 .linked > & {
405 border-radius: 2px;
406 &.image-button {
407 outline-radius: 100px;
408 border-radius: 100px;
409 }
410 }
411 }
412
413 // big standalone buttons like in Documents pager
414 &.osd {
415 &.image-button {
416 @extend .button.flat;
417 @extend %image_button;
418 padding: 1.3em;
419 background-color: $inverted_dark_color;
420 &:not(:active):not(:insensitive):not(hover) {
421 color: $secondary_accent_color;
422 }
423 &:hover {
424 color: $accent_color;
425 background-color: gtkopacity($inverted_dark_color, 0.7);
426 background-image: linear-gradient(to bottom, $track_color);
427 }
428 &:active {
429 color: $accent_color;
430 background-color: gtkopacity($inverted_dark_color, 0.7);
431 background-image: linear-gradient(to bottom, $accent_fill_color);
432 }
433 }
434 &:insensitive { opacity: 0; }
435 }
436
437 // overlay / OSD style
438 .osd & {
439 }
440
441 // Suggested and Destructive Action buttons
442 @each $b_type, $b_color in (suggested-action, $suggested_color),
443 (destructive-action, $destructive_color) {
444 &.#{$b_type} {
445 background-color: $b_color;
446 color: $secondary_selected_fg_color;
447 &:hover {
448 @include button(hover);
449 background-color: $b_color;
450 color: $selected_fg_color;
451 }
452 &:active {
453 @include button(active);
454 background-color: $selected_bg_color;
455 color: $selected_fg_color;
456 }
457 &:checked { background-color: mix($selected_fg_color, $b_color, 20%); }
458 &:insensitive {
459 @include button(insensitive, $b_color,
460 $insensitive_selected_fg_color);
461 }
462
463 &.flat {
464 background-color: transparent;
465 color: $b_color;
466 &:hover { @include button(flat-hover, $track_color, $b_color);
467 }
468 &:active {
469 @include button(flat-active);
470 background-color: gtkalpha($selected_bg_color, 0.2);
471 color: $selected_bg_color;
472 }
473 &:checked { @include button(flat-checked, $b_color, $selected_fg_color); }
474 &:insensitive {
475 @include button(flat-insensitive, $b_color,
476 $insensitive_selected_fg_color);
477 }
478 }
479 }
480 }
481
482 &.image-button { @extend %image_button; }
483
484 &.text-button {
485 padding-left: 1.2em;
486 padding-right: 1.2em;
487 font-weight: 700;
488 }
489
490 &.text-button.image-button {
491 // those buttons needs uneven horizontal padding, we want the icon side
492 // to have the image-button padding, while the text side the text-button
493 // one, so we're adding the missing padding to the label depending on
494 // its position inside the button
495 padding: 0.7em 1em 0.8em; // same as .button
496 outline-radius: 2px;
497 border-radius: 2px;
498 background-size: 3em * 2 / 0.8 3em * 2 / 0.8, auto;
499 .label:first-child { padding-left: 0.5em; }
500 .label:last-child { padding-right: 0.5em; }
501 }
502
503 .stack-switcher > & {
504 // to position the needs attention dot, padding is added to the button
505 // child, a label needs just lateral padding while an icon needs vertical
506 // padding added too.
507
508 outline-offset: -0.2em; // needs to be set or it gets overriden
509 // by GtkRadioButton outline-offset
510
511 > .label {
512 padding-left: 0.5em; // label padding
513 padding-right: 0.5em; //
514 }
515
516 > GtkImage {
517 padding-left: 0.5em; // image padding
518 padding-right: 0.5em; //
519 padding-top: 0.2em; //
520 padding-bottom: 0.2em; //
521 }
522
523 &.text-button {
524 padding: 0.7em 1em 0.8em; // needed or it will get overridden
525 }
526
527 &.image-button {
528 // we want image buttons to have a 1:1 aspect ratio, so compensation
529 // of the padding added to the GtkImage is needed
530 padding: 0.5em 0.3em;
531 }
532
533 &.needs-attention > .label,
534 &.needs-attention > GtkImage { @extend %needs_attention; }
535 &.needs-attention:active > .label,
536 &.needs-attention:active > GtkImage,
537 &.needs-attention:checked > .label,
538 &.needs-attention:checked > GtkImage {
539 animation: none;
540 background-image: none;
541 }
542 }
543
544 // inline-toolbar buttons
545 .inline-toolbar &,
546 .action-bar &,
547 .inline-toolbar .linked > &,
548 .action-bar .linked > & {
549 &, &:not(.text-button).image-button {
550 @extend .button.flat;
551 padding: 0.75em;
552 border-radius: 100px;
553 outline-radius: 100px;
554 }
555
556 &.text-button {
557 border-radius: 2px;
558 outline-radius: 2px;
559 }
560 }
561
562 .inline-toolbar .stack-switcher > &,
563 .action-bar .stack-switcher > & {
564 &, &:not(.text-button).image-button {
565 @extend .button.flat;
566 padding: 0.5em 0.25em;
567 border-radius: 100px;
568 outline-radius: 100px;
569 }
570 }
571
572 .primary-toolbar & { icon-shadow: none; } // tango icons don't need shadows
573
574 // mimic tab-switcher-ish button array
575 // horizontal array
576 .linked > &:not(.flat):not(:only-child) { @extend %linked_middle; }
577 .linked > &,
578 .linked > & .image-button,
579 .linked > & .text-button {
580 @extend %linked_middle;
581 @extend %button_array;
582 }
583 // vertical array
584 .linked.vertical > &:not(:only-child) { @extend %linked_vertical_middle; }
585 .linked.vertical > &,
586 .linked.vertical > & .image-button,
587 .linked.vertical > & .text-button {
588 @extend %linked_vertical_middle;
589 @extend %button_vertical_array;
590 }
591}
592
593%button_array {
594 @include button(flat-normal);
595 border-radius: 0;
596 outline-radius: 0;
597 color: $secondary_fg_color;
598 border-image: -gtk-gradient(radial,
599 center bottom, 0,
600 center bottom, 0.5,
601 to($track_color),
602 to(transparent))
603 0 0 1 / 0 0 1px;
604 &:hover {
605 @include button(flat-hover);
606 border-radius: 0;
607 border-image: -gtk-gradient(radial,
608 center bottom, 0,
609 center bottom, 0.5,
610 to($track_color),
611 to(transparent))
612 0 0 2 / 0 0 2px;
613 }
614 &:active,
615 &:checked {
616 @include button(flat-checked);
617 border-radius: 0;
618 color: $fg_color;
619 background-color: transparent;
620 border-image: -gtk-gradient(radial,
621 center bottom, 0,
622 center bottom, 0.5,
623 to($selected_bg_color),
624 to(transparent))
625 0 0 2 / 0 0 2px;
626 &:hover { background-color: gtkalpha($secondary_fg_color, 0.1); }
627 &:insensitive {
628 @include button(flat-checked-insensitive);
629 color: $insensitive_fg_color;
630 background-color: transparent;
631 border-image: -gtk-gradient(radial,
632 center bottom, 0,
633 center bottom, 0.5,
634 to(gtkopacity($selected_bg_color, 0.2)),
635 to(transparent))
636 0 0 2 / 0 0 2px;
637 > .label { color: inherit; }
638 }
639 }
640 &:insensitive {
641 @include button(flat-insensitive);
642 border-radius: 0;
643 color: $insensitive_fg_color;
644 background-color: transparent;
645 border-image: -gtk-gradient(radial,
646 center bottom, 0,
647 center bottom, 0.5,
648 to($track_color),
649 to(transparent))
650 0 0 1 / 0 0 1px;
651 }
652}
653
654%button_vertical_array {
655 @include button(flat-normal);
656 border-image: none;
657 border-width: 0;
658 outline-radius: 0;
659 color: $secondary_fg_color;
660 &:hover {
661 @include button(flat-hover);
662 &:dir(ltr) { box-shadow: inset 2px 0 $track_color; }
663 &:dir(rtl) { box-shadow: inset -2px 0 $track_color; }
664 }
665 &:active,
666 &:checked {
667 @include button(flat-checked);
668 color: $fg_color;
669 background-color: transparent;
670 &:dir(ltr) { box-shadow: inset 2px 0 $selected_bg_color; }
671 &:dir(rtl) { box-shadow: inset -2px 0 $selected_bg_color; }
672 &:hover { background-color: gtkalpha(currentColor, 0.1); }
673 &:insensitive {
674 @include button(flat-checked-insensitive);
675 color: $insensitive_fg_color;
676 background-color: transparent;
677 &:dir(ltr) { box-shadow: inset 2px 0 gtkopacity($selected_bg_color, 0.2); }
678 &:dir(ltr) { box-shadow: inset -2px 0 gtkopacity($selected_bg_color, 0.2); }
679 > .label { color: inherit; }
680 }
681 }
682 &:insensitive {
683 @include button(flat-insensitive);
684 color: $insensitive_fg_color;
685 background-color: transparent;
686 &:dir(ltr) { box-shadow: inset 1px 0 $track_color; }
687 &:dir(rtl) { box-shadow: inset -1px 0 $track_color; }
688 }
689
690 &:dir(ltr) { box-shadow: inset 1px 0 $track_color; }
691 &:dir(rtl) { box-shadow: inset -1px 0 $track_color; }
692}
693
694%image_button {
695 padding: 1em;
696 outline-radius: 100px;
697 border-radius: 100px;
698 background-size: 3em * 1 / 0.8 3em * 1 / 0.8, auto;
699}
700
701%needs_attention {
702 background-repeat: no-repeat;
703 background-position: right 3px;
704 background-size: 0.4em 0.4em;
705 animation: needs_attention 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards;
706 transition: none;
707
708 &:dir(rtl) { background-position: left 3px; }
709}
710
711// all the following is for the +|- buttons on inline toolbars, that way
712// should really be deprecated...
713.inline-toolbar GtkToolButton > .button { // redefining the button look is
714 // needed since those are flat...
715 outline-radius: 100px;
716 border-radius: 100px;
717}
718
719// More inline toolbar buttons
720.inline-toolbar.toolbar GtkToolButton {
721 // & > .button.flat { @extend %linked_middle; }
722 // &:first-child > .button.flat { @extend %linked:first-child; }
723 // &:last-child > .button.flat { @extend %linked:last-child; }
724 // &:only-child > .button.flat { @extend %linked:only-child; }
725}
726
727%linked_middle { border-radius: 0; }
728
729%linked {
730 outline-radius: 2px;
731 @extend %linked_middle;
732 &:first-child {
733 border-top-left-radius: 2px;
734 border-bottom-left-radius: 2px;
735 }
736 &:last-child {
737 border-top-right-radius: 2px;
738 border-bottom-right-radius: 2px;
739 }
740 &:only-child { border-radius: 2px; }
741}
742
743%linked_vertical_middle { border-radius: 0; }
744
745%linked_vertical{
746 outline-radius: 2px;
747 @extend %linked_vertical_middle;
748 &:first-child {
749 border-top-left-radius: 2px;
750 border-top-right-radius: 2px;
751 }
752 &:last-child {
753 border-bottom-left-radius: 2px;
754 border-bottom-right-radius: 2px;
755 }
756 &:only-child { border-radius: 2px; }
757}
758
759// menu buttons
760.menuitem.button.flat {
761 transition: none;
762 &:selected { @extend %selected_items; }
763}
764
765GtkColorButton.button {
766 padding: 0.4em 0.6em 0.5em; // Uniform padding on the GtkColorButton
767
768 GtkColorSwatch:first-child:last-child { // :first-child:last-child for a
769 // specificity bump, it gets
770 // overridden by the
771 // colorpicker style, otherwise
772 border-radius: 2px;
773 box-shadow: $z-depth-1;
774 }
775
776 &,
777 GtkColorSwatch {
778 &:insensitive {
779 box-shadow: none;
780 opacity: 0.4;
781 }
782 }
783}
784
785// button box is always shown with flat-buttons
786GtkButtonBox > .button {
787 @include button(flat-normal);
788 color: $secondary_accent_color;
789 font-weight: 700;
790 &:hover {
791 @include button(flat-hover);
792 color: $accent_color;
793 }
794 &:active {
795 @include button(flat-active);
796 color: $accent_color;
797 }
798 &:insensitive { @include button(flat-insensitive); }
799 &:checked {
800 @include button(flat-checked);
801 color: $accent_color;
802 }
803 &:checked:insensitive {
804 @include button(flat-checked-insensitive);
805 color: gtkopacity($accent_color, 0.4);
806 }
807}
808
809
810/*********
811 * Links *
812 *********/
813
814*:link {
815 color: $link_color;
816 &:hover, &:active { color: $link_color; }
817 &:visited {
818 color: $link_visited_color;
819 &:hover, &:active { color: $link_visited_color; }
820 *:selected & { color: mix($selected_fg_color, $selected_bg_color, 60%); }
821 }
822 &:selected,
823 *:selected & {
824 color: mix($selected_fg_color, $selected_bg_color, 80%);
825 }
826 &:insensitive { opacity: 0.4; }
827}
828
829.button:link,
830.button:visited {
831 @extend *:link;
832 & > .label { text-decoration-line: underline; }
833}
834
835
836/*****************
837 * GtkSpinButton *
838 *****************/
839
840.spinbutton {
841 .button,
842 .osd & .button {
843 padding: 0.4em;
844 border: solid 0.35em transparent;
845 border-radius: 100px;
846 outline-radius: 100px;
847 background: none;
848 box-shadow: none;
849 color: $secondary_fg_color;
850 &:not(:last-child) { // '-' button
851 &:hover {
852 @include button(flat-hover);
853 background: none;
854 color: $error_color;
855 }
856 &:active {
857 @include button(flat-active);
858 background-color: $track_color;
859 color: $error_color;
860 }
861 &:insensitive {
862 @include button(flat-insensitive);
863 background: none;
864 color: $insensitive_fg_color;
865 }
866 }
867 &:last-child { // '+' button
868 &:hover {
869 @include button(flat-hover);
870 background: none;
871 color: $success_color;
872 }
873 &:active {
874 @include button(flat-active);
875 background-color: $track_color;
876 color: $success_color;
877 }
878 &:insensitive {
879 @include button(flat-insensitive);
880 background: none;
881 color: $insensitive_fg_color;
882 }
883 }
884 }
885
886 &.vertical { // FIXME: try using linking templates for
887 // vertically linked stuff
888 padding: 0.5em 0;
889
890 .button {
891 padding: 0.2em 0;
892 border: solid 0.5em transparent;
893 border-radius: 200px;
894 outline-radius: 200px;
895 background: none;
896 box-shadow: none;
897 color: $secondary_fg_color;
898 &:first-child { // '+' button
899 &:hover {
900 @include button(flat-hover);
901 background: none;
902 color: $success_color;
903 }
904 &:active {
905 @include button(flat-active);
906 background-color: $track_color;
907 color: $success_color;
908 }
909 &:insensitive {
910 @include button(flat-insensitive);
911 background: none;
912 color: $insensitive_fg_color;
913 }
914 }
915 &:last-child { // '-' button
916 &:hover {
917 @include button(flat-hover);
918 background: none;
919 color: $error_color;
920 }
921 &:active {
922 @include button(flat-active);
923 background-color: $track_color;
924 color: $error_color;
925 }
926 &:insensitive {
927 @include button(flat-insensitive);
928 background: none;
929 color: $insensitive_fg_color;
930 }
931 }
932 }
933
934 &.entry {
935 }
936 }
937
938 GtkTreeView & { // reset styling inside tree-view
939 &.entry:focus {
940 padding: 1px;
941 border-radius: 0;
942 border-width: 0;
943 background-color: $base_color;
944 color: $fg_color;
945 box-shadow: none;
946 &:selected { @extend %selected_items; }
947 }
948 }
949}
950
951
952/**************
953 * ComboBoxes *
954 **************/
955
956GtkComboBox {
957 > .the-button-in-the-combobox {
958 // Otherwise combos are bigger than buttons
959 padding: 0.35em 0.5em 0.45em;
960 }
961
962 -GtkComboBox-arrow-scaling: 0.5;
963 -GtkComboBox-shadow-type: none;
964
965 .menu { padding: 2px 0; }
966 .menu .menuitem { padding: 0.35em 0.5em 0.45em; }
967
968 .separator.vertical {
969 // always disable separators
970 -GtkWidget-wide-separators: true;
971 }
972
973 .button { // combobox-button styling
974 @extend %button_array;
975 border-radius: 0;
976 padding: 0.5em 0.5em 0.55em; // FIXME: need a bit more padding
977 color: $secondary_fg_color;
978 &:hover,
979 &:active,
980 &:checked {
981 @include button(flat-normal);
982 @extend %button_array:active;
983 background-color: transparent;
984 &:insensitive {
985 color: $insensitive_fg_color;
986 }
987 }
988 &:insensitive {
989 color: $insensitive_fg_color;
990 background-color: transparent;
991 }
992 }
993
994 &.combobox-entry {
995 padding: 0;
996
997 .entry {
998 }
999
1000 .button { padding: 0 0.7em; }
1001 }
1002}
1003
1004.linked.vertical > GtkComboBox {
1005 .button { // vertical combobox-button styling
1006 @extend %button_vertical_array;
1007 padding: 0.35em 0.5em 0.45em;
1008 border-radius: 0;
1009 color: $secondary_fg_color;
1010 }
1011}
1012
1013.linked > GtkComboBox > .the-button-in-the-combobox,
1014.linked > GtkComboBoxText > .the-button-in-the-combobox {
1015 // the combo is a composite widget so the way we do button linkind doesn't
1016 // work, special case needed. See
1017 // https://bugzilla.gnome.org/show_bug.cgi?id=733979
1018 &:dir(ltr),
1019 &:dir(rtl) { // specificity bump
1020 @extend %linked_middle;
1021 }
1022}
1023
1024// stop using rounded-borders
1025.linked > GtkComboBox:first-child > .the-button-in-the-combobox,
1026.linked > GtkComboBoxText:first-child > .the-button-in-the-combobox,
1027.linked > GtkComboBox:last-child > .the-button-in-the-combobox,
1028.linked > GtkComboBoxText:last-child > .the-button-in-the-combobox,
1029.linked > GtkComboBox:only-child > .the-button-in-the-combobox,
1030.linked > GtkComboBoxText:only-child > .the-button-in-the-combobox {
1031 @extend %linked_middle;
1032}
1033.linked.vertical > GtkComboBoxText > .the-button-in-the-combobox,
1034.linked.vertical > GtkComboBox > .the-button-in-the-combobox,
1035.linked.vertical > GtkComboBoxText:first-child > .the-button-in-the-combobox,
1036.linked.vertical > GtkComboBox:first-child > .the-button-in-the-combobox,
1037.linked.vertical > GtkComboBoxText:last-child > .the-button-in-the-combobox,
1038.linked.vertical > GtkComboBox:last-child > .the-button-in-the-combobox,
1039.linked.vertical > GtkComboBoxText:only-child > .the-button-in-the-combobox,
1040.linked.vertical > GtkComboBox:only-child > .the-button-in-the-combobox {
1041 @extend %linked_vertical_middle;
1042}
1043
1044
1045/************
1046 * Toolbars *
1047 ************/
1048
1049.toolbar {
1050 -GtkWidget-window-dragging: true;
1051
1052 padding: 0.4em;
1053 border-width: 0;
1054 background-color: $bg_color;
1055 color: $secondary_fg_color;
1056 // draw shadows
1057 box-shadow: if($variant == 'light', $toolbar-shadow-light,
1058 $toolbar-shadow-dark);
1059 &.vertical,
1060 .inline-toolbar &,
1061 GtkPaned &,
1062 GtkEventBox &,
1063 GtkGrid &.primary-toolbar { // stop drawing fake-shadows
1064 box-shadow: none;
1065 }
1066
1067 .osd &, &.osd {
1068 padding: 3px;
1069 border-style: solid;
1070 border-width: 9px;
1071 border-image: -gtk-scaled(url("assets/osd-shadow#{$asset_suffix}.png"),
1072 url("assets/osd-shadow#{$asset_suffix}@2.png"))
1073 10 / 10px stretch;
1074 border-radius: 2px;
1075 box-shadow: none;
1076 color: $inverted_fg_color;
1077 background-color: $inverted_dark_color;
1078 &:backdrop {
1079 border-image: -gtk-scaled(url("assets/osd-shadow-backdrop#{$asset_suffix}.png"),
1080 url("assets/osd-shadow-backdrop#{$asset_suffix}@2.png"))
1081 10 / 10px stretch;
1082 }
1083
1084 .button {
1085 @extend .button.flat;
1086 &:not(:active):not(:insensitive):not(hover) {
1087 color: $secondary_accent_color;
1088 }
1089 &:hover,
1090 &:active { color: $accent_color; }
1091 &:active,
1092 &:checked {
1093 border-image: none;
1094 box-shadow: none;
1095 }
1096 &:insensitive { color: gtkopacity($accent_color, 0.4); }
1097 }
1098
1099 .label { padding: 0 1em; }
1100 }
1101
1102 .button { // use flat-buttons
1103 @extend .button.flat;
1104 border-image: -gtk-gradient(radial,
1105 center bottom, 0,
1106 center bottom, 0.001,
1107 to($track_color),
1108 to(transparent))
1109 0 0 0 / 0 0 0px;
1110 color: $secondary_fg_color;
1111 box-shadow: none;
1112 &:hover {
1113 border-image: none;
1114 color: $fg_color;
1115 box-shadow: none;
1116 }
1117 &:checked {
1118 border-image: -gtk-gradient(radial,
1119 center bottom, 0,
1120 center bottom, 0.5,
1121 to($selected_bg_color),
1122 to(transparent))
1123 0 0 2 / 0 0 2px;
1124 background: transparent;
1125 color: $fg_color;
1126 box-shadow: none;
1127 &:insensitive {
1128 border-image: none;
1129 background: transparent;
1130 color: $insensitive_fg_color;
1131 box-shadow: none;
1132 > .label { color: inherit; }
1133 }
1134 }
1135 &:insensitive {
1136 border-image: none;
1137 background-color: transparent;
1138 color: $insensitive_secondary_fg_color;
1139 box-shadow: none;
1140 }
1141
1142 .image-button {
1143 border-radius: 100px;
1144 outline-radius: 100px;
1145 }
1146 }
1147
1148 & .linked > .button {
1149 border-radius: 100px;
1150 outline-radius: 100px;
1151 &:hover { background-color: transparent; } // remove double-background
1152 &:not(:checked) {
1153 border-radius: 100px;
1154 outline-radius: 100px;
1155 }
1156 }
1157 & .linked > .button.text-button:not(.image-button) { // revive underlines
1158 @extend %button_array;
1159 }
1160}
1161
1162// searchbar, location-bar & inline-toolbar
1163.inline-toolbar {
1164 padding: 0.4em;
1165 border-style: solid;
1166 border-width: 0 1px 1px;
1167 border-color: $borders_color;
1168 background-color: $secondary_dark_color;
1169 box-shadow: if($variant == 'light', $inline-shadow-light,
1170 $inline-shadow-dark);
1171}
1172
1173.search-bar,
1174.location-bar {
1175 padding: 0.4em;
1176 border-style: solid;
1177 border-width: 0 0 1px;
1178 border-color: $borders_color;
1179 background-color: $secondary_dark_color;
1180
1181 // use flat circle-button for '+', 'x', etc...
1182 .button.raised {
1183 padding: 0.75em;
1184 border-radius: 100px;
1185 outline-radius: 100px;
1186 }
1187}
1188
1189
1190/***************
1191 * Header bars *
1192 ***************/
1193
1194.titlebar,
1195.header-bar {
1196 @extend %fade_effect;
1197
1198 -GtkPaned-handle-size: 0; // FIXME: workaround for ugly Gedit!
1199
1200 padding: 0.4em;
1201 border-width: 1px 0 1px;
1202 border-style: solid;
1203 // do not use transparentize
1204 border-top-color: $top_edge_border_color;
1205 border-bottom-color: $solid_dark_borders_color;
1206 background-color: $inverted_dark_color;
1207 background-clip: border-box;
1208
1209 // basic text colours
1210 color: $inverted_secondary_fg_color;
1211 .label { // FIXME: only for insensitive state!
1212 &:checked {
1213 &:insensitive { color: $insensitive_inverted_fg_color; }
1214 }
1215 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1216 }
1217
1218 // titles
1219 .title {
1220 padding-left: 1em;
1221 padding-right: 1em;
1222 color: $inverted_fg_color;
1223 font-weight: 700;
1224 &:backdrop { @extend .dim-label; }
1225 }
1226
1227 .subtitle {
1228 @extend .dim-label;
1229 padding-left: 1em;
1230 padding-right: 1em;
1231 color: $inverted_secondary_fg_color;
1232 font-size: 90%;
1233 &:backdrop { @extend .dim-label; }
1234 }
1235
1236 // separator
1237 .header-bar-separator,
1238 & > GtkBox > .separator.vertical,
1239 & > GtkBox > GtkBox > .separator.vertical {
1240 -GtkWidget-separator-width: 0;
1241 border: 0 none transparent;
1242 color: transparent;
1243 }
1244
1245 // button styling
1246 .button:not(.suggested-action):not(.destructive-action) {
1247 @extend .button.flat;
1248 border-image: -gtk-gradient(radial,
1249 center bottom, 0,
1250 center bottom, 0.001,
1251 to($track_color),
1252 to(transparent))
1253 0 0 0 / 0 0 0px;
1254 color: $inverted_secondary_fg_color;
1255 &:hover { color: $inverted_fg_color; }
1256 &:checked {
1257 border-image: -gtk-gradient(radial,
1258 center bottom, 0,
1259 center bottom, 0.5,
1260 to($selected_bg_color),
1261 to(transparent))
1262 0 0 2 / 0 0 2px;
1263 background-color: transparent;
1264 color: $inverted_fg_color;
1265 // &:active { transition: none; }
1266 &:insensitive {
1267 background-color: transparent;
1268 color: $insensitive_inverted_fg_color;
1269 > .label { color: inherit; }
1270 }
1271 }
1272 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1273 }
1274
1275 .button,
1276 .linked > .button,
1277 .button.suggested-action,
1278 .button.destructive-action {
1279 &, & .label.text-button {
1280 color: $inverted_secondary_fg_color;
1281 &:hover { color: $inverted_fg_color; }
1282 &:checked {
1283 color: $inverted_fg_color;
1284 &:insensitive { color: $insensitive_inverted_fg_color; }
1285 }
1286 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1287 }
1288
1289 .label.text-button { // workaround for Gnome-Software
1290 border-image: none;
1291 box-shadow: none;
1292 }
1293 }
1294
1295 // force to draw circle flat buttons as default
1296 .button:not(.suggested-action):not(.destructive-action) {
1297 border-radius: 100px;
1298 outline-radius: 100px;
1299 &.text-button {
1300 border-radius: 2px;
1301 outline-radius: 2px;
1302 &.image-button {
1303 border-radius: 2px;
1304 outline-radius: 2px;
1305 }
1306 }
1307 }
1308
1309 // entry styling
1310 .entry,
1311 .linked > .entry {
1312 color: $inverted_secondary_fg_color;
1313 &:focus { color: $inverted_fg_color; }
1314 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1315 }
1316
1317 // combobox styling
1318 GtkComboBox,
1319 .linked > GtkComboBox {
1320 &.combobox-entry {
1321 .entry {
1322 color: $inverted_secondary_fg_color;
1323 &:focus { color: $inverted_fg_color; }
1324 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1325 }
1326
1327 .button {
1328 color: $inverted_secondary_fg_color;
1329 &:hover { color: $inverted_fg_color; }
1330 &:checked {
1331 color: $inverted_fg_color;
1332 &:insensitive { color: $insensitive_inverted_fg_color; }
1333 }
1334 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1335 }
1336 }
1337 }
1338
1339 // menu styling
1340 .menu .menuitem { // reset text colour
1341 color: $secondary_fg_color;
1342 &:hover { color: $fg_color; }
1343
1344 .label {
1345 &:insensitive { color: $insensitive_fg_color; }
1346 }
1347
1348 .accelerator { color: gtkalpha(currentColor, 0.6); }
1349
1350 .separator { color: $borders_color; }
1351 }
1352
1353 // pop-over styling
1354 .popover .button.flat {
1355 color: $secondary_fg_color;
1356 &:hover { color: $fg_color; }
1357
1358 .label {
1359 &:hover { color: $fg_color; }
1360 &:insensitive { color: $insensitive_fg_color; }
1361 }
1362 }
1363
1364 // switch styling
1365 GtkSwitch {
1366 &.trough {
1367 background-color: gtkopacity($inverted_secondary_fg_color, 0.1);
1368 &:active {
1369 background-color: gtkopacity($selected_bg_color, 0.2);
1370 &:insensitive { background-color: gtkopacity($selected_bg_color, 0.2); }
1371 }
1372 &:insensitive {
1373 color: $insensitive_inverted_fg_color;
1374 background-color: $track_color;
1375 }
1376 }
1377
1378 &.slider {
1379 background-color: $inverted_bg_color;
1380 &:hover {
1381 background-image: linear-gradient(to bottom,
1382 gtkalpha($selected_fg_color, 0.2));
1383 }
1384 &:active {
1385 background-color: $selected_bg_color;
1386 &:insensitive { background-color: #3F4E56; }
1387 }
1388 &:insensitive { background-color: #3F4E56; }
1389 }
1390 }
1391
1392
1393 // selection-mode styling
1394 &.selection-mode {
1395 border-width: 1px 0 1px 0; // remove side borders
1396 border-top-color: $highlight_color;
1397 border-bottom-color: transparent;
1398 background-color: $selected_bg_color;
1399 color: $selected_fg_color;
1400
1401 .subtitle:link { @extend *:link:selected; }
1402
1403 .button,
1404 .button.text-button,
1405 .flat.selection-menu,
1406 .text-button.selection-menu,
1407 .button.image-button {
1408 border-image: -gtk-gradient(radial,
1409 center bottom, 0,
1410 center bottom, 0.001,
1411 to($selected_fg_color),
1412 to(transparent))
1413 0 0 0 / 0 0 0px;
1414 color: $secondary_selected_fg_color;
1415 background-color: transparent;
1416 &:hover,
1417 &:active,
1418 &:checked { color: $selected_fg_color; }
1419 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1420 &:checked {
1421 border-image: -gtk-gradient(radial,
1422 center bottom, 0,
1423 center bottom, 0.5,
1424 to($selected_fg_color),
1425 to(transparent))
1426 0 0 2 / 0 0 2px;
1427 color: $selected_fg_color;
1428 background-color: transparent;
1429 &:insensitive {
1430 color: $insensitive_selected_fg_color;
1431 > .label { color: inherit; }
1432 }
1433 }
1434
1435 &.suggested-action {
1436 // NOTE: do not use @extend .button;
1437 @include button(normal);
1438 &:hover { @include button(hover); }
1439 &:active { @include button(active); }
1440 &:insensitive { @include button(insensitive); }
1441 }
1442 }
1443
1444 .button:not(.suggested-action):not(.destructive-action) {
1445 border-radius: 100px;
1446 outline-radius: 100px;
1447 &.text-button,
1448 &.flat.selection-menu {
1449 border-radius: 2px;
1450 outline-radius: 2px;
1451 &.image-button {
1452 border-radius: 100px;
1453 outline-radius: 100px;
1454 }
1455 }
1456 }
1457
1458 .entry {
1459 color: $inverted_secondary_fg_color;
1460 &:focus { color: $inverted_fg_color; }
1461 &:insensitive { color: $insensitive_inverted_secondary_fg_color; }
1462 }
1463
1464 .selection-menu {
1465 padding-left: 1.2em;
1466 padding-right: 1.2em;
1467
1468 GtkArrow { -GtkArrow-arrow-scaling: 1; }
1469
1470 .arrow { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); }
1471 }
1472 }
1473
1474 // misc
1475 .tiled & {
1476 @extend %tiled_integration;
1477 transition: none;
1478 }
1479 .maximized & {
1480 @extend %maxd_integration;
1481 transition: none;
1482 }
1483
1484 &.default-decoration { // FIXME: do not use scalable units
1485 padding: 5.3px;
1486 border-width: 0;
1487
1488 .title { // fade_effect doesn't work
1489 color: $inverted_fg_color;
1490 &:backdrop { color: gtkopacity($inverted_fg_color, 0.4); }
1491 }
1492
1493 .button.titlebutton {
1494 padding: 4px;
1495 color: $inverted_secondary_fg_color;
1496 &:hover,
1497 &:active { color: $inverted_fg_color; }
1498 &:backdrop { color: gtkopacity($inverted_fg_color, 0.4); }
1499 }
1500 }
1501}
1502
1503.header-bar { // draw hilight and shadows
1504 .csd &,
1505 GtkBox &:only-child {
1506 box-shadow: if($variant == 'light', $header-shadow-light,
1507 $header-shadow-dark);
1508
1509 .tiled & { @extend %tiled_integration; }
1510 .maximized & { @extend %maxd_integration; }
1511 }
1512
1513 // override unwanted side-borders
1514 GtkBox &:not(:only-child):first-child,
1515 GtkBox &:not(:only-child):last-child {
1516 border-left-color: $inverted_dark_color;
1517 border-right-color: $inverted_dark_color;
1518
1519 .tiled &,
1520 .maximized & {
1521 border-left-color: $panel_bg_color;
1522 border-right-color: $panel_bg_color;
1523 }
1524 }
1525
1526 // Remove unneeded side shadows with dirty hacks
1527 GtkBox &:not(:only-child):last-child {
1528 &:dir(ltr) {
1529 box-shadow: if($variant == 'light', $sub-header-shadow-light-ltr,
1530 $sub-header-shadow-dark-ltr);
1531
1532 .tiled & { @extend %tiled_integration; }
1533 .maximized & { @extend %maxd_integration; }
1534 }
1535 &:dir(rtl) {
1536 box-shadow: if($variant == 'light', $sub-header-shadow-light-rtl,
1537 $sub-header-shadow-dark-rtl);
1538
1539 .tiled & { @extend %tiled_integration; }
1540 .maximized & { @extend %maxd_integration; }
1541 }
1542 }
1543
1544 // draw paned-separator with border
1545 GtkPaned &:not(:only-child):last-child {
1546 &:dir(ltr) {
1547 border-left: 1px solid $solid_dark_borders_color;
1548
1549 .tiled & { @extend %tiled_integration; }
1550 .maximized & { @extend %maxd_integration; }
1551 }
1552 &:dir(rtl) {
1553 border-right: 1px solid $solid_dark_borders_color;
1554
1555 .tiled & { @extend %tiled_integration; }
1556 .maximized & { @extend %maxd_integration; }
1557 }
1558 }
1559}
1560
1561.header-bar.selection-mode { // selection-mode specific
1562 GtkBox & { // Remove unneeded side shadows with dirty hacks
1563 &:not(:only-child):last-child {
1564 &:dir(ltr) {
1565 box-shadow: if($variant == 'light', $selected-header-shadow-light-ltr,
1566 $selected-header-shadow-dark-ltr);
1567
1568 .tiled & { @extend %tiled_integration; }
1569 .maximized & { @extend %maxd_integration; }
1570 }
1571 &:dir(rtl) {
1572 box-shadow: if($variant == 'light', $selected-header-shadow-light-rtl,
1573 $selected-header-shadow-dark-rtl);
1574
1575 .tiled & { @extend %tiled_integration; }
1576 .maximized & { @extend %maxd_integration; }
1577 }
1578 }
1579 }
1580}
1581
1582.header-bar,
1583.titlebar { // set rounded corners
1584 border-top-left-radius: 2px;
1585 border-top-right-radius: 2px;
1586
1587 GtkBox &:not(:last-child):not(.titlebar) {
1588 &:dir(ltr) {
1589 border-top-left-radius: 2px;
1590 border-top-right-radius: 0;
1591 }
1592 &:dir(rtl) {
1593 border-top-left-radius: 0;
1594 border-top-right-radius: 2px;
1595 }
1596 }
1597
1598 GtkBox &:last-child:not(.titlebar) {
1599 &:dir(ltr) { border-top-left-radius: 0; }
1600 &:dir(rtl) { border-top-right-radius: 0; }
1601 }
1602}
1603
1604// squared corners when the window is max'd or tiled
1605%tiled_integration {
1606 border-radius: 0;
1607 border-color: $panel_bg_color;
1608 border-width: 2px 0 0 0;
1609 border-top-color: $secondary_selected_bg_color;
1610 background-color: $panel_bg_color;
1611 box-shadow: none;
1612 &:backdrop { border-top-color: $track_color; }
1613}
1614
1615%maxd_integration {
1616 border-radius: 0;
1617 border-color: $panel_bg_color;
1618 border-width: 1px 0 0 0;
1619 background-color: $panel_bg_color;
1620 box-shadow: none;
1621}
1622
1623
1624/************
1625 * Pathbars *
1626 ************/
1627
1628.path-bar .button {
1629 padding: 0.3em 0.7em 0.4em;
1630
1631 &.image-button { padding: 0.7em; }
1632
1633 &:only-child { padding: 0.3em 0.7em 0.4em; }
1634
1635 // the following is for spacing the icon and the label inside the home button
1636 .label {
1637 &:last-child { padding-left: 2px; }
1638 &:first-child { padding-right: 2px; }
1639 &:only-child {
1640 padding-right: 0;
1641 padding-left: 0;
1642 }
1643 }
1644
1645 GtkImage { padding-top: 1px; }
1646}
1647
1648
1649/**************
1650 * Tree Views *
1651 **************/
1652
1653GtkTreeView.view {
1654 @at-root * {
1655 -GtkTreeView-horizontal-separator: 4;
1656 -GtkTreeView-grid-line-width: 1;
1657 -GtkTreeView-grid-line-pattern: '';
1658 -GtkTreeView-tree-line-width: 1;
1659 -GtkTreeView-tree-line-pattern: '';
1660 -GtkTreeView-expander-size: 16;
1661 }
1662
1663 border-left-color: $track_color; // this is actually the tree lines color,
1664 border-top-color: $borders_color; // while this is the grid lines color,
1665 // better then nothing
1666
1667 &.rubberband { @extend .rubberband; } // to avoid borders being overridden
1668 // by the previously set props
1669
1670 border-radius: 0; // rest border radius in lists
1671
1672 &:hover,
1673 &:selected { border-radius: 0; }
1674
1675 // override foreground colours
1676 &, & .entry,
1677 & .entry > .label {
1678 color: $secondary_fg_color;
1679 &:hover,
1680 &:active,
1681 &:focus { color: $fg_color; }
1682 &:selected { color: $selected_fg_color; }
1683 &:insensitive {
1684 color: $insensitive_fg_color;
1685 &:selected { color: $insensitive_selected_fg_color; }
1686 }
1687 }
1688
1689 .separator {
1690 &, &:hover { color: $borders_color; }
1691 }
1692
1693 // clear backgrounds
1694 background-color: transparent;
1695 background-image: none;
1696 box-shadow: none;
1697
1698 &.dnd {
1699 border-style: solid none;
1700 border-width: 1px;
1701 border-color: mix($fg_color, $selected_bg_color, 50%);
1702 }
1703
1704 &.expander {
1705 -gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
1706 &:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); }
1707 &:checked { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); }
1708 &:selected {
1709 color: gtkopacity($selected_fg_color, 0.75);
1710 &:hover, &:active { color: $selected_fg_color; }
1711 }
1712 }
1713
1714 &.progressbar { // progress bar in treeviews
1715 @extend %treeview_progressbar;
1716 border-color: $accent_color;
1717 &:selected { border-color: currentColor; }
1718 }
1719
1720 &.trough { // progress bar trough in treeviews
1721 @extend %treeview_progressbar;
1722 border-color: gtkopacity($accent_color, 0.2);
1723 &:selected { border-color: $track_color; }
1724 }
1725
1726 &, GtkPaned & { // redraw some stuff for RhythmBox
1727 background-color: $base_color;
1728
1729 &:hover,
1730 .list-row:hover { color: $fg_color; }
1731 &:selected,
1732 .list-row:selected { @extend %selected_items; }
1733 }
1734}
1735
1736column-header {
1737 .button {
1738 @extend .list-row.activatable;
1739 padding: 0.3em 0.4em 0.35em;
1740 border-style: none solid solid none;
1741 border-width: 1px;
1742 border-color: $borders_color;
1743 border-radius: 0;
1744 background-color: $base_color;
1745 color: $tertiary_fg_color;
1746 box-shadow: none;
1747 &:hover,
1748 &:active {
1749 color: $fg_color;
1750 box-shadow: none;
1751 }
1752 &:insensitive { background-color: $base_color; }
1753 &.dnd { @extend column-header.button.dnd; }
1754 }
1755
1756 &:last-child .button,
1757 &:last-child.button { // treeview-like derived widgets
1758 // in Banshee and Evolution
1759 border-right-style: none;
1760 }
1761
1762 GtkPaned & { // redraw some stuff for RhythmBox
1763 .button {
1764 background-color: $base_color;
1765 // background-image: linear-gradient(to bottom, $bg_color);
1766 &:insensitive { background-color: $base_color; }
1767 }
1768
1769 &:not(:first-child):not(:last-child) {
1770 &.button,
1771 & .button { border-style: none solid solid none; }
1772 }
1773 &, &:only-child,
1774 &:first-child,
1775 &:last-child {
1776 &.button,
1777 & .button { border-style: none none solid none; }
1778 }
1779 }
1780}
1781
1782column-header.button.dnd { // for treeview-like derive widgets
1783 // transition: none;
1784 border-left-style: solid;
1785 color: $selected_bg_color;
1786}
1787
1788
1789/*********
1790 * Menus *
1791 *********/
1792
1793.menubar {
1794 -GtkWidget-window-dragging: true;
1795 padding: 0;
1796 box-shadow: $menubar-shadow;
1797 background-color: $inverted_dark_color;
1798 color: $inverted_secondary_fg_color; // FIXME: Gtk+3 firefox needs this!
1799
1800 & > .menuitem {
1801 padding: 0.4em 0.6em;
1802 color: $inverted_secondary_fg_color;
1803 &:hover { // Seems like it :hover even with keyboard focus
1804 color: $inverted_fg_color;
1805 box-shadow: inset 0 -2px $selected_bg_color;
1806 }
1807 &:insensitive {
1808 color: $insensitive_inverted_fg_color;
1809 box-shadow: none;
1810 }
1811 }
1812
1813 .tiled &,
1814 .maximized & {
1815 background-color: $panel_bg_color;
1816 box-shadow: none;
1817 }
1818}
1819
1820.menu {
1821 margin: 4px 0;
1822 padding: 4px 0;
1823 border-width: 1px; // adds borders in a non composited env
1824 border-style: solid;
1825 border-color: $base_color transparent transparent;
1826 background-color: $secondary_base_color;
1827
1828 .csd & { // axes borders in a composited env
1829 border-width: 1px;
1830 border-radius: 2px;
1831 border-color: $base_color transparent transparent;
1832 }
1833
1834 .menuitem {
1835 transition: none;
1836 padding: 0.4em 0.4em 0.5em;
1837 color: $secondary_fg_color;
1838 font: initial;
1839 text-shadow: none;
1840 &:hover {
1841 transition: none;
1842 color: $fg_color;
1843 background-color: gtkalpha(currentColor, 0.1);
1844 }
1845 &:insensitive { color: $insensitive_fg_color; }
1846
1847 // submenu indicators
1848 &.arrow {
1849 -gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
1850 &:insensitive { color: $insensitive_fg_color; }
1851 }
1852 &.arrow:dir(rtl) {-gtk-icon-source:-gtk-icontheme('pan-end-symbolic-rtl'); }
1853 }
1854
1855 &.button { // overlow buttons
1856 border-style: none;
1857 border-radius: 0;
1858 background-color: $secondary_base_color;
1859 &:hover { background-color: $secondary_dark_color; }
1860 &:insensitive {
1861 color: transparent;
1862 background-color: transparent;
1863 border-color: transparent ;
1864 }
1865
1866 &.top { border-bottom: 1px solid $borders_color; }
1867 &.bottom { border-top: 1px solid $borders_color; }
1868 }
1869
1870 // use asymmetric separators
1871 GtkSeparatorMenuItem {
1872 &:dir(ltr) {
1873 padding-left: 2.4em;
1874 padding-right: 0;
1875 }
1876 &:dir(rtl) {
1877 padding-left: 0;
1878 padding-right: 2.4em;
1879 }
1880 }
1881}
1882
1883.menuitem {
1884 .accelerator { color: gtkalpha(currentColor, 0.55); }
1885
1886 .separator { color: $borders_color; }
1887}
1888
1889.csd.popup { border-radius: 2px; }
1890
1891
1892/***************
1893 * Popovers *
1894 ***************/
1895
1896.popover {
1897 padding: 2px;
1898 border: 1px solid;
1899 border-color: $base_color $secondary_base_color $secondary_base_color;
1900 border-radius: 2px;
1901 background-color: $secondary_base_color;
1902 box-shadow: $z-depth-3;
1903 &:backdrop { box-shadow: $z-depth-1; }
1904
1905 > .list,
1906 > .view,
1907 > .toolbar,
1908 &.osd > .toolbar {
1909 border-style: none;
1910 border-image: none;
1911 background-color: transparent;
1912 transition: none;
1913 }
1914
1915 .button.menuitem.flat,
1916 .button.flat {
1917 transition: none;
1918 background-color: transparent;
1919 background-size: 8em * 1 / 0.8 8em * 1 / 0.8, auto;
1920 color: $secondary_fg_color;
1921 font: initial;
1922 &:hover {
1923 background-color: transparent; // remove double-bg
1924 color: $fg_color;
1925 }
1926
1927 // FIXME: label padding is ugly
1928 // vertical padding of GtkMenuItem * 0.5
1929 .label { padding: 0.2em 0 0.25em; }
1930 }
1931
1932 .linked > .button {
1933 // @extend .button.flat;
1934 @include button(flat-normal);
1935 @extend %button_array;
1936 color: $secondary_fg_color;
1937 &:hover { @include button(flat-hover); }
1938 &:active { @include button(flat-active); }
1939 &:insensitive { @include button(flat-nsensitive); }
1940 &:checked {
1941 @include button(flat-checked);
1942 color: $fg_color;
1943 background-color: transparent;
1944 }
1945 &:checked:insensitive { @include button(flat-checked-insensitive); }
1946 }
1947
1948 // hide trough in popover
1949 .scrollbar.trough {
1950 background-color: transparent;
1951 border: 1px none transparent;
1952 }
1953
1954 &.osd { @extend %osd; }
1955}
1956
1957
1958/*****************
1959 * Notebooks and *
1960 * Tabs *
1961 *****************/
1962
1963.notebook {
1964 // Through me you go to the grief wracked city;
1965 // Through me you go to everlasting pain;
1966 // Through me you go a pass among lost souls.
1967 // ...
1968 // Abandon all hope — Ye Who Enter Here
1969 padding: 0;
1970 background-color: $base_color;
1971 -GtkNotebook-initial-gap: 6;
1972 -GtkNotebook-arrow-spacing: 5;
1973 -GtkNotebook-tab-curvature: 0;
1974 -GtkNotebook-tab-overlap: 1;
1975 -GtkNotebook-has-tab-gap: false;
1976 -GtkWidget-focus-padding: 0;
1977 -GtkWidget-focus-line-width: 0;
1978
1979 &.frame {
1980 border: 1px solid $borders_color;
1981 @each $_tab, $_border in (top, top),
1982 (bottom, bottom),
1983 (left, left),
1984 (right, right) {
1985 &.#{$_tab} {
1986 border-#{$_border}-color: $base_color;
1987 }
1988 }
1989 }
1990
1991 &.header {
1992 // FIXME: double borders in some case, can't fix it w/o a class tho
1993 // FIXME: doesn't work on dark var
1994 background-color: $bg_color;
1995
1996 // this is the shading of the header behind the tabs
1997 &.frame { border: none; }
1998
1999 @each $_header, $_border in (top, 0 -1px),
2000 (bottom, 0 1px),
2001 (left, -1px 0),
2002 (right, 1px 0) {
2003 &.#{$_header} { box-shadow: inset #{$_border} $borders_color; }
2004 }
2005 }
2006
2007 tab {
2008 outline-offset: 0;
2009 border-width: 0;
2010 border-style: solid;
2011 border-color: transparent;
2012 background-color: transparent;
2013
2014 $tab_indicator_size: 2px;
2015 // vertical tab sizing
2016 $vt_vpadding: 0.5em;
2017 $vt_hpadding: 1.2em;
2018 // horizontal tab sizing
2019 $ht_vpadding: 0.5em;
2020 $ht_hpadding: 1.2em;
2021
2022 // FIXME: we get double border in some cases, not considering the broken
2023 // notebook content frame...
2024 &.top,
2025 &.bottom { padding: $vt_vpadding $vt_hpadding; }
2026 &.left,
2027 &.right { padding: $ht_vpadding $ht_hpadding; }
2028
2029 &.reorderable-page {
2030 -GtkNotebook-tab-overlap: 1;
2031 &.top,
2032 &.bottom {
2033 padding-left: 1.2em; // for a nicer close button
2034 padding-right: 1.2em; // placement
2035 border-left-width: 1px;
2036 border-right-width: 1px;
2037 }
2038 &.left,
2039 &.right {
2040 border-bottom-width: 1px;
2041 border-top-width: 1px;
2042 }
2043 }
2044
2045 @each $_tab, $_border in (top, bottom),
2046 (bottom, top),
2047 (left, right),
2048 (right, left) {
2049 &.#{$_tab} {
2050 // padding-#{$_border}: ($vt_vpadding -$tab_indicator_size);
2051 border-#{$_border}-width: $tab_indicator_size;
2052 }
2053 }
2054
2055 // here's the interesting stuff
2056 &:hover,
2057 &.prelight-page { border-color: $track_color; }
2058 &:active,
2059 &.active-page { border-color: $selected_bg_color; }
2060
2061 @each $_tab, $_border in (top, bottom),
2062 (bottom, top),
2063 (left, right),
2064 (right, left) {
2065 &.reorderable-page.#{$_tab} {
2066 border-color: transparent;
2067 &:hover, &.prelight-page {
2068 border-color: $borders_color;
2069 border-#{$_border}-width: 1px;
2070 border-#{$_border}-color: $borders_color;
2071 background-color: $base_color;
2072 box-shadow: none;
2073 }
2074 &:active, &.active-page {
2075 border-color: $borders_color;
2076 border-#{$_border}-width: 2px;
2077 border-#{$_border}-color: $selected_bg_color;
2078 background-color: $base_color;
2079 box-shadow: if($variant == 'light', $tab-shadow-light,
2080 $tab-shadow-dark);
2081 }
2082 }
2083 }
2084
2085 .label { // tab text
2086 // needed for a nicer focus ring
2087 // and to prevent unexpected offset on reorderable-page,
2088 // set same padding with .button > GtkImage
2089 padding: 0.5em;
2090 font-weight: 700;
2091 color: $tertiary_fg_color;
2092 }
2093 .prelight-page .label,
2094 .label.prelight-page { // hover tab text
2095 color: $fg_color;
2096 }
2097 .active-page .label,
2098 .label.active-page { // active tab text
2099 color: $fg_color;
2100 }
2101
2102 .button { // tab close button
2103 @extend %image_button;
2104 padding: 0;
2105 background-size: 3em * 1 / 0.8 3em * 1 / 0.8, auto;
2106 @include button(flat-normal);
2107 color: $tertiary_fg_color;
2108 &:hover { @include button(flat-hover); }
2109 &:active { @include button(flat-active); }
2110 &:insensitive { @include button(flat-insensitive); }
2111
2112 & > GtkImage { // this is a hack which makes tabs grow
2113 padding: 0.6em;
2114 }
2115 }
2116 .prelight-page .button,
2117 &:hover .button { // hover tab close button
2118 color: $fg_color;
2119 }
2120 .active-page .button,
2121 &:hover .button { // active tab close button
2122 color: $fg_color;
2123 }
2124 }
2125
2126 &.arrow {
2127 color: $tertiary_fg_color;
2128 &:hover,
2129 &:active { color: $fg_color; }
2130 &:insensitive { color: $insensitive_secondary_fg_color; }
2131 }
2132
2133 &:not(.reorderable-page) > .entry { @extend .entry.flat; }
2134}
2135
2136
2137/**************
2138 * Scrollbars *
2139 **************/
2140
2141@keyframes slow_down_ltr {
2142 to { margin-right: 0; }
2143}
2144
2145@keyframes slow_down_rtl {
2146 to { margin-left: 0; }
2147}
2148
2149@keyframes slow_down_horz {
2150 to { margin-top: 0; }
2151}
2152
2153.scrollbar {
2154 -GtkRange-slider-width: 12;
2155 -GtkRange-trough-border: 0;
2156 -GtkScrollbar-has-backward-stepper: false;
2157 -GtkScrollbar-has-forward-stepper: false;
2158 -GtkScrollbar-min-slider-length: 32;
2159 // minimum size for the slider.
2160 // sadly can't be in '.slider'
2161 // where it belongs
2162 -GtkRange-stepper-spacing: 0;
2163 -GtkRange-trough-under-steppers: 1;
2164
2165 .button { border: none; }
2166
2167 &.overlay-indicator {
2168 &:not(.dragging):not(.hovering) { // Overlay scrolling indicator
2169 -GtkRange-slider-width: 10px; // actually 10 - 4 -> 6px slider
2170
2171 .slider {
2172 margin: 0;
2173 border: none;
2174 }
2175
2176 .trough {
2177 border-style: none;
2178 background-color: transparent;
2179 }
2180
2181 // w/o the following margin tweaks the slider shrinks when
2182 // hovering/dragging
2183 &.vertical .slider {
2184 margin-top: 0;
2185 margin-bottom: 0;
2186 &:dir(ltr) {
2187 margin-left: 0;
2188 margin-right: 6px;
2189 }
2190 &:dir(ltr) {
2191 margin-left: 6px;
2192 margin-right: 0;
2193 }
2194 }
2195 &.horizontal .slider {
2196 margin-top: 6px;
2197 margin-bottom: 0;
2198 margin-left: 0;
2199 margin-right: 0;
2200 }
2201 }
2202
2203 &.dragging,
2204 &.hovering {
2205 .trough { background-color: gtkopacity($base_color, 0.55); }
2206 }
2207
2208 &.hovering { // slow-down when deforming
2209 &.vertical .slider {
2210 &:dir(ltr) { animation: slow_down_ltr 0.2s linear forwards; }
2211 &:dir(rtl) { animation: slow_down_rtl 0.2s linear forwards; }
2212 }
2213 &.horizontal .slider { animation: slow_down_horz 0.2s linear forwards; }
2214 }
2215 }
2216
2217 // trough coloring
2218 .trough {
2219 border: none;
2220 background-color: $base_color;
2221 }
2222
2223 // slider coloring
2224 .slider {
2225 background-color: gtkopacity($tertiary_fg_color, 0.55);
2226 &:hover { background-color: gtkopacity($secondary_fg_color, 0.55); }
2227 &:active { background-color: $fg_color; }
2228 &:insensitive { opacity: 0.4; }
2229 }
2230
2231 // sizing
2232 .slider {
2233 border-radius: 0;
2234 margin: 0;
2235 }
2236
2237 &.fine-tune .slider { margin: 0; }
2238
2239 &.vertical {
2240 .slider { margin: 0; }
2241 &.fine-tune .slider { margin: 0; }
2242 }
2243
2244 &.horizontal {
2245 .slider { margin: 0; }
2246 &.fine-tune .slider { margin: 0; }
2247 }
2248}
2249
2250.scrollbars-junction,
2251.scrollbars-junction.frame { // the small square between two scrollbars
2252 border: none;
2253 background-color: $base_color;
2254}
2255
2256
2257/**********
2258 * Switch *
2259 **********/
2260
2261GtkSwitch {
2262 -GtkSwitch-slider-width: 20px; // 55px is the right value to make it as tall
2263 // as buttons, not doing that for now
2264 -GtkSwitch-slider-height: 20px;
2265
2266 outline-offset: -4px;
2267 outline-radius: 100px;
2268 font-size: 0;
2269
2270 &.trough {
2271 // similar to the .scale
2272 border: 8px solid transparent;
2273 border-radius: 100px;
2274 background-color: $track_color;
2275 &:active {
2276 background-color: gtkopacity($selected_bg_color, 0.2);
2277 &:insensitive { background-color: gtkopacity($selected_bg_color, 0.2); }
2278 }
2279 &:insensitive {
2280 color: $insensitive_fg_color;
2281 background-color: $track_color;
2282 }
2283 }
2284
2285 &.slider {
2286 padding: 4px;
2287 border-radius: 100px;
2288 outline-radius: 100px;
2289 @include button(normal);
2290 &:hover {
2291 @include button(hover);
2292 background-image: linear-gradient(to bottom,
2293 gtkalpha($selected_fg_color, 0.2));
2294 }
2295 &:active {
2296 @include button(checked);
2297 &:hover { box-shadow: $z-depth-2; }
2298 &:insensitive {
2299 @include button(checked-insensitive);
2300 // do not use any transparentized materials
2301 background-color: if($variant == 'light', #F0F2F3, #3F4E56);
2302 background-image: none;
2303 box-shadow: none;
2304 }
2305 }
2306 &:insensitive {
2307 background-color: if($variant == 'light', #F0F2F3, #3F4E56);
2308 background-image: none;
2309 box-shadow: none;
2310 }
2311 }
2312
2313 .list-row:selected & { // return to monochrome
2314 &.trough {
2315 background-color: $bg_color;
2316 &:active {
2317 background-color: $secondary_dark_color;
2318 &:insensitive { background-color: $secondary_dark_color; }
2319 }
2320 }
2321
2322 &.slider {
2323 background-color: $bg_color;
2324 &:hover {
2325 background-image: linear-gradient(to bottom,
2326 gtkalpha($selected_fg_color, 0.2));
2327 }
2328 &:active {
2329 background-color: $base_color;
2330 &:hover { box-shadow: $z-depth-2; }
2331 }
2332 }
2333 }
2334
2335 // special case inside the grid container,
2336 // need to protect geometry by using pixmaps images...
2337 GtkGrid & {
2338 -GtkSwitch-slider-width: 40;
2339 -GtkSwitch-slider-height: 20;
2340 font-size: 0;
2341 outline-color: transparent;
2342
2343 &.trough,
2344 &.slider { // reset all of default switches
2345 &,
2346 &:hover,
2347 &:active,
2348 &:active:hover,
2349 &:active:insensitive,
2350 &:insensitive {
2351 padding: 0;
2352 border: 4px solid transparent;
2353 color: transparent;
2354 background: none;
2355 background-image: none;
2356 background-size: 40px 20px;
2357 background-repeat: no-repeat;
2358 background-position: right center;
2359 box-shadow: none;
2360
2361 &:dir(rtl) { background-position: left center; }
2362 }
2363 }
2364
2365 &.trough { // use ugly pixmaps
2366 background-image: -gtk-scaled(
2367 url("assets/toggle-off#{$asset_suffix}.png"),
2368 url("assets/toggle-off#{$asset_suffix}@2.png"));
2369 &:hover {
2370 background-image: -gtk-scaled(
2371 url("assets/toggle-off-hover#{$asset_suffix}.png"),
2372 url("assets/toggle-off-hover#{$asset_suffix}@2.png"));
2373 }
2374 &:active {
2375 background-image: -gtk-scaled(url("assets/toggle-on.png"),
2376 url("assets/toggle-on@2.png"));
2377 &:hover {
2378 background-image: -gtk-scaled(url("assets/toggle-on-hover.png"),
2379 url("assets/toggle-on-hover@2.png"));
2380 }
2381 &:insensitive {
2382 background-image: -gtk-scaled(
2383 url("assets/toggle-on-insensitive#{$asset_suffix}.png"),
2384 url("assets/toggle-on-insensitive#{$asset_suffix}@2.png"));
2385 }
2386 }
2387 &:insensitive {
2388 background-image: -gtk-scaled(
2389 url("assets/toggle-off-insensitive#{$asset_suffix}.png"),
2390 url("assets/toggle-off-insensitive#{$asset_suffix}@2.png"));
2391 }
2392 }
2393 }
2394}
2395
2396
2397/*************************
2398 * Check and Radio items *
2399 *************************/
2400
2401// draw regular check and radio items using our PNG assets
2402// all assets are rendered from assets.svg. never add pngs directly
2403
2404@each $w,$a in ('check', 'checkbox'),
2405 ('radio','radio') {
2406
2407 // standard checks and radios
2408 @each $s,$as in ('','-unchecked'),
2409 (':hover', '-unchecked-active'),
2410 (':active', '-unchecked-active'),
2411 (':insensitive','-unchecked-insensitive'),
2412 (':inconsistent', '-mixed'),
2413 (':inconsistent:hover', '-mixed-active'),
2414 (':inconsistent:active', '-mixed-active'),
2415 (':inconsistent:insensitive', '-mixed-insensitive'),
2416 (':checked', '-checked'),
2417 (':checked:hover', '-checked-active'),
2418 (':checked:active', '-checked-active'),
2419 (':checked:insensitive','-checked-insensitive') {
2420 .#{$w}#{$s} {
2421 -gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}#{$asset_suffix}.png"),
2422 url("assets/#{$a}#{$as}#{$asset_suffix}@2.png"));
2423 icon-shadow: none;
2424 }
2425 }
2426
2427 // menu
2428 @each $s,$as in ('',''),
2429 // (':active', '-checked'),
2430 (':insensitive','-insensitive'),
2431 (':inconsistent', '-mixed'),
2432 // (':inconsistent:active', '-mixed'),
2433 (':inconsistent:insensitive', '-mixed-insensitive'),
2434 (':checked', '-checked'),
2435 // (':checked:active', '-checked'),
2436 (':checked:insensitive','-checked-insensitive') {
2437 .menu .menuitem.#{$w}#{$s} {
2438 -gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}.png"),
2439 url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}@2.png"));
2440 icon-shadow: none;
2441 &:hover {
2442 -gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}.png"),
2443 url("assets/#{$a}#{$as}-symbolic#{$asset_suffix}@2.png"));
2444 }
2445 }
2446 }
2447}
2448
2449// check/radio inside selected-rows
2450@each $w,$a in ('check', 'checkbox'),
2451 ('radio','radio') {
2452
2453 // standard checks and radios
2454 @each $s,$as in ('','-unchecked'),
2455 (':active', '-unchecked'),
2456 (':inconsistent', '-mixed'),
2457 (':inconsistent:active', '-mixed'),
2458 (':checked', '-checked'),
2459 (':checked:active', '-checked') {
2460 .view,
2461 .list-row,
2462 .list-row.activatable {
2463 .#{$w}:selected#{$s},
2464 .#{$w}:selected:focus#{$s} {
2465 -gtk-icon-source: -gtk-scaled(url("assets/#{$a}#{$as}-selected.png"),
2466 url("assets/#{$a}#{$as}-selected@2.png"));
2467 icon-shadow: none;
2468 }
2469 // use dark variant for insensitive states
2470 #{$w}:selected:insensitive,
2471 #{$w}:selected:focus:insensitive {
2472 -gtk-icon-source: -gtk-scaled(url("assets/#{$a}-unchecked-insensitive-dark.png"),
2473 url("assets/#{$a}-unchecked-insensitive-dark@2.png"));
2474 }
2475 #{$w}:selected:inconsistent:insensitive,
2476 #{$w}:selected:focus:inconsistent:insensitive {
2477 -gtk-icon-source: -gtk-scaled(url("assets/#{$a}-mixed-insensitive-dark.png"),
2478 url("assets/#{$a}-mixed-insensitive-dark@2.png"));
2479 }
2480 #{$w}:selected:checked:insensitive,
2481 #{$w}:selected:focus:checked:insensitive {
2482 -gtk-icon-source: -gtk-scaled(url("assets/#{$a}-checked-insensitive-dark.png"),
2483 url("assets/#{$a}-checked-insensitive-dark@2.png"));
2484 }
2485 }
2486 }
2487}
2488
2489// selection-mode
2490@each $s,$as in ('','-selectionmode'),
2491 (':hover', '-active-selectionmode'),
2492 (':active', '-active-selectionmode'),
2493 (':insensitive', '-insensitive-selectionmode'),
2494 (':checked', '-checked-selectionmode'),
2495 (':checked:hover', '-checked-active-selectionmode'),
2496 (':checked:active', '-checked-active-selectionmode'),
2497 (':insensitive:checked', '-checked-insensitive-selectionmode') {
2498 .view.content-view.check#{$s}:not(.list) {
2499 -gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}#{$asset_suffix}.png"),
2500 url("assets/checkbox#{$as}#{$asset_suffix}@2.png"));
2501 background-color: transparent;
2502 }
2503}
2504
2505GtkCheckButton.text-button,
2506GtkRadioButton.text-button {
2507 // this is for a nice focus on check and radios text
2508 padding: 0.2em 0.5em;
2509 outline-offset: 0;
2510 color: $secondary_fg_color;
2511 &:hover,
2512 &:active,
2513 &:checked { color: $fg_color; }
2514 &:insensitive,
2515 &:insensitive:active,
2516 &:insensitive:inconsistent {
2517 // set insensitive color, which is overriden otherwise
2518 color: $insensitive_fg_color;
2519 }
2520}
2521
2522
2523/************
2524 * GtkScale *
2525 ************/
2526
2527.scale,
2528.scale.scale-has-marks-above.scale-has-marks-below,
2529.scale.vertical.scale-has-marks-above.scale-has-marks-below {
2530 // FIXME: rationalize
2531 -GtkScale-slider-length: 20;
2532 -GtkRange-slider-width: 20;
2533 -GtkRange-trough-border: 2;
2534 outline-offset: -8px;
2535 outline-radius: 100px;
2536
2537 &.fine-tune {
2538 // outline-offset: -6px;
2539 &.slider { background-size: 80%; }
2540 &.trough {
2541 // margin: 8px;
2542 // border-radius: 100px;
2543 }
2544 }
2545
2546 &.slider {
2547 &:not(:hover):not(:active) { background-size: 80%; }
2548 // @include entry(normal);
2549 // border-radius: 50%;
2550 // background-color: $accent_color;
2551 @each $s,$as in ('',''),
2552 // (':hover','-hover'),
2553 (':active','-active'),
2554 (':insensitive','-insensitive') {
2555 &.slider#{$s} {
2556 $_url: 'assets/slider#{$as}#{$asset_suffix}';
2557 border-style: none;
2558 border-radius: 0;
2559 background-color: transparent;
2560 background-image: -gtk-scaled(url('#{$_url}.png'),
2561 url('#{$_url}@2.png'));
2562 background-repeat: no-repeat;
2563 background-position: center;
2564 box-shadow: none;
2565 }
2566 }
2567 &:hover {
2568 // @include entry(focus);
2569 // border-radius: 50%; // needed for double marks scales
2570 }
2571 &:insensitive {
2572 // @include entry(insensitive);
2573 // border-radius: 50%; // overridden
2574 }
2575
2576 // OSD sliders
2577 .osd & {
2578 }
2579 }
2580
2581 &.trough {
2582 margin: 11px;
2583 border-radius: 0;
2584 background-color: $track_color;
2585 &.highlight {
2586 background-color: $accent_color;
2587 &:insensitive { background-color: $track_color; }
2588 }
2589 &:insensitive { color: $insensitive_fg_color; }
2590
2591 // OSD troughs
2592 .osd & {
2593 }
2594 }
2595 // marks color
2596 &.separator { color: $track_color; }
2597
2598 // scales on selected list rows
2599 .list-row:selected & {
2600 }
2601}
2602
2603@each $d,$dn in ('', 'horz'),
2604 ('.vertical', 'vert') {
2605 @each $w,$we in ('scale-has-marks-below','scale_marks_below'),
2606 ('scale-has-marks-above','scale_marks_above') {
2607 .scale#{$d}.#{$w} {
2608 -GtkScale-slider-length: 20;
2609 -GtkRange-slider-width: 25;
2610 -GtkRange-trough-border: 1;
2611
2612 @extend %#{$we}_#{$dn};
2613
2614 @each $s,$as in ('',''),
2615 // (':hover','-hover'),
2616 (':active','-active'),
2617 (':insensitive','-insensitive') {
2618 &.slider#{$s} {
2619 $_url: 'assets/slider-#{$dn}-#{$w}#{$as}#{$asset_suffix}';
2620 border-style: none;
2621 border-radius: 0;
2622 background-color: transparent;
2623 background-image: -gtk-scaled(url('#{$_url}.png'),
2624 url('#{$_url}@2.png'));
2625 background-repeat: no-repeat;
2626 background-position: center;
2627 box-shadow: none;
2628 }
2629 }
2630 }
2631 }
2632}
2633
2634%scale_marks_above_horz {
2635 .trough { margin: 15px 10px 10px; }
2636 // &.fine-tune .trough { margin: 13px 8px 8px; }
2637}
2638%scale_marks_below_horz {
2639 .trough { margin: 10px 10px 15px; }
2640 // &.fine-tune .trough { margin: 8px 8px 13px; }
2641}
2642%scale_marks_above_vert {
2643 .trough { margin: 10px 10px 10px 15px; }
2644 // &.fine-tune .trough { margin: 8px 8px 8px 13px; }
2645}
2646%scale_marks_below_vert {
2647 .trough { margin: 10px 15px 10px 10px; }
2648 // &.fine-tune .trough { margin: 8px 13px 8px 8px; }
2649}
2650
2651
2652/*****************
2653 * Progress bars *
2654 *****************/
2655
2656GtkProgressBar {
2657 -GtkProgressBar-min-horizontal-bar-height: 4;
2658 -GtkProgressBar-min-vertical-bar-width: 4;
2659 padding: 0;
2660 font-size: 90%;
2661 color: $tertiary_fg_color;
2662
2663 &.osd {
2664 -GtkProgressBar-xspacing: 0;
2665 -GtkProgressBar-yspacing: 0;
2666 -GtkProgressBar-min-horizontal-bar-height: 4;
2667 }
2668
2669 &.trough { // background
2670 border-radius: 0;
2671 background-color: gtkopacity($accent_color, 0.2);
2672
2673 &.osd {
2674 border-style: none;
2675 box-shadow: none;
2676 background-color: gtkopacity($accent_color, 0.2);
2677 }
2678 }
2679}
2680
2681// moving bit
2682.progressbar {
2683 border-radius: 0;
2684 background-color: $accent_color;
2685
2686 &.left {
2687 border-top-left-radius: 0;
2688 border-bottom-left-radius: 0;
2689 }
2690 &.right {
2691 border-top-right-radius: 0;
2692 border-bottom-right-radius: 0;
2693 }
2694 &.left.right {
2695 box-shadow: none;
2696 }
2697
2698 &.vertical {
2699 &.top {
2700 border-top-left-radius: 0;
2701 border-top-right-radius: 0;
2702 }
2703 &.bottom {
2704 border-bottom-left-radius: 0;
2705 border-bottom-right-radius: 0;
2706 box-shadow: none;
2707 }
2708 }
2709
2710 &.osd {
2711 background-image: none;
2712 background-color: $accent_color;
2713 border-style: none;
2714 border-radius: 0;
2715 }
2716}
2717
2718%entry_progressbar { // progress inside .entry
2719 border-style: none none solid;
2720 border-width: 2px;
2721 border-image: -gtk-gradient(radial,
2722 center bottom, 0,
2723 center bottom, 0.5,
2724 to($accent_color),
2725 to(transparent))
2726 0 0 2 / 0 0 2px;
2727 border-radius: 0;
2728 box-shadow: none;
2729 background-color: transparent;
2730 background-image: none;
2731}
2732
2733%treeview_progressbar { // progress inside GtkTreeView
2734 border-style: none none solid;
2735 border-width: 4px;
2736 border-radius: 0;
2737 box-shadow: none;
2738 background-color: transparent;
2739 background-image: none;
2740}
2741
2742
2743/*************
2744 * Level Bar *
2745 *************/
2746
2747.level-bar {
2748 box-shadow: $z-depth-1; // needs to be set here to avoid clipping
2749 -GtkLevelBar-min-block-width: 36;
2750 -GtkLevelBar-min-block-height: 4;
2751
2752 &.vertical {
2753 -GtkLevelBar-min-block-width: 4;
2754 -GtkLevelBar-min-block-height: 36;
2755 }
2756
2757 &.trough {
2758 padding: 2px;
2759 border-radius: 2px;
2760 box-shadow: $z-depth-1;
2761 &:insensitive { box-shadow: none; }
2762 &.indicator-discrete {
2763 &.horizontal { padding: 2px 1px; }
2764 &.vertical { padding: 1px 2px; }
2765 }
2766 }
2767
2768 &.fill-block {
2769 // FIXME: it would be nice to set make fill blocks bigger, but we'd need
2770 // :nth-child working on discrete indicators
2771 background-color: $accent_color;
2772 border-radius: 0;
2773 box-shadow: none;
2774 &.indicator-discrete {
2775 &.horizontal { margin: 0 1px; }
2776 &.vertical { margin: 1px 0; }
2777 }
2778 &.level-high { background-color: $success_color; }
2779 &.level-low { background-color: $accent_color; }
2780 &.empty-fill-block { background-color: $track_color; }
2781 }
2782}
2783
2784
2785/**********
2786 * Frames *
2787 **********/
2788
2789.frame {
2790 border: 1px solid $borders_color;
2791 padding: 0;
2792
2793 &.flat { border-style: none; }
2794
2795 &.action-bar {
2796 padding: 0.4em;
2797 border-width: 1px 0 0;
2798 }
2799}
2800
2801GtkScrolledWindow {
2802 GtkViewport.frame { // avoid double borders when viewport inside
2803 // scrolled window
2804 border-style: none;
2805 }
2806}
2807
2808// vbox and hbox separators
2809.separator {
2810 // always disable separators
2811 // -GtkWidget-wide-separators: true;
2812 color: $borders_color;
2813
2814 // Font and File button separators
2815 GtkFileChooserButton &.vertical,
2816 GtkFontButton &.vertical {
2817 // always disable separators
2818 -GtkWidget-wide-separators: true;
2819 }
2820}
2821
2822
2823/*********
2824 * Lists *
2825 *********/
2826
2827.list {
2828 border-color: $borders_color;
2829 background-color: $base_color;
2830}
2831
2832.list-row,
2833.grid-child { padding: 2px; }
2834
2835.list-row.activatable {
2836 // let's take care of background colors
2837 background-image: -gtk-gradient(radial,
2838 center center, 0,
2839 center center, 0.5,
2840 to(gtkalpha(currentColor, 0)),
2841 to(transparent)),
2842 linear-gradient(to bottom, gtkalpha(currentColor, 0));
2843 background-repeat: no-repeat;
2844 background-position: center, center;
2845 background-size: 192px * 1 / 0.8 192px * 1 / 0.8, auto;
2846 &:hover {
2847 background-image: -gtk-gradient(radial,
2848 center center, 0,
2849 center center, 0.5,
2850 to(gtkalpha(currentColor, 0)),
2851 to(transparent)),
2852 linear-gradient(to bottom, gtkalpha(currentColor, 0.05));
2853 }
2854 &:active {
2855 animation: list_ripple_effect 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards;
2856 }
2857 &:insensitive {color: $insensitive_fg_color; }
2858}
2859
2860.list-row:selected {
2861 @extend %selected_items;
2862 .button {
2863 &:insensitive { color: $insensitive_secondary_selected_fg_color; }
2864 &.flat {
2865 color: $secondary_selected_fg_color;
2866 &:hover, &:active { color: $selected_fg_color; }
2867 &:insensitive { color: $insensitive_secondary_selected_fg_color; }
2868 }
2869 }
2870}
2871
2872// button spacing
2873.list-row {
2874 .button.image-button {
2875 padding: 0.4em;
2876 background-size: 2em * 1 / 0.8 2em * 1 / 0.8, auto;
2877 }
2878}
2879
2880// transition
2881.list-row {
2882 &:hover { transition: none; }
2883}
2884
2885
2886/*********************
2887 * App Notifications *
2888 *********************/
2889
2890.app-notification,
2891.app-notification.frame {
2892 @extend %osd;
2893 @extend .toolbar.osd;
2894 .button {
2895 }
2896}
2897
2898
2899/*************
2900 * Expanders *
2901 *************/
2902
2903.expander {
2904 -gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
2905
2906 &:checked { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); }
2907 &:not(:hover):not(:active) { color: gtkalpha(currentColor, 0.75); }
2908 &:selected { color: $selected_fg_color; }
2909
2910 &:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); }
2911}
2912
2913
2914/************
2915 * Calendar *
2916 ***********/
2917
2918GtkCalendar {
2919 margin: 0.6em 0;
2920 padding: 0.4em 0.1em 0.2em;
2921 border: 1px solid $borders_color;
2922 color: $fg_color;
2923 &:selected {
2924 border: none;
2925 border-radius: 100px;
2926 color: $selected_fg_color;
2927 background-color: transparent;
2928 background-image: -gtk-scaled(url("assets/calendar-day-selected.png"),
2929 url("assets/calendar-day-selected@2.png"));
2930 background-size: 2em 2em;
2931 background-position: center top;
2932 background-repeat: no-repeat;
2933 }
2934
2935 &.header {
2936 border: 1px solid transparent;
2937 border-bottom-color: $borders_color;
2938 border-radius: 0;
2939 }
2940
2941 &.button {
2942 @include button(flat-normal);
2943 color: gtkalpha(currentColor, 0.20);
2944 &:hover { @include button(flat-hover); }
2945 &:active { @include button(flat-active); }
2946 &:insensitive { @include button(flat-insensitive); }
2947 }
2948
2949 &:inconsistent { color: gtkalpha(currentColor, 0.20); }
2950 &.highlight {
2951 color: gtkalpha(currentColor, 0.55);
2952 font-size: 90%;
2953 font-weight: 500;
2954 }
2955}
2956
2957
2958/***********
2959 * Dialogs *
2960 ***********/
2961
2962.message-dialog { // Message Dialog styling
2963 color: $inverted_fg_color;
2964
2965 &.background {
2966 background-color: $inverted_dark_color;
2967 opacity: 0.9;
2968 }
2969
2970 .titlebar {
2971 border-style: none;
2972 color: $inverted_fg_color;
2973 background-color: $inverted_dark_color;
2974 }
2975
2976 .entry {
2977 color: $inverted_fg_color;
2978 &:focus { color: $selected_fg_color; }
2979 &:insensitive { color: $insensitive_inverted_fg_color; }
2980 }
2981
2982 .button { // set foregrounds for fallback-mode
2983 color: $secondary_accent_color;
2984 &:hover,
2985 &:active,
2986 &:checked { color: $accent_color; }
2987 &:insensitive { color: $insensitive_inverted_fg_color; }
2988 }
2989 .linked > .button {
2990 border: 2px solid transparent;
2991 border-radius: 2px;
2992 border-image: none;
2993 box-shadow: none;
2994 }
2995
2996 // always use dark variant for check/radio icons
2997 @each $s,$as in ('','-unchecked'),
2998 (':hover', '-unchecked-active'),
2999 (':active', '-unchecked-active'),
3000 (':insensitive','-unchecked-insensitive'),
3001 (':inconsistent', '-mixed'),
3002 (':inconsistent:hover', '-mixed-active'),
3003 (':inconsistent:active', '-mixed-active'),
3004 (':inconsistent:insensitive', '-mixed-insensitive'),
3005 (':checked', '-checked'),
3006 (':checked:hover', '-checked-active'),
3007 (':checked:active', '-checked-active'),
3008 (':checked:insensitive','-checked-insensitive') {
3009 .check#{$s} {
3010 -gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}-dark.png"),
3011 url("assets/checkbox#{$as}-dark@2.png"));
3012 }
3013 .radio#{$s} {
3014 -gtk-icon-source: -gtk-scaled(url("assets/radio#{$as}-dark.png"),
3015 url("assets/radio#{$as}-dark@2.png"));
3016 }
3017 }
3018
3019 GtkCheckButton.text-button,
3020 GtkRadioButton.text-button {
3021 color: $inverted_secondary_fg_color;
3022 &:hover,
3023 &:active,
3024 &:checked { color: $inverted_fg_color; }
3025 &:insensitive,
3026 &:insensitive:active,
3027 &:insensitive:inconsistent {
3028 // set insensitive color, which is overriden otherwise
3029 color: $insensitive_inverted_fg_color;
3030 }
3031 }
3032
3033 &.csd { // rounded bottom border styling for csd version
3034 &.background {
3035 // bigger radius for better antialiasing
3036 border-bottom-left-radius: 2px;
3037 border-bottom-right-radius: 2px;
3038 }
3039
3040 .dialog-action-area {
3041 .button,
3042 .linked > .button {
3043 @extend .button.flat;
3044 padding: 0.7em 1em 0.8em;
3045 border: 2px solid transparent;
3046 border-radius: 0;
3047 color: $secondary_accent_color;
3048 background-size: 192px * 1 / 0.8 192px * 1 / 0.8, auto;
3049 &:hover {
3050 @include button(flat-hover);
3051 color: $accent_color;
3052 }
3053 &:active {
3054 @include button(flat-active);
3055 color: $accent_color;
3056 }
3057 &:checked {
3058 @include button(flat-checked);
3059 color: $secondary_accent_color;
3060 }
3061 &:insensitive { @include button(flat-insensitive); }
3062
3063 &:first-child {
3064 border-bottom-left-radius: 2px;
3065 border-right-width: 0;
3066 }
3067 &:last-child {
3068 border-bottom-right-radius: 2px;
3069 border-left-width: 0;
3070 }
3071 }
3072 }
3073 }
3074}
3075
3076GtkFileChooserDialog {
3077 .search-bar {
3078 // background-color: $base_color;
3079 // border-color: $bg_color;
3080 }
3081
3082 .dialog-action-box { border-top: 1px solid $borders_color; }
3083}
3084
3085
3086/***********
3087 * Sidebar *
3088 ***********/
3089
3090.sidebar {
3091 border: none;
3092 color: $secondary_fg_color;
3093
3094 &, .list { // draw shadows
3095 &:dir(ltr) { box-shadow: if($variant == 'light', $sidebar-light-ltr,
3096 $sidebar-dark-ltr);
3097 }
3098 &:dir(rtl) { box-shadow: if($variant == 'light', $sidebar-light-rtl,
3099 $sidebar-dark-rtl);
3100 }
3101 }
3102
3103 // remove background from child-elements
3104 GtkTreeView.view,
3105 .frame,
3106 .list { background-color: transparent; }
3107
3108 GtkTreeView.view {
3109 box-shadow: none;
3110 &:selected,
3111 .list-row:selected { @extend %selected_items; }
3112 }
3113
3114 // fill actual background
3115 background-color: $secondary_dark_color;
3116 .frame .list { box-shadow: none; }
3117
3118 // disable shadows on overshoot/undershoot area
3119 // of gtk3-demo's sidebar
3120 .overshoot,
3121 .undershoot { box-shadow: none; }
3122}
3123
3124GtkSidebarRow {
3125 &.list-row {
3126 padding: 0; // Needs overriding of the GtkListBoxRow padding
3127 color: $secondary_fg_color;
3128 font-weight: 500;
3129 &:hover { color: $fg_color; }
3130 &:selected {
3131 color: $selected_bg_color;
3132 background-color: transparent;
3133 }
3134 &:backdrop { opacity: 1.0; }
3135 }
3136
3137 // Using margins/padding directly in the SidebarRow
3138 // will make the animation of the new bookmark row jump
3139 .sidebar-revealer { padding: 0.2em 1.1em 0.2em 1em; }
3140
3141 .sidebar-icon {
3142 opacity: 0.75; // dim the device icons
3143 &:dir(ltr) { padding-right: 0.6em; }
3144 &:dir(rtl) { padding-left: 0.6em; }
3145 }
3146
3147 .sidebar-label {
3148 &:dir(ltr) { padding-right: 0.1em; }
3149 &:dir(rtl) { padding-left: 0.1em; }
3150 }
3151}
3152
3153GtkPlacesSidebar.sidebar {
3154 // in the sidebar case it makes no sense to click the selected row
3155 // .list-row:selected:active { box-shadow: none; }
3156
3157 // looks like the label doesn't get all the states so work around
3158 .list-row:selected:insensitive .label { color: $insensitive_selected_fg_color; }
3159
3160 .list-row:selected { // 'eject' button
3161 .sidebar-button.button {
3162 color: $secondary_selected_bg_color;
3163 &:hover,
3164 &:active { color: $selected_bg_color; }
3165 }
3166 }
3167
3168 .sidebar-placeholder-row { border: solid 1px $selected_bg_color; }
3169
3170 .sidebar-new-bookmark-row { color: $selected_bg_color; }
3171
3172 // @at-root needded to not change the specificity making button styling
3173 // inheritance broken so istead of
3174 // "GtkPlacesSidebar.sidebar .sidebar-button.button" [specificity 0,0,3,1]
3175 // the extended selector ".sidebar-button.button" [specificity 0,0,2,0]
3176 @at-root .sidebar-button.button {
3177 &.image-button {
3178 padding: 4px;
3179 color: $secondary_fg_color;
3180 &:hover,
3181 &:active,
3182 &:checked { color: $fg_color; }
3183 }
3184
3185 @extend .button.flat;
3186 // border-radius: 100%;
3187 // outline-radius: 100%;
3188 }
3189
3190 // this is for indicating which sidebar row generated a popover
3191 // see https://bugzilla.gnome.org/show_bug.cgi?id=754411
3192 .has-open-popup {
3193 @extend .list-row.activatable:active;
3194 transition: none;
3195 }
3196}
3197
3198.sidebar-item {
3199 padding: 0.8em 0.6em;
3200 > .label {
3201 padding-left: 0.4em;
3202 padding-right: 0.4em;
3203 }
3204
3205 &.needs-attention > .label { @extend %needs_attention; }
3206}
3207
3208GtkStackSidebar {
3209 .sidebar-item {
3210 padding: 0.8em 0.6em;
3211 > .label {
3212 padding-left: 0.4em;
3213 padding-right: 0.4em;
3214 }
3215 color: $secondary_fg_color;
3216 font-weight: 500;
3217 &:hover { color: $fg_color; }
3218 &:selected {
3219 color: $selected_bg_color;
3220 background-color: transparent;
3221 }
3222 &:backdrop { opacity: 1.0; }
3223 }
3224
3225 .frame .list { // draw shadows
3226 // dim background with alpha-blending
3227 background-color: if($variant == 'light', rgba(12, 18, 0, 0.01),
3228 rgba(18, 22, 0, 0.04));
3229
3230 &:dir(ltr) { box-shadow: if($variant == 'light', $sidebar-light-ltr,
3231 $sidebar-dark-ltr);
3232 }
3233 &:dir(rtl) { box-shadow: if($variant == 'light', $sidebar-light-rtl,
3234 $sidebar-dark-rtl);
3235 }
3236 }
3237
3238 // remove unwanted separator
3239 .separator { -GtkWidget-wide-separators: true; }
3240}
3241
3242
3243/*********
3244 * Paned *
3245 *********/
3246
3247GtkPaned { // this is for the standard paned separator
3248
3249 -GtkPaned-handle-size: 1; // sets separator width
3250
3251 -gtk-icon-source: none; // removes handle decoration
3252 margin: 0 8px 8px 0; // drag area of the separator, not a real margin
3253 &:dir(rtl) {
3254 margin-right: 0;
3255 margin-left: 8px;
3256 }
3257 .pane-separator { background-color: $borders_color; }
3258}
3259
3260GtkPaned.wide { // this is for the paned with wide separator
3261 -GtkPaned-handle-size: 6; // wider separator here
3262 margin: 0; // no need of the invisible drag area so, reset margin
3263
3264 .pane-separator {
3265 background-color: transparent;
3266 border-style: none solid;
3267 border-color: $borders_color;
3268 border-width: 1px;
3269 }
3270
3271 &.vertical .pane-separator { border-style: solid none; }
3272}
3273
3274
3275/**************
3276 * GtkInfoBar *
3277 **************/
3278
3279GtkInfoBar {
3280 padding: 0.4em;
3281 border-width: 0 0 1px;
3282 border-style: solid;
3283 // do not use transparentize
3284 border-color: $solid_light_borders_color;
3285 background-color: $secondary_dark_color;
3286}
3287
3288.info,
3289.question,
3290.warning,
3291.error { // always use dark foreground colour
3292 color: $secondary_fixed_fg_color;
3293
3294 .button {
3295 @extend .button.flat;
3296 color: $secondary_fixed_fg_color;
3297 &:insensitive { color: $insensitive_fixed_fg_color; }
3298 &.flat {
3299 color: $secondary_fixed_fg_color;
3300 &:hover, &:active { color: $fixed_fg_color; }
3301 &:insensitive { color: $insensitive_fixed_fg_color; }
3302 }
3303 }
3304
3305 .label:selected,
3306 .label:selected:focus,
3307 .label:selected:hover {
3308 background-color: darken($selected_bg_color, 10%);
3309 }
3310
3311 // use 'white' bit and trough
3312 GtkProgressBar.trough { background-color: gtkopacity($selected_fg_color, 0.2); }
3313 .progressbar { background-color: $selected_fg_color; }
3314}
3315
3316.info { background-color: $info_bg_color; }
3317
3318.question { background-color: $question_bg_color; }
3319
3320.warning { background-color: $warning_bg_color; }
3321
3322.error { // use white text for this
3323 color: $selected_fg_color;
3324 background-color: $error_bg_color;
3325}
3326
3327
3328/************
3329 * Tooltips *
3330 ************/
3331
3332.tooltip {
3333 &.background {
3334 // background-color needs to be set this way otherwise it gets drawn twice
3335 // see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details.
3336 background-color: gtkopacity($inverted_dark_color, 0.9);
3337 }
3338
3339 color: $inverted_fg_color;
3340 padding: 0.2em; // not working
3341 border-radius: 2px;
3342 box-shadow: none; // otherwise it gets inherited by windowframe.csd
3343
3344 // FIXME: we need a border or tooltips vanish on black background.
3345 &.window-frame.csd {
3346 background-color: transparent;
3347 }
3348}
3349
3350.tooltip * { // Yeah this is ugly
3351 padding: 0.2em;
3352 background-color: transparent;
3353 color: inherit; // just to be sure
3354}
3355
3356
3357/*****************
3358 * Color Chooser *
3359 *****************/
3360
3361GtkColorSwatch {
3362 // This widget is made of two boxes one on top of the other,
3363 // the lower box is GtkColorSwatch {} the other one is
3364 // GtkColorSwatch > .overlay {}, GtkColorSwatch has the programmatically
3365 // set background, so most of the style is applied to the overlay box.
3366
3367 box-shadow: $z-depth-1;
3368
3369 // we need to re-set the shadow here since it get axed by the previous bit
3370 &:selected {
3371 }
3372
3373 // base color corners rounding
3374 // to avoid the artifacts caused by rounded corner anti-aliasing the base
3375 // color sports a bigger radius.
3376 // nth-child is needed by the custom color strip.
3377 // The :not() madness is needed since actually the overlay is selectable
3378 // by GtkColorSwatch > .overlay and GtkColorSwatch.overlay,
3379 // I know it's weird, but this is gtk+, not a browser.
3380 &.top {
3381 border-top-left-radius: 2px;
3382 border-top-right-radius: 2px;
3383 }
3384 &.bottom {
3385 border-bottom-left-radius: 2px;
3386 border-bottom-right-radius: 2px;
3387 }
3388 &.left, &:first-child:not(.overlay):not(.top) {
3389 border-top-left-radius: 2px;
3390 border-bottom-left-radius: 2px;
3391 }
3392 &.right, &:last-child:not(.overlay):not(.bottom) {
3393 border-top-right-radius: 2px;
3394 border-bottom-right-radius: 2px;
3395 }
3396 &:only-child:not(.overlay) { border-radius: 2px; }
3397
3398 // overlay corner rounding
3399 &.top > .overlay {
3400 border-top-left-radius: 2px;
3401 border-top-right-radius: 2px;
3402 }
3403 &.bottom > .overlay {
3404 border-bottom-left-radius: 2px;
3405 border-bottom-right-radius: 2px;
3406 }
3407 &:first-child:not(.top) > .overlay {
3408 border-top-left-radius: 2px;
3409 border-bottom-left-radius: 2px;
3410 }
3411 &:last-child:not(.bottom) > .overlay {
3412 border-top-right-radius: 2px;
3413 border-bottom-right-radius: 2px;
3414 }
3415 &:only-child > .overlay { border-radius: 2px; }
3416
3417 // hover effect
3418 &:hover { box-shadow: $z-depth-2; }
3419
3420 // no hover effect for the colorswatch in the color editor
3421 GtkColorEditor & {
3422 border-radius: 2px; // same radius as the entry
3423 &:hover { box-shadow: $z-depth-1; }
3424 }
3425
3426 // indicator and keynav outline colors
3427 &.color-dark { color: #FFFFFF; }
3428 &.color-light { color: gtkopacity(#000000, 0.8); }
3429
3430 // border color
3431 &.overlay,
3432 &.overlay:selected {
3433 }
3434
3435 // make the add color button looks like, well, a button
3436 &#add-color-button {
3437 background-image: linear-gradient(to right,
3438 $error_bg_color 25%,
3439 $warning_bg_color 25%,
3440 $warning_bg_color 50%,
3441 $info_bg_color 50%,
3442 $info_bg_color 75%,
3443 $question_bg_color 75%);
3444 color: #FFFFFF;
3445 }
3446}
3447
3448
3449/********
3450 * Misc *
3451 ********/
3452
3453// content view (grid/list)
3454.content-view {
3455 background-color: $bg_color;
3456 // &:hover { -gtk-image-effect: highlight; }
3457
3458 &.rubberband { @extend .rubberband; }
3459}
3460
3461.scale-popup {
3462 .osd & { @extend %osd; }
3463
3464 .osd & .button.flat { // FIXME: quick hack, redo properly
3465 }
3466
3467 .osd & .vertical .button,
3468 & .vertical .button { // +/- buttons on GtkVolumeButton popup
3469 border-radius: 100px;
3470 outline-radius: 100px;
3471 background-color: transparent;
3472 color: $secondary_fg_color;
3473 &:first-child { // '+' button
3474 &:hover {
3475 @include button(flat-hover);
3476 background: none;
3477 color: $success_color;
3478 }
3479 &:insensitive {
3480 @include button(flat-insensitive);
3481 background: none;
3482 color: gtkalpha($success_color, 0.4);
3483 }
3484 }
3485 &:last-child { // '-' button
3486 &:hover {
3487 @include button(flat-hover);
3488 background: none;
3489 color: $error_color;
3490 }
3491 &:insensitive {
3492 @include button(flat-insensitive);
3493 background: none;
3494 color: gtkalpha($error_color, 0.4);
3495 }
3496 }
3497 }
3498
3499 .osd & .button,
3500 .button {
3501 border-radius: 100px;
3502 outline-radius: 100px;
3503 background-color: transparent;
3504 color: $secondary_fg_color;
3505 &:first-child { // '-' button
3506 &:hover {
3507 @include button(flat-hover);
3508 background: none;
3509 color: $error_color;
3510 }
3511 &:insensitive {
3512 @include button(flat-insensitive);
3513 background: none;
3514 color: gtkalpha($error_color, 0.4);
3515 }
3516 }
3517 &:last-child { // '+' button
3518 &:hover {
3519 @include button(flat-hover);
3520 background: none;
3521 color: $success_color;
3522 }
3523 &:insensitive {
3524 @include button(flat-insensitive);
3525 background: none;
3526 color: gtkalpha($success_color, 0.4);
3527 }
3528 }
3529 }
3530}
3531
3532GtkScaleButton.button,
3533GtkVolumeButton.button {
3534 // I assume both are image-button *by default*
3535 // with the image-button/text-button classes automagically applied
3536 // depending on the button child these selectors can be deleted.
3537 @extend %image_button;
3538 @extend .button.flat;
3539 border-radius: 100px;
3540 outline-radius: 100px;
3541
3542 &.text-button {
3543 border-radius: 2px;
3544 outline-radius: 2px;
3545 }
3546}
3547
3548.floating-bar {
3549 @extend %osd;
3550 padding: 0.1em 0 0.2em;
3551 border: 1px solid transparent;
3552 border-radius: 0;
3553 color: $inverted_secondary_fg_color;
3554 background-color: $inverted_dark_color;
3555 transition: none;
3556
3557 .button {
3558 padding: 0.3em;
3559 margin: 0 0.3em;
3560 color: $secondary_accent_color;
3561 &:hover,
3562 &:active,
3563 &:checked { color: $accent_color; }
3564 &:insensitive { color: gtkopacity($accent_color, 0.4); }
3565 }
3566}
3567
3568.floating-bar.bottom {
3569 &.left { // axes left border and border radius
3570 border-width: 1px 1px 0 0;
3571 border-radius: 0 2px + 1px 0 0;
3572 }
3573
3574 &.right { // axes right border and border radius
3575 border-width: 1px 0 0 1px;
3576 border-radius: 2px + 1px 0 0 0;
3577 }
3578}
3579
3580
3581/**********************
3582 * Window Decorations *
3583 *********************/
3584
3585.window-frame {
3586 transition: none;
3587 border-radius: 2px 2px 0 0;
3588 box-shadow: $z-depth-4;
3589
3590 // FIXME: rationalize window-frame shadows
3591
3592 // this is used for the resize cursor area
3593 margin: 8px;
3594
3595 &:backdrop { box-shadow: $z-depth-2; }
3596
3597 &.maximized,
3598 &.tiled {
3599 border-radius: 0;
3600 transition: none;
3601
3602 &.ssd .titlebar { box-shadow: none; }
3603 }
3604
3605 &.popup { box-shadow: none; }
3606
3607 // server-side decorations as used by mutter
3608 &.ssd {
3609 // just doing borders, wm draws actual shadows
3610 // otherwise incorrect shadows are appeared
3611 box-shadow: 0 0 0 1px transparent;
3612
3613 .titlebar {
3614 // revive top-edge highlight border
3615 box-shadow: inset 0 1px $highlight_color;
3616 }
3617
3618 .tiled .titlebar {
3619 @extend %tiled_integration;
3620 transition: none;
3621 }
3622 .maximized .titlebar {
3623 @extend %maxd_integration;
3624 transition: none;
3625 }
3626 }
3627
3628 &.csd {
3629 &.popup {
3630 border-radius: 2px;
3631 box-shadow: $z-depth-3;
3632 }
3633 &.tooltip {
3634 border-radius: 2px;
3635 box-shadow: $z-depth-2;
3636 }
3637 &.message-dialog {
3638 border-radius: 2px;
3639 box-shadow: $z-depth-4;
3640 &:backdrop { box-shadow: $z-depth-2; }
3641 }
3642 }
3643
3644 &.solid-csd {
3645 border-radius: 2px 2px 0 0;
3646 margin: -1px;
3647 background-color: $bg_color;
3648 border: none;
3649 box-shadow: none;
3650 }
3651}
3652
3653// Window manager buttons
3654.csd .header-bar,
3655.csd .titlebar {
3656 & .button.titlebutton,
3657 &.selection-mode .button.titlebutton {
3658 @extend %image_button;
3659
3660 &.close,
3661 &.minimize,
3662 &.maximize {
3663 &:hover:backdrop,
3664 &:active:backdrop { opacity: 1.0; }
3665
3666 > GtkImage {
3667 color: transparent;
3668 background-size: 16px 16px;
3669 background-repeat: no-repeat;
3670 background-position: center;
3671 }
3672 }
3673
3674 // raised 'Close' button
3675 &.close {
3676 > GtkImage {
3677 background-image: -gtk-scaled(url("assets/window-close.png"),
3678 url("assets/window-close@2.png"));
3679 }
3680
3681 &:hover {
3682 @include button(hover);
3683 color: $selected_fg_color;
3684 background-color: $destructive_color;
3685
3686 > GtkImage {
3687 background-image: -gtk-scaled(url("assets/window-close-active.png"),
3688 url("assets/window-close-active@2.png"));
3689 }
3690 }
3691 &:active {
3692 @include button(active);
3693 color: $selected_fg_color;
3694 background-color: $selected_bg_color;
3695
3696 > GtkImage {
3697 background-image: -gtk-scaled(url("assets/window-close-active.png"),
3698 url("assets/window-close-active@2.png"));
3699 }
3700 }
3701 }
3702
3703 &.minimize {
3704 > GtkImage {
3705 background-image: -gtk-scaled(url("assets/window-minimize.png"),
3706 url("assets/window-minimize@2.png"));
3707 }
3708
3709 &:hover,
3710 &:active {
3711 > GtkImage {
3712 background-image: -gtk-scaled(url("assets/window-minimize-active.png"),
3713 url("assets/window-minimize-active@2.png"));
3714 }
3715 }
3716 }
3717
3718 &.maximize {
3719 > GtkImage {
3720 background-image: -gtk-scaled(url("assets/window-maximize.png"),
3721 url("assets/window-maximize@2.png"));
3722 }
3723
3724 &:hover,
3725 &:active {
3726 > GtkImage {
3727 background-image: -gtk-scaled(url("assets/window-maximize-active.png"),
3728 url("assets/window-maximize-active@2.png"));
3729 }
3730 }
3731 }
3732 }
3733}
3734
3735.maximized.csd .header-bar,
3736.maximized.csd .titlebar {
3737 .button.titlebutton,
3738 &.selection-mode .button.titlebutton {
3739 &.maximize {
3740 > GtkImage {
3741 background-image: -gtk-scaled(url("assets/window-unmaximize.png"),
3742 url("assets/window-unmaximize@2.png"));
3743 }
3744
3745 &:hover,
3746 &:active {
3747 > GtkImage {
3748 background-image: -gtk-scaled(url("assets/window-unmaximize-active.png"),
3749 url("assets/window-unmaximize-active@2.png"));
3750 }
3751 }
3752 }
3753 }
3754}
3755
3756// specific button styling for SSDs
3757.ssd .titlebar {
3758 .button.titlebutton {
3759 padding: 6px;
3760
3761 &.close,
3762 &.minimize,
3763 &.maximize { // reset styling
3764 color: transparent;
3765 background-size: 28px 28px;
3766 background-repeat: no-repeat;
3767 background-position: center;
3768 background: none;
3769 box-shadow: none;
3770 &:backdrop,
3771 &:hover:backdrop,
3772 &:active:backdrop { color: transparent; }
3773 }
3774
3775 @each $_class,
3776 $_state,
3777 $_shadow in ('', '', none),
3778 (':hover', '-hover', $z-depth-2),
3779 (':active', '-active', $z-depth-2),
3780 (':backdrop', '-backdrop', none),
3781 (':backdrop:hover', '-backdrop-hover', $z-depth-2),
3782 (':backdrop:active', '-backdrop-active', $z-depth-2) {
3783 &.close#{$_class} {
3784 background-image: -gtk-scaled(
3785 url("assets/window-close-ssd#{$_state}.png"),
3786 url("assets/window-close-ssd#{$_state}@2.png"));
3787 box-shadow: #{$_shadow};
3788 }
3789 }
3790
3791 @each $_class, $_state in ('', ''),
3792 (':hover', '-hover'),
3793 (':active', '-active'),
3794 (':backdrop', '-backdrop'),
3795 (':backdrop:hover', '-backdrop-hover'),
3796 (':backdrop:active', '-backdrop-active') {
3797 &.minimize#{$_class} {
3798 background-image: -gtk-scaled(
3799 url("assets/window-minimize-ssd#{$_state}.png"),
3800 url("assets/window-minimize-ssd#{$_state}@2.png"));
3801 }
3802 }
3803
3804 @each $_class, $_state in ('', ''),
3805 (':hover', '-hover'),
3806 (':active', '-active'),
3807 (':backdrop', '-backdrop'),
3808 (':backdrop:hover', '-backdrop-hover'),
3809 (':backdrop:active', '-backdrop-active') {
3810 &.maximize#{$_class} {
3811 background-image: -gtk-scaled(
3812 url("assets/window-maximize-ssd#{$_state}.png"),
3813 url("assets/window-maximize-ssd#{$_state}@2.png"));
3814 }
3815 }
3816 }
3817}
3818
3819.maximized.ssd .titlebar {
3820 .button.titlebutton {
3821 @each $_class, $_state in ('', ''),
3822 (':hover', '-hover'),
3823 (':active', '-active'),
3824 (':backdrop', '-backdrop'),
3825 (':backdrop:hover', '-backdrop-hover'),
3826 (':backdrop:active', '-backdrop-active') {
3827 &.maximize#{$_class} {
3828 background-image: -gtk-scaled(
3829 url("assets/window-unmaximize-ssd#{$_state}.png"),
3830 url("assets/window-unmaximize-ssd#{$_state}@2.png"));
3831 }
3832 }
3833 }
3834}
3835
3836// catch all extend :)
3837
3838%selected_items {
3839 background-color: $selected_bg_color;
3840 color: $selected_fg_color;
3841 &:insensitive { color: $insensitive_selected_fg_color; }
3842 &:backdrop {
3843 &:insensitive { color: $insensitive_selected_fg_color; }
3844 }
3845}
3846
3847.monospace {
3848 font-family: Monospace;
3849}
3850
3851
3852/**********************
3853 * Touch Copy & Paste *
3854 *********************/
3855
3856// touch selection handlebars for the Popover.osd above
3857.entry.cursor-handle,
3858.cursor-handle {
3859 border-style: none;
3860 background-color: $accent_color;
3861 background-image: none;
3862 box-shadow: none;
3863
3864 @each $s,$as in ('',''),
3865 (':hover','-hover'),
3866 (':active','-active') {
3867 // no need for insensitive and backdrop
3868 &.top#{$s}:dir(ltr),
3869 &.bottom#{$s}:dir(rtl) {
3870 $_url: 'assets/text-select-start#{$as}#{$asset_suffix}';
3871 -gtk-icon-source: -gtk-scaled(url('#{$_url}.png'),
3872 url('#{$_url}@2.png'));
3873 padding-left: 0.8em;
3874 }
3875 &.bottom#{$s}:dir(ltr),
3876 &.top#{$s}:dir(rtl) {
3877 $_url: 'assets/text-select-end#{$as}#{$asset_suffix}';
3878 -gtk-icon-source: -gtk-scaled(url('#{$_url}.png'),
3879 url('#{$_url}@2.png'));
3880 padding-right: 0.8em;
3881 }
3882 &.insertion-cursor#{$s}:dir(ltr),
3883 &.insertion-cursor#{$s}:dir(rtl) {
3884 $_url: 'assets/slider-horz-scale-has-marks-above#{$as}#{$asset_suffix}';
3885 -gtk-icon-source: -gtk-scaled(url('#{$_url}.png'),
3886 url('#{$_url}@2.png'));
3887 }
3888 }
3889}
3890
3891// Decouple the font of context menus from their entry/textview
3892.context-menu { font: initial; }
3893
3894.touch-selection {
3895 font: initial;
3896 color: $fg_color;
3897 background-color: $base_color;
3898 box-shadow: $z-depth-2;
3899 &:backdrop { box-shadow: $z-depth-1; }
3900
3901 .button {
3902 }
3903}
3904
3905// This is used by GtkScrolledWindow, when content is touch-dragged past
3906// boundaries. This draws a box on top of the content, the size changes
3907// programmatically.
3908.overshoot {
3909 &.top { @include overshoot(top); }
3910 &.bottom { @include overshoot(bottom); }
3911 &.left { @include overshoot(left); }
3912 &.right { @include overshoot(right); }
3913}
3914
3915// Overflow indication, works similarly to the overshoot,
3916// the size if fixed tho.
3917.undershoot {
3918 &.top { @include undershoot(top, $base_color); }
3919 &.bottom { @include undershoot(bottom, $base_color); }
3920 &.left { @include undershoot(left, $base_color); }
3921 &.right { @include undershoot(right, $base_color); }
3922
3923 GtkBox > GtkScrlledWindow & {
3924 &.top { @include undershoot(top, $bg_color); }
3925 &.bottom { @include undershoot(bottom, $bg_color); }
3926 &.left { @include undershoot(left, $bg_color); }
3927 &.right { @include undershoot(right, $bg_color); }
3928 }
3929
3930 .sidebar & {
3931 &.top { @include undershoot(top, $secondary_dark_color); }
3932 &.bottom { @include undershoot(bottom, $secondary_dark_color); }
3933 &.left { @include undershoot(left, $secondary_dark_color); }
3934 &.right { @include undershoot(right, $secondary_dark_color); }
3935 }
3936}
3937