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