_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
color: $secondary_selected_fg_color;
969
}
970
971
.title {
972
padding-left: 12px;
973
padding-right: 12px;
974
font-weight: bold;
975
}
976
977
.subtitle {
978
padding-left: 12px;
979
padding-right: 12px;
980
font-size: smaller;
981
982
@extend .dim-label;
983
}
984
985
button:not(.suggested-action):not(.destructive-action) {
986
@extend %button_basic.flat;
987
988
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
989
currentColor 0%,
990
transparent 0%)
991
0 0 0 / 0 0 0px;
992
color: gtkalpha(currentColor, $enabled_opacity);
993
994
&:hover, &:active { color: currentColor; }
995
996
&:disabled {
997
color: gtkalpha(currentColor, $enabled_opacity * $disabled_opacity);
998
999
> label { color: inherit; }
1000
}
1001
1002
&:checked {
1003
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
1004
currentColor 100%,
1005
transparent 0%)
1006
0 0 2 / 0 0 2px;
1007
background-color: transparent;
1008
color: currentColor;
1009
1010
&:disabled {
1011
background-color: transparent;
1012
color: gtkalpha(currentColor, $disabled_opacity);
1013
1014
> label { color: inherit; }
1015
}
1016
}
1017
}
1018
1019
button.suggested-action, button.destructive-action {
1020
&:disabled {
1021
color: gtkalpha(currentColor, $disabled_opacity);
1022
1023
> label { color: inherit; }
1024
}
1025
}
1026
1027
&.selection-mode {
1028
animation: header_ripple_effect $material_slower $material_ease_out forwards;
1029
// box-shadow: inset 0 1px $secondary_highlight_color;
1030
// background-color: $selected_bg_color;
1031
color: $selected_fg_color;
1032
1033
&:backdrop {
1034
color: $secondary_selected_fg_color;
1035
}
1036
1037
.subtitle:link { @extend *:link:selected; }
1038
1039
button:not(.suggested-action):not(.destructive-action) {
1040
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
1041
currentColor 0%,
1042
transparent 0%)
1043
0 0 0 / 0 0 0px;
1044
// color: gtkalpha(currentColor, $enabled_opacity);
1045
1046
&, &:hover, &:active { color: currentColor; }
1047
1048
&:disabled {
1049
color: gtkalpha(currentColor, $disabled_opacity);
1050
1051
> label { color: inherit; }
1052
}
1053
1054
&:checked {
1055
border-image: radial-gradient(circle closest-corner at center calc(100% - 1px),
1056
currentColor 100%,
1057
transparent 0%)
1058
0 0 2 / 0 0 2px;
1059
color: currentColor;
1060
1061
&:disabled {
1062
color: gtkalpha(currentColor, $disabled_opacity);
1063
1064
> label { color: inherit; }
1065
}
1066
}
1067
}
1068
1069
.selection-menu {
1070
padding-left: 16px;
1071
padding-right: 16px;
1072
1073
GtkArrow { -GtkArrow-arrow-scaling: 1; }
1074
1075
.arrow { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); }
1076
}
1077
}
1078
1079
.tiled &,
1080
.maximized & {
1081
border-radius: 0; // squared corners when the window is max'd or tiled
1082
box-shadow: none;
1083
}
1084
1085
&.default-decoration {
1086
min-height: $small_size;
1087
padding: $container_padding;
1088
border-width: 0;
1089
1090
button.titlebutton {
1091
min-height: $small_size;
1092
min-width: $small_size;
1093
margin: 0;
1094
padding: 0;
1095
1096
&:active { // add fallback
1097
background-image: radial-gradient(circle farthest-corner at center,
1098
gtkalpha(currentColor, $lower_opacity / 2) 100%,
1099
transparent 0%),
1100
image(gtkalpha(currentColor, $lower_opacity / 2));
1101
}
1102
}
1103
}
1104
}
1105
1106
headerbar {
1107
// add vertical margins to headerbar entries, buttons and separators to avoid them spanning the whole height
1108
entry,
1109
spinbutton,
1110
// separator,
1111
button {
1112
margin-top: $container_padding;
1113
margin-bottom: $container_padding;
1114
}
1115
}
1116
1117
.titlebar {
1118
border-top-left-radius: 2px;
1119
border-top-right-radius: 2px;
1120
}
1121
1122
headerbar {
1123
separator:first-child + &, // tackles the paned container case
1124
&:first-child {
1125
border-top-left-radius: 2px;
1126
1127
.tiled &,
1128
.maximized & { border-radius: 0; }
1129
}
1130
1131
&:last-child {
1132
border-top-right-radius: 2px;
1133
1134
.tiled &,
1135
.maximized & { border-radius: 0; }
1136
}
1137
}
1138
1139
.titlebar:not(headerbar) {
1140
window.csd > & {
1141
// in csd we assume every titlebar is a headerbar so reset anything, this is needed for split toolbars cases
1142
padding: 0;
1143
background-color: transparent;
1144
background-image: none;
1145
border-style: none;
1146
box-shadow: none;
1147
}
1148
1149
> separator {
1150
background-color: $headerbar_color;
1151
background-image: image($borders_color);
1152
}
1153
1154
@extend %titlebar;
1155
}
1156
1157
1158
/************
1159
* Pathbars *
1160
************/
1161
.path-bar button {
1162
&.text-button, &.image-button, & {
1163
padding-left: 6px;
1164
padding-right: 6px;
1165
}
1166
1167
&.text-button.image-button, & {
1168
// label:last-child { padding-left: 2px; padding-right: 8px; }
1169
// label:first-child { padding-left: 8px; padding-right: 2px; }
1170
}
1171
1172
image {
1173
padding-left: 4px;
1174
padding-right: 4px;
1175
}
1176
1177
&.slider-button {
1178
padding-left: 0;
1179
padding-right: 0;
1180
}
1181
}
1182
1183
1184
/**************
1185
* Tree Views *
1186
**************/
1187
treeview.view {
1188
-GtkTreeView-grid-line-width: 1;
1189
-GtkTreeView-grid-line-pattern: '';
1190
-GtkTreeView-tree-line-width: 1;
1191
-GtkTreeView-tree-line-pattern: '';
1192
-GtkTreeView-expander-size: 16;
1193
1194
border-left-color: $track_color; // this is actually the tree lines color,
1195
border-top-color: $borders_color; // while this is the grid lines color, better then nothing
1196
1197
rubberband { @extend rubberband; } // to avoid borders being overridden by the previously set props
1198
1199
&:hover, &:active, &:selected { border-radius: 0; }
1200
1201
&.separator {
1202
min-height: 1px + 2px * 2;
1203
color: $borders_color;
1204
}
1205
1206
&:drop(active) {
1207
border-style: solid none;
1208
border-width: 1px;
1209
border-color: $accent_bg_color;
1210
1211
&.after { border-top-style: none; }
1212
1213
&.before { border-bottom-style: none; }
1214
}
1215
1216
&.expander {
1217
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
1218
-gtk-icon-transform: rotate(-90deg);
1219
1220
&:dir(rtl) { -gtk-icon-transform: rotate(90deg); }
1221
1222
&:checked { -gtk-icon-transform: unset; }
1223
1224
color: $secondary_fg_color;
1225
1226
&:hover, &:active { color: $fg_color; }
1227
1228
&:disabled { color: $insensitive_secondary_fg_color; }
1229
1230
&:selected {
1231
color: $secondary_selected_fg_color;
1232
1233
&:hover, &:active { color: $selected_fg_color; }
1234
1235
&:disabled { color: $insensitive_secondary_selected_fg_color; }
1236
}
1237
}
1238
1239
&.progressbar { // progress bar in treeviews
1240
border-style: none none solid;
1241
border-width: $bar_size;
1242
border-color: $selected_bg_color;
1243
background-color: transparent;
1244
background-image: none;
1245
1246
&:selected { border-color: currentColor; }
1247
}
1248
1249
&.trough { // progress bar trough in treeviews
1250
border-style: none none solid;
1251
border-width: $bar_size;
1252
border-color: scale-alpha($selected_bg_color, $lower_opacity);
1253
background-color: transparent;
1254
background-image: none;
1255
1256
&:selected { border-color: $track_color; }
1257
}
1258
1259
header {
1260
button {
1261
@extend row.activatable;
1262
1263
padding: 2px 6px;
1264
border-style: none solid solid none;
1265
border-width: 1px;
1266
border-color: $borders_color;
1267
border-radius: 0;
1268
background-clip: border-box;
1269
1270
&, &:hover, &:active { box-shadow: none; }
1271
1272
&, &:disabled { background-color: $base_color; }
1273
1274
&:last-child { border-right-style: none; }
1275
}
1276
}
1277
1278
button.dnd,
1279
header.button.dnd { // for treeview-like derive widgets
1280
padding: 2px 6px;
1281
border-style: none solid solid;
1282
border-width: 1px;
1283
border-color: $borders_color;
1284
border-radius: 0;
1285
box-shadow: none;
1286
background-color: $base_color;
1287
background-clip: border-box;
1288
color: $selected_bg_color;
1289
}
1290
}
1291
1292
1293
/*********
1294
* Menus *
1295
*********/
1296
menubar,
1297
.menubar {
1298
-GtkWidget-window-dragging: true;
1299
padding: 0;
1300
// box-shadow: inset 0 -1px $borders_color;
1301
background-color: $headerbar_color;
1302
1303
> menuitem {
1304
transition: background-color $material_faster $material_ease_out;
1305
min-height: 20px;
1306
padding: 4px 8px;
1307
color: $secondary_selected_fg_color;
1308
1309
&:hover { //Seems like it :hover even with keyboard focus
1310
transition: none;
1311
background-color: gtkalpha(currentColor, $lower_opacity / 2);
1312
color: $selected_fg_color;
1313
}
1314
1315
&:disabled { color: $insensitive_secondary_selected_fg_color; }
1316
}
1317
}
1318
1319
menu,
1320
.menu {
1321
margin: 4px 0;
1322
padding: 4px 0;
1323
background-color: $base_color;
1324
border: 1px solid $borders_color; // adds borders in a non composited env
1325
1326
.csd & {
1327
border: none; // axes borders in a composited env
1328
border-radius: 2px;
1329
}
1330
1331
menuitem {
1332
transition: background-color $material_faster $material_ease_out;
1333
min-height: 20px;
1334
min-width: 40px;
1335
padding: 4px 8px;
1336
font: initial;
1337
text-shadow: none;
1338
1339
&:hover {
1340
transition: none;
1341
background-color: gtkalpha(currentColor, $lower_opacity / 2);
1342
}
1343
1344
&:disabled { color: $insensitive_fg_color; }
1345
1346
// submenu indicators
1347
arrow {
1348
min-height: 16px;
1349
min-width: 16px;
1350
1351
&:dir(ltr) {
1352
-gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
1353
margin-left: 8px;
1354
}
1355
1356
&:dir(rtl) {
1357
-gtk-icon-source:-gtk-icontheme('pan-end-symbolic-rtl');
1358
margin-right: 8px;
1359
}
1360
}
1361
}
1362
1363
// overflow arrows
1364
> arrow {
1365
min-height: 16px;
1366
min-width: 16px;
1367
padding: 4px;
1368
border-radius: 0;
1369
background-color: $base_color;
1370
color: $secondary_fg_color;
1371
1372
&.top {
1373
margin-top: -4px;
1374
border-bottom: 1px solid $borders_color;
1375
-gtk-icon-source: -gtk-icontheme('pan-up-symbolic');
1376
}
1377
1378
&.bottom {
1379
margin-bottom: -4px;
1380
border-top: 1px solid $borders_color;
1381
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
1382
}
1383
1384
&:hover {
1385
background-image: image(gtkalpha(currentColor, $lower_opacity / 2));
1386
color: $fg_color;
1387
}
1388
1389
&:disabled {
1390
border-color: transparent;
1391
background-color: transparent;
1392
color: transparent;
1393
// color: $insensitive_secondary_fg_color;
1394
}
1395
}
1396
1397
separator { margin: 4px 0; }
1398
}
1399
1400
menuitem {
1401
accelerator { color: gtkalpha(currentColor, $hint_opacity); }
1402
1403
check,
1404
radio {
1405
&:dir(ltr) { margin-right: -8px; margin-left: -16px; }
1406
&:dir(rtl) { margin-right: -16px; margin-left: -8px; }
1407
}
1408
}
1409
1410
.csd.popup { border-radius: 2px; }
1411
1412
1413
/***************
1414
* Popovers *
1415
***************/
1416
popover.background {
1417
transition: $shadow_transition;
1418
padding: 0;
1419
box-shadow: $z-depth-2;
1420
background-color: $light_color;
1421
1422
&:backdrop { box-shadow: $z-depth-1; }
1423
1424
&, .csd & {
1425
border-style: solid;
1426
border-width: 1px;
1427
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.2) rgba(0, 0, 0, 0.3);
1428
border-radius: 2px + 1px;
1429
}
1430
1431
> list,
1432
> .view,
1433
> toolbar {
1434
border-style: none;
1435
box-shadow: none;
1436
background-color: transparent;
1437
}
1438
1439
&, .csd & {
1440
&.touch-selection,
1441
&.magnifier,
1442
&.osd { @extend %osd; }
1443
}
1444
1445
separator { margin: 4px 0; }
1446
1447
list separator { margin: 0; }
1448
1449
checkbutton,
1450
radiobutton { @extend modelbutton.flat; }
1451
}
1452
1453
/*************
1454
* Notebooks *
1455
*************/
1456
notebook {
1457
> header {
1458
border-width: 1px;
1459
border-color: $borders_color;
1460
background-color: $bg_color;
1461
background-clip: border-box;
1462
1463
&.top {
1464
border-bottom-style: solid;
1465
> tabs {
1466
margin-bottom: -1px;
1467
> tab {
1468
1469
&:hover { box-shadow: inset 0 -2px $track_color; }
1470
1471
&:checked { box-shadow: inset 0 -2px $selected_bg_color; }
1472
}
1473
}
1474
}
1475
1476
&.bottom {
1477
border-top-style: solid;
1478
> tabs {
1479
margin-top: -1px;
1480
> tab {
1481
1482
&:hover { box-shadow: inset 0 2px $track_color; }
1483
1484
&:checked { box-shadow: inset 0 2px $selected_bg_color; }
1485
}
1486
}
1487
}
1488
1489
&.left {
1490
border-right-style: solid;
1491
> tabs {
1492
margin-right: -1px;
1493
> tab {
1494
1495
&:hover { box-shadow: inset -2px 0 $track_color; }
1496
1497
&:checked { box-shadow: inset -2px 0 $selected_bg_color; }
1498
}
1499
}
1500
}
1501
1502
&.right {
1503
border-left-style: solid;
1504
> tabs {
1505
margin-left: -1px;
1506
> tab {
1507
1508
&:hover { box-shadow: inset 2px 0 $track_color; }
1509
1510
&:checked { box-shadow: inset 2px 0 $selected_bg_color; }
1511
}
1512
}
1513
}
1514
1515
&.top > tabs > arrow {
1516
@extend %notebook_vert_arrows;
1517
1518
border-top-style: none;
1519
}
1520
1521
&.bottom > tabs > arrow {
1522
@extend %notebook_vert_arrows;
1523
1524
border-bottom-style: none;
1525
}
1526
1527
@at-root %notebook_vert_arrows {
1528
padding-left: 4px;
1529
padding-right: 4px;
1530
1531
&.down {
1532
margin-left: -8px;
1533
-gtk-icon-source: -gtk-icontheme('pan-start-symbolic');
1534
}
1535
1536
&.up {
1537
margin-right: -8px;
1538
-gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
1539
}
1540
}
1541
1542
&.left > tabs > arrow {
1543
@extend %notebook_horz_arrows;
1544
1545
border-left-style: none;
1546
}
1547
1548
&.right > tabs > arrow {
1549
@extend %notebook_horz_arrows;
1550
1551
border-right-style: none;
1552
}
1553
1554
@at-root %notebook_horz_arrows {
1555
padding-top: 4px;
1556
padding-bottom: 4px;
1557
1558
&.down {
1559
margin-top: -8px;
1560
-gtk-icon-source: -gtk-icontheme('pan-up-symbolic');
1561
}
1562
1563
&.up {
1564
margin-bottom: -8px;
1565
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
1566
}
1567
}
1568
1569
> tabs > arrow {
1570
@extend %button_basic.flat;
1571
1572
min-height: 16px;
1573
min-width: 16px;
1574
border-radius: 0;
1575
}
1576
1577
tab {
1578
transition: $material_transition;
1579
min-height: 24px;
1580
min-width: 24px;
1581
padding: 6px 12px;
1582
1583
outline-offset: -6px;
1584
1585
border-width: 1px; // for reorderable tabs
1586
border-color: transparent; //
1587
1588
color: $secondary_fg_color;
1589
font-weight: 500;
1590
1591
&:hover {
1592
color: $fg_color;
1593
1594
&.reorderable-page {
1595
border-color: $borders_color;
1596
background-color: $secondary_base_color;
1597
}
1598
}
1599
1600
&:disabled { color: $insensitive_secondary_fg_color; }
1601
1602
&:checked {
1603
animation: tab_ripple_effect $material_slower * 3 $material_ease_out;
1604
color: $fg_color;
1605
1606
&:disabled { color: $insensitive_fg_color; }
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
}
1848
1849
&:hover slider { @include entry(focus); }
1850
1851
&:disabled slider { @include entry(insensitive); }
1852
1853
&:checked slider {
1854
transition: $material_transition, margin 0, background-image 0, background-color 0 $material_slower;
1855
animation: needs_attention $material_slower $material_ease_out;
1856
margin: -4px -4px -4px 0;
1857
background-color: $accent_bg_color;
1858
color: $selected_fg_color;
1859
}
1860
1861
&:checked:disabled slider { animation: none; }
1862
1863
row:selected & {
1864
}
1865
}
1866
1867
1868
/*************************
1869
* Check and Radio items *
1870
*************************/
1871
// draw regular check and radio items using our PNG assets
1872
// all assets are rendered from assets.svg. never add pngs directly
1873
1874
//selection-mode
1875
@each $s,$as in ('','-selectionmode'),
1876
(':hover', '-hover-selectionmode'),
1877
(':checked', '-checked-selectionmode'),
1878
(':checked:hover', '-checked-hover-selectionmode') {
1879
.view.content-view.check#{$s}:not(list) {
1880
-gtk-icon-shadow: $z-depth-1;
1881
-gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}#{$asset_suffix}.png"),
1882
url("assets/checkbox#{$as}#{$asset_suffix}@2.png"));
1883
margin: 8px;
1884
background-color: transparent;
1885
}
1886
}
1887
1888
checkbutton.text-button, radiobutton.text-button {
1889
// this is for a nice focus on check and radios text
1890
padding: 2px 0;
1891
outline-offset: 0;
1892
1893
label:not(:only-child) {
1894
&:first-child { margin-left: 4px; }
1895
1896
&:last-child { margin-right: 4px; }
1897
}
1898
}
1899
1900
check,
1901
radio {
1902
min-height: 24px;
1903
min-width: 24px;
1904
-gtk-icon-source: none;
1905
1906
margin: -12px -8px;
1907
padding: 12px;
1908
outline-offset: 4px;
1909
// border-radius: 100%;
1910
1911
@extend %button_basic.flat;
1912
1913
@extend %button_basic.image-button;
1914
1915
color: gtkalpha(currentColor, $enabled_opacity);
1916
1917
&:hover, &:active { color: currentColor; }
1918
1919
&:checked, &:checked:disabled { background-color: transparent; }
1920
1921
&:checked, &:indeterminate { color: $accent_bg_color; }
1922
1923
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_bg_color, $disabled_opacity); }
1924
1925
&:only-child { margin: -12px; }
1926
1927
.osd & {
1928
}
1929
1930
menu menuitem & {
1931
transition: none;
1932
margin: -16px -16px; // this is a workaround for a menu check/radio size allocation issue
1933
1934
&:not(:checked):not(:indeterminate):hover { color: gtkalpha(currentColor, $enabled_opacity); }
1935
1936
&, &:hover, &:disabled {
1937
background-image: none;
1938
// color: inherit;
1939
// animation: none;
1940
}
1941
}
1942
}
1943
1944
%check,
1945
check {
1946
& { -gtk-icon-source: image(-gtk-recolor(url("assets/check-unchecked-symbolic.svg")),
1947
-gtk-recolor(url("assets/check-unchecked-symbolic.png"))); }
1948
1949
&:checked { -gtk-icon-source: image(-gtk-recolor(url("assets/check-checked-symbolic.svg")),
1950
-gtk-recolor(url("assets/check-checked-symbolic.png"))); }
1951
1952
&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/check-dash-symbolic.svg")),
1953
-gtk-recolor(url("assets/check-dash-symbolic.png"))); }
1954
}
1955
1956
%radio,
1957
radio {
1958
border-image: -gtk-gradient(radial,
1959
center center, 0,
1960
center center, 0.001,
1961
to($accent_bg_color),
1962
to(transparent))
1963
24 / 24px;
1964
-gtk-icon-source: image(-gtk-recolor(url("assets/radio-unchecked-symbolic.svg")),
1965
-gtk-recolor(url("assets/radio-unchecked-symbolic.png")));
1966
1967
&:checked {
1968
border-image: -gtk-gradient(radial,
1969
center center, 0,
1970
center center, (10 / 48 / 2),
1971
to($accent_bg_color),
1972
to(transparent))
1973
24 / 24px;
1974
}
1975
1976
&:checked:disabled {
1977
border-image: -gtk-gradient(radial,
1978
center center, 0,
1979
center center, (10 / 48 / 2),
1980
to(scale-alpha($accent_bg_color, $disabled_opacity)),
1981
to(transparent))
1982
24 / 24px;
1983
}
1984
1985
&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-dash-symbolic.svg")),
1986
-gtk-recolor(url("assets/radio-dash-symbolic.png"))); }
1987
1988
&:indeterminate:checked {
1989
border-image: -gtk-gradient(radial,
1990
center center, 0,
1991
center center, 0.001,
1992
to($accent_bg_color),
1993
to(transparent))
1994
24 / 24px;
1995
}
1996
}
1997
1998
// let's animate things
1999
@keyframes check_check {
2000
from { -gtk-icon-transform: rotate(90deg); }
2001
to { -gtk-icon-transform: unset; }
2002
}
2003
2004
@keyframes check_radio {
2005
from { -gtk-icon-transform: scale(0); }
2006
to { -gtk-icon-transform: unset; }
2007
}
2008
2009
@keyframes check_indeterminate {
2010
from { -gtk-icon-transform: unset; }
2011
50% { -gtk-icon-transform: scale(0, 1); }
2012
to { -gtk-icon-transform: unset; }
2013
}
2014
2015
check:not(:indeterminate):checked { animation: check_check $material_slower $material_ease; }
2016
2017
check:not(:indeterminate):checked:active { animation: check_check $material_slower $material_ease, flat_ripple_effect $material_slower $material_ease_out forwards; }
2018
2019
// radio:not(:indeterminate):checked { animation: check_radio $material_slower $material_ease; }
2020
2021
check:indeterminate:checked, radio:indeterminate:checked { animation: check_indeterminate $material_slower $material_ease; }
2022
2023
check:indeterminate:checked:active, radio:indeterminate:checked:active { animation: check_indeterminate $material_slower $material_ease, flat_ripple_effect $material_slower $material_ease_out forwards; }
2024
2025
// no animations in menus
2026
menu menuitem {
2027
check:not(:indeterminate):checked,
2028
radio:not(:indeterminate):checked,
2029
check:indeterminate:checked,
2030
radio:indeterminate:checked { animation: none; }
2031
}
2032
2033
treeview.view check,
2034
treeview.view radio {
2035
// margin: -12px;
2036
// padding: 12px;
2037
padding: 0;
2038
2039
&:checked:hover, &:selected:checked:hover { background-image: none; }
2040
2041
& {
2042
color: $secondary_fg_color;
2043
2044
&:hover, &:active { color: $fg_color; }
2045
2046
&:disabled { color: $insensitive_secondary_fg_color; }
2047
2048
&:checked, &:indeterminate { color: $accent_bg_color; }
2049
2050
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_bg_color, $disabled_opacity); }
2051
}
2052
2053
&:selected {
2054
color: $secondary_selected_fg_color;
2055
2056
&:hover, &:active { color: $selected_fg_color; }
2057
2058
&:disabled { color: $insensitive_secondary_selected_fg_color; }
2059
2060
&:checked, &:indeterminate { color: $accent_bg_color; }
2061
2062
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_bg_color, $disabled_opacity); }
2063
}
2064
}
2065
2066
treeview.view radio:checked {
2067
-gtk-icon-source: image(-gtk-recolor(url("assets/radio-checked-symbolic.svg")),
2068
-gtk-recolor(url("assets/radio-checked-symbolic.png")));
2069
border-image: none;
2070
}
2071
2072
2073
/************
2074
* GtkScale *
2075
************/
2076
scale {
2077
// sizing
2078
2079
$_marks_lenght: 8px;
2080
$_marks_distance: 8px;
2081
2082
min-height: 12px;
2083
min-width: 12px;
2084
padding: 12px;
2085
2086
* { transition: $material_transition; }
2087
2088
// the slider is inside the trough, so to have make it bigger there's a negative margin
2089
slider {
2090
min-height: $small_size;
2091
min-width: $small_size;
2092
margin: -10px;
2093
}
2094
2095
// the backing bit
2096
trough {
2097
outline-offset: 2px;
2098
background-color: $track_color;
2099
2100
&:disabled { color: $insensitive_fg_color; }
2101
}
2102
2103
// the colored part of the backing bit
2104
highlight {
2105
background-color: $accent_bg_color;
2106
2107
&:disabled { background-color: transparent; }
2108
}
2109
2110
// this is another differently styled part of the backing bit, the most relevant use case is for example
2111
// in media player to indicate how much video stream as been cached
2112
fill {
2113
background-color: $track_color;
2114
2115
&:disabled { background-color: transparent; }
2116
}
2117
2118
slider {
2119
transition: all $material_faster $material_ease;
2120
// border-radius: 100%;
2121
// background-color: $accent_bg_color;
2122
background-repeat: no-repeat;
2123
background-position: center;
2124
2125
@each $s,$as in ('',''),
2126
(':disabled','-insensitive') {
2127
&#{$s} {
2128
$_url: 'assets/slider#{$as}#{$asset_suffix}';
2129
background-image: -gtk-scaled(url('#{$_url}.png'),
2130
url('#{$_url}@2.png'));
2131
}
2132
}
2133
2134
background-size: calc(100% - 8px);
2135
2136
&:hover { background-size: calc(100% - 4px); }
2137
2138
&:active { background-size: calc(100% - 0px); }
2139
}
2140
2141
// click-and-hold the slider to activate
2142
&.fine-tune {
2143
// to make the slider shrink in fine-tune mode
2144
slider { background-size: calc(100% - 12px); }
2145
}
2146
2147
value { color: gtkalpha(currentColor, $hint_opacity); }
2148
2149
marks {
2150
color: $track_color;
2151
2152
@each $marks_class, $marks_pos, $marks_margin in (top, top, bottom),
2153
(bottom, bottom, top),
2154
(top, left, right),
2155
(bottom, right, left) {
2156
&.#{$marks_class} {
2157
margin-#{$marks_margin}: $_marks_distance;
2158
margin-#{$marks_pos}: -($_marks_distance + $_marks_lenght);
2159
}
2160
}
2161
}
2162
2163
&.horizontal {
2164
indicator {
2165
min-height: $_marks_lenght;
2166
min-width: 1px;
2167
}
2168
}
2169
2170
&.vertical {
2171
indicator {
2172
min-height: 1px;
2173
min-width: $_marks_lenght;
2174
}
2175
}
2176
2177
// *WARNING* scale with marks madness following
2178
2179
// FIXME: OSD and selected list rows missing, I don't feel like adding the other 144 assets needed for those...
2180
$suffix: if($variant == 'light', '', '-dark');
2181
2182
@each $dir_class, $dir_infix in ('horizontal', 'horz'),
2183
('vertical', 'vert') {
2184
@each $marks_infix, $nth_child in ('scale-has-marks-above', ':last-child:not(:only-child)'),
2185
('scale-has-marks-below', ':first-child:not(:only-child)') {
2186
@each $state, $state_infix in ('', ''),
2187
(':disabled', '-insensitive') {
2188
&.#{$dir_class} {
2189
%#{$marks_infix}-#{$dir_infix},
2190
contents#{$nth_child} > trough > slider {
2191
&#{$state} {
2192
$_scale_asset: 'assets/slider-#{$dir_infix}-#{$marks_infix}#{$state_infix}#{$suffix}';
2193
2194
background-image: -gtk-scaled(url('#{$_scale_asset}.png'), url('#{$_scale_asset}@2.png'));
2195
}
2196
2197
@if $dir_class == 'horizontal' {
2198
min-height: 30px;
2199
min-width: $small_size;
2200
2201
@if $marks_infix == 'scale-has-marks-above' {
2202
margin-top: -16px;
2203
2204
background-position: center calc(100% - 4px);
2205
2206
&:hover { background-position: center calc(100% - 2px); }
2207
2208
&:active { background-position: center calc(100% - 0px); }
2209
}
2210
2211
@if $marks_infix == 'scale-has-marks-below' {
2212
margin-bottom: -16px;
2213
2214
background-position: center calc(4px);
2215
2216
&:hover { background-position: center calc(2px); }
2217
2218
&:active { background-position: center calc(0px); }
2219
}
2220
}
2221
2222
@if $dir_class == 'vertical' {
2223
min-height: $small_size;
2224
min-width: 30px;
2225
2226
@if $marks_infix == 'scale-has-marks-above' {
2227
margin-left: -16px;
2228
2229
background-position: calc(4px) center;
2230
2231
&:hover { background-position: calc(2px) center; }
2232
2233
&:active { background-position: calc(0px) center; }
2234
}
2235
2236
@if $marks_infix == 'scale-has-marks-below' {
2237
margin-right: -16px;
2238
2239
background-position: calc(100% - 4px) center;
2240
2241
&:hover { background-position: calc(100% - 2px) center; }
2242
2243
&:active { background-position: calc(100% - 0px) center; }
2244
}
2245
}
2246
}
2247
2248
@at-root %#{$marks_infix}-#{$dir_infix}-fine-tune,
2249
&.fine-tune contents#{$nth_child} > trough > slider {
2250
// bigger negative margins to make the trough grow here as well
2251
2252
@if $dir_class == 'horizontal' {
2253
@if $marks_infix == 'scale-has-marks-above' { background-position: center calc(100% - 6px); }
2254
2255
@if $marks_infix == 'scale-has-marks-below' { background-position: center calc(6px); }
2256
}
2257
2258
@if $dir_class == 'vertical' {
2259
@if $marks_infix == 'scale-has-marks-above' { background-position: calc(6px) center; }
2260
2261
@if $marks_infix == 'scale-has-marks-below' { background-position: calc(100% - 6px) center; }
2262
}
2263
}
2264
}
2265
}
2266
}
2267
}
2268
2269
&.color {
2270
min-height: 0;
2271
min-width: 0;
2272
2273
&.horizontal {
2274
padding: 0 0 12px 0;
2275
2276
trough {
2277
padding-bottom: $bar_size;
2278
}
2279
2280
slider {
2281
@extend %scale-has-marks-above-horz;
2282
2283
margin-bottom: -10px - $bar_size;
2284
margin-top: 0;
2285
}
2286
}
2287
2288
&.vertical {
2289
&:dir(ltr) {
2290
padding: 0 0 0 12px;
2291
2292
trough {
2293
padding-left: $bar_size;
2294
}
2295
2296
slider {
2297
@extend %scale-has-marks-below-vert;
2298
2299
margin-left: -10px - $bar_size;
2300
margin-right: 0;
2301
}
2302
}
2303
2304
&:dir(rtl) {
2305
padding: 0 12px 0 0;
2306
2307
trough {
2308
padding-right: $bar_size;
2309
}
2310
2311
slider {
2312
@extend %scale-has-marks-above-vert;
2313
2314
margin-right: -10px - $bar_size;
2315
margin-left: 0;
2316
}
2317
}
2318
}
2319
2320
&.fine-tune {
2321
&.horizontal {
2322
slider {
2323
@extend %scale-has-marks-above-horz-fine-tune;
2324
}
2325
}
2326
2327
&.vertical {
2328
&:dir(ltr) {
2329
slider {
2330
@extend %scale-has-marks-below-vert-fine-tune;
2331
}
2332
}
2333
2334
&:dir(rtl) {
2335
slider {
2336
@extend %scale-has-marks-above-vert-fine-tune;
2337
}
2338
}
2339
}
2340
}
2341
}
2342
}
2343
2344
2345
/*****************
2346
* Progress bars *
2347
*****************/
2348
progressbar {
2349
// sizing
2350
&.horizontal {
2351
trough,
2352
progress { min-height: $bar_size; }
2353
}
2354
2355
&.vertical {
2356
trough,
2357
progress { min-width: $bar_size; }
2358
}
2359
2360
// FIXME: insensitive state missing and some other state should be set probably
2361
color: $tertiary_fg_color;
2362
font-size: smaller;
2363
2364
trough { background-color: scale-alpha($selected_bg_color, $lower_opacity); }
2365
2366
progress { background-color: $selected_bg_color; }
2367
2368
&.osd { // progressbar.osd used for epiphany page loading progress
2369
// min-width: $bar_size;
2370
// min-height: $bar_size;
2371
// background-color: transparent;
2372
2373
// trough { background-color: transparent; }
2374
2375
progress {
2376
}
2377
}
2378
}
2379
2380
2381
/*************
2382
* Level Bar *
2383
*************/
2384
levelbar {
2385
block {
2386
min-width: $medium_size;
2387
min-height: $bar_size;
2388
}
2389
2390
&.vertical block {
2391
min-width: $bar_size;
2392
min-height: $medium_size;
2393
}
2394
2395
trough {
2396
padding: 2px;
2397
border-radius: 2px;
2398
2399
@include entry(normal);
2400
2401
&:disabled { @include entry(insensitive); }
2402
}
2403
2404
&.horizontal.discrete block { margin: 0 1px; }
2405
2406
&.vertical.discrete block { margin: 1px 0; }
2407
2408
&.horizontal.discrete trough { padding: 2px 1px; }
2409
2410
&.vertical.discrete trough { padding: 1px 2px; }
2411
2412
block {
2413
&.low {
2414
background-color: $warning_color;
2415
}
2416
2417
&.high {
2418
background-color: $selected_bg_color;
2419
}
2420
2421
&.full {
2422
background-color: $success_color;
2423
}
2424
2425
&.empty {
2426
background-color: $track_color;
2427
color: $insensitive_fg_color;
2428
}
2429
}
2430
}
2431
2432
2433
/****************
2434
* Print dialog *
2435
*****************/
2436
printdialog {
2437
paper {
2438
padding: 0;
2439
border: 1px solid $borders_color;
2440
background: $base_color;
2441
color: $fg_color;
2442
}
2443
2444
.dialog-action-box { margin: 12px; }
2445
}
2446
2447
2448
/**********
2449
* Frames *
2450
**********/
2451
frame > border,
2452
.frame {
2453
margin: 0;
2454
padding: 0;
2455
border: 1px solid $borders_color;
2456
border-radius: 0;
2457
box-shadow: none;
2458
2459
&.flat { border-style: none; }
2460
}
2461
2462
actionbar > revealer > box {
2463
padding: $container_padding;
2464
border-top: 1px solid $borders_color;
2465
}
2466
2467
scrolledwindow {
2468
viewport.frame { // avoid double borders when viewport inside scrolled window
2469
border-style: none;
2470
}
2471
2472
// This is used when content is touch-dragged past boundaries.
2473
// draws a box on top of the content, the size changes programmatically.
2474
overshoot {
2475
&.top { @include overshoot(top); }
2476
2477
&.bottom { @include overshoot(bottom); }
2478
2479
&.left { @include overshoot(left); }
2480
2481
&.right { @include overshoot(right); }
2482
}
2483
2484
// Overflow indication, works similarly to the overshoot, the size if fixed tho.
2485
undershoot {
2486
&.top { @include undershoot(top); }
2487
2488
&.bottom { @include undershoot(bottom); }
2489
2490
&.left { @include undershoot(left); }
2491
2492
&.right { @include undershoot(right); }
2493
}
2494
2495
junction { // the small square between two scrollbars
2496
border-style: solid none none solid;
2497
border-width: 1px;
2498
border-color: $borders_color;
2499
background-color: $base_color;
2500
2501
&:dir(rtl) { border-style: solid solid none none; }
2502
}
2503
}
2504
2505
//vbox and hbox separators
2506
separator {
2507
min-width: 1px;
2508
min-height: 1px;
2509
background: $borders_color;
2510
}
2511
2512
2513
/*********
2514
* Lists *
2515
*********/
2516
list {
2517
border-color: $borders_color;
2518
background-color: $base_color;
2519
2520
row { padding: 2px; }
2521
}
2522
2523
row {
2524
transition: $material_transition;
2525
2526
&:hover { transition: none; }
2527
2528
&.activatable {
2529
background-image: radial-gradient(circle farthest-corner at center,
2530
gtkalpha(currentColor, 0) 100%,
2531
transparent 0%),
2532
image(gtkalpha(currentColor, 0));
2533
2534
&:hover {
2535
background-image: radial-gradient(circle farthest-corner at center,
2536
gtkalpha(currentColor, 0) 100%,
2537
transparent 0%),
2538
image(gtkalpha(currentColor, 0.05));
2539
}
2540
2541
&.has-open-popup, // this is for indicathing which row generated a popover see https://bugzilla.gnome.org/show_bug.cgi?id=754411
2542
&:active {
2543
transition: $material_transition, background-image 0;
2544
animation: row_ripple_effect $material_slower $material_ease_out forwards;
2545
}
2546
}
2547
2548
&:selected { @extend %selected_items; }
2549
}
2550
2551
2552
/*********************
2553
* App Notifications *
2554
*********************/
2555
.app-notification,
2556
.app-notification.frame {
2557
@extend %osd;
2558
2559
@extend toolbar.osd;
2560
2561
margin: 8px;
2562
2563
border { border: none; }
2564
}
2565
2566
2567
/*************
2568
* Expanders *
2569
*************/
2570
expander {
2571
arrow {
2572
transition: all $material_faster $material_ease;
2573
min-width: 16px;
2574
min-height: 16px;
2575
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
2576
-gtk-icon-transform: rotate(-90deg);
2577
2578
&:dir(rtl) { -gtk-icon-transform: rotate(90deg); }
2579
2580
&:checked { -gtk-icon-transform: unset; }
2581
2582
color: $secondary_fg_color;
2583
2584
&:hover, &:active { color: $fg_color; }
2585
2586
&:disabled { color: $insensitive_secondary_fg_color; }
2587
2588
&:selected {
2589
color: $secondary_selected_fg_color;
2590
2591
&:hover, &:active { color: $selected_fg_color; }
2592
2593
&:disabled { color: $insensitive_secondary_selected_fg_color; }
2594
}
2595
}
2596
}
2597
2598
2599
/************
2600
* Calendar *
2601
***********/
2602
calendar {
2603
padding: 1px;
2604
border: 1px solid $borders_color;
2605
color: $fg_color;
2606
2607
&:disabled { color: $insensitive_fg_color; }
2608
2609
&:selected {
2610
@extend %selected_items;
2611
2612
border-radius: 2px + 1px;
2613
}
2614
2615
&.header {
2616
border: none;
2617
border-bottom: 1px solid $borders_color;
2618
border-radius: 0;
2619
}
2620
2621
&.button { @extend %button_basic.flat; }
2622
2623
&:indeterminate { color: gtkalpha(currentColor, $disabled_opacity); }
2624
2625
&.highlight {
2626
color: gtkalpha(currentColor, $hint_opacity);
2627
font-weight: 500;
2628
}
2629
}
2630
2631
2632
/***********
2633
* Dialogs *
2634
***********/
2635
messagedialog { // Message Dialog styling
2636
&.background { background-color: $light_color; }
2637
2638
.titlebar {
2639
min-height: $small_size;
2640
border-style: none;
2641
box-shadow: inset 0 1px $highlight_color;
2642
background-color: $light_color;
2643
}
2644
2645
&.csd { // rounded bottom border styling for csd version
2646
&.background {
2647
// bigger radius for better antialiasing
2648
border-bottom-left-radius: 2px;
2649
border-bottom-right-radius: 2px;
2650
}
2651
2652
.dialog-action-area button {
2653
padding: 8px 16px;
2654
border-top: 1px solid $borders_color;
2655
border-radius: 0;
2656
2657
@extend %button_basic.flat;
2658
2659
&:first-child{ border-bottom-left-radius: 2px; }
2660
2661
&:last-child { border-bottom-right-radius: 2px; }
2662
}
2663
}
2664
}
2665
2666
filechooser {
2667
.dialog-action-box { border-top: 1px solid $borders_color; }
2668
2669
#pathbarbox { border-bottom: 1px solid $borders_color; }
2670
}
2671
2672
filechooserbutton:drop(active) {
2673
box-shadow: none;
2674
}
2675
2676
2677
/***********
2678
* Sidebar *
2679
***********/
2680
.sidebar {
2681
border-style: none;
2682
background-color: $light_color;
2683
2684
@at-root %sidebar_left,
2685
&:dir(ltr),
2686
&.left,
2687
&.left:dir(rtl) {
2688
border-right: 1px solid $borders_color;
2689
border-left-style: none;
2690
}
2691
2692
@at-root %sidebar_right
2693
&:dir(rtl),
2694
&.right {
2695
border-left: 1px solid $borders_color;
2696
border-right-style: none;
2697
}
2698
2699
list { background-color: transparent; }
2700
2701
paned & { &.left, &.right, &.left:dir(rtl), &:dir(rtl), &:dir(ltr), & { border-style: none; }}
2702
}
2703
2704
stacksidebar {
2705
&.sidebar {
2706
&:dir(ltr),
2707
&.left,
2708
&.left:dir(rtl) { list { @extend %sidebar_left; }}
2709
2710
&:dir(rtl),
2711
&.right { list { @extend %sidebar_right; }}
2712
}
2713
2714
row {
2715
padding: 10px 4px;
2716
2717
> label {
2718
padding-left: 6px;
2719
padding-right: 6px;
2720
}
2721
2722
&.needs-attention > label { @extend %needs_attention; }
2723
}
2724
}
2725
2726
2727
/****************
2728
* File chooser *
2729
****************/
2730
placessidebar {
2731
> viewport.frame { border-style: none; }
2732
2733
row {
2734
// Needs overriding of the GtkListBoxRow padding
2735
min-height: 32px;
2736
padding: 0;
2737
2738
// Using margins/padding directly in the SidebarRow
2739
// will make the animation of the new bookmark row jump
2740
> revealer { padding: 0 12px; }
2741
2742
&:selected { color: $selected_fg_color; }
2743
2744
&:disabled { color: $insensitive_fg_color; }
2745
2746
image.sidebar-icon {
2747
opacity: $hint_opacity; // dim the device icons
2748
2749
&:dir(ltr) { padding-right: 8px; }
2750
&:dir(rtl) { padding-left: 8px; }
2751
}
2752
2753
label.sidebar-label {
2754
&:dir(ltr) { padding-right: 2px; }
2755
&:dir(rtl) { padding-left: 2px; }
2756
}
2757
2758
@at-root button.sidebar-button {
2759
@extend %button_basic.flat;
2760
2761
min-height: $small_size;
2762
min-width: $small_size;
2763
margin-top: 0;
2764
margin-bottom: 0;
2765
padding: 0;
2766
border-radius: 100%;
2767
-gtk-outline-radius: 100%;
2768
2769
row:selected & { @extend %button_selected.flat; }
2770
}
2771
2772
&.sidebar-placeholder-row {
2773
min-height: 2px;
2774
padding: 0 8px;
2775
background-image: image($accent_bg_color);
2776
background-clip: content-box;
2777
}
2778
2779
&.sidebar-new-bookmark-row { color: $accent_bg_color; }
2780
2781
&:drop(active):not(:disabled) {
2782
box-shadow: inset 0 0 0 2px $accent_bg_color;
2783
2784
&:selected {
2785
// background-color: $accent_bg_color;
2786
// color: $selected_fg_color;
2787
}
2788
}
2789
}
2790
}
2791
2792
placesview {
2793
.server-list-button > image { -gtk-icon-transform: rotate(0turn); }
2794
2795
.server-list-button:checked > image { -gtk-icon-transform: rotate(-0.5turn); }
2796
2797
// this selects the "connect to server" label
2798
> actionbar > revealer > box > label {
2799
padding-left: 8px;
2800
padding-right: 8px;
2801
}
2802
}
2803
2804
2805
/*********
2806
* Paned *
2807
*********/
2808
paned {
2809
> separator {
2810
min-width: 1px;
2811
min-height: 1px;
2812
-gtk-icon-source: none; // defeats the ugly default handle decoration
2813
border-style: none; // just to be sure
2814
background-color: transparent;
2815
// workaround, using background istead of a border since the border will get rendered twice (?)
2816
background-image: image($borders_color);
2817
background-size: 1px 1px;
2818
2819
&.wide {
2820
min-width: 6px;
2821
min-height: 6px;
2822
background-color: $bg_color;
2823
background-image: image($borders_color), image($borders_color);
2824
background-size: 1px 1px, 1px 1px;
2825
}
2826
}
2827
2828
&.horizontal > separator {
2829
background-repeat: repeat-y;
2830
2831
&:dir(ltr) {
2832
margin: 0 -8px 0 0;
2833
padding: 0 8px 0 0;
2834
background-position: left;
2835
}
2836
2837
&:dir(rtl) {
2838
margin: 0 0 0 -8px;
2839
padding: 0 0 0 8px;
2840
background-position: right;
2841
}
2842
2843
&.wide {
2844
margin: 0;
2845
padding: 0;
2846
background-repeat: repeat-y, repeat-y;
2847
background-position: left, right;
2848
}
2849
}
2850
2851
&.vertical > separator {
2852
margin: 0 0 -8px 0;
2853
padding: 0 0 8px 0;
2854
background-repeat: repeat-x;
2855
background-position: top;
2856
2857
&.wide {
2858
margin: 0;
2859
padding: 0;
2860
background-repeat: repeat-x, repeat-x;
2861
background-position: bottom, top;
2862
}
2863
}
2864
}
2865
2866
2867
/**************
2868
* GtkInfoBar *
2869
**************/
2870
infobar { border-style: none; }
2871
2872
.info { background-color: $info_bg_color; }
2873
2874
.question { background-color: $question_bg_color; }
2875
2876
.warning { background-color: $warning_bg_color; }
2877
2878
.error { background-color: $error_bg_color; }
2879
2880
.info,
2881
.question,
2882
.warning,
2883
.error {
2884
color: $selected_fg_color;
2885
2886
button { @extend %button_selected; }
2887
2888
label:selected {
2889
}
2890
2891
*:link { @extend %link_selected; }
2892
}
2893
2894
2895
/************
2896
* Tooltips *
2897
************/
2898
tooltip {
2899
&.background {
2900
// background-color needs to be set this way otherwise it gets drawn twice
2901
// see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details.
2902
background-color: scale-alpha($base_color, $higher_opacity);
2903
}
2904
2905
// @extend %osd;
2906
2907
// padding: 4px; /* not working */
2908
border-radius: 2px;
2909
box-shadow: none; // otherwise it gets inherited by windowframe.csd
2910
2911
// FIXME: we need a border or tooltips vanish on black background.
2912
decoration { background-color: transparent; }
2913
2914
label {
2915
min-height: 32px - 6px * 2;
2916
padding: 2px 8px - 6px;
2917
}
2918
2919
* { // Yeah this is ugly
2920
padding: 0;
2921
background-color: transparent;
2922
color: inherit;
2923
}
2924
}
2925
2926
2927
/*****************
2928
* Color Chooser *
2929
*****************/
2930
colorswatch {
2931
// This widget is made of two boxes one on top of the other, the lower box is colorswatch {} the other one
2932
// is colorswatch overlay {}, colorswatch has the programmatically set background, so most of the style is
2933
// applied to the overlay box.
2934
2935
// base color corners rounding
2936
// to avoid the artifacts caused by rounded corner anti-aliasing the base color
2937
// sports a bigger radius.
2938
// nth-child is needed by the custom color strip.
2939
2940
&.top {
2941
border-top-left-radius: $material_radius + 0.5px;
2942
border-top-right-radius: $material_radius + 0.5px;
2943
2944
overlay {
2945
border-top-left-radius: $material_radius;
2946
border-top-right-radius: $material_radius;
2947
}
2948
}
2949
2950
&.bottom {
2951
border-bottom-left-radius: $material_radius + 0.5px;
2952
border-bottom-right-radius: $material_radius + 0.5px;
2953
2954
overlay {
2955
border-bottom-left-radius: $material_radius;
2956
border-bottom-right-radius: $material_radius;
2957
}
2958
}
2959
2960
&.left,
2961
&:first-child:not(.top) {
2962
border-top-left-radius: $material_radius + 0.5px;
2963
border-bottom-left-radius: $material_radius + 0.5px;
2964
2965
overlay {
2966
border-top-left-radius: $material_radius;
2967
border-bottom-left-radius: $material_radius;
2968
}
2969
}
2970
2971
&.right,
2972
&:last-child:not(.bottom) {
2973
border-top-right-radius: $material_radius + 0.5px;
2974
border-bottom-right-radius: $material_radius + 0.5px;
2975
2976
overlay {
2977
border-top-right-radius: $material_radius;
2978
border-bottom-right-radius: $material_radius;
2979
}
2980
}
2981
2982
&.dark overlay { color: white; }
2983
2984
&.light overlay { color: scale-alpha(black, 0.8); }
2985
2986
&.dark { color: white; } // for focus ring
2987
2988
&.light { color: scale-alpha(black, 0.8); } // for focus ring
2989
2990
&:drop(active) {
2991
box-shadow: none;
2992
2993
&.light overlay {
2994
box-shadow: $z-depth-1, 0 0 0 2px $accent_bg_color;
2995
}
2996
2997
&.dark overlay {
2998
box-shadow: $z-depth-1, 0 0 0 2px $accent_bg_color;
2999
}
3000
}
3001
3002
overlay {
3003
transition: $shadow_transition;
3004
box-shadow: $z-depth-1;
3005
3006
&:hover { box-shadow: $z-depth-2; }
3007
}
3008
3009
&#add-color-button {
3010
border-radius: $material_radius $material_radius 0 0;
3011
color: white; // for focus ring
3012
3013
&:only-child { border-radius: $material_radius; }
3014
3015
overlay {
3016
background-image: linear-gradient(to right,
3017
$error_bg_color 25%,
3018
$warning_bg_color 25%, $warning_bg_color 50%,
3019
$info_bg_color 50%, $info_bg_color 75%,
3020
$question_bg_color 75%);
3021
color: white;
3022
}
3023
}
3024
3025
&:disabled {
3026
opacity: $disabled_opacity;
3027
3028
overlay { box-shadow: none; }
3029
}
3030
3031
row:selected & {
3032
}
3033
3034
&#editor-color-sample {
3035
border-radius: $material_radius + 0.5px;
3036
3037
overlay { border-radius: $material_radius; }
3038
3039
// overlay:hover { box-shadow: $z-depth-1; }
3040
}
3041
}
3042
3043
// colorscale popup
3044
colorchooser .popover.osd {
3045
transition: $shadow_transition;
3046
border-radius: 2px;
3047
box-shadow: $z-depth-2;
3048
background-color: $base_color;
3049
3050
&:backdrop { box-shadow: $z-depth-1; }
3051
3052
spinbutton:not(.vertical) { @extend %entry.flat; }
3053
}
3054
3055
3056
/********
3057
* Misc *
3058
********/
3059
//content view (grid/list)
3060
.content-view {
3061
background-color: $bg_color;
3062
3063
// &:hover { -gtk-icon-effect: highlight; }
3064
3065
rubberband { @extend rubberband; }
3066
}
3067
3068
.scale-popup {
3069
.osd & { @extend %osd; }
3070
3071
.osd & button.flat { //FIXME: quick hack, redo properly
3072
}
3073
3074
button { // +/- buttons on GtkVolumeButton popup
3075
}
3076
}
3077
3078
3079
/**********************
3080
* Window Decorations *
3081
*********************/
3082
decoration {
3083
transition: $shadow_transition;
3084
border-radius: 2px 2px 0 0;
3085
box-shadow: $z-depth-4, 0 16px 16px transparent;
3086
3087
// FIXME rationalize shadows
3088
3089
// this is used for the resize cursor area
3090
margin: 8px;
3091
3092
&:backdrop {
3093
// the transparent shadow here is to enforce that the shadow extents don't
3094
// change when we go to backdrop, to prevent jumping windows.
3095
// The biggest shadow should be in the same order then in the active state
3096
// or the jumping will happen during the transition.
3097
box-shadow: $z-depth-2, 0 16px 16px transparent;
3098
}
3099
3100
.fullscreen &,
3101
.tiled & { border-radius: 0; }
3102
3103
.popup & { box-shadow: none; }
3104
3105
// server-side decorations as used by mutter
3106
.ssd & { box-shadow: 0 3px 3px rgba(0, 0, 0, 0.16); } //just doing borders, wm draws actual shadows
3107
3108
.csd.popup & {
3109
border-radius: 2px;
3110
box-shadow: $z-depth-2;
3111
}
3112
3113
tooltip.csd & {
3114
border-radius: 2px;
3115
box-shadow: $z-depth-2;
3116
}
3117
3118
messagedialog.csd & {
3119
border-radius: 2px;
3120
// box-shadow: $z-depth-4, 0 16px 16px transparent;
3121
3122
// &:backdrop { box-shadow: $z-depth-2, 0 16px 16px transparent; }
3123
}
3124
3125
.solid-csd & {
3126
margin: 4px;
3127
// border: solid 1px $borders_color;
3128
border-radius: 0;
3129
box-shadow: none;
3130
background-color: $bg_color;
3131
}
3132
}
3133
3134
// Window Close button
3135
button.titlebutton {
3136
// @extend %button_basic.flat;
3137
3138
@extend %button_basic.image-button;
3139
3140
.selection-mode & {
3141
}
3142
}
3143
3144
3145
// catch all extend :)
3146
3147
%selected_items {
3148
background-color: $selected_bg_color;
3149
3150
@at-root %nobg_selected_items, & {
3151
color: $selected_fg_color;
3152
3153
&:disabled { color: $insensitive_selected_fg_color; }
3154
}
3155
}
3156
3157
.monospace { font: Monospace; }
3158
3159
3160
/**********************
3161
* Touch Copy & Paste *
3162
*********************/
3163
//touch selection handlebars for the Popover.osd above
3164
cursor-handle {
3165
border-radius: 100px;
3166
background-color: $accent_bg_color;
3167
background-image: none;
3168
3169
&.top:dir(ltr), &.bottom:dir(rtl) {
3170
padding-left: 6px;
3171
border-top-right-radius: 0;
3172
}
3173
3174
&.bottom:dir(ltr), &.top:dir(rtl) {
3175
padding-right: 6px;
3176
border-top-left-radius: 0;
3177
}
3178
3179
&.insertion-cursor:dir(ltr), &.insertion-cursor:dir(rtl) {
3180
-GtkWidget-text-handle-width: 24;
3181
-GtkWidget-text-handle-height: 30;
3182
3183
$_url: 'assets/slider-horz-scale-has-marks-above#{$asset_suffix}';
3184
-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'),
3185
url('#{$_url}@2.png'));
3186
}
3187
}
3188
3189
.context-menu { font: initial; } // Decouple the font of context menus from their entry/textview
3190
3191
button.circular { // FIXME: aggregate to buttons
3192
border-radius: 100px;
3193
-gtk-outline-radius: 100px;
3194
3195
label { padding: 0; }
3196
}
3197
3198
// shortcut window keys
3199
.keycap {
3200
min-width: 28px - 8px * 2;
3201
min-height: 28px - 2px;
3202
margin-top: 2px;
3203
padding-bottom: 2px;
3204
padding-left: 8px;
3205
padding-right: 8px;
3206
3207
border: solid 1px $borders_color;
3208
border-radius: 2px + 1px;
3209
box-shadow: inset 0 -2px $borders_color;
3210
background-color: $base_color;
3211
color: $fg_color;
3212
font-size: smaller;
3213
}
3214
3215
*:drop(active) { // FIXME needs to be done widget by widget, this wildcard should really die
3216
transition: $material_transition;
3217
box-shadow: $z-depth-1, inset 0 0 0 2px $accent_bg_color;
3218
caret-color: $accent_bg_color;
3219
}
3220
3221
stackswitcher button.text-button { min-width: 100px; } // FIXME aggregate with buttons
3222
3223
stackswitcher button.circular,
3224
stackswitcher button.text-button.circular { // FIXME aggregate with buttons
3225
min-width: $medium_size;
3226
min-height: $medium_size;
3227
padding: 0;
3228
}
3229