A fork of the Materia GTK theme.

By using this site, you agree to have cookies stored on your device, strictly for functional purposes, such as storing your session and preferences.

Dismiss

 _common.scss

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