diff --git a/.gitignore b/.gitignore
index 298eb4d..40b878d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1 @@
-node_modules/
-@girs/
+node_modules/
\ No newline at end of file
diff --git a/.tool-versions b/.tool-versions
new file mode 100644
index 0000000..10edede
--- /dev/null
+++ b/.tool-versions
@@ -0,0 +1 @@
+nodejs system
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 8c8cc3a..91bc4f5 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,12 +1,28 @@
{
- "typescript.tsdk": "node_modules/typescript/lib",
+ "biome.enabled": true,
+ "editor.formatOnSave": true,
"explorer.fileNesting.patterns": {
- "flake.nix": "*.nix, flake.lock, .envrc",
+ "flake.nix": "*.nix, flake.lock, .envrc, .tool-versions",
"package.json": " pnpm-lock.yaml, tsconfig.json, .gitignore"
},
"files.exclude": {
- ".direnv": true,
- "node_modules": true,
- "@girs": true
- }
-}
+ ".direnv": true
+ // "@girs": true,
+ // "node_modules": true
+ },
+ "terminal.integrated.defaultProfile.linux": "fish-fhs",
+ "terminal.integrated.profiles.linux": {
+ "fish-fhs": {
+ "args": [
+ "--user",
+ "--pty",
+ "--quiet",
+ "--same-dir",
+ "--service-type=exec",
+ "fish"
+ ],
+ "path": "systemd-run"
+ }
+ },
+ "typescript.tsdk": "./node_modules/typescript/lib"
+}
\ No newline at end of file
diff --git a/@girs/appmenuglibtranslator-24.02.d.ts b/@girs/appmenuglibtranslator-24.02.d.ts
new file mode 100644
index 0000000..714c66c
--- /dev/null
+++ b/@girs/appmenuglibtranslator-24.02.d.ts
@@ -0,0 +1,83 @@
+///
+///
+///
+///
+
+/**
+ * Type Definitions for Gjs (https://gjs.guide/)
+ *
+ * These type definitions are automatically generated, do not edit them by hand.
+ * If you found a bug fix it in `ts-for-gir` or create a bug report on https://github.com/gjsify/ts-for-gir
+ *
+ * The based EJS template file is used for the generated .d.ts file of each GIR module like Gtk-4.0, GObject-2.0, ...
+ */
+
+declare module 'gi://AppmenuGLibTranslator?version=24.02' {
+ // Module dependencies
+ import type Gio from 'gi://Gio?version=2.0';
+ import type GObject from 'gi://GObject?version=2.0';
+ import type GLib from 'gi://GLib?version=2.0';
+ import type GModule from 'gi://GModule?version=2.0';
+
+ export namespace AppmenuGLibTranslator {
+ /**
+ * AppmenuGLibTranslator-24.02
+ */
+
+ namespace Importer {
+ // Constructor properties interface
+
+ interface ConstructorProps extends GObject.Object.ConstructorProps {
+ action_group: Gio.ActionGroup;
+ actionGroup: Gio.ActionGroup;
+ bus_name: string;
+ busName: string;
+ model: Gio.MenuModel;
+ object_path: string;
+ objectPath: string;
+ }
+ }
+
+ class Importer extends GObject.Object {
+ static $gtype: GObject.GType;
+
+ // Properties
+
+ get action_group(): Gio.ActionGroup;
+ get actionGroup(): Gio.ActionGroup;
+ set bus_name(val: string);
+ set busName(val: string);
+ get model(): Gio.MenuModel;
+ set object_path(val: string);
+ set objectPath(val: string);
+
+ // Constructors
+
+ constructor(properties?: Partial, ...args: any[]);
+
+ _init(...args: any[]): void;
+
+ static ['new'](bus_name: string, object_path: string): Importer;
+ }
+
+ type ImporterClass = typeof Importer;
+ /**
+ * Name of the imported GIR library
+ * `see` https://gitlab.gnome.org/GNOME/gjs/-/blob/master/gi/ns.cpp#L188
+ */
+ const __name__: string;
+ /**
+ * Version of the imported GIR library
+ * `see` https://gitlab.gnome.org/GNOME/gjs/-/blob/master/gi/ns.cpp#L189
+ */
+ const __version__: string;
+ }
+
+ export default AppmenuGLibTranslator;
+}
+
+declare module 'gi://AppmenuGLibTranslator' {
+ import AppmenuGLibTranslator2402 from 'gi://AppmenuGLibTranslator?version=24.02';
+ export default AppmenuGLibTranslator2402;
+}
+// END
diff --git a/@girs/astal-3.0.d.ts b/@girs/astal-3.0.d.ts
new file mode 100644
index 0000000..bb2c4b6
--- /dev/null
+++ b/@girs/astal-3.0.d.ts
@@ -0,0 +1,2248 @@
+///
+///
+///
+///
+///
+///
+///
+///
+///
+///
+///
+///
+///
+///
+///
+
+/**
+ * Type Definitions for Gjs (https://gjs.guide/)
+ *
+ * These type definitions are automatically generated, do not edit them by hand.
+ * If you found a bug fix it in `ts-for-gir` or create a bug report on https://github.com/gjsify/ts-for-gir
+ *
+ * The based EJS template file is used for the generated .d.ts file of each GIR module like Gtk-4.0, GObject-2.0, ...
+ */
+
+declare module 'gi://Astal?version=3.0' {
+ // Module dependencies
+ import type AstalIO from 'gi://AstalIO?version=0.1';
+ import type GLib from 'gi://GLib?version=2.0';
+ import type GObject from 'gi://GObject?version=2.0';
+ import type Gio from 'gi://Gio?version=2.0';
+ import type GModule from 'gi://GModule?version=2.0';
+ import type Gdk from 'gi://Gdk?version=3.0';
+ import type cairo from 'cairo';
+ import type Pango from 'gi://Pango?version=1.0';
+ import type HarfBuzz from 'gi://HarfBuzz?version=0.0';
+ import type freetype2 from 'gi://freetype2?version=2.0';
+ import type GdkPixbuf from 'gi://GdkPixbuf?version=2.0';
+ import type Gtk from 'gi://Gtk?version=3.0';
+ import type xlib from 'gi://xlib?version=2.0';
+ import type Atk from 'gi://Atk?version=1.0';
+
+ export namespace Astal {
+ /**
+ * Astal-3.0
+ */
+
+ export namespace MouseButton {
+ export const $gtype: GObject.GType;
+ }
+
+ enum MouseButton {
+ PRIMARY,
+ MIDDLE,
+ SECONDARY,
+ BACK,
+ FORWARD,
+ }
+
+ export namespace Exclusivity {
+ export const $gtype: GObject.GType;
+ }
+
+ enum Exclusivity {
+ NORMAL,
+ /**
+ * Request the compositor to allocate space for this window.
+ */
+ EXCLUSIVE,
+ /**
+ * Request the compositor to stack layers on top of each other.
+ */
+ IGNORE,
+ }
+
+ export namespace Layer {
+ export const $gtype: GObject.GType;
+ }
+
+ enum Layer {
+ BACKGROUND,
+ BOTTOM,
+ TOP,
+ OVERLAY,
+ }
+
+ export namespace Keymode {
+ export const $gtype: GObject.GType;
+ }
+
+ enum Keymode {
+ /**
+ * Window should not receive keyboard events.
+ */
+ NONE,
+ /**
+ * Window should have exclusive focus if it is on the top or overlay layer.
+ */
+ EXCLUSIVE,
+ /**
+ * Focus and Unfocues the window as needed.
+ */
+ ON_DEMAND,
+ }
+ const MAJOR_VERSION: number;
+ const MINOR_VERSION: number;
+ const MICRO_VERSION: number;
+ const VERSION: string;
+ function widget_set_css(widget: Gtk.Widget, css: string): void;
+ function widget_get_css(widget: Gtk.Widget): string;
+ function widget_set_class_names(widget: Gtk.Widget, class_names: string[]): void;
+ function widget_get_class_names(widget: Gtk.Widget): string[];
+ function widget_toggle_class_name(widget: Gtk.Widget, class_name: string, condition: boolean): void;
+ function widget_set_cursor(widget: Gtk.Widget, cursor: string): void;
+ function widget_get_cursor(widget: Gtk.Widget): string;
+ function widget_set_click_through(widget: Gtk.Widget, click_through: boolean): void;
+ function widget_get_click_through(widget: Gtk.Widget): boolean;
+
+ export namespace WindowAnchor {
+ export const $gtype: GObject.GType;
+ }
+
+ enum WindowAnchor {
+ NONE,
+ TOP,
+ RIGHT,
+ LEFT,
+ BOTTOM,
+ }
+ namespace Box {
+ // Constructor properties interface
+
+ interface ConstructorProps extends Gtk.Box.ConstructorProps {
+ vertical: boolean;
+ children: Gtk.Widget[];
+ child: Gtk.Widget;
+ }
+ }
+
+ class Box extends Gtk.Box {
+ static $gtype: GObject.GType;
+
+ // Properties
+
+ /**
+ * Corresponds to [property`Gtk`.Orientable :orientation].
+ */
+ get vertical(): boolean;
+ set vertical(val: boolean);
+ get children(): Gtk.Widget[];
+ set children(val: Gtk.Widget[]);
+ get child(): Gtk.Widget;
+ set child(val: Gtk.Widget);
+
+ // Constructors
+
+ constructor(properties?: Partial, ...args: any[]);
+
+ _init(...args: any[]): void;
+
+ static ['new'](vertical: boolean, children: Gtk.Widget[]): Box;
+ // Conflicted with Gtk.Box.new
+
+ static ['new'](...args: never[]): any;
+
+ // Methods
+
+ get_vertical(): boolean;
+ set_vertical(value: boolean): void;
+ get_children(): Gtk.Widget[];
+ set_children(value: Gtk.Widget[]): void;
+ get_child(): Gtk.Widget;
+ set_child(value: Gtk.Widget): void;
+ }
+
+ namespace Button {
+ // Signal callback interfaces
+
+ interface Hover {
+ (event: HoverEvent): void;
+ }
+
+ interface HoverLost {
+ (event: HoverEvent): void;
+ }
+
+ interface Click {
+ (event: ClickEvent): void;
+ }
+
+ interface ClickRelease {
+ (event: ClickEvent): void;
+ }
+
+ interface Scroll {
+ (event: ScrollEvent): void;
+ }
+
+ // Constructor properties interface
+
+ interface ConstructorProps extends Gtk.Button.ConstructorProps {}
+ }
+
+ /**
+ * This button has no extra functionality on top if its base [class`Gtk`.Button] class.
+ * The purpose of this Button subclass is to have a destructable struct as the argument in GJS event handlers.
+ */
+ class Button extends Gtk.Button {
+ static $gtype: GObject.GType