tailwindcss 3.1.3 → 3.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ export function union(types) {
2
+ return [...new Set(types)].join(' | ')
3
+ }
4
+
5
+ export function unionValues(values) {
6
+ return union(values.map(forValue))
7
+ }
8
+
9
+ export function forKeys(value) {
10
+ return union(Object.keys(value).map((key) => `'${key}'`))
11
+ }
12
+
13
+ export function forValue(value) {
14
+ if (Array.isArray(value)) {
15
+ return `(${unionValues(value)})[]`
16
+ }
17
+
18
+ if (typeof value === 'object') {
19
+ return `Record<${forKeys(value)}, ${unionValues(Object.values(value))}>`
20
+ }
21
+
22
+ if (typeof value === 'string') {
23
+ return `string`
24
+ }
25
+
26
+ return `any`
27
+ }
@@ -1613,7 +1613,7 @@ export let corePlugins = {
1613
1613
  {
1614
1614
  text: (value) => {
1615
1615
  let [fontSize, options] = Array.isArray(value) ? value : [value]
1616
- let { lineHeight, letterSpacing } = isPlainObject(options)
1616
+ let { lineHeight, letterSpacing, fontWeight } = isPlainObject(options)
1617
1617
  ? options
1618
1618
  : { lineHeight: options }
1619
1619
 
@@ -1621,6 +1621,7 @@ export let corePlugins = {
1621
1621
  'font-size': fontSize,
1622
1622
  ...(lineHeight === undefined ? {} : { 'line-height': lineHeight }),
1623
1623
  ...(letterSpacing === undefined ? {} : { 'letter-spacing': letterSpacing }),
1624
+ ...(fontWeight === undefined ? {} : { 'font-weight': fontWeight }),
1624
1625
  }
1625
1626
  },
1626
1627
  },
@@ -1,4 +1,4 @@
1
- import { flagEnabled } from '../featureFlags.js'
1
+ import { flagEnabled } from '../featureFlags'
2
2
  import * as regex from './regex'
3
3
 
4
4
  export function defaultExtractor(context) {
@@ -22,6 +22,10 @@ export function defaultExtractor(context) {
22
22
  function* buildRegExps(context) {
23
23
  let separator = context.tailwindConfig.separator
24
24
  let variantGroupingEnabled = flagEnabled(context.tailwindConfig, 'variantGrouping')
25
+ let prefix =
26
+ context.tailwindConfig.prefix !== ''
27
+ ? regex.optional(regex.pattern([/-?/, regex.escape(context.tailwindConfig.prefix)]))
28
+ : ''
25
29
 
26
30
  let utility = regex.any([
27
31
  // Arbitrary properties
@@ -64,31 +68,43 @@ function* buildRegExps(context) {
64
68
  ]),
65
69
  ])
66
70
 
67
- yield regex.pattern([
68
- // Variants
69
- '((?=((',
70
- regex.any(
71
- [
72
- regex.pattern([/([^\s"'`\[\\]+-)?\[[^\s"'`]+\]/, separator]),
73
- regex.pattern([/[^\s"'`\[\\]+/, separator]),
74
- ],
75
- true
76
- ),
77
- ')+))\\2)?',
78
-
79
- // Important (optional)
80
- /!?/,
81
-
82
- variantGroupingEnabled
83
- ? regex.any([
84
- // Or any of those things but grouped separated by commas
85
- regex.pattern([/\(/, utility, regex.zeroOrMore([/,/, utility]), /\)/]),
86
-
87
- // Arbitrary properties, constrained utilities, arbitrary values, etc…
88
- utility,
89
- ])
90
- : utility,
91
- ])
71
+ let variantPatterns = [
72
+ // Without quotes
73
+ regex.any([
74
+ regex.pattern([/([^\s"'`\[\\]+-)?\[[^\s"'`]+\]/, separator]),
75
+ regex.pattern([/[^\s"'`\[\\]+/, separator]),
76
+ ]),
77
+
78
+ // With quotes allowed
79
+ regex.any([
80
+ regex.pattern([/([^\s"'`\[\\]+-)?\[[^\s`]+\]/, separator]),
81
+ regex.pattern([/[^\s`\[\\]+/, separator]),
82
+ ]),
83
+ ]
84
+
85
+ for (const variantPattern of variantPatterns) {
86
+ yield regex.pattern([
87
+ // Variants
88
+ '((?=((',
89
+ variantPattern,
90
+ ')+))\\2)?',
91
+
92
+ // Important (optional)
93
+ /!?/,
94
+
95
+ prefix,
96
+
97
+ variantGroupingEnabled
98
+ ? regex.any([
99
+ // Or any of those things but grouped separated by commas
100
+ regex.pattern([/\(/, utility, regex.zeroOrMore([/,/, utility]), /\)/]),
101
+
102
+ // Arbitrary properties, constrained utilities, arbitrary values, etc…
103
+ utility,
104
+ ])
105
+ : utility,
106
+ ])
107
+ }
92
108
 
93
109
  // 5. Inner matches
94
110
  yield /[^<>"'`\s.(){}[\]#=%$]*[^<>"'`\s.(){}[\]#=%:$]/g
@@ -157,35 +157,67 @@ let nodeTypePropertyMap = {
157
157
  decl: 'value',
158
158
  }
159
159
 
160
- export default function ({ tailwindConfig: config }) {
161
- let functions = {
162
- theme: (node, path, ...defaultValue) => {
163
- // Strip quotes from beginning and end of string
164
- // This allows the alpha value to be present inside of quotes
165
- path = path.replace(/^['"]+|['"]+$/g, '')
160
+ /**
161
+ * @param {string} path
162
+ * @returns {Iterable<[path: string, alpha: string|undefined]>}
163
+ */
164
+ function* toPaths(path) {
165
+ // Strip quotes from beginning and end of string
166
+ // This allows the alpha value to be present inside of quotes
167
+ path = path.replace(/^['"]+|['"]+$/g, '')
166
168
 
167
- let matches = path.match(/^([^\s]+)(?![^\[]*\])(?:\s*\/\s*([^\/\s]+))$/)
168
- let alpha = undefined
169
+ let matches = path.match(/^([^\s]+)(?![^\[]*\])(?:\s*\/\s*([^\/\s]+))$/)
170
+ let alpha = undefined
169
171
 
170
- if (matches) {
171
- path = matches[1]
172
- alpha = matches[2]
173
- }
172
+ yield [path, undefined]
173
+
174
+ if (matches) {
175
+ path = matches[1]
176
+ alpha = matches[2]
177
+
178
+ yield [path, alpha]
179
+ }
180
+ }
181
+
182
+ /**
183
+ *
184
+ * @param {any} config
185
+ * @param {string} path
186
+ * @param {any} defaultValue
187
+ */
188
+ function resolvePath(config, path, defaultValue) {
189
+ const results = Array.from(toPaths(path)).map(([path, alpha]) => {
190
+ return Object.assign(validatePath(config, path, defaultValue, { opacityValue: alpha }), {
191
+ resolvedPath: path,
192
+ alpha,
193
+ })
194
+ })
195
+
196
+ return results.find((result) => result.isValid) ?? results[0]
197
+ }
174
198
 
175
- let { isValid, value, error } = validatePath(
199
+ export default function ({ tailwindConfig: config }) {
200
+ let functions = {
201
+ theme: (node, path, ...defaultValue) => {
202
+ let { isValid, value, error, alpha } = resolvePath(
176
203
  config,
177
204
  path,
178
- defaultValue.length ? defaultValue : undefined,
179
- { opacityValue: alpha }
205
+ defaultValue.length ? defaultValue : undefined
180
206
  )
181
207
 
182
208
  if (!isValid) {
183
209
  throw node.error(error)
184
210
  }
185
211
 
186
- if (alpha !== undefined) {
187
- value = parseColorFormat(value)
188
- value = withAlphaValue(value, alpha, value)
212
+ let maybeColor = parseColorFormat(value)
213
+ let isColorFunction = maybeColor !== undefined && typeof maybeColor === 'function'
214
+
215
+ if (alpha !== undefined || isColorFunction) {
216
+ if (alpha === undefined) {
217
+ alpha = 1.0
218
+ }
219
+
220
+ value = withAlphaValue(maybeColor, alpha, maybeColor)
189
221
  }
190
222
 
191
223
  return value
@@ -129,6 +129,7 @@ function applyVariant(variant, matches, context) {
129
129
  }
130
130
 
131
131
  let args
132
+ let isArbitraryVariant = false
132
133
 
133
134
  // Find partial arbitrary variants
134
135
  if (variant.endsWith(']') && !variant.startsWith('[')) {
@@ -144,6 +145,8 @@ function applyVariant(variant, matches, context) {
144
145
  return []
145
146
  }
146
147
 
148
+ isArbitraryVariant = true
149
+
147
150
  let fn = parseVariant(selector)
148
151
 
149
152
  let sort = Array.from(context.variantOrder.values()).pop() << 1n
@@ -300,6 +303,7 @@ function applyVariant(variant, matches, context) {
300
303
  ...meta,
301
304
  sort: variantSort | meta.sort,
302
305
  collectedFormats: (meta.collectedFormats ?? []).concat(collectedFormats),
306
+ isArbitraryVariant,
303
307
  },
304
308
  clone.nodes[0],
305
309
  ]
@@ -627,6 +631,7 @@ function* resolveMatches(candidate, context, original = candidate) {
627
631
  base: candidate
628
632
  .split(new RegExp(`\\${context?.tailwindConfig?.separator ?? ':'}(?![^[]*\\])`))
629
633
  .pop(),
634
+ isArbitraryVariant: match[0].isArbitraryVariant,
630
635
 
631
636
  context,
632
637
  })
@@ -762,6 +762,17 @@ function registerPlugins(plugins, context) {
762
762
  ]
763
763
  }
764
764
 
765
+ if ([].concat(options?.type).includes('color')) {
766
+ classes = [
767
+ ...classes,
768
+ ...classes.flatMap((cls) =>
769
+ Object.keys(context.tailwindConfig.theme.opacity).map(
770
+ (opacity) => `${cls}/${opacity}`
771
+ )
772
+ ),
773
+ ]
774
+ }
775
+
765
776
  return classes
766
777
  })()
767
778
  : [util]
@@ -49,9 +49,7 @@ export function normalize(value, isRoot = true) {
49
49
  )
50
50
  })
51
51
 
52
- // Add spaces around some operators not inside calc() that do not follow an operator
53
- // or '('.
54
- return value.replace(/(-?\d*\.?\d(?!\b-.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([\/])/g, '$1 $2 ')
52
+ return value
55
53
  }
56
54
 
57
55
  export function url(value) {
@@ -35,6 +35,7 @@ export function finalizeSelector(
35
35
  selector,
36
36
  candidate,
37
37
  context,
38
+ isArbitraryVariant,
38
39
 
39
40
  // Split by the separator, but ignore the separator inside square brackets:
40
41
  //
@@ -50,7 +51,8 @@ export function finalizeSelector(
50
51
  ) {
51
52
  let ast = selectorParser().astSync(selector)
52
53
 
53
- if (context?.tailwindConfig?.prefix) {
54
+ // We explicitly DO NOT prefix classes in arbitrary variants
55
+ if (context?.tailwindConfig?.prefix && !isArbitraryVariant) {
54
56
  format = prefixSelector(context.tailwindConfig.prefix, format)
55
57
  }
56
58
 
package/types/config.d.ts CHANGED
@@ -12,6 +12,7 @@ interface RecursiveKeyValuePair<K extends keyof any = string, V = string> {
12
12
  [key: string]: V | RecursiveKeyValuePair<K, V>
13
13
  }
14
14
  type ResolvableTo<T> = T | ((utils: PluginUtils) => T)
15
+ type CSSRuleObject = RecursiveKeyValuePair<string, string | string[]>
15
16
 
16
17
  interface PluginUtils {
17
18
  colors: DefaultColors
@@ -163,6 +164,7 @@ interface ThemeConfig {
163
164
  configuration: Partial<{
164
165
  lineHeight: string
165
166
  letterSpacing: string
167
+ fontWeight: string | number
166
168
  }>
167
169
  ]
168
170
  >
@@ -242,7 +244,7 @@ type ValueType =
242
244
  export interface PluginAPI {
243
245
  // for registering new static utility styles
244
246
  addUtilities(
245
- utilities: RecursiveKeyValuePair | RecursiveKeyValuePair[],
247
+ utilities: CSSRuleObject | CSSRuleObject[],
246
248
  options?: Partial<{
247
249
  respectPrefix: boolean
248
250
  respectImportant: boolean
@@ -250,7 +252,7 @@ export interface PluginAPI {
250
252
  ): void
251
253
  // for registering new dynamic utility styles
252
254
  matchUtilities<T>(
253
- utilities: KeyValuePair<string, (value: T) => RecursiveKeyValuePair>,
255
+ utilities: KeyValuePair<string, (value: T) => CSSRuleObject>,
254
256
  options?: Partial<{
255
257
  respectPrefix: boolean
256
258
  respectImportant: boolean
@@ -261,7 +263,7 @@ export interface PluginAPI {
261
263
  ): void
262
264
  // for registering new static component styles
263
265
  addComponents(
264
- components: RecursiveKeyValuePair | RecursiveKeyValuePair[],
266
+ components: CSSRuleObject | CSSRuleObject[],
265
267
  options?: Partial<{
266
268
  respectPrefix: boolean
267
269
  respectImportant: boolean
@@ -269,7 +271,7 @@ export interface PluginAPI {
269
271
  ): void
270
272
  // for registering new dynamic component styles
271
273
  matchComponents<T>(
272
- components: KeyValuePair<string, (value: T) => RecursiveKeyValuePair>,
274
+ components: KeyValuePair<string, (value: T) => CSSRuleObject>,
273
275
  options?: Partial<{
274
276
  respectPrefix: boolean
275
277
  respectImportant: boolean
@@ -279,7 +281,7 @@ export interface PluginAPI {
279
281
  }>
280
282
  ): void
281
283
  // for registering new base styles
282
- addBase(base: RecursiveKeyValuePair | RecursiveKeyValuePair[]): void
284
+ addBase(base: CSSRuleObject | CSSRuleObject[]): void
283
285
  // for registering custom variants
284
286
  addVariant(name: string, definition: string | string[] | (() => string) | (() => string)[]): void
285
287
  // for looking up values in the user’s theme configuration
@@ -0,0 +1,331 @@
1
+ import { Config } from '../../types'
2
+ type CSSDeclarationList = Record<string, string>
3
+ export type DefaultTheme = Config['theme'] & {
4
+ screens: Record<'sm' | 'md' | 'lg' | 'xl' | '2xl', string>
5
+ columns: Record<
6
+ | '1'
7
+ | '2'
8
+ | '3'
9
+ | '4'
10
+ | '5'
11
+ | '6'
12
+ | '7'
13
+ | '8'
14
+ | '9'
15
+ | '10'
16
+ | '11'
17
+ | '12'
18
+ | 'auto'
19
+ | '3xs'
20
+ | '2xs'
21
+ | 'xs'
22
+ | 'sm'
23
+ | 'md'
24
+ | 'lg'
25
+ | 'xl'
26
+ | '2xl'
27
+ | '3xl'
28
+ | '4xl'
29
+ | '5xl'
30
+ | '6xl'
31
+ | '7xl',
32
+ string
33
+ >
34
+ spacing: Record<
35
+ | '0'
36
+ | '1'
37
+ | '2'
38
+ | '3'
39
+ | '4'
40
+ | '5'
41
+ | '6'
42
+ | '7'
43
+ | '8'
44
+ | '9'
45
+ | '10'
46
+ | '11'
47
+ | '12'
48
+ | '14'
49
+ | '16'
50
+ | '20'
51
+ | '24'
52
+ | '28'
53
+ | '32'
54
+ | '36'
55
+ | '40'
56
+ | '44'
57
+ | '48'
58
+ | '52'
59
+ | '56'
60
+ | '60'
61
+ | '64'
62
+ | '72'
63
+ | '80'
64
+ | '96'
65
+ | 'px'
66
+ | '0.5'
67
+ | '1.5'
68
+ | '2.5'
69
+ | '3.5',
70
+ string
71
+ >
72
+ animation: Record<'none' | 'spin' | 'ping' | 'pulse' | 'bounce', string>
73
+ aspectRatio: Record<'auto' | 'square' | 'video', string>
74
+ backgroundImage: Record<
75
+ | 'none'
76
+ | 'gradient-to-t'
77
+ | 'gradient-to-tr'
78
+ | 'gradient-to-r'
79
+ | 'gradient-to-br'
80
+ | 'gradient-to-b'
81
+ | 'gradient-to-bl'
82
+ | 'gradient-to-l'
83
+ | 'gradient-to-tl',
84
+ string
85
+ >
86
+ backgroundPosition: Record<
87
+ | 'bottom'
88
+ | 'center'
89
+ | 'left'
90
+ | 'left-bottom'
91
+ | 'left-top'
92
+ | 'right'
93
+ | 'right-bottom'
94
+ | 'right-top'
95
+ | 'top',
96
+ string
97
+ >
98
+ backgroundSize: Record<'auto' | 'cover' | 'contain', string>
99
+ blur: Record<'0' | 'none' | 'sm' | 'DEFAULT' | 'md' | 'lg' | 'xl' | '2xl' | '3xl', string>
100
+ brightness: Record<
101
+ '0' | '50' | '75' | '90' | '95' | '100' | '105' | '110' | '125' | '150' | '200',
102
+ string
103
+ >
104
+ borderRadius: Record<
105
+ 'none' | 'sm' | 'DEFAULT' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full',
106
+ string
107
+ >
108
+ borderWidth: Record<'0' | '2' | '4' | '8' | 'DEFAULT', string>
109
+ boxShadow: Record<'sm' | 'DEFAULT' | 'md' | 'lg' | 'xl' | '2xl' | 'inner' | 'none', string>
110
+ contrast: Record<'0' | '50' | '75' | '100' | '125' | '150' | '200', string>
111
+ content: Record<'none', string>
112
+ cursor: Record<
113
+ | 'auto'
114
+ | 'default'
115
+ | 'pointer'
116
+ | 'wait'
117
+ | 'text'
118
+ | 'move'
119
+ | 'help'
120
+ | 'not-allowed'
121
+ | 'none'
122
+ | 'context-menu'
123
+ | 'progress'
124
+ | 'cell'
125
+ | 'crosshair'
126
+ | 'vertical-text'
127
+ | 'alias'
128
+ | 'copy'
129
+ | 'no-drop'
130
+ | 'grab'
131
+ | 'grabbing'
132
+ | 'all-scroll'
133
+ | 'col-resize'
134
+ | 'row-resize'
135
+ | 'n-resize'
136
+ | 'e-resize'
137
+ | 's-resize'
138
+ | 'w-resize'
139
+ | 'ne-resize'
140
+ | 'nw-resize'
141
+ | 'se-resize'
142
+ | 'sw-resize'
143
+ | 'ew-resize'
144
+ | 'ns-resize'
145
+ | 'nesw-resize'
146
+ | 'nwse-resize'
147
+ | 'zoom-in'
148
+ | 'zoom-out',
149
+ string
150
+ >
151
+ dropShadow: Record<'sm' | 'DEFAULT' | 'md' | 'lg' | 'xl' | '2xl' | 'none', string | string[]>
152
+ grayscale: Record<'0' | 'DEFAULT', string>
153
+ hueRotate: Record<'0' | '15' | '30' | '60' | '90' | '180', string>
154
+ invert: Record<'0' | 'DEFAULT', string>
155
+ flex: Record<'1' | 'auto' | 'initial' | 'none', string>
156
+ flexGrow: Record<'0' | 'DEFAULT', string>
157
+ flexShrink: Record<'0' | 'DEFAULT', string>
158
+ fontFamily: Record<'sans' | 'serif' | 'mono', string[]>
159
+ fontSize: Record<
160
+ | 'xs'
161
+ | 'sm'
162
+ | 'base'
163
+ | 'lg'
164
+ | 'xl'
165
+ | '2xl'
166
+ | '3xl'
167
+ | '4xl'
168
+ | '5xl'
169
+ | '6xl'
170
+ | '7xl'
171
+ | '8xl'
172
+ | '9xl',
173
+ [string, { lineHeight: string }]
174
+ >
175
+ fontWeight: Record<
176
+ | 'thin'
177
+ | 'extralight'
178
+ | 'light'
179
+ | 'normal'
180
+ | 'medium'
181
+ | 'semibold'
182
+ | 'bold'
183
+ | 'extrabold'
184
+ | 'black',
185
+ string
186
+ >
187
+ gridAutoColumns: Record<'auto' | 'min' | 'max' | 'fr', string>
188
+ gridAutoRows: Record<'auto' | 'min' | 'max' | 'fr', string>
189
+ gridColumn: Record<
190
+ | 'auto'
191
+ | 'span-1'
192
+ | 'span-2'
193
+ | 'span-3'
194
+ | 'span-4'
195
+ | 'span-5'
196
+ | 'span-6'
197
+ | 'span-7'
198
+ | 'span-8'
199
+ | 'span-9'
200
+ | 'span-10'
201
+ | 'span-11'
202
+ | 'span-12'
203
+ | 'span-full',
204
+ string
205
+ >
206
+ gridColumnEnd: Record<
207
+ '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | '13' | 'auto',
208
+ string
209
+ >
210
+ gridColumnStart: Record<
211
+ '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | '13' | 'auto',
212
+ string
213
+ >
214
+ gridRow: Record<
215
+ 'auto' | 'span-1' | 'span-2' | 'span-3' | 'span-4' | 'span-5' | 'span-6' | 'span-full',
216
+ string
217
+ >
218
+ gridRowStart: Record<'1' | '2' | '3' | '4' | '5' | '6' | '7' | 'auto', string>
219
+ gridRowEnd: Record<'1' | '2' | '3' | '4' | '5' | '6' | '7' | 'auto', string>
220
+ gridTemplateColumns: Record<
221
+ '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12' | 'none',
222
+ string
223
+ >
224
+ gridTemplateRows: Record<'1' | '2' | '3' | '4' | '5' | '6' | 'none', string>
225
+ keyframes: Record<'spin' | 'ping' | 'pulse' | 'bounce', Record<string, CSSDeclarationList>>
226
+ letterSpacing: Record<'tighter' | 'tight' | 'normal' | 'wide' | 'wider' | 'widest', string>
227
+ lineHeight: Record<
228
+ | '3'
229
+ | '4'
230
+ | '5'
231
+ | '6'
232
+ | '7'
233
+ | '8'
234
+ | '9'
235
+ | '10'
236
+ | 'none'
237
+ | 'tight'
238
+ | 'snug'
239
+ | 'normal'
240
+ | 'relaxed'
241
+ | 'loose',
242
+ string
243
+ >
244
+ listStyleType: Record<'none' | 'disc' | 'decimal', string>
245
+ minHeight: Record<'0' | 'full' | 'screen' | 'min' | 'max' | 'fit', string>
246
+ minWidth: Record<'0' | 'full' | 'min' | 'max' | 'fit', string>
247
+ objectPosition: Record<
248
+ | 'bottom'
249
+ | 'center'
250
+ | 'left'
251
+ | 'left-bottom'
252
+ | 'left-top'
253
+ | 'right'
254
+ | 'right-bottom'
255
+ | 'right-top'
256
+ | 'top',
257
+ string
258
+ >
259
+ opacity: Record<
260
+ | '0'
261
+ | '5'
262
+ | '10'
263
+ | '20'
264
+ | '25'
265
+ | '30'
266
+ | '40'
267
+ | '50'
268
+ | '60'
269
+ | '70'
270
+ | '75'
271
+ | '80'
272
+ | '90'
273
+ | '95'
274
+ | '100',
275
+ string
276
+ >
277
+ order: Record<
278
+ | '1'
279
+ | '2'
280
+ | '3'
281
+ | '4'
282
+ | '5'
283
+ | '6'
284
+ | '7'
285
+ | '8'
286
+ | '9'
287
+ | '10'
288
+ | '11'
289
+ | '12'
290
+ | 'first'
291
+ | 'last'
292
+ | 'none',
293
+ string
294
+ >
295
+ outlineOffset: Record<'0' | '1' | '2' | '4' | '8', string>
296
+ outlineWidth: Record<'0' | '1' | '2' | '4' | '8', string>
297
+ ringOffsetWidth: Record<'0' | '1' | '2' | '4' | '8', string>
298
+ ringWidth: Record<'0' | '1' | '2' | '4' | '8' | 'DEFAULT', string>
299
+ rotate: Record<'0' | '1' | '2' | '3' | '6' | '12' | '45' | '90' | '180', string>
300
+ saturate: Record<'0' | '50' | '100' | '150' | '200', string>
301
+ scale: Record<'0' | '50' | '75' | '90' | '95' | '100' | '105' | '110' | '125' | '150', string>
302
+ sepia: Record<'0' | 'DEFAULT', string>
303
+ skew: Record<'0' | '1' | '2' | '3' | '6' | '12', string>
304
+ strokeWidth: Record<'0' | '1' | '2', string>
305
+ textDecorationThickness: Record<'0' | '1' | '2' | '4' | '8' | 'auto' | 'from-font', string>
306
+ textUnderlineOffset: Record<'0' | '1' | '2' | '4' | '8' | 'auto', string>
307
+ transformOrigin: Record<
308
+ | 'center'
309
+ | 'top'
310
+ | 'top-right'
311
+ | 'right'
312
+ | 'bottom-right'
313
+ | 'bottom'
314
+ | 'bottom-left'
315
+ | 'left'
316
+ | 'top-left',
317
+ string
318
+ >
319
+ transitionDelay: Record<'75' | '100' | '150' | '200' | '300' | '500' | '700' | '1000', string>
320
+ transitionDuration: Record<
321
+ '75' | '100' | '150' | '200' | '300' | '500' | '700' | '1000' | 'DEFAULT',
322
+ string
323
+ >
324
+ transitionProperty: Record<
325
+ 'none' | 'all' | 'DEFAULT' | 'colors' | 'opacity' | 'shadow' | 'transform',
326
+ string
327
+ >
328
+ transitionTimingFunction: Record<'DEFAULT' | 'linear' | 'in' | 'out' | 'in-out', string>
329
+ willChange: Record<'auto' | 'scroll' | 'contents' | 'transform', string>
330
+ zIndex: Record<'0' | '10' | '20' | '30' | '40' | '50' | 'auto', string>
331
+ }