import { fontFamilies, fontSizes, FontWeight } from "../common"; import { Layer, Styles, StyleSets, Style } from "../themes/common/colorScheme"; function isStyleSet(key: any): key is StyleSets { return [ "base", "variant", "on", "accent", "positive", "warning", "negative", ].includes(key); } function isStyle(key: any): key is Styles { return ["default", "active", "disabled", "hovered", "pressed", "inverted"].includes(key); } function getStyle( layer: Layer, possibleStyleSetOrStyle?: any, possibleStyle?: any ): Style { let styleSet: StyleSets = "base"; let style: Styles = "default"; if (isStyleSet(possibleStyleSetOrStyle)) { styleSet = possibleStyleSetOrStyle; } else if (isStyle(possibleStyleSetOrStyle)) { style = possibleStyleSetOrStyle; } if (isStyle(possibleStyle)) { style = possibleStyle; } return layer[styleSet][style]; } export function background(layer: Layer, style?: Styles): string; export function background( layer: Layer, styleSet?: StyleSets, style?: Styles ): string; export function background( layer: Layer, styleSetOrStyles?: StyleSets | Styles, style?: Styles ): string { return getStyle(layer, styleSetOrStyles, style).background; } export function borderColor(layer: Layer, style?: Styles): string; export function borderColor( layer: Layer, styleSet?: StyleSets, style?: Styles ): string; export function borderColor( layer: Layer, styleSetOrStyles?: StyleSets | Styles, style?: Styles ): string { return getStyle(layer, styleSetOrStyles, style).border; } export function foreground(layer: Layer, style?: Styles): string; export function foreground( layer: Layer, styleSet?: StyleSets, style?: Styles ): string; export function foreground( layer: Layer, styleSetOrStyles?: StyleSets | Styles, style?: Styles ): string { return getStyle(layer, styleSetOrStyles, style).foreground; } interface Text { family: keyof typeof fontFamilies; color: string; size: number; weight?: FontWeight; underline?: boolean; } interface TextProperties { size?: keyof typeof fontSizes; weight?: FontWeight; underline?: boolean; } export function text( layer: Layer, fontFamily: keyof typeof fontFamilies, styleSet: StyleSets, style: Styles, properties?: TextProperties ): Text; export function text( layer: Layer, fontFamily: keyof typeof fontFamilies, styleSet: StyleSets, properties?: TextProperties ): Text; export function text( layer: Layer, fontFamily: keyof typeof fontFamilies, style: Styles, properties?: TextProperties ): Text; export function text( layer: Layer, fontFamily: keyof typeof fontFamilies, properties?: TextProperties ): Text; export function text( layer: Layer, fontFamily: keyof typeof fontFamilies, styleSetStyleOrProperties?: StyleSets | Styles | TextProperties, styleOrProperties?: Styles | TextProperties, properties?: TextProperties ) { let style = getStyle(layer, styleSetStyleOrProperties, styleOrProperties); if (typeof styleSetStyleOrProperties === "object") { properties = styleSetStyleOrProperties; } if (typeof styleOrProperties === "object") { properties = styleOrProperties; } let size = fontSizes[properties?.size || "sm"]; return { family: fontFamilies[fontFamily], color: style.foreground, ...properties, size, }; } export interface Border { color: string; width: number; top?: boolean; bottom?: boolean; left?: boolean; right?: boolean; overlay?: boolean; } export interface BorderProperties { width?: number; top?: boolean; bottom?: boolean; left?: boolean; right?: boolean; overlay?: boolean; } export function border( layer: Layer, styleSet: StyleSets, style: Styles, properties?: BorderProperties ): Border; export function border( layer: Layer, styleSet: StyleSets, properties?: BorderProperties ): Border; export function border( layer: Layer, style: Styles, properties?: BorderProperties ): Border; export function border(layer: Layer, properties?: BorderProperties): Border; export function border( layer: Layer, styleSetStyleOrProperties?: StyleSets | Styles | BorderProperties, styleOrProperties?: Styles | BorderProperties, properties?: BorderProperties ): Border { let style = getStyle(layer, styleSetStyleOrProperties, styleOrProperties); if (typeof styleSetStyleOrProperties === "object") { properties = styleSetStyleOrProperties; } if (typeof styleOrProperties === "object") { properties = styleOrProperties; } return { color: style.border, width: 1, ...properties, }; }