diff --git a/swaync/config.json b/swaync/config.json new file mode 100644 index 0000000..76a11d2 --- /dev/null +++ b/swaync/config.json @@ -0,0 +1,96 @@ +{ + "$schema": "/etc/xdg/swaync/configSchema.json", + "ignore-gtk-theme": true, + "positionX": "right", + "positionY": "top", + "layer": "overlay", + "control-center-layer": "top", + "layer-shell": true, + "layer-shell-cover-screen": false, + "cssPriority": "highest", + "control-center-margin-top": 0, + "control-center-margin-bottom": 0, + "control-center-margin-right": 0, + "control-center-margin-left": 0, + "notification-2fa-action": true, + "notification-inline-replies": false, + "notification-body-image-height": 100, + "notification-body-image-width": 200, + "timeout": 10, + "timeout-low": 5, + "timeout-critical": 0, + "fit-to-screen": true, + "relative-timestamps": true, + "control-center-width": 500, + "control-center-height": 600, + "notification-window-width": 500, + "keyboard-shortcuts": true, + "notification-grouping": true, + "image-visibility": "when-available", + "transition-time": 200, + "hide-on-clear": false, + "hide-on-action": true, + "text-empty": "No Notifications", + "script-fail-notify": true, + "scripts": { + "example-script": { + "exec": "echo 'Do something...'", + "urgency": "Normal" + }, + "example-action-script": { + "exec": "echo 'Do something actionable!'", + "urgency": "Normal", + "run-on": "action" + } + }, + "notification-visibility": { + "example-name": { + "state": "muted", + "urgency": "Low", + "app-name": "Spotify" + } + }, + "widgets": [ + "inhibitors", + "title", + "dnd", + "notifications" + ], + "widget-config": { + "inhibitors": { + "text": "Inhibitors", + "button-text": "Clear All", + "clear-all-button": true + }, + "title": { + "text": "Notifications", + "clear-all-button": true, + "button-text": "Clear All" + }, + "dnd": { + "text": "Do Not Disturb" + }, + "label": { + "max-lines": 5, + "text": "Label Text" + }, + "mpris": { + "blacklist": [], + "autohide": false, + "show-album-art": "always", + "loop-carousel": false + }, + "buttons-grid": { + "buttons-per-row": 7, + "actions": [ + { + "label": "яки", + "type": "toggle", + "active": true, + "command": "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && nmcli radio wifi on || nmcli radio wifi off'", + "update-command": "sh -c '[[ $(nmcli radio wifi) == \"enabled\" ]] && echo true || echo false'" + } + ] + } + } +} diff --git a/swaync/style.css b/swaync/style.css new file mode 100644 index 0000000..69f2fa4 --- /dev/null +++ b/swaync/style.css @@ -0,0 +1,552 @@ +:root { + --cc-bg: #1c1c1cca; + --noti-border-color: rgba(90, 104, 115, 0.5); + --noti-bg: #1c1c1cca; + --noti-bg-alpha: 0.85; + --noti-bg-darker: rgb(38, 38, 38); + --noti-bg-hover: rgb(56, 56, 56); + --noti-bg-focus: #9e2238dd; + --noti-close-bg: rgb(78, 78, 78); + --noti-close-bg-hover: rgb(94, 94, 94); + --text-color: #FFe8EE; + --text-color-disabled: rgb(150, 150, 150); + --bg-selected: #d14781; + --notification-icon-size: 64px; + --notification-app-icon-size: calc(var(--notification-icon-size) / 3); + --notification-group-icon-size: 32px; +} + +* { + font: "JetBrains Mono Nerd Font 10"; +} + +.close-button { + /* The notification Close Button */ + background: var(--noti-close-bg); + color: var(--text-color); + text-shadow: none; + padding: 0; + border-radius: 100%; + margin-top: 8px; + margin-right: 8px; + box-shadow: none; + border: none; + min-width: 24px; + min-height: 24px; +} + +.close-button:hover { + box-shadow: none; + background: var(--noti-close-bg-hover); + transition: background 0.15s ease-in-out; + border: none; +} + +.notification-row { + background: none; + outline: none; +} + +.notification-row:focus { + background: var(--noti-bg-focus); +} + +.notification-row .notification-background { + padding: 6px 12px; +} + +.notification-row .notification-background .notification { + /* The actual notification */ + border-radius: 12px; + border: 1px solid var(--noti-border-color); + padding: 0; + transition: background 0.15s ease-in-out; + background-color: var(--cc-bg); +} + +.notification-row .notification-background .notification.low { + /* Low Priority Notification */ +} + +.notification-row .notification-background .notification.normal { + /* Normal Priority Notification */ +} + +.notification-row .notification-background .notification.critical { + /* Critical Priority Notification */ +} + +.notification-row .notification-background .notification .notification-default-action { + /* The large action that also displays the notification summary and body */ + padding: 4px; + margin: 0; + box-shadow: none; + background: transparent; + border: none; + color: var(--text-color); + transition: background 0.15s ease-in-out; + border-radius: 12px; +} + +.notification-row .notification-background .notification .notification-default-action:hover { + -gtk-icon-filter: none; + background: var(--noti-bg-hover); +} + +.notification-row .notification-background .notification .notification-default-action:not(:only-child) { + /* When alternative actions are visible */ + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content { + background: transparent; + border-radius: 12px; + padding: 0; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .image { + /* Notification Primary Image */ + -gtk-icon-filter: none; + -gtk-icon-size: var(--notification-icon-size); + border-radius: 100px; + /* Size in px */ + margin: 4px; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .app-icon { + /* Notification app icon (only visible when the primary image is set) */ + -gtk-icon-filter: none; + -gtk-icon-size: var(--notification-app-icon-size); + -gtk-icon-shadow: 0 1px 4px black; + margin: 6px; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .text-box label { + /* Fixes base GTK 4 CSS setting a filter of opacity 50% for some odd reason */ + filter: none; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .text-box .summary { + /* Notification summary/title */ + font-size: 16px; + font-weight: bold; + background: transparent; + color: var(--text-color); + text-shadow: none; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .text-box .time { + /* Notification time-ago */ + font-size: 16px; + font-weight: bold; + background: transparent; + color: var(--text-color); + text-shadow: none; + margin-right: 30px; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .text-box .body { + /* Notification body */ + font-size: 15px; + font-weight: normal; + background: transparent; + color: var(--text-color); + text-shadow: none; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content progressbar { + /* The optional notification progress bar */ + margin-top: 4px; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .body-image { + /* The "extra" optional bottom notification image */ + margin-top: 4px; + background-color: white; + -gtk-icon-filter: none; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .inline-reply { + /* The inline reply section */ + margin-top: 4px; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .inline-reply .inline-reply-entry { + background: var(--noti-bg-darker); + color: var(--text-color); + caret-color: var(--text-color); + border: 1px solid var(--noti-border-color); + border-radius: 12px; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .inline-reply .inline-reply-button { + margin-left: 4px; + background: rgba(var(--noti-bg), var(--noti-bg-alpha)); + border: 1px solid var(--noti-border-color); + border-radius: 12px; + color: var(--text-color); +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .inline-reply .inline-reply-button:disabled { + background: initial; + color: var(--text-color-disabled); + border: 1px solid var(--noti-border-color); + border-color: transparent; +} + +.notification-row .notification-background .notification .notification-default-action .notification-content .inline-reply .inline-reply-button:hover { + background: var(--noti-bg-hover); +} + +.notification-row .notification-background .notification .notification-alt-actions { + background: none; + border-bottom-left-radius: 12px; + border-bottom-right-radius: 12px; + padding: 4px; +} + +.notification-row .notification-background .notification .notification-action { + /* The alternative actions below the default action */ + margin: 4px; + padding: 0; +} + +.notification-row .notification-background .notification .notification-action > button { + border-radius: 12px; +} + +.notification-group { + /* Styling only for Grouped Notifications */ + transition: opacity 200ms ease-in-out; + /* The groups close button */ +} + +.notification-group:focus { + background: var(--noti-bg-focus); +} + +.notification-group.low { + /* Low Priority Group */ +} + +.notification-group.normal { + /* Low Priority Group */ +} + +.notification-group.critical { + /* Low Priority Group */ +} + +.notification-group .notification-group-close-button .close-button { + margin: 12px 20px; +} + +.notification-group .notification-group-buttons, .notification-group .notification-group-headers { + margin: 0 16px; + color: var(--text-color); +} + +.notification-group .notification-group-headers { + /* Notification Group Headers */ +} + +.notification-group .notification-group-headers .notification-group-icon { + color: var(--text-color); + -gtk-icon-size: var(--notification-group-icon-size); +} + +.notification-group .notification-group-headers .notification-group-header { + color: var(--text-color); +} + +.notification-group .notification-group-buttons { + /* Notification Group Buttons */ +} + +.notification-group.collapsed { + /* When another group is expanded, lower the opacity of the collapsed ones */ +} + +.notification-group.collapsed.not-expanded { + opacity: 0.4; +} + +.notification-group.collapsed .notification-row .notification { + background-color: rgba(var(--noti-bg), 1); +} + +.notification-group.collapsed .notification-row:not(:last-child) { + /* Top notification in stack */ + /* Set lower stacked notifications opacity to 0 */ +} + +.notification-group.collapsed .notification-row:not(:last-child) .notification-action, +.notification-group.collapsed .notification-row:not(:last-child) .notification-default-action { + opacity: 0; +} + +.notification-group.collapsed:hover .notification-row:not(:only-child) .notification { + background-color: var(--noti-bg-hover); +} + +.control-center { + /* The Control Center which contains the old notifications + widgets */ + background: var(--cc-bg); + color: var(--text-color); + border-radius: 12px; + border: 3px solid var(--noti-border-color); +} + +.control-center .control-center-list-placeholder { + /* The placeholder when there are no notifications */ + opacity: 0.5; +} + +.control-center .control-center-list { + /* List of notifications */ + background: transparent; +} + +.control-center .control-center-list .notification { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), 0 1px 3px 1px rgba(0, 0, 0, 0.7), 0 2px 6px 2px rgba(0, 0, 0, 0.3); +} + +.control-center .control-center-list .notification .notification-default-action, +.control-center .control-center-list .notification .notification-action { + transition: opacity 400ms ease-in-out, background 0.15s ease-in-out; +} + +.control-center .control-center-list .notification .notification-default-action:hover, +.control-center .control-center-list .notification .notification-action:hover { + background-color: var(--noti-bg-hover); +} + +.blank-window { + /* Window behind control center and on all other monitors */ + background: none; +} + +.floating-notifications { + background-color: transparent; +} + +.floating-notifications .notification { + box-shadow: none; +} + +/*** Widgets ***/ +/* Title widget */ +.widget-title > label { + margin: 8px; + font-size: 1.5rem; +} + +.widget-title > button { + margin: 8px; + border-radius: 12px; +} + +/* DND widget */ +.widget-dnd label { + color: var(--text-color); + margin: 8px; + font-size: 1.1rem; +} + +.widget-dnd switch { + border-radius: 12px; + margin: 8px; +} + +.widget-dnd switch slider { + border-radius: 12px; +} + +/* Label widget */ +.widget-label { + margin: 8px; +} + +.widget-label > label { + font-size: 1.1rem; +} + +/* Mpris widget */ +:root { + --mpris-album-art-overlay: rgba(0, 0, 0, 0.55); + --mpris-button-hover: rgba(0, 0, 0, 0.5); + --mpris-album-art-icon-size: 96px; +} + +.widget-mpris { + margin: 8px; + /* The parent to all players */ +} + +.widget-mpris .widget-mpris-player { + margin: 16px 20px; + border-radius: 12px; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.75); +} + +.widget-mpris .widget-mpris-player .mpris-background { + filter: blur(10px); +} + +.widget-mpris .widget-mpris-player .mpris-overlay { + padding: 16px; + background-color: var(--mpris-album-art-overlay); +} + +.widget-mpris .widget-mpris-player .mpris-overlay button:hover { + /* The media player buttons (play, pause, next, etc...) */ + background: var(--noti-bg-hover); +} + +.widget-mpris .widget-mpris-player .mpris-overlay .widget-mpris-album-art { + border-radius: 12px; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.75); + -gtk-icon-size: var(--mpris-album-art-icon-size); +} + +.widget-mpris .widget-mpris-player .mpris-overlay .widget-mpris-title { + font-weight: bold; + font-size: 1.25rem; +} + +.widget-mpris .widget-mpris-player .mpris-overlay .widget-mpris-subtitle { + font-size: 1.1rem; +} + +.widget-mpris .widget-mpris-player .mpris-overlay > box > button { + /* Change player control buttons */ +} + +.widget-mpris .widget-mpris-player .mpris-overlay > box > button:hover { + background-color: var(--mpris-button-hover); +} + +.widget-mpris > box > button { + /* Change player side buttons */ +} + +.widget-mpris > box > button:disabled { + /* Change player side buttons insensitive */ +} + +/* Buttons widget */ +.widget-buttons-grid { + padding: 8px; + margin: 8px; + border-radius: 12px; +} + +.widget-buttons-grid flowboxchild > button { + border-radius: 12px; +} + +.widget-buttons-grid flowboxchild > button.toggle:checked { + /* style given to the active toggle button */ +} + +/* Menubar widget */ +.widget-menubar { + /* The revealer buttons */ + /* .AnyName { Name defined in config after # + background-color: rgba(var(--noti-bg), 1.0); + padding: 8px; + margin: 8px; + border-radius: 12px; + } + + .AnyName>button { + background: transparent; + border: none; + } + + .AnyName>button:hover { + background-color: var(--noti-bg-hover); + } */ +} + +.widget-menubar > .menu-button-bar { + /* The left button container */ + /* The right button container */ + /* The left and right button container */ +} + +.widget-menubar > .menu-button-bar > .start { + margin-left: 8px; +} + +.widget-menubar > .menu-button-bar > .end { + margin-right: 8px; +} + +.widget-menubar > .menu-button-bar > .widget-menubar-container button { + border-radius: 12px; + margin: 0 4px; +} + +.widget-menubar > revealer { + margin-top: 8px; +} + +.widget-menubar > revealer button { + border-radius: 12px; + margin: 8px; + margin-top: 0; +} + +/* Volume widget */ +:root { + --widget-volume-row-icon-size: 24px; +} + +.widget-volume { + padding: 8px; + margin: 8px; + border-radius: 12px; +} + +/* Each row app icon */ +.widget-volume row image { + -gtk-icon-size: var(--widget-volume-row-icon-size); +} + +.per-app-volume { + background-color: var(--noti-bg-alt); + padding: 4px 8px 8px 8px; + margin: 0px 8px 8px 8px; + border-radius: 12px; +} + +/* Slider widget */ +.widget-slider { + padding: 8px; + margin: 8px; + border-radius: 12px; +} + +.widget-slider label { + font-size: inherit; +} + +/* Backlight widget */ +.widget-backlight { + padding: 8px; + margin: 8px; + border-radius: 12px; +} + +/* Inhibitors widget */ +.widget-inhibitors > label { + margin: 8px; + font-size: 1.5rem; +} + +.widget-inhibitors > button { + margin: 8px; + border-radius: 12px; +}