Skip to main content

src/etui@theme.erl

-module(etui@theme).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/theme.gleam").
-export([normal/1, selection/1, accent_style/1, border_style/1, title_style/1, muted_style/1, error_style/1, warning_style/1, success_style/1, info_style/1, statusbar_style/1, dark/0, light/0, dracula/0, nord/0, catppuccin_mocha/0, catppuccin_latte/0, monokai/0, solarized_dark/0, gruvbox_dark/0, tokyo_night/0, with_accent/2, with_selection/3, with_statusbar/3, with_base/3]).
-export_type([theme/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

-type theme() :: {theme,
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color(),
        etui@style:color()}.

-file("src/etui/theme.gleam", 102).
?DOC(" Normal text: fg on bg.\n").
-spec normal(theme()) -> etui@style:style().
normal(T) ->
    {style, erlang:element(3, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 107).
?DOC(" Selected item: selection_fg on selection_bg.\n").
-spec selection(theme()) -> etui@style:style().
selection(T) ->
    {style, erlang:element(7, T), erlang:element(6, T), etui@style:none()}.

-file("src/etui/theme.gleam", 112).
?DOC(" Accent text: accent on bg.\n").
-spec accent_style(theme()) -> etui@style:style().
accent_style(T) ->
    {style, erlang:element(8, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 117).
?DOC(" Border color: border on bg.\n").
-spec border_style(theme()) -> etui@style:style().
border_style(T) ->
    {style, erlang:element(4, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 122).
?DOC(" Title color: title on bg.\n").
-spec title_style(theme()) -> etui@style:style().
title_style(T) ->
    {style, erlang:element(5, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 127).
?DOC(" Muted/secondary text: muted on bg.\n").
-spec muted_style(theme()) -> etui@style:style().
muted_style(T) ->
    {style, erlang:element(9, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 132).
?DOC(" Error text: error color on bg, bold.\n").
-spec error_style(theme()) -> etui@style:style().
error_style(T) ->
    {style, erlang:element(10, T), erlang:element(2, T), etui@style:bold()}.

-file("src/etui/theme.gleam", 137).
?DOC(" Warning text: warning color on bg.\n").
-spec warning_style(theme()) -> etui@style:style().
warning_style(T) ->
    {style, erlang:element(11, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 142).
?DOC(" Success text: success color on bg.\n").
-spec success_style(theme()) -> etui@style:style().
success_style(T) ->
    {style, erlang:element(12, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 147).
?DOC(" Info text: info color on bg.\n").
-spec info_style(theme()) -> etui@style:style().
info_style(T) ->
    {style, erlang:element(13, T), erlang:element(2, T), etui@style:none()}.

-file("src/etui/theme.gleam", 152).
?DOC(" Status bar: statusbar_fg on statusbar_bg.\n").
-spec statusbar_style(theme()) -> etui@style:style().
statusbar_style(T) ->
    {style, erlang:element(15, T), erlang:element(14, T), etui@style:none()}.

-file("src/etui/theme.gleam", 161).
?DOC(
    " Generic dark theme using ANSI 16-color palette.\n"
    " Works on every terminal, even without true-color support.\n"
).
-spec dark() -> theme().
dark() ->
    {theme,
        default,
        default,
        {indexed, 8},
        {indexed, 15},
        {indexed, 4},
        {indexed, 15},
        {indexed, 12},
        {indexed, 8},
        {indexed, 9},
        {indexed, 11},
        {indexed, 10},
        {indexed, 14},
        {indexed, 0},
        {indexed, 15}}.

-file("src/etui/theme.gleam", 181).
?DOC(" Generic light theme using ANSI 16-color palette.\n").
-spec light() -> theme().
light() ->
    {theme,
        default,
        default,
        {indexed, 7},
        {indexed, 0},
        {indexed, 12},
        {indexed, 15},
        {indexed, 4},
        {indexed, 7},
        {indexed, 1},
        {indexed, 3},
        {indexed, 2},
        {indexed, 6},
        {indexed, 7},
        {indexed, 0}}.

-file("src/etui/theme.gleam", 202).
?DOC(
    " Dracula, dark purple palette.\n"
    " Original palette: https://draculatheme.com\n"
).
-spec dracula() -> theme().
dracula() ->
    {theme,
        {rgb, 40, 42, 54},
        {rgb, 248, 248, 242},
        {rgb, 98, 114, 164},
        {rgb, 139, 233, 253},
        {rgb, 68, 71, 90},
        {rgb, 248, 248, 242},
        {rgb, 189, 147, 249},
        {rgb, 98, 114, 164},
        {rgb, 255, 85, 85},
        {rgb, 255, 184, 108},
        {rgb, 80, 250, 123},
        {rgb, 139, 233, 253},
        {rgb, 33, 34, 44},
        {rgb, 248, 248, 242}}.

-file("src/etui/theme.gleam", 223).
?DOC(
    " Nord, arctic, north-bluish dark palette.\n"
    " Original palette: https://www.nordtheme.com\n"
).
-spec nord() -> theme().
nord() ->
    {theme,
        {rgb, 46, 52, 64},
        {rgb, 216, 222, 233},
        {rgb, 76, 86, 106},
        {rgb, 136, 192, 208},
        {rgb, 67, 76, 94},
        {rgb, 236, 239, 244},
        {rgb, 129, 161, 193},
        {rgb, 76, 86, 106},
        {rgb, 191, 97, 106},
        {rgb, 235, 203, 139},
        {rgb, 163, 190, 140},
        {rgb, 143, 188, 187},
        {rgb, 36, 41, 51},
        {rgb, 216, 222, 233}}.

-file("src/etui/theme.gleam", 244).
?DOC(
    " Catppuccin Mocha, warm pastel dark palette.\n"
    " Original palette: https://catppuccin.com\n"
).
-spec catppuccin_mocha() -> theme().
catppuccin_mocha() ->
    {theme,
        {rgb, 30, 30, 46},
        {rgb, 205, 214, 244},
        {rgb, 88, 91, 112},
        {rgb, 166, 227, 161},
        {rgb, 69, 71, 90},
        {rgb, 205, 214, 244},
        {rgb, 137, 180, 250},
        {rgb, 108, 112, 134},
        {rgb, 243, 139, 168},
        {rgb, 249, 226, 175},
        {rgb, 166, 227, 161},
        {rgb, 137, 220, 235},
        {rgb, 24, 24, 37},
        {rgb, 205, 214, 244}}.

-file("src/etui/theme.gleam", 265).
?DOC(
    " Catppuccin Latte, warm pastel light palette.\n"
    " Original palette: https://catppuccin.com\n"
).
-spec catppuccin_latte() -> theme().
catppuccin_latte() ->
    {theme,
        {rgb, 239, 241, 245},
        {rgb, 76, 79, 105},
        {rgb, 172, 176, 190},
        {rgb, 64, 160, 43},
        {rgb, 188, 192, 204},
        {rgb, 76, 79, 105},
        {rgb, 30, 102, 245},
        {rgb, 172, 176, 190},
        {rgb, 210, 15, 57},
        {rgb, 223, 142, 29},
        {rgb, 64, 160, 43},
        {rgb, 4, 165, 229},
        {rgb, 204, 208, 218},
        {rgb, 76, 79, 105}}.

-file("src/etui/theme.gleam", 286).
?DOC(
    " Monokai, vibrant dark palette.\n"
    " Inspired by the Monokai color scheme.\n"
).
-spec monokai() -> theme().
monokai() ->
    {theme,
        {rgb, 39, 40, 34},
        {rgb, 248, 248, 242},
        {rgb, 117, 113, 94},
        {rgb, 166, 226, 46},
        {rgb, 73, 72, 62},
        {rgb, 248, 248, 242},
        {rgb, 102, 217, 239},
        {rgb, 117, 113, 94},
        {rgb, 249, 38, 114},
        {rgb, 253, 151, 31},
        {rgb, 166, 226, 46},
        {rgb, 102, 217, 239},
        {rgb, 30, 30, 27},
        {rgb, 248, 248, 242}}.

-file("src/etui/theme.gleam", 307).
?DOC(
    " Solarized Dark, precision dark palette.\n"
    " Original palette by Ethan Schoonover.\n"
).
-spec solarized_dark() -> theme().
solarized_dark() ->
    {theme,
        {rgb, 0, 43, 54},
        {rgb, 131, 148, 150},
        {rgb, 88, 110, 117},
        {rgb, 38, 139, 210},
        {rgb, 7, 54, 66},
        {rgb, 147, 161, 161},
        {rgb, 38, 139, 210},
        {rgb, 88, 110, 117},
        {rgb, 220, 50, 47},
        {rgb, 181, 137, 0},
        {rgb, 133, 153, 0},
        {rgb, 42, 161, 152},
        {rgb, 0, 26, 33},
        {rgb, 131, 148, 150}}.

-file("src/etui/theme.gleam", 328).
?DOC(
    " Gruvbox Dark, retro groove dark palette.\n"
    " Inspired by the Gruvbox color scheme.\n"
).
-spec gruvbox_dark() -> theme().
gruvbox_dark() ->
    {theme,
        {rgb, 29, 32, 33},
        {rgb, 235, 219, 178},
        {rgb, 80, 73, 69},
        {rgb, 184, 187, 38},
        {rgb, 60, 56, 54},
        {rgb, 235, 219, 178},
        {rgb, 215, 153, 33},
        {rgb, 102, 92, 84},
        {rgb, 251, 73, 52},
        {rgb, 250, 189, 47},
        {rgb, 184, 187, 38},
        {rgb, 131, 165, 152},
        {rgb, 20, 22, 23},
        {rgb, 235, 219, 178}}.

-file("src/etui/theme.gleam", 349).
?DOC(
    " Tokyo Night, dark cool-blue palette.\n"
    " Inspired by the Tokyo Night color scheme.\n"
).
-spec tokyo_night() -> theme().
tokyo_night() ->
    {theme,
        {rgb, 26, 27, 38},
        {rgb, 169, 177, 214},
        {rgb, 65, 72, 104},
        {rgb, 122, 162, 247},
        {rgb, 41, 46, 66},
        {rgb, 192, 202, 245},
        {rgb, 187, 154, 247},
        {rgb, 86, 95, 137},
        {rgb, 247, 118, 142},
        {rgb, 224, 175, 104},
        {rgb, 158, 206, 106},
        {rgb, 125, 207, 255},
        {rgb, 22, 22, 30},
        {rgb, 169, 177, 214}}.

-file("src/etui/theme.gleam", 378).
?DOC(
    " Override individual fields on an existing theme.\n"
    " Use Gleam's record update syntax directly:\n"
    " ```gleam\n"
    " let my = Theme(..theme.nord(), accent: style.Rgb(255, 165, 0))\n"
    " ```\n"
    " These helpers cover common single-field tweaks.\n"
    " Replace the accent color.\n"
).
-spec with_accent(theme(), etui@style:color()) -> theme().
with_accent(T, Color) ->
    {theme,
        erlang:element(2, T),
        erlang:element(3, T),
        erlang:element(4, T),
        erlang:element(5, T),
        erlang:element(6, T),
        erlang:element(7, T),
        Color,
        erlang:element(9, T),
        erlang:element(10, T),
        erlang:element(11, T),
        erlang:element(12, T),
        erlang:element(13, T),
        erlang:element(14, T),
        erlang:element(15, T)}.

-file("src/etui/theme.gleam", 383).
?DOC(" Replace the selection colors.\n").
-spec with_selection(theme(), etui@style:color(), etui@style:color()) -> theme().
with_selection(T, Bg, Fg) ->
    {theme,
        erlang:element(2, T),
        erlang:element(3, T),
        erlang:element(4, T),
        erlang:element(5, T),
        Bg,
        Fg,
        erlang:element(8, T),
        erlang:element(9, T),
        erlang:element(10, T),
        erlang:element(11, T),
        erlang:element(12, T),
        erlang:element(13, T),
        erlang:element(14, T),
        erlang:element(15, T)}.

-file("src/etui/theme.gleam", 388).
?DOC(" Replace the status bar colors.\n").
-spec with_statusbar(theme(), etui@style:color(), etui@style:color()) -> theme().
with_statusbar(T, Bg, Fg) ->
    {theme,
        erlang:element(2, T),
        erlang:element(3, T),
        erlang:element(4, T),
        erlang:element(5, T),
        erlang:element(6, T),
        erlang:element(7, T),
        erlang:element(8, T),
        erlang:element(9, T),
        erlang:element(10, T),
        erlang:element(11, T),
        erlang:element(12, T),
        erlang:element(13, T),
        Bg,
        Fg}.

-file("src/etui/theme.gleam", 393).
?DOC(" Replace main bg/fg.\n").
-spec with_base(theme(), etui@style:color(), etui@style:color()) -> theme().
with_base(T, Bg, Fg) ->
    {theme,
        Bg,
        Fg,
        erlang:element(4, T),
        erlang:element(5, T),
        erlang:element(6, T),
        erlang:element(7, T),
        erlang:element(8, T),
        erlang:element(9, T),
        erlang:element(10, T),
        erlang:element(11, T),
        erlang:element(12, T),
        erlang:element(13, T),
        erlang:element(14, T),
        erlang:element(15, T)}.