From 296fbde42a659ff55c3ddcd9d3d21212392b2649 Mon Sep 17 00:00:00 2001 From: Jas Singh Date: Mon, 17 Jun 2024 01:45:06 -0700 Subject: [PATCH] Added notification popups --- config.js | 2 + modules/bar/network/index.js | 1 - modules/bar/window_title/index.js | 37 ++--- modules/menus/DropdownMenu.js | 2 - modules/menus/bluetooth/index.js | 221 +++++++++++++++++------------- modules/notifications/index.js | 82 +++++++++++ scss/main.scss | 3 + scss/menus/bluetooth.scss | 14 +- scss/notifications/popups.scss | 58 ++++++++ style.css | 69 +++++++++- style.css.map | 2 +- 11 files changed, 370 insertions(+), 121 deletions(-) create mode 100644 modules/notifications/index.js create mode 100644 scss/notifications/popups.scss diff --git a/config.js b/config.js index 427669f..20ea81d 100644 --- a/config.js +++ b/config.js @@ -2,6 +2,7 @@ import { exec } from "resource:///com/github/Aylur/ags/utils.js"; import { Bar, BarAlt } from "./modules/bar/bar.js"; import DirectoryMonitorService from "./directoryMonitorService.js"; import MenuWindows from "./modules/menus/main.js"; +import Notifications from "./modules/notifications/index.js"; const applyScss = () => { // Compile scss @@ -39,6 +40,7 @@ export default { App.config({ windows: [ ...MenuWindows, + Notifications(), BarAlt(0, workspaceMonitorMap), BarAlt(1, workspaceMonitorMap), Bar(2, workspaceMonitorMap), diff --git a/modules/bar/network/index.js b/modules/bar/network/index.js index 5c8bb68..5bdd524 100644 --- a/modules/bar/network/index.js +++ b/modules/bar/network/index.js @@ -30,7 +30,6 @@ const Network = () => { isVisible: true, props: { on_primary_click: (_, event) => { - console.log(JSON.stringify(network, null, 2)); const clickPos = event.get_root_coords(); const coords = [clickPos[1], clickPos[2]]; diff --git a/modules/bar/window_title/index.js b/modules/bar/window_title/index.js index ba6493f..3281015 100644 --- a/modules/bar/window_title/index.js +++ b/modules/bar/window_title/index.js @@ -1,39 +1,32 @@ const hyprland = await Service.import("hyprland"); -const filterTitle = (titleString) => { +const filterTitle = (windowtitle) => { const windowTitleMap = [ - ["(.*) - NVIM", " NeoVim"], - ["(.*) - nvim", " NeoVim"], - ["(.*) - VIM", " NeoVim"], - ["(.*)vim (.*)", " NeoVim"], - ["(.*) — Mozilla Firefox", "󰈹 Firefox"], - ["(.*) - Microsoft(.*)Edge", "󰇩 Edge"], - ["(.*) - Discord", " Discord"], - ["(.*) — Dolphin", " Dolphin"], - ["Plex", "󰚺 Plex"], - ["(.*) Steam", " Steam"], - [" ", "󰇄 Desktop"], - ["(.*) Spotify Free", "󰓇 Spotify"], - ["(.*)Spotify Premium", "󰓇 Spotify"], - ["Spotify", "󰓇 Spotify"], - [" ~", " Terminal"], - ["(.*) - Obsidian(.*)", "󱓧 Obsidian"], - ["(.+)", `󰣆 ${titleString.charAt(0).toUpperCase() + titleString.slice(1)}`], - ["(.*)", `󰣆 Desktop`], + ["kitty", "󰄛 Kitty Terminal"], + ["firefox", "󰈹 Firefox"], + ["microsoft-edge", "󰇩 Edge"], + ["discord", " Discord"], + ["org.kde.dolphin", " Dolphin"], + ["plex", "󰚺 Plex"], + ["steam", " Steam"], + ["", "󰇄 Desktop"], + ["spotify", "󰓇 Spotify"], + ["obsidian", "󱓧 Obsidian"], + ["(.+)", `󰣆 ${windowtitle.class.charAt(0).toUpperCase() + windowtitle.class.slice(1)}`], ]; const foundMatch = windowTitleMap.find((wt) => - RegExp(wt[0]).test(titleString), + RegExp(wt[0]).test(windowtitle.class.toLowerCase()), ); - return foundMatch ? foundMatch[1] : titleString; + return foundMatch ? foundMatch[1] : windowtitle.class; }; const ClientTitle = () => { return { component: Widget.Label({ class_name: "window_title", - label: hyprland.active.client.bind("title").as((v) => filterTitle(v)), + label: hyprland.active.bind("client").as((v) => filterTitle(v)), }), isVisible: true, }; diff --git a/modules/menus/DropdownMenu.js b/modules/menus/DropdownMenu.js index 297e012..fca1ed2 100644 --- a/modules/menus/DropdownMenu.js +++ b/modules/menus/DropdownMenu.js @@ -11,8 +11,6 @@ export const Padding = (name) => const moveBoxToCursor = (self, minWidth, minHeight, child) => { globalMousePos.connect("changed", ({ value }) => { - // console.log(child.get_allocated_height()); - // console.log(child.get_allocated_width()); let monWidth = hyprland.monitors[hyprland.active.monitor.id].width; let monHeight = hyprland.monitors[hyprland.active.monitor.id].height; diff --git a/modules/menus/bluetooth/index.js b/modules/menus/bluetooth/index.js index 059ab4f..0c40621 100644 --- a/modules/menus/bluetooth/index.js +++ b/modules/menus/bluetooth/index.js @@ -2,10 +2,6 @@ const bluetooth = await Service.import("bluetooth"); import DropdownMenu from "../DropdownMenu.js"; export default () => { - bluetooth.connect("changed", (value) => { - // console.log(JSON.stringify(value, null, 2)); - }); - const connectedDevices = (btDevices) => { const noDevices = () => { return Widget.Box({ @@ -69,9 +65,11 @@ export default () => { label: dev.paired ? "" : "", }), on_primary_click: () => - Utils.execAsync( + Utils.execAsync([ + "bash", + "-c", `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, - ).catch((err) => + ]).catch((err) => console.error( `bluetoothctl ${dev.paired ? "unpair" : "pair"} ${dev.address}`, err, @@ -87,9 +85,11 @@ export default () => { label: dev.connected ? "󱘖" : "", }), on_primary_click: () => - Utils.execAsync( + Utils.execAsync([ + "bash", + "-c", `bluetoothctl ${dev.connected ? "disconnect" : "connect"} ${dev.address}`, - ).catch((err) => + ]).catch((err) => console.error( `bluetoothctl ${dev.connected ? "disconnect" : "connect"} ${dev.address}`, err, @@ -104,9 +104,11 @@ export default () => { label: dev.trusted ? "" : "󱖡", }), on_primary_click: () => - Utils.execAsync( + Utils.execAsync([ + "bash", + "-c", `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, - ).catch((err) => + ]).catch((err) => console.error( `bluetoothctl ${dev.trusted ? "untrust" : "trust"} ${dev.address}`, err, @@ -121,9 +123,11 @@ export default () => { label: "󰆴", }), on_primary_click: () => - Utils.execAsync( + Utils.execAsync([ + "bash", + "-c", `bluetoothctl remove ${dev.address}`, - ).catch((err) => + ]).catch((err) => console.error("Bluetooth Remove", err), ), }), @@ -139,77 +143,110 @@ export default () => { return btDevices.length === 0 ? noDevices() : deviceList(); }; - const renderDevices = (btDevices) => { - return btDevices - .filter( - (device) => - device.name !== null && - !bluetooth.connected_devices.find( - (dev) => dev.address === device.address, - ), - ) - .map((device) => { - return Widget.Button({ - class_name: `menu-button bluetooth ${device}`, - on_primary_click: () => { - Utils.execAsync(`bluetoothctl connect ${device.address}`).catch( - (err) => - console.error(`bluetoothctl connect ${device.address}`, err), - ); - Utils.execAsync(`bluetoothctl pair ${device.address}`).catch( - (err) => - console.error(`bluetoothctl pair ${device.address}`, err), - ); - }, - child: Widget.Box({ - children: [ + const renderDevices = () => { + return Widget.Box({ + class_name: "search-devices-container", + vertical: true, + setup: (self) => + self.hook(bluetooth, () => { + const availableDevices = bluetooth.devices.filter( + (device) => + device.name !== null && + !bluetooth.connected_devices.find( + (dev) => dev.address === device.address, + ), + ); + + if (availableDevices.length === 0) { + return (self.children = [ Widget.Box({ - hpack: "start", + class_name: "empty-bt-devices-container dim", + vertical: true, children: [ - Widget.Icon({ - class_name: bluetooth - .bind("connected_devices") - .as((btDevices) => - btDevices.find((cd) => cd.alias === device.alias) - ? "menu-button-icon active bluetooth" - : "menu-button-icon bluetooth", - ), - icon: `${device["icon-name"]}-symbolic`, + Widget.Label({ + hexpand: true, + label: "No devices currently found", }), Widget.Label({ - class_name: bluetooth - .bind("connected_devices") - .as((btDevices) => - btDevices.find((cd) => cd.alias === device.alias) - ? "menu-button-name active bluetooth" - : "menu-button-name bluetooth", - ), - truncate: "end", - wrap: true, - label: device.alias, + hexpand: true, + label: "Press '󰑐' to search", }), ], }), - Widget.Box({ - hpack: "end", - expand: true, - children: [ - Widget.Label({ - class_name: "menu-button-isactive bluetooth", - label: bluetooth - .bind("connected_devices") - .as((btDevices) => - btDevices.find((cd) => cd.alias === device.alias) - ? " " - : "", - ), - }), - ], - }), - ], - }), - }); - }); + ]); + } + return (self.children = bluetooth.devices + .filter( + (device) => + device.name !== null && + !bluetooth.connected_devices.find( + (dev) => dev.address === device.address, + ), + ) + .map((device) => { + return Widget.Button({ + hexpand: true, + class_name: `menu-button bluetooth ${device}`, + on_primary_click: () => { + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl pair ${device.address}`, + ]).catch((err) => { + console.error( + `bluetoothctl pair ${device.address}`, + err, + ); + + setTimeout(() => { + Utils.execAsync([ + "bash", + "-c", + `bluetoothctl connect ${device.address}`, + ]).catch((err) => + console.error( + `bluetoothctl connect ${device.address}`, + err, + ), + ); + }, 2000); + }); + }, + child: Widget.Box({ + children: [ + Widget.Box({ + hpack: "start", + children: [ + Widget.Icon({ + class_name: "menu-button-icon bluetooth", + icon: `${device["icon-name"]}-symbolic`, + }), + Widget.Label({ + hexpand: true, + class_name: "menu-button-name bluetooth", + truncate: "end", + wrap: true, + label: device.alias, + }), + ], + }), + Widget.Box({ + hpack: "end", + children: device.connecting + ? [ + Widget.Label({ + class_name: "bluetooth-isconnecting", + label: "󰲼", + }), + ] + : [], + }), + ], + }), + }); + })); + }), + }); }; const bluetoothOnModule = () => { @@ -250,25 +287,26 @@ export default () => { hpack: "end", child: Widget.Button({ class_name: "menu-icon-button", - on_primary_click: () => - Utils.execAsync( + on_primary_click: () => { + Utils.notify("Yoyo"); + Utils.execAsync([ + "bash", + "-c", "bluetoothctl --timeout 120 scan on", - ).catch((err) => + ]).catch((err) => console.error( "bluetoothctl --timeout 120 scan on", err, ), - ), + ); + }, child: Widget.Icon("view-refresh-symbolic"), }), }), ], }), Widget.Box({ - vertical: true, - children: bluetooth - .bind("devices") - .as((v) => renderDevices(v)), + child: renderDevices(), }), ], }), @@ -300,7 +338,7 @@ export default () => { return DropdownMenu({ name: "bluetoothmenu", transition: "crossfade", - minWidth: 325, + minWidth: 350, child: Widget.Box({ class_name: "menu-items", child: Widget.Box({ @@ -323,16 +361,13 @@ export default () => { hpack: "end", child: Widget.Switch({ class_name: "menu-switch bluetooth", - active: bluetooth.enabled, - setup: (self) => { - bluetooth.connect("changed", ({ enabled }) => { - self.set_property("active", enabled); - }); - }, + active: bluetooth.bind("enabled"), on_activate: ({ active }) => - Utils.execAsync( + Utils.execAsync([ + "bash", + "-c", `bluetoothctl power ${active ? "on" : "off"}`, - ).catch((err) => + ]).catch((err) => console.error( `bluetoothctl power ${active ? "on" : "off"}`, err, diff --git a/modules/notifications/index.js b/modules/notifications/index.js new file mode 100644 index 0000000..697096e --- /dev/null +++ b/modules/notifications/index.js @@ -0,0 +1,82 @@ +const notifs = await Service.import("notifications"); + +export default () => { + notifs.popupTimeout = 7000; + + return Widget.Window({ + name: "notifications-window", + class_name: "notifications-window", + layer: "top", + anchor: ["top", "right"], + child: Widget.Box({ + vertical: true, + class_name: "notification-card-container", + setup: (self) => { + self.hook(notifs, () => { + if (notifs.dnd) { + return; + } + + return (self.children = notifs.popups.map((notif) => { + return Widget.Box({ + class_name: "notification-card", + children: [ + Widget.Box({ + class_name: "notification-card-image-container", + hpack: "start", + child: Widget.Box({ + class_name: "notification-card-image", + css: `background-image: url("${notif.image}")`, + }), + }), + Widget.Box({ + vertical: true, + hpack: "end", + class_name: "notification-card-content", + children: [ + Widget.Box({ + class_name: "notification-card-header", + children: [ + Widget.Label({ + class_name: "notification-card-header-label", + truncate: "end", + wrap: true, + label: notif["summary"], + }), + ], + }), + Widget.Box({ + class_name: "notification-card-body", + vexpand: true, + children: [ + Widget.Label({ + class_name: "notification-card-body-label", + useMarkup: true, + lines: 3, + wrap: true, + truncate: "end", + label: notif["body"], + }), + ], + }), + Widget.Box({ + class_name: "notification-card-appname", + children: [ + Widget.Label({ + class_name: "notification-card-appname-label", + truncate: "end", + wrap: true, + label: notif["app-name"].toUpperCase(), + }), + ], + }), + ], + }), + ], + }); + })); + }); + }, + }), + }); +}; diff --git a/scss/main.scss b/scss/main.scss index af17dc0..c68f035 100644 --- a/scss/main.scss +++ b/scss/main.scss @@ -30,3 +30,6 @@ @import "menus/audiomenu"; @import "menus/network"; @import "menus/bluetooth"; + +//notifications +@import "notifications/popups"; diff --git a/scss/menus/bluetooth.scss b/scss/menus/bluetooth.scss index f3fbaff..6479d9e 100644 --- a/scss/menus/bluetooth.scss +++ b/scss/menus/bluetooth.scss @@ -19,7 +19,7 @@ } .menu-items { - min-width: 300px; + min-width: 350px; } .menu-icon-button { @@ -41,3 +41,15 @@ .menu-button-name.status { margin-left: 2.1rem; } + +.search-devices-container { + min-height: 8rem; +} + +.empty-bt-devices-container { + margin-top: 2rem; +} + +.bluetooth-isconnecting { + color: $sky; +} diff --git a/scss/notifications/popups.scss b/scss/notifications/popups.scss new file mode 100644 index 0000000..c82163f --- /dev/null +++ b/scss/notifications/popups.scss @@ -0,0 +1,58 @@ +@import "../colors"; + +.notification-card { + color: $text; + background: $mantle; + margin-top: 0.5rem; + margin-right: 0.5rem; + border: 0.15rem solid $lavender; + min-width: 32rem; + min-height: 7rem; + border-radius: 0.8rem; +} + +.notification-card-container { + padding: 1px; +} + + +.notification-card-image-container { + margin: 1.5rem 0.75rem; + min-width: 4rem; + min-height: 4rem; + // border: 0.15rem solid $surface2; + border-radius: 0.7rem; +} +.notification-card-image { + min-width: 4rem; + min-height: 4rem; + // padding: 1rem 1rem; + margin: 0.5rem 0rem; + margin-left: 0.5rem; + background-size: contain; + background-repeat: no-repeat; +} + +.notification-card-content { + min-width: 3.5rem; + min-height: 3.5rem; + padding: 0.6rem 0.6rem; + margin: 0.2rem 0rem; + margin-right: 1rem; +} + +.notification-card-appname-label { + margin-top: 0.4rem; + font-size: 0.9rem; + color: $pink; +} + +.notification-card-header-label { + font-size: 1.15rem; + margin-bottom: 0.25rem; + color: $lavender; +} + +.notification-card-body-label { + font-size: 1rem; +} diff --git a/style.css b/style.css index bf9991a..c0a87df 100644 --- a/style.css +++ b/style.css @@ -803,7 +803,7 @@ window#powermenu .powermenu.box { } .menu-items { - min-width: 300px; + min-width: 350px; } .menu-icon-button { @@ -826,4 +826,71 @@ window#powermenu .powermenu.box { margin-left: 2.1rem; } +.search-devices-container { + min-height: 8rem; +} + +.empty-bt-devices-container { + margin-top: 2rem; +} + +.bluetooth-isconnecting { + color: #89dceb; +} + +.notification-card { + color: #cdd6f4; + background: #181825; + margin-top: 0.5rem; + margin-right: 0.5rem; + border: 0.15rem solid #b4befe; + min-width: 32rem; + min-height: 7rem; + border-radius: 0.8rem; +} + +.notification-card-container { + padding: 1px; +} + +.notification-card-image-container { + margin: 1.5rem 0.75rem; + min-width: 4rem; + min-height: 4rem; + border-radius: 0.7rem; +} + +.notification-card-image { + min-width: 4rem; + min-height: 4rem; + margin: 0.5rem 0rem; + margin-left: 0.5rem; + background-size: contain; + background-repeat: no-repeat; +} + +.notification-card-content { + min-width: 3.5rem; + min-height: 3.5rem; + padding: 0.6rem 0.6rem; + margin: 0.2rem 0rem; + margin-right: 1rem; +} + +.notification-card-appname-label { + margin-top: 0.4rem; + font-size: 0.9rem; + color: #f5c2e7; +} + +.notification-card-header-label { + font-size: 1.15rem; + margin-bottom: 0.25rem; + color: #b4befe; +} + +.notification-card-body-label { + font-size: 1rem; +} + /*# sourceMappingURL=style.css.map */ diff --git a/style.css.map b/style.css.map index c70c9f7..1904d13 100644 --- a/style.css.map +++ b/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/bluetooth.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;;;ACJF;EACE;EACA;EACA,kBCFgB;EDGhB;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBChBW;;ADkBf;EACE,OCnBa;;ADqBf;EACE;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA,kBC/Be;;;ADmCnB;EACE;EACA;EACA;EACA,OCvCiB;;;AD0CnB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA,kBC9DiB;ED+DjB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA,kBC9EgB;;;ADiFlB;AAAA;EAEE;EACA,kBCpFgB;;;ADuFlB;AAAA;AAAA;EAGE,OC1FgB;ED2FhB,kBC7CW;;;ADgDb;AAAA;AAAA;EAGE;EACA,kBCpDW;;;ADuDb;AAAA;AAAA;EAGE;EACA,kBC3DW;;;AD8Db;EACE;EACA;EACA;EACA;EACA,kBChHiB;EDiHjB;EACA;EACA;;;AAGF;EACE,kBC1EW;;;AD6Eb;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBCvIc;EDwId;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA,kBChKiB;;;ADmKnB;EACE;EACA,kBCxHW;;;AD2Hb;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA,OC1IW;ED2IX,kBCzLgB;ED0LhB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBC1MgB;ED2MhB,OC5Mc;ED6Md;;;AAGF;EACE;EACA;EACA,kBCjNiB;;;ADoNnB;EACE;IACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AE/NF;EACE,YDmCM;EClCN;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cD2BM;EC1BN;EACA;;AAEA;EACE;EACA,cDSO;ECRP;;AAGF;EAEE;EACA,cDEO;;ACCT;EACE;EACA;EACA;EACA;;AAGF;EACE,YApCM;;AAwCN;EACE;EACA;;AAEF;EACE;EACA;;;AC9CN;EACE,OFsBK;EErBL;EACA;;;ACFA;EACE;;;AAIJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA,OHRM;;;AGWR;EACE,OHZM;;;AIpBR;EACE;EACA,OJoBM;;;AIjBR;EACE;EACA,OJeM;;;AKtBR;EACE,OLgBM;;;AMjBR;EACE;EACA,ONsBI;;;AMnBN;EACE,ONkBI;;;AMfN;EACE;EACA;EACA,ONsBS;EMrBT;;;AAGF;EACE,ONOI;;;AOxBN;EACE,OPeK;;;AQfL;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRmBO;;AQjBP;EACE,kBRQG;EQPH;EACA;;AAGF;EACE,kBROA;EQNA;EACA;;;AAMN;EACE;;;AC1BF;EACE,OTeK;;;AUhBP;EACE;;;AAGF;EACE,YViCO;;;AU/BT;EACE;EACA,OVkBS;;;AUfX;EACE,kBVsBS;;;AUnBX;EACE,kBVmBS;EUlBT;;;AAGF;EACE,kBVKS;;;AW3BX;EACE,OXiBI;EWhBJ;;;ACFF;EACE,YZqCO;EYpCP;EACA;;;AAGF;EACE,YZ6BS;EY5BT;EACA;EACA;;AAEA;EACE,YZsBO;;;AYlBX;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AC5BE;EACI,YbmCD;;AajCC;AAAA;EAEI,YbcJ;EabI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAIA;EACI,YbcD;;AaXH;EACI,YbOD;EaNC;;AAkBZ;EACI,kBbVO;;AaYP;EACI,YbzBF;;Aa6BE;AAAA;EAEI,kBbnCJ;EaoCI;;AAIR;EACI;EACA,kBb7BG;Ea8BH;EACA;EACA;EACA;EACA;;AAIA;EACI,YbpCD;;AauCH;EACI,Yb3CD;Ea4CC;;AAIR;EACI,kBb1DF;;Aa8EN;EACI;EACA;EACA,YbtEO;;;AayEX;EACI,YbvEK;EawEL;EACA;EACA;EACA,ObrFG;;;AawFP;EACI;;;AAGJ;EACI;EACA;EACA,Ob/FG;;;AakGP;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI,ObvGO;EawGP;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAEJ;EACI;;;AAGJ;EACI,ObrIG;EasIH;EACA;;;AAGJ;EACI,ObtIO;EauIP;EACA;EACA;;;AAGJ;EACI,Ob7IO;;;AagJP;EACI,ObhJG;;;AaoJX;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA,ObvKO;EawKP;;;AAGJ;EACI;;;AC7MJ;AAAA;EAGI;;;AAQJ;ECTI;EACA;EACA,kBfiCG;EehCH,OfwCS;EevCT;EACA;EDMA;EACA;EACA;EACA;;AAEA;EACI,eAXE;;AAaF;EACI;EACA,OdJH;EcKG;;AAGJ;EACI,OdDD;EcEC;EACA;EACA;;AAIR;EACI,YdGA;EcFA;EACA;EACA;EACA,cdDA;EcEA,eAhCC;EAiCD;EACA;EACA;;AAGI;EACI,cd1BR;Ec2BQ;;AAEJ;EACI,cdlCV;EcmCU;;AAIJ;EACI,cdpCR;EcqCQ;;AAEJ;EACI,cd5CV;Ec6CU;;AAKJ;EACI;EACA;;AAEJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEJ;EACI;EACA;;AAIZ;EACI,OdtEF;;AcwEF;EACI,OdrEA;;;AcyER;EC7FI;EACA;EACA,kBfiCG;EehCH,OfwCS;EevCT;EACA;;AD0FA;EACI;;AAGJ;EACI;;;AAIR;EACI,cdpEI;EcqEJ;EACA;EACA;;AAGI;EACI,cdhGN;;AckGE;EACI,cd/FJ;;AciGA;EACI,cdhGN;;AckGE;EACI,cdvGJ;;Ac2GA;EACI,cd9GN;;AcgHE;EACI,cd7GJ;;Ac+GA;EACI,cd9GN;;AcgHE;EACI,cdrHJ;;AcwHA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;;AAKR;EACI,Od1IF;;Ac4IF;EACI,OdzIA;;Ac2IJ;EACI,Od9IA;;AcgJJ;EACI,Od7IF;;;AckJF;EACI,OdzJF;;Ac2JF;EACI,OdxJA;;Ac0JJ;EACI,Od7JA;;Ac+JJ;EACI,Od5JF;;;AgBxBN;EACI,OhBmBI;;;AgBhBR;EACI,OhBeI;;;AgBZR;EACI,OhBWI;;;AgBNA;AAAA;EAEI,YhBIJ;;;AgBEH;EACG,OhBHA;;;AgBOR;EACI;;;AC5BJ;EACI,OjBuBE;;;AiBpBN;EACI,OjBmBE;;;AiBhBN;EACI,OjBeE;;;AiBXD;EACG,OjBUF;;;AiBNN;EACI;;;AAGJ;EACI;EACA;;AACA;EACI,OjBFF;;;AiBMN;EACI;;;AAGJ;EACI;;;AAGJ;EACI","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/bluetooth.scss","scss/notifications/popups.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;;;ACJF;EACE;EACA;EACA,kBCFgB;EDGhB;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBChBW;;ADkBf;EACE,OCnBa;;ADqBf;EACE;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA,kBC/Be;;;ADmCnB;EACE;EACA;EACA;EACA,OCvCiB;;;AD0CnB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA,kBC9DiB;ED+DjB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA,kBC9EgB;;;ADiFlB;AAAA;EAEE;EACA,kBCpFgB;;;ADuFlB;AAAA;AAAA;EAGE,OC1FgB;ED2FhB,kBC7CW;;;ADgDb;AAAA;AAAA;EAGE;EACA,kBCpDW;;;ADuDb;AAAA;AAAA;EAGE;EACA,kBC3DW;;;AD8Db;EACE;EACA;EACA;EACA;EACA,kBChHiB;EDiHjB;EACA;EACA;;;AAGF;EACE,kBC1EW;;;AD6Eb;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBCvIc;EDwId;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA,kBChKiB;;;ADmKnB;EACE;EACA,kBCxHW;;;AD2Hb;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA,OC1IW;ED2IX,kBCzLgB;ED0LhB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBC1MgB;ED2MhB,OC5Mc;ED6Md;;;AAGF;EACE;EACA;EACA,kBCjNiB;;;ADoNnB;EACE;IACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AE/NF;EACE,YDmCM;EClCN;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cD2BM;EC1BN;EACA;;AAEA;EACE;EACA,cDSO;ECRP;;AAGF;EAEE;EACA,cDEO;;ACCT;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","file":"style.css"} \ No newline at end of file