# ThemeController

Source: /tuil/docs/reference/packages/theme/api/theme-controller
Locale: en

class exported by @mwillbanks/tuil-theme.



{/* Generated by tooling/docs/generate-reference.ts. */}

## class [#class]

Public class exported by `@mwillbanks/tuil-theme`.

```ts
export class ThemeController {
  readonly #capabilities: TerminalCapabilities;
  readonly #observers = new Set<() => void>();
  #theme: Theme;

  constructor(theme: Theme, capabilities: TerminalCapabilities) {
    this.#capabilities = capabilities;
    this.#theme = normalizeTheme(theme, capabilities);
  }

  get(): Theme {
    return this.#theme;
  }

  set(theme: Theme | ThemeFactory): Theme {
    const selected = typeof theme === "function" ? theme(this.#theme) : theme;
    const next = normalizeTheme(selected, this.#capabilities);
    if (next === this.#theme) return next;
    this.#theme = next;
    for (const observer of this.#observers) observer();
    return next;
  }

  observe(observer: () => void): () => void {
    this.#observers.add(observer);
    return () => this.#observers.delete(observer);
  }
}
```

## Members [#members]

| Member          | Type                                      | Required | Description                                                                    | Related types                                                                                                           |
| --------------- | ----------------------------------------- | -------- | ------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
| `#capabilities` | `TerminalCapabilities`                    | Yes      | The `#capabilities` member uses the `TerminalCapabilities` contract.           | [`TerminalCapabilities`](/tuil/docs/reference/packages/core/api/terminal-capabilities)                                       |
| `#observers`    | `Set<() => void>`                         | Yes      | The `#observers` member uses the `Set<() => void>` contract.                   | —                                                                                                                       |
| `#theme`        | `Theme`                                   | Yes      | The `#theme` member uses the `Theme` contract.                                 | [`Theme`](/tuil/docs/reference/packages/theme/api/theme)                                                                     |
| `__constructor` | `any`                                     | Yes      | The `__constructor` member uses the `any` contract.                            | —                                                                                                                       |
| `get`           | `() => Theme`                             | Yes      | The `get` member uses the `() => Theme` contract.                              | [`Theme`](/tuil/docs/reference/packages/theme/api/theme)                                                                     |
| `set`           | `(theme: Theme \| ThemeFactory) => Theme` | Yes      | The `set` member uses the `(theme: Theme \| ThemeFactory) => Theme` contract.  | [`Theme`](/tuil/docs/reference/packages/theme/api/theme), [`ThemeFactory`](/tuil/docs/reference/packages/theme/api/theme-factory) |
| `observe`       | `(observer: () => void) => () => void`    | Yes      | The `observe` member uses the `(observer: () => void) => () => void` contract. | —                                                                                                                       |

## Parameters [#parameters]

This declaration has no public members.

## Returns [#returns]

This declaration does not return a value.

## Throws [#throws]

No thrown errors are documented for this declaration.

## Related types [#related-types]

* [`Theme`](/tuil/docs/reference/packages/theme/api/theme)
* [`ThemeFactory`](/tuil/docs/reference/packages/theme/api/theme-factory)

## Source [#source]

[View the secondary source reference](https://github.com/mwillbanks/tuil/blob/main/packages/theme/src/index.ts)

## Package [#package]

[@mwillbanks/tuil-theme](/tuil/docs/reference/packages/theme)
