import * as css from 'csstype' // @ts-ignore export type Style = css.StandardProperties<string | number | (() => string | number)> & { [key: string]: Style | string | number } export type Styles<Name extends string = string> = Record<Name, Style | string> export type Classes<Name extends string | number | symbol = string> = Record<Name, string> export type Keyframes<Name extends string = string> = Record<Name, string> export interface CreateGenerateIdOptions { minify?: boolean } export type CreateGenerateId = (options?: CreateGenerateIdOptions) => GenerateId export type GenerateId = (rule: Rule, sheet?: StyleSheet<string>) => string export type JssValue = | string | number | Array<string | number | Array<string | number> | '!important'> | null | false export type InsertionPoint = string | HTMLElement export interface UpdateOptions { process?: boolean force?: boolean } export interface ToCssOptions { indent?: number allowEmpty?: boolean } interface RuleListOptions { classes: Classes generateClassName: GenerateId Renderer: Renderer jss: Jss sheet: StyleSheet parent: ContainerRule | StyleSheet } declare class RuleList { constructor(options: RuleListOptions) add(name: string, decl: Style, options?: RuleOptions): Rule get(name: string): Rule remove(rule: Rule): void indexOf(rule: Rule): number process(): void register(rule: Rule, className?: string): void unregister(rule: Rule): void update(name: string, data: {}): void update(data: {}): void toString(options?: ToCssOptions): string } interface RuleOptions { selector?: string sheet?: StyleSheet index?: number parent?: ContainerRule | StyleSheet classes: Classes jss: Jss generateId: GenerateId Renderer: Renderer } interface BaseRule { type: string key: string isProcessed: boolean // eslint-disable-next-line no-use-before-define options: RuleOptions toString(options?: ToCssOptions): string } interface ContainerRule extends BaseRule { rules: RuleList } export interface Plugin { onCreateRule?(name: string, decl: Style, options: RuleOptions): Rule onProcessRule?(rule: Rule, sheet?: StyleSheet): void onProcessStyle?(style: Style, rule: Rule, sheet?: StyleSheet): Style onProcessSheet?(sheet?: StyleSheet): void onChangeValue?(value: string, prop: string, rule: Rule): string | null | false onUpdate?(data: object, rule: Rule, sheet?: StyleSheet): void } export type Rule = BaseRule | ContainerRule export interface Renderer { setProperty(cssRule: HTMLElement | CSSStyleRule, prop: string, value: JssValue): boolean getPropertyValue(cssRule: HTMLElement | CSSStyleRule, prop: string): string removeProperty(cssRule: HTMLElement | CSSStyleRule, prop: string): void setSelector(cssRule: CSSStyleRule, selectorText: string): boolean attach(): void detach(): void deploy(sheet: StyleSheet): void insertRule(rule: Rule): false | CSSRule deleteRule(cssRule: CSSRule): boolean replaceRule(cssRule: CSSRule, rule: Rule): false | CSSRule indexOf(cssRule: CSSRule): number getRules(): CSSRuleList | void } interface RuleFactoryOptions { selector?: string classes?: object sheet?: StyleSheet index?: number jss?: Jss generateId?: GenerateId Renderer?: Renderer } export interface StyleSheetFactoryOptions { media?: string meta?: string index?: number link?: boolean element?: HTMLStyleElement generateId?: GenerateId classNamePrefix?: string } interface StyleSheetOptions extends StyleSheetFactoryOptions { index: number generateId: GenerateId Renderer: Renderer insertionPoint?: InsertionPoint jss: Jss } declare class SheetsRegistry { readonly index: number add(sheet: StyleSheet<any>): void reset(): void remove(sheet: StyleSheet<any>): void toString(options?: ToCssOptions): string } declare class SheetsManager { readonly size: number get(key: object): StyleSheet | null add(key: object, sheet: StyleSheet): void manage(key: object): StyleSheet | null unmanage(key: object): void } export interface StyleSheet<RuleName extends string = string> { // Gives auto-completion on the rules declared in `createStyleSheet` without // causing errors for rules added dynamically after creation. classes: Classes<RuleName> keyframes: Keyframes<string> options: StyleSheetOptions linked: boolean attached: boolean /** * Attach renderable to the render tree. */ attach(): this /** * Remove renderable from render tree. */ detach(): this deploy(): this /** * Add a rule to the current stylesheet. * Will insert a rule also after the stylesheet has been rendered first time. */ addRule(style: Style, options?: Partial<RuleOptions>): Rule addRule(name: RuleName, style: Style, options?: Partial<RuleOptions>): Rule insertRule(rule: Rule): void /** * Create and add rules. * Will render also after Style Sheet was rendered the first time. */ addRules(styles: Partial<Styles<RuleName>>, options?: Partial<RuleOptions>): Rule[] /** * Get a rule by name. */ getRule(name: RuleName): Rule /** * Delete a rule by name. * Returns `true`: if rule has been deleted from the DOM. */ deleteRule(name: RuleName): boolean /** * Get index of a rule. */ indexOf(rule: Rule): number /** * Update the function values with a new data. */ update(name: string, data: object, options?: UpdateOptions): this update(data: object, options?: UpdateOptions): this /** * Convert rules to a CSS string. */ toString(options?: ToCssOptions): string } export interface JssOptions { createGenerateId: CreateGenerateId plugins: ReadonlyArray<Plugin> Renderer?: {new (): Renderer} | null insertionPoint: InsertionPoint } export interface Jss { createStyleSheet<Name extends string>( styles: Partial<Styles<Name>>, options?: StyleSheetFactoryOptions ): StyleSheet<Name> removeStyleSheet(sheet: StyleSheet): this setup(options?: Partial<JssOptions>): this use(...plugins: Plugin[]): this createRule(style: Style, options?: RuleFactoryOptions): Rule createRule<Name extends string>(name: Name, style: Style, options?: RuleFactoryOptions): Rule } /** * Creates a new instance of JSS. */ declare const sheets: SheetsRegistry export {sheets, SheetsManager, SheetsRegistry, RuleList} export function create(options?: Partial<JssOptions>): Jss export const createGenerateId: CreateGenerateId export function createRule(name: string, decl: Style, options: RuleOptions): Rule export function toCssValue(value: JssValue, ignoreImportant: boolean): string export function getDynamicStyles(styles: Styles): Styles | null declare const jss: Jss /** * A global JSS instance. */ export default jss