# `Lumis.Theme`
[🔗](https://github.com/leandrocp/lumis/blob/hex-lumis/v0.6.3/packages/elixir/lumis/lib/lumis/theme.ex#L1)

A Neovim theme.

Contains the name, appearance, and a map of highlight `Lumis.Theme.Style`'s.

Lumis bundles the most popular themes from the Neovim community,
you can see the full list with `Lumis.available_themes/0` and
then fetch one of the bundled themes with `Lumis.Theme.get/1`.

Or check out all the [available themes](https://docs.rs/lumis/latest/lumis/#themes-available).

## Example

    %Lumis.Theme{
       name: "github_light",
       appearance: :light,
       revision: "fe70a27afefa6e10db4a59262d31f259f702fd6a",
       highlights: %{
         "function.macro" => %Lumis.Theme.Style{
           fg: "#6639ba",
           bg: nil,
           bold: false,
           italic: false,
           text_decoration: %Lumis.Theme.TextDecoration{
             underline: :solid,
             strikethrough: false
           }
         },
         ...
       }
    }

# `appearance`

```elixir
@type appearance() :: :light | :dark
```

# `t`

```elixir
@type t() :: %Lumis.Theme{
  appearance: appearance(),
  highlights: %{required(String.t()) =&gt; Lumis.Theme.Style.t()},
  name: String.t(),
  revision: String.t()
}
```

A Neovim theme with name, appearance (:light or :dark), revision, and highlight styles.

# `build_css`

```elixir
@spec build_css(
  String.t() | t(),
  keyword()
) :: {:ok, String.t()} | {:error, term()}
```

Builds CSS for a Lumis theme.

Accepts a bundled theme name or a `Lumis.Theme` struct. Use this with the
`:html_linked` formatter when you need to embed CSS, scope selectors, or
customize the container code block rule.

## Options

* `:enable_italic` (`t:boolean/0`) - Whether italic theme styles should be emitted. The default value is `true`.

* `:scope` (`t:String.t/0`) - Parent selector prepended to every generated selector. The default value is `""`.

* `:container_selector` (`t:String.t/0`) - Selector used for the container code block rule. Defaults to `.lumis`. The default value is `".lumis"`.

* `:container_style` (list of tuple of `t:String.t/0`, `t:String.t/0` values) - Extra `{property, value}` declarations for the container code block rule. A property that matches one that the theme already sets (`color`, `background-color`) replaces that value. The default value is `[]`.

## Examples

    Lumis.Theme.build_css!("github_dark")

Produces CSS shaped like this:

    /* github_dark
     * revision: ...
     */
    .lumis {
      color: #e6edf3;
      background-color: #0d1117;
    }
    .l-keyword {
      color: #ff7b72;
    }

Scope the generated stylesheet under a parent selector:

    Lumis.Theme.build_css!("github_dark",
      scope: ~s(html[data-theme="dark"]),
      container_style: [
        {"background-color", "var(--code-background)"},
        {"border-radius", "0.375rem"}
      ]
    )

That produces selectors like:

    html[data-theme="dark"] .lumis {
      color: #e6edf3;
      background-color: var(--code-background);
      border-radius: 0.375rem;
    }
    html[data-theme="dark"] .l-keyword {
      color: #ff7b72;
    }

# `build_css!`

```elixir
@spec build_css!(
  String.t() | t(),
  keyword()
) :: String.t()
```

Builds CSS for a Lumis theme, raising on errors.

See `build_css/2` for options.

# `from_file`

```elixir
@spec from_file(String.t()) :: {:ok, t()} | {:error, term()}
```

Load a theme from a JSON file.

# `from_json`

```elixir
@spec from_json(String.t()) :: {:ok, t()} | {:error, term()}
```

Load a theme from a JSON string.

# `get`

```elixir
@spec get(String.t(), any()) :: t() | nil
```

Get a theme by name.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
