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 • 75.75 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: -1px;
1082
margin-right: -1px;
1083
margin-top: -1px;
1084
border-radius: 0;
1085
box-shadow: none;
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: $disabled_fg_color; }
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
&:disabled slider { @include entry(disabled); }
1870
1871
&:checked slider {
1872
transition: $longer_transition, $shadow_transition, margin 0, background-image 0, background-color 0 $longer_duration;
1873
animation: needs_attention $longer_duration $deceleration_curve;
1874
margin: -4px -4px -4px 0;
1875
background-color: $accent_color;
1876
color: $inversed_fg_color;
1877
}
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: -12px;
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,
1967
radio {
1968
& { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-unchecked-symbolic.svg")),
1969
-gtk-recolor(url("assets/radio-unchecked-symbolic.png"))); }
1970
1971
// &:checked { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-checked-symbolic.svg")),
1972
// -gtk-recolor(url("assets/radio-checked-symbolic.png"))); }
1973
1974
&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-dash-symbolic.svg")),
1975
-gtk-recolor(url("assets/radio-dash-symbolic.png"))); }
1976
1977
border-image: -gtk-gradient(radial,
1978
center center, 0,
1979
center center, 0.001,
1980
to($accent_color),
1981
to(transparent))
1982
24 / 24px;
1983
1984
&:checked {
1985
border-image: -gtk-gradient(radial,
1986
center center, 0,
1987
center center, (10 / 48 / 2),
1988
to($accent_color),
1989
to(transparent))
1990
24 / 24px;
1991
}
1992
1993
&:checked:disabled {
1994
border-image: -gtk-gradient(radial,
1995
center center, 0,
1996
center center, (10 / 48 / 2),
1997
to(scale-alpha($accent_color, $disabled_opacity)),
1998
to(transparent))
1999
24 / 24px;
2000
}
2001
2002
&:indeterminate:checked {
2003
border-image: -gtk-gradient(radial,
2004
center center, 0,
2005
center center, 0.001,
2006
to($accent_color),
2007
to(transparent))
2008
24 / 24px;
2009
}
2010
}
2011
2012
// let's animate things
2013
@keyframes check_check {
2014
from { -gtk-icon-transform: rotate(90deg); }
2015
to { -gtk-icon-transform: unset; }
2016
}
2017
2018
@keyframes check_radio { // FIXME: cannot animate border-image
2019
from {
2020
border-image: -gtk-gradient(radial,
2021
center center, 0,
2022
center center, 0.001,
2023
to($accent_color),
2024
to(transparent))
2025
24 / 24px;
2026
}
2027
2028
to {
2029
border-image: -gtk-gradient(radial,
2030
center center, 0,
2031
center center, (10 / 48 / 2),
2032
to($accent_color),
2033
to(transparent))
2034
24 / 24px;
2035
}
2036
}
2037
2038
@keyframes check_indeterminate {
2039
from { -gtk-icon-transform: unset; }
2040
50% { -gtk-icon-transform: scale(0, 1); }
2041
to { -gtk-icon-transform: unset; }
2042
}
2043
2044
%check_checked,
2045
check:not(:indeterminate):checked { animation: check_check $longer_duration $standard_curve; }
2046
2047
check:not(:indeterminate):checked:active { animation: check_check $longer_duration $standard_curve, flat_ripple_effect $longer_duration $deceleration_curve forwards; }
2048
2049
// %radio_checked,
2050
// radio:not(:indeterminate):checked { animation: check_radio $longer_duration $standard_curve; }
2051
2052
// radio:not(:indeterminate):checked:active { animation: check_radio $longer_duration $standard_curve, flat_ripple_effect $longer_duration $deceleration_curve forwards; }
2053
2054
%indeterminate_checked,
2055
check:indeterminate:checked, radio:indeterminate:checked { animation: check_indeterminate $longer_duration $standard_curve; }
2056
2057
check:indeterminate:checked:active, radio:indeterminate:checked:active { animation: check_indeterminate $longer_duration $standard_curve, flat_ripple_effect $longer_duration $deceleration_curve forwards; }
2058
2059
// no animations in menus
2060
menu menuitem {
2061
check:not(:indeterminate):checked,
2062
radio:not(:indeterminate):checked,
2063
check:indeterminate:checked,
2064
radio:indeterminate:checked { animation: none; }
2065
}
2066
2067
treeview.view check,
2068
treeview.view radio {
2069
padding: 0;
2070
2071
&:checked:hover, &:selected:checked:hover { background-image: none; }
2072
2073
& {
2074
color: $secondary_fg_color;
2075
2076
&:hover, &:active { color: $fg_color; }
2077
2078
&:disabled { color: $disabled_secondary_fg_color; }
2079
2080
&:checked, &:indeterminate { color: $accent_color; }
2081
2082
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_color, $disabled_opacity); }
2083
}
2084
2085
&:selected {
2086
color: $secondary_inversed_fg_color;
2087
2088
&:hover, &:active { color: $inversed_fg_color; }
2089
2090
&:disabled { color: $disabled_secondary_inversed_fg_color; }
2091
2092
&:checked, &:indeterminate { color: $accent_color; }
2093
2094
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_color, $disabled_opacity); }
2095
}
2096
}
2097
2098
treeview.view radio:checked {
2099
-gtk-icon-source: image(-gtk-recolor(url("assets/radio-checked-symbolic.svg")),
2100
-gtk-recolor(url("assets/radio-checked-symbolic.png")));
2101
border-image: none;
2102
}
2103
2104
2105
/************
2106
* GtkScale *
2107
************/
2108
scale {
2109
// sizing
2110
$_marks_lenght: 8px;
2111
$_marks_distance: 8px;
2112
2113
min-height: $medium_size - 24px;
2114
min-width: $medium_size - 24px;
2115
padding: (24px / 2);
2116
2117
* { transition: $longer_transition; }
2118
2119
// the slider is inside the trough, so to have make it bigger there's a negative margin
2120
slider {
2121
min-height: 24px;
2122
min-width: 24px;
2123
margin: ($bar_size - 24px) / 2;
2124
}
2125
2126
// the backing bit
2127
trough {
2128
outline-offset: 2px;
2129
background-color: $track_color;
2130
2131
&:disabled { color: $disabled_fg_color; }
2132
}
2133
2134
// the colored part of the backing bit
2135
highlight {
2136
background-color: $accent_color;
2137
2138
&:disabled { background-color: transparent; }
2139
}
2140
2141
// this is another differently styled part of the backing bit, the most relevant use case is for example
2142
// in media player to indicate how much video stream as been cached
2143
fill {
2144
background-color: $track_color;
2145
2146
&:disabled { background-color: transparent; }
2147
}
2148
2149
slider {
2150
transition: all $shorter_duration $standard_curve;
2151
// border-radius: 100%;
2152
// background-color: $accent_color;
2153
background-repeat: no-repeat;
2154
background-position: center;
2155
2156
@each $s,$as in ('',''),
2157
(':disabled','-insensitive') {
2158
&#{$s} {
2159
$_url: 'assets/slider#{$as}#{$asset_suffix}';
2160
background-image: -gtk-scaled(url('#{$_url}.png'),
2161
url('#{$_url}@2.png'));
2162
}
2163
}
2164
2165
background-size: calc(100% - 8px);
2166
2167
&:hover { background-size: calc(100% - 4px); }
2168
2169
&:active { background-size: calc(100% - 0px); }
2170
}
2171
2172
// click-and-hold the slider to activate
2173
&.fine-tune {
2174
// to make the slider shrink in fine-tune mode
2175
slider { background-size: calc(100% - 12px); }
2176
}
2177
2178
value { color: gtkalpha(currentColor, $hint_opacity); }
2179
2180
marks {
2181
color: $track_color;
2182
2183
@each $marks_class, $marks_pos, $marks_margin in (top, top, bottom),
2184
(bottom, bottom, top),
2185
(top, left, right),
2186
(bottom, right, left) {
2187
&.#{$marks_class} {
2188
margin-#{$marks_margin}: $_marks_distance;
2189
margin-#{$marks_pos}: -($_marks_distance + $_marks_lenght);
2190
}
2191
}
2192
}
2193
2194
&.horizontal {
2195
indicator {
2196
min-height: $_marks_lenght;
2197
min-width: 1px;
2198
}
2199
}
2200
2201
&.vertical {
2202
indicator {
2203
min-height: 1px;
2204
min-width: $_marks_lenght;
2205
}
2206
}
2207
2208
// *WARNING* scale with marks madness following
2209
2210
// FIXME: OSD and selected list rows missing, I don't feel like adding the other 144 assets needed for those...
2211
$suffix: if($variant == 'light', '', '-dark');
2212
2213
@each $dir_class, $dir_infix in ('horizontal', 'horz'),
2214
('vertical', 'vert') {
2215
@each $marks_infix, $nth_child in ('scale-has-marks-above', ':last-child:not(:only-child)'),
2216
('scale-has-marks-below', ':first-child:not(:only-child)') {
2217
@each $state, $state_infix in ('', ''),
2218
(':disabled', '-insensitive') {
2219
&.#{$dir_class} {
2220
%#{$marks_infix}-#{$dir_infix},
2221
contents#{$nth_child} > trough > slider {
2222
&#{$state} {
2223
$_scale_asset: 'assets/slider-#{$dir_infix}-#{$marks_infix}#{$state_infix}#{$suffix}';
2224
2225
background-image: -gtk-scaled(url('#{$_scale_asset}.png'), url('#{$_scale_asset}@2.png'));
2226
}
2227
2228
@if $dir_class == 'horizontal' {
2229
min-height: 30px;
2230
min-width: 24px;
2231
2232
@if $marks_infix == 'scale-has-marks-above' {
2233
margin-top: -16px;
2234
2235
background-position: center calc(100% - 4px);
2236
2237
&:hover { background-position: center calc(100% - 2px); }
2238
2239
&:active { background-position: center calc(100% - 0px); }
2240
}
2241
2242
@if $marks_infix == 'scale-has-marks-below' {
2243
margin-bottom: -16px;
2244
2245
background-position: center calc(4px);
2246
2247
&:hover { background-position: center calc(2px); }
2248
2249
&:active { background-position: center calc(0px); }
2250
}
2251
}
2252
2253
@if $dir_class == 'vertical' {
2254
min-height: 24px;
2255
min-width: 30px;
2256
2257
@if $marks_infix == 'scale-has-marks-above' {
2258
margin-left: -16px;
2259
2260
background-position: calc(4px) center;
2261
2262
&:hover { background-position: calc(2px) center; }
2263
2264
&:active { background-position: calc(0px) center; }
2265
}
2266
2267
@if $marks_infix == 'scale-has-marks-below' {
2268
margin-right: -16px;
2269
2270
background-position: calc(100% - 4px) center;
2271
2272
&:hover { background-position: calc(100% - 2px) center; }
2273
2274
&:active { background-position: calc(100% - 0px) center; }
2275
}
2276
}
2277
}
2278
2279
@at-root %#{$marks_infix}-#{$dir_infix}-fine-tune,
2280
&.fine-tune contents#{$nth_child} > trough > slider {
2281
// bigger negative margins to make the trough grow here as well
2282
2283
@if $dir_class == 'horizontal' {
2284
@if $marks_infix == 'scale-has-marks-above' { background-position: center calc(100% - 6px); }
2285
2286
@if $marks_infix == 'scale-has-marks-below' { background-position: center calc(6px); }
2287
}
2288
2289
@if $dir_class == 'vertical' {
2290
@if $marks_infix == 'scale-has-marks-above' { background-position: calc(6px) center; }
2291
2292
@if $marks_infix == 'scale-has-marks-below' { background-position: calc(100% - 6px) center; }
2293
}
2294
}
2295
}
2296
}
2297
}
2298
}
2299
2300
&.color {
2301
min-height: 0;
2302
min-width: 0;
2303
2304
&.horizontal {
2305
padding: 0 0 12px 0;
2306
2307
trough {
2308
padding-bottom: $bar_size;
2309
}
2310
2311
slider {
2312
@extend %scale-has-marks-above-horz;
2313
2314
margin-bottom: -10px - $bar_size;
2315
margin-top: 0;
2316
}
2317
}
2318
2319
&.vertical {
2320
&:dir(ltr) {
2321
padding: 0 0 0 12px;
2322
2323
trough {
2324
padding-left: $bar_size;
2325
}
2326
2327
slider {
2328
@extend %scale-has-marks-below-vert;
2329
2330
margin-left: -10px - $bar_size;
2331
margin-right: 0;
2332
}
2333
}
2334
2335
&:dir(rtl) {
2336
padding: 0 12px 0 0;
2337
2338
trough {
2339
padding-right: $bar_size;
2340
}
2341
2342
slider {
2343
@extend %scale-has-marks-above-vert;
2344
2345
margin-right: -10px - $bar_size;
2346
margin-left: 0;
2347
}
2348
}
2349
}
2350
2351
&.fine-tune {
2352
&.horizontal {
2353
slider {
2354
@extend %scale-has-marks-above-horz-fine-tune;
2355
}
2356
}
2357
2358
&.vertical {
2359
&:dir(ltr) {
2360
slider {
2361
@extend %scale-has-marks-below-vert-fine-tune;
2362
}
2363
}
2364
2365
&:dir(rtl) {
2366
slider {
2367
@extend %scale-has-marks-above-vert-fine-tune;
2368
}
2369
}
2370
}
2371
}
2372
}
2373
}
2374
2375
2376
/*****************
2377
* Progress bars *
2378
*****************/
2379
progressbar {
2380
// sizing
2381
&.horizontal {
2382
trough,
2383
progress { min-height: $bar_size; }
2384
}
2385
2386
&.vertical {
2387
trough,
2388
progress { min-width: $bar_size; }
2389
}
2390
2391
// FIXME: insensitive state missing and some other state should be set probably
2392
color: $tertiary_fg_color;
2393
font-size: smaller;
2394
2395
trough { background-color: scale-alpha($primary_color, $lower_opacity); }
2396
2397
progress { background-color: $primary_color; }
2398
2399
&.osd { // progressbar.osd used for epiphany page loading progress
2400
// min-width: $bar_size;
2401
// min-height: $bar_size;
2402
// background-color: transparent;
2403
2404
// trough { background-color: transparent; }
2405
2406
progress {
2407
}
2408
}
2409
}
2410
2411
2412
/*************
2413
* Level Bar *
2414
*************/
2415
levelbar {
2416
block {
2417
min-width: $medium_size;
2418
min-height: $bar_size;
2419
}
2420
2421
&.vertical block {
2422
min-width: $bar_size;
2423
min-height: $medium_size;
2424
}
2425
2426
trough {
2427
padding: 2px;
2428
border-radius: 2px;
2429
2430
@include entry(normal);
2431
2432
&:disabled { @include entry(disabled); }
2433
}
2434
2435
&.horizontal.discrete block { margin: 0 1px; }
2436
2437
&.vertical.discrete block { margin: 1px 0; }
2438
2439
&.horizontal.discrete trough { padding: 2px 1px; }
2440
2441
&.vertical.discrete trough { padding: 1px 2px; }
2442
2443
block {
2444
&.low {
2445
background-color: $warning_color;
2446
}
2447
2448
&.high,
2449
&:not(.empty) {
2450
background-color: $primary_color;
2451
}
2452
2453
&.full {
2454
background-color: $success_color;
2455
}
2456
2457
&.empty {
2458
background-color: $track_color;
2459
color: $tertiary_fg_color;
2460
}
2461
}
2462
}
2463
2464
2465
/****************
2466
* Print dialog *
2467
*****************/
2468
printdialog {
2469
paper {
2470
padding: 0;
2471
border: 1px solid $borders_color;
2472
background: $base_color;
2473
color: $fg_color;
2474
}
2475
2476
.dialog-action-box { margin: 12px; }
2477
}
2478
2479
2480
/**********
2481
* Frames *
2482
**********/
2483
frame > border,
2484
.frame {
2485
margin: 0;
2486
padding: 0;
2487
border: 1px solid $borders_color;
2488
border-radius: 0;
2489
box-shadow: none;
2490
2491
&.flat { border-style: none; }
2492
}
2493
2494
actionbar > revealer > box {
2495
padding: $container_padding;
2496
border-top: 1px solid $borders_color;
2497
}
2498
2499
scrolledwindow {
2500
viewport.frame { // avoid double borders when viewport inside scrolled window
2501
border-style: none;
2502
}
2503
2504
// This is used when content is touch-dragged past boundaries.
2505
// draws a box on top of the content, the size changes programmatically.
2506
@at-root overshoot {
2507
&.top { @include overshoot(top); }
2508
2509
&.bottom { @include overshoot(bottom); }
2510
2511
&.left { @include overshoot(left); }
2512
2513
&.right { @include overshoot(right); }
2514
}
2515
2516
// Overflow indication, works similarly to the overshoot, the size if fixed tho.
2517
@at-root undershoot {
2518
&.top { @include undershoot(top); }
2519
2520
&.bottom { @include undershoot(bottom); }
2521
2522
&.left { @include undershoot(left); }
2523
2524
&.right { @include undershoot(right); }
2525
}
2526
2527
@at-root junction { // the small square between two scrollbars
2528
border-style: solid none none solid;
2529
border-width: 1px;
2530
border-color: $borders_color;
2531
background-color: $base_color;
2532
2533
&:dir(rtl) { border-style: solid solid none none; }
2534
}
2535
}
2536
2537
//vbox and hbox separators
2538
separator {
2539
min-width: 1px;
2540
min-height: 1px;
2541
background: $borders_color;
2542
}
2543
2544
2545
/*********
2546
* Lists *
2547
*********/
2548
list {
2549
border-color: $borders_color;
2550
background-color: $base_color;
2551
2552
row { padding: 2px; }
2553
}
2554
2555
// FIXME
2556
$row_transition: $longer_transition, background-color 0, color 0;
2557
2558
row {
2559
&.activatable {
2560
transition: $row_transition;
2561
box-shadow: inset 0 0 0 10000px gtkalpha(currentColor, 0);
2562
background-image: radial-gradient(circle farthest-corner at center,
2563
gtkalpha(currentColor, 0) 100%,
2564
transparent 0%),
2565
image(gtkalpha(currentColor, 0));
2566
2567
&:hover {
2568
transition: $row_transition, box-shadow 0;
2569
box-shadow: inset 0 0 0 10000px gtkalpha(currentColor, 0.05);
2570
}
2571
2572
&.has-open-popup, // this is for indicathing which row generated a popover see https://bugzilla.gnome.org/show_bug.cgi?id=754411
2573
&:active {
2574
transition: $row_transition, background-image 0;
2575
animation: row_ripple_effect $longer_duration $deceleration_curve forwards;
2576
box-shadow: inset 0 0 0 10000px gtkalpha(currentColor, $lower_opacity / 2);
2577
}
2578
}
2579
2580
&:selected { @extend %selected_items; }
2581
}
2582
2583
2584
/*********************
2585
* App Notifications *
2586
*********************/
2587
.app-notification,
2588
.app-notification.frame {
2589
@extend %osd;
2590
2591
@extend toolbar.osd;
2592
2593
margin: 8px;
2594
2595
border { border: none; }
2596
}
2597
2598
2599
/*************
2600
* Expanders *
2601
*************/
2602
expander {
2603
arrow {
2604
transition: all $shorter_duration $standard_curve;
2605
min-width: 16px;
2606
min-height: 16px;
2607
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
2608
-gtk-icon-transform: rotate(-90deg);
2609
2610
&:dir(rtl) { -gtk-icon-transform: rotate(90deg); }
2611
2612
&:checked { -gtk-icon-transform: unset; }
2613
2614
color: $secondary_fg_color;
2615
2616
&:hover, &:active { color: $fg_color; }
2617
2618
&:disabled { color: $disabled_secondary_fg_color; }
2619
2620
&:selected {
2621
color: $secondary_inversed_fg_color;
2622
2623
&:hover, &:active { color: $inversed_fg_color; }
2624
2625
&:disabled { color: $disabled_secondary_inversed_fg_color; }
2626
}
2627
}
2628
}
2629
2630
2631
/************
2632
* Calendar *
2633
***********/
2634
calendar {
2635
padding: 1px;
2636
border: 1px solid $borders_color;
2637
color: $fg_color;
2638
2639
&:disabled { color: $disabled_fg_color; }
2640
2641
&:selected {
2642
@extend %selected_items;
2643
2644
border-radius: 2px + 1px;
2645
}
2646
2647
&.header {
2648
border-style: none none solid;
2649
border-radius: 0;
2650
}
2651
2652
&.button { @extend %simple_flat_button; }
2653
2654
&.highlight {
2655
color: gtkalpha(currentColor, $hint_opacity);
2656
font-weight: 500;
2657
}
2658
2659
&:indeterminate { color: gtkalpha(currentColor, $disabled_opacity); }
2660
}
2661
2662
2663
/***********
2664
* Dialogs *
2665
***********/
2666
messagedialog { // Message Dialog styling
2667
&.background { background-color: $lighter_bg_color; }
2668
2669
.titlebar {
2670
min-height: $small_size;
2671
border-style: none;
2672
box-shadow: inset 0 1px $highlight_color;
2673
background-color: $lighter_bg_color;
2674
}
2675
2676
&.csd { // rounded bottom border styling for csd version
2677
&.background {
2678
// bigger radius for better antialiasing
2679
border-bottom-left-radius: 2px;
2680
border-bottom-right-radius: 2px;
2681
}
2682
2683
.dialog-action-area button {
2684
padding: 8px 16px;
2685
border-top: 1px solid $borders_color;
2686
border-radius: 0;
2687
2688
@extend %simple_flat_button;
2689
2690
&:first-child { border-bottom-left-radius: 2px; }
2691
2692
&:last-child { border-bottom-right-radius: 2px; }
2693
}
2694
}
2695
}
2696
2697
filechooser {
2698
.dialog-action-box { border-top: 1px solid $borders_color; }
2699
2700
#pathbarbox {
2701
border-bottom: 1px solid $borders_color;
2702
background-color: $bg_color;
2703
}
2704
}
2705
2706
filechooserbutton:drop(active) {
2707
box-shadow: none;
2708
}
2709
2710
2711
/***********
2712
* Sidebar *
2713
***********/
2714
.sidebar {
2715
border-style: none;
2716
background-color: $lighter_bg_color;
2717
2718
@at-root %sidebar_left,
2719
&:dir(ltr),
2720
&.left,
2721
&.left:dir(rtl) {
2722
border-right: 1px solid $borders_color;
2723
border-left-style: none;
2724
}
2725
2726
@at-root %sidebar_right
2727
&:dir(rtl),
2728
&.right {
2729
border-left: 1px solid $borders_color;
2730
border-right-style: none;
2731
}
2732
2733
list { background-color: transparent; }
2734
2735
paned & { &.left, &.right, &.left:dir(rtl), &:dir(rtl), &:dir(ltr), & { border-style: none; }}
2736
}
2737
2738
stacksidebar {
2739
&.sidebar {
2740
&:dir(ltr),
2741
&.left,
2742
&.left:dir(rtl) { list { @extend %sidebar_left; }}
2743
2744
&:dir(rtl),
2745
&.right { list { @extend %sidebar_right; }}
2746
}
2747
2748
row {
2749
padding: 10px 4px;
2750
2751
> label {
2752
padding-left: 6px;
2753
padding-right: 6px;
2754
}
2755
2756
&.needs-attention > label { @extend %needs_attention; }
2757
}
2758
}
2759
2760
2761
/****************
2762
* File chooser *
2763
****************/
2764
placessidebar {
2765
> viewport.frame { border-style: none; }
2766
2767
list { padding: (4px - 3px) 0 4px; }
2768
2769
row {
2770
// Needs overriding of the GtkListBoxRow padding
2771
min-height: 32px;
2772
margin: -1px 0; // Remove unknown margins
2773
padding: 0;
2774
2775
// Using margins/padding directly in the SidebarRow
2776
// will make the animation of the new bookmark row jump
2777
> revealer { padding: 0 12px; }
2778
2779
&:selected { color: $inversed_fg_color; }
2780
2781
&:disabled { color: $disabled_fg_color; }
2782
2783
image.sidebar-icon {
2784
opacity: $hint_opacity; // dim the device icons
2785
2786
&:dir(ltr) { padding-right: 8px; }
2787
&:dir(rtl) { padding-left: 8px; }
2788
}
2789
2790
label.sidebar-label {
2791
&:dir(ltr) { padding-right: 2px; }
2792
&:dir(rtl) { padding-left: 2px; }
2793
}
2794
2795
@at-root button.sidebar-button {
2796
@extend %simple_flat_button;
2797
2798
@extend %small_button;
2799
2800
row:selected & {
2801
}
2802
}
2803
2804
&.sidebar-placeholder-row {
2805
min-height: 2px;
2806
padding: 0 8px;
2807
background-image: image($accent_color);
2808
background-clip: content-box;
2809
}
2810
2811
&.sidebar-new-bookmark-row { color: $accent_color; }
2812
2813
&:drop(active):not(:disabled) {
2814
box-shadow: inset 0 0 0 2px $accent_color;
2815
2816
&:selected {
2817
// background-color: $accent_color;
2818
// color: $inversed_fg_color;
2819
}
2820
}
2821
}
2822
}
2823
2824
placesview {
2825
.server-list-button > image { -gtk-icon-transform: rotate(0turn); }
2826
2827
.server-list-button:checked > image { -gtk-icon-transform: rotate(-0.5turn); }
2828
2829
// this selects the "connect to server" label
2830
> actionbar > revealer > box > label {
2831
padding-left: 8px;
2832
padding-right: 8px;
2833
}
2834
}
2835
2836
2837
/*********
2838
* Paned *
2839
*********/
2840
paned {
2841
> separator {
2842
min-width: 1px;
2843
min-height: 1px;
2844
-gtk-icon-source: none; // defeats the ugly default handle decoration
2845
border-style: none; // just to be sure
2846
background-color: transparent;
2847
// workaround, using background istead of a border since the border will get rendered twice (?)
2848
background-image: image($borders_color);
2849
background-size: 1px 1px;
2850
2851
&.wide {
2852
min-width: 6px;
2853
min-height: 6px;
2854
background-color: $bg_color;
2855
background-image: image($borders_color), image($borders_color);
2856
background-size: 1px 1px, 1px 1px;
2857
}
2858
}
2859
2860
&.horizontal > separator {
2861
background-repeat: repeat-y;
2862
2863
&:dir(ltr) {
2864
margin: 0 -8px 0 0;
2865
padding: 0 8px 0 0;
2866
background-position: left;
2867
}
2868
2869
&:dir(rtl) {
2870
margin: 0 0 0 -8px;
2871
padding: 0 0 0 8px;
2872
background-position: right;
2873
}
2874
2875
&.wide {
2876
margin: 0;
2877
padding: 0;
2878
background-repeat: repeat-y, repeat-y;
2879
background-position: left, right;
2880
}
2881
}
2882
2883
&.vertical > separator {
2884
margin: 0 0 -8px 0;
2885
padding: 0 0 8px 0;
2886
background-repeat: repeat-x;
2887
background-position: top;
2888
2889
&.wide {
2890
margin: 0;
2891
padding: 0;
2892
background-repeat: repeat-x, repeat-x;
2893
background-position: bottom, top;
2894
}
2895
}
2896
}
2897
2898
2899
/**************
2900
* GtkInfoBar *
2901
**************/
2902
infobar {
2903
border-style: none;
2904
2905
&.info { background-color: $info_bg_color; }
2906
2907
&.question { background-color: $question_bg_color; }
2908
2909
&.warning { background-color: $warning_bg_color; }
2910
2911
&.error { background-color: $error_bg_color; }
2912
2913
&.info,
2914
&.question,
2915
&.warning,
2916
&.error {
2917
> label, & { color: $inversed_fg_color; }
2918
2919
button { @extend %button_selected; }
2920
2921
selection { }
2922
2923
*:link { @extend %link_selected; }
2924
}
2925
}
2926
2927
2928
/************
2929
* Tooltips *
2930
************/
2931
tooltip {
2932
&.background {
2933
// background-color needs to be set this way otherwise it gets drawn twice
2934
// see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details.
2935
background-color: scale-alpha($base_color, $higher_opacity);
2936
}
2937
2938
// @extend %osd;
2939
2940
// padding: 4px; /* not working */
2941
border-radius: 2px;
2942
box-shadow: none; // otherwise it gets inherited by windowframe.csd
2943
2944
// FIXME: we need a border or tooltips vanish on black background.
2945
decoration { background-color: transparent; }
2946
2947
label {
2948
// tooltip label has already 6px margins
2949
min-height: 32px - 6px * 2;
2950
padding: 0 8px - 6px;
2951
}
2952
2953
* { // Yeah this is ugly
2954
padding: 0;
2955
background-color: transparent;
2956
color: inherit;
2957
}
2958
}
2959
2960
2961
/*****************
2962
* Color Chooser *
2963
*****************/
2964
colorswatch {
2965
// This widget is made of two boxes one on top of the other, the lower box is colorswatch {} the other one
2966
// is colorswatch overlay {}, colorswatch has the programmatically set background, so most of the style is
2967
// applied to the overlay box.
2968
2969
// base color corners rounding
2970
// to avoid the artifacts caused by rounded corner anti-aliasing the base color
2971
// sports a bigger radius.
2972
// nth-child is needed by the custom color strip.
2973
2974
&.top {
2975
border-top-left-radius: $md_radius + 0.5px;
2976
border-top-right-radius: $md_radius + 0.5px;
2977
2978
overlay {
2979
border-top-left-radius: $md_radius;
2980
border-top-right-radius: $md_radius;
2981
}
2982
}
2983
2984
&.bottom {
2985
border-bottom-left-radius: $md_radius + 0.5px;
2986
border-bottom-right-radius: $md_radius + 0.5px;
2987
2988
overlay {
2989
border-bottom-left-radius: $md_radius;
2990
border-bottom-right-radius: $md_radius;
2991
}
2992
}
2993
2994
&.left,
2995
&:first-child:not(.top) {
2996
border-top-left-radius: $md_radius + 0.5px;
2997
border-bottom-left-radius: $md_radius + 0.5px;
2998
2999
overlay {
3000
border-top-left-radius: $md_radius;
3001
border-bottom-left-radius: $md_radius;
3002
}
3003
}
3004
3005
&.right,
3006
&:last-child:not(.bottom) {
3007
border-top-right-radius: $md_radius + 0.5px;
3008
border-bottom-right-radius: $md_radius + 0.5px;
3009
3010
overlay {
3011
border-top-right-radius: $md_radius;
3012
border-bottom-right-radius: $md_radius;
3013
}
3014
}
3015
3016
&.dark overlay { color: $dark_contrast_color; }
3017
3018
&.light overlay { color: $light_contrast_color; }
3019
3020
&.dark { color: $dark_contrast_color; } // for focus ring
3021
3022
&.light { color: $light_contrast_color; } // for focus ring
3023
3024
&:drop(active) {
3025
box-shadow: none;
3026
3027
&.light overlay {
3028
box-shadow: $z-depth-1, 0 0 0 2px $accent_color;
3029
}
3030
3031
&.dark overlay {
3032
box-shadow: $z-depth-1, 0 0 0 2px $accent_color;
3033
}
3034
}
3035
3036
overlay {
3037
transition: $shadow_transition;
3038
box-shadow: $z-depth-1;
3039
3040
&:hover { box-shadow: $z-depth-2; }
3041
}
3042
3043
&#add-color-button {
3044
border-radius: $md_radius $md_radius 0 0;
3045
color: $dark_contrast_color; // for focus ring
3046
3047
&:only-child { border-radius: $md_radius; }
3048
3049
overlay {
3050
background-image: linear-gradient(to right,
3051
$error_bg_color 25%,
3052
$warning_bg_color 25%, $warning_bg_color 50%,
3053
$info_bg_color 50%, $info_bg_color 75%,
3054
$question_bg_color 75%);
3055
color: $dark_contrast_color;
3056
}
3057
}
3058
3059
&:disabled {
3060
opacity: $disabled_opacity;
3061
3062
overlay { box-shadow: none; }
3063
}
3064
3065
row:selected & {
3066
}
3067
3068
&#editor-color-sample {
3069
border-radius: $md_radius + 0.5px;
3070
3071
overlay { border-radius: $md_radius; }
3072
3073
// overlay:hover { box-shadow: $z-depth-1; }
3074
}
3075
}
3076
3077
// colorscale popup
3078
colorchooser .popover.osd {
3079
transition: $shadow_transition;
3080
border-radius: 2px;
3081
box-shadow: $z-depth-2;
3082
background-color: $base_color;
3083
3084
&:backdrop { box-shadow: $z-depth-1; }
3085
3086
spinbutton:not(.vertical) { @extend %entry.flat; }
3087
}
3088
3089
3090
/********
3091
* Misc *
3092
********/
3093
//content view (grid/list)
3094
.content-view {
3095
background-color: $bg_color;
3096
3097
// &:hover { -gtk-icon-effect: highlight; }
3098
3099
rubberband { @extend rubberband; }
3100
}
3101
3102
.scale-popup {
3103
.osd & { @extend %osd; }
3104
3105
.osd & button.flat { //FIXME: quick hack, redo properly
3106
}
3107
3108
button { // +/- buttons on GtkVolumeButton popup
3109
}
3110
}
3111
3112
3113
/**********************
3114
* Window Decorations *
3115
*********************/
3116
decoration {
3117
transition: $shadow_transition;
3118
border-radius: 2px 2px 0 0;
3119
box-shadow: $z-depth-4, 0 16px 16px transparent;
3120
3121
// FIXME rationalize shadows
3122
3123
// this is used for the resize cursor area
3124
margin: 8px;
3125
3126
&:backdrop {
3127
// the transparent shadow here is to enforce that the shadow extents don't
3128
// change when we go to backdrop, to prevent jumping windows.
3129
// The biggest shadow should be in the same order then in the active state
3130
// or the jumping will happen during the transition.
3131
box-shadow: $z-depth-2, 0 16px 16px transparent;
3132
}
3133
3134
.maximized &,
3135
.fullscreen &,
3136
.tiled & { border-radius: 0; }
3137
3138
.popup & { box-shadow: none; }
3139
3140
// server-side decorations as used by mutter
3141
.ssd & { box-shadow: 0 3px 3px rgba(0, 0, 0, 0.16); } //just doing borders, wm draws actual shadows
3142
3143
.csd.popup & {
3144
border-radius: 2px;
3145
box-shadow: $z-depth-2;
3146
}
3147
3148
tooltip.csd & {
3149
border-radius: 2px;
3150
box-shadow: $z-depth-2;
3151
}
3152
3153
messagedialog.csd & {
3154
border-radius: 2px;
3155
// box-shadow: $z-depth-4, 0 16px 16px transparent;
3156
3157
// &:backdrop { box-shadow: $z-depth-2, 0 16px 16px transparent; }
3158
}
3159
3160
.solid-csd & {
3161
margin: 0;
3162
padding: 4px;
3163
// border: solid 1px $borders_color;
3164
border-radius: 0;
3165
box-shadow: inset 0 0 0 3px $headerbar_color, inset 0 1px $secondary_highlight_color;
3166
background-color: $borders_color;
3167
}
3168
}
3169
3170
// Window Close button
3171
button.titlebutton {
3172
// @extend %simple_flat_button;
3173
3174
@extend %circular_button;
3175
3176
.selection-mode & {
3177
}
3178
}
3179
3180
3181
// catch all extend :)
3182
3183
%selected_items {
3184
background-color: $primary_color;
3185
3186
@at-root %nobg_selected_items, & {
3187
color: $inversed_fg_color;
3188
3189
&:disabled { color: $disabled_inversed_fg_color; }
3190
}
3191
}
3192
3193
.monospace { font-family: monospace; }
3194
3195
3196
/**********************
3197
* Touch Copy & Paste *
3198
*********************/
3199
//touch selection handlebars for the Popover.osd above
3200
cursor-handle {
3201
border-radius: $circular_radius;
3202
background-color: $accent_color;
3203
background-image: none;
3204
3205
&.top:dir(ltr), &.bottom:dir(rtl) {
3206
padding-left: 6px;
3207
border-top-right-radius: 0;
3208
}
3209
3210
&.bottom:dir(ltr), &.top:dir(rtl) {
3211
padding-right: 6px;
3212
border-top-left-radius: 0;
3213
}
3214
3215
&.insertion-cursor:dir(ltr), &.insertion-cursor:dir(rtl) {
3216
-GtkWidget-text-handle-width: 24;
3217
-GtkWidget-text-handle-height: 30;
3218
3219
$_url: 'assets/slider-horz-scale-has-marks-above#{$asset_suffix}';
3220
-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'),
3221
url('#{$_url}@2.png'));
3222
}
3223
}
3224
3225
.context-menu { font: initial; } // Decouple the font of context menus from their entry/textview
3226
3227
%circular_button,
3228
button.circular { // FIXME: aggregate to buttons
3229
border-radius: $circular_radius;
3230
-gtk-outline-radius: $circular_radius;
3231
3232
// label { padding: 0; }
3233
}
3234
3235
%small_button {
3236
min-height: $small_size;
3237
min-width: $small_size;
3238
padding: 0;
3239
border-radius: $circular_radius;
3240
-gtk-outline-radius: $circular_radius;
3241
}
3242
3243
// shortcut window keys
3244
.keycap {
3245
min-width: 28px - 8px * 2;
3246
min-height: 28px - 2px;
3247
margin-top: 2px;
3248
padding-bottom: 2px;
3249
padding-left: 8px;
3250
padding-right: 8px;
3251
3252
border: solid 1px $borders_color;
3253
border-radius: 2px + 1px;
3254
box-shadow: inset 0 -2px $borders_color;
3255
background-color: $base_color;
3256
color: $fg_color;
3257
font-size: smaller;
3258
}
3259
3260
*:drop(active) { // FIXME needs to be done widget by widget, this wildcard should really die
3261
transition: $longer_transition;
3262
box-shadow: $z-depth-1, inset 0 0 0 2px $accent_color;
3263
caret-color: $accent_color;
3264
}
3265
3266
stackswitcher button.text-button { min-width: 100px; } // FIXME aggregate with buttons
3267
3268
stackswitcher button.circular,
3269
stackswitcher button.text-button.circular { // FIXME aggregate with buttons
3270
min-width: $medium_size;
3271
min-height: $medium_size;
3272
padding: 0;
3273
}
3274