diff --git a/hosts/common/configs/system/upower/default.nix b/hosts/common/configs/system/upower/default.nix
new file mode 100644
index 0000000..fa3f089
--- /dev/null
+++ b/hosts/common/configs/system/upower/default.nix
@@ -0,0 +1,8 @@
+{ ... }:
+{
+ services.upower = {
+ enable = true;
+ allowRiskyCriticalPowerAction = true;
+ criticalPowerAction = "Ignore";
+ };
+}
diff --git a/hosts/common/configs/user/gui/astal/config/app.ts b/hosts/common/configs/user/gui/astal/config/app.ts
index bbedb42..4ad657e 100644
--- a/hosts/common/configs/user/gui/astal/config/app.ts
+++ b/hosts/common/configs/user/gui/astal/config/app.ts
@@ -1,8 +1,10 @@
import { App } from "astal/gtk3";
-import Bar from "./widget/Bar";
import { monitorFile } from "astal/file";
import { exec } from "astal/process";
import GLib from "gi://GLib";
+import Left from "./widget/Left";
+import Center from "./widget/Center";
+import Right from "./widget/Right";
const HOME = GLib.getenv("HOME");
const css = `${HOME}/.config/astal/theme.css`;
@@ -18,6 +20,10 @@ exec(`sassc ${scss} ${css}`);
App.start({
css,
main() {
- App.get_monitors().map(Bar);
+ App.get_monitors().map((monitor) => {
+ Left(monitor);
+ Center(monitor);
+ Right(monitor);
+ });
},
});
diff --git a/hosts/common/configs/user/gui/astal/config/lib.ts b/hosts/common/configs/user/gui/astal/config/lib.ts
index 82e7577..70035fb 100644
--- a/hosts/common/configs/user/gui/astal/config/lib.ts
+++ b/hosts/common/configs/user/gui/astal/config/lib.ts
@@ -1,3 +1,16 @@
+import { Gdk } from "astal/gtk3";
+import Hyprland from "gi://AstalHyprland";
+
export const range = (length: number, start = 1) => {
return Array.from({ length }, (n, i) => i + start);
};
+
+export const getHyprlandMonitor = (gdkmonitor: Gdk.Monitor) => {
+ const hyprland = Hyprland.get_default()
+ const display = Gdk.Display.get_default()!;
+ const screen = display.get_default_screen();
+ for (let i = 0; i < display.get_n_monitors(); ++i) {
+ if (gdkmonitor === display.get_monitor(i))
+ return hyprland.get_monitor_by_name(screen.get_monitor_plug_name(i)!);
+ }
+}
diff --git a/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx b/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx
deleted file mode 100644
index 3b9597e..0000000
--- a/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { App, Astal, Gtk, Gdk } from "astal/gtk3";
-import Launcher from "./components/Launcher";
-import Workspace from "./components/Workspaces";
-import Date from "./components/Date";
-import Systray from "./components/Tray";
-import Hyprland from "gi://AstalHyprland";
-
-const anchor =
- Astal.WindowAnchor.TOP | Astal.WindowAnchor.LEFT | Astal.WindowAnchor.RIGHT;
-
-const hyprland = Hyprland.get_default();
-
-function getHyprlandMonitor(gdkmonitor: Gdk.Monitor) {
- const display = Gdk.Display.get_default()!;
- const screen = display.get_default_screen();
- for (let i = 0; i < display.get_n_monitors(); ++i) {
- if (gdkmonitor === display.get_monitor(i))
- return hyprland.get_monitor_by_name(screen.get_monitor_plug_name(i)!);
- }
-}
-
-export default (monitor: Gdk.Monitor) => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
diff --git a/hosts/common/configs/user/gui/astal/config/widget/Center.tsx b/hosts/common/configs/user/gui/astal/config/widget/Center.tsx
new file mode 100644
index 0000000..f86e7e8
--- /dev/null
+++ b/hosts/common/configs/user/gui/astal/config/widget/Center.tsx
@@ -0,0 +1,19 @@
+import { App, Astal, Gtk, Gdk } from "astal/gtk3";
+import Date from "./components/Date";
+import Hidden from "./components/Hidden";
+
+export default (monitor: Gdk.Monitor) => (
+
+
+
+
+
+
+
+);
diff --git a/hosts/common/configs/user/gui/astal/config/widget/Left.tsx b/hosts/common/configs/user/gui/astal/config/widget/Left.tsx
new file mode 100644
index 0000000..fb4039f
--- /dev/null
+++ b/hosts/common/configs/user/gui/astal/config/widget/Left.tsx
@@ -0,0 +1,22 @@
+import { App, Astal, Gtk, Gdk } from "astal/gtk3";
+import Launcher from "./components/Launcher";
+import Workspace from "./components/Workspaces";
+import Hidden from "./components/Hidden";
+import { getHyprlandMonitor } from "../lib";
+
+export default (monitor: Gdk.Monitor) => (
+
+
+
+
+
+
+
+
+);
diff --git a/hosts/common/configs/user/gui/astal/config/widget/Right.tsx b/hosts/common/configs/user/gui/astal/config/widget/Right.tsx
new file mode 100644
index 0000000..07cbb1b
--- /dev/null
+++ b/hosts/common/configs/user/gui/astal/config/widget/Right.tsx
@@ -0,0 +1,21 @@
+import { App, Astal, Gtk, Gdk } from "astal/gtk3";
+import Systray from "./components/Tray";
+import Hidden from "./components/Hidden";
+import Battery from "./components/Battery";
+
+export default (monitor: Gdk.Monitor) => (
+
+
+
+
+
+
+
+
+);
diff --git a/hosts/common/configs/user/gui/astal/config/widget/components/Battery.tsx b/hosts/common/configs/user/gui/astal/config/widget/components/Battery.tsx
new file mode 100644
index 0000000..c496adf
--- /dev/null
+++ b/hosts/common/configs/user/gui/astal/config/widget/components/Battery.tsx
@@ -0,0 +1,30 @@
+import { bind, Variable } from "astal";
+import AstalBattery from "gi://AstalBattery";
+
+const battery = AstalBattery.get_default();
+
+const formatTime = (seconds: number) => seconds > 0
+ ? `${String(Math.floor(seconds / 3600)).padStart(2, "0")}:${String(Math.floor((seconds % 3600) / 60)).padStart(2, "0")}`
+ : "--:--";
+
+export default () => {
+ const percentage = bind(battery, "percentage").as((p) => Math.round(p * 100) + "%");
+ const charging = bind(battery, "charging");
+ const timeToFull = bind(battery, "timeToFull");
+ const timeToEmpty = bind(battery, "timeToEmpty");
+
+ const time = Variable.derive([charging, timeToFull, timeToEmpty], (charging, full, empty) =>
+ formatTime(charging ? full : empty)
+ );
+
+ const label = Variable.derive([percentage, charging, time], (percentage, charging, time) => {
+ const arrow = charging ? "▲" : "▼";
+ return `${percentage} (${time}) ${arrow}`;
+ });
+
+ return (
+
+ );
+};
diff --git a/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx b/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx
index 909cbc0..66f6ffc 100644
--- a/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx
+++ b/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx
@@ -1,13 +1,15 @@
-import { Variable } from "astal/variable";
+import { bind, Variable } from "astal";
import { GLib } from "astal";
-const time = Variable("").poll(
- 1000,
- () => GLib.DateTime.new_now_local().format("%H:%M - %A, %d %B %Y")!,
-);
+export default () => {
+ const time = Variable(GLib.DateTime.new_now_local().format("%H:%M - %A, %d %B %Y")!).poll(
+ 1000,
+ () => GLib.DateTime.new_now_local().format("%H:%M - %A, %d %B %Y")!,
+ );
-export default () => (
-
-);
+ return (
+
+ );
+}
diff --git a/hosts/common/configs/user/gui/astal/config/widget/components/Hidden.tsx b/hosts/common/configs/user/gui/astal/config/widget/components/Hidden.tsx
new file mode 100644
index 0000000..a792c3a
--- /dev/null
+++ b/hosts/common/configs/user/gui/astal/config/widget/components/Hidden.tsx
@@ -0,0 +1,32 @@
+import { Gtk } from "astal/gtk3";
+import { Variable, bind, timeout } from "astal";
+
+export default function Hidden({
+ child,
+ children,
+ orientation = Gtk.Orientation.VERTICAL,
+ transitionType = Gtk.RevealerTransitionType.SLIDE_DOWN,
+}: {
+ child?: JSX.Element;
+ children?: JSX.Element | JSX.Element[];
+ orientation?: Gtk.Orientation;
+ transitionType?: Gtk.RevealerTransitionType;
+}) {
+ const show = Variable(true);
+ const contents = child ?? children;
+
+ return (
+ show.set(true)}
+ onHoverLost={() => show.set(false)}
+ >
+
+ timeout(2000, () => self.revealChild = false)} revealChild={bind(show)} transitionType={transitionType}>
+ {Array.isArray(contents) ? (<>{contents}>) : (contents)}
+
+
+
+
+ );
+}
diff --git a/hosts/common/configs/user/gui/astal/default.nix b/hosts/common/configs/user/gui/astal/default.nix
index fe7f493..6eaa2ee 100644
--- a/hosts/common/configs/user/gui/astal/default.nix
+++ b/hosts/common/configs/user/gui/astal/default.nix
@@ -25,6 +25,7 @@ in
extraPackages = with pkgs; [
inputs.ags.packages.${system}.hyprland
inputs.ags.packages.${system}.tray
+ inputs.ags.packages.${system}.battery
sassc
hyprland
nixos-icons
diff --git a/hosts/common/configs/user/gui/astal/theme.sass b/hosts/common/configs/user/gui/astal/theme.sass
index 61a1ed6..641cfdb 100644
--- a/hosts/common/configs/user/gui/astal/theme.sass
+++ b/hosts/common/configs/user/gui/astal/theme.sass
@@ -1,5 +1,5 @@
-.bar
- background-color: {{colors.surface.default.hex}}
+.root
+ background-color: transparent
@mixin interactive
min-height: {{custom.font_size}}pt
@@ -16,8 +16,16 @@
&:active
background-color: {{colors.surface_container_highest.default.hex}}
+ .trigger-guard
+ min-height: 5pt
+ background-color: transparent
+
.widgets
- padding: 2pt
+ margin: 5pt
+ padding: 5pt
+ background-color: {{colors.surface.default.hex}}
+ border-radius: {{custom.font_size}}pt
+ border: 2px solid {{colors.outline.default.hex}}
.launcher
@include interactive
@@ -71,3 +79,6 @@
font-size: {{custom.font_size}}pt
padding: 0 2pt
color: {{colors.on_surface.default.hex}}
+
+ .battery
+ @include interactive
diff --git a/hosts/eirene/default.nix b/hosts/eirene/default.nix
index f452e17..35890ee 100644
--- a/hosts/eirene/default.nix
+++ b/hosts/eirene/default.nix
@@ -42,6 +42,7 @@
../common/configs/system/tlp
../common/configs/system/tmux
../common/configs/system/tree
+ ../common/configs/system/upower
../common/configs/system/users
../common/configs/system/zsh
diff --git a/hosts/elara/default.nix b/hosts/elara/default.nix
index e43a17b..559d4f3 100644
--- a/hosts/elara/default.nix
+++ b/hosts/elara/default.nix
@@ -45,6 +45,7 @@
../common/configs/system/tlp
../common/configs/system/tmux
../common/configs/system/tree
+ ../common/configs/system/upower
../common/configs/system/users
../common/configs/system/zsh
diff --git a/hosts/himalia/default.nix b/hosts/himalia/default.nix
index 4268791..8a24daf 100644
--- a/hosts/himalia/default.nix
+++ b/hosts/himalia/default.nix
@@ -41,6 +41,7 @@
../common/configs/system/tlp
../common/configs/system/tmux
../common/configs/system/tree
+ ../common/configs/system/upower
../common/configs/system/users
../common/configs/system/zsh
diff --git a/hosts/himalia/users/nick/default.nix b/hosts/himalia/users/nick/default.nix
index 298606f..571cbb4 100644
--- a/hosts/himalia/users/nick/default.nix
+++ b/hosts/himalia/users/nick/default.nix
@@ -45,8 +45,7 @@ in
(import ../../../common/configs/user/console/yt-dlp { inherit user home; })
(import ../../../common/configs/user/console/zsh { inherit user home; })
- # TODO
- # (import ../../../common/configs/user/gui/astal { inherit user home; })
+ (import ../../../common/configs/user/gui/astal { inherit user home; })
(import ../../../common/configs/user/gui/bluetooth { inherit user home; })
(import ../../../common/configs/user/gui/brightnessctl { inherit user home; })
(import ../../../common/configs/user/gui/btop { inherit user home; })