# Theming
Since the widget toolkit is **GTK3** theming is done with **CSS**.
- [CSS tutorial](https://www.w3schools.com/css/)
- [GTK CSS Overview wiki](https://docs.gtk.org/gtk3/css-overview.html)
- [GTK CSS Properties Overview wiki](https://docs.gtk.org/gtk3/css-properties.html)
:::warning GTK is not the web
While most features are implemented in GTK,
you can't assume anything that works on the web will work with GTK.
Refer to the [GTK docs](https://docs.gtk.org/gtk3/css-overview.html)
to see what is available.
:::
So far every widget you made used your default GTK3 theme.
To make them more custom, you can apply stylesheets to them.
## From file at startup
You can pass a path to a file or css as a string in `App.start`
:::code-group
```ts [app.ts]
import style from "inline:./style.css"
const inlineCssInCode = `
window {
background-color: transparent;
}
`
App.start({
css: "./style.css",
css: style,
css: `${SRC}/style.css'`,
css: inlineCss,
})
```
:::
:::info
When using AGS the global `SRC` will point to the directory `app.ts` is in.
AGS will set the current working directory to `--config`, so `./style.css` also works.
If you are not using AGS you should inline import CSS instead.
:::
## Css Property on Widgets
```ts
Widget.Label({
css: "color: blue; padding: 1em;",
label: "hello",
})
```
:::info
The `css` property of a widget will not cascade to its children.
:::
## Apply Stylesheets at Runtime
You can apply additional styles at runtime.
```ts
App.apply_css("/path/to/file.css")
```
```ts
App.apply_css(`
window {
background-color: transparent;
}
`)
```
```ts
App.reset_css() // reset if need
```
:::warning
`App.apply_css` will apply on top of other stylesheets applied before.
You can reset stylesheets with `App.resetCss`
:::
## Inspector
If you are not sure about the widget hierarchy or any CSS selector,
you can use the [GTK inspector](https://wiki.gnome.org/Projects/GTK/Inspector)
::: code-group
```sh [astal]
# to bring up the inspector run
astal --inspector
```
```sh [ags]
# to bring up the inspector run
ags --inspector
```
:::
## Using SCSS
Gtk's CSS only supports a subset of what the web offers.
Most notably nested selectors are unsupported by Gtk, but this can be
workaround by using preprocessors like [SCSS](https://sass-lang.com/).
:::code-group
```sh [ Arch]
sudo pacman -Syu dart-sass
```
```sh [ Fedora]
npm install -g sass # not packaged on Fedora
```
```sh [ Ubuntu]
npm install -g sass # not packaged on Ubuntu
```
:::
Importing `scss` files will simply return transpiled css.
:::code-group
```ts [app.ts]
import style from "./style.scss"
App.start({
css: style,
main() {},
})
```
:::
:::details Without AGS
AGS uses a plugin to transpile scss files before importing them.
If you are not using AGS, you can use a plugin for your chosen bundler.
:::
:::tip
If you for example want to set scss varibles from JS,
You can inline import, compose, and transpile yourself.
```ts [app.ts]
import style1 from "inline:./style1.scss"
import style2 from "inline:./style2.scss"
const tmpscss = "/tmp/style.scss"
const target = "/tmp/style.css"
writeFile(tmpscss, `
$var1: red;
$var1: blue;
${style1}
${style1}
`)
exec(`sass ${tmpscss} ${target}`)
App.start({
css: target,
})
```
:::
:::info
If you want other preprocessors support builtin open an Issue.
:::