import { GradientType } from "./Gradient";

/* @interface
export interface Colored {
  r: number;
  g: number;
  b: number;
  a?: number;

export type ColorConstructorArg = number | Color | Colored | undefined;

 * @class
   * @param r red 8bit number or numeric value of full color
   * @param g green 8bit number
   * @param b blue 8bit number

export class Color implements Colored {
  r: number = 0.0;
  g: number = 0.0;
  b: number = 0.0;

  constructor(r?: ColorConstructorArg, g?: number, b?: number) {
    if (arguments.length > 1 && typeof r === "number") {
      this.r = r || 0.0;
      this.g = g || 0.0;
      this.b = b || 0.0;

      return this;

    return this.set(r || 0.0);

  set<T extends Colored>(val: Color | number | T): Color {
    if (val instanceof Color) return val.clone();
    else if (typeof val === "number") this.setHex(val);
    else if (typeof val === "object") {
      this.r = val?.r || 0.0;
      this.g = val?.g || 0.0;
      this.b = val?.b || 0.0;
    return this;

  setHex(hex: number): Color {
    hex = Math.floor(hex);

    this.r = ((hex >> 16) & 255) / 255;
    this.g = ((hex >> 8) & 255) / 255;
    this.b = (hex & 255) / 255;

    return this;

  getHex(): number {
    var R = Math.round(this.r * 255);
    var G = Math.round(this.g * 255);
    var B = Math.round(this.b * 255);
    return (R << 16) | (G << 8) | B;

  clone(): Color {
    return new Color(this.r, this.g, this.b);

  copy(color: Color): Color {
    this.r = color.r;
    this.g = color.g;
    this.b = color.b;

    return this;

  //return object that represents color components from 0 to 255
  scaled<T extends Colored>(): Colored {
    var ret: Partial<T> = {};
    ret.r = Math.round(this.r * 255);
    ret.g = Math.round(this.g * 255);
    ret.b = Math.round(this.b * 255);
    ret.a = 1.0;
    return ret as T;

// in an attempt to reduce memory overhead, cache all $3Dmol.Colors
// this makes things a little faster
export class CC {
  static rgbRegEx =
    /rgb(a?)\(\s*([^ ,\)\t]+)\s*,\s*([^ ,\)\t]+)\s*,\s*([^ ,\)\t]+)/i;
  static cache: Record<number, Color> = { 0: new Color(0) };
  static color(hex: undefined): Color;
  static color(hex: number): Color;
  static color(hex: string): Color;
  static color(hex: number[]): Color[];
  static color(hex: Color): Color;
  static color(hex: ColorSpec): Color;
  static color(hex: ColorSpec[]): Color[];
  static color(hex: ColorSpec|ColorSpec[]): Color|Color[];
  static color(hex?: unknown): unknown {
    // Undefined values default to black
    if (!hex) return CC.cache[0];
    if ( hex instanceof Color ) {
      return hex;
    // cache hits
    if (typeof hex === "number" && typeof CC.cache[hex] !== "undefined")
      return CC.cache[hex];

    // arrays
    if (hex && Array.isArray(hex))
      // parse elements recursively
      return as (hex: number) => Color);

    // numbers and hex strings
    let hexval = CC.getHex(hex as (string | number));
    let c = new Color(hexval);
    CC.cache[hexval] = c;
    return c;

  static getHex(hex: Array<string | number>): number[];
  static getHex(hex: string | number): number;
  static getHex(hex: unknown): unknown {
    if (Array.isArray(hex)) return as number[];
    if (typeof hex === "string") {
      let hexs: string = hex as string;
      if (!isNaN(parseInt(hexs))) return parseInt(hexs);
      hexs = hexs.trim();

      if (hexs.length == 4 && hexs[0] == "#") {
        hexs = "#" + hexs[1] + hexs[1] + hexs[2] + hexs[2] + hexs[3] + hexs[3]; //expand to full hex number

      if (hexs.length == 7 && hexs[0] == "#") {
        return parseInt(hexs.substring(1), 16);

      let m = CC.rgbRegEx.exec(hexs);
      if (m) {
        if (m[1] != "") {
            "WARNING: Opacity value in rgba ignored.  Specify separately as opacity attribute."
        let ret = 0;
        for (let i = 2; i < 5; i++) {
          ret *= 256;
          let val = m[i].endsWith("%")
            ? (255 * parseFloat(m[i])) / 100
            : parseFloat(m[i]);
          ret += Math.round(val);
        return ret;
      return (window as any)?.$3Dmol?.htmlColors[hex.toLowerCase()] || 0x000000;
    return hex as number;

export const htmlColors: Record<string, ColorSpec> = {
  aliceblue: 0xf0f8ff,
  antiquewhite: 0xfaebd7,
  aqua: 0x00ffff,
  aquamarine: 0x7fffd4,
  azure: 0xf0ffff,
  beige: 0xf5f5dc,
  bisque: 0xffe4c4,
  black: 0x000000,
  blanchedalmond: 0xffebcd,
  blue: 0x0000ff,
  blueviolet: 0x8a2be2,
  brown: 0xa52a2a,
  burlywood: 0xdeb887,
  cadetblue: 0x5f9ea0,
  chartreuse: 0x7fff00,
  chocolate: 0xd2691e,
  coral: 0xff7f50,
  cornflowerblue: 0x6495ed,
  cornsilk: 0xfff8dc,
  crimson: 0xdc143c,
  cyan: 0x00ffff,
  darkblue: 0x00008b,
  darkcyan: 0x008b8b,
  darkgoldenrod: 0xb8860b,
  darkgray: 0xa9a9a9,
  darkgrey: 0xa9a9a9,
  darkgreen: 0x006400,
  darkkhaki: 0xbdb76b,
  darkmagenta: 0x8b008b,
  darkolivegreen: 0x556b2f,
  darkorange: 0xff8c00,
  darkorchid: 0x9932cc,
  darkred: 0x8b0000,
  darksalmon: 0xe9967a,
  darkseagreen: 0x8fbc8f,
  darkslateblue: 0x483d8b,
  darkslategray: 0x2f4f4f,
  darkslategrey: 0x2f4f4f,
  darkturquoise: 0x00ced1,
  darkviolet: 0x9400d3,
  deeppink: 0xff1493,
  deepskyblue: 0x00bfff,
  dimgray: 0x696969,
  dimgrey: 0x696969,
  dodgerblue: 0x1e90ff,
  firebrick: 0xb22222,
  floralwhite: 0xfffaf0,
  forestgreen: 0x228b22,
  fuchsia: 0xff00ff,
  gainsboro: 0xdcdcdc,
  ghostwhite: 0xf8f8ff,
  gold: 0xffd700,
  goldenrod: 0xdaa520,
  gray: 0x808080,
  grey: 0x808080,
  green: 0x008000,
  greenyellow: 0xadff2f,
  honeydew: 0xf0fff0,
  hotpink: 0xff69b4,
  indianred: 0xcd5c5c,
  indigo: 0x4b0082,
  ivory: 0xfffff0,
  khaki: 0xf0e68c,
  lavender: 0xe6e6fa,
  lavenderblush: 0xfff0f5,
  lawngreen: 0x7cfc00,
  lemonchiffon: 0xfffacd,
  lightblue: 0xadd8e6,
  lightcoral: 0xf08080,
  lightcyan: 0xe0ffff,
  lightgoldenrodyellow: 0xfafad2,
  lightgray: 0xd3d3d3,
  lightgrey: 0xd3d3d3,
  lightgreen: 0x90ee90,
  lightpink: 0xffb6c1,
  lightsalmon: 0xffa07a,
  lightseagreen: 0x20b2aa,
  lightskyblue: 0x87cefa,
  lightslategray: 0x778899,
  lightslategrey: 0x778899,
  lightsteelblue: 0xb0c4de,
  lightyellow: 0xffffe0,
  lime: 0x00ff00,
  limegreen: 0x32cd32,
  linen: 0xfaf0e6,
  magenta: 0xff00ff,
  maroon: 0x800000,
  mediumaquamarine: 0x66cdaa,
  mediumblue: 0x0000cd,
  mediumorchid: 0xba55d3,
  mediumpurple: 0x9370db,
  mediumseagreen: 0x3cb371,
  mediumslateblue: 0x7b68ee,
  mediumspringgreen: 0x00fa9a,
  mediumturquoise: 0x48d1cc,
  mediumvioletred: 0xc71585,
  midnightblue: 0x191970,
  mintcream: 0xf5fffa,
  mistyrose: 0xffe4e1,
  moccasin: 0xffe4b5,
  navajowhite: 0xffdead,
  navy: 0x000080,
  oldlace: 0xfdf5e6,
  olive: 0x808000,
  olivedrab: 0x6b8e23,
  orange: 0xffa500,
  orangered: 0xff4500,
  orchid: 0xda70d6,
  palegoldenrod: 0xeee8aa,
  palegreen: 0x98fb98,
  paleturquoise: 0xafeeee,
  palevioletred: 0xdb7093,
  papayawhip: 0xffefd5,
  peachpuff: 0xffdab9,
  peru: 0xcd853f,
  pink: 0xffc0cb,
  plum: 0xdda0dd,
  powderblue: 0xb0e0e6,
  purple: 0x800080,
  rebeccapurple: 0x663399,
  red: 0xff0000,
  rosybrown: 0xbc8f8f,
  royalblue: 0x4169e1,
  saddlebrown: 0x8b4513,
  salmon: 0xfa8072,
  sandybrown: 0xf4a460,
  seagreen: 0x2e8b57,
  seashell: 0xfff5ee,
  sienna: 0xa0522d,
  silver: 0xc0c0c0,
  skyblue: 0x87ceeb,
  slateblue: 0x6a5acd,
  slategray: 0x708090,
  slategrey: 0x708090,
  snow: 0xfffafa,
  springgreen: 0x00ff7f,
  steelblue: 0x4682b4,
  tan: 0xd2b48c,
  teal: 0x008080,
  thistle: 0xd8bfd8,
  tomato: 0xff6347,
  turquoise: 0x40e0d0,
  violet: 0xee82ee,
  wheat: 0xf5deb3,
  white: 0xffffff,
  whitesmoke: 0xf5f5f5,
  yellow: 0xffff00,
  yellowgreen: 0x9acd32,

 * Color representation. A hex number, html color name, or object with r/g/b properties
export type ColorSpec =  number | string | Colored;

*  Colorscheme specification.
*  @see builtinColorSchemes
export type ColorschemeSpec = string | {
  gradient?: GradientType|string;
  min?: number;
  max?: number;
  /**  {AtomSpec} property to use for gradient calculation.  E.g., 'b' for temperature factors of a PDB. */
  prop?: string;
  /** mid point value for gradient (for rwb) */
  mid?: number;
  /** Custom colors for gradient (for {@link CustomLinear}) */
  colors?: Array<ColorSpec>;
  /** map of a certain {@link AtomSpec} property to a color of the form `{'prop': 'elem', map:elementColors.greenCarbon}` Allows the user to provide a mapping of elements to colors to the colorscheme.  This can be done with any properties, and not just 'elem'.
  map?: Record<string, unknown>
  /**  Allows the user to provide a function for setting the colorschemes. */
  colorfunc?: Function;

