# Widget
## AGS widget properties
These are properties that Astal.js additionally adds to Gtk.Widgets
- className: `string` - List of class CSS selectors separated by white space.
- css: `string` - Inline CSS. e.g `label { color: white; }`. If no selector is specified `*` will be assumed. e.g `color: white;` will be inferred as `* { color: white; }`.
- cursor: `string` - Cursor style when hovering over widgets that have hover states, e.g it won't work on labels. [list of valid values](https://docs.gtk.org/gdk3/ctor.Cursor.new_from_name.html).
- clickThrough: `boolean` - Lets click events through.
To have a full list of available properties, reference the documentation of the widget.
- [Astal widgets](/astal/reference#classes)
- [Gtk widgets](https://docs.gtk.org/gtk3/#classes)
You can check the [source code](https://github.com/aylur/astal/blob/main/gjs/src/widgets.ts) to have a full list of builtin widgets.
## AGS widget methods
Additional methods that Astal.js add to Gtk.Widget instances
### setup
`setup` is a convenience prop to not have predefine widgets before returning them
without `setup`
```tsx
function MyWidget() {
const button = Widget.Button()
// setup button
return button
}
```
using `setup`
```tsx
function MyWidget() {
function setup(button: Widget.Button) {
// setup button
}
return
}
```
### hook
Shorthand for connection and disconnecting to gobjects.
without `hook`
```tsx
function MyWidget() {
const id = gobject.connect("signal", callback)
return {
gobject.disconnect(id)
}}
/>
}
```
with `hook`
```tsx
function MyWidget() {
return {
self.hook(gobject, "signal", callback)
}}
/>
}
```
### toggleClassName
Toggle classNames based on a condition
```tsx
function MyWidget() {
return {
self.toggleClassName("classname", someCondition)
}}
/>
}
```
## How to use non builtin Gtk widgets
Using `Widget.astalify` you can setup widget constructors to behave like builtin widgets.
The `astalify` function will apply the following:
- set `visible` to true by default (Gtk3 widgets are invisible by default)
- make gobject properties accept and consume `Binding` objects
- add properties and methods listed above
- proxify the constructor so the `new` keyword is not needed
- sets up signal handlers that are passed as props prefixed with `on`
```tsx
import { Widget, Gtk } from "astal"
// define its props, constructor and type
export type ColorButtonProps = Widget.ConstructProps<
Gtk.ColorButton,
Gtk.ColorButton.ConstructorProps,
{ onColorSet: [] }
>
export const ColorButton = Widget.astalify<
typeof Gtk.ColorButton,
ColorButtonProps,
"ColorButton"
>(Gtk.ColorButton)
export type ColorButton = ReturnType
function MyWidget() {
function setup(button: ColorButton) {}
return {
console.log(self.rgba)
}}
/>
}
```
:::info
Signal properties have to be annotated manually for TypeScript.
You can reference [Gtk3](https://gjs-docs.gnome.org/gtk30~3.0/)
and [Astal](/astal/reference#classes) for available signals.
:::