UNPKG

@pandacss/studio

Version:

The automated token documentation for Panda CSS

182 lines (156 loc) • 5.78 kB
/* eslint-disable */ import type { RecipeRule } from './static-css'; import type { SystemStyleObject, DistributiveOmit, Pretty } from './system-types'; type StringToBoolean<T> = T extends 'true' | 'false' ? boolean : T export type RecipeVariantRecord = Record<any, Record<any, SystemStyleObject>> export type RecipeSelection<T extends RecipeVariantRecord> = keyof any extends keyof T ? {} : { [K in keyof T]?: StringToBoolean<keyof T[K]> | undefined } export type RecipeVariantFn<T extends RecipeVariantRecord> = (props?: RecipeSelection<T>) => string /** * Extract the variant as optional props from a `cva` function. * Intended to be used with a JSX component, prefer `RecipeVariant` for a more strict type. */ export type RecipeVariantProps< T extends RecipeVariantFn<RecipeVariantRecord> | SlotRecipeVariantFn<string, SlotRecipeVariantRecord<string>>, > = Pretty<Parameters<T>[0]> /** * Extract the variants from a `cva` function. */ export type RecipeVariant< T extends RecipeVariantFn<RecipeVariantRecord> | SlotRecipeVariantFn<string, SlotRecipeVariantRecord<string>>, > = Exclude<Pretty<Required<RecipeVariantProps<T>>>, undefined> type RecipeVariantMap<T extends RecipeVariantRecord> = { [K in keyof T]: Array<keyof T[K]> } /* ----------------------------------------------------------------------------- * Recipe / Standard * -----------------------------------------------------------------------------*/ export interface RecipeRuntimeFn<T extends RecipeVariantRecord> extends RecipeVariantFn<T> { __type: RecipeSelection<T> variantKeys: (keyof T)[] variantMap: RecipeVariantMap<T> raw: (props?: RecipeSelection<T>) => SystemStyleObject config: RecipeConfig<T> splitVariantProps<Props extends RecipeSelection<T>>( props: Props, ): [RecipeSelection<T>, Pretty<DistributiveOmit<Props, keyof T>>] getVariantProps: (props?: RecipeSelection<T>) => RecipeSelection<T> } type OneOrMore<T> = T | Array<T> export type RecipeCompoundSelection<T> = { [K in keyof T]?: OneOrMore<StringToBoolean<keyof T[K]>> | undefined } export type RecipeCompoundVariant<T> = T & { css: SystemStyleObject } export interface RecipeDefinition<T extends RecipeVariantRecord = RecipeVariantRecord> { /** * The base styles of the recipe. */ base?: SystemStyleObject /** * Whether the recipe is deprecated. */ deprecated?: boolean | string /** * The multi-variant styles of the recipe. */ variants?: T /** * The default variants of the recipe. */ defaultVariants?: RecipeSelection<T> /** * The styles to apply when a combination of variants is selected. */ compoundVariants?: Pretty<RecipeCompoundVariant<RecipeCompoundSelection<T>>>[] } export type RecipeCreatorFn = <T extends RecipeVariantRecord>(config: RecipeDefinition<T>) => RecipeRuntimeFn<T> interface RecipeConfigMeta { /** * The class name of the recipe. */ className: string /** * The description of the recipe. This will be used in the JSDoc comment. */ description?: string /** * The jsx elements to track for this recipe. Can be string or Regexp. * * @default capitalize(recipe.name) * @example ['Button', 'Link', /Button$/] */ jsx?: Array<string | RegExp> /** * Variants to pre-generate, will be include in the final `config.staticCss` */ staticCss?: RecipeRule[] } export interface RecipeConfig<T extends RecipeVariantRecord = RecipeVariantRecord> extends RecipeDefinition<T>, RecipeConfigMeta {} /* ----------------------------------------------------------------------------- * Recipe / Slot * -----------------------------------------------------------------------------*/ type SlotRecord<S extends string, T> = Partial<Record<S, T>> export type SlotRecipeVariantRecord<S extends string> = Record<any, Record<any, SlotRecord<S, SystemStyleObject>>> export type SlotRecipeVariantFn<S extends string, T extends RecipeVariantRecord> = ( props?: RecipeSelection<T>, ) => SlotRecord<S, string> export interface SlotRecipeRuntimeFn<S extends string, T extends SlotRecipeVariantRecord<S>> extends SlotRecipeVariantFn<S, T> { raw: (props?: RecipeSelection<T>) => Record<S, SystemStyleObject> variantKeys: (keyof T)[] variantMap: RecipeVariantMap<T> splitVariantProps<Props extends RecipeSelection<T>>( props: Props, ): [RecipeSelection<T>, Pretty<DistributiveOmit<Props, keyof T>>] getVariantProps: (props?: RecipeSelection<T>) => RecipeSelection<T> } export type SlotRecipeCompoundVariant<S extends string, T> = T & { css: SlotRecord<S, SystemStyleObject> } export interface SlotRecipeDefinition< S extends string = string, T extends SlotRecipeVariantRecord<S> = SlotRecipeVariantRecord<S>, > { /** * An optional class name that can be used to target slots in the DOM. */ className?: string /** * Whether the recipe is deprecated. */ deprecated?: boolean | string /** * The parts/slots of the recipe. */ slots: S[] | Readonly<S[]> /** * The base styles of the recipe. */ base?: SlotRecord<S, SystemStyleObject> /** * The multi-variant styles of the recipe. */ variants?: T /** * The default variants of the recipe. */ defaultVariants?: RecipeSelection<T> /** * The styles to apply when a combination of variants is selected. */ compoundVariants?: Pretty<SlotRecipeCompoundVariant<S, RecipeCompoundSelection<T>>>[] } export type SlotRecipeCreatorFn = <S extends string, T extends SlotRecipeVariantRecord<S>>( config: SlotRecipeDefinition<S, T>, ) => SlotRecipeRuntimeFn<S, T> export type SlotRecipeConfig< S extends string = string, T extends SlotRecipeVariantRecord<S> = SlotRecipeVariantRecord<S>, > = SlotRecipeDefinition<S, T> & RecipeConfigMeta