import type { StrictCSSProperties, CSSPseudoElements, CSSPseudos, AllCSSPseudoClasses } from '../types'; /** * This is the shape of the generic object that `createStrictAPI()` takes. * It's deliberately a subset of `AllowedStyles` and does not take at rules * and pseudo elements. */ export type CompiledSchemaShape = StrictCSSProperties & { [Q in AllCSSPseudoClasses]?: StrictCSSProperties; }; export type PseudosDeclarations = { [Q in CSSPseudos]?: StrictCSSProperties; }; export type MediaQueries = { [Q in `@media ${TMediaQuery}`]?: StrictCSSProperties & PseudosDeclarations; }; export type AllowedStyles = StrictCSSProperties & PseudosDeclarations & MediaQueries; export type ApplySchemaValue = TKey extends keyof TSchema ? TPseudoKey extends keyof TSchema ? TKey extends keyof TSchema[TPseudoKey] ? TSchema[TPseudoKey][TKey] : TSchema[TKey] : TSchema[TKey] : StrictCSSProperties[TKey]; /** * Recursively maps over object properties to resolve them to either a {@link TSchema} * value if present, else fallback to its value from {@link StrictCSSProperties}. If * the property isn't a known property its value will be resolved to `never`. */ export type ApplySchema = { [TKey in keyof TObject]?: TKey extends keyof StrictCSSProperties ? ApplySchemaValue : TKey extends AllCSSPseudoClasses ? ApplySchema : TKey extends `@${string}` | CSSPseudoElements ? ApplySchema : never; }; export type ApplySchemaMap = { [P in keyof TStylesMap]: ApplySchema; };