:root {

    /* Hues */
    --main-hue: 128;
    --comp-offset: 30;
    --secondary-hue: calc(var(--main-hue) - var(--comp-offset));
    --tertiary-hue: calc(var(--main-hue) + var(--comp-offset));
    --base-chroma: 0.11;
    --contrast: 0.5;
    --red-hue: 28;
    --green-hue: 128;
    --blue-hue: 248;

    /* Editor */
    --editor-bg: oklch(calc(0.5 - var(--contrast) / 2) 0.010 var(--main-hue));
    --caret-row: oklch(from var(--editor-bg) calc(l + 0.02) c h);
    --selection-bg: oklch(from var(--search-result-bg) l calc(c + 0.01) h);
    --search-result-bg: oklch(from var(--editor-bg) calc(l + 0.1) c h);
    --search-result-stripe: oklch(from var(--search-result-bg) l calc(c + 0.1) h);
    --injected-lang-bg: oklch(from var(--editor-bg) calc(l + 0.01) c h);
    --line-number: oklch(from var(--editor-bg) calc(l + 0.2) c h);
    --fg: oklch(from var(--editor-bg) calc(l + var(--contrast)) c h);
    --folded-text-bg: var(--search-result-bg);
    --tearline: var(--search-result-bg);
    --template-lang: var(--search-result-bg);

    /* Site backgrounds */
    --page-bg: oklch(from var(--editor-bg) calc(l - 0.05) c h);
    --tab-bar-bg: oklch(from var(--page-bg) calc(l + 0.01) c h);
    --gutter-bg: oklch(from var(--editor-bg) calc(l + 0.05) c h);
    --fg-muted: var(--named-arg);

    /* Syntax */
    --keyword: oklch(calc(0.5 + var(--contrast) / 10) var(--base-chroma) var(--main-hue));
    --function-decl: oklch(from var(--keyword) calc(l + 0.15) c h);
    --constant-field: oklch(from var(--keyword) calc(l + 0.1) calc(c + 0.04) h);
    --implicit-param: oklch(from var(--function-decl) l calc(c + 0.04) h);
    --number: oklch(from var(--keyword) l c calc(h + var(--comp-offset)));
    --string: oklch(from var(--keyword) l calc(c - 0.03) calc(h - var(--comp-offset)));
    --string-escape: oklch(from var(--string) l c calc(h + var(--comp-offset)));
    --string-escape-bad: oklch(from var(--string) calc(l - 0.15) c h);
    --static-function: oklch(from var(--keyword) calc(l - 0.05) calc(c - 0.02) h);
    --named-arg: oklch(from var(--keyword) calc(l + 0.1) calc(c - 0.05) h);

    --class: var(--fg);
    --parameter: var(--fg);
    --function-call: var(--fg);
    --local-var: var(--fg);
    --operator: var(--fg);
    --parens: var(--fg); /* brackets also */
    --punctuation: var(--keyword); /* comma, semicolon */
    --generic-type-param: var(--number);
    --annotation: var(--string);
    --annotation-named-att: var(--named-arg);

    /* Effects */
    --error: oklch(from var(--keyword) l calc(c + 0.05) var(--red-hue));
    --warning-bg: oklch(from var(--editor-bg) calc(l + 0.2) calc(c + 0.025) var(--secondary-hue));
    --warning-stripe: oklch(from var(--warning-bg) l calc(c + 0.1) h);
    --mutable-underline: oklch(from var(--keyword) calc(l - 0.15) c h);
    --typo-underline: oklch(from var(--mutable-underline) l c var(--secondary-hue));
    --deprecated-strikethrough: var(--fg);

    /* Comments */
    --comment: oklch(from var(--keyword) calc(l + 0.05) 0.000 h);
    --javadoc: oklch(from var(--keyword) calc(l + 0.05) c h);
    --javadoc-markup: var(--function-decl);
    --javadoc-tag: var(--javadoc);
    --javadoc-tag-val: var(--string);
    --todo: oklch(from var(--string) calc(l + 0.2) calc(c + 0.09) h);
    --todo-stripe: oklch(from var(--todo) l calc(c + 0.1) h);

    /* Diff */
    --diff-delete: oklch(from var(--search-result-bg) l c h);
    --diff-change: oklch(from var(--diff-delete) l max(var(--base-chroma) * 4 / 11, 0.02) var(--blue-hue));
    --diff-add: oklch(from var(--diff-delete) l max(var(--base-chroma) * 4 / 11, 0.02) var(--green-hue));
    --diff-conflict: oklch(from var(--diff-delete) l max(var(--base-chroma) * 4 / 11, 0.02) var(--red-hue));
    --diff-delete-stripe: oklch(from var(--diff-delete) calc(l + 0.3) c h);
    --diff-change-stripe: oklch(from var(--diff-change) calc(l + 0.3) calc(c + 0.1) h);
    --diff-add-stripe: oklch(from var(--diff-add) calc(l + 0.3) calc(c + 0.1) h);
    --diff-conflict-stripe: oklch(from var(--diff-conflict) calc(l + 0.3) calc(c + 0.1) h);

    /* Terminal */
    --term-black: var(--editor-bg);
    --term-red: var(--string);
    --term-green: var(--string-escape);
    --term-yellow: oklch(from var(--term-red) l calc(c - 0.03) h);
    --term-blue: var(--keyword);
    --term-magenta: var(--function-decl);
    --term-cyan: var(--constant-field);
    --term-white: var(--fg);

    --term-bright-black: var(--selection-bg);
    --term-bright-red: var(--term-red);
    --term-bright-green: var(--term-green);
    --term-bright-yellow: var(--term-yellow);
    --term-bright-blue: var(--term-blue);
    --term-bright-magenta: var(--term-magenta);
    --term-bright-cyan: var(--term-cyan);
    --term-bright-white: oklch(from var(--fg) l calc(c + 0.05) h);
}
