diff --git a/modules/bar/clock/index.js b/modules/bar/clock/index.js index bc8fe7c..9693fe7 100644 --- a/modules/bar/clock/index.js +++ b/modules/bar/clock/index.js @@ -1,5 +1,5 @@ const date = Variable("", { - poll: [1000, 'date "+󰃭 %a %b%e %I:%M:%S %p"'], + poll: [1000, 'date "+󰃭 %a %b %d %I:%M:%S %p"'], }); const Clock = () => { diff --git a/modules/menus/DropdownMenu.js b/modules/menus/DropdownMenu.js index 555d5de..26a480c 100644 --- a/modules/menus/DropdownMenu.js +++ b/modules/menus/DropdownMenu.js @@ -1,153 +1,57 @@ +const hyprland = await Service.import("hyprland"); + export const Padding = (name) => Widget.EventBox({ hexpand: true, vexpand: true, - can_focus: false, + can_focus: true, child: Widget.Box(), setup: (w) => w.on("button-press-event", () => App.toggleWindow(name)), }); -const PopupRevealer = (name, child, transition = "slide_down") => - Widget.Box( - { css: "padding: 1px;" }, - Widget.Revealer({ - transition, - child: Widget.Box({ - class_name: "window-content", - child, - }), - transitionDuration: 400, - setup: (self) => - self.hook(App, (_, wname, visible) => { - if (wname === name) self.reveal_child = visible; - }), - }), - ); +const moveBoxToCursor = (self, minWidth, minHeight, child) => { + function getAllMethods(object) { + return Object.getOwnPropertyNames(object).filter(function (property) { + return typeof object[property] == "function"; + }); + } + 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; -const Layout = (name, child, transition) => ({ - center: () => - Widget.CenterBox( - {}, - Padding(name), - Widget.CenterBox( - { vertical: true }, - Padding(name), - PopupRevealer(name, child, transition), - Padding(name), - ), - Padding(name), - ), - top: () => - Widget.CenterBox( - {}, - Padding(name), - Widget.Box( - { vertical: true }, - PopupRevealer(name, child, transition), - Padding(name), - ), - Padding(name), - ), - "top-right": () => - Widget.Box( - {}, - Padding(name), - Widget.Box( - { - hexpand: false, - vertical: true, - }, - PopupRevealer(name, child, transition), - Padding(name), - ), - ), - "top-center": () => - Widget.Box( - {}, - Padding(name), - Widget.Box( - { - hexpand: false, - vertical: true, - }, - PopupRevealer(name, child, transition), - Padding(name), - ), - Padding(name), - ), - "top-left": () => - Widget.Box( - {}, - Widget.Box( - { - hexpand: false, - vertical: true, - }, - PopupRevealer(name, child, transition), - Padding(name), - ), - Padding(name), - ), - "bottom-left": () => - Widget.Box( - {}, - Widget.Box( - { - hexpand: false, - vertical: true, - }, - Padding(name), - PopupRevealer(name, child, transition), - ), - Padding(name), - ), - "bottom-center": () => - Widget.Box( - {}, - Padding(name), - Widget.Box( - { - hexpand: false, - vertical: true, - }, - Padding(name), - PopupRevealer(name, child, transition), - ), - Padding(name), - ), - "bottom-right": () => - Widget.Box( - {}, - Padding(name), - Widget.Box( - { - hexpand: false, - vertical: true, - }, - Padding(name), - PopupRevealer(name, child, transition), - ), - ), - "anywhere": () => - Widget.Box( - {}, - Padding(name), - Widget.Box( - { - hexpand: false, - vertical: true, - }, - Padding(name), - PopupRevealer(name, child, transition), - ), - ), -}); + // If monitor is vertical (transform = 1 || 3) swap height and width + if (hyprland.monitors[hyprland.active.monitor.id].transform % 2 !== 0) { + [monWidth, monHeight] = [monHeight, monWidth]; + } + + let marginRight = monWidth - value[0] - minWidth / 2; + let marginLeft = monWidth - minWidth - marginRight; + + if (marginRight < 0) { + marginRight = 13; + marginLeft = monWidth - minWidth - 13; + } else if (marginRight < 13) { + marginRight = 13; + marginLeft = monWidth - minWidth - 13; + } + const marginTop = 40; + const marginBottom = monHeight + minHeight - marginTop; + self.set_margin_left(marginLeft); + self.set_margin_right(marginRight); + self.set_margin_top(marginTop); + self.set_margin_bottom(marginBottom); + }); +}; export default ({ name, child, layout = "center", transition, + minWidth = 400, + minHeight = 200, exclusivity = "ignore", ...props }) => @@ -160,6 +64,21 @@ export default ({ exclusivity, layer: "top", anchor: ["top", "bottom", "right", "left"], - child,//: Layout(name, child, transition)[layout](), + child: Widget.EventBox({ + on_primary_click: () => App.closeWindow(name), + child: Widget.EventBox({ + on_primary_click: () => { + return true; + }, + setup: (self) => { + moveBoxToCursor(self, minWidth, minHeight, child); + }, + child: Widget.Box({ + class_name: "dropdown-menu-container", + can_focus: true, + children: [Padding(name), child], + }), + }), + }), ...props, }); diff --git a/modules/menus/audio/index.js b/modules/menus/audio/index.js index 189d045..51b10bc 100644 --- a/modules/menus/audio/index.js +++ b/modules/menus/audio/index.js @@ -1,46 +1,246 @@ const audio = await Service.import("audio"); -const hyprland = await Service.import("hyprland"); import DropdownMenu from "../DropdownMenu.js"; export default () => { + const playbackDevices = Variable(audio.speakers); + const inputDevices = Variable(audio.microphones); + + audio.connect("changed", (aVal) => { + playbackDevices.value = aVal.speakers; + inputDevices.value = aVal.microphones; + }); + + const renderPlaybacks = (playbackDevices) => { + return playbackDevices.map((device) => { + if (device.description === "Dummy Output") { + return Widget.Box({ + class_name: `audiomenu-playback-button not-found`, + child: Widget.Box({ + children: [ + Widget.Label({ + class_name: "audiomenu-playback-button-icon", + label: "No playback devices found...", + }), + ], + }), + }); + } + return Widget.Button({ + class_name: `audiomenu-button playback ${device}`, + child: Widget.Box({ + children: [ + Widget.Label({ + class_name: "audiomenu-button-icon playback", + label: "o", + }), + Widget.Label({ + class_name: "audiomenu-button-name playback", + truncate: "end", + expand: true, + wrap: true, + label: device.description, + }), + Widget.Label({ + class_name: "audiomenu-button-isactive playback", + label: audio.speaker + .bind("description") + .as((v) => (device.description === v ? " y" : "")), + }), + ], + }), + }); + }); + }; + + const renderInputDevices = (inputDevices) => { + if (!inputDevices.length) { + return [ + Widget.Box({ + class_name: `audiomenu-inputs-button not-found`, + child: Widget.Box({ + children: [ + Widget.Label({ + class_name: "audiomenu-inputs-button-icon", + label: "No input devices found...", + }), + ], + }), + }), + ]; + } + return inputDevices.map((device) => { + return Widget.Button({ + class_name: `audiomenu-button input ${device}`, + child: Widget.Box({ + children: [ + Widget.Label({ + class_name: "audiomenu-button-icon input", + label: "/", + }), + Widget.Label({ + class_name: "audiomenu-button-name input", + label: device.description, + }), + Widget.Label({ + class_name: "audiomenu-button-isactive input", + truncate: "end", + expand: true, + wrap: true, + label: audio.microphone + .bind("description") + .as((v) => (device.description === v ? " y" : "")), + }), + ], + }), + }); + }); + }; + + const renderActivePlayback = () => { + return [ + Widget.Label({ + class_name: "audiomenu-active playback", + truncate: "end", + expand: true, + wrap: true, + label: audio.bind("speaker").as((v) => v.description || ""), + }), + Widget.Box({ + class_name: "audiomenu-slider-container playback", + children: [ + Widget.Label({ + class_name: "audiomenu-active-icon playback", + label: audio.speaker + .bind("volume") + .as((v) => `${v === 0 ? "m" : "a"}`), + }), + Widget.Slider({ + value: audio.speaker.bind("volume").as((v) => v * 100), + class_name: "audiomenu-active-slider playback", + draw_value: false, + hexpand: true, + min: 0, + max: 100, + onChange: ({ value }) => (audio.speaker.volume = value / 100), + }), + Widget.Label({ + class_name: "audiomenu-active-percentage playback", + label: audio.speaker + .bind("volume") + .as((v) => `${Math.floor(v * 100)}%`), + }), + ], + }), + ]; + }; + + const renderActiveInput = () => { + return [ + Widget.Label({ + class_name: "audiomenu-active input", + truncate: "end", + wrap: true, + label: audio.bind("microphone").as((v) => v.description || ""), + }), + Widget.Box({ + class_name: "audiomenu-slider-container input", + children: [ + Widget.Label({ + class_name: "audiomenu-active-icon input", + label: audio.microphone + .bind("volume") + .as((v) => `${v === 0 ? "m" : "a"}`), + }), + Widget.Slider({ + value: audio.microphone.bind("volume").as((v) => v * 100), + class_name: "audiomenu-active-slider inputs", + draw_value: false, + hexpand: true, + min: 0, + max: 100, + onChange: ({ value }) => (audio.microphone.volume = value / 100), + }), + Widget.Label({ + class_name: "audiomenu-active-percentage input", + label: audio.microphone + .bind("volume") + .as((v) => `${Math.floor(v * 100)}%`), + }), + ], + }), + ]; + }; + return DropdownMenu({ name: "audiomenu", transition: "crossfade", child: Widget.Box({ class_name: "audiomenu-items", - setup: (self) => - globalMousePos.connect("changed", ({ value }) => { - console.log("in hook"); - // console.log(value); - console.log(globalMousePos.value); - // TODO: Calculate these margins in the Dropmenu component - // We should just pass width/height and the component will - // calculate the appropriate margins from that... - const monWidth = hyprland.monitors[hyprland.active.monitor.id].width; - const monHeight = - hyprland.monitors[hyprland.active.monitor.id].height; - const marginLeft = value[0] - 100; - const marginRight = monWidth - value[0] - 100; - const marginTop = 40; - const marginBottom = monHeight + 40 - 10; - self.set_margin_left(marginLeft); - self.set_margin_right(marginRight); - self.set_margin_top(marginTop); - self.set_margin_bottom(marginBottom); - }), - // margin_left: 3625, //marginLeft.bind("value"), - // margin_right: 15, // marginRight.bind("value"), - // margin_top: 40, //marginTop.bind("value"), - // margin_bottom: 1360, //marginBottom.bind("value"), - children: [ - Widget.Button({ - class_name: "click-me", - child: Widget.Box({ - child: Widget.Label("Click Me"), + child: Widget.Box({ + vertical: true, + class_name: "audiomenu-items-container", + children: [ + Widget.Box({ + class_name: "audiomenu-dropdown-label-container", + hpack: "start", + children: [ + Widget.Label({ + class_name: "audiomenu-dropdown-label", + label: "Audio Devices", + }), + ], }), - on_clicked: () => console.log("CLICKED ME"), - }), - ], + Widget.Separator({ + class_name: "audiomenu-separator", + }), + Widget.Box({ + class_name: "audiomenu-active-container playback", + vertical: true, + children: renderActivePlayback(), + }), + Widget.Box({ + class_name: "audiomenu-active-container input", + vertical: true, + children: renderActiveInput(), + }), + Widget.Box({ + class_name: "audiomenu-label-container playback", + vertical: true, + hpack: "start", + children: [ + Widget.Label({ + class_name: "audiomenu-label playback", + label: "Playback Devices", + hpack: "start", + }), + Widget.Box({ + vertical: true, + children: audio + .bind("speakers") + .as((v) => renderPlaybacks(v)), + }), + ], + }), + Widget.Box({ + class_name: "audiomenu-label-container input", + hpack: "start", + vertical: true, + children: [ + Widget.Label({ + class_name: "audiomenu-label input", + hpack: "start", + label: "Input Devices", + }), + Widget.Box({ + vertical: true, + children: audio + .bind("microphones") + .as((v) => renderInputDevices(v)), + }), + ], + }), + ], + }), }), }); }; diff --git a/scss/menus/audiomenu.scss b/scss/menus/audiomenu.scss index 3f62c98..090db21 100644 --- a/scss/menus/audiomenu.scss +++ b/scss/menus/audiomenu.scss @@ -2,13 +2,50 @@ .audiomenu-items { background: $mantle; - border: 2px solid $peach; - border-radius: 11px; - min-width: 200px; - min-height: 300px; + border: .15rem solid $peach; + border-radius: .7rem; + min-width: 30rem; + min-height: 200px; +} + +.audiomenu-items-container { + margin: .5rem 1rem; } .click-me { background: $lavender; margin: 140px 0px; } + +.audiomenu-dropdown-label { + font-size: 1.5rem; + font-weight: bold; +} + +.audiomenu-separator { + min-height: .1rem; + margin: .6rem 0rem; + background: $surface1; +} + +.audiomenu-active { + font-size: 1.15rem; + font-weight: bold; + margin: 0rem .5rem; + margin-bottom: 1rem; +} + +.audiomenu-active-slider { + margin-left: 1rem; + margin-right: 1.5rem; +} + +.audiomenu-active-slider * { + background: $peach; + background-color: $peach; + min-height: 1.3rem; + border-radius: .6rem; +} +.audiomenu-slider-container { + margin-bottom: 1.5rem; +} diff --git a/style.css b/style.css index 2ee0e6f..3e0bf14 100644 --- a/style.css +++ b/style.css @@ -588,10 +588,14 @@ window#powermenu .powermenu.box { .audiomenu-items { background: #181825; - border: 2px solid #fab387; - border-radius: 11px; - min-width: 200px; - min-height: 300px; + border: 0.15rem solid #fab387; + border-radius: 0.7rem; + min-width: 30rem; + min-height: 200px; +} + +.audiomenu-items-container { + margin: 0.5rem 1rem; } .click-me { @@ -599,4 +603,38 @@ window#powermenu .powermenu.box { margin: 140px 0px; } +.audiomenu-dropdown-label { + font-size: 1.5rem; + font-weight: bold; +} + +.audiomenu-separator { + min-height: 0.1rem; + margin: 0.6rem 0rem; + background: #45475a; +} + +.audiomenu-active { + font-size: 1.15rem; + font-weight: bold; + margin: 0rem 0.5rem; + margin-bottom: 1rem; +} + +.audiomenu-active-slider { + margin-left: 1rem; + margin-right: 1.5rem; +} + +.audiomenu-active-slider * { + background: #fab387; + background-color: #fab387; + min-height: 1.3rem; + border-radius: 0.6rem; +} + +.audiomenu-slider-container { + margin-bottom: 1.5rem; +} + /*# sourceMappingURL=style.css.map */ diff --git a/style.css.map b/style.css.map index a620122..2b55704 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/powermenu.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss"],"names":[],"mappings":"AAAA;EACE;EACA;;;ACFF;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;;;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;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;ACzBF;AAAA;EAGI;;;AAQJ;ECTI;EACA;EACA,kBdiCG;EchCH,OdwCS;EcvCT;EACA;EDMA;EACA;EACA;EACA;;AAEA;EACI,eAXE;;AAaF;EACI;EACA,ObJH;EaKG;;AAGJ;EACI,ObDD;EaEC;EACA;EACA;;AAIR;EACI,YbGA;EaFA;EACA;EACA;EACA,cbDA;EaEA,eAhCC;EAiCD;EACA;EACA;;AAGI;EACI,cb1BR;Ea2BQ;;AAEJ;EACI,cblCV;EamCU;;AAIJ;EACI,cbpCR;EaqCQ;;AAEJ;EACI,cb5CV;Ea6CU;;AAKJ;EACI;EACA;;AAEJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEJ;EACI;EACA;;AAIZ;EACI,ObtEF;;AawEF;EACI,ObrEA;;;AayER;EC7FI;EACA;EACA,kBdiCG;EchCH,OdwCS;EcvCT;EACA;;AD0FA;EACI;;AAGJ;EACI;;;AAIR;EACI,cbpEI;EaqEJ;EACA;EACA;;AAGI;EACI,cbhGN;;AakGE;EACI,cb/FJ;;AaiGA;EACI,cbhGN;;AakGE;EACI,cbvGJ;;Aa2GA;EACI,cb9GN;;AagHE;EACI,cb7GJ;;Aa+GA;EACI,cb9GN;;AagHE;EACI,cbrHJ;;AawHA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;;AAKR;EACI,Ob1IF;;Aa4IF;EACI,ObzIA;;Aa2IJ;EACI,Ob9IA;;AagJJ;EACI,Ob7IF;;;AakJF;EACI,ObzJF;;Aa2JF;EACI,ObxJA;;Aa0JJ;EACI,Ob7JA;;Aa+JJ;EACI,Ob5JF;;;AexBN;EACI,YfqCK;EepCL;EACA;EACA;EACA;;;AAGJ;EACI,YfkBO;EejBP","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/powermenu.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss"],"names":[],"mappings":"AAAA;EACE;EACA;;;ACFF;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;;;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;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;ACzBF;AAAA;EAGI;;;AAQJ;ECTI;EACA;EACA,kBdiCG;EchCH,OdwCS;EcvCT;EACA;EDMA;EACA;EACA;EACA;;AAEA;EACI,eAXE;;AAaF;EACI;EACA,ObJH;EaKG;;AAGJ;EACI,ObDD;EaEC;EACA;EACA;;AAIR;EACI,YbGA;EaFA;EACA;EACA;EACA,cbDA;EaEA,eAhCC;EAiCD;EACA;EACA;;AAGI;EACI,cb1BR;Ea2BQ;;AAEJ;EACI,cblCV;EamCU;;AAIJ;EACI,cbpCR;EaqCQ;;AAEJ;EACI,cb5CV;Ea6CU;;AAKJ;EACI;EACA;;AAEJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEJ;EACI;EACA;;AAIZ;EACI,ObtEF;;AawEF;EACI,ObrEA;;;AayER;EC7FI;EACA;EACA,kBdiCG;EchCH,OdwCS;EcvCT;EACA;;AD0FA;EACI;;AAGJ;EACI;;;AAIR;EACI,cbpEI;EaqEJ;EACA;EACA;;AAGI;EACI,cbhGN;;AakGE;EACI,cb/FJ;;AaiGA;EACI,cbhGN;;AakGE;EACI,cbvGJ;;Aa2GA;EACI,cb9GN;;AagHE;EACI,cb7GJ;;Aa+GA;EACI,cb9GN;;AagHE;EACI,cbrHJ;;AawHA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;;AAKR;EACI,Ob1IF;;Aa4IF;EACI,ObzIA;;Aa2IJ;EACI,Ob9IA;;AagJJ;EACI,Ob7IF;;;AakJF;EACI,ObzJF;;Aa2JF;EACI,ObxJA;;Aa0JJ;EACI,Ob7JA;;Aa+JJ;EACI,Ob5JF;;;AexBN;EACI,YfqCK;EepCL;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI,YfcO;EebP;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA,YfUO;;;AePX;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI,YfrBI;EesBJ,kBftBI;EeuBJ;EACA;;;AAEJ;EACI","file":"style.css"} \ No newline at end of file