Skip to main content

src/sparklinekit@theme.erl

-module(sparklinekit@theme).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/sparklinekit/theme.gleam").
-export([ocean/0, forest/0, sunset/0, mono/0, neon/0, pastel/0, crimson/0, slate/0, amber/0, midnight/0, default/0, foreground/1, background/1, area/1, negative/1]).
-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.

?MODULEDOC(
    " Named colour schemes for the SVG and PNG renderers.\n"
    "\n"
    " ```gleam\n"
    " import sparklinekit/line\n"
    " import sparklinekit/theme\n"
    "\n"
    " pub fn ocean_chart() -> String {\n"
    "   line.new([1.0, 5.0, 3.0, 8.0, 4.0])\n"
    "   |> line.with_theme(theme.ocean())\n"
    "   |> line.with_area_fill(True)\n"
    "   |> line.to_svg\n"
    " }\n"
    " ```\n"
    "\n"
    " Each theme is a small bundle of four CSS colour strings:\n"
    "\n"
    " - `foreground` — the stroke or main fill colour.\n"
    " - `background` — the colour for the chart's background rectangle.\n"
    " - `area`       — the fill colour used under the line when\n"
    "   `with_area_fill(True)` is set.\n"
    " - `negative`   — the colour used for negative bars in `bar`\n"
    "   charts; line charts ignore it.\n"
    "\n"
    " Pass a theme to `line.with_theme` / `bar.with_theme` to set all\n"
    " four slots at once. The individual `with_color`,\n"
    " `with_background_color`, `with_area_color`, and\n"
    " `with_negative_color` helpers override one slot at a time and can\n"
    " be chained after `with_theme` to tweak it.\n"
).

-opaque theme() :: {theme, binary(), binary(), binary(), binary()}.

-file("src/sparklinekit/theme.gleam", 40).
?DOC(
    " Classic vivid blue on white — a sensible default for product\n"
    " dashboards. Foreground is Tailwind `blue-600`.\n"
).
-spec ocean() -> theme().
ocean() ->
    {theme,
        <<"#2563EB"/utf8>>,
        <<"#FFFFFF"/utf8>>,
        <<"#2563EB33"/utf8>>,
        <<"#94A3B8"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 51).
?DOC(
    " Emerald green paired with a red negative — the canonical\n"
    " \"finance up / down\" palette.\n"
).
-spec forest() -> theme().
forest() ->
    {theme,
        <<"#10B981"/utf8>>,
        <<"#FFFFFF"/utf8>>,
        <<"#10B98133"/utf8>>,
        <<"#EF4444"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 61).
?DOC(" Warm orange — good for attention or \"trending\" indicators.\n").
-spec sunset() -> theme().
sunset() ->
    {theme,
        <<"#F97316"/utf8>>,
        <<"#FFFFFF"/utf8>>,
        <<"#F9731633"/utf8>>,
        <<"#7C3AED"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 72).
?DOC(
    " Near-black on pure white — print-friendly and embeds cleanly in\n"
    " monochrome dashboards.\n"
).
-spec mono() -> theme().
mono() ->
    {theme,
        <<"#0F172A"/utf8>>,
        <<"#FFFFFF"/utf8>>,
        <<"#0F172A29"/utf8>>,
        <<"#94A3B8"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 82).
?DOC(" High-contrast cyan on near-black — designed for dark UIs.\n").
-spec neon() -> theme().
neon() ->
    {theme,
        <<"#22D3EE"/utf8>>,
        <<"#020617"/utf8>>,
        <<"#22D3EE33"/utf8>>,
        <<"#F472B6"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 92).
?DOC(" Soft violet on a paper-white canvas — low-key, design-focused.\n").
-spec pastel() -> theme().
pastel() ->
    {theme,
        <<"#A78BFA"/utf8>>,
        <<"#FAF5FF"/utf8>>,
        <<"#A78BFA33"/utf8>>,
        <<"#FB7185"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 103).
?DOC(
    " Saturated red on white — useful for losses, alerts, or\n"
    " \"attention required\" KPIs.\n"
).
-spec crimson() -> theme().
crimson() ->
    {theme,
        <<"#DC2626"/utf8>>,
        <<"#FFFFFF"/utf8>>,
        <<"#DC262633"/utf8>>,
        <<"#94A3B8"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 114).
?DOC(
    " Neutral slate grey on white — corporate, low-saturation, works\n"
    " alongside any brand colour without competing with it.\n"
).
-spec slate() -> theme().
slate() ->
    {theme,
        <<"#475569"/utf8>>,
        <<"#FFFFFF"/utf8>>,
        <<"#47556933"/utf8>>,
        <<"#F59E0B"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 125).
?DOC(
    " Golden amber on white — popular for finance and \"warning\"\n"
    " indicators where red would be too strong.\n"
).
-spec amber() -> theme().
amber() ->
    {theme,
        <<"#F59E0B"/utf8>>,
        <<"#FFFFFF"/utf8>>,
        <<"#F59E0B33"/utf8>>,
        <<"#DC2626"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 136).
?DOC(
    " Off-white foreground on deep navy — a dark-mode companion to\n"
    " `mono()`, for embedding into dark dashboards.\n"
).
-spec midnight() -> theme().
midnight() ->
    {theme,
        <<"#F8FAFC"/utf8>>,
        <<"#020617"/utf8>>,
        <<"#F8FAFC29"/utf8>>,
        <<"#FB7185"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 148).
?DOC(
    " Default theme used when no `with_theme` call is made: CSS\n"
    " `currentColor` for the foreground, no background fill, an\n"
    " auto-derived area tint, and a fallback negative bar colour.\n"
).
-spec default() -> theme().
default() ->
    {theme,
        <<"currentColor"/utf8>>,
        <<"none"/utf8>>,
        <<"currentColor"/utf8>>,
        <<"#EF4444"/utf8>>}.

-file("src/sparklinekit/theme.gleam", 158).
?DOC(" The chart's main stroke / fill colour.\n").
-spec foreground(theme()) -> binary().
foreground(Theme) ->
    erlang:element(2, Theme).

-file("src/sparklinekit/theme.gleam", 165).
?DOC(
    " Background rectangle colour. The string `\"none\"` disables the\n"
    " background rectangle entirely (the renderer omits it from the\n"
    " SVG / leaves PNG pixels transparent).\n"
).
-spec background(theme()) -> binary().
background(Theme) ->
    erlang:element(3, Theme).

-file("src/sparklinekit/theme.gleam", 171).
?DOC(
    " Area-fill colour used under the line in `line` charts when\n"
    " `with_area_fill(True)` is set.\n"
).
-spec area(theme()) -> binary().
area(Theme) ->
    erlang:element(4, Theme).

-file("src/sparklinekit/theme.gleam", 177).
?DOC(
    " Colour applied to negative bars in `bar` charts. Ignored by\n"
    " `line` charts.\n"
).
-spec negative(theme()) -> binary().
negative(Theme) ->
    erlang:element(5, Theme).