Skip to content
LiG.

LiG.

Less is Great.

Syntax

Less.

mono

Ordinary identifiers, text and comments

struct

Parameter bindings, modules, tags and modifiers

ref

Type references, constants, values and escapes

action

Functions, constructors, calls, async and exceptions

theme.ts

Hover to inspect · click to pin · ← → ↑ ↓ to move · Esc to clear

import type { TokenBundle, LigVariant } from './core'

// Load one theme; every port shares the same tokens.
export async function loadTheme(
  variant: LigVariant,
  retries = 3,
): Promise<Record<string, string>> {
  for (let attempt = 0; attempt < retries; attempt++) {
    try {
      const response = await fetch('/tokens.json')
      if (!response.ok)
        throw new Error('Theme unavailable')

      const bundle: TokenBundle = await response.json()
      if (bundle.schemaVersion !== 2)
        throw new Error('Unsupported schema')

      return bundle.variants[variant].tokens
    } catch (error) {
      if (attempt === retries - 1)
        throw error
      await new Promise(resolve =>
        setTimeout(resolve, 250 * 2 ** attempt),
      )
    }
  }
  throw new Error('No attempts remaining\n')
}
export_theme.py

Hover to inspect · click to pin · ← → ↑ ↓ to move · Esc to clear

import json
from pathlib import Path

# Export resolved colors without duplicating the palette.
def export_theme(
    source: Path,
    destination: Path,
    variant: str = "dark",
) -> int:
    """Write a stable, alphabetically sorted color table."""
    bundle = json.loads(source.read_text(encoding="utf-8"))
    if bundle["schemaVersion"] != 2:
        raise ValueError("Unsupported token schema")

    tokens = bundle["variants"][variant]["tokens"]
    lines = [f"# LiG {variant} · {bundle['version']}"]
    for name, color in sorted(tokens.items()):
        if not color.startswith("#") or len(color) != 7:
            raise ValueError(f"Invalid color: {name}")
        lines.append(f"{name} = {color}")

    destination.parent.mkdir(parents=True, exist_ok=True)
    destination.write_text("\n".join(lines) + "\n", encoding="utf-8")
    return len(tokens)
terminalColor data ↗

lig check --colors

Normal
blackblack
redred
greengreen
yellowyellow
blueblue
magentamagenta
cyancyan
whitewhite
Bright
bright blackbright black
bright redbright red
bright greenbright green
bright yellowbright yellow
bright bluebright blue
bright magentabright magenta
bright cyanbright cyan
bright whitebright white

Source

Copy as
soft_500L 58%
H 90°0°C 00.100.20red: L 0.740, C 0.130, H 22°redorange: L 0.740, C 0.130, H 60°orangeyellow: L 0.790, C 0.180, H 95°yellowgreen: L 0.740, C 0.120, H 148°greencyan: L 0.740, C 0.120, H 194°cyanazure: L 0.740, C 0.120, H 234°azureblue: L 0.740, C 0.120, H 275°bluemagenta: L 0.740, C 0.140, H 325°magentaL00.51red: L 0.740redorange: L 0.740orangeyellow: L 0.790yellowgreen: L 0.740greencyan: L 0.740cyanazure: L 0.740azureblue: L 0.740bluemagenta: L 0.740magenta
red L 0.740 · C 0.130 · H 22.0°

Ports

Downloads & ports

lig.nvim for Neovim

init.lua
{
  "0froq/lig.nvim",
  lazy = false,
  priority = 1000,
  opts = { style = "dark" },
  config = function(_, opts)
    require("lig").setup(opts)
    vim.cmd.colorscheme("lig")
  end,
}

LiG Theme for Code

Marketplace ↗Download VSIX ↗

LiG for Zed

Installation notes ↗

Lightweight ports

Installation notes ↗

Ghostty

iTerm2

Windows Terminal

fzf

Zellij

tmux

Starship

bat

eza

Manifest · SHA-256

Set up with an agent