3 Commits

Author SHA1 Message Date
4a5f8cbb39 remove readme description of symconf dependence 2025-12-29 23:05:06 -08:00
eb02be9582 fix README links to template files 2025-12-28 17:43:01 -08:00
74c22552df fix a few README typos 2025-12-20 04:56:12 -08:00
3 changed files with 36 additions and 35 deletions

View File

@@ -30,12 +30,12 @@ both of which have fixed hue values and vary from 10% to 98% lightness.
Monotone curves have fixed chroma, whereas the accent curves' chroma varies Monotone curves have fixed chroma, whereas the accent curves' chroma varies
smoothly as a function of lightness within sRGB gamut bounds. smoothly as a function of lightness within sRGB gamut bounds.
| Chroma curves | Color trajectories | | Chroma curves | Color trajectories |
|---|---| |-------------------------------------------------------|------------------------------------------|
| ![Chroma curves](images/curves/cstar-curves-v140.png) | ![Trajectories](images/trajectories.gif) | | ![Chroma curves](images/curves/cstar-curves-v140.png) | ![Trajectories](images/trajectories.gif) |
| Palette | | Palette |
|---| |--------------------------------|
| ![Palette](images/palette.png) | | ![Palette](images/palette.png) |
Chroma curves are designed specifically to establish a distinct role for each Chroma curves are designed specifically to establish a distinct role for each
@@ -60,8 +60,8 @@ varying only in lightness from dark to light grey.
## Themes ## Themes
| Dark themes | Light themes | | Dark themes | Light themes |
|---|---| |----------------------------------------|------------------------------------------|
| ![Dark themes](images/dark_themes.png) | ![Light themes](images/light_themes.png) | | ![Dark themes](images/dark_themes.png) | ![Light themes](images/light_themes.png) |
Themes are derived from the `monobiome` palette by selecting a monotone base Themes are derived from the `monobiome` palette by selecting a monotone base
@@ -78,10 +78,10 @@ to the background.
The following plots show the intersection of the sphere centered at a fixed The following plots show the intersection of the sphere centered at a fixed
background color (`alpine` biome with a lightness of 20) under variable radii: background color (`alpine` biome with a lightness of 20) under variable radii:
| | `-l 20 -d 0.3` | `-l 20 -d 0.4` | `-l 20 -d 0.5` | | | `-l 20 -d 0.3` | `-l 20 -d 0.4` | `-l 20 -d 0.5` |
|---|---|---|---| |---------------------|---------------------------------------------------|---------------------------------------------------|---------------------------------------------------|
| Color visualization | ![](images/oklch/mb_b20_d30.gif) | ![](images/oklch/mb_b20_d40.gif) | ![](images/oklch/mb_b20_d50.gif) | | Color visualization | ![](images/oklch/mb_b20_d30.gif) | ![](images/oklch/mb_b20_d40.gif) | ![](images/oklch/mb_b20_d50.gif) |
| Editor preview | ![](images/render/v140-demo-alpine-dark-d0.3.png) | ![](images/render/v140-demo-alpine-dark-d0.4.png) | ![](images/render/v140-demo-alpine-dark-d0.5.png) | | Editor preview | ![](images/render/v140-demo-alpine-dark-d0.3.png) | ![](images/render/v140-demo-alpine-dark-d0.4.png) | ![](images/render/v140-demo-alpine-dark-d0.5.png) |
In short, the base lightness (`-l`) dictates the brightness of the background, In short, the base lightness (`-l`) dictates the brightness of the background,
and the contrast (`-d`) controls how perceptually distinct the accent colors and the contrast (`-d`) controls how perceptually distinct the accent colors
@@ -146,11 +146,6 @@ the `monobiome` CLI:
Running these commands in sequence from the repo root should work Running these commands in sequence from the repo root should work
out-of-the-box, after having installed the CLI tool. out-of-the-box, after having installed the CLI tool.
The `monobiome` CLI
produces the scheme file for requested parameters, and the [`symconf`][3] CLI
pushes palette colors through the scheme and into the app templates to yield a
concrete theme.
## Applications ## Applications
This repo provides palette-agnostic theme templates for `kitty`, This repo provides palette-agnostic theme templates for `kitty`,
`vim`/`neovim`, and `fzf` in the `templates/` directory. Pre-generated `vim`/`neovim`, and `fzf` in the `templates/` directory. Pre-generated
@@ -178,7 +173,7 @@ One can set these themes for the provided applications as follows:
``` ```
Themes are generated using the [`kitty` theme Themes are generated using the [`kitty` theme
template](templates/apps/kitty/templates/active.theme). template](templates/kitty/active.theme).
- `vim`/`neovim` - `vim`/`neovim`
@@ -193,7 +188,7 @@ One can set these themes for the provided applications as follows:
``` ```
Themes are generated using the [`vim` theme Themes are generated using the [`vim` theme
template](templates/apps/nvim/templates/theme.vim). template](templates/nvim/theme.vim).
- `fzf` - `fzf`
@@ -206,7 +201,7 @@ One can set these themes for the provided applications as follows:
``` ```
Themes are generated using the [`fzf` theme Themes are generated using the [`fzf` theme
template](templates/apps/fzf/templates/active.theme). template](templates/fzf/active.theme).
- Firefox - Firefox
@@ -214,13 +209,11 @@ One can set these themes for the provided applications as follows:
add-ons][2], and switch between light/dark schemes based on system settings. add-ons][2], and switch between light/dark schemes based on system settings.
You can also download raw XPI files for each theme in `app-config/firefox/`, You can also download raw XPI files for each theme in `app-config/firefox/`,
each of which is generated using the [Firefox `manifest.json` each of which is generated using the [Firefox `manifest.json`
template](templates/apps/firefox/templates/none-dark.manifest.json). template](templates/firefox/auto-manifest.json).
Static [light][4] and [dark][5] themes are additionally available (i.e., that Static [light][4] and [dark][5] themes are additionally available (i.e., that
don't change with system settings). don't change with system settings).
![Firefox theme previews](images/firefox/themes.png)
## CLI installation ## CLI installation
A brief theme generation guide was provided in the [Generation A brief theme generation guide was provided in the [Generation
section](#generation), making use of the `monobiome` CLI. This tool can be section](#generation), making use of the `monobiome` CLI. This tool can be
@@ -232,7 +225,7 @@ uv tool install monobiome
pipx install monobiome pipx install monobiome
``` ```
The `monobiome` has provides three subcommands: `monobiome` provides three subcommands:
- `monobiome palette`: generate palette files from raw parameterized curves - `monobiome palette`: generate palette files from raw parameterized curves
@@ -295,6 +288,14 @@ The `monobiome` has provides three subcommands:
output file to write filled template output file to write filled template
``` ```
## Config management
The `monobiome` CLI tool attempts to provide the minimal functionality needed
to produce customized themes for individual applications. If seeking a more
holistic, system-wide approach, you might consider using [`symconf`][3], a
general-purpose application config manager. `symconf` provides the templating
subsystem used for `monobiome` internals, and can be configured to apply live
theme updates to many apps with a single command line invocation.
[1]: https://github.com/isa/TextMate-Themes/blob/master/monoindustrial.tmTheme [1]: https://github.com/isa/TextMate-Themes/blob/master/monoindustrial.tmTheme
[2]: https://addons.mozilla.org/en-US/firefox/collections/18495484/monobiome/ [2]: https://addons.mozilla.org/en-US/firefox/collections/18495484/monobiome/

View File

@@ -17,7 +17,7 @@ def register_parser(subparsers: _SubparserType) -> None:
type=str, type=str,
default="hex", default="hex",
choices=["hex", "oklch"], choices=["hex", "oklch"],
help="Color notation to export (either hex or oklch)", help="color notation to export (either hex or oklch)",
) )
parser.add_argument( parser.add_argument(
"-f", "-f",
@@ -25,13 +25,13 @@ def register_parser(subparsers: _SubparserType) -> None:
type=str, type=str,
default="toml", default="toml",
choices=["json", "toml"], choices=["json", "toml"],
help="Format of palette file (either JSON or TOML)", help="format of palette file (either JSON or TOML)",
) )
parser.add_argument( parser.add_argument(
"-o", "-o",
"--output", "--output",
type=str, type=str,
help="Output file to write palette content", help="output file to write palette content",
) )
parser.set_defaults(func=handle_palette) parser.set_defaults(func=handle_palette)

View File

@@ -16,13 +16,13 @@ def register_parser(subparsers: _SubparserType) -> None:
"mode", "mode",
type=str, type=str,
choices=["dark", "light"], choices=["dark", "light"],
help="Scheme mode (light or dark)" help="scheme mode (light or dark)"
) )
parser.add_argument( parser.add_argument(
"biome", "biome",
type=str, type=str,
choices=list(monotone_h_map.keys()), choices=list(monotone_h_map.keys()),
help="Biome setting for scheme." help="biome setting for scheme"
) )
parser.add_argument( parser.add_argument(
"-m", "-m",
@@ -30,7 +30,7 @@ def register_parser(subparsers: _SubparserType) -> None:
type=str, type=str,
default="oklch", default="oklch",
choices=["wcag", "oklch", "lightness"], choices=["wcag", "oklch", "lightness"],
help="Metric to use for measuring swatch distances." help="metric to use for measuring swatch distances"
) )
# e.g., wcag=4.5; oklch=0.40; lightness=40 # e.g., wcag=4.5; oklch=0.40; lightness=40
@@ -39,13 +39,13 @@ def register_parser(subparsers: _SubparserType) -> None:
"--distance", "--distance",
type=float, type=float,
default=0.40, default=0.40,
help="Distance threshold for specified metric", help="distance threshold for specified metric",
) )
parser.add_argument( parser.add_argument(
"-o", "-o",
"--output", "--output",
type=str, type=str,
help="Output file to write scheme content", help="output file to write scheme content",
) )
# these params remain rooted in lightness; no need to accommodate metric # these params remain rooted in lightness; no need to accommodate metric
@@ -58,13 +58,13 @@ def register_parser(subparsers: _SubparserType) -> None:
"--l-base", "--l-base",
type=int, type=int,
default=20, default=20,
help="Minimum lightness level (default: 20)", help="minimum lightness level (default: 20)",
) )
parser.add_argument( parser.add_argument(
"--l-step", "--l-step",
type=int, type=int,
default=5, default=5,
help="Lightness step size (default: 5)", help="lightness step size (default: 5)",
) )
# gaps # gaps
@@ -72,19 +72,19 @@ def register_parser(subparsers: _SubparserType) -> None:
"--fg-gap", "--fg-gap",
type=int, type=int,
default=50, default=50,
help="Foreground lightness gap (default: 50)", help="foreground lightness gap (default: 50)",
) )
parser.add_argument( parser.add_argument(
"--grey-gap", "--grey-gap",
type=int, type=int,
default=30, default=30,
help="Grey lightness gap (default: 30)", help="grey lightness gap (default: 30)",
) )
parser.add_argument( parser.add_argument(
"--term-fg-gap", "--term-fg-gap",
type=int, type=int,
default=65, default=65,
help="Terminal foreground lightness gap (default: 60)", help="terminal foreground lightness gap (default: 60)",
) )
parser.set_defaults(func=handle_scheme) parser.set_defaults(func=handle_scheme)