import type { BaseTheme, CSSProperties, MatchResult, Rule, RuleResolver, ThemeFunction, VariantResolver, } from './types' import { DEV } from 'distilt/env' import { fromMatch } from './rules' import { asArray } from './utils' export type AutocompleteItem = { prefix?: string suffix: string theme?: { section: string; key: string } modifiers?: AutocompleteModifier[] | false | null | undefined color?: string | false | null | undefined label?: string } export type AutocompleteModifier = { modifier: string theme?: { section: string; key: string } color?: string | false | null | undefined label?: string } export interface AutocompleteContext { /** Allows to resolve theme values. */ readonly theme: ThemeFunction readonly variants: Record } export type AutocompleteProvider = ( match: MatchResult, context: AutocompleteContext, ) => (string | AutocompleteItem)[] const kAutocomplete = /* #__PURE__ */ Symbol('@twind/autocomplete') /** * @experimental * @group Configuration * @param resolver * @param autocomplete */ export function withAutocomplete( resolver: RuleResolver, autocomplete: AutocompleteProvider | false | null | undefined, ): RuleResolver export function withAutocomplete( resolver: VariantResolver, autocomplete: AutocompleteProvider | false | null | undefined, ): VariantResolver export function withAutocomplete( rule: Rule, autocomplete: AutocompleteProvider | false | null | undefined, ): Rule export function withAutocomplete( rule: Rule | RuleResolver | VariantResolver, autocomplete: AutocompleteProvider | false | null | undefined, ): Rule | RuleResolver | VariantResolver { if (DEV && autocomplete) { if (typeof rule == 'function') { return Object.defineProperty(rule, kAutocomplete, { value: autocomplete, configurable: true, }) } const [pattern, resolve, convert] = asArray(rule) as Exclude, string | RegExp> // [ // patterns: MaybeArray, // resolve?: keyof CSSProperties | string | CSSObject | RuleResolver, // convert?: MatchConverter, // ] return [ pattern, Object.defineProperty(fromMatch(resolve as keyof CSSProperties, convert), kAutocomplete, { value: autocomplete, configurable: true, }), ] } return rule } /** * @internal * @param resolver * @returns */ export function getAutocompleteProvider( resolver: RuleResolver | VariantResolver, ): AutocompleteProvider | undefined { return (resolver as { [kAutocomplete]?: AutocompleteProvider })[kAutocomplete] }