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.76 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
&, &:hover { background-image: none; }
684
685
&:active { animation: none; }
686
}
687
688
check:not(:indeterminate):checked:active { animation: check_check $material_slower $material_ease; }
689
690
check:indeterminate:checked:active, radio:indeterminate:checked:active { animation: check_indeterminate $material_slower $material_ease; }
691
692
// FIXME: remove the following when the checks/radios rewrite lands
693
check:last-child,
694
radio:last-child { margin-left: 8px; }
695
696
check:first-child,
697
radio:first-child { margin-right: 8px; }
698
}
699
700
modelbutton.flat arrow {
701
background: none;
702
703
&:hover { background: none; }
704
705
&.left { -gtk-icon-source: -gtk-icontheme("pan-start-symbolic"); }
706
707
&.right { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); }
708
}
709
710
button.color {
711
min-height: $small_size;
712
min-width: $small_size;
713
padding: $container_padding;
714
715
colorswatch:only-child {
716
// &, overlay { border-radius: 0; }
717
}
718
}
719
720
721
/*********
722
* Links *
723
*********/
724
*:link {
725
&, &:hover, &:active { color: $link_color; }
726
727
&:visited {
728
&, &:hover, &:active { color: $link_visited_color; }
729
}
730
731
@at-root %link_selected,
732
&:selected,
733
*:selected & { color: $selected_fg_color; }
734
}
735
736
button:link,
737
button:visited {
738
@extend *:link;
739
740
> label { text-decoration-line: underline; }
741
}
742
743
/*****************
744
* GtkSpinButton *
745
*****************/
746
spinbutton {
747
&:not(.vertical) {
748
// in this horizontal configuration, the whole spinbutton
749
// behaves as the entry, so we extend the entry styling
750
// and nuke the style on the internal entry
751
@extend %entry;
752
753
padding: 0;
754
755
%spinbutton_entry,
756
entry {
757
min-width: $large_size - 16px;
758
// reset all the other props since the spinbutton node is styled here
759
margin: 0;
760
border-image: none;
761
border-radius: 0;
762
box-shadow: none;
763
background-color: transparent;
764
}
765
766
button {
767
min-height: $small_size;
768
min-width: $small_size;
769
// margin: $container_padding;
770
padding: 0;
771
border: solid $container_padding transparent;
772
773
@extend %button_basic.flat;
774
775
@extend %button_basic.image-button;
776
777
&.up { margin-left: -$container_padding / 2; }
778
779
&.down { margin-right: -$container_padding / 2; }
780
}
781
}
782
783
// OSD horizontal
784
.osd &:not(.vertical) {
785
button {
786
}
787
}
788
789
// Vertical
790
&.vertical {
791
// in the vertical configuration, we treat the spinbutton
792
// as a box, and tweak the style of the entry in the middle
793
// so that it's linked
794
795
// FIXME: this should not be set at all, but otherwise it gets the wrong
796
// color
797
&:disabled { color: $insensitive_fg_color; }
798
799
&:drop(active) {
800
box-shadow: none;
801
}
802
803
entry {
804
min-height: $medium_size;
805
min-width: $large_size;
806
padding: 0;
807
}
808
809
button {
810
min-height: $medium_size;
811
min-width: $large_size;
812
padding: 0;
813
814
@extend %button_basic.flat;
815
816
&.up { border-radius: 2px 2px 0 0; }
817
818
&.down { border-radius: 0 0 2px 2px; }
819
}
820
}
821
822
// OSD vertical
823
.osd &.vertical button:first-child {
824
}
825
826
// Misc
827
treeview &:not(.vertical) {
828
min-height: 0;
829
border-style: none;
830
border-radius: 0;
831
832
entry {
833
min-height: 0;
834
padding: 1px 2px;
835
}
836
}
837
}
838
839
840
/**************
841
* ComboBoxes *
842
**************/
843
combobox {
844
arrow {
845
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
846
min-height: 16px;
847
min-width: 16px;
848
}
849
850
menu,
851
.menu {
852
padding: 2px 0;
853
854
menuitem {
855
min-height: $medium_size;
856
padding: 0 10px;
857
}
858
}
859
860
&.linked {
861
button:nth-child(2) {
862
&:dir(ltr) { @extend %linked:last-child; }
863
&:dir(rtl) { @extend %linked:first-child; }
864
}
865
}
866
867
&:drop(active) { // FIXME: untested
868
box-shadow: none;
869
870
// button.combo { @extend %button_basic:drop(active); }
871
}
872
}
873
874
.linked > combobox > box > button.combo {
875
// the combo is a composite widget so the way we do button linking doesn't
876
// work, special case needed. See
877
// https://bugzilla.gnome.org/show_bug.cgi?id=733979
878
879
&:dir(ltr),
880
&:dir(rtl) { @extend %linked_middle; } // specificity bump
881
}
882
883
.linked:not(.vertical) > combobox:first-child > box > button.combo { @extend %linked:first-child; }
884
.linked:not(.vertical) > combobox:last-child > box > button.combo { @extend %linked:last-child; }
885
.linked:not(.vertical) > combobox:only-child > box > button.combo { @extend %linked:only-child; }
886
887
.linked.vertical > combobox > box > button.combo { @extend %linked_vertical_middle; }
888
.linked.vertical > combobox:first-child > box > button.combo { @extend %linked_vertical:first-child;}
889
.linked.vertical > combobox:last-child > box > button.combo { @extend %linked_vertical:last-child; }
890
.linked.vertical > combobox:only-child > box > button.combo { @extend %linked_vertical:only-child; }
891
892
893
/************
894
* Toolbars *
895
************/
896
toolbar {
897
-GtkWidget-window-dragging: true;
898
padding: $container_padding / 2;
899
background-color: $bg_color;
900
901
// on OSD
902
.osd & { background-color: transparent; }
903
904
// stand-alone OSD toolbars
905
&.osd {
906
transition: $shadow_transition;
907
padding: $container_padding;
908
border-radius: 2px;
909
box-shadow: $z-depth-2;
910
background-color: $base_color;
911
912
&:backdrop { box-shadow: $z-depth-1; }
913
914
&.left,
915
&.right,
916
&.top,
917
&.bottom { border-radius: 0; } // positional classes for `attached` osd toolbars
918
919
button { @extend %button_basic.flat; }
920
}
921
922
// toolbar separators
923
&.horizontal separator { margin: $container_padding / 2; }
924
&.vertical separator { margin: $container_padding / 2; }
925
926
&:not(.inline-toolbar):not(.osd) {
927
scale,
928
entry,
929
spinbutton,
930
button { margin: $container_padding / 2; }
931
932
switch { margin: ($container_padding / 2 + $container_padding) ($container_padding / 2); }
933
}
934
}
935
936
//searchbar, location-bar & inline-toolbar
937
.inline-toolbar {
938
padding: $container_padding;
939
border-style: solid;
940
border-width: 0 1px 1px;
941
border-color: $borders_color;
942
background-color: $secondary_base_color;
943
}
944
945
searchbar,
946
.location-bar {
947
padding: $container_padding;
948
border-style: solid;
949
border-width: 0 0 1px;
950
border-color: $borders_color;
951
background-color: $bg_color;
952
background-clip: border-box;
953
}
954
955
956
/***************
957
* Header bars *
958
***************/
959
%titlebar,
960
headerbar {
961
min-height: $large_size;
962
padding: 0 $container_padding;
963
box-shadow: inset 0 1px $secondary_highlight_color, $z-depth-1;
964
background-color: $headerbar_color;
965
color: $selected_fg_color;
966
967
&:backdrop {
968
color: $secondary_selected_fg_color;
969
}
970
971
.title {
972
padding-left: 12px;
973
padding-right: 12px;
974
font-weight: bold;
975
}
976
977
.subtitle {
978
padding-left: 12px;
979
padding-right: 12px;
980
font-size: smaller;
981
982
@extend .dim-label;
983
}
984
985
button:not(.suggested-action):not(.destructive-action) {
986
@extend %button_basic.flat;
987
988
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
989
currentColor 0%,
990
transparent 0%)
991
0 0 0 / 0 0 0px;
992
color: gtkalpha(currentColor, $enabled_opacity);
993
994
&:hover, &:active { color: currentColor; }
995
996
&:disabled {
997
color: gtkalpha(currentColor, $enabled_opacity * $disabled_opacity);
998
999
> label { color: inherit; }
1000
}
1001
1002
&:checked {
1003
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
1004
currentColor 100%,
1005
transparent 0%)
1006
0 0 2 / 0 0 2px;
1007
background-color: transparent;
1008
color: currentColor;
1009
1010
&:disabled {
1011
background-color: transparent;
1012
color: gtkalpha(currentColor, $disabled_opacity);
1013
1014
> label { color: inherit; }
1015
}
1016
}
1017
}
1018
1019
button.suggested-action, button.destructive-action {
1020
&:disabled {
1021
color: gtkalpha(currentColor, $disabled_opacity);
1022
1023
> label { color: inherit; }
1024
}
1025
}
1026
1027
&.selection-mode {
1028
animation: header_ripple_effect $material_slower $material_ease_out forwards;
1029
// box-shadow: inset 0 1px $secondary_highlight_color;
1030
// background-color: $selected_bg_color;
1031
color: $selected_fg_color;
1032
1033
&:backdrop {
1034
color: $secondary_selected_fg_color;
1035
}
1036
1037
.subtitle:link { @extend *:link:selected; }
1038
1039
button:not(.suggested-action):not(.destructive-action) {
1040
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
1041
currentColor 0%,
1042
transparent 0%)
1043
0 0 0 / 0 0 0px;
1044
// color: gtkalpha(currentColor, $enabled_opacity);
1045
1046
&, &:hover, &:active { color: currentColor; }
1047
1048
&:disabled {
1049
color: gtkalpha(currentColor, $disabled_opacity);
1050
1051
> label { color: inherit; }
1052
}
1053
1054
&:checked {
1055
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
1056
currentColor 100%,
1057
transparent 0%)
1058
0 0 2 / 0 0 2px;
1059
color: currentColor;
1060
1061
&:disabled {
1062
color: gtkalpha(currentColor, $disabled_opacity);
1063
1064
> label { color: inherit; }
1065
}
1066
}
1067
}
1068
1069
.selection-menu {
1070
padding-left: 16px;
1071
padding-right: 16px;
1072
1073
GtkArrow { -GtkArrow-arrow-scaling: 1; }
1074
1075
.arrow { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); }
1076
}
1077
}
1078
1079
.tiled &,
1080
.maximized & {
1081
border-radius: 0; // squared corners when the window is max'd or tiled
1082
box-shadow: none;
1083
}
1084
1085
&.default-decoration {
1086
min-height: $small_size;
1087
padding: $container_padding;
1088
border-width: 0;
1089
1090
button.titlebutton {
1091
min-height: $small_size;
1092
min-width: $small_size;
1093
margin: 0;
1094
padding: 0;
1095
1096
&:active { // add fallback
1097
background-image: radial-gradient(circle farthest-corner at center,
1098
gtkalpha(currentColor, $lower_opacity / 2) 100%,
1099
transparent 0%),
1100
image(gtkalpha(currentColor, $lower_opacity / 2));
1101
}
1102
}
1103
}
1104
}
1105
1106
headerbar {
1107
// add vertical margins to headerbar entries, buttons and separators to avoid them spanning the whole height
1108
entry,
1109
spinbutton,
1110
// separator,
1111
button {
1112
margin-top: $container_padding;
1113
margin-bottom: $container_padding;
1114
}
1115
}
1116
1117
.titlebar {
1118
border-top-left-radius: 2px;
1119
border-top-right-radius: 2px;
1120
}
1121
1122
headerbar {
1123
separator:first-child + &, // tackles the paned container case
1124
&:first-child {
1125
border-top-left-radius: 2px;
1126
1127
.tiled &,
1128
.maximized & { border-radius: 0; }
1129
}
1130
1131
&:last-child {
1132
border-top-right-radius: 2px;
1133
1134
.tiled &,
1135
.maximized & { border-radius: 0; }
1136
}
1137
}
1138
1139
.titlebar:not(headerbar) {
1140
window.csd > & {
1141
// in csd we assume every titlebar is a headerbar so reset anything, this is needed for split toolbars cases
1142
padding: 0;
1143
background-color: transparent;
1144
background-image: none;
1145
border-style: none;
1146
box-shadow: none;
1147
}
1148
1149
> separator {
1150
background-color: $headerbar_color;
1151
background-image: image($borders_color);
1152
}
1153
1154
@extend %titlebar;
1155
}
1156
1157
1158
/************
1159
* Pathbars *
1160
************/
1161
.path-bar button {
1162
&.text-button, &.image-button, & {
1163
padding-left: 6px;
1164
padding-right: 6px;
1165
}
1166
1167
&.text-button.image-button, & {
1168
// label:last-child { padding-left: 2px; padding-right: 8px; }
1169
// label:first-child { padding-left: 8px; padding-right: 2px; }
1170
}
1171
1172
image {
1173
padding-left: 4px;
1174
padding-right: 4px;
1175
}
1176
1177
&.slider-button {
1178
padding-left: 0;
1179
padding-right: 0;
1180
}
1181
}
1182
1183
1184
/**************
1185
* Tree Views *
1186
**************/
1187
treeview.view {
1188
-GtkTreeView-grid-line-width: 1;
1189
-GtkTreeView-grid-line-pattern: '';
1190
-GtkTreeView-tree-line-width: 1;
1191
-GtkTreeView-tree-line-pattern: '';
1192
-GtkTreeView-expander-size: 16;
1193
1194
border-left-color: $track_color; // this is actually the tree lines color,
1195
border-top-color: $borders_color; // while this is the grid lines color, better then nothing
1196
1197
rubberband { @extend rubberband; } // to avoid borders being overridden by the previously set props
1198
1199
&:hover, &:active, &:selected { border-radius: 0; }
1200
1201
&.separator {
1202
min-height: 1px + 2px * 2;
1203
color: $borders_color;
1204
}
1205
1206
&:drop(active) {
1207
border-style: solid none;
1208
border-width: 1px;
1209
border-color: $accent_bg_color;
1210
1211
&.after { border-top-style: none; }
1212
1213
&.before { border-bottom-style: none; }
1214
}
1215
1216
&.expander {
1217
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
1218
-gtk-icon-transform: rotate(-90deg);
1219
1220
&:dir(rtl) { -gtk-icon-transform: rotate(90deg); }
1221
1222
&:checked { -gtk-icon-transform: unset; }
1223
1224
color: $secondary_fg_color;
1225
1226
&:hover, &:active { color: $fg_color; }
1227
1228
&:disabled { color: $insensitive_secondary_fg_color; }
1229
1230
&:selected {
1231
color: $secondary_selected_fg_color;
1232
1233
&:hover, &:active { color: $selected_fg_color; }
1234
1235
&:disabled { color: $insensitive_secondary_selected_fg_color; }
1236
}
1237
}
1238
1239
&.progressbar { // progress bar in treeviews
1240
border-style: none none solid;
1241
border-width: $bar_size;
1242
border-color: $selected_bg_color;
1243
background-color: transparent;
1244
background-image: none;
1245
1246
&:selected { border-color: currentColor; }
1247
}
1248
1249
&.trough { // progress bar trough in treeviews
1250
border-style: none none solid;
1251
border-width: $bar_size;
1252
border-color: scale-alpha($selected_bg_color, $lower_opacity);
1253
background-color: transparent;
1254
background-image: none;
1255
1256
&:selected { border-color: $track_color; }
1257
}
1258
1259
header {
1260
button {
1261
@extend row.activatable;
1262
1263
padding: 2px 6px;
1264
border-style: none solid solid none;
1265
border-width: 1px;
1266
border-color: $borders_color;
1267
border-radius: 0;
1268
background-clip: border-box;
1269
1270
&, &:hover, &:active { box-shadow: none; }
1271
1272
&, &:disabled { background-color: $base_color; }
1273
1274
&:last-child { border-right-style: none; }
1275
}
1276
}
1277
1278
button.dnd,
1279
header.button.dnd { // for treeview-like derive widgets
1280
padding: 2px 6px;
1281
border-style: none solid solid;
1282
border-width: 1px;
1283
border-color: $borders_color;
1284
border-radius: 0;
1285
box-shadow: none;
1286
background-color: $base_color;
1287
background-clip: border-box;
1288
color: $selected_bg_color;
1289
}
1290
}
1291
1292
1293
/*********
1294
* Menus *
1295
*********/
1296
menubar,
1297
.menubar {
1298
-GtkWidget-window-dragging: true;
1299
padding: 0;
1300
// box-shadow: inset 0 -1px $borders_color;
1301
background-color: $headerbar_color;
1302
1303
> menuitem {
1304
transition: background-color $material_faster $material_ease_out;
1305
min-height: 20px;
1306
padding: 4px 8px;
1307
color: $secondary_selected_fg_color;
1308
1309
&:hover { //Seems like it :hover even with keyboard focus
1310
transition: none;
1311
background-color: gtkalpha(currentColor, $lower_opacity / 2);
1312
color: $selected_fg_color;
1313
}
1314
1315
&:disabled { color: $insensitive_secondary_selected_fg_color; }
1316
}
1317
}
1318
1319
menu,
1320
.menu {
1321
margin: 4px 0;
1322
padding: 4px 0;
1323
background-color: $base_color;
1324
border: 1px solid $borders_color; // adds borders in a non composited env
1325
1326
.csd & {
1327
border: none; // axes borders in a composited env
1328
border-radius: 2px;
1329
}
1330
1331
menuitem {
1332
transition: background-color $material_faster $material_ease_out;
1333
min-height: 20px;
1334
min-width: 40px;
1335
padding: 4px 8px;
1336
font: initial;
1337
text-shadow: none;
1338
1339
&:hover {
1340
transition: none;
1341
background-color: gtkalpha(currentColor, $lower_opacity / 2);
1342
}
1343
1344
&:disabled { color: $insensitive_fg_color; }
1345
1346
// submenu indicators
1347
arrow {
1348
min-height: 16px;
1349
min-width: 16px;
1350
1351
&:dir(ltr) {
1352
-gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
1353
margin-left: 8px;
1354
}
1355
1356
&:dir(rtl) {
1357
-gtk-icon-source:-gtk-icontheme('pan-end-symbolic-rtl');
1358
margin-right: 8px;
1359
}
1360
}
1361
}
1362
1363
// overflow arrows
1364
> arrow {
1365
min-height: 16px;
1366
min-width: 16px;
1367
padding: 4px;
1368
border-radius: 0;
1369
background-color: $base_color;
1370
color: $secondary_fg_color;
1371
1372
&.top {
1373
margin-top: -4px;
1374
border-bottom: 1px solid $borders_color;
1375
-gtk-icon-source: -gtk-icontheme('pan-up-symbolic');
1376
}
1377
1378
&.bottom {
1379
margin-bottom: -4px;
1380
border-top: 1px solid $borders_color;
1381
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
1382
}
1383
1384
&:hover {
1385
background-image: image(gtkalpha(currentColor, $lower_opacity / 2));
1386
color: $fg_color;
1387
}
1388
1389
&:disabled {
1390
border-color: transparent;
1391
background-color: transparent;
1392
color: transparent;
1393
// color: $insensitive_secondary_fg_color;
1394
}
1395
}
1396
1397
separator { margin: 4px 0; }
1398
}
1399
1400
menuitem {
1401
accelerator { color: gtkalpha(currentColor, $hint_opacity); }
1402
1403
check,
1404
radio {
1405
&:dir(ltr) { margin-right: -8px; margin-left: -16px; }
1406
&:dir(rtl) { margin-right: -16px; margin-left: -8px; }
1407
}
1408
}
1409
1410
.csd.popup { border-radius: 2px; }
1411
1412
1413
/***************
1414
* Popovers *
1415
***************/
1416
popover.background {
1417
transition: $shadow_transition;
1418
padding: 0;
1419
box-shadow: $z-depth-2;
1420
background-color: $light_color;
1421
1422
&:backdrop { box-shadow: $z-depth-1; }
1423
1424
&, .csd & {
1425
border-style: solid;
1426
border-width: 1px;
1427
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.2) rgba(0, 0, 0, 0.3);
1428
border-radius: 2px + 1px;
1429
}
1430
1431
> list,
1432
> .view,
1433
> toolbar {
1434
border-style: none;
1435
box-shadow: none;
1436
background-color: transparent;
1437
}
1438
1439
&, .csd & {
1440
&.touch-selection,
1441
&.magnifier,
1442
&.osd { @extend %osd; }
1443
}
1444
1445
separator { margin: 4px 0; }
1446
1447
list separator { margin: 0; }
1448
1449
checkbutton,
1450
radiobutton { @extend modelbutton.flat; }
1451
}
1452
1453
/*************
1454
* Notebooks *
1455
*************/
1456
notebook {
1457
> header {
1458
border-width: 1px;
1459
border-color: $borders_color;
1460
background-color: $bg_color;
1461
background-clip: border-box;
1462
1463
&.top {
1464
border-bottom-style: solid;
1465
> tabs {
1466
> tab:not(.reorderable-page) {
1467
margin-bottom: -1px;
1468
1469
&:hover { box-shadow: inset 0 -2px $track_color; }
1470
1471
&:checked { box-shadow: inset 0 -2px $selected_bg_color; }
1472
}
1473
}
1474
}
1475
1476
&.bottom {
1477
border-top-style: solid;
1478
> tabs {
1479
> tab:not(.reorderable-page) {
1480
margin-top: -1px;
1481
1482
&:hover { box-shadow: inset 0 2px $track_color; }
1483
1484
&:checked { box-shadow: inset 0 2px $selected_bg_color; }
1485
}
1486
}
1487
}
1488
1489
&.left {
1490
border-right-style: solid;
1491
> tabs {
1492
> tab:not(.reorderable-page) {
1493
margin-right: -1px;
1494
1495
&:hover { box-shadow: inset -2px 0 $track_color; }
1496
1497
&:checked { box-shadow: inset -2px 0 $selected_bg_color; }
1498
}
1499
}
1500
}
1501
1502
&.right {
1503
border-left-style: solid;
1504
> tabs {
1505
> tab:not(.reorderable-page) {
1506
margin-left: -1px;
1507
1508
&:hover { box-shadow: inset 2px 0 $track_color; }
1509
1510
&:checked { box-shadow: inset 2px 0 $selected_bg_color; }
1511
}
1512
}
1513
}
1514
1515
&.top > tabs > arrow {
1516
@extend %notebook_vert_arrows;
1517
1518
border-top-style: none;
1519
}
1520
1521
&.bottom > tabs > arrow {
1522
@extend %notebook_vert_arrows;
1523
1524
border-bottom-style: none;
1525
}
1526
1527
@at-root %notebook_vert_arrows {
1528
padding-left: 4px;
1529
padding-right: 4px;
1530
1531
&.down {
1532
margin-left: -8px;
1533
-gtk-icon-source: -gtk-icontheme('pan-start-symbolic');
1534
}
1535
1536
&.up {
1537
margin-right: -8px;
1538
-gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
1539
}
1540
}
1541
1542
&.left > tabs > arrow {
1543
@extend %notebook_horz_arrows;
1544
1545
border-left-style: none;
1546
}
1547
1548
&.right > tabs > arrow {
1549
@extend %notebook_horz_arrows;
1550
1551
border-right-style: none;
1552
}
1553
1554
@at-root %notebook_horz_arrows {
1555
padding-top: 4px;
1556
padding-bottom: 4px;
1557
1558
&.down {
1559
margin-top: -8px;
1560
-gtk-icon-source: -gtk-icontheme('pan-up-symbolic');
1561
}
1562
1563
&.up {
1564
margin-bottom: -8px;
1565
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
1566
}
1567
}
1568
1569
> tabs > arrow {
1570
@extend %button_basic.flat;
1571
1572
min-height: 16px;
1573
min-width: 16px;
1574
border-radius: 0;
1575
}
1576
1577
tab {
1578
transition: $material_transition;
1579
min-height: 24px;
1580
min-width: 24px;
1581
padding: 6px 12px;
1582
1583
outline-offset: -6px;
1584
1585
border-width: 1px; // for reorderable tabs
1586
border-color: transparent; //
1587
1588
color: $secondary_fg_color;
1589
font-weight: 500;
1590
1591
&:hover {
1592
color: $fg_color;
1593
1594
&.reorderable-page {
1595
border-color: $borders_color;
1596
background-color: $secondary_base_color;
1597
}
1598
}
1599
1600
&:disabled { color: $insensitive_secondary_fg_color; }
1601
1602
&:checked {
1603
color: $fg_color;
1604
1605
&:disabled { color: $insensitive_fg_color; }
1606
1607
&:not(.reorderable-page) { animation: tab_ripple_effect $material_slower * 3 $material_ease_out; }
1608
1609
&.reorderable-page {
1610
border-color: $borders_color;
1611
background-color: $base_color;
1612
}
1613
}
1614
1615
// colors the button like the label, overridden otherwise
1616
button.flat {
1617
// FIXME: generalize .small-button?
1618
min-width: $small_size;
1619
min-height: $small_size;
1620
padding: 0;
1621
1622
@extend %button_basic.image-button;
1623
1624
&:last-child {
1625
margin-left: 6px;
1626
margin-right: -6px;
1627
}
1628
1629
&:first-child {
1630
margin-left: -6px;
1631
margin-right: 6px;
1632
}
1633
}
1634
}
1635
1636
&.top,
1637
&.bottom {
1638
tabs {
1639
padding-left: 8px;
1640
padding-right: 8px;
1641
1642
&:not(:only-child) {
1643
&:first-child { margin-left: 0; }
1644
&:last-child { margin-right: 0; }
1645
}
1646
1647
tab {
1648
&.reorderable-page {
1649
margin: 0 -1px;
1650
border-style: none solid;
1651
}
1652
}
1653
}
1654
}
1655
1656
&.left,
1657
&.right {
1658
tabs {
1659
padding-top: 8px;
1660
padding-bottom: 8px;
1661
1662
&:not(:only-child) {
1663
&:first-child { margin-top: 0; }
1664
&:last-child { margin-bottom: 0; }
1665
}
1666
1667
tab {
1668
&.reorderable-page {
1669
margin: -1px 0;
1670
border-style: solid none;
1671
}
1672
}
1673
}
1674
}
1675
}
1676
1677
> stack:not(:only-child) { // the :not(:only-child) is for "hidden" notebooks
1678
background-color: $base_color;
1679
1680
entry,
1681
spinbutton:not(.vertical) { @extend %entry.flat; }
1682
1683
revealer entry,
1684
revealer spinbutton:not(.vertical) { @extend %entry; }
1685
1686
spinbutton:not(.vertical) entry { @extend %spinbutton_entry; }
1687
}
1688
}
1689
1690
1691
/**************
1692
* Scrollbars *
1693
**************/
1694
scrollbar {
1695
$_slider_min_length: 24px;
1696
1697
// disable steppers
1698
@at-root * {
1699
-GtkScrollbar-has-backward-stepper: false;
1700
-GtkScrollbar-has-forward-stepper: false;
1701
}
1702
1703
transition: $material_transition;
1704
background-color: $base_color;
1705
background-clip: $extra_background_clip;
1706
1707
// scrollbar border
1708
&.top { border-bottom: 1px solid $borders_color; }
1709
&.bottom { border-top: 1px solid $borders_color; }
1710
&.left { border-right: 1px solid $borders_color; }
1711
&.right { border-left: 1px solid $borders_color; }
1712
1713
// slider
1714
slider {
1715
transition: all $material_faster $material_ease_out, margin 0, border-width 0;
1716
min-width: 8px;
1717
min-height: 8px;
1718
border: 4px solid transparent;
1719
border-radius: 100px;
1720
background-clip: padding-box;
1721
background-color: $tertiary_fg_color;
1722
1723
&:hover { background-color: $secondary_fg_color; }
1724
1725
&:active { background-color: $fg_color; }
1726
1727
&:disabled { background-color: $insensitive_tertiary_fg_color; }
1728
}
1729
1730
&.fine-tune {
1731
slider {
1732
transition: all $material_faster $material_ease_out, margin 0, border-width 0, min-width 0, min-height 0;
1733
min-width: 4px;
1734
min-height: 4px;
1735
}
1736
1737
&.horizontal slider { margin: 2px 0; }
1738
1739
&.vertical slider { margin: 0 2px; }
1740
}
1741
1742
&.overlay-indicator {
1743
&:not(.dragging):not(.hovering) {
1744
border-color: transparent;
1745
background-color: transparent;
1746
1747
slider {
1748
min-width: 4px;
1749
min-height: 4px;
1750
margin: 2px;
1751
border: 2px solid scale-alpha($base_color, $lower_opacity);
1752
}
1753
1754
button {
1755
min-width: 4px;
1756
min-height: 4px;
1757
margin: 2px;
1758
border: 2px solid scale-alpha($base_color, $lower_opacity);
1759
border-radius: 100px;
1760
background-color: $tertiary_fg_color;
1761
background-clip: padding-box;
1762
-gtk-icon-source: none;
1763
1764
&:disabled { background-color: $insensitive_tertiary_fg_color; }
1765
}
1766
1767
&.horizontal {
1768
slider { min-width: $_slider_min_length; }
1769
1770
button { min-width: 8px; }
1771
}
1772
1773
&.vertical {
1774
slider { min-height: $_slider_min_length; }
1775
1776
button { min-height: 8px; }
1777
}
1778
}
1779
1780
&.dragging,
1781
&.hovering { background-color: scale-alpha($base_color, $higher_opacity); }
1782
}
1783
1784
&.horizontal slider { min-width: $_slider_min_length; }
1785
1786
&.vertical slider { min-height: $_slider_min_length; }
1787
1788
// button styling
1789
button {
1790
@extend %button_basic.flat;
1791
min-width: 16px;
1792
min-height: 16px;
1793
padding: 0;
1794
border-radius: 0;
1795
}
1796
1797
// button icons
1798
&.vertical {
1799
button {
1800
&.down { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); }
1801
1802
&.up { -gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); }
1803
}
1804
}
1805
1806
&.horizontal {
1807
button {
1808
&.down { -gtk-icon-source: -gtk-icontheme('pan-right-symbolic'); }
1809
1810
&.up { -gtk-icon-source: -gtk-icontheme('pan-left-symbolic'); }
1811
}
1812
}
1813
}
1814
1815
1816
/**********
1817
* Switch *
1818
**********/
1819
switch {
1820
transition: $material_transition;
1821
margin: $container_padding 0;
1822
border: 4px solid transparent;
1823
border-radius: 100px;
1824
background-color: $track_color;
1825
background-clip: padding-box;
1826
font-size: 0;
1827
1828
&:disabled { color: $insensitive_fg_color; }
1829
1830
&:checked {
1831
background-color: scale-alpha($accent_bg_color, 0.5);
1832
1833
&:disabled {
1834
background-color: scale-alpha($accent_bg_color, 0.5 * $disabled_opacity);
1835
color: $insensitive_fg_color;
1836
}
1837
}
1838
1839
slider {
1840
@include entry(normal);
1841
1842
transition: $material_transition, margin 0;
1843
min-width: $small_size;
1844
min-height: $small_size;
1845
margin: -4px 0 -4px -4px;
1846
-gtk-outline-radius: 100px;
1847
border-radius: 100px;
1848
background-image: -gtk-gradient(radial,
1849
center center, 0,
1850
center center, 0.5,
1851
to(transparent),
1852
to(transparent));
1853
}
1854
1855
&:hover slider { @include entry(focus); }
1856
1857
&:disabled slider { @include entry(insensitive); }
1858
1859
&:checked slider {
1860
transition: $material_transition, margin 0, background-image 0;
1861
animation: needs_attention $material_slower $material_ease_out forwards;
1862
margin: -4px -4px -4px 0;
1863
// background-color: $accent_bg_color;
1864
color: $selected_fg_color;
1865
}
1866
1867
&:checked:disabled slider { animation: none; }
1868
1869
row:selected & {
1870
}
1871
}
1872
1873
1874
/*************************
1875
* Check and Radio items *
1876
*************************/
1877
// draw regular check and radio items using our PNG assets
1878
// all assets are rendered from assets.svg. never add pngs directly
1879
1880
//selection-mode
1881
@each $s,$as in ('','-selectionmode'),
1882
(':active', '-active-selectionmode'),
1883
(':disabled', '-insensitive-selectionmode'),
1884
(':checked', '-checked-selectionmode'),
1885
(':checked:active', '-checked-active-selectionmode'),
1886
(':disabled:checked', '-checked-insensitive-selectionmode') {
1887
.view.content-view.check#{$s}:not(list) {
1888
-gtk-icon-shadow: $z-depth-1;
1889
-gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}.png"),
1890
url("assets/checkbox#{$as}@2.png"));
1891
margin: 8px;
1892
background-color: transparent;
1893
1894
&:hover, &:active { -gtk-icon-shadow: $z-depth-2; }
1895
1896
&:disabled { -gtk-icon-shadow: none; }
1897
}
1898
}
1899
1900
checkbutton.text-button, radiobutton.text-button {
1901
// this is for a nice focus on check and radios text
1902
padding: 2px 0;
1903
outline-offset: 0;
1904
1905
label:not(:only-child) {
1906
&:first-child { margin-left: 4px; }
1907
1908
&:last-child { margin-right: 4px; }
1909
}
1910
}
1911
1912
check,
1913
radio {
1914
min-height: 24px;
1915
min-width: 24px;
1916
-gtk-icon-source: none;
1917
1918
margin: -12px -8px;
1919
padding: 12px;
1920
outline-offset: 4px;
1921
// border-radius: 100%;
1922
1923
@extend %button_basic.flat;
1924
1925
@extend %button_basic.image-button;
1926
1927
color: gtkalpha(currentColor, $enabled_opacity);
1928
1929
&:hover, &:active { color: currentColor; }
1930
1931
&:checked, &:checked:disabled { background-color: transparent; }
1932
1933
&:checked, &:indeterminate { color: $accent_bg_color; }
1934
1935
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_bg_color, $disabled_opacity); }
1936
1937
&:only-child { margin: -12px; }
1938
1939
.osd & {
1940
}
1941
1942
menu menuitem & {
1943
transition: none;
1944
margin: -16px -16px; // this is a workaround for a menu check/radio size allocation issue
1945
1946
&:not(:checked):not(:indeterminate):hover { color: gtkalpha(currentColor, $enabled_opacity); }
1947
1948
&, &:hover, &:disabled {
1949
background-image: none;
1950
// color: inherit;
1951
// animation: none;
1952
}
1953
}
1954
}
1955
1956
%check,
1957
check {
1958
& { -gtk-icon-source: image(-gtk-recolor(url("assets/check-unchecked-symbolic.svg")),
1959
-gtk-recolor(url("assets/check-unchecked-symbolic.png"))); }
1960
1961
&:checked { -gtk-icon-source: image(-gtk-recolor(url("assets/check-checked-symbolic.svg")),
1962
-gtk-recolor(url("assets/check-checked-symbolic.png"))); }
1963
1964
&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/check-dash-symbolic.svg")),
1965
-gtk-recolor(url("assets/check-dash-symbolic.png"))); }
1966
}
1967
1968
%radio,
1969
radio {
1970
border-image: -gtk-gradient(radial,
1971
center center, 0,
1972
center center, 0.001,
1973
to($accent_bg_color),
1974
to(transparent))
1975
24 / 24px;
1976
-gtk-icon-source: image(-gtk-recolor(url("assets/radio-unchecked-symbolic.svg")),
1977
-gtk-recolor(url("assets/radio-unchecked-symbolic.png")));
1978
1979
&:checked {
1980
border-image: -gtk-gradient(radial,
1981
center center, 0,
1982
center center, (10 / 48 / 2),
1983
to($accent_bg_color),
1984
to(transparent))
1985
24 / 24px;
1986
}
1987
1988
&:checked:disabled {
1989
border-image: -gtk-gradient(radial,
1990
center center, 0,
1991
center center, (10 / 48 / 2),
1992
to(scale-alpha($accent_bg_color, $disabled_opacity)),
1993
to(transparent))
1994
24 / 24px;
1995
}
1996
1997
&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-dash-symbolic.svg")),
1998
-gtk-recolor(url("assets/radio-dash-symbolic.png"))); }
1999
2000
&:indeterminate:checked {
2001
border-image: -gtk-gradient(radial,
2002
center center, 0,
2003
center center, 0.001,
2004
to($accent_bg_color),
2005
to(transparent))
2006
24 / 24px;
2007
}
2008
}
2009
2010
// let's animate things
2011
@keyframes check_check {
2012
from { -gtk-icon-transform: rotate(90deg); }
2013
to { -gtk-icon-transform: unset; }
2014
}
2015
2016
@keyframes check_radio {
2017
from { -gtk-icon-transform: scale(0); }
2018
to { -gtk-icon-transform: unset; }
2019
}
2020
2021
@keyframes check_indeterminate {
2022
from { -gtk-icon-transform: unset; }
2023
50% { -gtk-icon-transform: scale(0, 1); }
2024
to { -gtk-icon-transform: unset; }
2025
}
2026
2027
check:not(:indeterminate):checked { animation: check_check $material_slower $material_ease; }
2028
2029
check:not(:indeterminate):checked:active { animation: check_check $material_slower $material_ease, flat_ripple_effect $material_slower $material_ease_out forwards; }
2030
2031
// radio:not(:indeterminate):checked { animation: check_radio $material_slower $material_ease; }
2032
2033
check:indeterminate:checked, radio:indeterminate:checked { animation: check_indeterminate $material_slower $material_ease; }
2034
2035
check:indeterminate:checked:active, radio:indeterminate:checked:active { animation: check_indeterminate $material_slower $material_ease, flat_ripple_effect $material_slower $material_ease_out forwards; }
2036
2037
// no animations in menus
2038
menu menuitem {
2039
check:not(:indeterminate):checked,
2040
radio:not(:indeterminate):checked,
2041
check:indeterminate:checked,
2042
radio:indeterminate:checked { animation: none; }
2043
}
2044
2045
treeview.view check,
2046
treeview.view radio {
2047
// margin: -12px;
2048
// padding: 12px;
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