@jusankar/moon 0.1.0

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.
Files changed (41) hide show
  1. package/README.md +44 -0
  2. package/dist/icons.d.ts +2 -0
  3. package/dist/icons.js +30051 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.js +3389 -0
  6. package/dist/src/components/alert/alert.d.ts +11 -0
  7. package/dist/src/components/alert/alert.story.d.ts +9 -0
  8. package/dist/src/components/alert/alert.test.d.ts +1 -0
  9. package/dist/src/components/alert/index.d.ts +1 -0
  10. package/dist/src/components/badge/badge.d.ts +10 -0
  11. package/dist/src/components/badge/badge.story.d.ts +10 -0
  12. package/dist/src/components/badge/badge.test.d.ts +1 -0
  13. package/dist/src/components/badge/index.d.ts +1 -0
  14. package/dist/src/components/card/card.d.ts +11 -0
  15. package/dist/src/components/card/card.story.d.ts +9 -0
  16. package/dist/src/components/card/card.test.d.ts +1 -0
  17. package/dist/src/components/card/index.d.ts +1 -0
  18. package/dist/src/icons.d.ts +1 -0
  19. package/dist/src/index.d.ts +3 -0
  20. package/dist/src/tests/vitest.setup.d.ts +7 -0
  21. package/dist/src/utils.d.ts +2 -0
  22. package/dist/vite.config.d.ts +3 -0
  23. package/package.json +132 -0
  24. package/src/components/alert/alert.story.tsx +58 -0
  25. package/src/components/alert/alert.test.tsx +299 -0
  26. package/src/components/alert/alert.tsx +65 -0
  27. package/src/components/alert/index.ts +1 -0
  28. package/src/components/badge/badge.story.tsx +82 -0
  29. package/src/components/badge/badge.test.tsx +189 -0
  30. package/src/components/badge/badge.tsx +43 -0
  31. package/src/components/badge/index.ts +1 -0
  32. package/src/components/card/card.story.tsx +123 -0
  33. package/src/components/card/card.test.tsx +231 -0
  34. package/src/components/card/card.tsx +85 -0
  35. package/src/components/card/index.ts +1 -0
  36. package/src/icons.ts +1 -0
  37. package/src/index.ts +3 -0
  38. package/src/styles/index.css +123 -0
  39. package/src/styles/storybook-only.css +20 -0
  40. package/src/tests/vitest.setup.ts +76 -0
  41. package/src/utils.ts +6 -0
