# 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](https://docs.isxander.dev/yet-another-config-lib/gui-builder/controllers).

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="https://8383976-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs4yG60a7UCSjUx5DT1wQ%2Fuploads%2FJyReZy1fmvIBFn3PGWyi%2F206925713-115d5737-19c5-4469-894c-710f6fc271cd.png?alt=media&#x26;token=94f010b7-b837-4756-b33a-ba9375438628" 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()
```
