import { DefaultTheme } from 'styled-components';
import { Color, FontSize, FontStack, FontWeight, IconSet, IconSize, LineHeight, Radius, Shadow, Size, Transition, Typography, Unit, UnitPx } from './constants';
import { Palette } from './palette';
export type ColorType = keyof typeof Color;
export type FontSizeType = keyof typeof FontSize;
export type FontStackType = keyof typeof FontStack;
export type FontWeightType = keyof typeof FontWeight;
export type IconSizeType = keyof typeof IconSize;
export type IconType = keyof typeof IconSet;
export type LineHeightType = keyof typeof LineHeight;
export type RadiusType = keyof typeof Radius;
export type ShadowType = keyof typeof Shadow;
export type SizeType = keyof typeof Size;
export type TransitionType = keyof typeof Transition;
export type TypographyType = keyof typeof Typography;
export type UnitPxType = keyof typeof UnitPx;
export type UnitType = keyof typeof Unit;
export type ThemeSet = {
    light: DefaultTheme;
    dark: DefaultTheme;
};
export type PaletteKeyType = keyof typeof Palette;
export type PaletteType = Record<keyof typeof Palette, string>;
export type ThemePaletteSet = {
    light: {
        palette: PaletteType;
    };
    dark: {
        palette: PaletteType;
    };
};
/**
 * # Utility Types
 * ========================================================
 */
/**
 * ## ValueOf Type
 *
 * Convenience for ensure value is in an Object, let built-in `keyof`
 * @example ValueOf<typeof someObject>
 * @link https://stackoverflow.com/questions/49285864/is-there-a-valueof-similar-to-keyof-in-typescript
 */
export type ValueOf<T> = T[keyof T];
/**
 * Join a string tuple to a string with a separator.
 * @example
 * const array = ['hello', 'world'] as const;
 * type MyArrayString = StringTupleJoin<typeof array, ', '>;
 * const str: MyArrayString = "hello, world";
 */
export type StringTupleJoin<T extends readonly string[], Separator extends string> = T extends readonly [string, ...infer Tail] ? Tail extends [string, ...string[]] ? `${T[0]}${Separator}${StringTupleJoin<Tail, Separator>}` : `${T[0]}` : never;
