type Num = number

type Pct = `${number}%`

type Alpha =
  Num |
  Pct

type HEX = `#${string}`

type RGB =
  LegacyRGB |
  ModernRGB

type RGBA =
  LegacyRGBA |
  ModernRGBA

type LegacyRGB =
  `rgb(${Num}, ${Num}, ${Num})` |
  `rgb(${Num}, ${Num}, ${Num}, ${Alpha})` |
  `rgb(${Pct}, ${Pct}, ${Pct})` |
  `rgb(${Pct}, ${Pct}, ${Pct}, ${Alpha})`

type ModernRGB =
  `rgb(${Num | Pct} ${Num | Pct} ${Num | Pct})` |
  `rgb(${Num | Pct} ${Num | Pct} ${Num | Pct} / ${Alpha})`

type LegacyRGBA =
  `rgba(${Num}, ${Num}, ${Num})` |
  `rgba(${Num}, ${Num}, ${Num}, ${Alpha})` |
  `rgba(${Pct}, ${Pct}, ${Pct})` |
  `rgba(${Pct}, ${Pct}, ${Pct}, ${Alpha})`

type ModernRGBA =
  `rgba(${Num | Pct} ${Num | Pct} ${Num | Pct})` |
  `rgba(${Num | Pct} ${Num | Pct} ${Num | Pct} / ${Alpha})`

interface RGBObject {
  r: Num
  g: Num
  b: Num
  a?: Num
}

interface Safolor {
  (color: HEX): HEX
  (color: RGB | RGBA): HEX
  hex: {
    (color: HEX): HEX
    (color: RGB | RGBA): HEX
  }
  rgb: {
    (color: HEX): RGB
    (color: RGB | RGBA): RGB
  }
  rgbObj: {
    (color: HEX): RGBObject
    (color: RGB | RGBA): RGBObject
  }
}

declare const safolor: Safolor;

export { safolor };
