# First Widgets ## Getting Started Start by initializing a project ```sh ags init ``` then run `ags run` in the terminal ```sh ags run ``` :::details Usage without AGS 🚧 Not yet documented. 🚧 ::: That's it! You have now a custom written bar using Gtk. :::tip AGS will transpile every `.ts`, `.jsx` and `.tsx` files into regular JavaScript, then it will bundle everything into a single JavaScript file which then GJS can execute. ::: The AGS init command will generate the following files ```txt . β”œβ”€β”€ @girs/ # generated types β”œβ”€β”€ widget/ β”‚ └── Bar.tsx β”œβ”€β”€ app.ts # entry proint β”œβ”€β”€ env.d.ts # additional types β”œβ”€β”€ style.css └── tsconfig.json # needed by LSPs ``` ## Root of every shell component: Window Astal apps are composed of widgets. A widget is a piece of UI that has its own logic and style. A widget can be as small as a button or an entire bar. The top level widget is always a [Window](https://aylur.github.io/libastal/astal3/class.Window.html) which will hold all widgets. ::: code-group ```tsx [widget/Bar.tsx] function Bar(monitor = 0) { return Content of the widget } ``` ::: ::: code-group ```ts [app.ts] import Bar from "./widget/Bar" App.start({ main() { Bar(0) Bar(1) // instantiate for each monitor }, }) ``` ::: ## Creating and nesting widgets Widgets are JavaScript functions which return Gtk widgets, either by using JSX or using a widget constructor. :::code-group ```tsx [MyButton.tsx] function MyButton(): JSX.Element { return } ``` ```ts [MyButton.ts] import { Widget } from "astal/gtk3" function MyButton(): Widget.Button { return new Widget.Button( { onClicked: "echo hello" }, new Widget.Label({ label: "Click me!" }), ) } ``` ::: :::info The only difference between the two is the return type. Using markup the return type is always `Gtk.Widget` (globally available as `JSX.Element`), while using constructors the return type is the actual type of the widget. It is rare to need the actual return type, so most if not all of the time, you can use markup. ::: Now that you have declared `MyButton`, you can nest it into another component. ```tsx function MyBar() { return Click The button } ``` Notice that widgets you defined start with a capital letter ``. Lowercase tags are builtin widgets, while capital letter is for custom widgets. ## Displaying Data JSX lets you put markup into JavaScript. Curly braces let you β€œescape back” into JavaScript so that you can embed some variable from your code and display it. ```tsx function MyWidget() { const label = "hello" return } ``` You can also pass JavaScript to markup attributes ```tsx function MyWidget() { const label = "hello" return