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