├── .eslintignore ├── .eslintrc.json ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── ci.yml ├── .gitignore ├── .gitmodules ├── .prettierignore ├── .prettierrc ├── LICENSE ├── README.md ├── app.ts ├── assets ├── 21210205.png ├── Mocha_Wolf.png ├── fonts │ ├── JetBrainsMonoNerdFontPropo-Bold.ttf │ ├── JetBrainsMonoNerdFontPropo-ExtraBold.ttf │ ├── JetBrainsMonoNerdFontPropo-ExtraLight.ttf │ ├── JetBrainsMonoNerdFontPropo-Light.ttf │ ├── JetBrainsMonoNerdFontPropo-Medium.ttf │ ├── JetBrainsMonoNerdFontPropo-Regular.ttf │ ├── JetBrainsMonoNerdFontPropo-SemiBold.ttf │ └── JetBrainsMonoNerdFontPropo-Thin.ttf ├── hp1.png ├── hp2.png ├── hyprpanel.png ├── solar_system_mocha.png └── tokyo-night.xml ├── env.d.ts ├── flake.lock ├── flake.nix ├── meson.build ├── nix └── module.nix ├── package-lock.json ├── package.json ├── scripts ├── bluetooth.py ├── checkUpdates.sh ├── fillThemes.js ├── hyprpanel_launcher.sh.in ├── install_fonts.sh ├── makeTheme.ts ├── makevivid.js ├── replaceColors.ts ├── runUpdates.sh ├── screen_record.sh └── snapshot.sh ├── src ├── components │ ├── bar │ │ ├── customModules │ │ │ ├── index.ts │ │ │ ├── module_container │ │ │ │ ├── helpers │ │ │ │ │ ├── icon.ts │ │ │ │ │ ├── label.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── index.tsx │ │ │ │ └── setup.ts │ │ │ └── types.ts │ │ ├── index.tsx │ │ ├── layout │ │ │ ├── BarLayout.tsx │ │ │ ├── WidgetRegistry.tsx │ │ │ └── coreWidgets.tsx │ │ ├── modules │ │ │ ├── battery │ │ │ │ ├── helpers │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ └── index.tsx │ │ │ ├── bluetooth │ │ │ │ └── index.tsx │ │ │ ├── cava │ │ │ │ ├── helpers.ts │ │ │ │ └── index.tsx │ │ │ ├── clock │ │ │ │ └── index.tsx │ │ │ ├── cpu │ │ │ │ └── index.tsx │ │ │ ├── cputemp │ │ │ │ ├── helpers │ │ │ │ │ └── index.ts │ │ │ │ └── index.tsx │ │ │ ├── hypridle │ │ │ │ └── index.tsx │ │ │ ├── hyprsunset │ │ │ │ ├── helpers │ │ │ │ │ └── index.ts │ │ │ │ └── index.tsx │ │ │ ├── kblayout │ │ │ │ ├── helpers │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── layouts.ts │ │ │ │ │ └── types.ts │ │ │ │ └── index.tsx │ │ │ ├── media │ │ │ │ ├── helpers │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ └── index.tsx │ │ │ ├── menu │ │ │ │ └── index.tsx │ │ │ ├── microphone │ │ │ │ └── index.tsx │ │ │ ├── netstat │ │ │ │ ├── helpers.ts │ │ │ │ └── index.tsx │ │ │ ├── network │ │ │ │ ├── helpers.ts │ │ │ │ └── index.tsx │ │ │ ├── notifications │ │ │ │ └── index.tsx │ │ │ ├── power │ │ │ │ └── index.tsx │ │ │ ├── ram │ │ │ │ └── index.tsx │ │ │ ├── separator │ │ │ │ └── index.tsx │ │ │ ├── storage │ │ │ │ ├── helpers │ │ │ │ │ └── tooltipFormatters.ts │ │ │ │ └── index.tsx │ │ │ ├── submap │ │ │ │ ├── helpers │ │ │ │ │ └── index.ts │ │ │ │ └── index.tsx │ │ │ ├── systray │ │ │ │ └── index.tsx │ │ │ ├── updates │ │ │ │ └── index.tsx │ │ │ ├── volume │ │ │ │ ├── helpers │ │ │ │ │ └── index.ts │ │ │ │ └── index.tsx │ │ │ ├── weather │ │ │ │ └── index.tsx │ │ │ ├── window_title │ │ │ │ ├── helpers │ │ │ │ │ ├── appIcons.ts │ │ │ │ │ └── title.ts │ │ │ │ └── index.tsx │ │ │ ├── workspaces │ │ │ │ ├── helpers │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── types.ts │ │ │ │ └── workspaces.tsx │ │ │ └── worldclock │ │ │ │ └── index.tsx │ │ ├── settings │ │ │ ├── config.tsx │ │ │ └── theme.tsx │ │ ├── shared │ │ │ ├── module │ │ │ │ └── index.tsx │ │ │ └── widgetContainer │ │ │ │ └── index.tsx │ │ ├── types.ts │ │ └── utils │ │ │ ├── input │ │ │ ├── commandExecutor.ts │ │ │ ├── inputHandler.ts │ │ │ ├── throttle.ts │ │ │ └── types.ts │ │ │ ├── menu │ │ │ └── index.ts │ │ │ ├── monitors │ │ │ ├── index.ts │ │ │ └── types.ts │ │ │ └── systemResource │ │ │ └── index.ts │ ├── menus │ │ ├── audio │ │ │ ├── active │ │ │ │ ├── devices │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── playbacks │ │ │ │ │ └── index.tsx │ │ │ │ └── sliderItem │ │ │ │ │ ├── Slider.tsx │ │ │ │ │ ├── SliderIcon.tsx │ │ │ │ │ ├── SliderItem.tsx │ │ │ │ │ └── SliderPercentage.tsx │ │ │ ├── available │ │ │ │ ├── Device.tsx │ │ │ │ ├── Header.tsx │ │ │ │ ├── InputDevices.tsx │ │ │ │ ├── NotFoundButton.tsx │ │ │ │ ├── PlaybackDevices.tsx │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── bluetooth │ │ │ ├── devices │ │ │ │ ├── BluetoothDisabled.tsx │ │ │ │ ├── DeviceListItem.tsx │ │ │ │ ├── NoBluetoothDevices.tsx │ │ │ │ ├── controls │ │ │ │ │ ├── ActionButton.tsx │ │ │ │ │ ├── ConnectButton.tsx │ │ │ │ │ ├── ForgetButton.tsx │ │ │ │ │ ├── PairButton.tsx │ │ │ │ │ ├── TrustButton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── device │ │ │ │ │ ├── DeviceIcon.tsx │ │ │ │ │ ├── DeviceName.tsx │ │ │ │ │ ├── DeviceStatus.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── helpers.ts │ │ │ │ └── index.tsx │ │ │ ├── header │ │ │ │ ├── Controls │ │ │ │ │ ├── DiscoverButton.tsx │ │ │ │ │ ├── ToggleSwitch.tsx │ │ │ │ │ ├── helper.ts │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── calendar │ │ │ ├── CalendarWidget.tsx │ │ │ ├── index.tsx │ │ │ ├── time │ │ │ │ ├── MilitaryTime.tsx │ │ │ │ ├── StandardTime.tsx │ │ │ │ └── index.tsx │ │ │ └── weather │ │ │ │ ├── hourly │ │ │ │ ├── helpers.ts │ │ │ │ ├── icon │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── temperature │ │ │ │ │ └── index.tsx │ │ │ │ └── time │ │ │ │ │ └── index.tsx │ │ │ │ ├── icon │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── stats │ │ │ │ └── index.tsx │ │ │ │ └── temperature │ │ │ │ └── index.tsx │ │ ├── dashboard │ │ │ ├── controls │ │ │ │ ├── ControlButtons.tsx │ │ │ │ ├── helpers.ts │ │ │ │ └── index.tsx │ │ │ ├── directories │ │ │ │ ├── DirectoryLinks.tsx │ │ │ │ ├── Sections.tsx │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ ├── profile │ │ │ │ ├── PowerButtons.tsx │ │ │ │ ├── PowerMenu.tsx │ │ │ │ ├── Profile.tsx │ │ │ │ ├── helpers.ts │ │ │ │ └── index.tsx │ │ │ ├── shortcuts │ │ │ │ ├── buttons │ │ │ │ │ ├── RecordingButton.tsx │ │ │ │ │ ├── SettingsButton.tsx │ │ │ │ │ └── ShortcutButtons.tsx │ │ │ │ ├── helpers.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── sections │ │ │ │ │ ├── Column.tsx │ │ │ │ │ └── Section.tsx │ │ │ │ └── types.ts │ │ │ └── stats │ │ │ │ ├── StatBars.tsx │ │ │ │ ├── helpers.ts │ │ │ │ └── index.tsx │ │ ├── energy │ │ │ ├── brightness │ │ │ │ ├── Header.tsx │ │ │ │ ├── Icon.tsx │ │ │ │ ├── Percentage.tsx │ │ │ │ ├── Slider.tsx │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── profiles │ │ │ │ ├── Header.tsx │ │ │ │ ├── Profile.tsx │ │ │ │ ├── helpers.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ ├── index.ts │ │ ├── media │ │ │ ├── components │ │ │ │ ├── MediaContainer.tsx │ │ │ │ ├── controls │ │ │ │ │ ├── Modes.tsx │ │ │ │ │ ├── PlayPause.tsx │ │ │ │ │ ├── Players.tsx │ │ │ │ │ ├── Tracks.tsx │ │ │ │ │ ├── helpers.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── helpers.ts │ │ │ │ ├── timebar │ │ │ │ │ ├── helpers.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── timelabel │ │ │ │ │ └── index.tsx │ │ │ │ └── title │ │ │ │ │ ├── SongAlbum.tsx │ │ │ │ │ ├── SongAuthor.tsx │ │ │ │ │ ├── SongName.tsx │ │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── network │ │ │ ├── ethernet │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ ├── types.ts │ │ │ └── wifi │ │ │ │ ├── APStaging │ │ │ │ ├── AccessPoint.tsx │ │ │ │ ├── PasswordInput.tsx │ │ │ │ ├── helpers │ │ │ │ │ └── index.ts │ │ │ │ └── index.tsx │ │ │ │ ├── Controls │ │ │ │ ├── RefreshButton.tsx │ │ │ │ └── WifiSwitch.tsx │ │ │ │ ├── WirelessAPs │ │ │ │ ├── AccessPoint.tsx │ │ │ │ ├── Controls.tsx │ │ │ │ ├── NoWifi.tsx │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ ├── notifications │ │ │ ├── controls │ │ │ │ ├── ClearNotificationsButton.tsx │ │ │ │ ├── DndSwitch.tsx │ │ │ │ ├── MenuLabel.tsx │ │ │ │ └── index.tsx │ │ │ ├── helpers.ts │ │ │ ├── index.tsx │ │ │ ├── notification │ │ │ │ ├── Placeholder.tsx │ │ │ │ └── index.tsx │ │ │ └── pager │ │ │ │ ├── Buttons.tsx │ │ │ │ └── index.tsx │ │ ├── power │ │ │ ├── helpers │ │ │ │ └── actions.ts │ │ │ ├── index.tsx │ │ │ ├── types.ts │ │ │ └── verification.tsx │ │ ├── powerDropdown │ │ │ ├── button.tsx │ │ │ └── index.tsx │ │ └── shared │ │ │ ├── dropdown │ │ │ ├── helpers │ │ │ │ ├── eventBoxes.tsx │ │ │ │ ├── helpers.ts │ │ │ │ ├── locationHandler.ts │ │ │ │ └── types.ts │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ │ └── popup │ │ │ ├── index.tsx │ │ │ ├── layouts.ts │ │ │ └── types.ts │ ├── notifications │ │ ├── Actions │ │ │ └── index.tsx │ │ ├── Body │ │ │ └── index.tsx │ │ ├── CloseButton │ │ │ └── index.tsx │ │ ├── Header │ │ │ └── index.tsx │ │ ├── Image │ │ │ └── index.tsx │ │ ├── Notification │ │ │ └── index.tsx │ │ ├── helpers.ts │ │ └── index.tsx │ ├── osd │ │ ├── bar │ │ │ ├── helpers.ts │ │ │ └── index.tsx │ │ ├── helpers.ts │ │ ├── icon │ │ │ ├── helpers.ts │ │ │ └── index.tsx │ │ ├── index.tsx │ │ ├── label │ │ │ ├── helpers.ts │ │ │ └── index.tsx │ │ ├── revealer │ │ │ ├── index.tsx │ │ │ └── revealerController.ts │ │ └── types.ts │ ├── settings │ │ ├── Header.tsx │ │ ├── PageContainer.tsx │ │ ├── constants.ts │ │ ├── helpers.ts │ │ ├── index.tsx │ │ ├── lazyLoader.ts │ │ ├── pages │ │ │ ├── config │ │ │ │ ├── bar │ │ │ │ │ └── index.tsx │ │ │ │ ├── general │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── menus │ │ │ │ │ ├── clock.tsx │ │ │ │ │ ├── dashboard.tsx │ │ │ │ │ ├── media.tsx │ │ │ │ │ ├── power.tsx │ │ │ │ │ └── volume.tsx │ │ │ │ ├── notifications │ │ │ │ │ └── index.tsx │ │ │ │ └── osd │ │ │ │ │ └── index.tsx │ │ │ └── theme │ │ │ │ ├── bar │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── menus │ │ │ │ ├── battery.tsx │ │ │ │ ├── bluetooth.tsx │ │ │ │ ├── clock.tsx │ │ │ │ ├── dashboard.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── matugen.tsx │ │ │ │ ├── media.tsx │ │ │ │ ├── network.tsx │ │ │ │ ├── notifications.tsx │ │ │ │ ├── power.tsx │ │ │ │ ├── systray.tsx │ │ │ │ └── volume.tsx │ │ │ │ ├── notifications │ │ │ │ └── index.tsx │ │ │ │ └── osd │ │ │ │ └── index.tsx │ │ ├── shared │ │ │ ├── FileChooser.ts │ │ │ ├── Header.tsx │ │ │ ├── Inputter.tsx │ │ │ ├── Label.tsx │ │ │ ├── Option │ │ │ │ ├── PropertyLabel.tsx │ │ │ │ ├── ResetButton.tsx │ │ │ │ ├── SettingInput.tsx │ │ │ │ └── index.tsx │ │ │ ├── inputs │ │ │ │ ├── boolean.tsx │ │ │ │ ├── color.tsx │ │ │ │ ├── enum.tsx │ │ │ │ ├── float.tsx │ │ │ │ ├── font │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── image.tsx │ │ │ │ ├── import.tsx │ │ │ │ ├── number.tsx │ │ │ │ ├── object │ │ │ │ │ ├── EditorControls.tsx │ │ │ │ │ ├── JsonEditor.tsx │ │ │ │ │ ├── JsonPreview.tsx │ │ │ │ │ ├── helpers │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── keyHandler.ts │ │ │ │ │ │ ├── sourceViewSetup.ts │ │ │ │ │ │ └── useJsonEditor.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── string.tsx │ │ │ │ └── wallpaper.tsx │ │ │ └── types.ts │ │ └── side_effects │ │ │ └── index.ts │ └── shared │ │ ├── Calendar.tsx │ │ ├── ColorButton.tsx │ │ ├── FileChooserButton.tsx │ │ ├── FontButton.tsx │ │ ├── LevelBar.tsx │ │ ├── Menu.tsx │ │ ├── MenuItem.tsx │ │ ├── RegularWindow.tsx │ │ ├── Separator.tsx │ │ ├── SourceView.tsx │ │ ├── SpinButton.tsx │ │ ├── Spinner.tsx │ │ └── TextView.tsx ├── configuration │ ├── index.ts │ └── modules │ │ ├── config │ │ ├── bar │ │ │ ├── battery │ │ │ │ └── index.ts │ │ │ ├── bluetooth │ │ │ │ └── index.ts │ │ │ ├── cava │ │ │ │ └── index.ts │ │ │ ├── clock │ │ │ │ └── index.ts │ │ │ ├── cpu │ │ │ │ └── index.ts │ │ │ ├── cpuTemp │ │ │ │ └── index.ts │ │ │ ├── hypridle │ │ │ │ └── index.ts │ │ │ ├── hyprsunset │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── kbLayout │ │ │ │ └── index.ts │ │ │ ├── launcher │ │ │ │ └── index.ts │ │ │ ├── layouts │ │ │ │ └── index.ts │ │ │ ├── media │ │ │ │ └── index.ts │ │ │ ├── microphone │ │ │ │ └── index.ts │ │ │ ├── netstat │ │ │ │ └── index.ts │ │ │ ├── network │ │ │ │ └── index.ts │ │ │ ├── notifications │ │ │ │ └── index.ts │ │ │ ├── power │ │ │ │ └── index.ts │ │ │ ├── ram │ │ │ │ └── index.ts │ │ │ ├── storage │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── submap │ │ │ │ └── index.ts │ │ │ ├── systray │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── updates │ │ │ │ └── index.ts │ │ │ ├── volume │ │ │ │ └── index.ts │ │ │ ├── weather │ │ │ │ └── index.ts │ │ │ ├── windowtitle │ │ │ │ └── index.ts │ │ │ ├── workspaces │ │ │ │ └── index.ts │ │ │ └── worldclock │ │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── menus │ │ │ ├── clock │ │ │ │ └── index.ts │ │ │ ├── dashboard │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── media │ │ │ │ └── index.ts │ │ │ ├── power │ │ │ │ └── index.ts │ │ │ ├── types.ts │ │ │ └── volume │ │ │ │ └── index.ts │ │ └── notifications │ │ │ └── index.ts │ │ └── theme │ │ ├── bar │ │ ├── buttons │ │ │ ├── battery.ts │ │ │ ├── bluetooth.ts │ │ │ ├── cava.ts │ │ │ ├── clock.ts │ │ │ ├── cpu.ts │ │ │ ├── cpuTemp.ts │ │ │ ├── dashboard.ts │ │ │ ├── hypridle.ts │ │ │ ├── hyprsunset.ts │ │ │ ├── index.ts │ │ │ ├── kbLayout.ts │ │ │ ├── media.ts │ │ │ ├── microphone.ts │ │ │ ├── netstat.ts │ │ │ ├── network.ts │ │ │ ├── notifications.ts │ │ │ ├── power.ts │ │ │ ├── ram.ts │ │ │ ├── separator.ts │ │ │ ├── storage.ts │ │ │ ├── submap.ts │ │ │ ├── systray.ts │ │ │ ├── updates.ts │ │ │ ├── volume.ts │ │ │ ├── weather.ts │ │ │ ├── windowtitle.ts │ │ │ ├── workspaces.ts │ │ │ └── worldclock.ts │ │ ├── index.ts │ │ └── menus │ │ │ ├── components │ │ │ ├── border.ts │ │ │ ├── buttons.ts │ │ │ ├── checkRadioButton.ts │ │ │ ├── dropdownmenu.ts │ │ │ ├── iconbuttons.ts │ │ │ ├── icons.ts │ │ │ ├── index.ts │ │ │ ├── listitems.ts │ │ │ ├── popover.ts │ │ │ ├── progressbar.ts │ │ │ ├── scroller.ts │ │ │ ├── slider.ts │ │ │ ├── switch.ts │ │ │ └── tooltip.ts │ │ │ ├── index.ts │ │ │ └── modules │ │ │ ├── battery.ts │ │ │ ├── bluetooth.ts │ │ │ ├── clock.ts │ │ │ ├── dashboard.ts │ │ │ ├── media.ts │ │ │ ├── network.ts │ │ │ ├── notifications.ts │ │ │ ├── power.ts │ │ │ ├── systray.ts │ │ │ └── volume.ts │ │ ├── colors │ │ ├── primary.ts │ │ ├── secondary.ts │ │ └── tertiary.ts │ │ ├── general │ │ └── index.ts │ │ ├── index.ts │ │ ├── notification │ │ └── index.ts │ │ └── osd │ │ └── index.ts ├── core │ ├── behaviors │ │ ├── bar │ │ │ ├── clock.ts │ │ │ ├── index.ts │ │ │ └── windowTitle.ts │ │ ├── batteryWarning.ts │ │ ├── hyprlandRules.ts │ │ └── index.ts │ ├── errors │ │ └── handler.ts │ ├── initialization │ │ └── index.ts │ ├── system │ │ ├── SystemUtilities.ts │ │ ├── distroIcons.ts │ │ ├── osInfo.ts │ │ └── types.ts │ └── types │ │ └── index.ts ├── lib │ ├── array │ │ └── helpers.ts │ ├── bar │ │ └── helpers.ts │ ├── events │ │ ├── dropdown.ts │ │ └── mouse.ts │ ├── httpClient │ │ ├── HttpError.ts │ │ ├── index.ts │ │ └── types.ts │ ├── icons │ │ ├── helpers.ts │ │ └── icons.ts │ ├── options │ │ ├── configManager │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── opt │ │ │ └── index.ts │ │ ├── optionRegistry │ │ │ └── index.ts │ │ └── types.ts │ ├── path │ │ └── helpers.ts │ ├── performance │ │ └── timer.ts │ ├── poller │ │ ├── BashPoller.ts │ │ ├── FunctionPoller.ts │ │ ├── Poller.ts │ │ └── types.ts │ ├── session │ │ └── index.ts │ ├── shared │ │ ├── eventHandlers │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── hookHandler │ │ │ └── index.ts │ │ └── notifications │ │ │ └── index.ts │ ├── string │ │ └── formatters.ts │ ├── theme │ │ └── useTheme.ts │ ├── units │ │ ├── length │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── pressure │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── size │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── speed │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── temperature │ │ │ ├── index.ts │ │ │ └── types.ts │ │ └── time │ │ │ └── index.ts │ ├── validation │ │ ├── colorNames.ts │ │ ├── colors.ts │ │ ├── images.ts │ │ └── types.ts │ └── window │ │ ├── positioning.ts │ │ └── visibility.ts ├── services │ ├── cli │ │ ├── commander │ │ │ ├── InitializeCommand.ts │ │ │ ├── Parser.ts │ │ │ ├── Registry.ts │ │ │ ├── RequestHandler.ts │ │ │ ├── commands │ │ │ │ ├── appearance │ │ │ │ │ └── index.ts │ │ │ │ ├── modules │ │ │ │ │ └── media │ │ │ │ │ │ └── index.ts │ │ │ │ ├── system │ │ │ │ │ ├── dependencies │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── optional.ts │ │ │ │ │ │ ├── required.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── sensors │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── utility │ │ │ │ │ │ └── index.ts │ │ │ │ └── windowManagement │ │ │ │ │ └── index.ts │ │ │ ├── helpers │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── helpers │ │ │ ├── systray.ts │ │ │ └── wallpaper.ts │ │ └── services │ │ │ └── window │ │ │ └── index.ts │ ├── display │ │ ├── bar │ │ │ ├── autoHide.ts │ │ │ ├── index.ts │ │ │ ├── refreshManager.ts │ │ │ └── types.ts │ │ └── monitor │ │ │ └── index.ts │ ├── matugen │ │ ├── defaults.ts │ │ ├── index.ts │ │ └── variations.ts │ ├── media │ │ ├── index.ts │ │ └── types.ts │ ├── network │ │ ├── ethernet.ts │ │ ├── index.ts │ │ ├── types.ts │ │ └── wifi.ts │ ├── system │ │ ├── brightness │ │ │ └── index.ts │ │ ├── cpuUsage │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── cputemp │ │ │ ├── index.ts │ │ │ ├── sensorDiscovery.ts │ │ │ └── types.ts │ │ ├── gpuUsage │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── networkUsage │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── ramUsage │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── storage │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── types.ts │ │ └── uptime │ │ │ └── index.ts │ ├── wallpaper │ │ ├── SwwwDaemon.ts │ │ └── index.ts │ ├── weather │ │ ├── adapters │ │ │ ├── registry.ts │ │ │ ├── types.ts │ │ │ └── weatherApi │ │ │ │ ├── index.ts │ │ │ │ ├── mapper.ts │ │ │ │ └── types.ts │ │ ├── default.ts │ │ ├── formatters │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── keyManager │ │ │ └── index.ts │ │ ├── types │ │ │ └── index.ts │ │ └── validators │ │ │ └── index.ts │ └── workspace │ │ ├── index.ts │ │ └── types.ts └── style │ ├── index.ts │ ├── main.scss │ ├── optionsTrackers.ts │ ├── scss │ ├── bar │ │ ├── audio.scss │ │ ├── bar.scss │ │ ├── battery.scss │ │ ├── bluetooth.scss │ │ ├── clock.scss │ │ ├── media.scss │ │ ├── menu.scss │ │ ├── module-separator.scss │ │ ├── network.scss │ │ ├── notifications.scss │ │ ├── style.scss │ │ ├── systray.scss │ │ ├── window_title.scss │ │ └── workspace.scss │ ├── colors.scss │ ├── common │ │ ├── common.scss │ │ ├── floating-widget.scss │ │ ├── general.scss │ │ ├── popover_menu.scss │ │ └── widget-button.scss │ ├── highlights.scss │ ├── menus │ │ ├── audiomenu.scss │ │ ├── bluetooth.scss │ │ ├── calendar.scss │ │ ├── dashboard.scss │ │ ├── energy.scss │ │ ├── media.scss │ │ ├── menu.scss │ │ ├── network.scss │ │ ├── notifications.scss │ │ ├── power.scss │ │ └── powerdropdown.scss │ ├── notifications │ │ └── popups.scss │ ├── osd │ │ └── index.scss │ └── settings │ │ ├── dialog.scss │ │ └── json-editor.scss │ └── utils │ └── hotReload.ts ├── themes ├── catppuccin_frappe.json ├── catppuccin_frappe_split.json ├── catppuccin_frappe_vivid.json ├── catppuccin_latte.json ├── catppuccin_latte_split.json ├── catppuccin_latte_vivid.json ├── catppuccin_macchiato.json ├── catppuccin_macchiato_split.json ├── catppuccin_macchiato_vivid.json ├── catppuccin_mocha.json ├── catppuccin_mocha_split.json ├── catppuccin_mocha_vivid.json ├── cyberpunk.json ├── cyberpunk_split.json ├── cyberpunk_vivid.json ├── dracula.json ├── dracula_split.json ├── dracula_vivid.json ├── everforest.json ├── everforest_split.json ├── everforest_vivid.json ├── gruvbox.json ├── gruvbox_split.json ├── gruvbox_vivid.json ├── monochrome.json ├── monochrome_split.json ├── monochrome_vivid.json ├── nord.json ├── nord_split.json ├── nord_vivid.json ├── one_dark.json ├── one_dark_split.json ├── one_dark_vivid.json ├── palettes │ ├── tokyo_night.json │ └── tokyo_night_moon.json ├── rose_pine.json ├── rose_pine_moon.json ├── rose_pine_moon_split.json ├── rose_pine_moon_vivid.json ├── rose_pine_split.json ├── rose_pine_vivid.json ├── tokyo_night.json ├── tokyo_night_moon.json ├── tokyo_night_moon_split.json ├── tokyo_night_moon_vivid.json ├── tokyo_night_split.json └── tokyo_night_vivid.json └── tsconfig.json /.eslintignore: -------------------------------------------------------------------------------- 1 | types 2 | node_modules 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help HyprPanel improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 16 | **Expected behavior** 17 | A clear and concise description of what you expected to happen. 18 | 19 | **Screenshots** 20 | If applicable, add screenshots to help explain your problem. 21 | 22 | **Desktop (please complete the following information):** 23 | - Distribution: [e.g. Arch Linux] 24 | - Window Manager/Desktop Environment: [e.g. Hyprland] 25 | 26 | **Additional context** 27 | Add any other context about the problem here. 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .weather.json 2 | node_modules 3 | prepare 4 | 5 | @girs 6 | 7 | **/.claude/settings.local.json 8 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "external/ags-types"] 2 | path = external/ags-types 3 | url = https://github.com/Jas-SinghFSU/ags-types.git 4 | 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .eslintrc.js 2 | types/**/*.ts 3 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": true, 4 | "trailingComma": "all", 5 | "printWidth": 110, 6 | "tabWidth": 4, 7 | "useTabs": false, 8 | "overrides": [ 9 | { 10 | "files": ["**/*.jsonc"], 11 | "options": { 12 | "parser": "json" 13 | } 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Jas Singh 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app.ts: -------------------------------------------------------------------------------- 1 | import './src/lib/session'; 2 | import './src/style'; 3 | import 'src/core/behaviors/bar'; 4 | import { App } from 'astal/gtk3'; 5 | import { runCLI } from 'src/services/cli/commander'; 6 | import { InitializationService } from 'src/core/initialization'; 7 | 8 | App.start({ 9 | instanceName: 'hyprpanel', 10 | requestHandler: (request: string, res: (response: unknown) => void) => runCLI(request, res), 11 | main: () => InitializationService.initialize(), 12 | }); 13 | -------------------------------------------------------------------------------- /assets/21210205.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/21210205.png -------------------------------------------------------------------------------- /assets/Mocha_Wolf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/Mocha_Wolf.png -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraBold.ttf -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraLight.ttf -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-SemiBold.ttf -------------------------------------------------------------------------------- /assets/fonts/JetBrainsMonoNerdFontPropo-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/fonts/JetBrainsMonoNerdFontPropo-Thin.ttf -------------------------------------------------------------------------------- /assets/hp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/hp1.png -------------------------------------------------------------------------------- /assets/hp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/hp2.png -------------------------------------------------------------------------------- /assets/hyprpanel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/hyprpanel.png -------------------------------------------------------------------------------- /assets/solar_system_mocha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jas-SinghFSU/HyprPanel/8be178f5a90ec87665ee048e214d2da4571535c5/assets/solar_system_mocha.png -------------------------------------------------------------------------------- /env.d.ts: -------------------------------------------------------------------------------- 1 | declare const SRC: string; 2 | declare const DATADIR: string; 3 | 4 | declare module 'inline:*' { 5 | const content: string; 6 | export default content; 7 | } 8 | 9 | declare module '*.scss' { 10 | const content: string; 11 | export default content; 12 | } 13 | 14 | declare module '*.blp' { 15 | const content: string; 16 | export default content; 17 | } 18 | 19 | declare module '*.css' { 20 | const content: string; 21 | export default content; 22 | } 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hyprpanel", 3 | "version": "1.0.0", 4 | "description": "A customizable panel built for Hyprland.", 5 | "main": "app.ts", 6 | "scripts": { 7 | "lint": "eslint --config .eslintrc.json .", 8 | "lint:fix": "eslint --config .eslintrc.json . --fix", 9 | "format": "prettier --write 'modules/**/*.ts'", 10 | "knip": "knip" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "MIT", 15 | "dependencies": { 16 | "astal": "/usr/share/astal/gjs" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^22.15.17", 20 | "@typescript-eslint/eslint-plugin": "^8.5.0", 21 | "@typescript-eslint/parser": "^8.5.0", 22 | "eslint": "^8.57.0", 23 | "eslint-config-prettier": "^9.1.0", 24 | "eslint-plugin-import": "^2.30.0", 25 | "eslint-plugin-prettier": "^5.2.1", 26 | "knip": "^5.55.1", 27 | "prettier": "^3.3.3", 28 | "tsconfig-paths": "^4.2.0", 29 | "typescript": "5.7.3" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /scripts/hyprpanel_launcher.sh.in: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ "$#" -eq 0 ]; then 4 | exec gjs -m "@DATADIR@/hyprpanel.js" 5 | else 6 | exec astal -i hyprpanel "$*" 7 | fi 8 | -------------------------------------------------------------------------------- /scripts/install_fonts.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | SOURCE_DIR="./assets/fonts" 4 | DEST_DIR="$HOME/.local/share/fonts" 5 | DEST_PATH="$DEST_DIR/NFP" 6 | 7 | if [ ! -d "$SOURCE_DIR" ]; then 8 | echo "Source directory '$SOURCE_DIR' does not exist." 9 | exit 1 10 | fi 11 | 12 | if [ ! -d "$DEST_PATH" ]; then 13 | echo "Destination directory '$DEST_PATH' does not exist. Creating it..." 14 | mkdir -p "$DEST_PATH" 15 | fi 16 | 17 | if [ -z "$(ls -A "$SOURCE_DIR")" ]; then 18 | echo "Source directory '$SOURCE_DIR' is empty. No files to copy." 19 | exit 1 20 | fi 21 | 22 | echo "Copying fonts from '$SOURCE_DIR' to '$DEST_PATH'..." 23 | cp -r "$SOURCE_DIR"/* "$DEST_PATH" 24 | 25 | echo "Updating font cache..." 26 | fc-cache -fv 27 | 28 | echo "Fonts installed successfully." 29 | -------------------------------------------------------------------------------- /scripts/snapshot.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | outputDir="$HOME/Pictures/Screenshots/" 4 | outputFile="snapshot_$(date +%Y-%m-%d_%H-%M-%S).png" 5 | outputPath="$outputDir/$outputFile" 6 | mkdir -p "$outputDir" 7 | 8 | mode=${1:-area} 9 | 10 | case "$mode" in 11 | active) 12 | command="grimblast copysave active $outputPath" 13 | ;; 14 | output) 15 | command="grimblast copysave output $outputPath" 16 | ;; 17 | area) 18 | command="grimblast copysave area $outputPath" 19 | ;; 20 | *) 21 | echo "Invalid option: $mode" 22 | echo "Usage: $0 {active|output|area}" 23 | exit 1 24 | ;; 25 | esac 26 | 27 | if eval "$command"; then 28 | recentFile=$(find "$outputDir" -name 'snapshot_*.png' -printf '%T+ %p\n' | sort -r | head -n 1 | cut -d' ' -f2-) 29 | notify-send "Grimblast" "Your snapshot has been saved." \ 30 | -i video-x-generic \ 31 | -a "Grimblast" \ 32 | -t 7000 \ 33 | -u normal \ 34 | --action="scriptAction:-xdg-open $outputDir=Directory" \ 35 | --action="scriptAction:-xdg-open $recentFile=View" 36 | fi 37 | -------------------------------------------------------------------------------- /src/components/bar/customModules/module_container/helpers/utils.ts: -------------------------------------------------------------------------------- 1 | export function parseCommandOutputJson(moduleName: string, cmdOutput: unknown): Record { 2 | try { 3 | if (typeof cmdOutput !== 'string') { 4 | throw new Error('Input must be a string'); 5 | } 6 | 7 | return JSON.parse(cmdOutput); 8 | } catch { 9 | throw new Error(`The command output for the following module is not valid JSON: ${moduleName}`); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/components/bar/customModules/types.ts: -------------------------------------------------------------------------------- 1 | type CustomBarModuleActions = { 2 | onLeftClick?: string; 3 | onRightClick?: string; 4 | onMiddleClick?: string; 5 | onScrollUp?: string; 6 | onScrollDown?: string; 7 | }; 8 | export type CustomBarModule = { 9 | icon?: CustomBarModuleIcon; 10 | label?: string; 11 | tooltip?: string; 12 | truncationSize?: number; 13 | execute?: string; 14 | executeOnAction?: string; 15 | interval?: number; 16 | hideOnEmpty?: boolean; 17 | scrollThreshold?: number; 18 | actions?: CustomBarModuleActions; 19 | }; 20 | export type CustomBarModuleIcon = string | string[] | Record; 21 | 22 | export type WidgetMap = { 23 | [key in string]: (monitor: number) => JSX.Element; 24 | }; 25 | -------------------------------------------------------------------------------- /src/components/bar/index.tsx: -------------------------------------------------------------------------------- 1 | import { JSXElement } from 'src/core/types'; 2 | import { BarLayout } from './layout/BarLayout'; 3 | import { getCoreWidgets } from './layout/coreWidgets'; 4 | import { WidgetRegistry } from './layout/WidgetRegistry'; 5 | 6 | const widgetRegistry = new WidgetRegistry(getCoreWidgets()); 7 | 8 | /** 9 | * Creates a bar widget for a specific monitor with proper error handling 10 | * to prevent crashes when monitors become invalid. 11 | * 12 | * @param gdkMonitor - The GDK monitor index where the bar will be displayed 13 | * @param hyprlandMonitor - The corresponding Hyprland monitor ID for workspace 14 | * filtering and layout assignment 15 | * @returns A JSX element representing the bar widget for the specified monitor 16 | */ 17 | export const Bar = async (gdkMonitor: number, hyprlandMonitor?: number): Promise => { 18 | await widgetRegistry.initialize(); 19 | 20 | const hyprlandId = hyprlandMonitor ?? gdkMonitor; 21 | const barLayout = new BarLayout(gdkMonitor, hyprlandId, widgetRegistry); 22 | 23 | return barLayout.render(); 24 | }; 25 | -------------------------------------------------------------------------------- /src/components/bar/modules/battery/helpers/types.ts: -------------------------------------------------------------------------------- 1 | export type BatteryIconKeys = 0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100; 2 | 3 | export type BatteryIcons = { 4 | [key in BatteryIconKeys]: string; 5 | }; 6 | -------------------------------------------------------------------------------- /src/components/bar/modules/kblayout/helpers/types.ts: -------------------------------------------------------------------------------- 1 | export type KbLabelType = 'layout' | 'code'; 2 | 3 | export type HyprctlKeyboard = { 4 | address: string; 5 | name: string; 6 | rules: string; 7 | model: string; 8 | layout: string; 9 | variant: string; 10 | options: string; 11 | active_keymap: string; 12 | main: boolean; 13 | }; 14 | 15 | type HyprctlMouse = { 16 | address: string; 17 | name: string; 18 | defaultSpeed: number; 19 | }; 20 | 21 | export type HyprctlDeviceLayout = { 22 | mice: HyprctlMouse[]; 23 | keyboards: HyprctlKeyboard[]; 24 | tablets: unknown[]; 25 | touch: unknown[]; 26 | switches: unknown[]; 27 | }; 28 | -------------------------------------------------------------------------------- /src/components/bar/modules/media/helpers/types.ts: -------------------------------------------------------------------------------- 1 | export type MediaTags = { 2 | title: string; 3 | artists: string; 4 | artist: string; 5 | album: string; 6 | name: string; 7 | identity: string; 8 | }; 9 | -------------------------------------------------------------------------------- /src/components/bar/modules/separator/index.tsx: -------------------------------------------------------------------------------- 1 | import Separator from 'src/components/shared/Separator'; 2 | 3 | export const ModuleSeparator = (): JSX.Element => { 4 | return ; 5 | }; 6 | -------------------------------------------------------------------------------- /src/components/bar/modules/volume/helpers/index.ts: -------------------------------------------------------------------------------- 1 | const icons: Record = { 2 | 101: '󰕾', 3 | 66: '󰕾', 4 | 34: '󰖀', 5 | 1: '󰕿', 6 | 0: '󰝟', 7 | }; 8 | 9 | /** 10 | * Retrieves the appropriate volume icon based on the volume level and mute status. 11 | * 12 | * This function returns the corresponding volume icon based on the provided volume level and mute status. 13 | * It uses predefined mappings for volume icons. 14 | * 15 | * @param isMuted A boolean indicating whether the volume is muted. 16 | * @param vol The current volume level as a number between 0 and 1. 17 | * 18 | * @returns The corresponding volume icon as a string. 19 | */ 20 | export const getIcon = (isMuted: boolean, vol: number): string => { 21 | if (isMuted) return icons[0]; 22 | 23 | const foundVol = [101, 66, 34, 1, 0].find((threshold) => threshold <= vol * 100); 24 | 25 | if (foundVol !== undefined) { 26 | return icons[foundVol]; 27 | } 28 | 29 | return icons[101]; 30 | }; 31 | -------------------------------------------------------------------------------- /src/components/bar/modules/workspaces/helpers/types.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationIcons } from '../types'; 2 | 3 | export type AppIconOptions = { 4 | iconMap: ApplicationIcons; 5 | defaultIcon: string; 6 | emptyIcon: string; 7 | }; 8 | -------------------------------------------------------------------------------- /src/components/bar/modules/workspaces/types.ts: -------------------------------------------------------------------------------- 1 | export type WorkspaceIcons = { 2 | [key: string]: string; 3 | }; 4 | 5 | export type WorkspaceIconsColored = { 6 | [key: string]: { 7 | color: string; 8 | icon: string; 9 | }; 10 | }; 11 | export type ApplicationIcons = { 12 | [key: string]: string; 13 | }; 14 | 15 | export type WorkspaceIconMap = WorkspaceIcons | WorkspaceIconsColored; 16 | -------------------------------------------------------------------------------- /src/components/bar/utils/input/types.ts: -------------------------------------------------------------------------------- 1 | import { Variable } from 'astal'; 2 | import { Gdk } from 'astal/gtk3'; 3 | import { Opt } from 'src/lib/options'; 4 | import { GtkWidget } from '../../types'; 5 | 6 | export type EventArgs = { 7 | clicked: GtkWidget; 8 | event: Gdk.Event; 9 | }; 10 | 11 | export type UpdateHandlers = { 12 | disconnectPrimary: () => void; 13 | disconnectSecondary: () => void; 14 | disconnectMiddle: () => void; 15 | disconnectScroll: () => void; 16 | }; 17 | 18 | export type InputHandlerEventArgs = { 19 | cmd?: Opt | Variable; 20 | fn?: (output: string) => void; 21 | }; 22 | export type InputHandlerEvents = { 23 | onPrimaryClick?: InputHandlerEventArgs; 24 | onSecondaryClick?: InputHandlerEventArgs; 25 | onMiddleClick?: InputHandlerEventArgs; 26 | onScrollUp?: InputHandlerEventArgs; 27 | onScrollDown?: InputHandlerEventArgs; 28 | }; 29 | -------------------------------------------------------------------------------- /src/components/bar/utils/monitors/types.ts: -------------------------------------------------------------------------------- 1 | export interface MonitorMapping { 2 | gdkIndex: number; 3 | hyprlandId: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/components/menus/audio/active/devices/index.tsx: -------------------------------------------------------------------------------- 1 | import { SliderItem } from '../sliderItem/SliderItem'; 2 | import { ActiveDeviceMenu } from '..'; 3 | import AstalWp from 'gi://AstalWp?version=0.1'; 4 | 5 | const wireplumber = AstalWp.get_default() as AstalWp.Wp; 6 | const audioService = wireplumber.audio; 7 | 8 | const ActiveDeviceContainer = ({ children }: ActiveDeviceContainerProps): JSX.Element => { 9 | return ( 10 | 11 | {children} 12 | 13 | ); 14 | }; 15 | 16 | export const ActiveDevices = (): JSX.Element => { 17 | return ( 18 | 19 | 20 | 21 | 22 | ); 23 | }; 24 | 25 | interface ActiveDeviceContainerProps { 26 | children?: JSX.Element[]; 27 | } 28 | -------------------------------------------------------------------------------- /src/components/menus/audio/active/sliderItem/SliderItem.tsx: -------------------------------------------------------------------------------- 1 | import AstalWp from 'gi://AstalWp?version=0.1'; 2 | import { SliderIcon } from './SliderIcon'; 3 | import { Slider } from './Slider'; 4 | import { SliderPercentage } from './SliderPercentage'; 5 | 6 | export const SliderItem = ({ type, device }: SliderItemProps): JSX.Element => { 7 | return ( 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | }; 17 | 18 | interface SliderItemProps { 19 | type: 'playback' | 'input'; 20 | device: AstalWp.Endpoint; 21 | } 22 | -------------------------------------------------------------------------------- /src/components/menus/audio/active/sliderItem/SliderPercentage.tsx: -------------------------------------------------------------------------------- 1 | import { bind } from 'astal'; 2 | import { Gtk } from 'astal/gtk3'; 3 | import AstalWp from 'gi://AstalWp?version=0.1'; 4 | 5 | export const SliderPercentage = ({ type, device }: SliderPercentageProps): JSX.Element => { 6 | return ( 7 |