/** Preset secondary structure color scheme
 * @struct
export const ssColors = {
  //names are in helix-sheet-coil order
  pyMol: { h: 0xff0000, s: 0xffff00, c: 0x00ff00 },
  Jmol: { h: 0xff0080, s: 0xffc800, c: 0xffffff },

const rasmol: Record<string, ColorSpec> = {
  H: 0xffffff,
  He: 0xffc0cb,
  HE: 0xffc0cb,
  Li: 0xb22222,
  LI: 0xb22222,
  B: 0x00ff00,
  C: 0xc8c8c8,
  N: 0x8f8fff,
  O: 0xf00000,
  F: 0xdaa520,
  Na: 0x0000ff,
  NA: 0x0000ff,
  Mg: 0x228b22,
  MG: 0x228b22,
  Al: 0x808090,
  AL: 0x808090,
  Si: 0xdaa520,
  SI: 0xdaa520,
  P: 0xffa500,
  S: 0xffc832,
  Cl: 0x00ff00,
  CL: 0x00ff00,
  Ca: 0x808090,
  CA: 0x808090,
  Ti: 0x808090,
  TI: 0x808090,
  Cr: 0x808090,
  CR: 0x808090,
  Mn: 0x808090,
  MN: 0x808090,
  Fe: 0xffa500,
  FE: 0xffa500,
  Ni: 0xa52a2a,
  NI: 0xa52a2a,
  Cu: 0xa52a2a,
  CU: 0xa52a2a,
  Zn: 0xa52a2a,
  ZN: 0xa52a2a,
  Br: 0xa52a2a,
  BR: 0xa52a2a,
  Ag: 0x808090,
  AG: 0x808090,
  I: 0xa020f0,
  Ba: 0xffa500,
  BA: 0xffa500,
  Au: 0xdaa520,
  AU: 0xdaa520,

/** Preset element coloring - from individual element colors to entire mappings (e.g. 'elementColors.Jmol' colors atoms with Jmol stylings)
 * @struct
export const elementColors = {
  defaultColor: 0xff1493,
  /** Jmol-like element colors*/
  Jmol: {
    H: 0xffffff,
    He: 0xd9ffff,
    HE: 0xd9ffff,
    Li: 0xcc80ff,
    LI: 0xcc80ff,
    Be: 0xc2ff00,
    BE: 0xc2ff00,
    B: 0xffb5b5,
    C: 0x909090,
    N: 0x3050f8,
    O: 0xff0d0d,
    F: 0x90e050,
    Ne: 0xb3e3f5,
    NE: 0xb3e3f5,
    Na: 0xab5cf2,
    NA: 0xab5cf2,
    Mg: 0x8aff00,
    MG: 0x8aff00,
    Al: 0xbfa6a6,
    AL: 0xbfa6a6,
    Si: 0xf0c8a0,
    SI: 0xf0c8a0,
    P: 0xff8000,
    S: 0xffff30,
    Cl: 0x1ff01f,
    CL: 0x1ff01f,
    Ar: 0x80d1e3,
    AR: 0x80d1e3,
    K: 0x8f40d4,
    Ca: 0x3dff00,
    CA: 0x3dff00,
    Sc: 0xe6e6e6,
    SC: 0xe6e6e6,
    Ti: 0xbfc2c7,
    TI: 0xbfc2c7,
    V: 0xa6a6ab,
    Cr: 0x8a99c7,
    CR: 0x8a99c7,
    Mn: 0x9c7ac7,
    MN: 0x9c7ac7,
    Fe: 0xe06633,
    FE: 0xe06633,
    Co: 0xf090a0,
    CO: 0xf090a0,
    Ni: 0x50d050,
    NI: 0x50d050,
    Cu: 0xc88033,
    CU: 0xc88033,
    Zn: 0x7d80b0,
    ZN: 0x7d80b0,
    Ga: 0xc28f8f,
    GA: 0xc28f8f,
    Ge: 0x668f8f,
    GE: 0x668f8f,
    As: 0xbd80e3,
    AS: 0xbd80e3,
    Se: 0xffa100,
    SE: 0xffa100,
    Br: 0xa62929,
    BR: 0xa62929,
    Kr: 0x5cb8d1,
    KR: 0x5cb8d1,
    Rb: 0x702eb0,
    RB: 0x702eb0,
    Sr: 0x00ff00,
    SR: 0x00ff00,
    Y: 0x94ffff,
    Zr: 0x94e0e0,
    ZR: 0x94e0e0,
    Nb: 0x73c2c9,
    NB: 0x73c2c9,
    Mo: 0x54b5b5,
    MO: 0x54b5b5,
    Tc: 0x3b9e9e,
    TC: 0x3b9e9e,
    Ru: 0x248f8f,
    RU: 0x248f8f,
    Rh: 0x0a7d8c,
    RH: 0x0a7d8c,
    Pd: 0x006985,
    PD: 0x006985,
    Ag: 0xc0c0c0,
    AG: 0xc0c0c0,
    Cd: 0xffd98f,
    CD: 0xffd98f,
    In: 0xa67573,
    IN: 0xa67573,
    Sn: 0x668080,
    SN: 0x668080,
    Sb: 0x9e63b5,
    SB: 0x9e63b5,
    Te: 0xd47a00,
    TE: 0xd47a00,
    I: 0x940094,
    Xe: 0x429eb0,
    XE: 0x429eb0,
    Cs: 0x57178f,
    CS: 0x57178f,
    Ba: 0x00c900,
    BA: 0x00c900,
    La: 0x70d4ff,
    LA: 0x70d4ff,
    Ce: 0xffffc7,
    CE: 0xffffc7,
    Pr: 0xd9ffc7,
    PR: 0xd9ffc7,
    Nd: 0xc7ffc7,
    ND: 0xc7ffc7,
    Pm: 0xa3ffc7,
    PM: 0xa3ffc7,
    Sm: 0x8fffc7,
    SM: 0x8fffc7,
    Eu: 0x61ffc7,
    EU: 0x61ffc7,
    Gd: 0x45ffc7,
    GD: 0x45ffc7,
    Tb: 0x30ffc7,
    TB: 0x30ffc7,
    Dy: 0x1fffc7,
    DY: 0x1fffc7,
    Ho: 0x00ff9c,
    HO: 0x00ff9c,
    Er: 0x00e675,
    ER: 0x00e675,
    Tm: 0x00d452,
    TM: 0x00d452,
    Yb: 0x00bf38,
    YB: 0x00bf38,
    Lu: 0x00ab24,
    LU: 0x00ab24,
    Hf: 0x4dc2ff,
    HF: 0x4dc2ff,
    Ta: 0x4da6ff,
    TA: 0x4da6ff,
    W: 0x2194d6,
    Re: 0x267dab,
    RE: 0x267dab,
    Os: 0x266696,
    OS: 0x266696,
    Ir: 0x175487,
    IR: 0x175487,
    Pt: 0xd0d0e0,
    PT: 0xd0d0e0,
    Au: 0xffd123,
    AU: 0xffd123,
    Hg: 0xb8b8d0,
    HG: 0xb8b8d0,
    Tl: 0xa6544d,
    TL: 0xa6544d,
    Pb: 0x575961,
    PB: 0x575961,
    Bi: 0x9e4fb5,
    BI: 0x9e4fb5,
    Po: 0xab5c00,
    PO: 0xab5c00,
    At: 0x754f45,
    AT: 0x754f45,
    Rn: 0x428296,
    RN: 0x428296,
    Fr: 0x420066,
    FR: 0x420066,
    Ra: 0x007d00,
    RA: 0x007d00,
    Ac: 0x70abfa,
    AC: 0x70abfa,
    Th: 0x00baff,
    TH: 0x00baff,
    Pa: 0x00a1ff,
    PA: 0x00a1ff,
    U: 0x008fff,
    Np: 0x0080ff,
    NP: 0x0080ff,
    Pu: 0x006bff,
    PU: 0x006bff,
    Am: 0x545cf2,
    AM: 0x545cf2,
    Cm: 0x785ce3,
    CM: 0x785ce3,
    Bk: 0x8a4fe3,
    BK: 0x8a4fe3,
    Cf: 0xa136d4,
    CF: 0xa136d4,
    Es: 0xb31fd4,
    ES: 0xb31fd4,
    Fm: 0xb31fba,
    FM: 0xb31fba,
    Md: 0xb30da6,
    MD: 0xb30da6,
    No: 0xbd0d87,
    NO: 0xbd0d87,
    Lr: 0xc70066,
    LR: 0xc70066,
    Rf: 0xcc0059,
    RF: 0xcc0059,
    Db: 0xd1004f,
    DB: 0xd1004f,
    Sg: 0xd90045,
    SG: 0xd90045,
    Bh: 0xe00038,
    BH: 0xe00038,
    Hs: 0xe6002e,
    HS: 0xe6002e,
    Mt: 0xeb0026,
    MT: 0xeb0026,
  } as Record<string, ColorSpec>,
  /** rasmol-like element colors */
  defaultColors: {
  } as Record<string, ColorSpec>,
  greenCarbon: {
    C: 0x00ff00,
  } as Record<string, ColorSpec>,
  cyanCarbon: {
    C: 0x00ffff,
  } as Record<string, ColorSpec>,
  magentaCarbon: {
    C: 0xff00ff,
  } as Record<string, ColorSpec>,
  yellowCarbon: {
    C: 0xffff00,
  } as Record<string, ColorSpec>,
  whiteCarbon: {
    C: 0xffffff,
  } as Record<string, ColorSpec>,
  orangeCarbon: {
    C: 0xffa500,
  } as Record<string, ColorSpec>,
  purpleCarbon: {
    C: 0x800080,
  } as Record<string, ColorSpec>,
  blueCarbon: {
    C: 0x0000ff,
  } as Record<string, ColorSpec>,

