authorgravatar for nmarks413@gmail.comNatalie Marks <nmarks413@gmail.com> 2025-10-29 22:23:15-07:00
committergravatar for nmarks413@gmail.comNatalie Marks <nmarks413@gmail.com> 2025-10-29 22:23:15-07:00
logbb048af6c8e225b1e93c74d2a5a350aa9de768e6
tree1339687e6f0a865b789e3973f000a5c58acd6679
parent6de9e49437f2c89c38b030745d219434e96abb75
signature Commit is signed but in an unrecognized format.

feat: add swaync


3 files changed, 597 insertions(+), 5 deletions(-)

users/natalie/desktop/configuration.nix+1-5
......@@ -11,6 +11,7 @@
1111 ];
1212 documentation.man.generateCaches = false;
1313 programs = {
14 hyprland.enable = true;
1415 gamemode.enable = true;
1516
1617 _1password.enable = true;
......@@ -145,11 +146,6 @@
145146
146147 # Enable sound with pipewire.
147148 security.rtkit.enable = true;
148 services = {
149 desktopManager.cosmic.enable = true;
150 displayManager.cosmic-greeter.enable = true;
151 desktopManager.cosmic.xwayland.enable = true;
152 };
153149
154150 # Enable touchpad support (enabled default in most desktopManager).
155151 # services.xserver.libinput.enable = true;
users/natalie/home/default.nix+1
......@@ -4,5 +4,6 @@
44 ./tmux.nix
55 ./hyprland
66 ./vicinae.nix
7 ./swaync.nix
78 ];
89}
users/natalie/home/swaync.nix created+595
......@@ -0,0 +1,595 @@
1{ pkgs, ... }:
2{
3 services.swaync = {
4 enable = true;
5 settings = {
6 ignore-gtk-theme = true;
7 positionX = "right";
8 positionY = "top";
9 layer = "overlay";
10 control-center-layer = "top";
11 layer-shell = true;
12 layer-shell-cover-screen = true;
13 cssPriority = "user";
14 control-center-margin-top = 15;
15 control-center-margin-bottom = 15;
16 control-center-margin-right = 15;
17 control-center-margin-left = 0;
18 notification-2fa-action = true;
19 notification-inline-replies = false;
20 notification-body-image-height = 100;
21 notification-body-image-width = 200;
22 notification-icon-size = 48;
23 timeout = 8;
24 timeout-low = 6;
25 timeout-critical = 0;
26 fit-to-screen = true;
27 relative-timestamps = true;
28 control-center-width = 400;
29 control-center-height = 600;
30 notification-window-width = 350;
31 keyboard-shortcuts = true;
32 notification-grouping = true;
33 image-visibility = "when-available";
34 transition-time = 200;
35 hide-on-clear = false;
36 hide-on-action = true;
37 text-empty = "No Notifications";
38 script-fail-notify = true;
39 widgets = [
40 "dnd"
41 "mpris"
42 "notifications"
43 "volume"
44 "backlight"
45 ];
46 widget-config = {
47 inhibitors = {
48 text = "Inhibitors";
49 button-text = "Clear All";
50 clear-all-button = true;
51 };
52 title = {
53 text = "Notifications";
54 clear-all-button = true;
55 button-text = "Clear All";
56 };
57 dnd = {
58 text = "Do Not Disturb";
59 };
60 label = {
61 max-lines = 5;
62 text = "Label Text";
63 };
64 mpris = {
65 show-album-art = "always";
66 loop-carousel = false;
67 };
68 volume = {
69 label = "󰕾 ";
70 expand-button-label = "";
71 collapse-button-label = "";
72 show-per-app = true;
73 show-per-app-icon = true;
74 show-per-app-label = false;
75 };
76 backlight = {
77 label = "󰃟 ";
78 };
79 };
80 };
81 style = ''
82 :root {
83 --bg-primary: #1d2021;
84 --bg-secondary: #282828;
85 --bg-button: #4E4E4E;
86 --bg-button-hover: #5E5E5E;
87 --text-primary: #EBDBB2;
88 --text-disabled: #5C554A;
89 --border-color: #928374;
90 --priority-low: #EBDBB2;
91 --priority-normal: #83A598;
92 --priority-critical: #FB4934;
93 --transition-standard: 0.15s ease-in-out;
94 }
95
96 /* Base styles */
97 * {
98 outline: none;
99 }
100
101 *:focus {
102 outline: none;
103 box-shadow: none;
104 }
105
106 /* Scrollbar */
107 scrollbar,
108 scrollbar slider {
109 opacity: 0;
110 min-width: 0px;
111 min-height: 0px;
112 background: transparent;
113 }
114
115 /* Common button styles */
116 .close-button,
117 .widget-title>button,
118 .widget-dnd switch,
119 .widget-menubar>.menu-button-bar>.widget-menubar-container button,
120 .widget-menubar>revealer button,
121 .widget-inhibitors>button {
122 border-radius: 0px;
123 border: none;
124 box-shadow: none;
125 transition: background var(--transition-standard);
126 }
127
128 /* Close button */
129 .close-button {
130 background: var(--bg-button);
131 color: var(--text-primary);
132 text-shadow: none;
133 padding: 0;
134 border-radius: 50%;
135 margin-top: 8px;
136 margin-right: 8px;
137 min-width: 20px;
138 min-height: 20px;
139 }
140
141 .close-button:hover {
142 background: var(--bg-button-hover);
143 }
144
145 /* Notification rows */
146 .notification-row {
147 background: none;
148 }
149
150 .notification-row:focus,
151 .notification-group:focus {
152 background: var(--bg-primary);
153 }
154
155 .notification-row .notification-background {
156 margin: 0px 0px 0px 0px;
157 }
158
159 /* Base notification styles */
160 .notification-row .notification-background .notification {
161 border-radius: 0px;
162 border: 1px solid var(--border-color);
163 transition: background var(--transition-standard);
164 background: var(--bg-primary);
165 padding: 2px 4px;
166 }
167
168 /* Priority-based notification styles */
169 .notification-row .notification-background .notification.low {
170 border-left: 3px solid var(--priority-low);
171 }
172
173 .notification-row .notification-background .notification.normal {
174 border-left: 3px solid var(--priority-normal);
175 }
176
177 .notification-row .notification-background .notification.critical {
178 border-left: 3px solid var(--priority-critical);
179 }
180
181 /* Notification default action */
182 .notification-default-action {
183 padding: 4px;
184 margin: 0;
185 box-shadow: none;
186 background: transparent;
187 border: none;
188 color: var(--text-primary);
189 transition: background var(--transition-standard);
190 border-radius: 0px;
191 }
192
193 .notification-default-action:hover {
194 -gtk-icon-filter: none;
195 background: var(--bg-primary);
196 }
197
198 .notification-default-action:not(:only-child) {
199 border-bottom-left-radius: 0px;
200 border-bottom-right-radius: 0px;
201 }
202
203 /* Notification content */
204 .notification-content {
205 background: transparent;
206 border-radius: 0px;
207 padding: 0;
208 }
209
210 .notification-content .image {
211 -gtk-icon-filter: none;
212 -gtk-icon-size: 30px;
213 border-radius: 50px;
214 margin: 0px 7px 0px 0px;
215 }
216
217 .notification-content .app-icon {
218 -gtk-icon-filter: none;
219 -gtk-icon-size: calc(25px / 3);
220 -gtk-icon-shadow: 0 1px 4px black;
221 margin: 6px;
222 }
223
224 .notification-content .text-box label {
225 filter: none;
226 }
227
228 /* Text elements */
229 .notification-content .text-box .summary,
230 .notification-content .text-box .time,
231 .notification-content .text-box .body {
232 font-size: 16px;
233 background: transparent;
234 color: var(--text-primary);
235 text-shadow: none;
236 }
237
238 .notification-content .text-box .summary,
239 .notification-content .text-box .time {
240 font-weight: bold;
241 }
242
243 .notification-content .text-box .time {
244 margin-right: 30px;
245 }
246
247 .notification-content .text-box .body {
248 font-weight: normal;
249 }
250
251 /* Progress and images */
252 .notification-content progressbar {
253 margin-top: 4px;
254 }
255
256 .notification-content .body-image {
257 margin-top: 4px;
258 background-color: white;
259 -gtk-icon-filter: none;
260 }
261
262 /* Inline reply */
263 .notification-content .inline-reply {
264 margin-top: 4px;
265 }
266
267 .notification-content .inline-reply .inline-reply-entry {
268 background: var(--bg-secondary);
269 color: var(--text-primary);
270 caret-color: var(--text-primary);
271 border: 1px solid var(--border-color);
272 border-radius: 0px;
273 }
274
275 .notification-content .inline-reply .inline-reply-button {
276 margin-left: 4px;
277 background: rgb(48, 48, 48);
278 border: 1px solid var(--border-color);
279 border-radius: 0px;
280 color: var(--text-primary);
281 }
282
283 .notification-content .inline-reply .inline-reply-button:disabled {
284 background: initial;
285 color: rgb(150, 150, 150);
286 border: 1px solid var(--border-color);
287 border-color: transparent;
288 }
289
290 .notification-content .inline-reply .inline-reply-button:hover {
291 background: var(--bg-primary);
292 }
293
294 /* Alternative actions */
295 .notification-alt-actions {
296 background: none;
297 border-bottom-left-radius: 12px;
298 border-bottom-right-radius: 12px;
299 padding: 4px;
300 }
301
302 .notification-action {
303 margin: 4px;
304 padding: 0;
305 font-size: 16px;
306 }
307
308 .notification-action>button {
309 border-radius: 0px;
310 font-size: 16px;
311 padding: 1px;
312 }
313
314 /* Notification groups */
315 .notification-group {
316 transition: opacity 200ms ease-in-out;
317 }
318
319 .notification-group .notification-group-close-button .close-button {
320 margin: 12px 20px;
321 }
322
323 .notification-group .notification-group-buttons,
324 .notification-group .notification-group-headers {
325 margin: 0 16px;
326 color: var(--text-primary);
327 }
328
329 .notification-group .notification-group-headers {
330 font-size: 16px;
331 }
332
333 .notification-group .notification-group-headers .notification-group-icon {
334 color: var(--text-primary);
335 -gtk-icon-size: 20px;
336 font-size: 16px;
337 font-weight: 700;
338 margin: 5px 5px 5px 0px;
339 }
340
341 .notification-group .notification-group-headers .notification-group-header {
342 font-size: 16px;
343 font-weight: 700;
344 color: var(--text-primary);
345 }
346
347 .notification-group .notification-group-buttons {
348 margin: 5px;
349 }
350
351 .notification-group.collapsed.not-expanded {
352 opacity: 1.0;
353 }
354
355 .notification-group.collapsed .notification-row .notification {
356 background-color: var(--bg-primary);
357 }
358
359 .notification-group.collapsed .notification-row:not(:last-child) .notification-action,
360 .notification-group.collapsed .notification-row:not(:last-child) .notification-default-action {
361 opacity: 1.0;
362 }
363
364 .notification-group.collapsed:hover .notification-row:not(:only-child) .notification {
365 background-color: var(--bg-primary);
366 }
367
368 /* Control center */
369 .control-center {
370 background: var(--bg-primary);
371 color: var(--text-primary);
372 border-radius: 0px;
373 border: 2px solid var(--border-color);
374 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
375 }
376
377 .control-center .control-center-list-placeholder {
378 opacity: 1.0;
379 }
380
381 .control-center .control-center-list {
382 background: transparent;
383 }
384
385 .control-center .control-center-list .notification .notification-default-action,
386 .control-center .control-center-list .notification .notification-action {
387 transition: opacity 400ms ease-in-out, background var(--transition-standard);
388 }
389
390 .control-center .control-center-list .notification .notification-default-action:hover,
391 .control-center .control-center-list .notification .notification-action:hover {
392 background-color: var(--bg-primary);
393 }
394
395 /* Floating notifications */
396 .blank-window,
397 .floating-notifications {
398 background: transparent;
399 }
400
401 .floating-notifications .notification {
402 box-shadow: none;
403 }
404
405 /* Widgets */
406 .widget-title>label {
407 margin: 8px;
408 font-weight: 700;
409 font-size: 16px;
410 }
411
412 .widget-title>button {
413 margin: 8px;
414 font-size: 16px;
415 background: var(--bg-primary);
416 border: 2px solid var(--text-disabled);
417 padding: 3px 10px;
418 color: var(--text-primary);
419 font-weight: 700;
420 }
421
422 /* Common widget styles */
423 .widget-dnd,
424 .widget-label,
425 .widget-volume,
426 .widget-slider,
427 .widget-backlight {
428 margin-left: 8px;
429 margin-right: 8px;
430 margin-top: 0px;
431 margin-bottom: 0px;
432 }
433
434 .widget-dnd label,
435 .widget-label>label {
436 color: var(--text-primary);
437 font-size: 18px;
438 }
439
440 .widget-dnd label {
441 margin: 8px;
442 margin-top: 16px;
443 }
444
445 .widget-dnd switch {
446 margin: 8px;
447 margin-top: 16px;
448 }
449
450 .widget-dnd switch slider {
451 border-radius: 0px;
452 }
453
454 .widget-label {
455 margin: 8px;
456 }
457
458 /* Mpris widget */
459 .widget-mpris {
460 margin: 5px;
461 }
462
463 .widget-mpris .widget-mpris-player {
464 margin: 10px 10px;
465 border-radius: 0px;
466 box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.75);
467 border: 1px solid var(--border-color);
468 }
469
470 .widget-mpris .widget-mpris-player .mpris-background {
471 filter: blur(2px);
472 }
473
474 .widget-mpris .widget-mpris-player .mpris-overlay {
475 padding: 16px;
476 background-color: rgba(0, 0, 0, 0.55);
477 }
478
479 .widget-mpris .widget-mpris-player .mpris-overlay button:hover {
480 background: var(--bg-primary);
481 }
482
483 .widget-mpris .widget-mpris-player .mpris-overlay .widget-mpris-album-art {
484 border-radius: 0px;
485 box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.75);
486 -gtk-icon-size: 50px;
487 }
488
489 .widget-mpris .widget-mpris-player .mpris-overlay .widget-mpris-title {
490 font-weight: bold;
491 font-size: 16px;
492 }
493
494 .widget-mpris .widget-mpris-player .mpris-overlay .widget-mpris-subtitle {
495 font-size: 16px;
496 }
497
498 .widget-mpris .widget-mpris-player .mpris-overlay>box>button {
499 margin: 2px;
500 color: var(--text-primary);
501 }
502
503 .widget-mpris .widget-mpris-player .mpris-overlay>box>button:hover {
504 background-color: rgba(0, 0, 0, 0.5);
505 }
506
507 .widget-mpris>box>button {
508 color: var(--text-primary);
509 }
510
511 .widget-mpris>box>button:disabled {
512 color: var(--text-disabled);
513 }
514
515 /* Buttons widget */
516 .widget-buttons-grid {
517 padding: 8px;
518 margin: 8px;
519 border-radius: 0px;
520 }
521
522 .widget-buttons-grid flowboxchild>button {
523 border-radius: 0px;
524 }
525
526 /* Menubar widget */
527 .widget-menubar>.menu-button-bar>.start {
528 margin-left: 8px;
529 }
530
531 .widget-menubar>.menu-button-bar>.end {
532 margin-right: 8px;
533 }
534
535 .widget-menubar>.menu-button-bar>.widget-menubar-container button {
536 margin: 0 4px;
537 }
538
539 .widget-menubar>revealer {
540 margin-top: 8px;
541 }
542
543 .widget-menubar>revealer button {
544 margin: 8px;
545 margin-top: 0;
546 }
547
548 /* Volume widget */
549 .widget-volume {
550 padding: 8px;
551 margin-bottom: 8px;
552 border-radius: 0px;
553 }
554
555 .widget-volume row image {
556 -gtk-icon-size: 24px;
557 }
558
559 .per-app-volume {
560 background-color: var(--bg-secondary);
561 padding: 8px 8px 8px 8px;
562 margin: 8px 8px 8px 8px;
563 border-radius: 0px;
564 }
565
566 /* Slider widget */
567 .widget-slider {
568 padding: 8px;
569 border-radius: 0px;
570 }
571
572 .widget-slider label {
573 font-size: inherit;
574 }
575
576 /* Backlight widget */
577 .widget-backlight {
578 padding: 8px;
579 border-radius: 0px;
580 margin-top: -8px;
581 margin-bottom: 8px;
582 }
583
584 /* Inhibitors widget */
585 .widget-inhibitors>label {
586 margin: 8px;
587 font-size: 16px;
588 }
589
590 .widget-inhibitors>button {
591 margin: 8px;
592 }
593 '';
594 };
595}