package/dist/index.js ADDED
@@ -0,0 +1,3389 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ function r(e) {
4
+ var t, f, n = "";
5
+ if ("string" == typeof e || "number" == typeof e) n += e;
6
+ else if ("object" == typeof e) if (Array.isArray(e)) {
7
+ var o = e.length;
8
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
9
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
10
+ return n;
11
+ }
12
+ function clsx() {
13
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
14
+ return n;
15
+ }
16
+ const falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
17
+ const cx = clsx;
18
+ const cva = (base, config) => (props) => {
19
+ var _config_compoundVariants;
20
+ if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
21
+ const { variants, defaultVariants } = config;
22
+ const getVariantClassNames = Object.keys(variants).map((variant) => {
23
+ const variantProp = props === null || props === void 0 ? void 0 : props[variant];
24
+ const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
25
+ if (variantProp === null) return null;
26
+ const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
27
+ return variants[variant][variantKey];
28
+ });
29
+ const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param) => {
30
+ let [key, value] = param;
31
+ if (value === void 0) {
32
+ return acc;
33
+ }
34
+ acc[key] = value;
35
+ return acc;
36
+ }, {});
37
+ const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param) => {
38
+ let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
39
+ return Object.entries(compoundVariantOptions).every((param2) => {
40
+ let [key, value] = param2;
41
+ return Array.isArray(value) ? value.includes({
42
+ ...defaultVariants,
43
+ ...propsWithoutUndefined
44
+ }[key]) : {
45
+ ...defaultVariants,
46
+ ...propsWithoutUndefined
47
+ }[key] === value;
48
+ }) ? [
49
+ ...acc,
50
+ cvClass,
51
+ cvClassName
52
+ ] : acc;
53
+ }, []);
54
+ return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
55
+ };
56
+ const concatArrays = (array1, array2) => {
57
+ const combinedArray = new Array(array1.length + array2.length);
58
+ for (let i = 0; i < array1.length; i++) {
59
+ combinedArray[i] = array1[i];
60
+ }
61
+ for (let i = 0; i < array2.length; i++) {
62
+ combinedArray[array1.length + i] = array2[i];
63
+ }
64
+ return combinedArray;
65
+ };
66
+ const createClassValidatorObject = (classGroupId, validator) => ({
67
+ classGroupId,
68
+ validator
69
+ });
70
+ const createClassPartObject = (nextPart = /* @__PURE__ */ new Map(), validators = null, classGroupId) => ({
71
+ nextPart,
72
+ validators,
73
+ classGroupId
74
+ });
75
+ const CLASS_PART_SEPARATOR = "-";
76
+ const EMPTY_CONFLICTS = [];
77
+ const ARBITRARY_PROPERTY_PREFIX = "arbitrary..";
78
+ const createClassGroupUtils = (config) => {
79
+ const classMap = createClassMap(config);
80
+ const {
81
+ conflictingClassGroups,
82
+ conflictingClassGroupModifiers
83
+ } = config;
84
+ const getClassGroupId = (className) => {
85
+ if (className.startsWith("[") && className.endsWith("]")) {
86
+ return getGroupIdForArbitraryProperty(className);
87
+ }
88
+ const classParts = className.split(CLASS_PART_SEPARATOR);
89
+ const startIndex = classParts[0] === "" && classParts.length > 1 ? 1 : 0;
90
+ return getGroupRecursive(classParts, startIndex, classMap);
91
+ };
92
+ const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
93
+ if (hasPostfixModifier) {
94
+ const modifierConflicts = conflictingClassGroupModifiers[classGroupId];
95
+ const baseConflicts = conflictingClassGroups[classGroupId];
96
+ if (modifierConflicts) {
97
+ if (baseConflicts) {
98
+ return concatArrays(baseConflicts, modifierConflicts);
99
+ }
100
+ return modifierConflicts;
101
+ }
102
+ return baseConflicts || EMPTY_CONFLICTS;
103
+ }
104
+ return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;
105
+ };
106
+ return {
107
+ getClassGroupId,
108
+ getConflictingClassGroupIds
109
+ };
110
+ };
111
+ const getGroupRecursive = (classParts, startIndex, classPartObject) => {
112
+ const classPathsLength = classParts.length - startIndex;
113
+ if (classPathsLength === 0) {
114
+ return classPartObject.classGroupId;
115
+ }
116
+ const currentClassPart = classParts[startIndex];
117
+ const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
118
+ if (nextClassPartObject) {
119
+ const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);
120
+ if (result) return result;
121
+ }
122
+ const validators = classPartObject.validators;
123
+ if (validators === null) {
124
+ return void 0;
125
+ }
126
+ const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);
127
+ const validatorsLength = validators.length;
128
+ for (let i = 0; i < validatorsLength; i++) {
129
+ const validatorObj = validators[i];
130
+ if (validatorObj.validator(classRest)) {
131
+ return validatorObj.classGroupId;
132
+ }
133
+ }
134
+ return void 0;
135
+ };
136
+ const getGroupIdForArbitraryProperty = (className) => className.slice(1, -1).indexOf(":") === -1 ? void 0 : (() => {
137
+ const content = className.slice(1, -1);
138
+ const colonIndex = content.indexOf(":");
139
+ const property = content.slice(0, colonIndex);
140
+ return property ? ARBITRARY_PROPERTY_PREFIX + property : void 0;
141
+ })();
142
+ const createClassMap = (config) => {
143
+ const {
144
+ theme,
145
+ classGroups
146
+ } = config;
147
+ return processClassGroups(classGroups, theme);
148
+ };
149
+ const processClassGroups = (classGroups, theme) => {
150
+ const classMap = createClassPartObject();
151
+ for (const classGroupId in classGroups) {
152
+ const group = classGroups[classGroupId];
153
+ processClassesRecursively(group, classMap, classGroupId, theme);
154
+ }
155
+ return classMap;
156
+ };
157
+ const processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
158
+ const len = classGroup.length;
159
+ for (let i = 0; i < len; i++) {
160
+ const classDefinition = classGroup[i];
161
+ processClassDefinition(classDefinition, classPartObject, classGroupId, theme);
162
+ }
163
+ };
164
+ const processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
165
+ if (typeof classDefinition === "string") {
166
+ processStringDefinition(classDefinition, classPartObject, classGroupId);
167
+ return;
168
+ }
169
+ if (typeof classDefinition === "function") {
170
+ processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);
171
+ return;
172
+ }
173
+ processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);
174
+ };
175
+ const processStringDefinition = (classDefinition, classPartObject, classGroupId) => {
176
+ const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
177
+ classPartObjectToEdit.classGroupId = classGroupId;
178
+ };
179
+ const processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
180
+ if (isThemeGetter(classDefinition)) {
181
+ processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
182
+ return;
183
+ }
184
+ if (classPartObject.validators === null) {
185
+ classPartObject.validators = [];
186
+ }
187
+ classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));
188
+ };
189
+ const processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
190
+ const entries = Object.entries(classDefinition);
191
+ const len = entries.length;
192
+ for (let i = 0; i < len; i++) {
193
+ const [key, value] = entries[i];
194
+ processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);
195
+ }
196
+ };
197
+ const getPart = (classPartObject, path) => {
198
+ let current = classPartObject;
199
+ const parts = path.split(CLASS_PART_SEPARATOR);
200
+ const len = parts.length;
201
+ for (let i = 0; i < len; i++) {
202
+ const part = parts[i];
203
+ let next = current.nextPart.get(part);
204
+ if (!next) {
205
+ next = createClassPartObject();
206
+ current.nextPart.set(part, next);
207
+ }
208
+ current = next;
209
+ }
210
+ return current;
211
+ };
212
+ const isThemeGetter = (func) => "isThemeGetter" in func && func.isThemeGetter === true;
213
+ const createLruCache = (maxCacheSize) => {
214
+ if (maxCacheSize < 1) {
215
+ return {
216
+ get: () => void 0,
217
+ set: () => {
218
+ }
219
+ };
220
+ }
221
+ let cacheSize = 0;
222
+ let cache = /* @__PURE__ */ Object.create(null);
223
+ let previousCache = /* @__PURE__ */ Object.create(null);
224
+ const update = (key, value) => {
225
+ cache[key] = value;
226
+ cacheSize++;
227
+ if (cacheSize > maxCacheSize) {
228
+ cacheSize = 0;
229
+ previousCache = cache;
230
+ cache = /* @__PURE__ */ Object.create(null);
231
+ }
232
+ };
233
+ return {
234
+ get(key) {
235
+ let value = cache[key];
236
+ if (value !== void 0) {
237
+ return value;
238
+ }
239
+ if ((value = previousCache[key]) !== void 0) {
240
+ update(key, value);
241
+ return value;
242
+ }
243
+ },
244
+ set(key, value) {
245
+ if (key in cache) {
246
+ cache[key] = value;
247
+ } else {
248
+ update(key, value);
249
+ }
250
+ }
251
+ };
252
+ };
253
+ const IMPORTANT_MODIFIER = "!";
254
+ const MODIFIER_SEPARATOR = ":";
255
+ const EMPTY_MODIFIERS = [];
256
+ const createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({
257
+ modifiers,
258
+ hasImportantModifier,
259
+ baseClassName,
260
+ maybePostfixModifierPosition,
261
+ isExternal
262
+ });
263
+ const createParseClassName = (config) => {
264
+ const {
265
+ prefix,
266
+ experimentalParseClassName
267
+ } = config;
268
+ let parseClassName = (className) => {
269
+ const modifiers = [];
270
+ let bracketDepth = 0;
271
+ let parenDepth = 0;
272
+ let modifierStart = 0;
273
+ let postfixModifierPosition;
274
+ const len = className.length;
275
+ for (let index = 0; index < len; index++) {
276
+ const currentCharacter = className[index];
277
+ if (bracketDepth === 0 && parenDepth === 0) {
278
+ if (currentCharacter === MODIFIER_SEPARATOR) {
279
+ modifiers.push(className.slice(modifierStart, index));
280
+ modifierStart = index + 1;
281
+ continue;
282
+ }
283
+ if (currentCharacter === "/") {
284
+ postfixModifierPosition = index;
285
+ continue;
286
+ }
287
+ }
288
+ if (currentCharacter === "[") bracketDepth++;
289
+ else if (currentCharacter === "]") bracketDepth--;
290
+ else if (currentCharacter === "(") parenDepth++;
291
+ else if (currentCharacter === ")") parenDepth--;
292
+ }
293
+ const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);
294
+ let baseClassName = baseClassNameWithImportantModifier;
295
+ let hasImportantModifier = false;
296
+ if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {
297
+ baseClassName = baseClassNameWithImportantModifier.slice(0, -1);
298
+ hasImportantModifier = true;
299
+ } else if (
300
+ /**
301
+ * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.
302
+ * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864
303
+ */
304
+ baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)
305
+ ) {
306
+ baseClassName = baseClassNameWithImportantModifier.slice(1);
307
+ hasImportantModifier = true;
308
+ }
309
+ const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
310
+ return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);
311
+ };
312
+ if (prefix) {
313
+ const fullPrefix = prefix + MODIFIER_SEPARATOR;
314
+ const parseClassNameOriginal = parseClassName;
315
+ parseClassName = (className) => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, void 0, true);
316
+ }
317
+ if (experimentalParseClassName) {
318
+ const parseClassNameOriginal = parseClassName;
319
+ parseClassName = (className) => experimentalParseClassName({
320
+ className,
321
+ parseClassName: parseClassNameOriginal
322
+ });
323
+ }
324
+ return parseClassName;
325
+ };
326
+ const createSortModifiers = (config) => {
327
+ const modifierWeights = /* @__PURE__ */ new Map();
328
+ config.orderSensitiveModifiers.forEach((mod, index) => {
329
+ modifierWeights.set(mod, 1e6 + index);
330
+ });
331
+ return (modifiers) => {
332
+ const result = [];
333
+ let currentSegment = [];
334
+ for (let i = 0; i < modifiers.length; i++) {
335
+ const modifier = modifiers[i];
336
+ const isArbitrary = modifier[0] === "[";
337
+ const isOrderSensitive = modifierWeights.has(modifier);
338
+ if (isArbitrary || isOrderSensitive) {
339
+ if (currentSegment.length > 0) {
340
+ currentSegment.sort();
341
+ result.push(...currentSegment);
342
+ currentSegment = [];
343
+ }
344
+ result.push(modifier);
345
+ } else {
346
+ currentSegment.push(modifier);
347
+ }
348
+ }
349
+ if (currentSegment.length > 0) {
350
+ currentSegment.sort();
351
+ result.push(...currentSegment);
352
+ }
353
+ return result;
354
+ };
355
+ };
356
+ const createConfigUtils = (config) => ({
357
+ cache: createLruCache(config.cacheSize),
358
+ parseClassName: createParseClassName(config),
359
+ sortModifiers: createSortModifiers(config),
360
+ ...createClassGroupUtils(config)
361
+ });
362
+ const SPLIT_CLASSES_REGEX = /\s+/;
363
+ const mergeClassList = (classList, configUtils) => {
364
+ const {
365
+ parseClassName,
366
+ getClassGroupId,
367
+ getConflictingClassGroupIds,
368
+ sortModifiers
369
+ } = configUtils;
370
+ const classGroupsInConflict = [];
371
+ const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
372
+ let result = "";
373
+ for (let index = classNames.length - 1; index >= 0; index -= 1) {
374
+ const originalClassName = classNames[index];
375
+ const {
376
+ isExternal,
377
+ modifiers,
378
+ hasImportantModifier,
379
+ baseClassName,
380
+ maybePostfixModifierPosition
381
+ } = parseClassName(originalClassName);
382
+ if (isExternal) {
383
+ result = originalClassName + (result.length > 0 ? " " + result : result);
384
+ continue;
385
+ }
386
+ let hasPostfixModifier = !!maybePostfixModifierPosition;
387
+ let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
388
+ if (!classGroupId) {
389
+ if (!hasPostfixModifier) {
390
+ result = originalClassName + (result.length > 0 ? " " + result : result);
391
+ continue;
392
+ }
393
+ classGroupId = getClassGroupId(baseClassName);
394
+ if (!classGroupId) {
395
+ result = originalClassName + (result.length > 0 ? " " + result : result);
396
+ continue;
397
+ }
398
+ hasPostfixModifier = false;
399
+ }
400
+ const variantModifier = modifiers.length === 0 ? "" : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(":");
401
+ const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
402
+ const classId = modifierId + classGroupId;
403
+ if (classGroupsInConflict.indexOf(classId) > -1) {
404
+ continue;
405
+ }
406
+ classGroupsInConflict.push(classId);
407
+ const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
408
+ for (let i = 0; i < conflictGroups.length; ++i) {
409
+ const group = conflictGroups[i];
410
+ classGroupsInConflict.push(modifierId + group);
411
+ }
412
+ result = originalClassName + (result.length > 0 ? " " + result : result);
413
+ }
414
+ return result;
415
+ };
416
+ const twJoin = (...classLists) => {
417
+ let index = 0;
418
+ let argument;
419
+ let resolvedValue;
420
+ let string = "";
421
+ while (index < classLists.length) {
422
+ if (argument = classLists[index++]) {
423
+ if (resolvedValue = toValue(argument)) {
424
+ string && (string += " ");
425
+ string += resolvedValue;
426
+ }
427
+ }
428
+ }
429
+ return string;
430
+ };
431
+ const toValue = (mix) => {
432
+ if (typeof mix === "string") {
433
+ return mix;
434
+ }
435
+ let resolvedValue;
436
+ let string = "";
437
+ for (let k = 0; k < mix.length; k++) {
438
+ if (mix[k]) {
439
+ if (resolvedValue = toValue(mix[k])) {
440
+ string && (string += " ");
441
+ string += resolvedValue;
442
+ }
443
+ }
444
+ }
445
+ return string;
446
+ };
447
+ const createTailwindMerge = (createConfigFirst, ...createConfigRest) => {
448
+ let configUtils;
449
+ let cacheGet;
450
+ let cacheSet;
451
+ let functionToCall;
452
+ const initTailwindMerge = (classList) => {
453
+ const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
454
+ configUtils = createConfigUtils(config);
455
+ cacheGet = configUtils.cache.get;
456
+ cacheSet = configUtils.cache.set;
457
+ functionToCall = tailwindMerge;
458
+ return tailwindMerge(classList);
459
+ };
460
+ const tailwindMerge = (classList) => {
461
+ const cachedResult = cacheGet(classList);
462
+ if (cachedResult) {
463
+ return cachedResult;
464
+ }
465
+ const result = mergeClassList(classList, configUtils);
466
+ cacheSet(classList, result);
467
+ return result;
468
+ };
469
+ functionToCall = initTailwindMerge;
470
+ return (...args) => functionToCall(twJoin(...args));
471
+ };
472
+ const fallbackThemeArr = [];
473
+ const fromTheme = (key) => {
474
+ const themeGetter = (theme) => theme[key] || fallbackThemeArr;
475
+ themeGetter.isThemeGetter = true;
476
+ return themeGetter;
477
+ };
478
+ const arbitraryValueRegex = /^\[(?:(\w[\w-]*):)?(.+)\]$/i;
479
+ const arbitraryVariableRegex = /^\((?:(\w[\w-]*):)?(.+)\)$/i;
480
+ const fractionRegex = /^\d+\/\d+$/;
481
+ const tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
482
+ const lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
483
+ const colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
484
+ const shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
485
+ const imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
486
+ const isFraction = (value) => fractionRegex.test(value);
487
+ const isNumber = (value) => !!value && !Number.isNaN(Number(value));
488
+ const isInteger = (value) => !!value && Number.isInteger(Number(value));
489
+ const isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
490
+ const isTshirtSize = (value) => tshirtUnitRegex.test(value);
491
+ const isAny = () => true;
492
+ const isLengthOnly = (value) => (
493
+ // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
494
+ // For example, `hsl(0 0% 0%)` would be classified as a length without this check.
495
+ // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
496
+ lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)
497
+ );
498
+ const isNever = () => false;
499
+ const isShadow = (value) => shadowRegex.test(value);
500
+ const isImage = (value) => imageRegex.test(value);
501
+ const isAnyNonArbitrary = (value) => !isArbitraryValue(value) && !isArbitraryVariable(value);
502
+ const isArbitrarySize = (value) => getIsArbitraryValue(value, isLabelSize, isNever);
503
+ const isArbitraryValue = (value) => arbitraryValueRegex.test(value);
504
+ const isArbitraryLength = (value) => getIsArbitraryValue(value, isLabelLength, isLengthOnly);
505
+ const isArbitraryNumber = (value) => getIsArbitraryValue(value, isLabelNumber, isNumber);
506
+ const isArbitraryPosition = (value) => getIsArbitraryValue(value, isLabelPosition, isNever);
507
+ const isArbitraryImage = (value) => getIsArbitraryValue(value, isLabelImage, isImage);
508
+ const isArbitraryShadow = (value) => getIsArbitraryValue(value, isLabelShadow, isShadow);
509
+ const isArbitraryVariable = (value) => arbitraryVariableRegex.test(value);
510
+ const isArbitraryVariableLength = (value) => getIsArbitraryVariable(value, isLabelLength);
511
+ const isArbitraryVariableFamilyName = (value) => getIsArbitraryVariable(value, isLabelFamilyName);
512
+ const isArbitraryVariablePosition = (value) => getIsArbitraryVariable(value, isLabelPosition);
513
+ const isArbitraryVariableSize = (value) => getIsArbitraryVariable(value, isLabelSize);
514
+ const isArbitraryVariableImage = (value) => getIsArbitraryVariable(value, isLabelImage);
515
+ const isArbitraryVariableShadow = (value) => getIsArbitraryVariable(value, isLabelShadow, true);
516
+ const getIsArbitraryValue = (value, testLabel, testValue) => {
517
+ const result = arbitraryValueRegex.exec(value);
518
+ if (result) {
519
+ if (result[1]) {
520
+ return testLabel(result[1]);
521
+ }
522
+ return testValue(result[2]);
523
+ }
524
+ return false;
525
+ };
526
+ const getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {
527
+ const result = arbitraryVariableRegex.exec(value);
528
+ if (result) {
529
+ if (result[1]) {
530
+ return testLabel(result[1]);
531
+ }
532
+ return shouldMatchNoLabel;
533
+ }
534
+ return false;
535
+ };
536
+ const isLabelPosition = (label) => label === "position" || label === "percentage";
537
+ const isLabelImage = (label) => label === "image" || label === "url";
538
+ const isLabelSize = (label) => label === "length" || label === "size" || label === "bg-size";
539
+ const isLabelLength = (label) => label === "length";
540
+ const isLabelNumber = (label) => label === "number";
541
+ const isLabelFamilyName = (label) => label === "family-name";
542
+ const isLabelShadow = (label) => label === "shadow";
543
+ const getDefaultConfig = () => {
544
+ const themeColor = fromTheme("color");
545
+ const themeFont = fromTheme("font");
546
+ const themeText = fromTheme("text");
547
+ const themeFontWeight = fromTheme("font-weight");
548
+ const themeTracking = fromTheme("tracking");
549
+ const themeLeading = fromTheme("leading");
550
+ const themeBreakpoint = fromTheme("breakpoint");
551
+ const themeContainer = fromTheme("container");
552
+ const themeSpacing = fromTheme("spacing");
553
+ const themeRadius = fromTheme("radius");
554
+ const themeShadow = fromTheme("shadow");
555
+ const themeInsetShadow = fromTheme("inset-shadow");
556
+ const themeTextShadow = fromTheme("text-shadow");
557
+ const themeDropShadow = fromTheme("drop-shadow");
558
+ const themeBlur = fromTheme("blur");
559
+ const themePerspective = fromTheme("perspective");
560
+ const themeAspect = fromTheme("aspect");
561
+ const themeEase = fromTheme("ease");
562
+ const themeAnimate = fromTheme("animate");
563
+ const scaleBreak = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"];
564
+ const scalePosition = () => [
565
+ "center",
566
+ "top",
567
+ "bottom",
568
+ "left",
569
+ "right",
570
+ "top-left",
571
+ // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
572
+ "left-top",
573
+ "top-right",
574
+ // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
575
+ "right-top",
576
+ "bottom-right",
577
+ // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
578
+ "right-bottom",
579
+ "bottom-left",
580
+ // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378
581
+ "left-bottom"
582
+ ];
583
+ const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];
584
+ const scaleOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"];
585
+ const scaleOverscroll = () => ["auto", "contain", "none"];
586
+ const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];
587
+ const scaleInset = () => [isFraction, "full", "auto", ...scaleUnambiguousSpacing()];
588
+ const scaleGridTemplateColsRows = () => [isInteger, "none", "subgrid", isArbitraryVariable, isArbitraryValue];
589
+ const scaleGridColRowStartAndEnd = () => ["auto", {
590
+ span: ["full", isInteger, isArbitraryVariable, isArbitraryValue]
591
+ }, isInteger, isArbitraryVariable, isArbitraryValue];
592
+ const scaleGridColRowStartOrEnd = () => [isInteger, "auto", isArbitraryVariable, isArbitraryValue];
593
+ const scaleGridAutoColsRows = () => ["auto", "min", "max", "fr", isArbitraryVariable, isArbitraryValue];
594
+ const scaleAlignPrimaryAxis = () => ["start", "end", "center", "between", "around", "evenly", "stretch", "baseline", "center-safe", "end-safe"];
595
+ const scaleAlignSecondaryAxis = () => ["start", "end", "center", "stretch", "center-safe", "end-safe"];
596
+ const scaleMargin = () => ["auto", ...scaleUnambiguousSpacing()];
597
+ const scaleSizing = () => [isFraction, "auto", "full", "dvw", "dvh", "lvw", "lvh", "svw", "svh", "min", "max", "fit", ...scaleUnambiguousSpacing()];
598
+ const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];
599
+ const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {
600
+ position: [isArbitraryVariable, isArbitraryValue]
601
+ }];
602
+ const scaleBgRepeat = () => ["no-repeat", {
603
+ repeat: ["", "x", "y", "space", "round"]
604
+ }];
605
+ const scaleBgSize = () => ["auto", "cover", "contain", isArbitraryVariableSize, isArbitrarySize, {
606
+ size: [isArbitraryVariable, isArbitraryValue]
607
+ }];
608
+ const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];
609
+ const scaleRadius = () => [
610
+ // Deprecated since Tailwind CSS v4.0.0
611
+ "",
612
+ "none",
613
+ "full",
614
+ themeRadius,
615
+ isArbitraryVariable,
616
+ isArbitraryValue
617
+ ];
618
+ const scaleBorderWidth = () => ["", isNumber, isArbitraryVariableLength, isArbitraryLength];
619
+ const scaleLineStyle = () => ["solid", "dashed", "dotted", "double"];
620
+ const scaleBlendMode = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
621
+ const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];
622
+ const scaleBlur = () => [
623
+ // Deprecated since Tailwind CSS v4.0.0
624
+ "",
625
+ "none",
626
+ themeBlur,
627
+ isArbitraryVariable,
628
+ isArbitraryValue
629
+ ];
630
+ const scaleRotate = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue];
631
+ const scaleScale = () => ["none", isNumber, isArbitraryVariable, isArbitraryValue];
632
+ const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];
633
+ const scaleTranslate = () => [isFraction, "full", ...scaleUnambiguousSpacing()];
634
+ return {
635
+ cacheSize: 500,
636
+ theme: {
637
+ animate: ["spin", "ping", "pulse", "bounce"],
638
+ aspect: ["video"],
639
+ blur: [isTshirtSize],
640
+ breakpoint: [isTshirtSize],
641
+ color: [isAny],
642
+ container: [isTshirtSize],
643
+ "drop-shadow": [isTshirtSize],
644
+ ease: ["in", "out", "in-out"],
645
+ font: [isAnyNonArbitrary],
646
+ "font-weight": ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black"],
647
+ "inset-shadow": [isTshirtSize],
648
+ leading: ["none", "tight", "snug", "normal", "relaxed", "loose"],
649
+ perspective: ["dramatic", "near", "normal", "midrange", "distant", "none"],
650
+ radius: [isTshirtSize],
651
+ shadow: [isTshirtSize],
652
+ spacing: ["px", isNumber],
653
+ text: [isTshirtSize],
654
+ "text-shadow": [isTshirtSize],
655
+ tracking: ["tighter", "tight", "normal", "wide", "wider", "widest"]
656
+ },
657
+ classGroups: {
658
+ // --------------
659
+ // --- Layout ---
660
+ // --------------
661
+ /**
662
+ * Aspect Ratio
663
+ * @see https://tailwindcss.com/docs/aspect-ratio
664
+ */
665
+ aspect: [{
666
+ aspect: ["auto", "square", isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]
667
+ }],
668
+ /**
669
+ * Container
670
+ * @see https://tailwindcss.com/docs/container
671
+ * @deprecated since Tailwind CSS v4.0.0
672
+ */
673
+ container: ["container"],
674
+ /**
675
+ * Columns
676
+ * @see https://tailwindcss.com/docs/columns
677
+ */
678
+ columns: [{
679
+ columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]
680
+ }],
681
+ /**
682
+ * Break After
683
+ * @see https://tailwindcss.com/docs/break-after
684
+ */
685
+ "break-after": [{
686
+ "break-after": scaleBreak()
687
+ }],
688
+ /**
689
+ * Break Before
690
+ * @see https://tailwindcss.com/docs/break-before
691
+ */
692
+ "break-before": [{
693
+ "break-before": scaleBreak()
694
+ }],
695
+ /**
696
+ * Break Inside
697
+ * @see https://tailwindcss.com/docs/break-inside
698
+ */
699
+ "break-inside": [{
700
+ "break-inside": ["auto", "avoid", "avoid-page", "avoid-column"]
701
+ }],
702
+ /**
703
+ * Box Decoration Break
704
+ * @see https://tailwindcss.com/docs/box-decoration-break
705
+ */
706
+ "box-decoration": [{
707
+ "box-decoration": ["slice", "clone"]
708
+ }],
709
+ /**
710
+ * Box Sizing
711
+ * @see https://tailwindcss.com/docs/box-sizing
712
+ */
713
+ box: [{
714
+ box: ["border", "content"]
715
+ }],
716
+ /**
717
+ * Display
718
+ * @see https://tailwindcss.com/docs/display
719
+ */
720
+ display: ["block", "inline-block", "inline", "flex", "inline-flex", "table", "inline-table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row-group", "table-row", "flow-root", "grid", "inline-grid", "contents", "list-item", "hidden"],
721
+ /**
722
+ * Screen Reader Only
723
+ * @see https://tailwindcss.com/docs/display#screen-reader-only
724
+ */
725
+ sr: ["sr-only", "not-sr-only"],
726
+ /**
727
+ * Floats
728
+ * @see https://tailwindcss.com/docs/float
729
+ */
730
+ float: [{
731
+ float: ["right", "left", "none", "start", "end"]
732
+ }],
733
+ /**
734
+ * Clear
735
+ * @see https://tailwindcss.com/docs/clear
736
+ */
737
+ clear: [{
738
+ clear: ["left", "right", "both", "none", "start", "end"]
739
+ }],
740
+ /**
741
+ * Isolation
742
+ * @see https://tailwindcss.com/docs/isolation
743
+ */
744
+ isolation: ["isolate", "isolation-auto"],
745
+ /**
746
+ * Object Fit
747
+ * @see https://tailwindcss.com/docs/object-fit
748
+ */
749
+ "object-fit": [{
750
+ object: ["contain", "cover", "fill", "none", "scale-down"]
751
+ }],
752
+ /**
753
+ * Object Position
754
+ * @see https://tailwindcss.com/docs/object-position
755
+ */
756
+ "object-position": [{
757
+ object: scalePositionWithArbitrary()
758
+ }],
759
+ /**
760
+ * Overflow
761
+ * @see https://tailwindcss.com/docs/overflow
762
+ */
763
+ overflow: [{
764
+ overflow: scaleOverflow()
765
+ }],
766
+ /**
767
+ * Overflow X
768
+ * @see https://tailwindcss.com/docs/overflow
769
+ */
770
+ "overflow-x": [{
771
+ "overflow-x": scaleOverflow()
772
+ }],
773
+ /**
774
+ * Overflow Y
775
+ * @see https://tailwindcss.com/docs/overflow
776
+ */
777
+ "overflow-y": [{
778
+ "overflow-y": scaleOverflow()
779
+ }],
780
+ /**
781
+ * Overscroll Behavior
782
+ * @see https://tailwindcss.com/docs/overscroll-behavior
783
+ */
784
+ overscroll: [{
785
+ overscroll: scaleOverscroll()
786
+ }],
787
+ /**
788
+ * Overscroll Behavior X
789
+ * @see https://tailwindcss.com/docs/overscroll-behavior
790
+ */
791
+ "overscroll-x": [{
792
+ "overscroll-x": scaleOverscroll()
793
+ }],
794
+ /**
795
+ * Overscroll Behavior Y
796
+ * @see https://tailwindcss.com/docs/overscroll-behavior
797
+ */
798
+ "overscroll-y": [{
799
+ "overscroll-y": scaleOverscroll()
800
+ }],
801
+ /**
802
+ * Position
803
+ * @see https://tailwindcss.com/docs/position
804
+ */
805
+ position: ["static", "fixed", "absolute", "relative", "sticky"],
806
+ /**
807
+ * Top / Right / Bottom / Left
808
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
809
+ */
810
+ inset: [{
811
+ inset: scaleInset()
812
+ }],
813
+ /**
814
+ * Right / Left
815
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
816
+ */
817
+ "inset-x": [{
818
+ "inset-x": scaleInset()
819
+ }],
820
+ /**
821
+ * Top / Bottom
822
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
823
+ */
824
+ "inset-y": [{
825
+ "inset-y": scaleInset()
826
+ }],
827
+ /**
828
+ * Start
829
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
830
+ */
831
+ start: [{
832
+ start: scaleInset()
833
+ }],
834
+ /**
835
+ * End
836
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
837
+ */
838
+ end: [{
839
+ end: scaleInset()
840
+ }],
841
+ /**
842
+ * Top
843
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
844
+ */
845
+ top: [{
846
+ top: scaleInset()
847
+ }],
848
+ /**
849
+ * Right
850
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
851
+ */
852
+ right: [{
853
+ right: scaleInset()
854
+ }],
855
+ /**
856
+ * Bottom
857
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
858
+ */
859
+ bottom: [{
860
+ bottom: scaleInset()
861
+ }],
862
+ /**
863
+ * Left
864
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
865
+ */
866
+ left: [{
867
+ left: scaleInset()
868
+ }],
869
+ /**
870
+ * Visibility
871
+ * @see https://tailwindcss.com/docs/visibility
872
+ */
873
+ visibility: ["visible", "invisible", "collapse"],
874
+ /**
875
+ * Z-Index
876
+ * @see https://tailwindcss.com/docs/z-index
877
+ */
878
+ z: [{
879
+ z: [isInteger, "auto", isArbitraryVariable, isArbitraryValue]
880
+ }],
881
+ // ------------------------
882
+ // --- Flexbox and Grid ---
883
+ // ------------------------
884
+ /**
885
+ * Flex Basis
886
+ * @see https://tailwindcss.com/docs/flex-basis
887
+ */
888
+ basis: [{
889
+ basis: [isFraction, "full", "auto", themeContainer, ...scaleUnambiguousSpacing()]
890
+ }],
891
+ /**
892
+ * Flex Direction
893
+ * @see https://tailwindcss.com/docs/flex-direction
894
+ */
895
+ "flex-direction": [{
896
+ flex: ["row", "row-reverse", "col", "col-reverse"]
897
+ }],
898
+ /**
899
+ * Flex Wrap
900
+ * @see https://tailwindcss.com/docs/flex-wrap
901
+ */
902
+ "flex-wrap": [{
903
+ flex: ["nowrap", "wrap", "wrap-reverse"]
904
+ }],
905
+ /**
906
+ * Flex
907
+ * @see https://tailwindcss.com/docs/flex
908
+ */
909
+ flex: [{
910
+ flex: [isNumber, isFraction, "auto", "initial", "none", isArbitraryValue]
911
+ }],
912
+ /**
913
+ * Flex Grow
914
+ * @see https://tailwindcss.com/docs/flex-grow
915
+ */
916
+ grow: [{
917
+ grow: ["", isNumber, isArbitraryVariable, isArbitraryValue]
918
+ }],
919
+ /**
920
+ * Flex Shrink
921
+ * @see https://tailwindcss.com/docs/flex-shrink
922
+ */
923
+ shrink: [{
924
+ shrink: ["", isNumber, isArbitraryVariable, isArbitraryValue]
925
+ }],
926
+ /**
927
+ * Order
928
+ * @see https://tailwindcss.com/docs/order
929
+ */
930
+ order: [{
931
+ order: [isInteger, "first", "last", "none", isArbitraryVariable, isArbitraryValue]
932
+ }],
933
+ /**
934
+ * Grid Template Columns
935
+ * @see https://tailwindcss.com/docs/grid-template-columns
936
+ */
937
+ "grid-cols": [{
938
+ "grid-cols": scaleGridTemplateColsRows()
939
+ }],
940
+ /**
941
+ * Grid Column Start / End
942
+ * @see https://tailwindcss.com/docs/grid-column
943
+ */
944
+ "col-start-end": [{
945
+ col: scaleGridColRowStartAndEnd()
946
+ }],
947
+ /**
948
+ * Grid Column Start
949
+ * @see https://tailwindcss.com/docs/grid-column
950
+ */
951
+ "col-start": [{
952
+ "col-start": scaleGridColRowStartOrEnd()
953
+ }],
954
+ /**
955
+ * Grid Column End
956
+ * @see https://tailwindcss.com/docs/grid-column
957
+ */
958
+ "col-end": [{
959
+ "col-end": scaleGridColRowStartOrEnd()
960
+ }],
961
+ /**
962
+ * Grid Template Rows
963
+ * @see https://tailwindcss.com/docs/grid-template-rows
964
+ */
965
+ "grid-rows": [{
966
+ "grid-rows": scaleGridTemplateColsRows()
967
+ }],
968
+ /**
969
+ * Grid Row Start / End
970
+ * @see https://tailwindcss.com/docs/grid-row
971
+ */
972
+ "row-start-end": [{
973
+ row: scaleGridColRowStartAndEnd()
974
+ }],
975
+ /**
976
+ * Grid Row Start
977
+ * @see https://tailwindcss.com/docs/grid-row
978
+ */
979
+ "row-start": [{
980
+ "row-start": scaleGridColRowStartOrEnd()
981
+ }],
982
+ /**
983
+ * Grid Row End
984
+ * @see https://tailwindcss.com/docs/grid-row
985
+ */
986
+ "row-end": [{
987
+ "row-end": scaleGridColRowStartOrEnd()
988
+ }],
989
+ /**
990
+ * Grid Auto Flow
991
+ * @see https://tailwindcss.com/docs/grid-auto-flow
992
+ */
993
+ "grid-flow": [{
994
+ "grid-flow": ["row", "col", "dense", "row-dense", "col-dense"]
995
+ }],
996
+ /**
997
+ * Grid Auto Columns
998
+ * @see https://tailwindcss.com/docs/grid-auto-columns
999
+ */
1000
+ "auto-cols": [{
1001
+ "auto-cols": scaleGridAutoColsRows()
1002
+ }],
1003
+ /**
1004
+ * Grid Auto Rows
1005
+ * @see https://tailwindcss.com/docs/grid-auto-rows
1006
+ */
1007
+ "auto-rows": [{
1008
+ "auto-rows": scaleGridAutoColsRows()
1009
+ }],
1010
+ /**
1011
+ * Gap
1012
+ * @see https://tailwindcss.com/docs/gap
1013
+ */
1014
+ gap: [{
1015
+ gap: scaleUnambiguousSpacing()
1016
+ }],
1017
+ /**
1018
+ * Gap X
1019
+ * @see https://tailwindcss.com/docs/gap
1020
+ */
1021
+ "gap-x": [{
1022
+ "gap-x": scaleUnambiguousSpacing()
1023
+ }],
1024
+ /**
1025
+ * Gap Y
1026
+ * @see https://tailwindcss.com/docs/gap
1027
+ */
1028
+ "gap-y": [{
1029
+ "gap-y": scaleUnambiguousSpacing()
1030
+ }],
1031
+ /**
1032
+ * Justify Content
1033
+ * @see https://tailwindcss.com/docs/justify-content
1034
+ */
1035
+ "justify-content": [{
1036
+ justify: [...scaleAlignPrimaryAxis(), "normal"]
1037
+ }],
1038
+ /**
1039
+ * Justify Items
1040
+ * @see https://tailwindcss.com/docs/justify-items
1041
+ */
1042
+ "justify-items": [{
1043
+ "justify-items": [...scaleAlignSecondaryAxis(), "normal"]
1044
+ }],
1045
+ /**
1046
+ * Justify Self
1047
+ * @see https://tailwindcss.com/docs/justify-self
1048
+ */
1049
+ "justify-self": [{
1050
+ "justify-self": ["auto", ...scaleAlignSecondaryAxis()]
1051
+ }],
1052
+ /**
1053
+ * Align Content
1054
+ * @see https://tailwindcss.com/docs/align-content
1055
+ */
1056
+ "align-content": [{
1057
+ content: ["normal", ...scaleAlignPrimaryAxis()]
1058
+ }],
1059
+ /**
1060
+ * Align Items
1061
+ * @see https://tailwindcss.com/docs/align-items
1062
+ */
1063
+ "align-items": [{
1064
+ items: [...scaleAlignSecondaryAxis(), {
1065
+ baseline: ["", "last"]
1066
+ }]
1067
+ }],
1068
+ /**
1069
+ * Align Self
1070
+ * @see https://tailwindcss.com/docs/align-self
1071
+ */
1072
+ "align-self": [{
1073
+ self: ["auto", ...scaleAlignSecondaryAxis(), {
1074
+ baseline: ["", "last"]
1075
+ }]
1076
+ }],
1077
+ /**
1078
+ * Place Content
1079
+ * @see https://tailwindcss.com/docs/place-content
1080
+ */
1081
+ "place-content": [{
1082
+ "place-content": scaleAlignPrimaryAxis()
1083
+ }],
1084
+ /**
1085
+ * Place Items
1086
+ * @see https://tailwindcss.com/docs/place-items
1087
+ */
1088
+ "place-items": [{
1089
+ "place-items": [...scaleAlignSecondaryAxis(), "baseline"]
1090
+ }],
1091
+ /**
1092
+ * Place Self
1093
+ * @see https://tailwindcss.com/docs/place-self
1094
+ */
1095
+ "place-self": [{
1096
+ "place-self": ["auto", ...scaleAlignSecondaryAxis()]
1097
+ }],
1098
+ // Spacing
1099
+ /**
1100
+ * Padding
1101
+ * @see https://tailwindcss.com/docs/padding
1102
+ */
1103
+ p: [{
1104
+ p: scaleUnambiguousSpacing()
1105
+ }],
1106
+ /**
1107
+ * Padding X
1108
+ * @see https://tailwindcss.com/docs/padding
1109
+ */
1110
+ px: [{
1111
+ px: scaleUnambiguousSpacing()
1112
+ }],
1113
+ /**
1114
+ * Padding Y
1115
+ * @see https://tailwindcss.com/docs/padding
1116
+ */
1117
+ py: [{
1118
+ py: scaleUnambiguousSpacing()
1119
+ }],
1120
+ /**
1121
+ * Padding Start
1122
+ * @see https://tailwindcss.com/docs/padding
1123
+ */
1124
+ ps: [{
1125
+ ps: scaleUnambiguousSpacing()
1126
+ }],
1127
+ /**
1128
+ * Padding End
1129
+ * @see https://tailwindcss.com/docs/padding
1130
+ */
1131
+ pe: [{
1132
+ pe: scaleUnambiguousSpacing()
1133
+ }],
1134
+ /**
1135
+ * Padding Top
1136
+ * @see https://tailwindcss.com/docs/padding
1137
+ */
1138
+ pt: [{
1139
+ pt: scaleUnambiguousSpacing()
1140
+ }],
1141
+ /**
1142
+ * Padding Right
1143
+ * @see https://tailwindcss.com/docs/padding
1144
+ */
1145
+ pr: [{
1146
+ pr: scaleUnambiguousSpacing()
1147
+ }],
1148
+ /**
1149
+ * Padding Bottom
1150
+ * @see https://tailwindcss.com/docs/padding
1151
+ */
1152
+ pb: [{
1153
+ pb: scaleUnambiguousSpacing()
1154
+ }],
1155
+ /**
1156
+ * Padding Left
1157
+ * @see https://tailwindcss.com/docs/padding
1158
+ */
1159
+ pl: [{
1160
+ pl: scaleUnambiguousSpacing()
1161
+ }],
1162
+ /**
1163
+ * Margin
1164
+ * @see https://tailwindcss.com/docs/margin
1165
+ */
1166
+ m: [{
1167
+ m: scaleMargin()
1168
+ }],
1169
+ /**
1170
+ * Margin X
1171
+ * @see https://tailwindcss.com/docs/margin
1172
+ */
1173
+ mx: [{
1174
+ mx: scaleMargin()
1175
+ }],
1176
+ /**
1177
+ * Margin Y
1178
+ * @see https://tailwindcss.com/docs/margin
1179
+ */
1180
+ my: [{
1181
+ my: scaleMargin()
1182
+ }],
1183
+ /**
1184
+ * Margin Start
1185
+ * @see https://tailwindcss.com/docs/margin
1186
+ */
1187
+ ms: [{
1188
+ ms: scaleMargin()
1189
+ }],
1190
+ /**
1191
+ * Margin End
1192
+ * @see https://tailwindcss.com/docs/margin
1193
+ */
1194
+ me: [{
1195
+ me: scaleMargin()
1196
+ }],
1197
+ /**
1198
+ * Margin Top
1199
+ * @see https://tailwindcss.com/docs/margin
1200
+ */
1201
+ mt: [{
1202
+ mt: scaleMargin()
1203
+ }],
1204
+ /**
1205
+ * Margin Right
1206
+ * @see https://tailwindcss.com/docs/margin
1207
+ */
1208
+ mr: [{
1209
+ mr: scaleMargin()
1210
+ }],
1211
+ /**
1212
+ * Margin Bottom
1213
+ * @see https://tailwindcss.com/docs/margin
1214
+ */
1215
+ mb: [{
1216
+ mb: scaleMargin()
1217
+ }],
1218
+ /**
1219
+ * Margin Left
1220
+ * @see https://tailwindcss.com/docs/margin
1221
+ */
1222
+ ml: [{
1223
+ ml: scaleMargin()
1224
+ }],
1225
+ /**
1226
+ * Space Between X
1227
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1228
+ */
1229
+ "space-x": [{
1230
+ "space-x": scaleUnambiguousSpacing()
1231
+ }],
1232
+ /**
1233
+ * Space Between X Reverse
1234
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1235
+ */
1236
+ "space-x-reverse": ["space-x-reverse"],
1237
+ /**
1238
+ * Space Between Y
1239
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1240
+ */
1241
+ "space-y": [{
1242
+ "space-y": scaleUnambiguousSpacing()
1243
+ }],
1244
+ /**
1245
+ * Space Between Y Reverse
1246
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1247
+ */
1248
+ "space-y-reverse": ["space-y-reverse"],
1249
+ // --------------
1250
+ // --- Sizing ---
1251
+ // --------------
1252
+ /**
1253
+ * Size
1254
+ * @see https://tailwindcss.com/docs/width#setting-both-width-and-height
1255
+ */
1256
+ size: [{
1257
+ size: scaleSizing()
1258
+ }],
1259
+ /**
1260
+ * Width
1261
+ * @see https://tailwindcss.com/docs/width
1262
+ */
1263
+ w: [{
1264
+ w: [themeContainer, "screen", ...scaleSizing()]
1265
+ }],
1266
+ /**
1267
+ * Min-Width
1268
+ * @see https://tailwindcss.com/docs/min-width
1269
+ */
1270
+ "min-w": [{
1271
+ "min-w": [
1272
+ themeContainer,
1273
+ "screen",
1274
+ /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
1275
+ "none",
1276
+ ...scaleSizing()
1277
+ ]
1278
+ }],
1279
+ /**
1280
+ * Max-Width
1281
+ * @see https://tailwindcss.com/docs/max-width
1282
+ */
1283
+ "max-w": [{
1284
+ "max-w": [
1285
+ themeContainer,
1286
+ "screen",
1287
+ "none",
1288
+ /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
1289
+ "prose",
1290
+ /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
1291
+ {
1292
+ screen: [themeBreakpoint]
1293
+ },
1294
+ ...scaleSizing()
1295
+ ]
1296
+ }],
1297
+ /**
1298
+ * Height
1299
+ * @see https://tailwindcss.com/docs/height
1300
+ */
1301
+ h: [{
1302
+ h: ["screen", "lh", ...scaleSizing()]
1303
+ }],
1304
+ /**
1305
+ * Min-Height
1306
+ * @see https://tailwindcss.com/docs/min-height
1307
+ */
1308
+ "min-h": [{
1309
+ "min-h": ["screen", "lh", "none", ...scaleSizing()]
1310
+ }],
1311
+ /**
1312
+ * Max-Height
1313
+ * @see https://tailwindcss.com/docs/max-height
1314
+ */
1315
+ "max-h": [{
1316
+ "max-h": ["screen", "lh", ...scaleSizing()]
1317
+ }],
1318
+ // ------------------
1319
+ // --- Typography ---
1320
+ // ------------------
1321
+ /**
1322
+ * Font Size
1323
+ * @see https://tailwindcss.com/docs/font-size
1324
+ */
1325
+ "font-size": [{
1326
+ text: ["base", themeText, isArbitraryVariableLength, isArbitraryLength]
1327
+ }],
1328
+ /**
1329
+ * Font Smoothing
1330
+ * @see https://tailwindcss.com/docs/font-smoothing
1331
+ */
1332
+ "font-smoothing": ["antialiased", "subpixel-antialiased"],
1333
+ /**
1334
+ * Font Style
1335
+ * @see https://tailwindcss.com/docs/font-style
1336
+ */
1337
+ "font-style": ["italic", "not-italic"],
1338
+ /**
1339
+ * Font Weight
1340
+ * @see https://tailwindcss.com/docs/font-weight
1341
+ */
1342
+ "font-weight": [{
1343
+ font: [themeFontWeight, isArbitraryVariable, isArbitraryNumber]
1344
+ }],
1345
+ /**
1346
+ * Font Stretch
1347
+ * @see https://tailwindcss.com/docs/font-stretch
1348
+ */
1349
+ "font-stretch": [{
1350
+ "font-stretch": ["ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "normal", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", isPercent, isArbitraryValue]
1351
+ }],
1352
+ /**
1353
+ * Font Family
1354
+ * @see https://tailwindcss.com/docs/font-family
1355
+ */
1356
+ "font-family": [{
1357
+ font: [isArbitraryVariableFamilyName, isArbitraryValue, themeFont]
1358
+ }],
1359
+ /**
1360
+ * Font Variant Numeric
1361
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1362
+ */
1363
+ "fvn-normal": ["normal-nums"],
1364
+ /**
1365
+ * Font Variant Numeric
1366
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1367
+ */
1368
+ "fvn-ordinal": ["ordinal"],
1369
+ /**
1370
+ * Font Variant Numeric
1371
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1372
+ */
1373
+ "fvn-slashed-zero": ["slashed-zero"],
1374
+ /**
1375
+ * Font Variant Numeric
1376
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1377
+ */
1378
+ "fvn-figure": ["lining-nums", "oldstyle-nums"],
1379
+ /**
1380
+ * Font Variant Numeric
1381
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1382
+ */
1383
+ "fvn-spacing": ["proportional-nums", "tabular-nums"],
1384
+ /**
1385
+ * Font Variant Numeric
1386
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1387
+ */
1388
+ "fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
1389
+ /**
1390
+ * Letter Spacing
1391
+ * @see https://tailwindcss.com/docs/letter-spacing
1392
+ */
1393
+ tracking: [{
1394
+ tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]
1395
+ }],
1396
+ /**
1397
+ * Line Clamp
1398
+ * @see https://tailwindcss.com/docs/line-clamp
1399
+ */
1400
+ "line-clamp": [{
1401
+ "line-clamp": [isNumber, "none", isArbitraryVariable, isArbitraryNumber]
1402
+ }],
1403
+ /**
1404
+ * Line Height
1405
+ * @see https://tailwindcss.com/docs/line-height
1406
+ */
1407
+ leading: [{
1408
+ leading: [
1409
+ /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */
1410
+ themeLeading,
1411
+ ...scaleUnambiguousSpacing()
1412
+ ]
1413
+ }],
1414
+ /**
1415
+ * List Style Image
1416
+ * @see https://tailwindcss.com/docs/list-style-image
1417
+ */
1418
+ "list-image": [{
1419
+ "list-image": ["none", isArbitraryVariable, isArbitraryValue]
1420
+ }],
1421
+ /**
1422
+ * List Style Position
1423
+ * @see https://tailwindcss.com/docs/list-style-position
1424
+ */
1425
+ "list-style-position": [{
1426
+ list: ["inside", "outside"]
1427
+ }],
1428
+ /**
1429
+ * List Style Type
1430
+ * @see https://tailwindcss.com/docs/list-style-type
1431
+ */
1432
+ "list-style-type": [{
1433
+ list: ["disc", "decimal", "none", isArbitraryVariable, isArbitraryValue]
1434
+ }],
1435
+ /**
1436
+ * Text Alignment
1437
+ * @see https://tailwindcss.com/docs/text-align
1438
+ */
1439
+ "text-alignment": [{
1440
+ text: ["left", "center", "right", "justify", "start", "end"]
1441
+ }],
1442
+ /**
1443
+ * Placeholder Color
1444
+ * @deprecated since Tailwind CSS v3.0.0
1445
+ * @see https://v3.tailwindcss.com/docs/placeholder-color
1446
+ */
1447
+ "placeholder-color": [{
1448
+ placeholder: scaleColor()
1449
+ }],
1450
+ /**
1451
+ * Text Color
1452
+ * @see https://tailwindcss.com/docs/text-color
1453
+ */
1454
+ "text-color": [{
1455
+ text: scaleColor()
1456
+ }],
1457
+ /**
1458
+ * Text Decoration
1459
+ * @see https://tailwindcss.com/docs/text-decoration
1460
+ */
1461
+ "text-decoration": ["underline", "overline", "line-through", "no-underline"],
1462
+ /**
1463
+ * Text Decoration Style
1464
+ * @see https://tailwindcss.com/docs/text-decoration-style
1465
+ */
1466
+ "text-decoration-style": [{
1467
+ decoration: [...scaleLineStyle(), "wavy"]
1468
+ }],
1469
+ /**
1470
+ * Text Decoration Thickness
1471
+ * @see https://tailwindcss.com/docs/text-decoration-thickness
1472
+ */
1473
+ "text-decoration-thickness": [{
1474
+ decoration: [isNumber, "from-font", "auto", isArbitraryVariable, isArbitraryLength]
1475
+ }],
1476
+ /**
1477
+ * Text Decoration Color
1478
+ * @see https://tailwindcss.com/docs/text-decoration-color
1479
+ */
1480
+ "text-decoration-color": [{
1481
+ decoration: scaleColor()
1482
+ }],
1483
+ /**
1484
+ * Text Underline Offset
1485
+ * @see https://tailwindcss.com/docs/text-underline-offset
1486
+ */
1487
+ "underline-offset": [{
1488
+ "underline-offset": [isNumber, "auto", isArbitraryVariable, isArbitraryValue]
1489
+ }],
1490
+ /**
1491
+ * Text Transform
1492
+ * @see https://tailwindcss.com/docs/text-transform
1493
+ */
1494
+ "text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"],
1495
+ /**
1496
+ * Text Overflow
1497
+ * @see https://tailwindcss.com/docs/text-overflow
1498
+ */
1499
+ "text-overflow": ["truncate", "text-ellipsis", "text-clip"],
1500
+ /**
1501
+ * Text Wrap
1502
+ * @see https://tailwindcss.com/docs/text-wrap
1503
+ */
1504
+ "text-wrap": [{
1505
+ text: ["wrap", "nowrap", "balance", "pretty"]
1506
+ }],
1507
+ /**
1508
+ * Text Indent
1509
+ * @see https://tailwindcss.com/docs/text-indent
1510
+ */
1511
+ indent: [{
1512
+ indent: scaleUnambiguousSpacing()
1513
+ }],
1514
+ /**
1515
+ * Vertical Alignment
1516
+ * @see https://tailwindcss.com/docs/vertical-align
1517
+ */
1518
+ "vertical-align": [{
1519
+ align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryVariable, isArbitraryValue]
1520
+ }],
1521
+ /**
1522
+ * Whitespace
1523
+ * @see https://tailwindcss.com/docs/whitespace
1524
+ */
1525
+ whitespace: [{
1526
+ whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"]
1527
+ }],
1528
+ /**
1529
+ * Word Break
1530
+ * @see https://tailwindcss.com/docs/word-break
1531
+ */
1532
+ break: [{
1533
+ break: ["normal", "words", "all", "keep"]
1534
+ }],
1535
+ /**
1536
+ * Overflow Wrap
1537
+ * @see https://tailwindcss.com/docs/overflow-wrap
1538
+ */
1539
+ wrap: [{
1540
+ wrap: ["break-word", "anywhere", "normal"]
1541
+ }],
1542
+ /**
1543
+ * Hyphens
1544
+ * @see https://tailwindcss.com/docs/hyphens
1545
+ */
1546
+ hyphens: [{
1547
+ hyphens: ["none", "manual", "auto"]
1548
+ }],
1549
+ /**
1550
+ * Content
1551
+ * @see https://tailwindcss.com/docs/content
1552
+ */
1553
+ content: [{
1554
+ content: ["none", isArbitraryVariable, isArbitraryValue]
1555
+ }],
1556
+ // -------------------
1557
+ // --- Backgrounds ---
1558
+ // -------------------
1559
+ /**
1560
+ * Background Attachment
1561
+ * @see https://tailwindcss.com/docs/background-attachment
1562
+ */
1563
+ "bg-attachment": [{
1564
+ bg: ["fixed", "local", "scroll"]
1565
+ }],
1566
+ /**
1567
+ * Background Clip
1568
+ * @see https://tailwindcss.com/docs/background-clip
1569
+ */
1570
+ "bg-clip": [{
1571
+ "bg-clip": ["border", "padding", "content", "text"]
1572
+ }],
1573
+ /**
1574
+ * Background Origin
1575
+ * @see https://tailwindcss.com/docs/background-origin
1576
+ */
1577
+ "bg-origin": [{
1578
+ "bg-origin": ["border", "padding", "content"]
1579
+ }],
1580
+ /**
1581
+ * Background Position
1582
+ * @see https://tailwindcss.com/docs/background-position
1583
+ */
1584
+ "bg-position": [{
1585
+ bg: scaleBgPosition()
1586
+ }],
1587
+ /**
1588
+ * Background Repeat
1589
+ * @see https://tailwindcss.com/docs/background-repeat
1590
+ */
1591
+ "bg-repeat": [{
1592
+ bg: scaleBgRepeat()
1593
+ }],
1594
+ /**
1595
+ * Background Size
1596
+ * @see https://tailwindcss.com/docs/background-size
1597
+ */
1598
+ "bg-size": [{
1599
+ bg: scaleBgSize()
1600
+ }],
1601
+ /**
1602
+ * Background Image
1603
+ * @see https://tailwindcss.com/docs/background-image
1604
+ */
1605
+ "bg-image": [{
1606
+ bg: ["none", {
1607
+ linear: [{
1608
+ to: ["t", "tr", "r", "br", "b", "bl", "l", "tl"]
1609
+ }, isInteger, isArbitraryVariable, isArbitraryValue],
1610
+ radial: ["", isArbitraryVariable, isArbitraryValue],
1611
+ conic: [isInteger, isArbitraryVariable, isArbitraryValue]
1612
+ }, isArbitraryVariableImage, isArbitraryImage]
1613
+ }],
1614
+ /**
1615
+ * Background Color
1616
+ * @see https://tailwindcss.com/docs/background-color
1617
+ */
1618
+ "bg-color": [{
1619
+ bg: scaleColor()
1620
+ }],
1621
+ /**
1622
+ * Gradient Color Stops From Position
1623
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1624
+ */
1625
+ "gradient-from-pos": [{
1626
+ from: scaleGradientStopPosition()
1627
+ }],
1628
+ /**
1629
+ * Gradient Color Stops Via Position
1630
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1631
+ */
1632
+ "gradient-via-pos": [{
1633
+ via: scaleGradientStopPosition()
1634
+ }],
1635
+ /**
1636
+ * Gradient Color Stops To Position
1637
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1638
+ */
1639
+ "gradient-to-pos": [{
1640
+ to: scaleGradientStopPosition()
1641
+ }],
1642
+ /**
1643
+ * Gradient Color Stops From
1644
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1645
+ */
1646
+ "gradient-from": [{
1647
+ from: scaleColor()
1648
+ }],
1649
+ /**
1650
+ * Gradient Color Stops Via
1651
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1652
+ */
1653
+ "gradient-via": [{
1654
+ via: scaleColor()
1655
+ }],
1656
+ /**
1657
+ * Gradient Color Stops To
1658
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1659
+ */
1660
+ "gradient-to": [{
1661
+ to: scaleColor()
1662
+ }],
1663
+ // ---------------
1664
+ // --- Borders ---
1665
+ // ---------------
1666
+ /**
1667
+ * Border Radius
1668
+ * @see https://tailwindcss.com/docs/border-radius
1669
+ */
1670
+ rounded: [{
1671
+ rounded: scaleRadius()
1672
+ }],
1673
+ /**
1674
+ * Border Radius Start
1675
+ * @see https://tailwindcss.com/docs/border-radius
1676
+ */
1677
+ "rounded-s": [{
1678
+ "rounded-s": scaleRadius()
1679
+ }],
1680
+ /**
1681
+ * Border Radius End
1682
+ * @see https://tailwindcss.com/docs/border-radius
1683
+ */
1684
+ "rounded-e": [{
1685
+ "rounded-e": scaleRadius()
1686
+ }],
1687
+ /**
1688
+ * Border Radius Top
1689
+ * @see https://tailwindcss.com/docs/border-radius
1690
+ */
1691
+ "rounded-t": [{
1692
+ "rounded-t": scaleRadius()
1693
+ }],
1694
+ /**
1695
+ * Border Radius Right
1696
+ * @see https://tailwindcss.com/docs/border-radius
1697
+ */
1698
+ "rounded-r": [{
1699
+ "rounded-r": scaleRadius()
1700
+ }],
1701
+ /**
1702
+ * Border Radius Bottom
1703
+ * @see https://tailwindcss.com/docs/border-radius
1704
+ */
1705
+ "rounded-b": [{
1706
+ "rounded-b": scaleRadius()
1707
+ }],
1708
+ /**
1709
+ * Border Radius Left
1710
+ * @see https://tailwindcss.com/docs/border-radius
1711
+ */
1712
+ "rounded-l": [{
1713
+ "rounded-l": scaleRadius()
1714
+ }],
1715
+ /**
1716
+ * Border Radius Start Start
1717
+ * @see https://tailwindcss.com/docs/border-radius
1718
+ */
1719
+ "rounded-ss": [{
1720
+ "rounded-ss": scaleRadius()
1721
+ }],
1722
+ /**
1723
+ * Border Radius Start End
1724
+ * @see https://tailwindcss.com/docs/border-radius
1725
+ */
1726
+ "rounded-se": [{
1727
+ "rounded-se": scaleRadius()
1728
+ }],
1729
+ /**
1730
+ * Border Radius End End
1731
+ * @see https://tailwindcss.com/docs/border-radius
1732
+ */
1733
+ "rounded-ee": [{
1734
+ "rounded-ee": scaleRadius()
1735
+ }],
1736
+ /**
1737
+ * Border Radius End Start
1738
+ * @see https://tailwindcss.com/docs/border-radius
1739
+ */
1740
+ "rounded-es": [{
1741
+ "rounded-es": scaleRadius()
1742
+ }],
1743
+ /**
1744
+ * Border Radius Top Left
1745
+ * @see https://tailwindcss.com/docs/border-radius
1746
+ */
1747
+ "rounded-tl": [{
1748
+ "rounded-tl": scaleRadius()
1749
+ }],
1750
+ /**
1751
+ * Border Radius Top Right
1752
+ * @see https://tailwindcss.com/docs/border-radius
1753
+ */
1754
+ "rounded-tr": [{
1755
+ "rounded-tr": scaleRadius()
1756
+ }],
1757
+ /**
1758
+ * Border Radius Bottom Right
1759
+ * @see https://tailwindcss.com/docs/border-radius
1760
+ */
1761
+ "rounded-br": [{
1762
+ "rounded-br": scaleRadius()
1763
+ }],
1764
+ /**
1765
+ * Border Radius Bottom Left
1766
+ * @see https://tailwindcss.com/docs/border-radius
1767
+ */
1768
+ "rounded-bl": [{
1769
+ "rounded-bl": scaleRadius()
1770
+ }],
1771
+ /**
1772
+ * Border Width
1773
+ * @see https://tailwindcss.com/docs/border-width
1774
+ */
1775
+ "border-w": [{
1776
+ border: scaleBorderWidth()
1777
+ }],
1778
+ /**
1779
+ * Border Width X
1780
+ * @see https://tailwindcss.com/docs/border-width
1781
+ */
1782
+ "border-w-x": [{
1783
+ "border-x": scaleBorderWidth()
1784
+ }],
1785
+ /**
1786
+ * Border Width Y
1787
+ * @see https://tailwindcss.com/docs/border-width
1788
+ */
1789
+ "border-w-y": [{
1790
+ "border-y": scaleBorderWidth()
1791
+ }],
1792
+ /**
1793
+ * Border Width Start
1794
+ * @see https://tailwindcss.com/docs/border-width
1795
+ */
1796
+ "border-w-s": [{
1797
+ "border-s": scaleBorderWidth()
1798
+ }],
1799
+ /**
1800
+ * Border Width End
1801
+ * @see https://tailwindcss.com/docs/border-width
1802
+ */
1803
+ "border-w-e": [{
1804
+ "border-e": scaleBorderWidth()
1805
+ }],
1806
+ /**
1807
+ * Border Width Top
1808
+ * @see https://tailwindcss.com/docs/border-width
1809
+ */
1810
+ "border-w-t": [{
1811
+ "border-t": scaleBorderWidth()
1812
+ }],
1813
+ /**
1814
+ * Border Width Right
1815
+ * @see https://tailwindcss.com/docs/border-width
1816
+ */
1817
+ "border-w-r": [{
1818
+ "border-r": scaleBorderWidth()
1819
+ }],
1820
+ /**
1821
+ * Border Width Bottom
1822
+ * @see https://tailwindcss.com/docs/border-width
1823
+ */
1824
+ "border-w-b": [{
1825
+ "border-b": scaleBorderWidth()
1826
+ }],
1827
+ /**
1828
+ * Border Width Left
1829
+ * @see https://tailwindcss.com/docs/border-width
1830
+ */
1831
+ "border-w-l": [{
1832
+ "border-l": scaleBorderWidth()
1833
+ }],
1834
+ /**
1835
+ * Divide Width X
1836
+ * @see https://tailwindcss.com/docs/border-width#between-children
1837
+ */
1838
+ "divide-x": [{
1839
+ "divide-x": scaleBorderWidth()
1840
+ }],
1841
+ /**
1842
+ * Divide Width X Reverse
1843
+ * @see https://tailwindcss.com/docs/border-width#between-children
1844
+ */
1845
+ "divide-x-reverse": ["divide-x-reverse"],
1846
+ /**
1847
+ * Divide Width Y
1848
+ * @see https://tailwindcss.com/docs/border-width#between-children
1849
+ */
1850
+ "divide-y": [{
1851
+ "divide-y": scaleBorderWidth()
1852
+ }],
1853
+ /**
1854
+ * Divide Width Y Reverse
1855
+ * @see https://tailwindcss.com/docs/border-width#between-children
1856
+ */
1857
+ "divide-y-reverse": ["divide-y-reverse"],
1858
+ /**
1859
+ * Border Style
1860
+ * @see https://tailwindcss.com/docs/border-style
1861
+ */
1862
+ "border-style": [{
1863
+ border: [...scaleLineStyle(), "hidden", "none"]
1864
+ }],
1865
+ /**
1866
+ * Divide Style
1867
+ * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style
1868
+ */
1869
+ "divide-style": [{
1870
+ divide: [...scaleLineStyle(), "hidden", "none"]
1871
+ }],
1872
+ /**
1873
+ * Border Color
1874
+ * @see https://tailwindcss.com/docs/border-color
1875
+ */
1876
+ "border-color": [{
1877
+ border: scaleColor()
1878
+ }],
1879
+ /**
1880
+ * Border Color X
1881
+ * @see https://tailwindcss.com/docs/border-color
1882
+ */
1883
+ "border-color-x": [{
1884
+ "border-x": scaleColor()
1885
+ }],
1886
+ /**
1887
+ * Border Color Y
1888
+ * @see https://tailwindcss.com/docs/border-color
1889
+ */
1890
+ "border-color-y": [{
1891
+ "border-y": scaleColor()
1892
+ }],
1893
+ /**
1894
+ * Border Color S
1895
+ * @see https://tailwindcss.com/docs/border-color
1896
+ */
1897
+ "border-color-s": [{
1898
+ "border-s": scaleColor()
1899
+ }],
1900
+ /**
1901
+ * Border Color E
1902
+ * @see https://tailwindcss.com/docs/border-color
1903
+ */
1904
+ "border-color-e": [{
1905
+ "border-e": scaleColor()
1906
+ }],
1907
+ /**
1908
+ * Border Color Top
1909
+ * @see https://tailwindcss.com/docs/border-color
1910
+ */
1911
+ "border-color-t": [{
1912
+ "border-t": scaleColor()
1913
+ }],
1914
+ /**
1915
+ * Border Color Right
1916
+ * @see https://tailwindcss.com/docs/border-color
1917
+ */
1918
+ "border-color-r": [{
1919
+ "border-r": scaleColor()
1920
+ }],
1921
+ /**
1922
+ * Border Color Bottom
1923
+ * @see https://tailwindcss.com/docs/border-color
1924
+ */
1925
+ "border-color-b": [{
1926
+ "border-b": scaleColor()
1927
+ }],
1928
+ /**
1929
+ * Border Color Left
1930
+ * @see https://tailwindcss.com/docs/border-color
1931
+ */
1932
+ "border-color-l": [{
1933
+ "border-l": scaleColor()
1934
+ }],
1935
+ /**
1936
+ * Divide Color
1937
+ * @see https://tailwindcss.com/docs/divide-color
1938
+ */
1939
+ "divide-color": [{
1940
+ divide: scaleColor()
1941
+ }],
1942
+ /**
1943
+ * Outline Style
1944
+ * @see https://tailwindcss.com/docs/outline-style
1945
+ */
1946
+ "outline-style": [{
1947
+ outline: [...scaleLineStyle(), "none", "hidden"]
1948
+ }],
1949
+ /**
1950
+ * Outline Offset
1951
+ * @see https://tailwindcss.com/docs/outline-offset
1952
+ */
1953
+ "outline-offset": [{
1954
+ "outline-offset": [isNumber, isArbitraryVariable, isArbitraryValue]
1955
+ }],
1956
+ /**
1957
+ * Outline Width
1958
+ * @see https://tailwindcss.com/docs/outline-width
1959
+ */
1960
+ "outline-w": [{
1961
+ outline: ["", isNumber, isArbitraryVariableLength, isArbitraryLength]
1962
+ }],
1963
+ /**
1964
+ * Outline Color
1965
+ * @see https://tailwindcss.com/docs/outline-color
1966
+ */
1967
+ "outline-color": [{
1968
+ outline: scaleColor()
1969
+ }],
1970
+ // ---------------
1971
+ // --- Effects ---
1972
+ // ---------------
1973
+ /**
1974
+ * Box Shadow
1975
+ * @see https://tailwindcss.com/docs/box-shadow
1976
+ */
1977
+ shadow: [{
1978
+ shadow: [
1979
+ // Deprecated since Tailwind CSS v4.0.0
1980
+ "",
1981
+ "none",
1982
+ themeShadow,
1983
+ isArbitraryVariableShadow,
1984
+ isArbitraryShadow
1985
+ ]
1986
+ }],
1987
+ /**
1988
+ * Box Shadow Color
1989
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color
1990
+ */
1991
+ "shadow-color": [{
1992
+ shadow: scaleColor()
1993
+ }],
1994
+ /**
1995
+ * Inset Box Shadow
1996
+ * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow
1997
+ */
1998
+ "inset-shadow": [{
1999
+ "inset-shadow": ["none", themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]
2000
+ }],
2001
+ /**
2002
+ * Inset Box Shadow Color
2003
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color
2004
+ */
2005
+ "inset-shadow-color": [{
2006
+ "inset-shadow": scaleColor()
2007
+ }],
2008
+ /**
2009
+ * Ring Width
2010
+ * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring
2011
+ */
2012
+ "ring-w": [{
2013
+ ring: scaleBorderWidth()
2014
+ }],
2015
+ /**
2016
+ * Ring Width Inset
2017
+ * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings
2018
+ * @deprecated since Tailwind CSS v4.0.0
2019
+ * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
2020
+ */
2021
+ "ring-w-inset": ["ring-inset"],
2022
+ /**
2023
+ * Ring Color
2024
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color
2025
+ */
2026
+ "ring-color": [{
2027
+ ring: scaleColor()
2028
+ }],
2029
+ /**
2030
+ * Ring Offset Width
2031
+ * @see https://v3.tailwindcss.com/docs/ring-offset-width
2032
+ * @deprecated since Tailwind CSS v4.0.0
2033
+ * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
2034
+ */
2035
+ "ring-offset-w": [{
2036
+ "ring-offset": [isNumber, isArbitraryLength]
2037
+ }],
2038
+ /**
2039
+ * Ring Offset Color
2040
+ * @see https://v3.tailwindcss.com/docs/ring-offset-color
2041
+ * @deprecated since Tailwind CSS v4.0.0
2042
+ * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
2043
+ */
2044
+ "ring-offset-color": [{
2045
+ "ring-offset": scaleColor()
2046
+ }],
2047
+ /**
2048
+ * Inset Ring Width
2049
+ * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring
2050
+ */
2051
+ "inset-ring-w": [{
2052
+ "inset-ring": scaleBorderWidth()
2053
+ }],
2054
+ /**
2055
+ * Inset Ring Color
2056
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color
2057
+ */
2058
+ "inset-ring-color": [{
2059
+ "inset-ring": scaleColor()
2060
+ }],
2061
+ /**
2062
+ * Text Shadow
2063
+ * @see https://tailwindcss.com/docs/text-shadow
2064
+ */
2065
+ "text-shadow": [{
2066
+ "text-shadow": ["none", themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]
2067
+ }],
2068
+ /**
2069
+ * Text Shadow Color
2070
+ * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color
2071
+ */
2072
+ "text-shadow-color": [{
2073
+ "text-shadow": scaleColor()
2074
+ }],
2075
+ /**
2076
+ * Opacity
2077
+ * @see https://tailwindcss.com/docs/opacity
2078
+ */
2079
+ opacity: [{
2080
+ opacity: [isNumber, isArbitraryVariable, isArbitraryValue]
2081
+ }],
2082
+ /**
2083
+ * Mix Blend Mode
2084
+ * @see https://tailwindcss.com/docs/mix-blend-mode
2085
+ */
2086
+ "mix-blend": [{
2087
+ "mix-blend": [...scaleBlendMode(), "plus-darker", "plus-lighter"]
2088
+ }],
2089
+ /**
2090
+ * Background Blend Mode
2091
+ * @see https://tailwindcss.com/docs/background-blend-mode
2092
+ */
2093
+ "bg-blend": [{
2094
+ "bg-blend": scaleBlendMode()
2095
+ }],
2096
+ /**
2097
+ * Mask Clip
2098
+ * @see https://tailwindcss.com/docs/mask-clip
2099
+ */
2100
+ "mask-clip": [{
2101
+ "mask-clip": ["border", "padding", "content", "fill", "stroke", "view"]
2102
+ }, "mask-no-clip"],
2103
+ /**
2104
+ * Mask Composite
2105
+ * @see https://tailwindcss.com/docs/mask-composite
2106
+ */
2107
+ "mask-composite": [{
2108
+ mask: ["add", "subtract", "intersect", "exclude"]
2109
+ }],
2110
+ /**
2111
+ * Mask Image
2112
+ * @see https://tailwindcss.com/docs/mask-image
2113
+ */
2114
+ "mask-image-linear-pos": [{
2115
+ "mask-linear": [isNumber]
2116
+ }],
2117
+ "mask-image-linear-from-pos": [{
2118
+ "mask-linear-from": scaleMaskImagePosition()
2119
+ }],
2120
+ "mask-image-linear-to-pos": [{
2121
+ "mask-linear-to": scaleMaskImagePosition()
2122
+ }],
2123
+ "mask-image-linear-from-color": [{
2124
+ "mask-linear-from": scaleColor()
2125
+ }],
2126
+ "mask-image-linear-to-color": [{
2127
+ "mask-linear-to": scaleColor()
2128
+ }],
2129
+ "mask-image-t-from-pos": [{
2130
+ "mask-t-from": scaleMaskImagePosition()
2131
+ }],
2132
+ "mask-image-t-to-pos": [{
2133
+ "mask-t-to": scaleMaskImagePosition()
2134
+ }],
2135
+ "mask-image-t-from-color": [{
2136
+ "mask-t-from": scaleColor()
2137
+ }],
2138
+ "mask-image-t-to-color": [{
2139
+ "mask-t-to": scaleColor()
2140
+ }],
2141
+ "mask-image-r-from-pos": [{
2142
+ "mask-r-from": scaleMaskImagePosition()
2143
+ }],
2144
+ "mask-image-r-to-pos": [{
2145
+ "mask-r-to": scaleMaskImagePosition()
2146
+ }],
2147
+ "mask-image-r-from-color": [{
2148
+ "mask-r-from": scaleColor()
2149
+ }],
2150
+ "mask-image-r-to-color": [{
2151
+ "mask-r-to": scaleColor()
2152
+ }],
2153
+ "mask-image-b-from-pos": [{
2154
+ "mask-b-from": scaleMaskImagePosition()
2155
+ }],
2156
+ "mask-image-b-to-pos": [{
2157
+ "mask-b-to": scaleMaskImagePosition()
2158
+ }],
2159
+ "mask-image-b-from-color": [{
2160
+ "mask-b-from": scaleColor()
2161
+ }],
2162
+ "mask-image-b-to-color": [{
2163
+ "mask-b-to": scaleColor()
2164
+ }],
2165
+ "mask-image-l-from-pos": [{
2166
+ "mask-l-from": scaleMaskImagePosition()
2167
+ }],
2168
+ "mask-image-l-to-pos": [{
2169
+ "mask-l-to": scaleMaskImagePosition()
2170
+ }],
2171
+ "mask-image-l-from-color": [{
2172
+ "mask-l-from": scaleColor()
2173
+ }],
2174
+ "mask-image-l-to-color": [{
2175
+ "mask-l-to": scaleColor()
2176
+ }],
2177
+ "mask-image-x-from-pos": [{
2178
+ "mask-x-from": scaleMaskImagePosition()
2179
+ }],
2180
+ "mask-image-x-to-pos": [{
2181
+ "mask-x-to": scaleMaskImagePosition()
2182
+ }],
2183
+ "mask-image-x-from-color": [{
2184
+ "mask-x-from": scaleColor()
2185
+ }],
2186
+ "mask-image-x-to-color": [{
2187
+ "mask-x-to": scaleColor()
2188
+ }],
2189
+ "mask-image-y-from-pos": [{
2190
+ "mask-y-from": scaleMaskImagePosition()
2191
+ }],
2192
+ "mask-image-y-to-pos": [{
2193
+ "mask-y-to": scaleMaskImagePosition()
2194
+ }],
2195
+ "mask-image-y-from-color": [{
2196
+ "mask-y-from": scaleColor()
2197
+ }],
2198
+ "mask-image-y-to-color": [{
2199
+ "mask-y-to": scaleColor()
2200
+ }],
2201
+ "mask-image-radial": [{
2202
+ "mask-radial": [isArbitraryVariable, isArbitraryValue]
2203
+ }],
2204
+ "mask-image-radial-from-pos": [{
2205
+ "mask-radial-from": scaleMaskImagePosition()
2206
+ }],
2207
+ "mask-image-radial-to-pos": [{
2208
+ "mask-radial-to": scaleMaskImagePosition()
2209
+ }],
2210
+ "mask-image-radial-from-color": [{
2211
+ "mask-radial-from": scaleColor()
2212
+ }],
2213
+ "mask-image-radial-to-color": [{
2214
+ "mask-radial-to": scaleColor()
2215
+ }],
2216
+ "mask-image-radial-shape": [{
2217
+ "mask-radial": ["circle", "ellipse"]
2218
+ }],
2219
+ "mask-image-radial-size": [{
2220
+ "mask-radial": [{
2221
+ closest: ["side", "corner"],
2222
+ farthest: ["side", "corner"]
2223
+ }]
2224
+ }],
2225
+ "mask-image-radial-pos": [{
2226
+ "mask-radial-at": scalePosition()
2227
+ }],
2228
+ "mask-image-conic-pos": [{
2229
+ "mask-conic": [isNumber]
2230
+ }],
2231
+ "mask-image-conic-from-pos": [{
2232
+ "mask-conic-from": scaleMaskImagePosition()
2233
+ }],
2234
+ "mask-image-conic-to-pos": [{
2235
+ "mask-conic-to": scaleMaskImagePosition()
2236
+ }],
2237
+ "mask-image-conic-from-color": [{
2238
+ "mask-conic-from": scaleColor()
2239
+ }],
2240
+ "mask-image-conic-to-color": [{
2241
+ "mask-conic-to": scaleColor()
2242
+ }],
2243
+ /**
2244
+ * Mask Mode
2245
+ * @see https://tailwindcss.com/docs/mask-mode
2246
+ */
2247
+ "mask-mode": [{
2248
+ mask: ["alpha", "luminance", "match"]
2249
+ }],
2250
+ /**
2251
+ * Mask Origin
2252
+ * @see https://tailwindcss.com/docs/mask-origin
2253
+ */
2254
+ "mask-origin": [{
2255
+ "mask-origin": ["border", "padding", "content", "fill", "stroke", "view"]
2256
+ }],
2257
+ /**
2258
+ * Mask Position
2259
+ * @see https://tailwindcss.com/docs/mask-position
2260
+ */
2261
+ "mask-position": [{
2262
+ mask: scaleBgPosition()
2263
+ }],
2264
+ /**
2265
+ * Mask Repeat
2266
+ * @see https://tailwindcss.com/docs/mask-repeat
2267
+ */
2268
+ "mask-repeat": [{
2269
+ mask: scaleBgRepeat()
2270
+ }],
2271
+ /**
2272
+ * Mask Size
2273
+ * @see https://tailwindcss.com/docs/mask-size
2274
+ */
2275
+ "mask-size": [{
2276
+ mask: scaleBgSize()
2277
+ }],
2278
+ /**
2279
+ * Mask Type
2280
+ * @see https://tailwindcss.com/docs/mask-type
2281
+ */
2282
+ "mask-type": [{
2283
+ "mask-type": ["alpha", "luminance"]
2284
+ }],
2285
+ /**
2286
+ * Mask Image
2287
+ * @see https://tailwindcss.com/docs/mask-image
2288
+ */
2289
+ "mask-image": [{
2290
+ mask: ["none", isArbitraryVariable, isArbitraryValue]
2291
+ }],
2292
+ // ---------------
2293
+ // --- Filters ---
2294
+ // ---------------
2295
+ /**
2296
+ * Filter
2297
+ * @see https://tailwindcss.com/docs/filter
2298
+ */
2299
+ filter: [{
2300
+ filter: [
2301
+ // Deprecated since Tailwind CSS v3.0.0
2302
+ "",
2303
+ "none",
2304
+ isArbitraryVariable,
2305
+ isArbitraryValue
2306
+ ]
2307
+ }],
2308
+ /**
2309
+ * Blur
2310
+ * @see https://tailwindcss.com/docs/blur
2311
+ */
2312
+ blur: [{
2313
+ blur: scaleBlur()
2314
+ }],
2315
+ /**
2316
+ * Brightness
2317
+ * @see https://tailwindcss.com/docs/brightness
2318
+ */
2319
+ brightness: [{
2320
+ brightness: [isNumber, isArbitraryVariable, isArbitraryValue]
2321
+ }],
2322
+ /**
2323
+ * Contrast
2324
+ * @see https://tailwindcss.com/docs/contrast
2325
+ */
2326
+ contrast: [{
2327
+ contrast: [isNumber, isArbitraryVariable, isArbitraryValue]
2328
+ }],
2329
+ /**
2330
+ * Drop Shadow
2331
+ * @see https://tailwindcss.com/docs/drop-shadow
2332
+ */
2333
+ "drop-shadow": [{
2334
+ "drop-shadow": [
2335
+ // Deprecated since Tailwind CSS v4.0.0
2336
+ "",
2337
+ "none",
2338
+ themeDropShadow,
2339
+ isArbitraryVariableShadow,
2340
+ isArbitraryShadow
2341
+ ]
2342
+ }],
2343
+ /**
2344
+ * Drop Shadow Color
2345
+ * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color
2346
+ */
2347
+ "drop-shadow-color": [{
2348
+ "drop-shadow": scaleColor()
2349
+ }],
2350
+ /**
2351
+ * Grayscale
2352
+ * @see https://tailwindcss.com/docs/grayscale
2353
+ */
2354
+ grayscale: [{
2355
+ grayscale: ["", isNumber, isArbitraryVariable, isArbitraryValue]
2356
+ }],
2357
+ /**
2358
+ * Hue Rotate
2359
+ * @see https://tailwindcss.com/docs/hue-rotate
2360
+ */
2361
+ "hue-rotate": [{
2362
+ "hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue]
2363
+ }],
2364
+ /**
2365
+ * Invert
2366
+ * @see https://tailwindcss.com/docs/invert
2367
+ */
2368
+ invert: [{
2369
+ invert: ["", isNumber, isArbitraryVariable, isArbitraryValue]
2370
+ }],
2371
+ /**
2372
+ * Saturate
2373
+ * @see https://tailwindcss.com/docs/saturate
2374
+ */
2375
+ saturate: [{
2376
+ saturate: [isNumber, isArbitraryVariable, isArbitraryValue]
2377
+ }],
2378
+ /**
2379
+ * Sepia
2380
+ * @see https://tailwindcss.com/docs/sepia
2381
+ */
2382
+ sepia: [{
2383
+ sepia: ["", isNumber, isArbitraryVariable, isArbitraryValue]
2384
+ }],
2385
+ /**
2386
+ * Backdrop Filter
2387
+ * @see https://tailwindcss.com/docs/backdrop-filter
2388
+ */
2389
+ "backdrop-filter": [{
2390
+ "backdrop-filter": [
2391
+ // Deprecated since Tailwind CSS v3.0.0
2392
+ "",
2393
+ "none",
2394
+ isArbitraryVariable,
2395
+ isArbitraryValue
2396
+ ]
2397
+ }],
2398
+ /**
2399
+ * Backdrop Blur
2400
+ * @see https://tailwindcss.com/docs/backdrop-blur
2401
+ */
2402
+ "backdrop-blur": [{
2403
+ "backdrop-blur": scaleBlur()
2404
+ }],
2405
+ /**
2406
+ * Backdrop Brightness
2407
+ * @see https://tailwindcss.com/docs/backdrop-brightness
2408
+ */
2409
+ "backdrop-brightness": [{
2410
+ "backdrop-brightness": [isNumber, isArbitraryVariable, isArbitraryValue]
2411
+ }],
2412
+ /**
2413
+ * Backdrop Contrast
2414
+ * @see https://tailwindcss.com/docs/backdrop-contrast
2415
+ */
2416
+ "backdrop-contrast": [{
2417
+ "backdrop-contrast": [isNumber, isArbitraryVariable, isArbitraryValue]
2418
+ }],
2419
+ /**
2420
+ * Backdrop Grayscale
2421
+ * @see https://tailwindcss.com/docs/backdrop-grayscale
2422
+ */
2423
+ "backdrop-grayscale": [{
2424
+ "backdrop-grayscale": ["", isNumber, isArbitraryVariable, isArbitraryValue]
2425
+ }],
2426
+ /**
2427
+ * Backdrop Hue Rotate
2428
+ * @see https://tailwindcss.com/docs/backdrop-hue-rotate
2429
+ */
2430
+ "backdrop-hue-rotate": [{
2431
+ "backdrop-hue-rotate": [isNumber, isArbitraryVariable, isArbitraryValue]
2432
+ }],
2433
+ /**
2434
+ * Backdrop Invert
2435
+ * @see https://tailwindcss.com/docs/backdrop-invert
2436
+ */
2437
+ "backdrop-invert": [{
2438
+ "backdrop-invert": ["", isNumber, isArbitraryVariable, isArbitraryValue]
2439
+ }],
2440
+ /**
2441
+ * Backdrop Opacity
2442
+ * @see https://tailwindcss.com/docs/backdrop-opacity
2443
+ */
2444
+ "backdrop-opacity": [{
2445
+ "backdrop-opacity": [isNumber, isArbitraryVariable, isArbitraryValue]
2446
+ }],
2447
+ /**
2448
+ * Backdrop Saturate
2449
+ * @see https://tailwindcss.com/docs/backdrop-saturate
2450
+ */
2451
+ "backdrop-saturate": [{
2452
+ "backdrop-saturate": [isNumber, isArbitraryVariable, isArbitraryValue]
2453
+ }],
2454
+ /**
2455
+ * Backdrop Sepia
2456
+ * @see https://tailwindcss.com/docs/backdrop-sepia
2457
+ */
2458
+ "backdrop-sepia": [{
2459
+ "backdrop-sepia": ["", isNumber, isArbitraryVariable, isArbitraryValue]
2460
+ }],
2461
+ // --------------
2462
+ // --- Tables ---
2463
+ // --------------
2464
+ /**
2465
+ * Border Collapse
2466
+ * @see https://tailwindcss.com/docs/border-collapse
2467
+ */
2468
+ "border-collapse": [{
2469
+ border: ["collapse", "separate"]
2470
+ }],
2471
+ /**
2472
+ * Border Spacing
2473
+ * @see https://tailwindcss.com/docs/border-spacing
2474
+ */
2475
+ "border-spacing": [{
2476
+ "border-spacing": scaleUnambiguousSpacing()
2477
+ }],
2478
+ /**
2479
+ * Border Spacing X
2480
+ * @see https://tailwindcss.com/docs/border-spacing
2481
+ */
2482
+ "border-spacing-x": [{
2483
+ "border-spacing-x": scaleUnambiguousSpacing()
2484
+ }],
2485
+ /**
2486
+ * Border Spacing Y
2487
+ * @see https://tailwindcss.com/docs/border-spacing
2488
+ */
2489
+ "border-spacing-y": [{
2490
+ "border-spacing-y": scaleUnambiguousSpacing()
2491
+ }],
2492
+ /**
2493
+ * Table Layout
2494
+ * @see https://tailwindcss.com/docs/table-layout
2495
+ */
2496
+ "table-layout": [{
2497
+ table: ["auto", "fixed"]
2498
+ }],
2499
+ /**
2500
+ * Caption Side
2501
+ * @see https://tailwindcss.com/docs/caption-side
2502
+ */
2503
+ caption: [{
2504
+ caption: ["top", "bottom"]
2505
+ }],
2506
+ // ---------------------------------
2507
+ // --- Transitions and Animation ---
2508
+ // ---------------------------------
2509
+ /**
2510
+ * Transition Property
2511
+ * @see https://tailwindcss.com/docs/transition-property
2512
+ */
2513
+ transition: [{
2514
+ transition: ["", "all", "colors", "opacity", "shadow", "transform", "none", isArbitraryVariable, isArbitraryValue]
2515
+ }],
2516
+ /**
2517
+ * Transition Behavior
2518
+ * @see https://tailwindcss.com/docs/transition-behavior
2519
+ */
2520
+ "transition-behavior": [{
2521
+ transition: ["normal", "discrete"]
2522
+ }],
2523
+ /**
2524
+ * Transition Duration
2525
+ * @see https://tailwindcss.com/docs/transition-duration
2526
+ */
2527
+ duration: [{
2528
+ duration: [isNumber, "initial", isArbitraryVariable, isArbitraryValue]
2529
+ }],
2530
+ /**
2531
+ * Transition Timing Function
2532
+ * @see https://tailwindcss.com/docs/transition-timing-function
2533
+ */
2534
+ ease: [{
2535
+ ease: ["linear", "initial", themeEase, isArbitraryVariable, isArbitraryValue]
2536
+ }],
2537
+ /**
2538
+ * Transition Delay
2539
+ * @see https://tailwindcss.com/docs/transition-delay
2540
+ */
2541
+ delay: [{
2542
+ delay: [isNumber, isArbitraryVariable, isArbitraryValue]
2543
+ }],
2544
+ /**
2545
+ * Animation
2546
+ * @see https://tailwindcss.com/docs/animation
2547
+ */
2548
+ animate: [{
2549
+ animate: ["none", themeAnimate, isArbitraryVariable, isArbitraryValue]
2550
+ }],
2551
+ // ------------------
2552
+ // --- Transforms ---
2553
+ // ------------------
2554
+ /**
2555
+ * Backface Visibility
2556
+ * @see https://tailwindcss.com/docs/backface-visibility
2557
+ */
2558
+ backface: [{
2559
+ backface: ["hidden", "visible"]
2560
+ }],
2561
+ /**
2562
+ * Perspective
2563
+ * @see https://tailwindcss.com/docs/perspective
2564
+ */
2565
+ perspective: [{
2566
+ perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]
2567
+ }],
2568
+ /**
2569
+ * Perspective Origin
2570
+ * @see https://tailwindcss.com/docs/perspective-origin
2571
+ */
2572
+ "perspective-origin": [{
2573
+ "perspective-origin": scalePositionWithArbitrary()
2574
+ }],
2575
+ /**
2576
+ * Rotate
2577
+ * @see https://tailwindcss.com/docs/rotate
2578
+ */
2579
+ rotate: [{
2580
+ rotate: scaleRotate()
2581
+ }],
2582
+ /**
2583
+ * Rotate X
2584
+ * @see https://tailwindcss.com/docs/rotate
2585
+ */
2586
+ "rotate-x": [{
2587
+ "rotate-x": scaleRotate()
2588
+ }],
2589
+ /**
2590
+ * Rotate Y
2591
+ * @see https://tailwindcss.com/docs/rotate
2592
+ */
2593
+ "rotate-y": [{
2594
+ "rotate-y": scaleRotate()
2595
+ }],
2596
+ /**
2597
+ * Rotate Z
2598
+ * @see https://tailwindcss.com/docs/rotate
2599
+ */
2600
+ "rotate-z": [{
2601
+ "rotate-z": scaleRotate()
2602
+ }],
2603
+ /**
2604
+ * Scale
2605
+ * @see https://tailwindcss.com/docs/scale
2606
+ */
2607
+ scale: [{
2608
+ scale: scaleScale()
2609
+ }],
2610
+ /**
2611
+ * Scale X
2612
+ * @see https://tailwindcss.com/docs/scale
2613
+ */
2614
+ "scale-x": [{
2615
+ "scale-x": scaleScale()
2616
+ }],
2617
+ /**
2618
+ * Scale Y
2619
+ * @see https://tailwindcss.com/docs/scale
2620
+ */
2621
+ "scale-y": [{
2622
+ "scale-y": scaleScale()
2623
+ }],
2624
+ /**
2625
+ * Scale Z
2626
+ * @see https://tailwindcss.com/docs/scale
2627
+ */
2628
+ "scale-z": [{
2629
+ "scale-z": scaleScale()
2630
+ }],
2631
+ /**
2632
+ * Scale 3D
2633
+ * @see https://tailwindcss.com/docs/scale
2634
+ */
2635
+ "scale-3d": ["scale-3d"],
2636
+ /**
2637
+ * Skew
2638
+ * @see https://tailwindcss.com/docs/skew
2639
+ */
2640
+ skew: [{
2641
+ skew: scaleSkew()
2642
+ }],
2643
+ /**
2644
+ * Skew X
2645
+ * @see https://tailwindcss.com/docs/skew
2646
+ */
2647
+ "skew-x": [{
2648
+ "skew-x": scaleSkew()
2649
+ }],
2650
+ /**
2651
+ * Skew Y
2652
+ * @see https://tailwindcss.com/docs/skew
2653
+ */
2654
+ "skew-y": [{
2655
+ "skew-y": scaleSkew()
2656
+ }],
2657
+ /**
2658
+ * Transform
2659
+ * @see https://tailwindcss.com/docs/transform
2660
+ */
2661
+ transform: [{
2662
+ transform: [isArbitraryVariable, isArbitraryValue, "", "none", "gpu", "cpu"]
2663
+ }],
2664
+ /**
2665
+ * Transform Origin
2666
+ * @see https://tailwindcss.com/docs/transform-origin
2667
+ */
2668
+ "transform-origin": [{
2669
+ origin: scalePositionWithArbitrary()
2670
+ }],
2671
+ /**
2672
+ * Transform Style
2673
+ * @see https://tailwindcss.com/docs/transform-style
2674
+ */
2675
+ "transform-style": [{
2676
+ transform: ["3d", "flat"]
2677
+ }],
2678
+ /**
2679
+ * Translate
2680
+ * @see https://tailwindcss.com/docs/translate
2681
+ */
2682
+ translate: [{
2683
+ translate: scaleTranslate()
2684
+ }],
2685
+ /**
2686
+ * Translate X
2687
+ * @see https://tailwindcss.com/docs/translate
2688
+ */
2689
+ "translate-x": [{
2690
+ "translate-x": scaleTranslate()
2691
+ }],
2692
+ /**
2693
+ * Translate Y
2694
+ * @see https://tailwindcss.com/docs/translate
2695
+ */
2696
+ "translate-y": [{
2697
+ "translate-y": scaleTranslate()
2698
+ }],
2699
+ /**
2700
+ * Translate Z
2701
+ * @see https://tailwindcss.com/docs/translate
2702
+ */
2703
+ "translate-z": [{
2704
+ "translate-z": scaleTranslate()
2705
+ }],
2706
+ /**
2707
+ * Translate None
2708
+ * @see https://tailwindcss.com/docs/translate
2709
+ */
2710
+ "translate-none": ["translate-none"],
2711
+ // ---------------------
2712
+ // --- Interactivity ---
2713
+ // ---------------------
2714
+ /**
2715
+ * Accent Color
2716
+ * @see https://tailwindcss.com/docs/accent-color
2717
+ */
2718
+ accent: [{
2719
+ accent: scaleColor()
2720
+ }],
2721
+ /**
2722
+ * Appearance
2723
+ * @see https://tailwindcss.com/docs/appearance
2724
+ */
2725
+ appearance: [{
2726
+ appearance: ["none", "auto"]
2727
+ }],
2728
+ /**
2729
+ * Caret Color
2730
+ * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
2731
+ */
2732
+ "caret-color": [{
2733
+ caret: scaleColor()
2734
+ }],
2735
+ /**
2736
+ * Color Scheme
2737
+ * @see https://tailwindcss.com/docs/color-scheme
2738
+ */
2739
+ "color-scheme": [{
2740
+ scheme: ["normal", "dark", "light", "light-dark", "only-dark", "only-light"]
2741
+ }],
2742
+ /**
2743
+ * Cursor
2744
+ * @see https://tailwindcss.com/docs/cursor
2745
+ */
2746
+ cursor: [{
2747
+ cursor: ["auto", "default", "pointer", "wait", "text", "move", "help", "not-allowed", "none", "context-menu", "progress", "cell", "crosshair", "vertical-text", "alias", "copy", "no-drop", "grab", "grabbing", "all-scroll", "col-resize", "row-resize", "n-resize", "e-resize", "s-resize", "w-resize", "ne-resize", "nw-resize", "se-resize", "sw-resize", "ew-resize", "ns-resize", "nesw-resize", "nwse-resize", "zoom-in", "zoom-out", isArbitraryVariable, isArbitraryValue]
2748
+ }],
2749
+ /**
2750
+ * Field Sizing
2751
+ * @see https://tailwindcss.com/docs/field-sizing
2752
+ */
2753
+ "field-sizing": [{
2754
+ "field-sizing": ["fixed", "content"]
2755
+ }],
2756
+ /**
2757
+ * Pointer Events
2758
+ * @see https://tailwindcss.com/docs/pointer-events
2759
+ */
2760
+ "pointer-events": [{
2761
+ "pointer-events": ["auto", "none"]
2762
+ }],
2763
+ /**
2764
+ * Resize
2765
+ * @see https://tailwindcss.com/docs/resize
2766
+ */
2767
+ resize: [{
2768
+ resize: ["none", "", "y", "x"]
2769
+ }],
2770
+ /**
2771
+ * Scroll Behavior
2772
+ * @see https://tailwindcss.com/docs/scroll-behavior
2773
+ */
2774
+ "scroll-behavior": [{
2775
+ scroll: ["auto", "smooth"]
2776
+ }],
2777
+ /**
2778
+ * Scroll Margin
2779
+ * @see https://tailwindcss.com/docs/scroll-margin
2780
+ */
2781
+ "scroll-m": [{
2782
+ "scroll-m": scaleUnambiguousSpacing()
2783
+ }],
2784
+ /**
2785
+ * Scroll Margin X
2786
+ * @see https://tailwindcss.com/docs/scroll-margin
2787
+ */
2788
+ "scroll-mx": [{
2789
+ "scroll-mx": scaleUnambiguousSpacing()
2790
+ }],
2791
+ /**
2792
+ * Scroll Margin Y
2793
+ * @see https://tailwindcss.com/docs/scroll-margin
2794
+ */
2795
+ "scroll-my": [{
2796
+ "scroll-my": scaleUnambiguousSpacing()
2797
+ }],
2798
+ /**
2799
+ * Scroll Margin Start
2800
+ * @see https://tailwindcss.com/docs/scroll-margin
2801
+ */
2802
+ "scroll-ms": [{
2803
+ "scroll-ms": scaleUnambiguousSpacing()
2804
+ }],
2805
+ /**
2806
+ * Scroll Margin End
2807
+ * @see https://tailwindcss.com/docs/scroll-margin
2808
+ */
2809
+ "scroll-me": [{
2810
+ "scroll-me": scaleUnambiguousSpacing()
2811
+ }],
2812
+ /**
2813
+ * Scroll Margin Top
2814
+ * @see https://tailwindcss.com/docs/scroll-margin
2815
+ */
2816
+ "scroll-mt": [{
2817
+ "scroll-mt": scaleUnambiguousSpacing()
2818
+ }],
2819
+ /**
2820
+ * Scroll Margin Right
2821
+ * @see https://tailwindcss.com/docs/scroll-margin
2822
+ */
2823
+ "scroll-mr": [{
2824
+ "scroll-mr": scaleUnambiguousSpacing()
2825
+ }],
2826
+ /**
2827
+ * Scroll Margin Bottom
2828
+ * @see https://tailwindcss.com/docs/scroll-margin
2829
+ */
2830
+ "scroll-mb": [{
2831
+ "scroll-mb": scaleUnambiguousSpacing()
2832
+ }],
2833
+ /**
2834
+ * Scroll Margin Left
2835
+ * @see https://tailwindcss.com/docs/scroll-margin
2836
+ */
2837
+ "scroll-ml": [{
2838
+ "scroll-ml": scaleUnambiguousSpacing()
2839
+ }],
2840
+ /**
2841
+ * Scroll Padding
2842
+ * @see https://tailwindcss.com/docs/scroll-padding
2843
+ */
2844
+ "scroll-p": [{
2845
+ "scroll-p": scaleUnambiguousSpacing()
2846
+ }],
2847
+ /**
2848
+ * Scroll Padding X
2849
+ * @see https://tailwindcss.com/docs/scroll-padding
2850
+ */
2851
+ "scroll-px": [{
2852
+ "scroll-px": scaleUnambiguousSpacing()
2853
+ }],
2854
+ /**
2855
+ * Scroll Padding Y
2856
+ * @see https://tailwindcss.com/docs/scroll-padding
2857
+ */
2858
+ "scroll-py": [{
2859
+ "scroll-py": scaleUnambiguousSpacing()
2860
+ }],
2861
+ /**
2862
+ * Scroll Padding Start
2863
+ * @see https://tailwindcss.com/docs/scroll-padding
2864
+ */
2865
+ "scroll-ps": [{
2866
+ "scroll-ps": scaleUnambiguousSpacing()
2867
+ }],
2868
+ /**
2869
+ * Scroll Padding End
2870
+ * @see https://tailwindcss.com/docs/scroll-padding
2871
+ */
2872
+ "scroll-pe": [{
2873
+ "scroll-pe": scaleUnambiguousSpacing()
2874
+ }],
2875
+ /**
2876
+ * Scroll Padding Top
2877
+ * @see https://tailwindcss.com/docs/scroll-padding
2878
+ */
2879
+ "scroll-pt": [{
2880
+ "scroll-pt": scaleUnambiguousSpacing()
2881
+ }],
2882
+ /**
2883
+ * Scroll Padding Right
2884
+ * @see https://tailwindcss.com/docs/scroll-padding
2885
+ */
2886
+ "scroll-pr": [{
2887
+ "scroll-pr": scaleUnambiguousSpacing()
2888
+ }],
2889
+ /**
2890
+ * Scroll Padding Bottom
2891
+ * @see https://tailwindcss.com/docs/scroll-padding
2892
+ */
2893
+ "scroll-pb": [{
2894
+ "scroll-pb": scaleUnambiguousSpacing()
2895
+ }],
2896
+ /**
2897
+ * Scroll Padding Left
2898
+ * @see https://tailwindcss.com/docs/scroll-padding
2899
+ */
2900
+ "scroll-pl": [{
2901
+ "scroll-pl": scaleUnambiguousSpacing()
2902
+ }],
2903
+ /**
2904
+ * Scroll Snap Align
2905
+ * @see https://tailwindcss.com/docs/scroll-snap-align
2906
+ */
2907
+ "snap-align": [{
2908
+ snap: ["start", "end", "center", "align-none"]
2909
+ }],
2910
+ /**
2911
+ * Scroll Snap Stop
2912
+ * @see https://tailwindcss.com/docs/scroll-snap-stop
2913
+ */
2914
+ "snap-stop": [{
2915
+ snap: ["normal", "always"]
2916
+ }],
2917
+ /**
2918
+ * Scroll Snap Type
2919
+ * @see https://tailwindcss.com/docs/scroll-snap-type
2920
+ */
2921
+ "snap-type": [{
2922
+ snap: ["none", "x", "y", "both"]
2923
+ }],
2924
+ /**
2925
+ * Scroll Snap Type Strictness
2926
+ * @see https://tailwindcss.com/docs/scroll-snap-type
2927
+ */
2928
+ "snap-strictness": [{
2929
+ snap: ["mandatory", "proximity"]
2930
+ }],
2931
+ /**
2932
+ * Touch Action
2933
+ * @see https://tailwindcss.com/docs/touch-action
2934
+ */
2935
+ touch: [{
2936
+ touch: ["auto", "none", "manipulation"]
2937
+ }],
2938
+ /**
2939
+ * Touch Action X
2940
+ * @see https://tailwindcss.com/docs/touch-action
2941
+ */
2942
+ "touch-x": [{
2943
+ "touch-pan": ["x", "left", "right"]
2944
+ }],
2945
+ /**
2946
+ * Touch Action Y
2947
+ * @see https://tailwindcss.com/docs/touch-action
2948
+ */
2949
+ "touch-y": [{
2950
+ "touch-pan": ["y", "up", "down"]
2951
+ }],
2952
+ /**
2953
+ * Touch Action Pinch Zoom
2954
+ * @see https://tailwindcss.com/docs/touch-action
2955
+ */
2956
+ "touch-pz": ["touch-pinch-zoom"],
2957
+ /**
2958
+ * User Select
2959
+ * @see https://tailwindcss.com/docs/user-select
2960
+ */
2961
+ select: [{
2962
+ select: ["none", "text", "all", "auto"]
2963
+ }],
2964
+ /**
2965
+ * Will Change
2966
+ * @see https://tailwindcss.com/docs/will-change
2967
+ */
2968
+ "will-change": [{
2969
+ "will-change": ["auto", "scroll", "contents", "transform", isArbitraryVariable, isArbitraryValue]
2970
+ }],
2971
+ // -----------
2972
+ // --- SVG ---
2973
+ // -----------
2974
+ /**
2975
+ * Fill
2976
+ * @see https://tailwindcss.com/docs/fill
2977
+ */
2978
+ fill: [{
2979
+ fill: ["none", ...scaleColor()]
2980
+ }],
2981
+ /**
2982
+ * Stroke Width
2983
+ * @see https://tailwindcss.com/docs/stroke-width
2984
+ */
2985
+ "stroke-w": [{
2986
+ stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]
2987
+ }],
2988
+ /**
2989
+ * Stroke
2990
+ * @see https://tailwindcss.com/docs/stroke
2991
+ */
2992
+ stroke: [{
2993
+ stroke: ["none", ...scaleColor()]
2994
+ }],
2995
+ // ---------------------
2996
+ // --- Accessibility ---
2997
+ // ---------------------
2998
+ /**
2999
+ * Forced Color Adjust
3000
+ * @see https://tailwindcss.com/docs/forced-color-adjust
3001
+ */
3002
+ "forced-color-adjust": [{
3003
+ "forced-color-adjust": ["auto", "none"]
3004
+ }]
3005
+ },
3006
+ conflictingClassGroups: {
3007
+ overflow: ["overflow-x", "overflow-y"],
3008
+ overscroll: ["overscroll-x", "overscroll-y"],
3009
+ inset: ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"],
3010
+ "inset-x": ["right", "left"],
3011
+ "inset-y": ["top", "bottom"],
3012
+ flex: ["basis", "grow", "shrink"],
3013
+ gap: ["gap-x", "gap-y"],
3014
+ p: ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"],
3015
+ px: ["pr", "pl"],
3016
+ py: ["pt", "pb"],
3017
+ m: ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"],
3018
+ mx: ["mr", "ml"],
3019
+ my: ["mt", "mb"],
3020
+ size: ["w", "h"],
3021
+ "font-size": ["leading"],
3022
+ "fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"],
3023
+ "fvn-ordinal": ["fvn-normal"],
3024
+ "fvn-slashed-zero": ["fvn-normal"],
3025
+ "fvn-figure": ["fvn-normal"],
3026
+ "fvn-spacing": ["fvn-normal"],
3027
+ "fvn-fraction": ["fvn-normal"],
3028
+ "line-clamp": ["display", "overflow"],
3029
+ rounded: ["rounded-s", "rounded-e", "rounded-t", "rounded-r", "rounded-b", "rounded-l", "rounded-ss", "rounded-se", "rounded-ee", "rounded-es", "rounded-tl", "rounded-tr", "rounded-br", "rounded-bl"],
3030
+ "rounded-s": ["rounded-ss", "rounded-es"],
3031
+ "rounded-e": ["rounded-se", "rounded-ee"],
3032
+ "rounded-t": ["rounded-tl", "rounded-tr"],
3033
+ "rounded-r": ["rounded-tr", "rounded-br"],
3034
+ "rounded-b": ["rounded-br", "rounded-bl"],
3035
+ "rounded-l": ["rounded-tl", "rounded-bl"],
3036
+ "border-spacing": ["border-spacing-x", "border-spacing-y"],
3037
+ "border-w": ["border-w-x", "border-w-y", "border-w-s", "border-w-e", "border-w-t", "border-w-r", "border-w-b", "border-w-l"],
3038
+ "border-w-x": ["border-w-r", "border-w-l"],
3039
+ "border-w-y": ["border-w-t", "border-w-b"],
3040
+ "border-color": ["border-color-x", "border-color-y", "border-color-s", "border-color-e", "border-color-t", "border-color-r", "border-color-b", "border-color-l"],
3041
+ "border-color-x": ["border-color-r", "border-color-l"],
3042
+ "border-color-y": ["border-color-t", "border-color-b"],
3043
+ translate: ["translate-x", "translate-y", "translate-none"],
3044
+ "translate-none": ["translate", "translate-x", "translate-y", "translate-z"],
3045
+ "scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"],
3046
+ "scroll-mx": ["scroll-mr", "scroll-ml"],
3047
+ "scroll-my": ["scroll-mt", "scroll-mb"],
3048
+ "scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"],
3049
+ "scroll-px": ["scroll-pr", "scroll-pl"],
3050
+ "scroll-py": ["scroll-pt", "scroll-pb"],
3051
+ touch: ["touch-x", "touch-y", "touch-pz"],
3052
+ "touch-x": ["touch"],
3053
+ "touch-y": ["touch"],
3054
+ "touch-pz": ["touch"]
3055
+ },
3056
+ conflictingClassGroupModifiers: {
3057
+ "font-size": ["leading"]
3058
+ },
3059
+ orderSensitiveModifiers: ["*", "**", "after", "backdrop", "before", "details-content", "file", "first-letter", "first-line", "marker", "placeholder", "selection"]
3060
+ };
3061
+ };
3062
+ const twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
3063
+ function cn(...inputs) {
3064
+ return twMerge(clsx(inputs));
3065
+ }
3066
+ const alertVariants = cva("grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 w-full relative group/alert", {
3067
+ variants: {
3068
+ variant: {
3069
+ default: "bg-card text-card-foreground",
3070
+ destructive: "text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
3071
+ }
3072
+ },
3073
+ defaultVariants: {
3074
+ variant: "default"
3075
+ }
3076
+ });
3077
+ function Alert({
3078
+ className,
3079
+ variant,
3080
+ ...props
3081
+ }) {
3082
+ return /* @__PURE__ */ jsx(
3083
+ "div",
3084
+ {
3085
+ "data-slot": "alert",
3086
+ role: "alert",
3087
+ className: cn(alertVariants({ variant }), className),
3088
+ ...props
3089
+ }
3090
+ );
3091
+ }
3092
+ function AlertTitle({ className, ...props }) {
3093
+ return /* @__PURE__ */ jsx(
3094
+ "div",
3095
+ {
3096
+ "data-slot": "alert-title",
3097
+ className: cn(
3098
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
3099
+ className
3100
+ ),
3101
+ ...props
3102
+ }
3103
+ );
3104
+ }
3105
+ function AlertDescription({
3106
+ className,
3107
+ ...props
3108
+ }) {
3109
+ return /* @__PURE__ */ jsx(
3110
+ "div",
3111
+ {
3112
+ "data-slot": "alert-description",
3113
+ className: cn(
3114
+ "text-muted-foreground text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
3115
+ className
3116
+ ),
3117
+ ...props
3118
+ }
3119
+ );
3120
+ }
3121
+ function AlertAction({ className, ...props }) {
3122
+ return /* @__PURE__ */ jsx(
3123
+ "div",
3124
+ {
3125
+ "data-slot": "alert-action",
3126
+ className: cn("absolute top-2 right-2", className),
3127
+ ...props
3128
+ }
3129
+ );
3130
+ }
3131
+ function setRef(ref, value) {
3132
+ if (typeof ref === "function") {
3133
+ return ref(value);
3134
+ } else if (ref !== null && ref !== void 0) {
3135
+ ref.current = value;
3136
+ }
3137
+ }
3138
+ function composeRefs(...refs) {
3139
+ return (node) => {
3140
+ let hasCleanup = false;
3141
+ const cleanups = refs.map((ref) => {
3142
+ const cleanup = setRef(ref, node);
3143
+ if (!hasCleanup && typeof cleanup == "function") {
3144
+ hasCleanup = true;
3145
+ }
3146
+ return cleanup;
3147
+ });
3148
+ if (hasCleanup) {
3149
+ return () => {
3150
+ for (let i = 0; i < cleanups.length; i++) {
3151
+ const cleanup = cleanups[i];
3152
+ if (typeof cleanup == "function") {
3153
+ cleanup();
3154
+ } else {
3155
+ setRef(refs[i], null);
3156
+ }
3157
+ }
3158
+ };
3159
+ }
3160
+ };
3161
+ }
3162
+ var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy");
3163
+ var use = React[" use ".trim().toString()];
3164
+ function isPromiseLike(value) {
3165
+ return typeof value === "object" && value !== null && "then" in value;
3166
+ }
3167
+ function isLazyComponent(element) {
3168
+ return element != null && typeof element === "object" && "$$typeof" in element && element.$$typeof === REACT_LAZY_TYPE && "_payload" in element && isPromiseLike(element._payload);
3169
+ }
3170
+ // @__NO_SIDE_EFFECTS__
3171
+ function createSlot(ownerName) {
3172
+ const SlotClone = /* @__PURE__ */ createSlotClone(ownerName);
3173
+ const Slot2 = React.forwardRef((props, forwardedRef) => {
3174
+ let { children, ...slotProps } = props;
3175
+ if (isLazyComponent(children) && typeof use === "function") {
3176
+ children = use(children._payload);
3177
+ }
3178
+ const childrenArray = React.Children.toArray(children);
3179
+ const slottable = childrenArray.find(isSlottable);
3180
+ if (slottable) {
3181
+ const newElement = slottable.props.children;
3182
+ const newChildren = childrenArray.map((child) => {
3183
+ if (child === slottable) {
3184
+ if (React.Children.count(newElement) > 1) return React.Children.only(null);
3185
+ return React.isValidElement(newElement) ? newElement.props.children : null;
3186
+ } else {
3187
+ return child;
3188
+ }
3189
+ });
3190
+ return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children: React.isValidElement(newElement) ? React.cloneElement(newElement, void 0, newChildren) : null });
3191
+ }
3192
+ return /* @__PURE__ */ jsx(SlotClone, { ...slotProps, ref: forwardedRef, children });
3193
+ });
3194
+ Slot2.displayName = `${ownerName}.Slot`;
3195
+ return Slot2;
3196
+ }
3197
+ var Slot = /* @__PURE__ */ createSlot("Slot");
3198
+ // @__NO_SIDE_EFFECTS__
3199
+ function createSlotClone(ownerName) {
3200
+ const SlotClone = React.forwardRef((props, forwardedRef) => {
3201
+ let { children, ...slotProps } = props;
3202
+ if (isLazyComponent(children) && typeof use === "function") {
3203
+ children = use(children._payload);
3204
+ }
3205
+ if (React.isValidElement(children)) {
3206
+ const childrenRef = getElementRef(children);
3207
+ const props2 = mergeProps(slotProps, children.props);
3208
+ if (children.type !== React.Fragment) {
3209
+ props2.ref = forwardedRef ? composeRefs(forwardedRef, childrenRef) : childrenRef;
3210
+ }
3211
+ return React.cloneElement(children, props2);
3212
+ }
3213
+ return React.Children.count(children) > 1 ? React.Children.only(null) : null;
3214
+ });
3215
+ SlotClone.displayName = `${ownerName}.SlotClone`;
3216
+ return SlotClone;
3217
+ }
3218
+ var SLOTTABLE_IDENTIFIER = /* @__PURE__ */ Symbol("radix.slottable");
3219
+ function isSlottable(child) {
3220
+ return React.isValidElement(child) && typeof child.type === "function" && "__radixId" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;
3221
+ }
3222
+ function mergeProps(slotProps, childProps) {
3223
+ const overrideProps = { ...childProps };
3224
+ for (const propName in childProps) {
3225
+ const slotPropValue = slotProps[propName];
3226
+ const childPropValue = childProps[propName];
3227
+ const isHandler = /^on[A-Z]/.test(propName);
3228
+ if (isHandler) {
3229
+ if (slotPropValue && childPropValue) {
3230
+ overrideProps[propName] = (...args) => {
3231
+ const result = childPropValue(...args);
3232
+ slotPropValue(...args);
3233
+ return result;
3234
+ };
3235
+ } else if (slotPropValue) {
3236
+ overrideProps[propName] = slotPropValue;
3237
+ }
3238
+ } else if (propName === "style") {
3239
+ overrideProps[propName] = { ...slotPropValue, ...childPropValue };
3240
+ } else if (propName === "className") {
3241
+ overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(" ");
3242
+ }
3243
+ }
3244
+ return { ...slotProps, ...overrideProps };
3245
+ }
3246
+ function getElementRef(element) {
3247
+ let getter = Object.getOwnPropertyDescriptor(element.props, "ref")?.get;
3248
+ let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
3249
+ if (mayWarn) {
3250
+ return element.ref;
3251
+ }
3252
+ getter = Object.getOwnPropertyDescriptor(element, "ref")?.get;
3253
+ mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
3254
+ if (mayWarn) {
3255
+ return element.props.ref;
3256
+ }
3257
+ return element.props.ref || element.ref;
3258
+ }
3259
+ const badgeVariants = cva(
3260
+ "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
3261
+ {
3262
+ variants: {
3263
+ variant: {
3264
+ default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
3265
+ secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
3266
+ destructive: "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
3267
+ outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
3268
+ ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
3269
+ link: "text-primary underline-offset-4 [a&]:hover:underline"
3270
+ }
3271
+ },
3272
+ defaultVariants: {
3273
+ variant: "default"
3274
+ }
3275
+ }
3276
+ );
3277
+ function Badge({
3278
+ className,
3279
+ variant = "default",
3280
+ asChild = false,
3281
+ ...props
3282
+ }) {
3283
+ const Comp = asChild ? Slot : "span";
3284
+ return /* @__PURE__ */ jsx(
3285
+ Comp,
3286
+ {
3287
+ "data-slot": "badge",
3288
+ "data-variant": variant,
3289
+ className: cn(badgeVariants({ variant }), className),
3290
+ ...props
3291
+ }
3292
+ );
3293
+ }
3294
+ function Card({
3295
+ className,
3296
+ size = "default",
3297
+ ...props
3298
+ }) {
3299
+ return /* @__PURE__ */ jsx(
3300
+ "div",
3301
+ {
3302
+ "data-slot": "card",
3303
+ "data-size": size,
3304
+ className: cn("ring-foreground/10 bg-card text-card-foreground gap-4 overflow-hidden rounded-xl py-4 text-sm ring-1 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl group/card flex flex-col", className),
3305
+ ...props
3306
+ }
3307
+ );
3308
+ }
3309
+ function CardHeader({ className, ...props }) {
3310
+ return /* @__PURE__ */ jsx(
3311
+ "div",
3312
+ {
3313
+ "data-slot": "card-header",
3314
+ className: cn(
3315
+ "gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]",
3316
+ className
3317
+ ),
3318
+ ...props
3319
+ }
3320
+ );
3321
+ }
3322
+ function CardTitle({ className, ...props }) {
3323
+ return /* @__PURE__ */ jsx(
3324
+ "div",
3325
+ {
3326
+ "data-slot": "card-title",
3327
+ className: cn("text-base leading-snug font-medium group-data-[size=sm]/card:text-sm", className),
3328
+ ...props
3329
+ }
3330
+ );
3331
+ }
3332
+ function CardDescription({ className, ...props }) {
3333
+ return /* @__PURE__ */ jsx(
3334
+ "div",
3335
+ {
3336
+ "data-slot": "card-description",
3337
+ className: cn("text-muted-foreground text-sm", className),
3338
+ ...props
3339
+ }
3340
+ );
3341
+ }
3342
+ function CardAction({ className, ...props }) {
3343
+ return /* @__PURE__ */ jsx(
3344
+ "div",
3345
+ {
3346
+ "data-slot": "card-action",
3347
+ className: cn(
3348
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
3349
+ className
3350
+ ),
3351
+ ...props
3352
+ }
3353
+ );
3354
+ }
3355
+ function CardContent({ className, ...props }) {
3356
+ return /* @__PURE__ */ jsx(
3357
+ "div",
3358
+ {
3359
+ "data-slot": "card-content",
3360
+ className: cn("px-4 group-data-[size=sm]/card:px-3", className),
3361
+ ...props
3362
+ }
3363
+ );
3364
+ }
3365
+ function CardFooter({ className, ...props }) {
3366
+ return /* @__PURE__ */ jsx(
3367
+ "div",
3368
+ {
3369
+ "data-slot": "card-footer",
3370
+ className: cn("bg-muted/50 rounded-b-xl border-t p-4 group-data-[size=sm]/card:p-3 flex items-center", className),
3371
+ ...props
3372
+ }
3373
+ );
3374
+ }
3375
+ export {
3376
+ Alert,
3377
+ AlertAction,
3378
+ AlertDescription,
3379
+ AlertTitle,
3380
+ Badge,
3381
+ Card,
3382
+ CardAction,
3383
+ CardContent,
3384
+ CardDescription,
3385
+ CardFooter,
3386
+ CardHeader,
3387
+ CardTitle,
3388
+ badgeVariants
3389
+ };