export type Style = {
  alignContent?: string,
  alignItems?: string,
  alignSelf?: string,
  all?: string,
  animation?: string,
  animationDelay?: string,
  animationDirection?: string,
  animationDuration?: string,
  animationFillMode?: string,
  animationIterationCount?: string,
  animationName?: string,
  animationPlayState?: string,
  animationTimingFunction?: string,
  backfaceVisibility?: string,
  background?: string,
  backgroundAttachment?: string,
  backgroundBlendMode?: string,
  backgroundClip?: string,
  backgroundColor?: string,
  backgroundImage?: string,
  backgroundOrigin?: string,
  backgroundPosition?: string,
  backgroundRepeat?: string,
  backgroundSize?: string,
  blockSize?: string,
  border?: string,
  borderBlockEnd?: string,
  borderBlockEndColor?: string,
  borderBlockEndStyle?: string,
  borderBlockEndWidth?: string,
  borderBlockStart?: string,
  borderBlockStartColor?: string,
  borderBlockStartStyle?: string,
  borderBlockStartWidth?: string,
  borderBottom?: string,
  borderBottomColor?: string,
  borderBottomLeftRadius?: string,
  borderBottomRightRadius?: string,
  borderBottomStyle?: string,
  borderBottomWidth?: string,
  borderCollapse?: string,
  borderColor?: string,
  borderImage?: string,
  borderImageOutset?: string,
  borderImageRepeat?: string,
  borderImageSlice?: string,
  borderImageSource?: string,
  borderImageWidth?: string,
  borderInlineEnd?: string,
  borderInlineEndColor?: string,
  borderInlineEndStyle?: string,
  borderInlineEndWidth?: string,
  borderInlineStart?: string,
  borderInlineStartColor?: string,
  borderInlineStartStyle?: string,
  borderInlineStartWidth?: string,
  borderLeft?: string,
  borderLeftColor?: string,
  borderLeftStyle?: string,
  borderLeftWidth?: string,
  borderRadius?: string,
  borderRight?: string,
  borderRightColor?: string,
  borderRightStyle?: string,
  borderRightWidth?: string,
  borderSpacing?: string,
  borderStyle?: string,
  borderTop?: string,
  borderTopColor?: string,
  borderTopLeftRadius?: string,
  borderTopRightRadius?: string,
  borderTopStyle?: string,
  borderTopWidth?: string,
  borderWidth?: string,
  bottom?: string,
  boxDecorationBreak?: string,
  boxShadow?: string,
  boxSizing?: string,
  breakAfter?: string,
  breakBefore?: string,
  breakInside?: string,
  captionSide?: string,
  clear?: string,
  clip?: string,
  clipPath?: string,
  color?: string,
  columns?: string,
  columnCount?: string,
  columnFill?: string,
  columnGap?: string,
  columnRule?: string,
  columnRuleColor?: string,
  columnRuleStyle?: string,
  columnRuleWidth?: string,
  columnSpan?: string,
  columnWidth?: string,
  content?: string,
  counterIncrement?: string,
  counterReset?: string,
  cursor?: string,
  direction?: string,
  display?: string,
  emptyCells?: string,
  filter?: string,
  flex?: string,
  flexBasis?: string,
  flexDirection?: string,
  flexFlow?: string,
  flexGrow?: string,
  flexShrink?: string,
  flexWrap?: string,
  float?: string,
  font?: string,
  fontFamily?: string,
  fontFeatureSettings?: string,
  fontKerning?: string,
  fontLanguageOverride?: string,
  fontSize?: string,
  fontSizeAdjust?: string,
  fontStretch?: string,
  fontStyle?: string,
  fontSynthesis?: string,
  fontVariant?: string,
  fontVariantAlternates?: string,
  fontVariantCaps?: string,
  fontVariantEastAsian?: string,
  fontVariantLigatures?: string,
  fontVariantNumeric?: string,
  fontVariantPosition?: string,
  fontWeight?: string,
  grad?: string,
  grid?: string,
  gridArea?: string,
  gridAutoColumns?: string,
  gridAutoFlow?: string,
  gridAutoPosition?: string,
  gridAutoRows?: string,
  gridColumn?: string,
  gridColumnStart?: string,
  gridColumnEnd?: string,
  gridRow?: string,
  gridRowStart?: string,
  gridRowEnd?: string,
  gridTemplate?: string,
  gridTemplateAreas?: string,
  gridTemplateRows?: string,
  gridTemplateColumns?: string,
  height?: string,
  hyphens?: string,
  imageRendering?: string,
  imageResolution?: string,
  imageOrientation?: string,
  imeMode?: string,
  inherit?: string,
  initial?: string,
  inlineSize?: string,
  isolation?: string,
  justifyContent?: string,
  left?: string,
  letterSpacing?: string,
  lineBreak?: string,
  lineHeight?: string,
  listStyle?: string,
  listStyleImage?: string,
  listStylePosition?: string,
  listStyleType?: string,
  margin?: string,
  marginBlockEnd?: string,
  marginBlockStart?: string,
  marginBottom?: string,
  marginInlineEnd?: string,
  marginInlineStart?: string,
  marginLeft?: string,
  marginRight?: string,
  marginTop?: string,
  marks?: string,
  mask?: string,
  maskType?: string,
  maxBlockSize?: string,
  maxHeight?: string,
  maxInlineSize?: string,
  maxWidth?: string,
  minBlockSize?: string,
  minHeight?: string,
  minInlineSize?: string,
  minWidth?: string,
  mixBlendMode?: string,
  objectFit?: string,
  objectPosition?: string,
  offsetBlockEnd?: string,
  offsetBlockStart?: string,
  offsetInlineEnd?: string,
  offsetInlineStart?: string,
  opacity?: string,
  order?: string,
  orphans?: string,
  outline?: string,
  outlineColor?: string,
  outlineOffset?: string,
  outlineStyle?: string,
  outlineWidth?: string,
  overflow?: string,
  overflowWrap?: string,
  overflowX?: string,
  overflowY?: string,
  padding?: string,
  paddingBlockEnd?: string,
  paddingBlockStart?: string,
  paddingBottom?: string,
  paddingInlineEnd?: string,
  paddingInlineStart?: string,
  paddingLeft?: string,
  paddingRight?: string,
  paddingTop?: string,
  pageBreakAfter?: string,
  pageBreakBefore?: string,
  pageBreakInside?: string,
  perspective?: string,
  perspectiveOrigin?: string,
  pointerEvents?: string,
  position?: string,
  quotes?: string,
  rad?: string,
  resize?: string,
  right?: string,
  rubyAlign?: string,
  rubyMerge?: string,
  rubyPosition?: string,
  scrollBehavior?: string,
  scrollSnapCoordinate?: string,
  scrollSnapDestination?: string,
  scrollSnapPointsX?: string,
  scrollSnapPointsY?: string,
  scrollSnapType?: string,
  shapeImageThreshold?: string,
  shapeMargin?: string,
  shapeOutside?: string,
  tableLayout?: string,
  tabSize?: string,
  textAlign?: string,
  textAlignLast?: string,
  textCombineUpright?: string,
  textDecoration?: string,
  textDecorationColor?: string,
  textDecorationLine?: string,
  textDecorationStyle?: string,
  textIndent?: string,
  textOrientation?: string,
  textOverflow?: string,
  textRendering?: string,
  textShadow?: string,
  textTransform?: string,
  textUnderlinePosition?: string,
  top?: string,
  touchAction?: string,
  transform?: string,
  transformOrigin?: string,
  transformStyle?: string,
  transition?: string,
  transitionDelay?: string,
  transitionDuration?: string,
  transitionProperty?: string,
  transitionTimingFunction?: string,
  turn?: string,
  unicodeBidi?: string,
  unicodeRange?: string,
  verticalAlign?: string,
  visibility?: string,
  webkitTransform?: string,
  whiteSpace?: string,
  widows?: string,
  width?: string,
  willChange?: string,
  wordBreak?: string,
  wordSpacing?: string,
  wordWrap?: string,
  writingMode?: string,
  zIndex?: string
  };

export type Styling = {
  style?: Style,
  className?: string
};

export type Base16Theme = {
  scheme?: string,
  author?: string,
  base00: string,
  base01: string,
  base02: string,
  base03: string,
  base04: string,
  base05: string,
  base06: string,
  base07: string,
  base08: string,
  base09: string,
  base0A: string,
  base0B: string,
  base0C: string,
  base0D: string,
  base0E: string,
  base0F: string
};

export type StylingValue =
  string | Style | ((styling: Styling, ...rest: Array<any>) => Styling);

export type StylingConfig = {
  extend?: string | Base16Theme,
  [name: string]: StylingValue
};

export type Theme = string | Base16Theme | StylingConfig;

export type StylingFunction = (
  keys: string | Array<?string>, ...rest: Array<any>
) => Styling;

export type GetDefaultStyling = (base16Theme: Base16Theme) => StylingConfig;

export type PartialStylingFunction = (theme: Theme, invertTheme: boolean) => StylingFunction;

export type StylingOptions = {
  defaultBase16?: Theme,
  base16Themes: Theme[]
};
