theme.ts

  1import { ColorToken, FontWeightToken, NumberToken } from "../tokens";
  2import { withOpacity } from "../utils/color";
  3
  4export interface SyntaxHighlightStyle {
  5  color: ColorToken;
  6  weight: FontWeightToken;
  7}
  8
  9export interface Player {
 10  baseColor: ColorToken;
 11  cursorColor: ColorToken;
 12  selectionColor: ColorToken;
 13  borderColor: ColorToken;
 14}
 15export function buildPlayer(
 16  color: ColorToken,
 17  cursorOpacity?: number,
 18  selectionOpacity?: number,
 19  borderOpacity?: number
 20) {
 21  return {
 22    baseColor: color,
 23    cursorColor: withOpacity(color, cursorOpacity || 1.0),
 24    selectionColor: withOpacity(color, selectionOpacity || 0.24),
 25    borderColor: withOpacity(color, borderOpacity || 0.8),
 26  }
 27}
 28
 29export interface BackgroundColorSet {
 30  base: ColorToken;
 31  hovered: ColorToken;
 32  active: ColorToken;
 33  focused: ColorToken;
 34}
 35
 36export interface Syntax {
 37  primary: SyntaxHighlightStyle;
 38  comment: SyntaxHighlightStyle;
 39  punctuation: SyntaxHighlightStyle;
 40  constant: SyntaxHighlightStyle;
 41  keyword: SyntaxHighlightStyle;
 42  function: SyntaxHighlightStyle;
 43  type: SyntaxHighlightStyle;
 44  variant: SyntaxHighlightStyle;
 45  property: SyntaxHighlightStyle;
 46  enum: SyntaxHighlightStyle;
 47  operator: SyntaxHighlightStyle;
 48  string: SyntaxHighlightStyle;
 49  number: SyntaxHighlightStyle;
 50  boolean: SyntaxHighlightStyle;
 51  predictive: SyntaxHighlightStyle;
 52  // TODO: Either move the following or rename
 53  title: SyntaxHighlightStyle;
 54  emphasis: SyntaxHighlightStyle;
 55  emphasisStrong: SyntaxHighlightStyle;
 56  linkUrl: SyntaxHighlightStyle;
 57  linkText: SyntaxHighlightStyle;
 58};
 59
 60export default interface Theme {
 61  name: string;
 62  backgroundColor: {
 63    100: BackgroundColorSet;
 64    300: BackgroundColorSet;
 65    500: BackgroundColorSet;
 66    ok: BackgroundColorSet;
 67    error: BackgroundColorSet;
 68    warning: BackgroundColorSet;
 69    info: BackgroundColorSet;
 70  };
 71  borderColor: {
 72    primary: ColorToken;
 73    secondary: ColorToken;
 74    muted: ColorToken;
 75    focused: ColorToken;
 76    active: ColorToken;
 77    ok: ColorToken;
 78    error: ColorToken;
 79    warning: ColorToken;
 80    info: ColorToken;
 81  };
 82  textColor: {
 83    primary: ColorToken;
 84    secondary: ColorToken;
 85    muted: ColorToken;
 86    placeholder: ColorToken;
 87    active: ColorToken;
 88    feature: ColorToken;
 89    ok: ColorToken;
 90    error: ColorToken;
 91    warning: ColorToken;
 92    info: ColorToken;
 93  };
 94  iconColor: {
 95    primary: ColorToken;
 96    secondary: ColorToken;
 97    muted: ColorToken;
 98    placeholder: ColorToken;
 99    active: ColorToken;
100    feature: ColorToken;
101    ok: ColorToken;
102    error: ColorToken;
103    warning: ColorToken;
104    info: ColorToken;
105  };
106  editor: {
107    background: ColorToken;
108    indent_guide: ColorToken;
109    indent_guide_active: ColorToken;
110    line: {
111      active: ColorToken;
112      highlighted: ColorToken;
113      inserted: ColorToken;
114      deleted: ColorToken;
115      modified: ColorToken;
116    };
117    highlight: {
118      selection: ColorToken;
119      occurrence: ColorToken;
120      activeOccurrence: ColorToken;
121      matchingBracket: ColorToken;
122      match: ColorToken;
123      activeMatch: ColorToken;
124      related: ColorToken;
125    };
126    gutter: {
127      primary: ColorToken;
128      active: ColorToken;
129    };
130  };
131
132  syntax: Syntax,
133
134  player: {
135    1: Player;
136    2: Player;
137    3: Player;
138    4: Player;
139    5: Player;
140    6: Player;
141    7: Player;
142    8: Player;
143  };
144  shadowAlpha: NumberToken;
145}