> 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

Learn about other Option implementations for more functionality.

## `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="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&amp;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()
```
