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