_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
> tab:not(.reorderable-page) {
1467
margin-bottom: -1px;
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
> tab:not(.reorderable-page) {
1480
margin-top: -1px;
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
> tab:not(.reorderable-page) {
1493
margin-right: -1px;
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
> tab:not(.reorderable-page) {
1506
margin-left: -1px;
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
color: $fg_color;
1604
1605
&:disabled { color: $insensitive_fg_color; }
1606
1607
&:not(.reorderable-page) { animation: tab_ripple_effect $material_slower * 3 $material_ease_out; }
1608
1609
&.reorderable-page {
1610
border-color: $borders_color;
1611
background-color: $base_color;
1612
}
1613
}
1614
1615
// colors the button like the label, overridden otherwise
1616
button.flat {
1617
// FIXME: generalize .small-button?
1618
min-width: $small_size;
1619
min-height: $small_size;
1620
padding: 0;
1621
1622
@extend %button_basic.image-button;
1623
1624
&:last-child {
1625
margin-left: 6px;
1626
margin-right: -6px;
1627
}
1628
1629
&:first-child {
1630
margin-left: -6px;
1631
margin-right: 6px;
1632
}
1633
}
1634
}
1635
1636
&.top,
1637
&.bottom {
1638
tabs {
1639
padding-left: 8px;
1640
padding-right: 8px;
1641
1642
&:not(:only-child) {
1643
&:first-child { margin-left: 0; }
1644
&:last-child { margin-right: 0; }
1645
}
1646
1647
tab {
1648
&.reorderable-page {
1649
margin: 0 -1px;
1650
border-style: none solid;
1651
}
1652
}
1653
}
1654
}
1655
1656
&.left,
1657
&.right {
1658
tabs {
1659
padding-top: 8px;
1660
padding-bottom: 8px;
1661
1662
&:not(:only-child) {
1663
&:first-child { margin-top: 0; }
1664
&:last-child { margin-bottom: 0; }
1665
}
1666
1667
tab {
1668
&.reorderable-page {
1669
margin: -1px 0;
1670
border-style: solid none;
1671
}
1672
}
1673
}
1674
}
1675
}
1676
1677
> stack:not(:only-child) { // the :not(:only-child) is for "hidden" notebooks
1678
background-color: $base_color;
1679
1680
entry,
1681
spinbutton:not(.vertical) { @extend %entry.flat; }
1682
1683
revealer entry,
1684
revealer spinbutton:not(.vertical) { @extend %entry; }
1685
1686
spinbutton:not(.vertical) entry { @extend %spinbutton_entry; }
1687
}
1688
}
1689
1690
1691
/**************
1692
* Scrollbars *
1693
**************/
1694
scrollbar {
1695
$_slider_min_length: 24px;
1696
1697
// disable steppers
1698
@at-root * {
1699
-GtkScrollbar-has-backward-stepper: false;
1700
-GtkScrollbar-has-forward-stepper: false;
1701
}
1702
1703
transition: $material_transition;
1704
background-color: $base_color;
1705
background-clip: $extra_background_clip;
1706
1707
// scrollbar border
1708
&.top { border-bottom: 1px solid $borders_color; }
1709
&.bottom { border-top: 1px solid $borders_color; }
1710
&.left { border-right: 1px solid $borders_color; }
1711
&.right { border-left: 1px solid $borders_color; }
1712
1713
// slider
1714
slider {
1715
transition: all $material_faster $material_ease_out, margin 0, border-width 0;
1716
min-width: 8px;
1717
min-height: 8px;
1718
border: 4px solid transparent;
1719
border-radius: 100px;
1720
background-clip: padding-box;
1721
background-color: $tertiary_fg_color;
1722
1723
&:hover { background-color: $secondary_fg_color; }
1724
1725
&:active { background-color: $fg_color; }
1726
1727
&:disabled { background-color: $insensitive_tertiary_fg_color; }
1728
}
1729
1730
&.fine-tune {
1731
slider {
1732
transition: all $material_faster $material_ease_out, margin 0, border-width 0, min-width 0, min-height 0;
1733
min-width: 4px;
1734
min-height: 4px;
1735
}
1736
1737
&.horizontal slider { margin: 2px 0; }
1738
1739
&.vertical slider { margin: 0 2px; }
1740
}
1741
1742
&.overlay-indicator {
1743
&:not(.dragging):not(.hovering) {
1744
border-color: transparent;
1745
background-color: transparent;
1746
1747
slider {
1748
min-width: 4px;
1749
min-height: 4px;
1750
margin: 2px;
1751
border: 2px solid scale-alpha($base_color, $lower_opacity);
1752
}
1753
1754
button {
1755
min-width: 4px;
1756
min-height: 4px;
1757
margin: 2px;
1758
border: 2px solid scale-alpha($base_color, $lower_opacity);
1759
border-radius: 100px;
1760
background-color: $tertiary_fg_color;
1761
background-clip: padding-box;
1762
-gtk-icon-source: none;
1763
1764
&:disabled { background-color: $insensitive_tertiary_fg_color; }
1765
}
1766
1767
&.horizontal {
1768
slider { min-width: $_slider_min_length; }
1769
1770
button { min-width: 8px; }
1771
}
1772
1773
&.vertical {
1774
slider { min-height: $_slider_min_length; }
1775
1776
button { min-height: 8px; }
1777
}
1778
}
1779
1780
&.dragging,
1781
&.hovering { background-color: scale-alpha($base_color, $higher_opacity); }
1782
}
1783
1784
&.horizontal slider { min-width: $_slider_min_length; }
1785
1786
&.vertical slider { min-height: $_slider_min_length; }
1787
1788
// button styling
1789
button {
1790
@extend %button_basic.flat;
1791
min-width: 16px;
1792
min-height: 16px;
1793
padding: 0;
1794
border-radius: 0;
1795
}
1796
1797
// button icons
1798
&.vertical {
1799
button {
1800
&.down { -gtk-icon-source: -gtk-icontheme('pan-down-symbolic'); }
1801
1802
&.up { -gtk-icon-source: -gtk-icontheme('pan-up-symbolic'); }
1803
}
1804
}
1805
1806
&.horizontal {
1807
button {
1808
&.down { -gtk-icon-source: -gtk-icontheme('pan-right-symbolic'); }
1809
1810
&.up { -gtk-icon-source: -gtk-icontheme('pan-left-symbolic'); }
1811
}
1812
}
1813
}
1814
1815
1816
/**********
1817
* Switch *
1818
**********/
1819
switch {
1820
transition: $material_transition;
1821
margin: $container_padding 0;
1822
border: 4px solid transparent;
1823
border-radius: 100px;
1824
background-color: $track_color;
1825
background-clip: padding-box;
1826
font-size: 0;
1827
1828
&:disabled { color: $insensitive_fg_color; }
1829
1830
&:checked {
1831
background-color: scale-alpha($accent_bg_color, 0.5);
1832
1833
&:disabled {
1834
background-color: scale-alpha($accent_bg_color, 0.5 * $disabled_opacity);
1835
color: $insensitive_fg_color;
1836
}
1837
}
1838
1839
slider {
1840
@include entry(normal);
1841
1842
transition: $material_transition, margin 0;
1843
min-width: $small_size;
1844
min-height: $small_size;
1845
margin: -4px 0 -4px -4px;
1846
-gtk-outline-radius: 100px;
1847
border-radius: 100px;
1848
background-image: -gtk-gradient(radial,
1849
center center, 0,
1850
center center, 0.5,
1851
to(transparent),
1852
to(transparent));
1853
}
1854
1855
&:hover slider { @include entry(focus); }
1856
1857
&:disabled slider { @include entry(insensitive); }
1858
1859
&:checked slider {
1860
transition: $material_transition, margin 0, background-image 0;
1861
animation: needs_attention $material_slower $material_ease_out forwards;
1862
margin: -4px -4px -4px 0;
1863
// background-color: $accent_bg_color;
1864
color: $selected_fg_color;
1865
}
1866
1867
&:checked:disabled slider { animation: none; }
1868
1869
row:selected & {
1870
}
1871
}
1872
1873
1874
/*************************
1875
* Check and Radio items *
1876
*************************/
1877
// draw regular check and radio items using our PNG assets
1878
// all assets are rendered from assets.svg. never add pngs directly
1879
1880
//selection-mode
1881
@each $s,$as in ('','-selectionmode'),
1882
(':active', '-active-selectionmode'),
1883
(':disabled', '-insensitive-selectionmode'),
1884
(':checked', '-checked-selectionmode'),
1885
(':checked:active', '-checked-active-selectionmode'),
1886
(':disabled:checked', '-checked-insensitive-selectionmode') {
1887
.view.content-view.check#{$s}:not(list) {
1888
-gtk-icon-shadow: $z-depth-1;
1889
-gtk-icon-source: -gtk-scaled(url("assets/checkbox#{$as}.png"),
1890
url("assets/checkbox#{$as}@2.png"));
1891
margin: 8px;
1892
background-color: transparent;
1893
1894
&:hover, &:active { -gtk-icon-shadow: $z-depth-2; }
1895
1896
&:disabled { -gtk-icon-shadow: none; }
1897
}
1898
}
1899
1900
checkbutton.text-button, radiobutton.text-button {
1901
// this is for a nice focus on check and radios text
1902
padding: 2px 0;
1903
outline-offset: 0;
1904
1905
label:not(:only-child) {
1906
&:first-child { margin-left: 4px; }
1907
1908
&:last-child { margin-right: 4px; }
1909
}
1910
}
1911
1912
check,
1913
radio {
1914
min-height: 24px;
1915
min-width: 24px;
1916
-gtk-icon-source: none;
1917
1918
margin: -12px -8px;
1919
padding: 12px;
1920
outline-offset: 4px;
1921
// border-radius: 100%;
1922
1923
@extend %button_basic.flat;
1924
1925
@extend %button_basic.image-button;
1926
1927
color: gtkalpha(currentColor, $enabled_opacity);
1928
1929
&:hover, &:active { color: currentColor; }
1930
1931
&:checked, &:checked:disabled { background-color: transparent; }
1932
1933
&:checked, &:indeterminate { color: $accent_bg_color; }
1934
1935
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_bg_color, $disabled_opacity); }
1936
1937
&:only-child { margin: -12px; }
1938
1939
.osd & {
1940
}
1941
1942
menu menuitem & {
1943
transition: none;
1944
margin: -16px -16px; // this is a workaround for a menu check/radio size allocation issue
1945
1946
&:not(:checked):not(:indeterminate):hover { color: gtkalpha(currentColor, $enabled_opacity); }
1947
1948
&, &:hover, &:disabled {
1949
background-image: none;
1950
// color: inherit;
1951
// animation: none;
1952
}
1953
}
1954
}
1955
1956
%check,
1957
check {
1958
& { -gtk-icon-source: image(-gtk-recolor(url("assets/check-unchecked-symbolic.svg")),
1959
-gtk-recolor(url("assets/check-unchecked-symbolic.png"))); }
1960
1961
&:checked { -gtk-icon-source: image(-gtk-recolor(url("assets/check-checked-symbolic.svg")),
1962
-gtk-recolor(url("assets/check-checked-symbolic.png"))); }
1963
1964
&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/check-dash-symbolic.svg")),
1965
-gtk-recolor(url("assets/check-dash-symbolic.png"))); }
1966
}
1967
1968
%radio,
1969
radio {
1970
border-image: -gtk-gradient(radial,
1971
center center, 0,
1972
center center, 0.001,
1973
to($accent_bg_color),
1974
to(transparent))
1975
24 / 24px;
1976
-gtk-icon-source: image(-gtk-recolor(url("assets/radio-unchecked-symbolic.svg")),
1977
-gtk-recolor(url("assets/radio-unchecked-symbolic.png")));
1978
1979
&:checked {
1980
border-image: -gtk-gradient(radial,
1981
center center, 0,
1982
center center, (10 / 48 / 2),
1983
to($accent_bg_color),
1984
to(transparent))
1985
24 / 24px;
1986
}
1987
1988
&:checked:disabled {
1989
border-image: -gtk-gradient(radial,
1990
center center, 0,
1991
center center, (10 / 48 / 2),
1992
to(scale-alpha($accent_bg_color, $disabled_opacity)),
1993
to(transparent))
1994
24 / 24px;
1995
}
1996
1997
&:indeterminate { -gtk-icon-source: image(-gtk-recolor(url("assets/radio-dash-symbolic.svg")),
1998
-gtk-recolor(url("assets/radio-dash-symbolic.png"))); }
1999
2000
&:indeterminate:checked {
2001
border-image: -gtk-gradient(radial,
2002
center center, 0,
2003
center center, 0.001,
2004
to($accent_bg_color),
2005
to(transparent))
2006
24 / 24px;
2007
}
2008
}
2009
2010
// let's animate things
2011
@keyframes check_check {
2012
from { -gtk-icon-transform: rotate(90deg); }
2013
to { -gtk-icon-transform: unset; }
2014
}
2015
2016
@keyframes check_radio {
2017
from { -gtk-icon-transform: scale(0); }
2018
to { -gtk-icon-transform: unset; }
2019
}
2020
2021
@keyframes check_indeterminate {
2022
from { -gtk-icon-transform: unset; }
2023
50% { -gtk-icon-transform: scale(0, 1); }
2024
to { -gtk-icon-transform: unset; }
2025
}
2026
2027
check:not(:indeterminate):checked { animation: check_check $material_slower $material_ease; }
2028
2029
check:not(:indeterminate):checked:active { animation: check_check $material_slower $material_ease, flat_ripple_effect $material_slower $material_ease_out forwards; }
2030
2031
// radio:not(:indeterminate):checked { animation: check_radio $material_slower $material_ease; }
2032
2033
check:indeterminate:checked, radio:indeterminate:checked { animation: check_indeterminate $material_slower $material_ease; }
2034
2035
check:indeterminate:checked:active, radio:indeterminate:checked:active { animation: check_indeterminate $material_slower $material_ease, flat_ripple_effect $material_slower $material_ease_out forwards; }
2036
2037
// no animations in menus
2038
menu menuitem {
2039
check:not(:indeterminate):checked,
2040
radio:not(:indeterminate):checked,
2041
check:indeterminate:checked,
2042
radio:indeterminate:checked { animation: none; }
2043
}
2044
2045
treeview.view check,
2046
treeview.view radio {
2047
// margin: -12px;
2048
// padding: 12px;
2049
padding: 0;
2050
2051
&:checked:hover, &:selected:checked:hover { background-image: none; }
2052
2053
& {
2054
color: $secondary_fg_color;
2055
2056
&:hover, &:active { color: $fg_color; }
2057
2058
&:disabled { color: $insensitive_secondary_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
&:selected {
2066
color: $secondary_selected_fg_color;
2067
2068
&:hover, &:active { color: $selected_fg_color; }
2069
2070
&:disabled { color: $insensitive_secondary_selected_fg_color; }
2071
2072
&:checked, &:indeterminate { color: $accent_bg_color; }
2073
2074
&:checked:disabled, &:indeterminate:disabled { color: scale-alpha($accent_bg_color, $disabled_opacity); }
2075
}
2076
}
2077
2078
treeview.view radio:checked {
2079
-gtk-icon-source: image(-gtk-recolor(url("assets/radio-checked-symbolic.svg")),
2080
-gtk-recolor(url("assets/radio-checked-symbolic.png")));
2081
border-image: none;
2082
}
2083
2084
2085
/************
2086
* GtkScale *
2087
************/
2088
scale {
2089
// sizing
2090
2091
$_marks_lenght: 8px;
2092
$_marks_distance: 8px;
2093
2094
min-height: 12px;
2095
min-width: 12px;
2096
padding: 12px;
2097
2098
* { transition: $material_transition; }
2099
2100
// the slider is inside the trough, so to have make it bigger there's a negative margin
2101
slider {
2102
min-height: $small_size;
2103
min-width: $small_size;
2104
margin: -10px;
2105
}
2106
2107
// the backing bit
2108
trough {
2109
outline-offset: 2px;
2110
background-color: $track_color;
2111
2112
&:disabled { color: $insensitive_fg_color; }
2113
}
2114
2115
// the colored part of the backing bit
2116
highlight {
2117
background-color: $accent_bg_color;
2118
2119
&:disabled { background-color: transparent; }
2120
}
2121
2122
// this is another differently styled part of the backing bit, the most relevant use case is for example
2123
// in media player to indicate how much video stream as been cached
2124
fill {
2125
background-color: $track_color;
2126
2127
&:disabled { background-color: transparent; }
2128
}
2129
2130
slider {
2131
transition: all $material_faster $material_ease;
2132
// border-radius: 100%;
2133
// background-color: $accent_bg_color;
2134
background-repeat: no-repeat;
2135
background-position: center;
2136
2137
@each $s,$as in ('',''),
2138
(':disabled','-insensitive') {
2139
&#{$s} {
2140
$_url: 'assets/slider#{$as}#{$asset_suffix}';
2141
background-image: -gtk-scaled(url('#{$_url}.png'),
2142
url('#{$_url}@2.png'));
2143
}
2144
}
2145
2146
background-size: calc(100% - 8px);
2147
2148
&:hover { background-size: calc(100% - 4px); }
2149
2150
&:active { background-size: calc(100% - 0px); }
2151
}
2152
2153
// click-and-hold the slider to activate
2154
&.fine-tune {
2155
// to make the slider shrink in fine-tune mode
2156
slider { background-size: calc(100% - 12px); }
2157
}
2158
2159
value { color: gtkalpha(currentColor, $hint_opacity); }
2160
2161
marks {
2162
color: $track_color;
2163
2164
@each $marks_class, $marks_pos, $marks_margin in (top, top, bottom),
2165
(bottom, bottom, top),
2166
(top, left, right),
2167
(bottom, right, left) {
2168
&.#{$marks_class} {
2169
margin-#{$marks_margin}: $_marks_distance;
2170
margin-#{$marks_pos}: -($_marks_distance + $_marks_lenght);
2171
}
2172
}
2173
}
2174
2175
&.horizontal {
2176
indicator {
2177
min-height: $_marks_lenght;
2178
min-width: 1px;
2179
}
2180
}
2181
2182
&.vertical {
2183
indicator {
2184
min-height: 1px;
2185
min-width: $_marks_lenght;
2186
}
2187
}
2188
2189
// *WARNING* scale with marks madness following
2190
2191
// FIXME: OSD and selected list rows missing, I don't feel like adding the other 144 assets needed for those...
2192
$suffix: if($variant == 'light', '', '-dark');
2193
2194
@each $dir_class, $dir_infix in ('horizontal', 'horz'),
2195
('vertical', 'vert') {
2196
@each $marks_infix, $nth_child in ('scale-has-marks-above', ':last-child:not(:only-child)'),
2197
('scale-has-marks-below', ':first-child:not(:only-child)') {
2198
@each $state, $state_infix in ('', ''),
2199
(':disabled', '-insensitive') {
2200
&.#{$dir_class} {
2201
%#{$marks_infix}-#{$dir_infix},
2202
contents#{$nth_child} > trough > slider {
2203
&#{$state} {
2204
$_scale_asset: 'assets/slider-#{$dir_infix}-#{$marks_infix}#{$state_infix}#{$suffix}';
2205
2206
background-image: -gtk-scaled(url('#{$_scale_asset}.png'), url('#{$_scale_asset}@2.png'));
2207
}
2208
2209
@if $dir_class == 'horizontal' {
2210
min-height: 30px;
2211
min-width: $small_size;
2212
2213
@if $marks_infix == 'scale-has-marks-above' {
2214
margin-top: -16px;
2215
2216
background-position: center calc(100% - 4px);
2217
2218
&:hover { background-position: center calc(100% - 2px); }
2219
2220
&:active { background-position: center calc(100% - 0px); }
2221
}
2222
2223
@if $marks_infix == 'scale-has-marks-below' {
2224
margin-bottom: -16px;
2225
2226
background-position: center calc(4px);
2227
2228
&:hover { background-position: center calc(2px); }
2229
2230
&:active { background-position: center calc(0px); }
2231
}
2232
}
2233
2234
@if $dir_class == 'vertical' {
2235
min-height: $small_size;
2236
min-width: 30px;
2237
2238
@if $marks_infix == 'scale-has-marks-above' {
2239
margin-left: -16px;
2240
2241
background-position: calc(4px) center;
2242
2243
&:hover { background-position: calc(2px) center; }
2244
2245
&:active { background-position: calc(0px) center; }
2246
}
2247
2248
@if $marks_infix == 'scale-has-marks-below' {
2249
margin-right: -16px;
2250
2251
background-position: calc(100% - 4px) center;
2252
2253
&:hover { background-position: calc(100% - 2px) center; }
2254
2255
&:active { background-position: calc(100% - 0px) center; }
2256
}
2257
}
2258
}
2259
2260
@at-root %#{$marks_infix}-#{$dir_infix}-fine-tune,
2261
&.fine-tune contents#{$nth_child} > trough > slider {
2262
// bigger negative margins to make the trough grow here as well
2263
2264
@if $dir_class == 'horizontal' {
2265
@if $marks_infix == 'scale-has-marks-above' { background-position: center calc(100% - 6px); }
2266
2267
@if $marks_infix == 'scale-has-marks-below' { background-position: center calc(6px); }
2268
}
2269
2270
@if $dir_class == 'vertical' {
2271
@if $marks_infix == 'scale-has-marks-above' { background-position: calc(6px) center; }
2272
2273
@if $marks_infix == 'scale-has-marks-below' { background-position: calc(100% - 6px) center; }
2274
}
2275
}
2276
}
2277
}
2278
}
2279
}
2280
2281
&.color {
2282
min-height: 0;
2283
min-width: 0;
2284
2285
&.horizontal {
2286
padding: 0 0 12px 0;
2287
2288
trough {
2289
padding-bottom: $bar_size;
2290
}
2291
2292
slider {
2293
@extend %scale-has-marks-above-horz;
2294
2295
margin-bottom: -10px - $bar_size;
2296
margin-top: 0;
2297
}
2298
}
2299
2300
&.vertical {
2301
&:dir(ltr) {
2302
padding: 0 0 0 12px;
2303
2304
trough {
2305
padding-left: $bar_size;
2306
}
2307
2308
slider {
2309
@extend %scale-has-marks-below-vert;
2310
2311
margin-left: -10px - $bar_size;
2312
margin-right: 0;
2313
}
2314
}
2315
2316
&:dir(rtl) {
2317
padding: 0 12px 0 0;
2318
2319
trough {
2320
padding-right: $bar_size;
2321
}
2322
2323
slider {
2324
@extend %scale-has-marks-above-vert;
2325
2326
margin-right: -10px - $bar_size;
2327
margin-left: 0;
2328
}
2329
}
2330
}
2331
2332
&.fine-tune {
2333
&.horizontal {
2334
slider {
2335
@extend %scale-has-marks-above-horz-fine-tune;
2336
}
2337
}
2338
2339
&.vertical {
2340
&:dir(ltr) {
2341
slider {
2342
@extend %scale-has-marks-below-vert-fine-tune;
2343
}
2344
}
2345
2346
&:dir(rtl) {
2347
slider {
2348
@extend %scale-has-marks-above-vert-fine-tune;
2349
}
2350
}
2351
}
2352
}
2353
}
2354
}
2355
2356
2357
/*****************
2358
* Progress bars *
2359
*****************/
2360
progressbar {
2361
// sizing
2362
&.horizontal {
2363
trough,
2364
progress { min-height: $bar_size; }
2365
}
2366
2367
&.vertical {
2368
trough,
2369
progress { min-width: $bar_size; }
2370
}
2371
2372
// FIXME: insensitive state missing and some other state should be set probably
2373
color: $tertiary_fg_color;
2374
font-size: smaller;
2375
2376
trough { background-color: scale-alpha($selected_bg_color, $lower_opacity); }
2377
2378
progress { background-color: $selected_bg_color; }
2379
2380
&.osd { // progressbar.osd used for epiphany page loading progress
2381
// min-width: $bar_size;
2382
// min-height: $bar_size;
2383
// background-color: transparent;
2384
2385
// trough { background-color: transparent; }
2386
2387
progress {
2388
}
2389
}
2390
}
2391
2392
2393
/*************
2394
* Level Bar *
2395
*************/
2396
levelbar {
2397
block {
2398
min-width: $medium_size;
2399
min-height: $bar_size;
2400
}
2401
2402
&.vertical block {
2403
min-width: $bar_size;
2404
min-height: $medium_size;
2405
}
2406
2407
trough {
2408
padding: 2px;
2409
border-radius: 2px;
2410
2411
@include entry(normal);
2412
2413
&:disabled { @include entry(insensitive); }
2414
}
2415
2416
&.horizontal.discrete block { margin: 0 1px; }
2417
2418
&.vertical.discrete block { margin: 1px 0; }
2419
2420
&.horizontal.discrete trough { padding: 2px 1px; }
2421
2422
&.vertical.discrete trough { padding: 1px 2px; }
2423
2424
block {
2425
&.low {
2426
background-color: $warning_color;
2427
}
2428
2429
&.high {
2430
background-color: $selected_bg_color;
2431
}
2432
2433
&.full {
2434
background-color: $success_color;
2435
}
2436
2437
&.empty {
2438
background-color: $track_color;
2439
color: $insensitive_fg_color;
2440
}
2441
}
2442
}
2443
2444
2445
/****************
2446
* Print dialog *
2447
*****************/
2448
printdialog {
2449
paper {
2450
padding: 0;
2451
border: 1px solid $borders_color;
2452
background: $base_color;
2453
color: $fg_color;
2454
}
2455
2456
.dialog-action-box { margin: 12px; }
2457
}
2458
2459
2460
/**********
2461
* Frames *
2462
**********/
2463
frame > border,
2464
.frame {
2465
margin: 0;
2466
padding: 0;
2467
border: 1px solid $borders_color;
2468
border-radius: 0;
2469
box-shadow: none;
2470
2471
&.flat { border-style: none; }
2472
}
2473
2474
actionbar > revealer > box {
2475
padding: $container_padding;
2476
border-top: 1px solid $borders_color;
2477
}
2478
2479
scrolledwindow {
2480
viewport.frame { // avoid double borders when viewport inside scrolled window
2481
border-style: none;
2482
}
2483
2484
// This is used when content is touch-dragged past boundaries.
2485
// draws a box on top of the content, the size changes programmatically.
2486
overshoot {
2487
&.top { @include overshoot(top); }
2488
2489
&.bottom { @include overshoot(bottom); }
2490
2491
&.left { @include overshoot(left); }
2492
2493
&.right { @include overshoot(right); }
2494
}
2495
2496
// Overflow indication, works similarly to the overshoot, the size if fixed tho.
2497
undershoot {
2498
&.top { @include undershoot(top); }
2499
2500
&.bottom { @include undershoot(bottom); }
2501
2502
&.left { @include undershoot(left); }
2503
2504
&.right { @include undershoot(right); }
2505
}
2506
2507
junction { // the small square between two scrollbars
2508
border-style: solid none none solid;
2509
border-width: 1px;
2510
border-color: $borders_color;
2511
background-color: $base_color;
2512
2513
&:dir(rtl) { border-style: solid solid none none; }
2514
}
2515
}
2516
2517
//vbox and hbox separators
2518
separator {
2519
min-width: 1px;
2520
min-height: 1px;
2521
background: $borders_color;
2522
}
2523
2524
2525
/*********
2526
* Lists *
2527
*********/
2528
list {
2529
border-color: $borders_color;
2530
background-color: $base_color;
2531
2532
row { padding: 2px; }
2533
}
2534
2535
row {
2536
transition: $material_transition;
2537
2538
&:hover { transition: none; }
2539
2540
&.activatable {
2541
background-image: radial-gradient(circle farthest-corner at center,
2542
gtkalpha(currentColor, 0) 100%,
2543
transparent 0%),
2544
image(gtkalpha(currentColor, 0));
2545
2546
&:hover {
2547
background-image: radial-gradient(circle farthest-corner at center,
2548
gtkalpha(currentColor, 0) 100%,
2549
transparent 0%),
2550
image(gtkalpha(currentColor, 0.05));
2551
}
2552
2553
&.has-open-popup, // this is for indicathing which row generated a popover see https://bugzilla.gnome.org/show_bug.cgi?id=754411
2554
&:active {
2555
transition: $material_transition, background-image 0;
2556
animation: row_ripple_effect $material_slower $material_ease_out forwards;
2557
}
2558
}
2559
2560
&:selected { @extend %selected_items; }
2561
}
2562
2563
2564
/*********************
2565
* App Notifications *
2566
*********************/
2567
.app-notification,
2568
.app-notification.frame {
2569
@extend %osd;
2570
2571
@extend toolbar.osd;
2572
2573
margin: 8px;
2574
2575
border { border: none; }
2576
}
2577
2578
2579
/*************
2580
* Expanders *
2581
*************/
2582
expander {
2583
arrow {
2584
transition: all $material_faster $material_ease;
2585
min-width: 16px;
2586
min-height: 16px;
2587
-gtk-icon-source: -gtk-icontheme('pan-down-symbolic');
2588
-gtk-icon-transform: rotate(-90deg);
2589
2590
&:dir(rtl) { -gtk-icon-transform: rotate(90deg); }
2591
2592
&:checked { -gtk-icon-transform: unset; }
2593
2594
color: $secondary_fg_color;
2595
2596
&:hover, &:active { color: $fg_color; }
2597
2598
&:disabled { color: $insensitive_secondary_fg_color; }
2599
2600
&:selected {
2601
color: $secondary_selected_fg_color;
2602
2603
&:hover, &:active { color: $selected_fg_color; }
2604
2605
&:disabled { color: $insensitive_secondary_selected_fg_color; }
2606
}
2607
}
2608
}
2609
2610
2611
/************
2612
* Calendar *
2613
***********/
2614
calendar {
2615
padding: 1px;
2616
border: 1px solid $borders_color;
2617
color: $fg_color;
2618
2619
&:disabled { color: $insensitive_fg_color; }
2620
2621
&:selected {
2622
@extend %selected_items;
2623
2624
border-radius: 2px + 1px;
2625
}
2626
2627
&.header {
2628
border: none;
2629
border-bottom: 1px solid $borders_color;
2630
border-radius: 0;
2631
}
2632
2633
&.button { @extend %button_basic.flat; }
2634
2635
&:indeterminate { color: gtkalpha(currentColor, $disabled_opacity); }
2636
2637
&.highlight {
2638
color: gtkalpha(currentColor, $hint_opacity);
2639
font-weight: 500;
2640
}
2641
}
2642
2643
2644
/***********
2645
* Dialogs *
2646
***********/
2647
messagedialog { // Message Dialog styling
2648
&.background { background-color: $light_color; }
2649
2650
.titlebar {
2651
min-height: $small_size;
2652
border-style: none;
2653
box-shadow: inset 0 1px $highlight_color;
2654
background-color: $light_color;
2655
}
2656
2657
&.csd { // rounded bottom border styling for csd version
2658
&.background {
2659
// bigger radius for better antialiasing
2660
border-bottom-left-radius: 2px;
2661
border-bottom-right-radius: 2px;
2662
}
2663
2664
.dialog-action-area button {
2665
padding: 8px 16px;
2666
border-top: 1px solid $borders_color;
2667
border-radius: 0;
2668
2669
@extend %button_basic.flat;
2670
2671
&:first-child{ border-bottom-left-radius: 2px; }
2672
2673
&:last-child { border-bottom-right-radius: 2px; }
2674
}
2675
}
2676
}
2677
2678
filechooser {
2679
.dialog-action-box { border-top: 1px solid $borders_color; }
2680
2681
#pathbarbox { border-bottom: 1px solid $borders_color; }
2682
}
2683
2684
filechooserbutton:drop(active) {
2685
box-shadow: none;
2686
}
2687
2688
2689
/***********
2690
* Sidebar *
2691
***********/
2692
.sidebar {
2693
border-style: none;
2694
background-color: $light_color;
2695
2696
@at-root %sidebar_left,
2697
&:dir(ltr),
2698
&.left,
2699
&.left:dir(rtl) {
2700
border-right: 1px solid $borders_color;
2701
border-left-style: none;
2702
}
2703
2704
@at-root %sidebar_right
2705
&:dir(rtl),
2706
&.right {
2707
border-left: 1px solid $borders_color;
2708
border-right-style: none;
2709
}
2710
2711
list { background-color: transparent; }
2712
2713
paned & { &.left, &.right, &.left:dir(rtl), &:dir(rtl), &:dir(ltr), & { border-style: none; }}
2714
}
2715
2716
stacksidebar {
2717
&.sidebar {
2718
&:dir(ltr),
2719
&.left,
2720
&.left:dir(rtl) { list { @extend %sidebar_left; }}
2721
2722
&:dir(rtl),
2723
&.right { list { @extend %sidebar_right; }}
2724
}
2725
2726
row {
2727
padding: 10px 4px;
2728
2729
> label {
2730
padding-left: 6px;
2731
padding-right: 6px;
2732
}
2733
2734
&.needs-attention > label { @extend %needs_attention; }
2735
}
2736
}
2737
2738
2739
/****************
2740
* File chooser *
2741
****************/
2742
placessidebar {
2743
> viewport.frame { border-style: none; }
2744
2745
row {
2746
// Needs overriding of the GtkListBoxRow padding
2747
min-height: 32px;
2748
padding: 0;
2749
2750
// Using margins/padding directly in the SidebarRow
2751
// will make the animation of the new bookmark row jump
2752
> revealer { padding: 0 12px; }
2753
2754
&:selected { color: $selected_fg_color; }
2755
2756
&:disabled { color: $insensitive_fg_color; }
2757
2758
image.sidebar-icon {
2759
opacity: $hint_opacity; // dim the device icons
2760
2761
&:dir(ltr) { padding-right: 8px; }
2762
&:dir(rtl) { padding-left: 8px; }
2763
}
2764
2765
label.sidebar-label {
2766
&:dir(ltr) { padding-right: 2px; }
2767
&:dir(rtl) { padding-left: 2px; }
2768
}
2769
2770
@at-root button.sidebar-button {
2771
@extend %button_basic.flat;
2772
2773
min-height: $small_size;
2774
min-width: $small_size;
2775
margin-top: 0;
2776
margin-bottom: 0;
2777
padding: 0;
2778
border-radius: 100%;
2779
-gtk-outline-radius: 100%;
2780
2781
row:selected & { @extend %button_selected.flat; }
2782
}
2783
2784
&.sidebar-placeholder-row {
2785
min-height: 2px;
2786
padding: 0 8px;
2787
background-image: image($accent_bg_color);
2788
background-clip: content-box;
2789
}
2790
2791
&.sidebar-new-bookmark-row { color: $accent_bg_color; }
2792
2793
&:drop(active):not(:disabled) {
2794
box-shadow: inset 0 0 0 2px $accent_bg_color;
2795
2796
&:selected {
2797
// background-color: $accent_bg_color;
2798
// color: $selected_fg_color;
2799
}
2800
}
2801
}
2802
}
2803
2804
placesview {
2805
.server-list-button > image { -gtk-icon-transform: rotate(0turn); }
2806
2807
.server-list-button:checked > image { -gtk-icon-transform: rotate(-0.5turn); }
2808
2809
// this selects the "connect to server" label
2810
> actionbar > revealer > box > label {
2811
padding-left: 8px;
2812
padding-right: 8px;
2813
}
2814
}
2815
2816
2817
/*********
2818
* Paned *
2819
*********/
2820
paned {
2821
> separator {
2822
min-width: 1px;
2823
min-height: 1px;
2824
-gtk-icon-source: none; // defeats the ugly default handle decoration
2825
border-style: none; // just to be sure
2826
background-color: transparent;
2827
// workaround, using background istead of a border since the border will get rendered twice (?)
2828
background-image: image($borders_color);
2829
background-size: 1px 1px;
2830
2831
&.wide {
2832
min-width: 6px;
2833
min-height: 6px;
2834
background-color: $bg_color;
2835
background-image: image($borders_color), image($borders_color);
2836
background-size: 1px 1px, 1px 1px;
2837
}
2838
}
2839
2840
&.horizontal > separator {
2841
background-repeat: repeat-y;
2842
2843
&:dir(ltr) {
2844
margin: 0 -8px 0 0;
2845
padding: 0 8px 0 0;
2846
background-position: left;
2847
}
2848
2849
&:dir(rtl) {
2850
margin: 0 0 0 -8px;
2851
padding: 0 0 0 8px;
2852
background-position: right;
2853
}
2854
2855
&.wide {
2856
margin: 0;
2857
padding: 0;
2858
background-repeat: repeat-y, repeat-y;
2859
background-position: left, right;
2860
}
2861
}
2862
2863
&.vertical > separator {
2864
margin: 0 0 -8px 0;
2865
padding: 0 0 8px 0;
2866
background-repeat: repeat-x;
2867
background-position: top;
2868
2869
&.wide {
2870
margin: 0;
2871
padding: 0;
2872
background-repeat: repeat-x, repeat-x;
2873
background-position: bottom, top;
2874
}
2875
}
2876
}
2877
2878
2879
/**************
2880
* GtkInfoBar *
2881
**************/
2882
infobar { border-style: none; }
2883
2884
.info { background-color: $info_bg_color; }
2885
2886
.question { background-color: $question_bg_color; }
2887
2888
.warning { background-color: $warning_bg_color; }
2889
2890
.error { background-color: $error_bg_color; }
2891
2892
.info,
2893
.question,
2894
.warning,
2895
.error {
2896
color: $selected_fg_color;
2897
2898
button { @extend %button_selected; }
2899
2900
label:selected {
2901
}
2902
2903
*:link { @extend %link_selected; }
2904
}
2905
2906
2907
/************
2908
* Tooltips *
2909
************/
2910
tooltip {
2911
&.background {
2912
// background-color needs to be set this way otherwise it gets drawn twice
2913
// see https://bugzilla.gnome.org/show_bug.cgi?id=736155 for details.
2914
background-color: scale-alpha($base_color, $higher_opacity);
2915
}
2916
2917
// @extend %osd;
2918
2919
// padding: 4px; /* not working */
2920
border-radius: 2px;
2921
box-shadow: none; // otherwise it gets inherited by windowframe.csd
2922
2923
// FIXME: we need a border or tooltips vanish on black background.
2924
decoration { background-color: transparent; }
2925
2926
label {
2927
min-height: 32px - 6px * 2;
2928
padding: 2px 8px - 6px;
2929
}
2930
2931
* { // Yeah this is ugly
2932
padding: 0;
2933
background-color: transparent;
2934
color: inherit;
2935
}
2936
}
2937
2938
2939
/*****************
2940
* Color Chooser *
2941
*****************/
2942
colorswatch {
2943
// This widget is made of two boxes one on top of the other, the lower box is colorswatch {} the other one
2944
// is colorswatch overlay {}, colorswatch has the programmatically set background, so most of the style is
2945
// applied to the overlay box.
2946
2947
// base color corners rounding
2948
// to avoid the artifacts caused by rounded corner anti-aliasing the base color
2949
// sports a bigger radius.
2950
// nth-child is needed by the custom color strip.
2951
2952
&.top {
2953
border-top-left-radius: $material_radius + 0.5px;
2954
border-top-right-radius: $material_radius + 0.5px;
2955
2956
overlay {
2957
border-top-left-radius: $material_radius;
2958
border-top-right-radius: $material_radius;
2959
}
2960
}
2961
2962
&.bottom {
2963
border-bottom-left-radius: $material_radius + 0.5px;
2964
border-bottom-right-radius: $material_radius + 0.5px;
2965
2966
overlay {
2967
border-bottom-left-radius: $material_radius;
2968
border-bottom-right-radius: $material_radius;
2969
}
2970
}
2971
2972
&.left,
2973
&:first-child:not(.top) {
2974
border-top-left-radius: $material_radius + 0.5px;
2975
border-bottom-left-radius: $material_radius + 0.5px;
2976
2977
overlay {
2978
border-top-left-radius: $material_radius;
2979
border-bottom-left-radius: $material_radius;
2980
}
2981
}
2982
2983
&.right,
2984
&:last-child:not(.bottom) {
2985
border-top-right-radius: $material_radius + 0.5px;
2986
border-bottom-right-radius: $material_radius + 0.5px;
2987
2988
overlay {
2989
border-top-right-radius: $material_radius;
2990
border-bottom-right-radius: $material_radius;
2991
}
2992
}
2993
2994
&.dark overlay { color: white; }
2995
2996
&.light overlay { color: scale-alpha(black, 0.8); }
2997
2998
&.dark { color: white; } // for focus ring
2999
3000
&.light { color: scale-alpha(black, 0.8); } // for focus ring
3001
3002
&:drop(active) {
3003
box-shadow: none;
3004
3005
&.light overlay {
3006
box-shadow: $z-depth-1, 0 0 0 2px $accent_bg_color;
3007
}
3008
3009
&.dark overlay {
3010
box-shadow: $z-depth-1, 0 0 0 2px $accent_bg_color;
3011
}
3012
}
3013
3014
overlay {
3015
transition: $shadow_transition;
3016
box-shadow: $z-depth-1;
3017
3018
&:hover { box-shadow: $z-depth-2; }
3019
}
3020
3021
&#add-color-button {
3022
border-radius: $material_radius $material_radius 0 0;
3023
color: white; // for focus ring
3024
3025
&:only-child { border-radius: $material_radius; }
3026
3027
overlay {
3028
background-image: linear-gradient(to right,
3029
$error_bg_color 25%,
3030
$warning_bg_color 25%, $warning_bg_color 50%,
3031
$info_bg_color 50%, $info_bg_color 75%,
3032
$question_bg_color 75%);
3033
color: white;
3034
}
3035
}
3036
3037
&:disabled {
3038
opacity: $disabled_opacity;
3039
3040
overlay { box-shadow: none; }
3041
}
3042
3043
row:selected & {
3044
}
3045
3046
&#editor-color-sample {
3047
border-radius: $material_radius + 0.5px;
3048
3049
overlay { border-radius: $material_radius; }
3050
3051
// overlay:hover { box-shadow: $z-depth-1; }
3052
}
3053
}
3054
3055
// colorscale popup
3056
colorchooser .popover.osd {
3057
transition: $shadow_transition;
3058
border-radius: 2px;
3059
box-shadow: $z-depth-2;
3060
background-color: $base_color;
3061
3062
&:backdrop { box-shadow: $z-depth-1; }
3063
3064
spinbutton:not(.vertical) { @extend %entry.flat; }
3065
}
3066
3067
3068
/********
3069
* Misc *
3070
********/
3071
//content view (grid/list)
3072
.content-view {
3073
background-color: $bg_color;
3074
3075
// &:hover { -gtk-icon-effect: highlight; }
3076
3077
rubberband { @extend rubberband; }
3078
}
3079
3080
.scale-popup {
3081
.osd & { @extend %osd; }
3082
3083
.osd & button.flat { //FIXME: quick hack, redo properly
3084
}
3085
3086
button { // +/- buttons on GtkVolumeButton popup
3087
}
3088
}
3089
3090
3091
/**********************
3092
* Window Decorations *
3093
*********************/
3094
decoration {
3095
transition: $shadow_transition;
3096
border-radius: 2px 2px 0 0;
3097
box-shadow: $z-depth-4, 0 16px 16px transparent;
3098
3099
// FIXME rationalize shadows
3100
3101
// this is used for the resize cursor area
3102
margin: 8px;
3103
3104
&:backdrop {
3105
// the transparent shadow here is to enforce that the shadow extents don't
3106
// change when we go to backdrop, to prevent jumping windows.
3107
// The biggest shadow should be in the same order then in the active state
3108
// or the jumping will happen during the transition.
3109
box-shadow: $z-depth-2, 0 16px 16px transparent;
3110
}
3111
3112
.fullscreen &,
3113
.tiled & { border-radius: 0; }
3114
3115
.popup & { box-shadow: none; }
3116
3117
// server-side decorations as used by mutter
3118
.ssd & { box-shadow: 0 3px 3px rgba(0, 0, 0, 0.16); } //just doing borders, wm draws actual shadows
3119
3120
.csd.popup & {
3121
border-radius: 2px;
3122
box-shadow: $z-depth-2;
3123
}
3124
3125
tooltip.csd & {
3126
border-radius: 2px;
3127
box-shadow: $z-depth-2;
3128
}
3129
3130
messagedialog.csd & {
3131
border-radius: 2px;
3132
// box-shadow: $z-depth-4, 0 16px 16px transparent;
3133
3134
// &:backdrop { box-shadow: $z-depth-2, 0 16px 16px transparent; }
3135
}
3136
3137
.solid-csd & {
3138
margin: 4px;
3139
// border: solid 1px $borders_color;
3140
border-radius: 0;
3141
box-shadow: none;
3142
background-color: $bg_color;
3143
}
3144
}
3145
3146
// Window Close button
3147
button.titlebutton {
3148
// @extend %button_basic.flat;
3149
3150
@extend %button_basic.image-button;
3151
3152
.selection-mode & {
3153
}
3154
}
3155
3156
3157
// catch all extend :)
3158
3159
%selected_items {
3160
background-color: $selected_bg_color;
3161
3162
@at-root %nobg_selected_items, & {
3163
color: $selected_fg_color;
3164
3165
&:disabled { color: $insensitive_selected_fg_color; }
3166
}
3167
}
3168
3169
.monospace { font: Monospace; }
3170
3171
3172
/**********************
3173
* Touch Copy & Paste *
3174
*********************/
3175
//touch selection handlebars for the Popover.osd above
3176
cursor-handle {
3177
border-radius: 100px;
3178
background-color: $accent_bg_color;
3179
background-image: none;
3180
3181
&.top:dir(ltr), &.bottom:dir(rtl) {
3182
padding-left: 6px;
3183
border-top-right-radius: 0;
3184
}
3185
3186
&.bottom:dir(ltr), &.top:dir(rtl) {
3187
padding-right: 6px;
3188
border-top-left-radius: 0;
3189
}
3190
3191
&.insertion-cursor:dir(ltr), &.insertion-cursor:dir(rtl) {
3192
-GtkWidget-text-handle-width: 24;
3193
-GtkWidget-text-handle-height: 30;
3194
3195
$_url: 'assets/slider-horz-scale-has-marks-above#{$asset_suffix}';
3196
-gtk-icon-source: -gtk-scaled(url('#{$_url}.png'),
3197
url('#{$_url}@2.png'));
3198
}
3199
}
3200
3201
.context-menu { font: initial; } // Decouple the font of context menus from their entry/textview
3202
3203
button.circular { // FIXME: aggregate to buttons
3204
border-radius: 100px;
3205
-gtk-outline-radius: 100px;
3206
3207
label { padding: 0; }
3208
}
3209
3210
// shortcut window keys
3211
.keycap {
3212
min-width: 28px - 8px * 2;
3213
min-height: 28px - 2px;
3214
margin-top: 2px;
3215
padding-bottom: 2px;
3216
padding-left: 8px;
3217
padding-right: 8px;
3218
3219
border: solid 1px $borders_color;
3220
border-radius: 2px + 1px;
3221
box-shadow: inset 0 -2px $borders_color;
3222
background-color: $base_color;
3223
color: $fg_color;
3224
font-size: smaller;
3225
}
3226
3227
*:drop(active) { // FIXME needs to be done widget by widget, this wildcard should really die
3228
transition: $material_transition;
3229
box-shadow: $z-depth-1, inset 0 0 0 2px $accent_bg_color;
3230
caret-color: $accent_bg_color;
3231
}
3232
3233
stackswitcher button.text-button { min-width: 100px; } // FIXME aggregate with buttons
3234
3235
stackswitcher button.circular,
3236
stackswitcher button.text-button.circular { // FIXME aggregate with buttons
3237
min-width: $medium_size;
3238
min-height: $medium_size;
3239
padding: 0;
3240
}
3241