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