export const residues = {
  /** @property standard amino acid color scheme*/

  amino: {
    ALA: 0xc8c8c8,
    ARG: 0x145aff,
    ASN: 0x00dcdc,
    ASP: 0xe60a0a,
    CYS: 0xe6e600,
    GLN: 0x00dcdc,
    GLU: 0xe60a0a,
    GLY: 0xebebeb,
    HIS: 0x8282d2,
    ILE: 0x0f820f,
    LEU: 0x0f820f,
    LYS: 0x145aff,
    MET: 0xe6e600,
    PHE: 0x3232aa,
    PRO: 0xdc9682,
    SER: 0xfa9600,
    THR: 0xfa9600,
    TRP: 0xb45ab4,
    TYR: 0x3232aa,
    VAL: 0x0f820f,
    ASX: 0xff69b4,
    GLX: 0xff69b4,
  } as Record<string, ColorSpec>,

  /** @property shapely amino acid color scheme*/
  shapely: {
    ALA: 0x8cff8c,
    ARG: 0x00007c,
    ASN: 0xff7c70,
    ASP: 0xa00042,
    CYS: 0xffff70,
    GLN: 0xff4c4c,
    GLU: 0x660000,
    GLY: 0xffffff,
    HIS: 0x7070ff,
    ILE: 0x004c00,
    LEU: 0x455e45,
    LYS: 0x4747b8,
    MET: 0xb8a042,
    PHE: 0x534c52,
    PRO: 0x525252,
    SER: 0xff7042,
    THR: 0xb84c00,
    TRP: 0x4f4600,
    TYR: 0x8c704c,
    VAL: 0xff8cff,
    ASX: 0xff00ff,
    GLX: 0xff00ff,
  } as Record<string, ColorSpec>,

  /** @property nucleic acid color scheme*/
  nucleic: {
    A: 0xa0a0ff,
    G: 0xff7070,
    I: 0x80ffff,
    C: 0xff8c4b,
    T: 0xa0ffa0,
    U: 0xff8080,
  } as Record<string, ColorSpec>,

export const chains = {
  /** @property chain based standard color scheme */
  atom: {
    A: 0xc0d0ff,
    B: 0xb0ffb0,
    C: 0xffc0c8,
    D: 0xffff80,
    E: 0xffc0ff,
    F: 0xb0f0f0,
    G: 0xffd070,
    H: 0xf08080,
    I: 0xf5deb3,
    J: 0x00bfff,
    K: 0xcd5c5c,
    L: 0x66cdaa,
    M: 0x9acd32,
    N: 0xee82ee,
    O: 0x00ced1,
    P: 0x00ff7f,
    Q: 0x3cb371,
    R: 0x00008b,
    S: 0xbdb76b,
    T: 0x006400,
    U: 0x800000,
    V: 0x808000,
    W: 0x800080,
    X: 0x008080,
    Y: 0xb8860b,
    Z: 0xb22222,
  } as Record<string, ColorSpec>,

  /** @property hetatm color scheme */
  hetatm: {
    A: 0x90a0cf,
    B: 0x80cf98,
    C: 0xcf90b0,
    D: 0xcfcf70,
    E: 0xcf90cf,
    F: 0x80c0c0,
    G: 0xcfa060,
    H: 0xc05070,
    I: 0xc5ae83,
    J: 0x00a7cf,
    K: 0xb54c4c,
    L: 0x56b592,
    M: 0x8ab52a,
    N: 0xbe72be,
    O: 0x00b6a1,
    P: 0x00cf6f,
    Q: 0x349b61,
    R: 0x0000bb,
    S: 0xa59f5b,
    T: 0x009400,
    U: 0xb00000,
    V: 0xb0b000,
    W: 0xb000b0,
    X: 0x00b0b0,
    Y: 0xe8b613,
    Z: 0xc23232,
  } as Record<string, ColorSpec>,

 * built in color schemes
 * The user can pass these strings directly as the colorscheme
 * @prop ssPyMol - pymol secondary structure
 * @prop  ssJmol - jmol secondary structure
   @prop Jmol - jmol element defaults
   @prop amino - amino acid coloring
   @prop shapely - amino acid coloring
   @prop nucleic - nucleic acid coloring
   @prop chain - color by chain
   @prop rasmol - rasmol default element coloring
   @prop default - default element coloring
   @prop greenCarbon - default element coloring with green carbon
   @prop cyanCarbon - default element coloring with cyan carbon
   @prop magentaCarbon - default element coloring with magenta carbon
   @prop purpleCarbon - default element coloring with purple carbon
   @prop whiteCarbon - default element coloring with white carbon
   @prop orangeCarbon - default element coloring with orange carbon
   @prop yellowCarbon - default element coloring with yellow carbon
   @prop blueCarbon - default element coloring with blue carbon
   @prop chainHetatm - color chains
 * @example window.$"pdb:4UAA",viewer,{},function(){
 *    viewer.setBackgroundColor(0xffffffff);
 *    var colorAsSnake = function(atom) {
 *      return atom.resi % 2 ? 'white': 'green'
 *    };
 *    viewer.setStyle( {chain:'A'}, { cartoon: {colorfunc: colorAsSnake }});
 *    viewer.setStyle( {chain:'B'}, { stick: {colorscheme: 'yellowCarbon'}});
 *    viewer.render();
 *  });
export const builtinColorSchemes = {
  /** secondary structure pymol */
  ssPyMol: { prop: "ss", map: ssColors.pyMol },
  ssJmol: { prop: "ss", map: ssColors.Jmol },
  Jmol: { prop: "elem", map: elementColors.Jmol },
  amino: { prop: "resn", map: residues.amino },
  shapely: { prop: "resn", map: residues.shapely },
  nucleic: { prop: "resn", map: residues.nucleic },
  chain: { prop: "chain", map: chains.atom },
  rasmol: { prop: "elem", map: elementColors.rasmol },
  default: { prop: "elem", map: elementColors.defaultColors },
  greenCarbon: { prop: "elem", map: elementColors.greenCarbon },
  chainHetatm: { prop: "chain", map: chains.hetatm },
  cyanCarbon: { prop: "elem", map: elementColors.cyanCarbon },
  magentaCarbon: { prop: "elem", map: elementColors.magentaCarbon },
  purpleCarbon: { prop: "elem", map: elementColors.purpleCarbon },
  whiteCarbon: { prop: "elem", map: elementColors.whiteCarbon },
  orangeCarbon: { prop: "elem", map: elementColors.orangeCarbon },
  yellowCarbon: { prop: "elem", map: elementColors.yellowCarbon },
  blueCarbon: { prop: "elem", map: elementColors.blueCarbon },