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