> For the complete documentation index, see [llms.txt](https://docs.isxander.dev/yet-another-config-lib/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.isxander.dev/yet-another-config-lib/gui-builder/special-options.md).

# Special Options

## `ListOption`

List options allow you to easily allow the user to easily append, sort and remove elements from a list, whilst also allowing the use of [regular controllers](/yet-another-config-lib/gui-builder/controllers.md).

These types of options are a hybrid between groups and options, behaving like both, and does not allow for it to be added to a group but must be added to a category directly. Under-the-hood, each option entry is like a regular option, but with no name. This option is a child of a list entry, which has extra buttons to reposition and remove elements.

```java
ListOption.<String>createBuilder()
    .name(Component.literal("List Option"))
    .binding(/* gets and sets a List, requires list field to be not final, does not manipulate the list */)
    .controller(StringControllerBuilder::create) // usual controllers, passed to every entry
    .initial("") // when adding a new entry to the list, this is the initial value it has
    .build()
```

To re-iterate, *EVERY* controller works with lists.

<div align="left"><figure><img src="/files/gnX1hYET4VZCjKVTwLmv" alt=""><figcaption></figcaption></figure></div>

## `LabelOption`

Labels are simply options that display text. Create one like so:

```java
LabelOption.create(Component.literal("Cool label!"))
```

## `ButtonOption`

Button options are options that do an action when pressed. Create one like so:

```java
ButtonOption.createBuilder()
        .name(...)
        .description(...)
        .action((yaclScreen, thisOption) -> { /* do something here */ })
        .build()
```
