config.d.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. import type { CorePluginList } from './generated/corePluginList'
  2. import type { DefaultColors } from './generated/colors'
  3. // Helpers
  4. type Expand<T> = T extends object
  5. ? T extends infer O
  6. ? { [K in keyof O]: Expand<O[K]> }
  7. : never
  8. : T
  9. type KeyValuePair<K extends keyof any = string, V = string> = Record<K, V>
  10. interface RecursiveKeyValuePair<K extends keyof any = string, V = string> {
  11. [key: string]: V | RecursiveKeyValuePair<K, V>
  12. }
  13. export type ResolvableTo<T> = T | ((utils: PluginUtils) => T)
  14. type CSSRuleObject = RecursiveKeyValuePair<string, null | string | string[]>
  15. interface PluginUtils {
  16. colors: DefaultColors
  17. theme(path: string, defaultValue?: unknown): any
  18. breakpoints<I = Record<string, unknown>, O = I>(arg: I): O
  19. rgb(arg: string): (arg: Partial<{ opacityVariable: string; opacityValue: number }>) => string
  20. hsl(arg: string): (arg: Partial<{ opacityVariable: string; opacityValue: number }>) => string
  21. }
  22. // Content related config
  23. type FilePath = string
  24. type RawFile = { raw: string; extension?: string }
  25. type ExtractorFn = (content: string) => string[]
  26. type TransformerFn = (content: string) => string
  27. type ContentConfig =
  28. | (FilePath | RawFile)[]
  29. | {
  30. files: (FilePath | RawFile)[]
  31. relative?: boolean
  32. extract?: ExtractorFn | { [extension: string]: ExtractorFn }
  33. transform?: TransformerFn | { [extension: string]: TransformerFn }
  34. }
  35. // Important related config
  36. type ImportantConfig = boolean | string
  37. // Prefix related config
  38. type PrefixConfig = string
  39. // Separator related config
  40. type SeparatorConfig = string
  41. // Safelist related config
  42. type SafelistConfig = string | { pattern: RegExp; variants?: string[] }
  43. // Blocklist related config
  44. type BlocklistConfig = string
  45. // Presets related config
  46. type PresetsConfig = Partial<Config>
  47. // Future related config
  48. type FutureConfigValues =
  49. | 'hoverOnlyWhenSupported'
  50. | 'respectDefaultRingColorOpacity'
  51. | 'disableColorOpacityUtilitiesByDefault'
  52. | 'relativeContentPathsByDefault'
  53. | 'logicalSiblingUtilities'
  54. type FutureConfig = Expand<'all' | Partial<Record<FutureConfigValues, boolean>>> | []
  55. // Experimental related config
  56. type ExperimentalConfigValues = 'optimizeUniversalDefaults' | 'oxideParser'
  57. type ExperimentalConfig = Expand<'all' | Partial<Record<ExperimentalConfigValues, boolean>>> | []
  58. // DarkMode related config
  59. type DarkModeConfig =
  60. // Use the `media` query strategy.
  61. | 'media'
  62. // Use the `class` strategy, which requires a `.dark` class on the `html`.
  63. | 'class'
  64. // Use the `class` strategy with a custom class instead of `.dark`.
  65. | ['class', string]
  66. type Screen = { raw: string } | { min: string } | { max: string } | { min: string; max: string }
  67. type ScreensConfig = string[] | KeyValuePair<string, string | Screen | Screen[]>
  68. // Theme related config
  69. export interface ThemeConfig {
  70. // Responsiveness
  71. screens: ResolvableTo<ScreensConfig>
  72. supports: ResolvableTo<Record<string, string>>
  73. data: ResolvableTo<Record<string, string>>
  74. // Reusable base configs
  75. colors: ResolvableTo<RecursiveKeyValuePair>
  76. spacing: ResolvableTo<KeyValuePair>
  77. // Components
  78. container: ResolvableTo<
  79. Partial<{
  80. screens: ScreensConfig
  81. center: boolean
  82. padding: string | Record<string, string>
  83. }>
  84. >
  85. // Utilities
  86. inset: ThemeConfig['spacing']
  87. zIndex: ResolvableTo<KeyValuePair>
  88. order: ResolvableTo<KeyValuePair>
  89. gridColumn: ResolvableTo<KeyValuePair>
  90. gridColumnStart: ResolvableTo<KeyValuePair>
  91. gridColumnEnd: ResolvableTo<KeyValuePair>
  92. gridRow: ResolvableTo<KeyValuePair>
  93. gridRowStart: ResolvableTo<KeyValuePair>
  94. gridRowEnd: ResolvableTo<KeyValuePair>
  95. margin: ThemeConfig['spacing']
  96. aspectRatio: ResolvableTo<KeyValuePair>
  97. height: ThemeConfig['spacing']
  98. maxHeight: ThemeConfig['spacing']
  99. minHeight: ResolvableTo<KeyValuePair>
  100. width: ThemeConfig['spacing']
  101. maxWidth: ResolvableTo<KeyValuePair>
  102. minWidth: ResolvableTo<KeyValuePair>
  103. flex: ResolvableTo<KeyValuePair>
  104. flexShrink: ResolvableTo<KeyValuePair>
  105. flexGrow: ResolvableTo<KeyValuePair>
  106. flexBasis: ThemeConfig['spacing']
  107. borderSpacing: ThemeConfig['spacing']
  108. transformOrigin: ResolvableTo<KeyValuePair>
  109. translate: ThemeConfig['spacing']
  110. rotate: ResolvableTo<KeyValuePair>
  111. skew: ResolvableTo<KeyValuePair>
  112. scale: ResolvableTo<KeyValuePair>
  113. animation: ResolvableTo<KeyValuePair>
  114. keyframes: ResolvableTo<KeyValuePair<string, KeyValuePair<string, KeyValuePair>>>
  115. cursor: ResolvableTo<KeyValuePair>
  116. scrollMargin: ThemeConfig['spacing']
  117. scrollPadding: ThemeConfig['spacing']
  118. listStyleType: ResolvableTo<KeyValuePair>
  119. columns: ResolvableTo<KeyValuePair>
  120. gridAutoColumns: ResolvableTo<KeyValuePair>
  121. gridAutoRows: ResolvableTo<KeyValuePair>
  122. gridTemplateColumns: ResolvableTo<KeyValuePair>
  123. gridTemplateRows: ResolvableTo<KeyValuePair>
  124. gap: ThemeConfig['spacing']
  125. space: ThemeConfig['spacing']
  126. divideWidth: ThemeConfig['borderWidth']
  127. divideColor: ThemeConfig['borderColor']
  128. divideOpacity: ThemeConfig['borderOpacity']
  129. borderRadius: ResolvableTo<KeyValuePair>
  130. borderWidth: ResolvableTo<KeyValuePair>
  131. borderColor: ThemeConfig['colors']
  132. borderOpacity: ThemeConfig['opacity']
  133. backgroundColor: ThemeConfig['colors']
  134. backgroundOpacity: ThemeConfig['opacity']
  135. backgroundImage: ResolvableTo<KeyValuePair>
  136. gradientColorStops: ThemeConfig['colors']
  137. backgroundSize: ResolvableTo<KeyValuePair>
  138. backgroundPosition: ResolvableTo<KeyValuePair>
  139. fill: ThemeConfig['colors']
  140. stroke: ThemeConfig['colors']
  141. strokeWidth: ResolvableTo<KeyValuePair>
  142. objectPosition: ResolvableTo<KeyValuePair>
  143. padding: ThemeConfig['spacing']
  144. textIndent: ThemeConfig['spacing']
  145. fontFamily: ResolvableTo<
  146. KeyValuePair<
  147. string,
  148. | string
  149. | string[]
  150. | [
  151. fontFamily: string | string[],
  152. configuration: Partial<{
  153. fontFeatureSettings: string
  154. fontVariationSettings: string
  155. }>
  156. ]
  157. >
  158. >
  159. fontSize: ResolvableTo<
  160. KeyValuePair<
  161. string,
  162. | string
  163. | [fontSize: string, lineHeight: string]
  164. | [
  165. fontSize: string,
  166. configuration: Partial<{
  167. lineHeight: string
  168. letterSpacing: string
  169. fontWeight: string | number
  170. }>
  171. ]
  172. >
  173. >
  174. fontWeight: ResolvableTo<KeyValuePair>
  175. lineHeight: ResolvableTo<KeyValuePair>
  176. letterSpacing: ResolvableTo<KeyValuePair>
  177. textColor: ThemeConfig['colors']
  178. textOpacity: ThemeConfig['opacity']
  179. textDecorationColor: ThemeConfig['colors']
  180. textDecorationThickness: ResolvableTo<KeyValuePair>
  181. textUnderlineOffset: ResolvableTo<KeyValuePair>
  182. placeholderColor: ThemeConfig['colors']
  183. placeholderOpacity: ThemeConfig['opacity']
  184. caretColor: ThemeConfig['colors']
  185. accentColor: ThemeConfig['colors']
  186. opacity: ResolvableTo<KeyValuePair>
  187. boxShadow: ResolvableTo<KeyValuePair>
  188. boxShadowColor: ThemeConfig['colors']
  189. outlineWidth: ResolvableTo<KeyValuePair>
  190. outlineOffset: ResolvableTo<KeyValuePair>
  191. outlineColor: ThemeConfig['colors']
  192. ringWidth: ResolvableTo<KeyValuePair>
  193. ringColor: ThemeConfig['colors']
  194. ringOpacity: ThemeConfig['opacity']
  195. ringOffsetWidth: ResolvableTo<KeyValuePair>
  196. ringOffsetColor: ThemeConfig['colors']
  197. blur: ResolvableTo<KeyValuePair>
  198. brightness: ResolvableTo<KeyValuePair>
  199. contrast: ResolvableTo<KeyValuePair>
  200. dropShadow: ResolvableTo<KeyValuePair<string, string | string[]>>
  201. grayscale: ResolvableTo<KeyValuePair>
  202. hueRotate: ResolvableTo<KeyValuePair>
  203. invert: ResolvableTo<KeyValuePair>
  204. saturate: ResolvableTo<KeyValuePair>
  205. sepia: ResolvableTo<KeyValuePair>
  206. backdropBlur: ThemeConfig['blur']
  207. backdropBrightness: ThemeConfig['brightness']
  208. backdropContrast: ThemeConfig['contrast']
  209. backdropGrayscale: ThemeConfig['grayscale']
  210. backdropHueRotate: ThemeConfig['hueRotate']
  211. backdropInvert: ThemeConfig['invert']
  212. backdropOpacity: ThemeConfig['opacity']
  213. backdropSaturate: ThemeConfig['saturate']
  214. backdropSepia: ThemeConfig['sepia']
  215. transitionProperty: ResolvableTo<KeyValuePair>
  216. transitionTimingFunction: ResolvableTo<KeyValuePair>
  217. transitionDelay: ResolvableTo<KeyValuePair>
  218. transitionDuration: ResolvableTo<KeyValuePair>
  219. willChange: ResolvableTo<KeyValuePair>
  220. content: ResolvableTo<KeyValuePair>
  221. }
  222. interface CustomThemeConfig extends ThemeConfig {
  223. [key: string]: any
  224. }
  225. // Core plugins related config
  226. type CorePluginsConfig = CorePluginList[] | Expand<Partial<Record<CorePluginList, boolean>>>
  227. // Plugins related config
  228. type ValueType =
  229. | 'any'
  230. | 'color'
  231. | 'url'
  232. | 'image'
  233. | 'length'
  234. | 'percentage'
  235. | 'position'
  236. | 'lookup'
  237. | 'generic-name'
  238. | 'family-name'
  239. | 'number'
  240. | 'line-width'
  241. | 'absolute-size'
  242. | 'relative-size'
  243. | 'shadow'
  244. export interface PluginAPI {
  245. // for registering new static utility styles
  246. addUtilities(
  247. utilities: CSSRuleObject | CSSRuleObject[],
  248. options?: Partial<{
  249. respectPrefix: boolean
  250. respectImportant: boolean
  251. }>
  252. ): void
  253. // for registering new dynamic utility styles
  254. matchUtilities<T = string, U = string>(
  255. utilities: KeyValuePair<
  256. string,
  257. (value: T | string, extra: { modifier: U | string | null }) => CSSRuleObject | null
  258. >,
  259. options?: Partial<{
  260. respectPrefix: boolean
  261. respectImportant: boolean
  262. type: ValueType | ValueType[]
  263. values: KeyValuePair<string, T>
  264. modifiers: 'any' | KeyValuePair<string, U>
  265. supportsNegativeValues: boolean
  266. }>
  267. ): void
  268. // for registering new static component styles
  269. addComponents(
  270. components: CSSRuleObject | CSSRuleObject[],
  271. options?: Partial<{
  272. respectPrefix: boolean
  273. respectImportant: boolean
  274. }>
  275. ): void
  276. // for registering new dynamic component styles
  277. matchComponents<T = string, U = string>(
  278. components: KeyValuePair<
  279. string,
  280. (value: T | string, extra: { modifier: U | string | null }) => CSSRuleObject | null
  281. >,
  282. options?: Partial<{
  283. respectPrefix: boolean
  284. respectImportant: boolean
  285. type: ValueType | ValueType[]
  286. values: KeyValuePair<string, T>
  287. modifiers: 'any' | KeyValuePair<string, U>
  288. supportsNegativeValues: boolean
  289. }>
  290. ): void
  291. // for registering new base styles
  292. addBase(base: CSSRuleObject | CSSRuleObject[]): void
  293. // for registering custom variants
  294. addVariant(name: string, definition: string | string[] | (() => string) | (() => string)[]): void
  295. matchVariant<T = string>(
  296. name: string,
  297. cb: (value: T | string, extra: { modifier: string | null }) => string | string[],
  298. options?: {
  299. values?: KeyValuePair<string, T>
  300. sort?(
  301. a: { value: T | string; modifier: string | null },
  302. b: { value: T | string; modifier: string | null }
  303. ): number
  304. }
  305. ): void
  306. // for looking up values in the user’s theme configuration
  307. theme: <TDefaultValue = Config['theme']>(
  308. path?: string,
  309. defaultValue?: TDefaultValue
  310. ) => TDefaultValue
  311. // for looking up values in the user’s Tailwind configuration
  312. config: <TDefaultValue = Config>(path?: string, defaultValue?: TDefaultValue) => TDefaultValue
  313. // for checking if a core plugin is enabled
  314. corePlugins(path: string): boolean
  315. // for manually escaping strings meant to be used in class names
  316. e: (className: string) => string
  317. }
  318. export type PluginCreator = (api: PluginAPI) => void
  319. export type PluginsConfig = (
  320. | PluginCreator
  321. | { handler: PluginCreator; config?: Partial<Config> }
  322. | {
  323. (options: any): { handler: PluginCreator; config?: Partial<Config> }
  324. __isOptionsFunction: true
  325. }
  326. | string
  327. | [string, Record<string, any>]
  328. )[]
  329. // Top level config related
  330. interface RequiredConfig {
  331. content: ContentConfig
  332. }
  333. interface OptionalConfig {
  334. important: Partial<ImportantConfig>
  335. prefix: Partial<PrefixConfig>
  336. separator: Partial<SeparatorConfig>
  337. safelist: Array<SafelistConfig>
  338. blocklist: Array<BlocklistConfig>
  339. presets: Array<PresetsConfig>
  340. future: Partial<FutureConfig>
  341. experimental: Partial<ExperimentalConfig>
  342. darkMode: Partial<DarkModeConfig>
  343. theme: Partial<CustomThemeConfig & { extend: Partial<CustomThemeConfig> }>
  344. corePlugins: Partial<CorePluginsConfig>
  345. plugins: Partial<PluginsConfig>
  346. // Custom
  347. [key: string]: any
  348. }
  349. export type Config = RequiredConfig & Partial<OptionalConfig>