@tangle-network/charts 2.0.13 → 2.0.14

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,4747 @@
1
+ import { n as reportedCount, r as sumReportedCounts, t as finiteNumber } from "./flow-trace-DRluIYw8.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { createContext, createElement, forwardRef, useContext } from "react";
4
+ //#region node_modules/clsx/dist/clsx.mjs
5
+ function r(e) {
6
+ var t, f, n = "";
7
+ if ("string" == typeof e || "number" == typeof e) n += e;
8
+ else if ("object" == typeof e) if (Array.isArray(e)) {
9
+ var o = e.length;
10
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
11
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
12
+ return n;
13
+ }
14
+ function clsx() {
15
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
16
+ return n;
17
+ }
18
+ //#endregion
19
+ //#region node_modules/tailwind-merge/dist/bundle-mjs.mjs
20
+ /**
21
+ * Concatenates two arrays faster than the array spread operator.
22
+ */
23
+ const concatArrays = (array1, array2) => {
24
+ const combinedArray = new Array(array1.length + array2.length);
25
+ for (let i = 0; i < array1.length; i++) combinedArray[i] = array1[i];
26
+ for (let i = 0; i < array2.length; i++) combinedArray[array1.length + i] = array2[i];
27
+ return combinedArray;
28
+ };
29
+ const createClassValidatorObject = (classGroupId, validator) => ({
30
+ classGroupId,
31
+ validator
32
+ });
33
+ const createClassPartObject = (nextPart = /* @__PURE__ */ new Map(), validators = null, classGroupId) => ({
34
+ nextPart,
35
+ validators,
36
+ classGroupId
37
+ });
38
+ const CLASS_PART_SEPARATOR = "-";
39
+ const EMPTY_CONFLICTS = [];
40
+ const ARBITRARY_PROPERTY_PREFIX = "arbitrary..";
41
+ const createClassGroupUtils = (config) => {
42
+ const classMap = createClassMap(config);
43
+ const { conflictingClassGroups, conflictingClassGroupModifiers } = config;
44
+ const getClassGroupId = (className) => {
45
+ if (className.startsWith("[") && className.endsWith("]")) return getGroupIdForArbitraryProperty(className);
46
+ const classParts = className.split(CLASS_PART_SEPARATOR);
47
+ const startIndex = classParts[0] === "" && classParts.length > 1 ? 1 : 0;
48
+ return getGroupRecursive(classParts, startIndex, classMap);
49
+ };
50
+ const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
51
+ if (hasPostfixModifier) {
52
+ const modifierConflicts = conflictingClassGroupModifiers[classGroupId];
53
+ const baseConflicts = conflictingClassGroups[classGroupId];
54
+ if (modifierConflicts) {
55
+ if (baseConflicts) return concatArrays(baseConflicts, modifierConflicts);
56
+ return modifierConflicts;
57
+ }
58
+ return baseConflicts || EMPTY_CONFLICTS;
59
+ }
60
+ return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;
61
+ };
62
+ return {
63
+ getClassGroupId,
64
+ getConflictingClassGroupIds
65
+ };
66
+ };
67
+ const getGroupRecursive = (classParts, startIndex, classPartObject) => {
68
+ if (classParts.length - startIndex === 0) return classPartObject.classGroupId;
69
+ const currentClassPart = classParts[startIndex];
70
+ const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
71
+ if (nextClassPartObject) {
72
+ const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);
73
+ if (result) return result;
74
+ }
75
+ const validators = classPartObject.validators;
76
+ if (validators === null) return;
77
+ const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);
78
+ const validatorsLength = validators.length;
79
+ for (let i = 0; i < validatorsLength; i++) {
80
+ const validatorObj = validators[i];
81
+ if (validatorObj.validator(classRest)) return validatorObj.classGroupId;
82
+ }
83
+ };
84
+ /**
85
+ * Get the class group ID for an arbitrary property.
86
+ *
87
+ * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.
88
+ */
89
+ const getGroupIdForArbitraryProperty = (className) => className.slice(1, -1).indexOf(":") === -1 ? void 0 : (() => {
90
+ const content = className.slice(1, -1);
91
+ const colonIndex = content.indexOf(":");
92
+ const property = content.slice(0, colonIndex);
93
+ return property ? ARBITRARY_PROPERTY_PREFIX + property : void 0;
94
+ })();
95
+ /**
96
+ * Exported for testing only
97
+ */
98
+ const createClassMap = (config) => {
99
+ const { theme, classGroups } = config;
100
+ return processClassGroups(classGroups, theme);
101
+ };
102
+ const processClassGroups = (classGroups, theme) => {
103
+ const classMap = createClassPartObject();
104
+ for (const classGroupId in classGroups) {
105
+ const group = classGroups[classGroupId];
106
+ processClassesRecursively(group, classMap, classGroupId, theme);
107
+ }
108
+ return classMap;
109
+ };
110
+ const processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
111
+ const len = classGroup.length;
112
+ for (let i = 0; i < len; i++) {
113
+ const classDefinition = classGroup[i];
114
+ processClassDefinition(classDefinition, classPartObject, classGroupId, theme);
115
+ }
116
+ };
117
+ const processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
118
+ if (typeof classDefinition === "string") {
119
+ processStringDefinition(classDefinition, classPartObject, classGroupId);
120
+ return;
121
+ }
122
+ if (typeof classDefinition === "function") {
123
+ processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);
124
+ return;
125
+ }
126
+ processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);
127
+ };
128
+ const processStringDefinition = (classDefinition, classPartObject, classGroupId) => {
129
+ const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
130
+ classPartObjectToEdit.classGroupId = classGroupId;
131
+ };
132
+ const processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
133
+ if (isThemeGetter(classDefinition)) {
134
+ processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
135
+ return;
136
+ }
137
+ if (classPartObject.validators === null) classPartObject.validators = [];
138
+ classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));
139
+ };
140
+ const processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {
141
+ const entries = Object.entries(classDefinition);
142
+ const len = entries.length;
143
+ for (let i = 0; i < len; i++) {
144
+ const [key, value] = entries[i];
145
+ processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);
146
+ }
147
+ };
148
+ const getPart = (classPartObject, path) => {
149
+ let current = classPartObject;
150
+ const parts = path.split(CLASS_PART_SEPARATOR);
151
+ const len = parts.length;
152
+ for (let i = 0; i < len; i++) {
153
+ const part = parts[i];
154
+ let next = current.nextPart.get(part);
155
+ if (!next) {
156
+ next = createClassPartObject();
157
+ current.nextPart.set(part, next);
158
+ }
159
+ current = next;
160
+ }
161
+ return current;
162
+ };
163
+ const isThemeGetter = (func) => "isThemeGetter" in func && func.isThemeGetter === true;
164
+ const createLruCache = (maxCacheSize) => {
165
+ if (maxCacheSize < 1) return {
166
+ get: () => void 0,
167
+ set: () => {}
168
+ };
169
+ let cacheSize = 0;
170
+ let cache = Object.create(null);
171
+ let previousCache = Object.create(null);
172
+ const update = (key, value) => {
173
+ cache[key] = value;
174
+ cacheSize++;
175
+ if (cacheSize > maxCacheSize) {
176
+ cacheSize = 0;
177
+ previousCache = cache;
178
+ cache = Object.create(null);
179
+ }
180
+ };
181
+ return {
182
+ get(key) {
183
+ let value = cache[key];
184
+ if (value !== void 0) return value;
185
+ if ((value = previousCache[key]) !== void 0) {
186
+ update(key, value);
187
+ return value;
188
+ }
189
+ },
190
+ set(key, value) {
191
+ if (key in cache) cache[key] = value;
192
+ else update(key, value);
193
+ }
194
+ };
195
+ };
196
+ const IMPORTANT_MODIFIER = "!";
197
+ const MODIFIER_SEPARATOR = ":";
198
+ const EMPTY_MODIFIERS = [];
199
+ const createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({
200
+ modifiers,
201
+ hasImportantModifier,
202
+ baseClassName,
203
+ maybePostfixModifierPosition,
204
+ isExternal
205
+ });
206
+ const createParseClassName = (config) => {
207
+ const { prefix, experimentalParseClassName } = config;
208
+ /**
209
+ * Parse class name into parts.
210
+ *
211
+ * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS
212
+ * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js
213
+ */
214
+ let parseClassName = (className) => {
215
+ const modifiers = [];
216
+ let bracketDepth = 0;
217
+ let parenDepth = 0;
218
+ let modifierStart = 0;
219
+ let postfixModifierPosition;
220
+ const len = className.length;
221
+ for (let index = 0; index < len; index++) {
222
+ const currentCharacter = className[index];
223
+ if (bracketDepth === 0 && parenDepth === 0) {
224
+ if (currentCharacter === MODIFIER_SEPARATOR) {
225
+ modifiers.push(className.slice(modifierStart, index));
226
+ modifierStart = index + 1;
227
+ continue;
228
+ }
229
+ if (currentCharacter === "/") {
230
+ postfixModifierPosition = index;
231
+ continue;
232
+ }
233
+ }
234
+ if (currentCharacter === "[") bracketDepth++;
235
+ else if (currentCharacter === "]") bracketDepth--;
236
+ else if (currentCharacter === "(") parenDepth++;
237
+ else if (currentCharacter === ")") parenDepth--;
238
+ }
239
+ const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);
240
+ let baseClassName = baseClassNameWithImportantModifier;
241
+ let hasImportantModifier = false;
242
+ if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {
243
+ baseClassName = baseClassNameWithImportantModifier.slice(0, -1);
244
+ hasImportantModifier = true;
245
+ } else if (baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {
246
+ baseClassName = baseClassNameWithImportantModifier.slice(1);
247
+ hasImportantModifier = true;
248
+ }
249
+ const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
250
+ return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);
251
+ };
252
+ if (prefix) {
253
+ const fullPrefix = prefix + MODIFIER_SEPARATOR;
254
+ const parseClassNameOriginal = parseClassName;
255
+ parseClassName = (className) => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, void 0, true);
256
+ }
257
+ if (experimentalParseClassName) {
258
+ const parseClassNameOriginal = parseClassName;
259
+ parseClassName = (className) => experimentalParseClassName({
260
+ className,
261
+ parseClassName: parseClassNameOriginal
262
+ });
263
+ }
264
+ return parseClassName;
265
+ };
266
+ /**
267
+ * Sorts modifiers according to following schema:
268
+ * - Predefined modifiers are sorted alphabetically
269
+ * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it
270
+ */
271
+ const createSortModifiers = (config) => {
272
+ const modifierWeights = /* @__PURE__ */ new Map();
273
+ config.orderSensitiveModifiers.forEach((mod, index) => {
274
+ modifierWeights.set(mod, 1e6 + index);
275
+ });
276
+ return (modifiers) => {
277
+ const result = [];
278
+ let currentSegment = [];
279
+ for (let i = 0; i < modifiers.length; i++) {
280
+ const modifier = modifiers[i];
281
+ const isArbitrary = modifier[0] === "[";
282
+ const isOrderSensitive = modifierWeights.has(modifier);
283
+ if (isArbitrary || isOrderSensitive) {
284
+ if (currentSegment.length > 0) {
285
+ currentSegment.sort();
286
+ result.push(...currentSegment);
287
+ currentSegment = [];
288
+ }
289
+ result.push(modifier);
290
+ } else currentSegment.push(modifier);
291
+ }
292
+ if (currentSegment.length > 0) {
293
+ currentSegment.sort();
294
+ result.push(...currentSegment);
295
+ }
296
+ return result;
297
+ };
298
+ };
299
+ const createConfigUtils = (config) => ({
300
+ cache: createLruCache(config.cacheSize),
301
+ parseClassName: createParseClassName(config),
302
+ sortModifiers: createSortModifiers(config),
303
+ postfixLookupClassGroupIds: createPostfixLookupClassGroupIds(config),
304
+ ...createClassGroupUtils(config)
305
+ });
306
+ const createPostfixLookupClassGroupIds = (config) => {
307
+ const lookup = Object.create(null);
308
+ const classGroupIds = config.postfixLookupClassGroups;
309
+ if (classGroupIds) for (let i = 0; i < classGroupIds.length; i++) lookup[classGroupIds[i]] = true;
310
+ return lookup;
311
+ };
312
+ const SPLIT_CLASSES_REGEX = /\s+/;
313
+ const mergeClassList = (classList, configUtils) => {
314
+ const { parseClassName, getClassGroupId, getConflictingClassGroupIds, sortModifiers, postfixLookupClassGroupIds } = configUtils;
315
+ /**
316
+ * Set of classGroupIds in following format:
317
+ * `{importantModifier}{variantModifiers}{classGroupId}`
318
+ * @example 'float'
319
+ * @example 'hover:focus:bg-color'
320
+ * @example 'md:!pr'
321
+ */
322
+ const classGroupsInConflict = [];
323
+ const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
324
+ let result = "";
325
+ for (let index = classNames.length - 1; index >= 0; index -= 1) {
326
+ const originalClassName = classNames[index];
327
+ const { isExternal, modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition } = parseClassName(originalClassName);
328
+ if (isExternal) {
329
+ result = originalClassName + (result.length > 0 ? " " + result : result);
330
+ continue;
331
+ }
332
+ let hasPostfixModifier = !!maybePostfixModifierPosition;
333
+ let classGroupId;
334
+ if (hasPostfixModifier) {
335
+ classGroupId = getClassGroupId(baseClassName.substring(0, maybePostfixModifierPosition));
336
+ const classGroupIdWithPostfix = classGroupId && postfixLookupClassGroupIds[classGroupId] ? getClassGroupId(baseClassName) : void 0;
337
+ if (classGroupIdWithPostfix && classGroupIdWithPostfix !== classGroupId) {
338
+ classGroupId = classGroupIdWithPostfix;
339
+ hasPostfixModifier = false;
340
+ }
341
+ } else classGroupId = getClassGroupId(baseClassName);
342
+ if (!classGroupId) {
343
+ if (!hasPostfixModifier) {
344
+ result = originalClassName + (result.length > 0 ? " " + result : result);
345
+ continue;
346
+ }
347
+ classGroupId = getClassGroupId(baseClassName);
348
+ if (!classGroupId) {
349
+ result = originalClassName + (result.length > 0 ? " " + result : result);
350
+ continue;
351
+ }
352
+ hasPostfixModifier = false;
353
+ }
354
+ const variantModifier = modifiers.length === 0 ? "" : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(":");
355
+ const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
356
+ const classId = modifierId + classGroupId;
357
+ if (classGroupsInConflict.indexOf(classId) > -1) continue;
358
+ classGroupsInConflict.push(classId);
359
+ const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
360
+ for (let i = 0; i < conflictGroups.length; ++i) {
361
+ const group = conflictGroups[i];
362
+ classGroupsInConflict.push(modifierId + group);
363
+ }
364
+ result = originalClassName + (result.length > 0 ? " " + result : result);
365
+ }
366
+ return result;
367
+ };
368
+ /**
369
+ * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.
370
+ *
371
+ * Specifically:
372
+ * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js
373
+ * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts
374
+ *
375
+ * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)
376
+ */
377
+ const twJoin = (...classLists) => {
378
+ let index = 0;
379
+ let argument;
380
+ let resolvedValue;
381
+ let string = "";
382
+ while (index < classLists.length) if (argument = classLists[index++]) {
383
+ if (resolvedValue = toValue(argument)) {
384
+ string && (string += " ");
385
+ string += resolvedValue;
386
+ }
387
+ }
388
+ return string;
389
+ };
390
+ const toValue = (mix) => {
391
+ if (typeof mix === "string") return mix;
392
+ let resolvedValue;
393
+ let string = "";
394
+ for (let k = 0; k < mix.length; k++) if (mix[k]) {
395
+ if (resolvedValue = toValue(mix[k])) {
396
+ string && (string += " ");
397
+ string += resolvedValue;
398
+ }
399
+ }
400
+ return string;
401
+ };
402
+ const createTailwindMerge = (createConfigFirst, ...createConfigRest) => {
403
+ let configUtils;
404
+ let cacheGet;
405
+ let cacheSet;
406
+ let functionToCall;
407
+ const initTailwindMerge = (classList) => {
408
+ const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
409
+ configUtils = createConfigUtils(config);
410
+ cacheGet = configUtils.cache.get;
411
+ cacheSet = configUtils.cache.set;
412
+ functionToCall = tailwindMerge;
413
+ return tailwindMerge(classList);
414
+ };
415
+ const tailwindMerge = (classList) => {
416
+ const cachedResult = cacheGet(classList);
417
+ if (cachedResult) return cachedResult;
418
+ const result = mergeClassList(classList, configUtils);
419
+ cacheSet(classList, result);
420
+ return result;
421
+ };
422
+ functionToCall = initTailwindMerge;
423
+ return (...args) => functionToCall(twJoin(...args));
424
+ };
425
+ const fallbackThemeArr = [];
426
+ const fromTheme = (key) => {
427
+ const themeGetter = (theme) => theme[key] || fallbackThemeArr;
428
+ themeGetter.isThemeGetter = true;
429
+ themeGetter.themeKey = key;
430
+ return themeGetter;
431
+ };
432
+ const arbitraryValueRegex = /^\[(?:(\w[\w-]*):)?(.+)\]$/i;
433
+ const arbitraryVariableRegex = /^\((?:(\w[\w-]*):)?(.+)\)$/i;
434
+ const fractionRegex = /^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/;
435
+ const tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
436
+ const lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
437
+ const colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix|color|light-dark)\(.+\)$/;
438
+ const shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
439
+ const imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
440
+ const isFraction = (value) => fractionRegex.test(value);
441
+ const isNumber = (value) => !!value && !Number.isNaN(Number(value));
442
+ const isInteger = (value) => !!value && Number.isInteger(Number(value));
443
+ const isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
444
+ const isTshirtSize = (value) => tshirtUnitRegex.test(value);
445
+ const isAny = () => true;
446
+ const isLengthOnly = (value) => lengthUnitRegex.test(value) && !colorFunctionRegex.test(value);
447
+ const isNever = () => false;
448
+ const isShadow = (value) => shadowRegex.test(value);
449
+ const isImage = (value) => imageRegex.test(value);
450
+ const isAnyNonArbitrary = (value) => !isArbitraryValue(value) && !isArbitraryVariable(value);
451
+ const 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));
452
+ const isArbitrarySize = (value) => getIsArbitraryValue(value, isLabelSize, isNever);
453
+ const isArbitraryValue = (value) => arbitraryValueRegex.test(value);
454
+ const isArbitraryLength = (value) => getIsArbitraryValue(value, isLabelLength, isLengthOnly);
455
+ const isArbitraryNumber = (value) => getIsArbitraryValue(value, isLabelNumber, isNumber);
456
+ const isArbitraryWeight = (value) => getIsArbitraryValue(value, isLabelWeight, isAny);
457
+ const isArbitraryFamilyName = (value) => getIsArbitraryValue(value, isLabelFamilyName, isNever);
458
+ const isArbitraryPosition = (value) => getIsArbitraryValue(value, isLabelPosition, isNever);
459
+ const isArbitraryImage = (value) => getIsArbitraryValue(value, isLabelImage, isImage);
460
+ const isArbitraryShadow = (value) => getIsArbitraryValue(value, isLabelShadow, isShadow);
461
+ const isArbitraryVariable = (value) => arbitraryVariableRegex.test(value);
462
+ const isArbitraryVariableLength = (value) => getIsArbitraryVariable(value, isLabelLength);
463
+ const isArbitraryVariableFamilyName = (value) => getIsArbitraryVariable(value, isLabelFamilyName);
464
+ const isArbitraryVariablePosition = (value) => getIsArbitraryVariable(value, isLabelPosition);
465
+ const isArbitraryVariableSize = (value) => getIsArbitraryVariable(value, isLabelSize);
466
+ const isArbitraryVariableImage = (value) => getIsArbitraryVariable(value, isLabelImage);
467
+ const isArbitraryVariableShadow = (value) => getIsArbitraryVariable(value, isLabelShadow, true);
468
+ const isArbitraryVariableWeight = (value) => getIsArbitraryVariable(value, isLabelWeight, true);
469
+ const getIsArbitraryValue = (value, testLabel, testValue) => {
470
+ const result = arbitraryValueRegex.exec(value);
471
+ if (result) {
472
+ if (result[1]) return testLabel(result[1]);
473
+ return testValue(result[2]);
474
+ }
475
+ return false;
476
+ };
477
+ const getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {
478
+ const result = arbitraryVariableRegex.exec(value);
479
+ if (result) {
480
+ if (result[1]) return testLabel(result[1]);
481
+ return shouldMatchNoLabel;
482
+ }
483
+ return false;
484
+ };
485
+ const isLabelPosition = (label) => label === "position" || label === "percentage";
486
+ const isLabelImage = (label) => label === "image" || label === "url";
487
+ const isLabelSize = (label) => label === "length" || label === "size" || label === "bg-size";
488
+ const isLabelLength = (label) => label === "length";
489
+ const isLabelNumber = (label) => label === "number";
490
+ const isLabelFamilyName = (label) => label === "family-name";
491
+ const isLabelWeight = (label) => label === "number" || label === "weight";
492
+ const isLabelShadow = (label) => label === "shadow";
493
+ const getDefaultConfig = () => {
494
+ /**
495
+ * Theme getters for theme variable namespaces
496
+ * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces
497
+ */
498
+ const themeColor = fromTheme("color");
499
+ const themeFont = fromTheme("font");
500
+ const themeText = fromTheme("text");
501
+ const themeFontWeight = fromTheme("font-weight");
502
+ const themeTracking = fromTheme("tracking");
503
+ const themeLeading = fromTheme("leading");
504
+ const themeBreakpoint = fromTheme("breakpoint");
505
+ const themeContainer = fromTheme("container");
506
+ const themeSpacing = fromTheme("spacing");
507
+ const themeRadius = fromTheme("radius");
508
+ const themeShadow = fromTheme("shadow");
509
+ const themeInsetShadow = fromTheme("inset-shadow");
510
+ const themeTextShadow = fromTheme("text-shadow");
511
+ const themeDropShadow = fromTheme("drop-shadow");
512
+ const themeBlur = fromTheme("blur");
513
+ const themePerspective = fromTheme("perspective");
514
+ const themeAspect = fromTheme("aspect");
515
+ const themeEase = fromTheme("ease");
516
+ const themeAnimate = fromTheme("animate");
517
+ /**
518
+ * Helpers to avoid repeating the same scales
519
+ *
520
+ * We use functions that create a new array every time they're called instead of static arrays.
521
+ * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.
522
+ */
523
+ const scaleBreak = () => [
524
+ "auto",
525
+ "avoid",
526
+ "all",
527
+ "avoid-page",
528
+ "page",
529
+ "left",
530
+ "right",
531
+ "column"
532
+ ];
533
+ const scalePosition = () => [
534
+ "center",
535
+ "top",
536
+ "bottom",
537
+ "left",
538
+ "right",
539
+ "top-left",
540
+ "left-top",
541
+ "top-right",
542
+ "right-top",
543
+ "bottom-right",
544
+ "right-bottom",
545
+ "bottom-left",
546
+ "left-bottom"
547
+ ];
548
+ const scalePositionWithArbitrary = () => [
549
+ ...scalePosition(),
550
+ isArbitraryVariable,
551
+ isArbitraryValue
552
+ ];
553
+ const scaleOverflow = () => [
554
+ "auto",
555
+ "hidden",
556
+ "clip",
557
+ "visible",
558
+ "scroll"
559
+ ];
560
+ const scaleOverscroll = () => [
561
+ "auto",
562
+ "contain",
563
+ "none"
564
+ ];
565
+ const scaleUnambiguousSpacing = () => [
566
+ isArbitraryVariable,
567
+ isArbitraryValue,
568
+ themeSpacing
569
+ ];
570
+ const scaleInset = () => [
571
+ isFraction,
572
+ "full",
573
+ "auto",
574
+ ...scaleUnambiguousSpacing()
575
+ ];
576
+ const scaleGridTemplateColsRows = () => [
577
+ isInteger,
578
+ "none",
579
+ "subgrid",
580
+ isArbitraryVariable,
581
+ isArbitraryValue
582
+ ];
583
+ const scaleGridColRowStartAndEnd = () => [
584
+ "auto",
585
+ { span: [
586
+ "full",
587
+ isInteger,
588
+ isArbitraryVariable,
589
+ isArbitraryValue
590
+ ] },
591
+ isInteger,
592
+ isArbitraryVariable,
593
+ isArbitraryValue
594
+ ];
595
+ const scaleGridColRowStartOrEnd = () => [
596
+ isInteger,
597
+ "auto",
598
+ isArbitraryVariable,
599
+ isArbitraryValue
600
+ ];
601
+ const scaleGridAutoColsRows = () => [
602
+ "auto",
603
+ "min",
604
+ "max",
605
+ "fr",
606
+ isArbitraryVariable,
607
+ isArbitraryValue
608
+ ];
609
+ const scaleAlignPrimaryAxis = () => [
610
+ "start",
611
+ "end",
612
+ "center",
613
+ "between",
614
+ "around",
615
+ "evenly",
616
+ "stretch",
617
+ "baseline",
618
+ "center-safe",
619
+ "end-safe"
620
+ ];
621
+ const scaleAlignSecondaryAxis = () => [
622
+ "start",
623
+ "end",
624
+ "center",
625
+ "stretch",
626
+ "center-safe",
627
+ "end-safe"
628
+ ];
629
+ const scaleMargin = () => ["auto", ...scaleUnambiguousSpacing()];
630
+ const scaleSizing = () => [
631
+ isFraction,
632
+ "auto",
633
+ "full",
634
+ "dvw",
635
+ "dvh",
636
+ "lvw",
637
+ "lvh",
638
+ "svw",
639
+ "svh",
640
+ "min",
641
+ "max",
642
+ "fit",
643
+ ...scaleUnambiguousSpacing()
644
+ ];
645
+ const scaleSizingInline = () => [
646
+ themeContainer,
647
+ isFraction,
648
+ "screen",
649
+ "full",
650
+ "dvw",
651
+ "lvw",
652
+ "svw",
653
+ "min",
654
+ "max",
655
+ "fit",
656
+ ...scaleUnambiguousSpacing()
657
+ ];
658
+ const scaleSizingBlock = () => [
659
+ isFraction,
660
+ "screen",
661
+ "full",
662
+ "lh",
663
+ "dvh",
664
+ "lvh",
665
+ "svh",
666
+ "min",
667
+ "max",
668
+ "fit",
669
+ ...scaleUnambiguousSpacing()
670
+ ];
671
+ const scaleColor = () => [
672
+ themeColor,
673
+ isArbitraryVariable,
674
+ isArbitraryValue
675
+ ];
676
+ const scaleBgPosition = () => [
677
+ ...scalePosition(),
678
+ isArbitraryVariablePosition,
679
+ isArbitraryPosition,
680
+ { position: [isArbitraryVariable, isArbitraryValue] }
681
+ ];
682
+ const scaleBgRepeat = () => ["no-repeat", { repeat: [
683
+ "",
684
+ "x",
685
+ "y",
686
+ "space",
687
+ "round"
688
+ ] }];
689
+ const scaleBgSize = () => [
690
+ "auto",
691
+ "cover",
692
+ "contain",
693
+ isArbitraryVariableSize,
694
+ isArbitrarySize,
695
+ { size: [isArbitraryVariable, isArbitraryValue] }
696
+ ];
697
+ const scaleGradientStopPosition = () => [
698
+ isPercent,
699
+ isArbitraryVariableLength,
700
+ isArbitraryLength
701
+ ];
702
+ const scaleRadius = () => [
703
+ "",
704
+ "none",
705
+ "full",
706
+ themeRadius,
707
+ isArbitraryVariable,
708
+ isArbitraryValue
709
+ ];
710
+ const scaleBorderWidth = () => [
711
+ "",
712
+ isNumber,
713
+ isArbitraryVariableLength,
714
+ isArbitraryLength
715
+ ];
716
+ const scaleLineStyle = () => [
717
+ "solid",
718
+ "dashed",
719
+ "dotted",
720
+ "double"
721
+ ];
722
+ const scaleBlendMode = () => [
723
+ "normal",
724
+ "multiply",
725
+ "screen",
726
+ "overlay",
727
+ "darken",
728
+ "lighten",
729
+ "color-dodge",
730
+ "color-burn",
731
+ "hard-light",
732
+ "soft-light",
733
+ "difference",
734
+ "exclusion",
735
+ "hue",
736
+ "saturation",
737
+ "color",
738
+ "luminosity"
739
+ ];
740
+ const scaleMaskImagePosition = () => [
741
+ isNumber,
742
+ isPercent,
743
+ isArbitraryVariablePosition,
744
+ isArbitraryPosition
745
+ ];
746
+ const scaleBlur = () => [
747
+ "",
748
+ "none",
749
+ themeBlur,
750
+ isArbitraryVariable,
751
+ isArbitraryValue
752
+ ];
753
+ const scaleRotate = () => [
754
+ "none",
755
+ isNumber,
756
+ isArbitraryVariable,
757
+ isArbitraryValue
758
+ ];
759
+ const scaleScale = () => [
760
+ "none",
761
+ isNumber,
762
+ isArbitraryVariable,
763
+ isArbitraryValue
764
+ ];
765
+ const scaleSkew = () => [
766
+ isNumber,
767
+ isArbitraryVariable,
768
+ isArbitraryValue
769
+ ];
770
+ const scaleTranslate = () => [
771
+ isFraction,
772
+ "full",
773
+ ...scaleUnambiguousSpacing()
774
+ ];
775
+ return {
776
+ cacheSize: 500,
777
+ theme: {
778
+ animate: [
779
+ "spin",
780
+ "ping",
781
+ "pulse",
782
+ "bounce"
783
+ ],
784
+ aspect: ["video"],
785
+ blur: [isTshirtSize],
786
+ breakpoint: [isTshirtSize],
787
+ color: [isAny],
788
+ container: [isTshirtSize],
789
+ "drop-shadow": [isTshirtSize],
790
+ ease: [
791
+ "in",
792
+ "out",
793
+ "in-out"
794
+ ],
795
+ font: [isAnyNonArbitrary],
796
+ "font-weight": [
797
+ "thin",
798
+ "extralight",
799
+ "light",
800
+ "normal",
801
+ "medium",
802
+ "semibold",
803
+ "bold",
804
+ "extrabold",
805
+ "black"
806
+ ],
807
+ "inset-shadow": [isTshirtSize],
808
+ leading: [
809
+ "none",
810
+ "tight",
811
+ "snug",
812
+ "normal",
813
+ "relaxed",
814
+ "loose"
815
+ ],
816
+ perspective: [
817
+ "dramatic",
818
+ "near",
819
+ "normal",
820
+ "midrange",
821
+ "distant",
822
+ "none"
823
+ ],
824
+ radius: [isTshirtSize],
825
+ shadow: [isTshirtSize],
826
+ spacing: ["px", isNumber],
827
+ text: [isTshirtSize],
828
+ "text-shadow": [isTshirtSize],
829
+ tracking: [
830
+ "tighter",
831
+ "tight",
832
+ "normal",
833
+ "wide",
834
+ "wider",
835
+ "widest"
836
+ ]
837
+ },
838
+ classGroups: {
839
+ /**
840
+ * Aspect Ratio
841
+ * @see https://tailwindcss.com/docs/aspect-ratio
842
+ */
843
+ aspect: [{ aspect: [
844
+ "auto",
845
+ "square",
846
+ isFraction,
847
+ isArbitraryValue,
848
+ isArbitraryVariable,
849
+ themeAspect
850
+ ] }],
851
+ /**
852
+ * Container
853
+ * @see https://tailwindcss.com/docs/container
854
+ * @deprecated since Tailwind CSS v4.0.0
855
+ */
856
+ container: ["container"],
857
+ /**
858
+ * Container Type
859
+ * @see https://tailwindcss.com/docs/responsive-design#container-queries
860
+ */
861
+ "container-type": [{ "@container": [
862
+ "",
863
+ "normal",
864
+ "size",
865
+ isArbitraryVariable,
866
+ isArbitraryValue
867
+ ] }],
868
+ /**
869
+ * Container Name
870
+ * @see https://tailwindcss.com/docs/responsive-design#named-containers
871
+ */
872
+ "container-named": [isNamedContainerQuery],
873
+ /**
874
+ * Columns
875
+ * @see https://tailwindcss.com/docs/columns
876
+ */
877
+ columns: [{ columns: [
878
+ isNumber,
879
+ "auto",
880
+ isArbitraryValue,
881
+ isArbitraryVariable,
882
+ themeContainer
883
+ ] }],
884
+ /**
885
+ * Break After
886
+ * @see https://tailwindcss.com/docs/break-after
887
+ */
888
+ "break-after": [{ "break-after": scaleBreak() }],
889
+ /**
890
+ * Break Before
891
+ * @see https://tailwindcss.com/docs/break-before
892
+ */
893
+ "break-before": [{ "break-before": scaleBreak() }],
894
+ /**
895
+ * Break Inside
896
+ * @see https://tailwindcss.com/docs/break-inside
897
+ */
898
+ "break-inside": [{ "break-inside": [
899
+ "auto",
900
+ "avoid",
901
+ "avoid-page",
902
+ "avoid-column"
903
+ ] }],
904
+ /**
905
+ * Box Decoration Break
906
+ * @see https://tailwindcss.com/docs/box-decoration-break
907
+ */
908
+ "box-decoration": [{ "box-decoration": ["slice", "clone"] }],
909
+ /**
910
+ * Box Sizing
911
+ * @see https://tailwindcss.com/docs/box-sizing
912
+ */
913
+ box: [{ box: ["border", "content"] }],
914
+ /**
915
+ * Display
916
+ * @see https://tailwindcss.com/docs/display
917
+ */
918
+ display: [
919
+ "block",
920
+ "inline-block",
921
+ "inline",
922
+ "flex",
923
+ "inline-flex",
924
+ "table",
925
+ "inline-table",
926
+ "table-caption",
927
+ "table-cell",
928
+ "table-column",
929
+ "table-column-group",
930
+ "table-footer-group",
931
+ "table-header-group",
932
+ "table-row-group",
933
+ "table-row",
934
+ "flow-root",
935
+ "grid",
936
+ "inline-grid",
937
+ "contents",
938
+ "list-item",
939
+ "hidden"
940
+ ],
941
+ /**
942
+ * Screen Reader Only
943
+ * @see https://tailwindcss.com/docs/display#screen-reader-only
944
+ */
945
+ sr: ["sr-only", "not-sr-only"],
946
+ /**
947
+ * Floats
948
+ * @see https://tailwindcss.com/docs/float
949
+ */
950
+ float: [{ float: [
951
+ "right",
952
+ "left",
953
+ "none",
954
+ "start",
955
+ "end"
956
+ ] }],
957
+ /**
958
+ * Clear
959
+ * @see https://tailwindcss.com/docs/clear
960
+ */
961
+ clear: [{ clear: [
962
+ "left",
963
+ "right",
964
+ "both",
965
+ "none",
966
+ "start",
967
+ "end"
968
+ ] }],
969
+ /**
970
+ * Isolation
971
+ * @see https://tailwindcss.com/docs/isolation
972
+ */
973
+ isolation: ["isolate", "isolation-auto"],
974
+ /**
975
+ * Object Fit
976
+ * @see https://tailwindcss.com/docs/object-fit
977
+ */
978
+ "object-fit": [{ object: [
979
+ "contain",
980
+ "cover",
981
+ "fill",
982
+ "none",
983
+ "scale-down"
984
+ ] }],
985
+ /**
986
+ * Object Position
987
+ * @see https://tailwindcss.com/docs/object-position
988
+ */
989
+ "object-position": [{ object: scalePositionWithArbitrary() }],
990
+ /**
991
+ * Overflow
992
+ * @see https://tailwindcss.com/docs/overflow
993
+ */
994
+ overflow: [{ overflow: scaleOverflow() }],
995
+ /**
996
+ * Overflow X
997
+ * @see https://tailwindcss.com/docs/overflow
998
+ */
999
+ "overflow-x": [{ "overflow-x": scaleOverflow() }],
1000
+ /**
1001
+ * Overflow Y
1002
+ * @see https://tailwindcss.com/docs/overflow
1003
+ */
1004
+ "overflow-y": [{ "overflow-y": scaleOverflow() }],
1005
+ /**
1006
+ * Overscroll Behavior
1007
+ * @see https://tailwindcss.com/docs/overscroll-behavior
1008
+ */
1009
+ overscroll: [{ overscroll: scaleOverscroll() }],
1010
+ /**
1011
+ * Overscroll Behavior X
1012
+ * @see https://tailwindcss.com/docs/overscroll-behavior
1013
+ */
1014
+ "overscroll-x": [{ "overscroll-x": scaleOverscroll() }],
1015
+ /**
1016
+ * Overscroll Behavior Y
1017
+ * @see https://tailwindcss.com/docs/overscroll-behavior
1018
+ */
1019
+ "overscroll-y": [{ "overscroll-y": scaleOverscroll() }],
1020
+ /**
1021
+ * Position
1022
+ * @see https://tailwindcss.com/docs/position
1023
+ */
1024
+ position: [
1025
+ "static",
1026
+ "fixed",
1027
+ "absolute",
1028
+ "relative",
1029
+ "sticky"
1030
+ ],
1031
+ /**
1032
+ * Inset
1033
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1034
+ */
1035
+ inset: [{ inset: scaleInset() }],
1036
+ /**
1037
+ * Inset Inline
1038
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1039
+ */
1040
+ "inset-x": [{ "inset-x": scaleInset() }],
1041
+ /**
1042
+ * Inset Block
1043
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1044
+ */
1045
+ "inset-y": [{ "inset-y": scaleInset() }],
1046
+ /**
1047
+ * Inset Inline Start
1048
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1049
+ * @todo class group will be renamed to `inset-s` in next major release
1050
+ */
1051
+ start: [{
1052
+ "inset-s": scaleInset(),
1053
+ /**
1054
+ * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.
1055
+ * @see https://github.com/tailwindlabs/tailwindcss/pull/19613
1056
+ */
1057
+ start: scaleInset()
1058
+ }],
1059
+ /**
1060
+ * Inset Inline End
1061
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1062
+ * @todo class group will be renamed to `inset-e` in next major release
1063
+ */
1064
+ end: [{
1065
+ "inset-e": scaleInset(),
1066
+ /**
1067
+ * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.
1068
+ * @see https://github.com/tailwindlabs/tailwindcss/pull/19613
1069
+ */
1070
+ end: scaleInset()
1071
+ }],
1072
+ /**
1073
+ * Inset Block Start
1074
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1075
+ */
1076
+ "inset-bs": [{ "inset-bs": scaleInset() }],
1077
+ /**
1078
+ * Inset Block End
1079
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1080
+ */
1081
+ "inset-be": [{ "inset-be": scaleInset() }],
1082
+ /**
1083
+ * Top
1084
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1085
+ */
1086
+ top: [{ top: scaleInset() }],
1087
+ /**
1088
+ * Right
1089
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1090
+ */
1091
+ right: [{ right: scaleInset() }],
1092
+ /**
1093
+ * Bottom
1094
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1095
+ */
1096
+ bottom: [{ bottom: scaleInset() }],
1097
+ /**
1098
+ * Left
1099
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
1100
+ */
1101
+ left: [{ left: scaleInset() }],
1102
+ /**
1103
+ * Visibility
1104
+ * @see https://tailwindcss.com/docs/visibility
1105
+ */
1106
+ visibility: [
1107
+ "visible",
1108
+ "invisible",
1109
+ "collapse"
1110
+ ],
1111
+ /**
1112
+ * Z-Index
1113
+ * @see https://tailwindcss.com/docs/z-index
1114
+ */
1115
+ z: [{ z: [
1116
+ isInteger,
1117
+ "auto",
1118
+ isArbitraryVariable,
1119
+ isArbitraryValue
1120
+ ] }],
1121
+ /**
1122
+ * Flex Basis
1123
+ * @see https://tailwindcss.com/docs/flex-basis
1124
+ */
1125
+ basis: [{ basis: [
1126
+ isFraction,
1127
+ "full",
1128
+ "auto",
1129
+ themeContainer,
1130
+ ...scaleUnambiguousSpacing()
1131
+ ] }],
1132
+ /**
1133
+ * Flex Direction
1134
+ * @see https://tailwindcss.com/docs/flex-direction
1135
+ */
1136
+ "flex-direction": [{ flex: [
1137
+ "row",
1138
+ "row-reverse",
1139
+ "col",
1140
+ "col-reverse"
1141
+ ] }],
1142
+ /**
1143
+ * Flex Wrap
1144
+ * @see https://tailwindcss.com/docs/flex-wrap
1145
+ */
1146
+ "flex-wrap": [{ flex: [
1147
+ "nowrap",
1148
+ "wrap",
1149
+ "wrap-reverse"
1150
+ ] }],
1151
+ /**
1152
+ * Flex
1153
+ * @see https://tailwindcss.com/docs/flex
1154
+ */
1155
+ flex: [{ flex: [
1156
+ isNumber,
1157
+ isFraction,
1158
+ "auto",
1159
+ "initial",
1160
+ "none",
1161
+ isArbitraryValue
1162
+ ] }],
1163
+ /**
1164
+ * Flex Grow
1165
+ * @see https://tailwindcss.com/docs/flex-grow
1166
+ */
1167
+ grow: [{ grow: [
1168
+ "",
1169
+ isNumber,
1170
+ isArbitraryVariable,
1171
+ isArbitraryValue
1172
+ ] }],
1173
+ /**
1174
+ * Flex Shrink
1175
+ * @see https://tailwindcss.com/docs/flex-shrink
1176
+ */
1177
+ shrink: [{ shrink: [
1178
+ "",
1179
+ isNumber,
1180
+ isArbitraryVariable,
1181
+ isArbitraryValue
1182
+ ] }],
1183
+ /**
1184
+ * Order
1185
+ * @see https://tailwindcss.com/docs/order
1186
+ */
1187
+ order: [{ order: [
1188
+ isInteger,
1189
+ "first",
1190
+ "last",
1191
+ "none",
1192
+ isArbitraryVariable,
1193
+ isArbitraryValue
1194
+ ] }],
1195
+ /**
1196
+ * Grid Template Columns
1197
+ * @see https://tailwindcss.com/docs/grid-template-columns
1198
+ */
1199
+ "grid-cols": [{ "grid-cols": scaleGridTemplateColsRows() }],
1200
+ /**
1201
+ * Grid Column Start / End
1202
+ * @see https://tailwindcss.com/docs/grid-column
1203
+ */
1204
+ "col-start-end": [{ col: scaleGridColRowStartAndEnd() }],
1205
+ /**
1206
+ * Grid Column Start
1207
+ * @see https://tailwindcss.com/docs/grid-column
1208
+ */
1209
+ "col-start": [{ "col-start": scaleGridColRowStartOrEnd() }],
1210
+ /**
1211
+ * Grid Column End
1212
+ * @see https://tailwindcss.com/docs/grid-column
1213
+ */
1214
+ "col-end": [{ "col-end": scaleGridColRowStartOrEnd() }],
1215
+ /**
1216
+ * Grid Template Rows
1217
+ * @see https://tailwindcss.com/docs/grid-template-rows
1218
+ */
1219
+ "grid-rows": [{ "grid-rows": scaleGridTemplateColsRows() }],
1220
+ /**
1221
+ * Grid Row Start / End
1222
+ * @see https://tailwindcss.com/docs/grid-row
1223
+ */
1224
+ "row-start-end": [{ row: scaleGridColRowStartAndEnd() }],
1225
+ /**
1226
+ * Grid Row Start
1227
+ * @see https://tailwindcss.com/docs/grid-row
1228
+ */
1229
+ "row-start": [{ "row-start": scaleGridColRowStartOrEnd() }],
1230
+ /**
1231
+ * Grid Row End
1232
+ * @see https://tailwindcss.com/docs/grid-row
1233
+ */
1234
+ "row-end": [{ "row-end": scaleGridColRowStartOrEnd() }],
1235
+ /**
1236
+ * Grid Auto Flow
1237
+ * @see https://tailwindcss.com/docs/grid-auto-flow
1238
+ */
1239
+ "grid-flow": [{ "grid-flow": [
1240
+ "row",
1241
+ "col",
1242
+ "dense",
1243
+ "row-dense",
1244
+ "col-dense"
1245
+ ] }],
1246
+ /**
1247
+ * Grid Auto Columns
1248
+ * @see https://tailwindcss.com/docs/grid-auto-columns
1249
+ */
1250
+ "auto-cols": [{ "auto-cols": scaleGridAutoColsRows() }],
1251
+ /**
1252
+ * Grid Auto Rows
1253
+ * @see https://tailwindcss.com/docs/grid-auto-rows
1254
+ */
1255
+ "auto-rows": [{ "auto-rows": scaleGridAutoColsRows() }],
1256
+ /**
1257
+ * Gap
1258
+ * @see https://tailwindcss.com/docs/gap
1259
+ */
1260
+ gap: [{ gap: scaleUnambiguousSpacing() }],
1261
+ /**
1262
+ * Gap X
1263
+ * @see https://tailwindcss.com/docs/gap
1264
+ */
1265
+ "gap-x": [{ "gap-x": scaleUnambiguousSpacing() }],
1266
+ /**
1267
+ * Gap Y
1268
+ * @see https://tailwindcss.com/docs/gap
1269
+ */
1270
+ "gap-y": [{ "gap-y": scaleUnambiguousSpacing() }],
1271
+ /**
1272
+ * Justify Content
1273
+ * @see https://tailwindcss.com/docs/justify-content
1274
+ */
1275
+ "justify-content": [{ justify: [...scaleAlignPrimaryAxis(), "normal"] }],
1276
+ /**
1277
+ * Justify Items
1278
+ * @see https://tailwindcss.com/docs/justify-items
1279
+ */
1280
+ "justify-items": [{ "justify-items": [...scaleAlignSecondaryAxis(), "normal"] }],
1281
+ /**
1282
+ * Justify Self
1283
+ * @see https://tailwindcss.com/docs/justify-self
1284
+ */
1285
+ "justify-self": [{ "justify-self": ["auto", ...scaleAlignSecondaryAxis()] }],
1286
+ /**
1287
+ * Align Content
1288
+ * @see https://tailwindcss.com/docs/align-content
1289
+ */
1290
+ "align-content": [{ content: ["normal", ...scaleAlignPrimaryAxis()] }],
1291
+ /**
1292
+ * Align Items
1293
+ * @see https://tailwindcss.com/docs/align-items
1294
+ */
1295
+ "align-items": [{ items: [...scaleAlignSecondaryAxis(), { baseline: ["", "last"] }] }],
1296
+ /**
1297
+ * Align Self
1298
+ * @see https://tailwindcss.com/docs/align-self
1299
+ */
1300
+ "align-self": [{ self: [
1301
+ "auto",
1302
+ ...scaleAlignSecondaryAxis(),
1303
+ { baseline: ["", "last"] }
1304
+ ] }],
1305
+ /**
1306
+ * Place Content
1307
+ * @see https://tailwindcss.com/docs/place-content
1308
+ */
1309
+ "place-content": [{ "place-content": scaleAlignPrimaryAxis() }],
1310
+ /**
1311
+ * Place Items
1312
+ * @see https://tailwindcss.com/docs/place-items
1313
+ */
1314
+ "place-items": [{ "place-items": [...scaleAlignSecondaryAxis(), "baseline"] }],
1315
+ /**
1316
+ * Place Self
1317
+ * @see https://tailwindcss.com/docs/place-self
1318
+ */
1319
+ "place-self": [{ "place-self": ["auto", ...scaleAlignSecondaryAxis()] }],
1320
+ /**
1321
+ * Padding
1322
+ * @see https://tailwindcss.com/docs/padding
1323
+ */
1324
+ p: [{ p: scaleUnambiguousSpacing() }],
1325
+ /**
1326
+ * Padding Inline
1327
+ * @see https://tailwindcss.com/docs/padding
1328
+ */
1329
+ px: [{ px: scaleUnambiguousSpacing() }],
1330
+ /**
1331
+ * Padding Block
1332
+ * @see https://tailwindcss.com/docs/padding
1333
+ */
1334
+ py: [{ py: scaleUnambiguousSpacing() }],
1335
+ /**
1336
+ * Padding Inline Start
1337
+ * @see https://tailwindcss.com/docs/padding
1338
+ */
1339
+ ps: [{ ps: scaleUnambiguousSpacing() }],
1340
+ /**
1341
+ * Padding Inline End
1342
+ * @see https://tailwindcss.com/docs/padding
1343
+ */
1344
+ pe: [{ pe: scaleUnambiguousSpacing() }],
1345
+ /**
1346
+ * Padding Block Start
1347
+ * @see https://tailwindcss.com/docs/padding
1348
+ */
1349
+ pbs: [{ pbs: scaleUnambiguousSpacing() }],
1350
+ /**
1351
+ * Padding Block End
1352
+ * @see https://tailwindcss.com/docs/padding
1353
+ */
1354
+ pbe: [{ pbe: scaleUnambiguousSpacing() }],
1355
+ /**
1356
+ * Padding Top
1357
+ * @see https://tailwindcss.com/docs/padding
1358
+ */
1359
+ pt: [{ pt: scaleUnambiguousSpacing() }],
1360
+ /**
1361
+ * Padding Right
1362
+ * @see https://tailwindcss.com/docs/padding
1363
+ */
1364
+ pr: [{ pr: scaleUnambiguousSpacing() }],
1365
+ /**
1366
+ * Padding Bottom
1367
+ * @see https://tailwindcss.com/docs/padding
1368
+ */
1369
+ pb: [{ pb: scaleUnambiguousSpacing() }],
1370
+ /**
1371
+ * Padding Left
1372
+ * @see https://tailwindcss.com/docs/padding
1373
+ */
1374
+ pl: [{ pl: scaleUnambiguousSpacing() }],
1375
+ /**
1376
+ * Margin
1377
+ * @see https://tailwindcss.com/docs/margin
1378
+ */
1379
+ m: [{ m: scaleMargin() }],
1380
+ /**
1381
+ * Margin Inline
1382
+ * @see https://tailwindcss.com/docs/margin
1383
+ */
1384
+ mx: [{ mx: scaleMargin() }],
1385
+ /**
1386
+ * Margin Block
1387
+ * @see https://tailwindcss.com/docs/margin
1388
+ */
1389
+ my: [{ my: scaleMargin() }],
1390
+ /**
1391
+ * Margin Inline Start
1392
+ * @see https://tailwindcss.com/docs/margin
1393
+ */
1394
+ ms: [{ ms: scaleMargin() }],
1395
+ /**
1396
+ * Margin Inline End
1397
+ * @see https://tailwindcss.com/docs/margin
1398
+ */
1399
+ me: [{ me: scaleMargin() }],
1400
+ /**
1401
+ * Margin Block Start
1402
+ * @see https://tailwindcss.com/docs/margin
1403
+ */
1404
+ mbs: [{ mbs: scaleMargin() }],
1405
+ /**
1406
+ * Margin Block End
1407
+ * @see https://tailwindcss.com/docs/margin
1408
+ */
1409
+ mbe: [{ mbe: scaleMargin() }],
1410
+ /**
1411
+ * Margin Top
1412
+ * @see https://tailwindcss.com/docs/margin
1413
+ */
1414
+ mt: [{ mt: scaleMargin() }],
1415
+ /**
1416
+ * Margin Right
1417
+ * @see https://tailwindcss.com/docs/margin
1418
+ */
1419
+ mr: [{ mr: scaleMargin() }],
1420
+ /**
1421
+ * Margin Bottom
1422
+ * @see https://tailwindcss.com/docs/margin
1423
+ */
1424
+ mb: [{ mb: scaleMargin() }],
1425
+ /**
1426
+ * Margin Left
1427
+ * @see https://tailwindcss.com/docs/margin
1428
+ */
1429
+ ml: [{ ml: scaleMargin() }],
1430
+ /**
1431
+ * Space Between X
1432
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1433
+ */
1434
+ "space-x": [{ "space-x": scaleUnambiguousSpacing() }],
1435
+ /**
1436
+ * Space Between X Reverse
1437
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1438
+ */
1439
+ "space-x-reverse": ["space-x-reverse"],
1440
+ /**
1441
+ * Space Between Y
1442
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1443
+ */
1444
+ "space-y": [{ "space-y": scaleUnambiguousSpacing() }],
1445
+ /**
1446
+ * Space Between Y Reverse
1447
+ * @see https://tailwindcss.com/docs/margin#adding-space-between-children
1448
+ */
1449
+ "space-y-reverse": ["space-y-reverse"],
1450
+ /**
1451
+ * Size
1452
+ * @see https://tailwindcss.com/docs/width#setting-both-width-and-height
1453
+ */
1454
+ size: [{ size: scaleSizing() }],
1455
+ /**
1456
+ * Inline Size
1457
+ * @see https://tailwindcss.com/docs/inline-size
1458
+ */
1459
+ "inline-size": [{ inline: ["auto", ...scaleSizingInline()] }],
1460
+ /**
1461
+ * Min-Inline Size
1462
+ * @see https://tailwindcss.com/docs/min-inline-size
1463
+ */
1464
+ "min-inline-size": [{ "min-inline": ["auto", ...scaleSizingInline()] }],
1465
+ /**
1466
+ * Max-Inline Size
1467
+ * @see https://tailwindcss.com/docs/max-inline-size
1468
+ */
1469
+ "max-inline-size": [{ "max-inline": ["none", ...scaleSizingInline()] }],
1470
+ /**
1471
+ * Block Size
1472
+ * @see https://tailwindcss.com/docs/block-size
1473
+ */
1474
+ "block-size": [{ block: ["auto", ...scaleSizingBlock()] }],
1475
+ /**
1476
+ * Min-Block Size
1477
+ * @see https://tailwindcss.com/docs/min-block-size
1478
+ */
1479
+ "min-block-size": [{ "min-block": ["auto", ...scaleSizingBlock()] }],
1480
+ /**
1481
+ * Max-Block Size
1482
+ * @see https://tailwindcss.com/docs/max-block-size
1483
+ */
1484
+ "max-block-size": [{ "max-block": ["none", ...scaleSizingBlock()] }],
1485
+ /**
1486
+ * Width
1487
+ * @see https://tailwindcss.com/docs/width
1488
+ */
1489
+ w: [{ w: [
1490
+ themeContainer,
1491
+ "screen",
1492
+ ...scaleSizing()
1493
+ ] }],
1494
+ /**
1495
+ * Min-Width
1496
+ * @see https://tailwindcss.com/docs/min-width
1497
+ */
1498
+ "min-w": [{ "min-w": [
1499
+ themeContainer,
1500
+ "screen",
1501
+ "none",
1502
+ ...scaleSizing()
1503
+ ] }],
1504
+ /**
1505
+ * Max-Width
1506
+ * @see https://tailwindcss.com/docs/max-width
1507
+ */
1508
+ "max-w": [{ "max-w": [
1509
+ themeContainer,
1510
+ "screen",
1511
+ "none",
1512
+ "prose",
1513
+ { screen: [themeBreakpoint] },
1514
+ ...scaleSizing()
1515
+ ] }],
1516
+ /**
1517
+ * Height
1518
+ * @see https://tailwindcss.com/docs/height
1519
+ */
1520
+ h: [{ h: [
1521
+ "screen",
1522
+ "lh",
1523
+ ...scaleSizing()
1524
+ ] }],
1525
+ /**
1526
+ * Min-Height
1527
+ * @see https://tailwindcss.com/docs/min-height
1528
+ */
1529
+ "min-h": [{ "min-h": [
1530
+ "screen",
1531
+ "lh",
1532
+ "none",
1533
+ ...scaleSizing()
1534
+ ] }],
1535
+ /**
1536
+ * Max-Height
1537
+ * @see https://tailwindcss.com/docs/max-height
1538
+ */
1539
+ "max-h": [{ "max-h": [
1540
+ "screen",
1541
+ "lh",
1542
+ "none",
1543
+ ...scaleSizing()
1544
+ ] }],
1545
+ /**
1546
+ * Font Size
1547
+ * @see https://tailwindcss.com/docs/font-size
1548
+ */
1549
+ "font-size": [{ text: [
1550
+ "base",
1551
+ themeText,
1552
+ isArbitraryVariableLength,
1553
+ isArbitraryLength
1554
+ ] }],
1555
+ /**
1556
+ * Font Smoothing
1557
+ * @see https://tailwindcss.com/docs/font-smoothing
1558
+ */
1559
+ "font-smoothing": ["antialiased", "subpixel-antialiased"],
1560
+ /**
1561
+ * Font Style
1562
+ * @see https://tailwindcss.com/docs/font-style
1563
+ */
1564
+ "font-style": ["italic", "not-italic"],
1565
+ /**
1566
+ * Font Weight
1567
+ * @see https://tailwindcss.com/docs/font-weight
1568
+ */
1569
+ "font-weight": [{ font: [
1570
+ themeFontWeight,
1571
+ isArbitraryVariableWeight,
1572
+ isArbitraryWeight
1573
+ ] }],
1574
+ /**
1575
+ * Font Stretch
1576
+ * @see https://tailwindcss.com/docs/font-stretch
1577
+ */
1578
+ "font-stretch": [{ "font-stretch": [
1579
+ "ultra-condensed",
1580
+ "extra-condensed",
1581
+ "condensed",
1582
+ "semi-condensed",
1583
+ "normal",
1584
+ "semi-expanded",
1585
+ "expanded",
1586
+ "extra-expanded",
1587
+ "ultra-expanded",
1588
+ isPercent,
1589
+ isArbitraryValue
1590
+ ] }],
1591
+ /**
1592
+ * Font Family
1593
+ * @see https://tailwindcss.com/docs/font-family
1594
+ */
1595
+ "font-family": [{ font: [
1596
+ isArbitraryVariableFamilyName,
1597
+ isArbitraryFamilyName,
1598
+ themeFont
1599
+ ] }],
1600
+ /**
1601
+ * Font Feature Settings
1602
+ * @see https://tailwindcss.com/docs/font-feature-settings
1603
+ */
1604
+ "font-features": [{ "font-features": [isArbitraryValue] }],
1605
+ /**
1606
+ * Font Variant Numeric
1607
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1608
+ */
1609
+ "fvn-normal": ["normal-nums"],
1610
+ /**
1611
+ * Font Variant Numeric
1612
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1613
+ */
1614
+ "fvn-ordinal": ["ordinal"],
1615
+ /**
1616
+ * Font Variant Numeric
1617
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1618
+ */
1619
+ "fvn-slashed-zero": ["slashed-zero"],
1620
+ /**
1621
+ * Font Variant Numeric
1622
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1623
+ */
1624
+ "fvn-figure": ["lining-nums", "oldstyle-nums"],
1625
+ /**
1626
+ * Font Variant Numeric
1627
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1628
+ */
1629
+ "fvn-spacing": ["proportional-nums", "tabular-nums"],
1630
+ /**
1631
+ * Font Variant Numeric
1632
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1633
+ */
1634
+ "fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
1635
+ /**
1636
+ * Letter Spacing
1637
+ * @see https://tailwindcss.com/docs/letter-spacing
1638
+ */
1639
+ tracking: [{ tracking: [
1640
+ themeTracking,
1641
+ isArbitraryVariable,
1642
+ isArbitraryValue
1643
+ ] }],
1644
+ /**
1645
+ * Line Clamp
1646
+ * @see https://tailwindcss.com/docs/line-clamp
1647
+ */
1648
+ "line-clamp": [{ "line-clamp": [
1649
+ isNumber,
1650
+ "none",
1651
+ isArbitraryVariable,
1652
+ isArbitraryNumber
1653
+ ] }],
1654
+ /**
1655
+ * Line Height
1656
+ * @see https://tailwindcss.com/docs/line-height
1657
+ */
1658
+ leading: [{ leading: [
1659
+ "none",
1660
+ themeLeading,
1661
+ ...scaleUnambiguousSpacing()
1662
+ ] }],
1663
+ /**
1664
+ * List Style Image
1665
+ * @see https://tailwindcss.com/docs/list-style-image
1666
+ */
1667
+ "list-image": [{ "list-image": [
1668
+ "none",
1669
+ isArbitraryVariable,
1670
+ isArbitraryValue
1671
+ ] }],
1672
+ /**
1673
+ * List Style Position
1674
+ * @see https://tailwindcss.com/docs/list-style-position
1675
+ */
1676
+ "list-style-position": [{ list: ["inside", "outside"] }],
1677
+ /**
1678
+ * List Style Type
1679
+ * @see https://tailwindcss.com/docs/list-style-type
1680
+ */
1681
+ "list-style-type": [{ list: [
1682
+ "disc",
1683
+ "decimal",
1684
+ "none",
1685
+ isArbitraryVariable,
1686
+ isArbitraryValue
1687
+ ] }],
1688
+ /**
1689
+ * Text Alignment
1690
+ * @see https://tailwindcss.com/docs/text-align
1691
+ */
1692
+ "text-alignment": [{ text: [
1693
+ "left",
1694
+ "center",
1695
+ "right",
1696
+ "justify",
1697
+ "start",
1698
+ "end"
1699
+ ] }],
1700
+ /**
1701
+ * Placeholder Color
1702
+ * @deprecated since Tailwind CSS v3.0.0
1703
+ * @see https://v3.tailwindcss.com/docs/placeholder-color
1704
+ */
1705
+ "placeholder-color": [{ placeholder: scaleColor() }],
1706
+ /**
1707
+ * Text Color
1708
+ * @see https://tailwindcss.com/docs/text-color
1709
+ */
1710
+ "text-color": [{ text: scaleColor() }],
1711
+ /**
1712
+ * Text Decoration
1713
+ * @see https://tailwindcss.com/docs/text-decoration
1714
+ */
1715
+ "text-decoration": [
1716
+ "underline",
1717
+ "overline",
1718
+ "line-through",
1719
+ "no-underline"
1720
+ ],
1721
+ /**
1722
+ * Text Decoration Style
1723
+ * @see https://tailwindcss.com/docs/text-decoration-style
1724
+ */
1725
+ "text-decoration-style": [{ decoration: [...scaleLineStyle(), "wavy"] }],
1726
+ /**
1727
+ * Text Decoration Thickness
1728
+ * @see https://tailwindcss.com/docs/text-decoration-thickness
1729
+ */
1730
+ "text-decoration-thickness": [{ decoration: [
1731
+ isNumber,
1732
+ "from-font",
1733
+ "auto",
1734
+ isArbitraryVariable,
1735
+ isArbitraryLength
1736
+ ] }],
1737
+ /**
1738
+ * Text Decoration Color
1739
+ * @see https://tailwindcss.com/docs/text-decoration-color
1740
+ */
1741
+ "text-decoration-color": [{ decoration: scaleColor() }],
1742
+ /**
1743
+ * Text Underline Offset
1744
+ * @see https://tailwindcss.com/docs/text-underline-offset
1745
+ */
1746
+ "underline-offset": [{ "underline-offset": [
1747
+ isNumber,
1748
+ "auto",
1749
+ isArbitraryVariable,
1750
+ isArbitraryValue
1751
+ ] }],
1752
+ /**
1753
+ * Text Transform
1754
+ * @see https://tailwindcss.com/docs/text-transform
1755
+ */
1756
+ "text-transform": [
1757
+ "uppercase",
1758
+ "lowercase",
1759
+ "capitalize",
1760
+ "normal-case"
1761
+ ],
1762
+ /**
1763
+ * Text Overflow
1764
+ * @see https://tailwindcss.com/docs/text-overflow
1765
+ */
1766
+ "text-overflow": [
1767
+ "truncate",
1768
+ "text-ellipsis",
1769
+ "text-clip"
1770
+ ],
1771
+ /**
1772
+ * Text Wrap
1773
+ * @see https://tailwindcss.com/docs/text-wrap
1774
+ */
1775
+ "text-wrap": [{ text: [
1776
+ "wrap",
1777
+ "nowrap",
1778
+ "balance",
1779
+ "pretty"
1780
+ ] }],
1781
+ /**
1782
+ * Text Indent
1783
+ * @see https://tailwindcss.com/docs/text-indent
1784
+ */
1785
+ indent: [{ indent: scaleUnambiguousSpacing() }],
1786
+ /**
1787
+ * Tab Size
1788
+ * @see https://tailwindcss.com/docs/tab-size
1789
+ */
1790
+ "tab-size": [{ tab: [
1791
+ isInteger,
1792
+ isArbitraryVariable,
1793
+ isArbitraryValue
1794
+ ] }],
1795
+ /**
1796
+ * Vertical Alignment
1797
+ * @see https://tailwindcss.com/docs/vertical-align
1798
+ */
1799
+ "vertical-align": [{ align: [
1800
+ "baseline",
1801
+ "top",
1802
+ "middle",
1803
+ "bottom",
1804
+ "text-top",
1805
+ "text-bottom",
1806
+ "sub",
1807
+ "super",
1808
+ isArbitraryVariable,
1809
+ isArbitraryValue
1810
+ ] }],
1811
+ /**
1812
+ * Whitespace
1813
+ * @see https://tailwindcss.com/docs/whitespace
1814
+ */
1815
+ whitespace: [{ whitespace: [
1816
+ "normal",
1817
+ "nowrap",
1818
+ "pre",
1819
+ "pre-line",
1820
+ "pre-wrap",
1821
+ "break-spaces"
1822
+ ] }],
1823
+ /**
1824
+ * Word Break
1825
+ * @see https://tailwindcss.com/docs/word-break
1826
+ */
1827
+ break: [{ break: [
1828
+ "normal",
1829
+ "words",
1830
+ "all",
1831
+ "keep"
1832
+ ] }],
1833
+ /**
1834
+ * Overflow Wrap
1835
+ * @see https://tailwindcss.com/docs/overflow-wrap
1836
+ */
1837
+ wrap: [{ wrap: [
1838
+ "break-word",
1839
+ "anywhere",
1840
+ "normal"
1841
+ ] }],
1842
+ /**
1843
+ * Hyphens
1844
+ * @see https://tailwindcss.com/docs/hyphens
1845
+ */
1846
+ hyphens: [{ hyphens: [
1847
+ "none",
1848
+ "manual",
1849
+ "auto"
1850
+ ] }],
1851
+ /**
1852
+ * Content
1853
+ * @see https://tailwindcss.com/docs/content
1854
+ */
1855
+ content: [{ content: [
1856
+ "none",
1857
+ isArbitraryVariable,
1858
+ isArbitraryValue
1859
+ ] }],
1860
+ /**
1861
+ * Background Attachment
1862
+ * @see https://tailwindcss.com/docs/background-attachment
1863
+ */
1864
+ "bg-attachment": [{ bg: [
1865
+ "fixed",
1866
+ "local",
1867
+ "scroll"
1868
+ ] }],
1869
+ /**
1870
+ * Background Clip
1871
+ * @see https://tailwindcss.com/docs/background-clip
1872
+ */
1873
+ "bg-clip": [{ "bg-clip": [
1874
+ "border",
1875
+ "padding",
1876
+ "content",
1877
+ "text"
1878
+ ] }],
1879
+ /**
1880
+ * Background Origin
1881
+ * @see https://tailwindcss.com/docs/background-origin
1882
+ */
1883
+ "bg-origin": [{ "bg-origin": [
1884
+ "border",
1885
+ "padding",
1886
+ "content"
1887
+ ] }],
1888
+ /**
1889
+ * Background Position
1890
+ * @see https://tailwindcss.com/docs/background-position
1891
+ */
1892
+ "bg-position": [{ bg: scaleBgPosition() }],
1893
+ /**
1894
+ * Background Repeat
1895
+ * @see https://tailwindcss.com/docs/background-repeat
1896
+ */
1897
+ "bg-repeat": [{ bg: scaleBgRepeat() }],
1898
+ /**
1899
+ * Background Size
1900
+ * @see https://tailwindcss.com/docs/background-size
1901
+ */
1902
+ "bg-size": [{ bg: scaleBgSize() }],
1903
+ /**
1904
+ * Background Image
1905
+ * @see https://tailwindcss.com/docs/background-image
1906
+ */
1907
+ "bg-image": [{ bg: [
1908
+ "none",
1909
+ {
1910
+ linear: [
1911
+ { to: [
1912
+ "t",
1913
+ "tr",
1914
+ "r",
1915
+ "br",
1916
+ "b",
1917
+ "bl",
1918
+ "l",
1919
+ "tl"
1920
+ ] },
1921
+ isInteger,
1922
+ isArbitraryVariable,
1923
+ isArbitraryValue
1924
+ ],
1925
+ radial: [
1926
+ "",
1927
+ isArbitraryVariable,
1928
+ isArbitraryValue
1929
+ ],
1930
+ conic: [
1931
+ "",
1932
+ isInteger,
1933
+ isArbitraryVariable,
1934
+ isArbitraryValue
1935
+ ]
1936
+ },
1937
+ isArbitraryVariableImage,
1938
+ isArbitraryImage
1939
+ ] }],
1940
+ /**
1941
+ * Background Color
1942
+ * @see https://tailwindcss.com/docs/background-color
1943
+ */
1944
+ "bg-color": [{ bg: scaleColor() }],
1945
+ /**
1946
+ * Gradient Color Stops From Position
1947
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1948
+ */
1949
+ "gradient-from-pos": [{ from: scaleGradientStopPosition() }],
1950
+ /**
1951
+ * Gradient Color Stops Via Position
1952
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1953
+ */
1954
+ "gradient-via-pos": [{ via: scaleGradientStopPosition() }],
1955
+ /**
1956
+ * Gradient Color Stops To Position
1957
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1958
+ */
1959
+ "gradient-to-pos": [{ to: scaleGradientStopPosition() }],
1960
+ /**
1961
+ * Gradient Color Stops From
1962
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1963
+ */
1964
+ "gradient-from": [{ from: scaleColor() }],
1965
+ /**
1966
+ * Gradient Color Stops Via
1967
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1968
+ */
1969
+ "gradient-via": [{ via: scaleColor() }],
1970
+ /**
1971
+ * Gradient Color Stops To
1972
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1973
+ */
1974
+ "gradient-to": [{ to: scaleColor() }],
1975
+ /**
1976
+ * Border Radius
1977
+ * @see https://tailwindcss.com/docs/border-radius
1978
+ */
1979
+ rounded: [{ rounded: scaleRadius() }],
1980
+ /**
1981
+ * Border Radius Start
1982
+ * @see https://tailwindcss.com/docs/border-radius
1983
+ */
1984
+ "rounded-s": [{ "rounded-s": scaleRadius() }],
1985
+ /**
1986
+ * Border Radius End
1987
+ * @see https://tailwindcss.com/docs/border-radius
1988
+ */
1989
+ "rounded-e": [{ "rounded-e": scaleRadius() }],
1990
+ /**
1991
+ * Border Radius Top
1992
+ * @see https://tailwindcss.com/docs/border-radius
1993
+ */
1994
+ "rounded-t": [{ "rounded-t": scaleRadius() }],
1995
+ /**
1996
+ * Border Radius Right
1997
+ * @see https://tailwindcss.com/docs/border-radius
1998
+ */
1999
+ "rounded-r": [{ "rounded-r": scaleRadius() }],
2000
+ /**
2001
+ * Border Radius Bottom
2002
+ * @see https://tailwindcss.com/docs/border-radius
2003
+ */
2004
+ "rounded-b": [{ "rounded-b": scaleRadius() }],
2005
+ /**
2006
+ * Border Radius Left
2007
+ * @see https://tailwindcss.com/docs/border-radius
2008
+ */
2009
+ "rounded-l": [{ "rounded-l": scaleRadius() }],
2010
+ /**
2011
+ * Border Radius Start Start
2012
+ * @see https://tailwindcss.com/docs/border-radius
2013
+ */
2014
+ "rounded-ss": [{ "rounded-ss": scaleRadius() }],
2015
+ /**
2016
+ * Border Radius Start End
2017
+ * @see https://tailwindcss.com/docs/border-radius
2018
+ */
2019
+ "rounded-se": [{ "rounded-se": scaleRadius() }],
2020
+ /**
2021
+ * Border Radius End End
2022
+ * @see https://tailwindcss.com/docs/border-radius
2023
+ */
2024
+ "rounded-ee": [{ "rounded-ee": scaleRadius() }],
2025
+ /**
2026
+ * Border Radius End Start
2027
+ * @see https://tailwindcss.com/docs/border-radius
2028
+ */
2029
+ "rounded-es": [{ "rounded-es": scaleRadius() }],
2030
+ /**
2031
+ * Border Radius Top Left
2032
+ * @see https://tailwindcss.com/docs/border-radius
2033
+ */
2034
+ "rounded-tl": [{ "rounded-tl": scaleRadius() }],
2035
+ /**
2036
+ * Border Radius Top Right
2037
+ * @see https://tailwindcss.com/docs/border-radius
2038
+ */
2039
+ "rounded-tr": [{ "rounded-tr": scaleRadius() }],
2040
+ /**
2041
+ * Border Radius Bottom Right
2042
+ * @see https://tailwindcss.com/docs/border-radius
2043
+ */
2044
+ "rounded-br": [{ "rounded-br": scaleRadius() }],
2045
+ /**
2046
+ * Border Radius Bottom Left
2047
+ * @see https://tailwindcss.com/docs/border-radius
2048
+ */
2049
+ "rounded-bl": [{ "rounded-bl": scaleRadius() }],
2050
+ /**
2051
+ * Border Width
2052
+ * @see https://tailwindcss.com/docs/border-width
2053
+ */
2054
+ "border-w": [{ border: scaleBorderWidth() }],
2055
+ /**
2056
+ * Border Width Inline
2057
+ * @see https://tailwindcss.com/docs/border-width
2058
+ */
2059
+ "border-w-x": [{ "border-x": scaleBorderWidth() }],
2060
+ /**
2061
+ * Border Width Block
2062
+ * @see https://tailwindcss.com/docs/border-width
2063
+ */
2064
+ "border-w-y": [{ "border-y": scaleBorderWidth() }],
2065
+ /**
2066
+ * Border Width Inline Start
2067
+ * @see https://tailwindcss.com/docs/border-width
2068
+ */
2069
+ "border-w-s": [{ "border-s": scaleBorderWidth() }],
2070
+ /**
2071
+ * Border Width Inline End
2072
+ * @see https://tailwindcss.com/docs/border-width
2073
+ */
2074
+ "border-w-e": [{ "border-e": scaleBorderWidth() }],
2075
+ /**
2076
+ * Border Width Block Start
2077
+ * @see https://tailwindcss.com/docs/border-width
2078
+ */
2079
+ "border-w-bs": [{ "border-bs": scaleBorderWidth() }],
2080
+ /**
2081
+ * Border Width Block End
2082
+ * @see https://tailwindcss.com/docs/border-width
2083
+ */
2084
+ "border-w-be": [{ "border-be": scaleBorderWidth() }],
2085
+ /**
2086
+ * Border Width Top
2087
+ * @see https://tailwindcss.com/docs/border-width
2088
+ */
2089
+ "border-w-t": [{ "border-t": scaleBorderWidth() }],
2090
+ /**
2091
+ * Border Width Right
2092
+ * @see https://tailwindcss.com/docs/border-width
2093
+ */
2094
+ "border-w-r": [{ "border-r": scaleBorderWidth() }],
2095
+ /**
2096
+ * Border Width Bottom
2097
+ * @see https://tailwindcss.com/docs/border-width
2098
+ */
2099
+ "border-w-b": [{ "border-b": scaleBorderWidth() }],
2100
+ /**
2101
+ * Border Width Left
2102
+ * @see https://tailwindcss.com/docs/border-width
2103
+ */
2104
+ "border-w-l": [{ "border-l": scaleBorderWidth() }],
2105
+ /**
2106
+ * Divide Width X
2107
+ * @see https://tailwindcss.com/docs/border-width#between-children
2108
+ */
2109
+ "divide-x": [{ "divide-x": scaleBorderWidth() }],
2110
+ /**
2111
+ * Divide Width X Reverse
2112
+ * @see https://tailwindcss.com/docs/border-width#between-children
2113
+ */
2114
+ "divide-x-reverse": ["divide-x-reverse"],
2115
+ /**
2116
+ * Divide Width Y
2117
+ * @see https://tailwindcss.com/docs/border-width#between-children
2118
+ */
2119
+ "divide-y": [{ "divide-y": scaleBorderWidth() }],
2120
+ /**
2121
+ * Divide Width Y Reverse
2122
+ * @see https://tailwindcss.com/docs/border-width#between-children
2123
+ */
2124
+ "divide-y-reverse": ["divide-y-reverse"],
2125
+ /**
2126
+ * Border Style
2127
+ * @see https://tailwindcss.com/docs/border-style
2128
+ */
2129
+ "border-style": [{ border: [
2130
+ ...scaleLineStyle(),
2131
+ "hidden",
2132
+ "none"
2133
+ ] }],
2134
+ /**
2135
+ * Divide Style
2136
+ * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style
2137
+ */
2138
+ "divide-style": [{ divide: [
2139
+ ...scaleLineStyle(),
2140
+ "hidden",
2141
+ "none"
2142
+ ] }],
2143
+ /**
2144
+ * Border Color
2145
+ * @see https://tailwindcss.com/docs/border-color
2146
+ */
2147
+ "border-color": [{ border: scaleColor() }],
2148
+ /**
2149
+ * Border Color Inline
2150
+ * @see https://tailwindcss.com/docs/border-color
2151
+ */
2152
+ "border-color-x": [{ "border-x": scaleColor() }],
2153
+ /**
2154
+ * Border Color Block
2155
+ * @see https://tailwindcss.com/docs/border-color
2156
+ */
2157
+ "border-color-y": [{ "border-y": scaleColor() }],
2158
+ /**
2159
+ * Border Color Inline Start
2160
+ * @see https://tailwindcss.com/docs/border-color
2161
+ */
2162
+ "border-color-s": [{ "border-s": scaleColor() }],
2163
+ /**
2164
+ * Border Color Inline End
2165
+ * @see https://tailwindcss.com/docs/border-color
2166
+ */
2167
+ "border-color-e": [{ "border-e": scaleColor() }],
2168
+ /**
2169
+ * Border Color Block Start
2170
+ * @see https://tailwindcss.com/docs/border-color
2171
+ */
2172
+ "border-color-bs": [{ "border-bs": scaleColor() }],
2173
+ /**
2174
+ * Border Color Block End
2175
+ * @see https://tailwindcss.com/docs/border-color
2176
+ */
2177
+ "border-color-be": [{ "border-be": scaleColor() }],
2178
+ /**
2179
+ * Border Color Top
2180
+ * @see https://tailwindcss.com/docs/border-color
2181
+ */
2182
+ "border-color-t": [{ "border-t": scaleColor() }],
2183
+ /**
2184
+ * Border Color Right
2185
+ * @see https://tailwindcss.com/docs/border-color
2186
+ */
2187
+ "border-color-r": [{ "border-r": scaleColor() }],
2188
+ /**
2189
+ * Border Color Bottom
2190
+ * @see https://tailwindcss.com/docs/border-color
2191
+ */
2192
+ "border-color-b": [{ "border-b": scaleColor() }],
2193
+ /**
2194
+ * Border Color Left
2195
+ * @see https://tailwindcss.com/docs/border-color
2196
+ */
2197
+ "border-color-l": [{ "border-l": scaleColor() }],
2198
+ /**
2199
+ * Divide Color
2200
+ * @see https://tailwindcss.com/docs/divide-color
2201
+ */
2202
+ "divide-color": [{ divide: scaleColor() }],
2203
+ /**
2204
+ * Outline Style
2205
+ * @see https://tailwindcss.com/docs/outline-style
2206
+ */
2207
+ "outline-style": [{ outline: [
2208
+ ...scaleLineStyle(),
2209
+ "none",
2210
+ "hidden"
2211
+ ] }],
2212
+ /**
2213
+ * Outline Offset
2214
+ * @see https://tailwindcss.com/docs/outline-offset
2215
+ */
2216
+ "outline-offset": [{ "outline-offset": [
2217
+ isNumber,
2218
+ isArbitraryVariable,
2219
+ isArbitraryValue
2220
+ ] }],
2221
+ /**
2222
+ * Outline Width
2223
+ * @see https://tailwindcss.com/docs/outline-width
2224
+ */
2225
+ "outline-w": [{ outline: [
2226
+ "",
2227
+ isNumber,
2228
+ isArbitraryVariableLength,
2229
+ isArbitraryLength
2230
+ ] }],
2231
+ /**
2232
+ * Outline Color
2233
+ * @see https://tailwindcss.com/docs/outline-color
2234
+ */
2235
+ "outline-color": [{ outline: scaleColor() }],
2236
+ /**
2237
+ * Box Shadow
2238
+ * @see https://tailwindcss.com/docs/box-shadow
2239
+ */
2240
+ shadow: [{ shadow: [
2241
+ "",
2242
+ "inner",
2243
+ "none",
2244
+ themeShadow,
2245
+ isArbitraryVariableShadow,
2246
+ isArbitraryShadow
2247
+ ] }],
2248
+ /**
2249
+ * Box Shadow Color
2250
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color
2251
+ */
2252
+ "shadow-color": [{ shadow: scaleColor() }],
2253
+ /**
2254
+ * Inset Box Shadow
2255
+ * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow
2256
+ */
2257
+ "inset-shadow": [{ "inset-shadow": [
2258
+ "none",
2259
+ themeInsetShadow,
2260
+ isArbitraryVariableShadow,
2261
+ isArbitraryShadow
2262
+ ] }],
2263
+ /**
2264
+ * Inset Box Shadow Color
2265
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color
2266
+ */
2267
+ "inset-shadow-color": [{ "inset-shadow": scaleColor() }],
2268
+ /**
2269
+ * Ring Width
2270
+ * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring
2271
+ */
2272
+ "ring-w": [{ ring: scaleBorderWidth() }],
2273
+ /**
2274
+ * Ring Width Inset
2275
+ * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings
2276
+ * @deprecated since Tailwind CSS v4.0.0
2277
+ * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
2278
+ */
2279
+ "ring-w-inset": ["ring-inset"],
2280
+ /**
2281
+ * Ring Color
2282
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color
2283
+ */
2284
+ "ring-color": [{ ring: scaleColor() }],
2285
+ /**
2286
+ * Ring Offset Width
2287
+ * @see https://v3.tailwindcss.com/docs/ring-offset-width
2288
+ * @deprecated since Tailwind CSS v4.0.0
2289
+ * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
2290
+ */
2291
+ "ring-offset-w": [{ "ring-offset": [isNumber, isArbitraryLength] }],
2292
+ /**
2293
+ * Ring Offset Color
2294
+ * @see https://v3.tailwindcss.com/docs/ring-offset-color
2295
+ * @deprecated since Tailwind CSS v4.0.0
2296
+ * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158
2297
+ */
2298
+ "ring-offset-color": [{ "ring-offset": scaleColor() }],
2299
+ /**
2300
+ * Inset Ring Width
2301
+ * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring
2302
+ */
2303
+ "inset-ring-w": [{ "inset-ring": scaleBorderWidth() }],
2304
+ /**
2305
+ * Inset Ring Color
2306
+ * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color
2307
+ */
2308
+ "inset-ring-color": [{ "inset-ring": scaleColor() }],
2309
+ /**
2310
+ * Text Shadow
2311
+ * @see https://tailwindcss.com/docs/text-shadow
2312
+ */
2313
+ "text-shadow": [{ "text-shadow": [
2314
+ "none",
2315
+ themeTextShadow,
2316
+ isArbitraryVariableShadow,
2317
+ isArbitraryShadow
2318
+ ] }],
2319
+ /**
2320
+ * Text Shadow Color
2321
+ * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color
2322
+ */
2323
+ "text-shadow-color": [{ "text-shadow": scaleColor() }],
2324
+ /**
2325
+ * Opacity
2326
+ * @see https://tailwindcss.com/docs/opacity
2327
+ */
2328
+ opacity: [{ opacity: [
2329
+ isNumber,
2330
+ isArbitraryVariable,
2331
+ isArbitraryValue
2332
+ ] }],
2333
+ /**
2334
+ * Mix Blend Mode
2335
+ * @see https://tailwindcss.com/docs/mix-blend-mode
2336
+ */
2337
+ "mix-blend": [{ "mix-blend": [
2338
+ ...scaleBlendMode(),
2339
+ "plus-darker",
2340
+ "plus-lighter"
2341
+ ] }],
2342
+ /**
2343
+ * Background Blend Mode
2344
+ * @see https://tailwindcss.com/docs/background-blend-mode
2345
+ */
2346
+ "bg-blend": [{ "bg-blend": scaleBlendMode() }],
2347
+ /**
2348
+ * Mask Clip
2349
+ * @see https://tailwindcss.com/docs/mask-clip
2350
+ */
2351
+ "mask-clip": [{ "mask-clip": [
2352
+ "border",
2353
+ "padding",
2354
+ "content",
2355
+ "fill",
2356
+ "stroke",
2357
+ "view"
2358
+ ] }, "mask-no-clip"],
2359
+ /**
2360
+ * Mask Composite
2361
+ * @see https://tailwindcss.com/docs/mask-composite
2362
+ */
2363
+ "mask-composite": [{ mask: [
2364
+ "add",
2365
+ "subtract",
2366
+ "intersect",
2367
+ "exclude"
2368
+ ] }],
2369
+ /**
2370
+ * Mask Image
2371
+ * @see https://tailwindcss.com/docs/mask-image
2372
+ */
2373
+ "mask-image-linear-pos": [{ "mask-linear": [isNumber] }],
2374
+ "mask-image-linear-from-pos": [{ "mask-linear-from": scaleMaskImagePosition() }],
2375
+ "mask-image-linear-to-pos": [{ "mask-linear-to": scaleMaskImagePosition() }],
2376
+ "mask-image-linear-from-color": [{ "mask-linear-from": scaleColor() }],
2377
+ "mask-image-linear-to-color": [{ "mask-linear-to": scaleColor() }],
2378
+ "mask-image-t-from-pos": [{ "mask-t-from": scaleMaskImagePosition() }],
2379
+ "mask-image-t-to-pos": [{ "mask-t-to": scaleMaskImagePosition() }],
2380
+ "mask-image-t-from-color": [{ "mask-t-from": scaleColor() }],
2381
+ "mask-image-t-to-color": [{ "mask-t-to": scaleColor() }],
2382
+ "mask-image-r-from-pos": [{ "mask-r-from": scaleMaskImagePosition() }],
2383
+ "mask-image-r-to-pos": [{ "mask-r-to": scaleMaskImagePosition() }],
2384
+ "mask-image-r-from-color": [{ "mask-r-from": scaleColor() }],
2385
+ "mask-image-r-to-color": [{ "mask-r-to": scaleColor() }],
2386
+ "mask-image-b-from-pos": [{ "mask-b-from": scaleMaskImagePosition() }],
2387
+ "mask-image-b-to-pos": [{ "mask-b-to": scaleMaskImagePosition() }],
2388
+ "mask-image-b-from-color": [{ "mask-b-from": scaleColor() }],
2389
+ "mask-image-b-to-color": [{ "mask-b-to": scaleColor() }],
2390
+ "mask-image-l-from-pos": [{ "mask-l-from": scaleMaskImagePosition() }],
2391
+ "mask-image-l-to-pos": [{ "mask-l-to": scaleMaskImagePosition() }],
2392
+ "mask-image-l-from-color": [{ "mask-l-from": scaleColor() }],
2393
+ "mask-image-l-to-color": [{ "mask-l-to": scaleColor() }],
2394
+ "mask-image-x-from-pos": [{ "mask-x-from": scaleMaskImagePosition() }],
2395
+ "mask-image-x-to-pos": [{ "mask-x-to": scaleMaskImagePosition() }],
2396
+ "mask-image-x-from-color": [{ "mask-x-from": scaleColor() }],
2397
+ "mask-image-x-to-color": [{ "mask-x-to": scaleColor() }],
2398
+ "mask-image-y-from-pos": [{ "mask-y-from": scaleMaskImagePosition() }],
2399
+ "mask-image-y-to-pos": [{ "mask-y-to": scaleMaskImagePosition() }],
2400
+ "mask-image-y-from-color": [{ "mask-y-from": scaleColor() }],
2401
+ "mask-image-y-to-color": [{ "mask-y-to": scaleColor() }],
2402
+ "mask-image-radial": [{ "mask-radial": [isArbitraryVariable, isArbitraryValue] }],
2403
+ "mask-image-radial-from-pos": [{ "mask-radial-from": scaleMaskImagePosition() }],
2404
+ "mask-image-radial-to-pos": [{ "mask-radial-to": scaleMaskImagePosition() }],
2405
+ "mask-image-radial-from-color": [{ "mask-radial-from": scaleColor() }],
2406
+ "mask-image-radial-to-color": [{ "mask-radial-to": scaleColor() }],
2407
+ "mask-image-radial-shape": [{ "mask-radial": ["circle", "ellipse"] }],
2408
+ "mask-image-radial-size": [{ "mask-radial": [{
2409
+ closest: ["side", "corner"],
2410
+ farthest: ["side", "corner"]
2411
+ }] }],
2412
+ "mask-image-radial-pos": [{ "mask-radial-at": scalePosition() }],
2413
+ "mask-image-conic-pos": [{ "mask-conic": [isNumber] }],
2414
+ "mask-image-conic-from-pos": [{ "mask-conic-from": scaleMaskImagePosition() }],
2415
+ "mask-image-conic-to-pos": [{ "mask-conic-to": scaleMaskImagePosition() }],
2416
+ "mask-image-conic-from-color": [{ "mask-conic-from": scaleColor() }],
2417
+ "mask-image-conic-to-color": [{ "mask-conic-to": scaleColor() }],
2418
+ /**
2419
+ * Mask Mode
2420
+ * @see https://tailwindcss.com/docs/mask-mode
2421
+ */
2422
+ "mask-mode": [{ mask: [
2423
+ "alpha",
2424
+ "luminance",
2425
+ "match"
2426
+ ] }],
2427
+ /**
2428
+ * Mask Origin
2429
+ * @see https://tailwindcss.com/docs/mask-origin
2430
+ */
2431
+ "mask-origin": [{ "mask-origin": [
2432
+ "border",
2433
+ "padding",
2434
+ "content",
2435
+ "fill",
2436
+ "stroke",
2437
+ "view"
2438
+ ] }],
2439
+ /**
2440
+ * Mask Position
2441
+ * @see https://tailwindcss.com/docs/mask-position
2442
+ */
2443
+ "mask-position": [{ mask: scaleBgPosition() }],
2444
+ /**
2445
+ * Mask Repeat
2446
+ * @see https://tailwindcss.com/docs/mask-repeat
2447
+ */
2448
+ "mask-repeat": [{ mask: scaleBgRepeat() }],
2449
+ /**
2450
+ * Mask Size
2451
+ * @see https://tailwindcss.com/docs/mask-size
2452
+ */
2453
+ "mask-size": [{ mask: scaleBgSize() }],
2454
+ /**
2455
+ * Mask Type
2456
+ * @see https://tailwindcss.com/docs/mask-type
2457
+ */
2458
+ "mask-type": [{ "mask-type": ["alpha", "luminance"] }],
2459
+ /**
2460
+ * Mask Image
2461
+ * @see https://tailwindcss.com/docs/mask-image
2462
+ */
2463
+ "mask-image": [{ mask: [
2464
+ "none",
2465
+ isArbitraryVariable,
2466
+ isArbitraryValue
2467
+ ] }],
2468
+ /**
2469
+ * Filter
2470
+ * @see https://tailwindcss.com/docs/filter
2471
+ */
2472
+ filter: [{ filter: [
2473
+ "",
2474
+ "none",
2475
+ isArbitraryVariable,
2476
+ isArbitraryValue
2477
+ ] }],
2478
+ /**
2479
+ * Blur
2480
+ * @see https://tailwindcss.com/docs/blur
2481
+ */
2482
+ blur: [{ blur: scaleBlur() }],
2483
+ /**
2484
+ * Brightness
2485
+ * @see https://tailwindcss.com/docs/brightness
2486
+ */
2487
+ brightness: [{ brightness: [
2488
+ isNumber,
2489
+ isArbitraryVariable,
2490
+ isArbitraryValue
2491
+ ] }],
2492
+ /**
2493
+ * Contrast
2494
+ * @see https://tailwindcss.com/docs/contrast
2495
+ */
2496
+ contrast: [{ contrast: [
2497
+ isNumber,
2498
+ isArbitraryVariable,
2499
+ isArbitraryValue
2500
+ ] }],
2501
+ /**
2502
+ * Drop Shadow
2503
+ * @see https://tailwindcss.com/docs/drop-shadow
2504
+ */
2505
+ "drop-shadow": [{ "drop-shadow": [
2506
+ "",
2507
+ "none",
2508
+ themeDropShadow,
2509
+ isArbitraryVariableShadow,
2510
+ isArbitraryShadow
2511
+ ] }],
2512
+ /**
2513
+ * Drop Shadow Color
2514
+ * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color
2515
+ */
2516
+ "drop-shadow-color": [{ "drop-shadow": scaleColor() }],
2517
+ /**
2518
+ * Grayscale
2519
+ * @see https://tailwindcss.com/docs/grayscale
2520
+ */
2521
+ grayscale: [{ grayscale: [
2522
+ "",
2523
+ isNumber,
2524
+ isArbitraryVariable,
2525
+ isArbitraryValue
2526
+ ] }],
2527
+ /**
2528
+ * Hue Rotate
2529
+ * @see https://tailwindcss.com/docs/hue-rotate
2530
+ */
2531
+ "hue-rotate": [{ "hue-rotate": [
2532
+ isNumber,
2533
+ isArbitraryVariable,
2534
+ isArbitraryValue
2535
+ ] }],
2536
+ /**
2537
+ * Invert
2538
+ * @see https://tailwindcss.com/docs/invert
2539
+ */
2540
+ invert: [{ invert: [
2541
+ "",
2542
+ isNumber,
2543
+ isArbitraryVariable,
2544
+ isArbitraryValue
2545
+ ] }],
2546
+ /**
2547
+ * Saturate
2548
+ * @see https://tailwindcss.com/docs/saturate
2549
+ */
2550
+ saturate: [{ saturate: [
2551
+ isNumber,
2552
+ isArbitraryVariable,
2553
+ isArbitraryValue
2554
+ ] }],
2555
+ /**
2556
+ * Sepia
2557
+ * @see https://tailwindcss.com/docs/sepia
2558
+ */
2559
+ sepia: [{ sepia: [
2560
+ "",
2561
+ isNumber,
2562
+ isArbitraryVariable,
2563
+ isArbitraryValue
2564
+ ] }],
2565
+ /**
2566
+ * Backdrop Filter
2567
+ * @see https://tailwindcss.com/docs/backdrop-filter
2568
+ */
2569
+ "backdrop-filter": [{ "backdrop-filter": [
2570
+ "",
2571
+ "none",
2572
+ isArbitraryVariable,
2573
+ isArbitraryValue
2574
+ ] }],
2575
+ /**
2576
+ * Backdrop Blur
2577
+ * @see https://tailwindcss.com/docs/backdrop-blur
2578
+ */
2579
+ "backdrop-blur": [{ "backdrop-blur": scaleBlur() }],
2580
+ /**
2581
+ * Backdrop Brightness
2582
+ * @see https://tailwindcss.com/docs/backdrop-brightness
2583
+ */
2584
+ "backdrop-brightness": [{ "backdrop-brightness": [
2585
+ isNumber,
2586
+ isArbitraryVariable,
2587
+ isArbitraryValue
2588
+ ] }],
2589
+ /**
2590
+ * Backdrop Contrast
2591
+ * @see https://tailwindcss.com/docs/backdrop-contrast
2592
+ */
2593
+ "backdrop-contrast": [{ "backdrop-contrast": [
2594
+ isNumber,
2595
+ isArbitraryVariable,
2596
+ isArbitraryValue
2597
+ ] }],
2598
+ /**
2599
+ * Backdrop Grayscale
2600
+ * @see https://tailwindcss.com/docs/backdrop-grayscale
2601
+ */
2602
+ "backdrop-grayscale": [{ "backdrop-grayscale": [
2603
+ "",
2604
+ isNumber,
2605
+ isArbitraryVariable,
2606
+ isArbitraryValue
2607
+ ] }],
2608
+ /**
2609
+ * Backdrop Hue Rotate
2610
+ * @see https://tailwindcss.com/docs/backdrop-hue-rotate
2611
+ */
2612
+ "backdrop-hue-rotate": [{ "backdrop-hue-rotate": [
2613
+ isNumber,
2614
+ isArbitraryVariable,
2615
+ isArbitraryValue
2616
+ ] }],
2617
+ /**
2618
+ * Backdrop Invert
2619
+ * @see https://tailwindcss.com/docs/backdrop-invert
2620
+ */
2621
+ "backdrop-invert": [{ "backdrop-invert": [
2622
+ "",
2623
+ isNumber,
2624
+ isArbitraryVariable,
2625
+ isArbitraryValue
2626
+ ] }],
2627
+ /**
2628
+ * Backdrop Opacity
2629
+ * @see https://tailwindcss.com/docs/backdrop-opacity
2630
+ */
2631
+ "backdrop-opacity": [{ "backdrop-opacity": [
2632
+ isNumber,
2633
+ isArbitraryVariable,
2634
+ isArbitraryValue
2635
+ ] }],
2636
+ /**
2637
+ * Backdrop Saturate
2638
+ * @see https://tailwindcss.com/docs/backdrop-saturate
2639
+ */
2640
+ "backdrop-saturate": [{ "backdrop-saturate": [
2641
+ isNumber,
2642
+ isArbitraryVariable,
2643
+ isArbitraryValue
2644
+ ] }],
2645
+ /**
2646
+ * Backdrop Sepia
2647
+ * @see https://tailwindcss.com/docs/backdrop-sepia
2648
+ */
2649
+ "backdrop-sepia": [{ "backdrop-sepia": [
2650
+ "",
2651
+ isNumber,
2652
+ isArbitraryVariable,
2653
+ isArbitraryValue
2654
+ ] }],
2655
+ /**
2656
+ * Border Collapse
2657
+ * @see https://tailwindcss.com/docs/border-collapse
2658
+ */
2659
+ "border-collapse": [{ border: ["collapse", "separate"] }],
2660
+ /**
2661
+ * Border Spacing
2662
+ * @see https://tailwindcss.com/docs/border-spacing
2663
+ */
2664
+ "border-spacing": [{ "border-spacing": scaleUnambiguousSpacing() }],
2665
+ /**
2666
+ * Border Spacing X
2667
+ * @see https://tailwindcss.com/docs/border-spacing
2668
+ */
2669
+ "border-spacing-x": [{ "border-spacing-x": scaleUnambiguousSpacing() }],
2670
+ /**
2671
+ * Border Spacing Y
2672
+ * @see https://tailwindcss.com/docs/border-spacing
2673
+ */
2674
+ "border-spacing-y": [{ "border-spacing-y": scaleUnambiguousSpacing() }],
2675
+ /**
2676
+ * Table Layout
2677
+ * @see https://tailwindcss.com/docs/table-layout
2678
+ */
2679
+ "table-layout": [{ table: ["auto", "fixed"] }],
2680
+ /**
2681
+ * Caption Side
2682
+ * @see https://tailwindcss.com/docs/caption-side
2683
+ */
2684
+ caption: [{ caption: ["top", "bottom"] }],
2685
+ /**
2686
+ * Transition Property
2687
+ * @see https://tailwindcss.com/docs/transition-property
2688
+ */
2689
+ transition: [{ transition: [
2690
+ "",
2691
+ "all",
2692
+ "colors",
2693
+ "opacity",
2694
+ "shadow",
2695
+ "transform",
2696
+ "none",
2697
+ isArbitraryVariable,
2698
+ isArbitraryValue
2699
+ ] }],
2700
+ /**
2701
+ * Transition Behavior
2702
+ * @see https://tailwindcss.com/docs/transition-behavior
2703
+ */
2704
+ "transition-behavior": [{ transition: ["normal", "discrete"] }],
2705
+ /**
2706
+ * Transition Duration
2707
+ * @see https://tailwindcss.com/docs/transition-duration
2708
+ */
2709
+ duration: [{ duration: [
2710
+ isNumber,
2711
+ "initial",
2712
+ isArbitraryVariable,
2713
+ isArbitraryValue
2714
+ ] }],
2715
+ /**
2716
+ * Transition Timing Function
2717
+ * @see https://tailwindcss.com/docs/transition-timing-function
2718
+ */
2719
+ ease: [{ ease: [
2720
+ "linear",
2721
+ "initial",
2722
+ themeEase,
2723
+ isArbitraryVariable,
2724
+ isArbitraryValue
2725
+ ] }],
2726
+ /**
2727
+ * Transition Delay
2728
+ * @see https://tailwindcss.com/docs/transition-delay
2729
+ */
2730
+ delay: [{ delay: [
2731
+ isNumber,
2732
+ isArbitraryVariable,
2733
+ isArbitraryValue
2734
+ ] }],
2735
+ /**
2736
+ * Animation
2737
+ * @see https://tailwindcss.com/docs/animation
2738
+ */
2739
+ animate: [{ animate: [
2740
+ "none",
2741
+ themeAnimate,
2742
+ isArbitraryVariable,
2743
+ isArbitraryValue
2744
+ ] }],
2745
+ /**
2746
+ * Backface Visibility
2747
+ * @see https://tailwindcss.com/docs/backface-visibility
2748
+ */
2749
+ backface: [{ backface: ["hidden", "visible"] }],
2750
+ /**
2751
+ * Perspective
2752
+ * @see https://tailwindcss.com/docs/perspective
2753
+ */
2754
+ perspective: [{ perspective: [
2755
+ themePerspective,
2756
+ isArbitraryVariable,
2757
+ isArbitraryValue
2758
+ ] }],
2759
+ /**
2760
+ * Perspective Origin
2761
+ * @see https://tailwindcss.com/docs/perspective-origin
2762
+ */
2763
+ "perspective-origin": [{ "perspective-origin": scalePositionWithArbitrary() }],
2764
+ /**
2765
+ * Rotate
2766
+ * @see https://tailwindcss.com/docs/rotate
2767
+ */
2768
+ rotate: [{ rotate: scaleRotate() }],
2769
+ /**
2770
+ * Rotate X
2771
+ * @see https://tailwindcss.com/docs/rotate
2772
+ */
2773
+ "rotate-x": [{ "rotate-x": scaleRotate() }],
2774
+ /**
2775
+ * Rotate Y
2776
+ * @see https://tailwindcss.com/docs/rotate
2777
+ */
2778
+ "rotate-y": [{ "rotate-y": scaleRotate() }],
2779
+ /**
2780
+ * Rotate Z
2781
+ * @see https://tailwindcss.com/docs/rotate
2782
+ */
2783
+ "rotate-z": [{ "rotate-z": scaleRotate() }],
2784
+ /**
2785
+ * Scale
2786
+ * @see https://tailwindcss.com/docs/scale
2787
+ */
2788
+ scale: [{ scale: scaleScale() }],
2789
+ /**
2790
+ * Scale X
2791
+ * @see https://tailwindcss.com/docs/scale
2792
+ */
2793
+ "scale-x": [{ "scale-x": scaleScale() }],
2794
+ /**
2795
+ * Scale Y
2796
+ * @see https://tailwindcss.com/docs/scale
2797
+ */
2798
+ "scale-y": [{ "scale-y": scaleScale() }],
2799
+ /**
2800
+ * Scale Z
2801
+ * @see https://tailwindcss.com/docs/scale
2802
+ */
2803
+ "scale-z": [{ "scale-z": scaleScale() }],
2804
+ /**
2805
+ * Scale 3D
2806
+ * @see https://tailwindcss.com/docs/scale
2807
+ */
2808
+ "scale-3d": ["scale-3d"],
2809
+ /**
2810
+ * Skew
2811
+ * @see https://tailwindcss.com/docs/skew
2812
+ */
2813
+ skew: [{ skew: scaleSkew() }],
2814
+ /**
2815
+ * Skew X
2816
+ * @see https://tailwindcss.com/docs/skew
2817
+ */
2818
+ "skew-x": [{ "skew-x": scaleSkew() }],
2819
+ /**
2820
+ * Skew Y
2821
+ * @see https://tailwindcss.com/docs/skew
2822
+ */
2823
+ "skew-y": [{ "skew-y": scaleSkew() }],
2824
+ /**
2825
+ * Transform
2826
+ * @see https://tailwindcss.com/docs/transform
2827
+ */
2828
+ transform: [{ transform: [
2829
+ isArbitraryVariable,
2830
+ isArbitraryValue,
2831
+ "",
2832
+ "none",
2833
+ "gpu",
2834
+ "cpu"
2835
+ ] }],
2836
+ /**
2837
+ * Transform Origin
2838
+ * @see https://tailwindcss.com/docs/transform-origin
2839
+ */
2840
+ "transform-origin": [{ origin: scalePositionWithArbitrary() }],
2841
+ /**
2842
+ * Transform Style
2843
+ * @see https://tailwindcss.com/docs/transform-style
2844
+ */
2845
+ "transform-style": [{ transform: ["3d", "flat"] }],
2846
+ /**
2847
+ * Translate
2848
+ * @see https://tailwindcss.com/docs/translate
2849
+ */
2850
+ translate: [{ translate: scaleTranslate() }],
2851
+ /**
2852
+ * Translate X
2853
+ * @see https://tailwindcss.com/docs/translate
2854
+ */
2855
+ "translate-x": [{ "translate-x": scaleTranslate() }],
2856
+ /**
2857
+ * Translate Y
2858
+ * @see https://tailwindcss.com/docs/translate
2859
+ */
2860
+ "translate-y": [{ "translate-y": scaleTranslate() }],
2861
+ /**
2862
+ * Translate Z
2863
+ * @see https://tailwindcss.com/docs/translate
2864
+ */
2865
+ "translate-z": [{ "translate-z": scaleTranslate() }],
2866
+ /**
2867
+ * Translate None
2868
+ * @see https://tailwindcss.com/docs/translate
2869
+ */
2870
+ "translate-none": ["translate-none"],
2871
+ /**
2872
+ * Zoom
2873
+ * @see https://tailwindcss.com/docs/zoom
2874
+ */
2875
+ zoom: [{ zoom: [
2876
+ isInteger,
2877
+ isArbitraryVariable,
2878
+ isArbitraryValue
2879
+ ] }],
2880
+ /**
2881
+ * Accent Color
2882
+ * @see https://tailwindcss.com/docs/accent-color
2883
+ */
2884
+ accent: [{ accent: scaleColor() }],
2885
+ /**
2886
+ * Appearance
2887
+ * @see https://tailwindcss.com/docs/appearance
2888
+ */
2889
+ appearance: [{ appearance: ["none", "auto"] }],
2890
+ /**
2891
+ * Caret Color
2892
+ * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
2893
+ */
2894
+ "caret-color": [{ caret: scaleColor() }],
2895
+ /**
2896
+ * Color Scheme
2897
+ * @see https://tailwindcss.com/docs/color-scheme
2898
+ */
2899
+ "color-scheme": [{ scheme: [
2900
+ "normal",
2901
+ "dark",
2902
+ "light",
2903
+ "light-dark",
2904
+ "only-dark",
2905
+ "only-light"
2906
+ ] }],
2907
+ /**
2908
+ * Cursor
2909
+ * @see https://tailwindcss.com/docs/cursor
2910
+ */
2911
+ cursor: [{ cursor: [
2912
+ "auto",
2913
+ "default",
2914
+ "pointer",
2915
+ "wait",
2916
+ "text",
2917
+ "move",
2918
+ "help",
2919
+ "not-allowed",
2920
+ "none",
2921
+ "context-menu",
2922
+ "progress",
2923
+ "cell",
2924
+ "crosshair",
2925
+ "vertical-text",
2926
+ "alias",
2927
+ "copy",
2928
+ "no-drop",
2929
+ "grab",
2930
+ "grabbing",
2931
+ "all-scroll",
2932
+ "col-resize",
2933
+ "row-resize",
2934
+ "n-resize",
2935
+ "e-resize",
2936
+ "s-resize",
2937
+ "w-resize",
2938
+ "ne-resize",
2939
+ "nw-resize",
2940
+ "se-resize",
2941
+ "sw-resize",
2942
+ "ew-resize",
2943
+ "ns-resize",
2944
+ "nesw-resize",
2945
+ "nwse-resize",
2946
+ "zoom-in",
2947
+ "zoom-out",
2948
+ isArbitraryVariable,
2949
+ isArbitraryValue
2950
+ ] }],
2951
+ /**
2952
+ * Field Sizing
2953
+ * @see https://tailwindcss.com/docs/field-sizing
2954
+ */
2955
+ "field-sizing": [{ "field-sizing": ["fixed", "content"] }],
2956
+ /**
2957
+ * Pointer Events
2958
+ * @see https://tailwindcss.com/docs/pointer-events
2959
+ */
2960
+ "pointer-events": [{ "pointer-events": ["auto", "none"] }],
2961
+ /**
2962
+ * Resize
2963
+ * @see https://tailwindcss.com/docs/resize
2964
+ */
2965
+ resize: [{ resize: [
2966
+ "none",
2967
+ "",
2968
+ "y",
2969
+ "x"
2970
+ ] }],
2971
+ /**
2972
+ * Scroll Behavior
2973
+ * @see https://tailwindcss.com/docs/scroll-behavior
2974
+ */
2975
+ "scroll-behavior": [{ scroll: ["auto", "smooth"] }],
2976
+ /**
2977
+ * Scrollbar Thumb Color
2978
+ * @see https://tailwindcss.com/docs/scrollbar-color
2979
+ */
2980
+ "scrollbar-thumb-color": [{ "scrollbar-thumb": scaleColor() }],
2981
+ /**
2982
+ * Scrollbar Track Color
2983
+ * @see https://tailwindcss.com/docs/scrollbar-color
2984
+ */
2985
+ "scrollbar-track-color": [{ "scrollbar-track": scaleColor() }],
2986
+ /**
2987
+ * Scrollbar Gutter
2988
+ * @see https://tailwindcss.com/docs/scrollbar-gutter
2989
+ */
2990
+ "scrollbar-gutter": [{ "scrollbar-gutter": [
2991
+ "auto",
2992
+ "stable",
2993
+ "both"
2994
+ ] }],
2995
+ /**
2996
+ * Scrollbar Width
2997
+ * @see https://tailwindcss.com/docs/scrollbar-width
2998
+ */
2999
+ "scrollbar-w": [{ scrollbar: [
3000
+ "auto",
3001
+ "thin",
3002
+ "none"
3003
+ ] }],
3004
+ /**
3005
+ * Scroll Margin
3006
+ * @see https://tailwindcss.com/docs/scroll-margin
3007
+ */
3008
+ "scroll-m": [{ "scroll-m": scaleUnambiguousSpacing() }],
3009
+ /**
3010
+ * Scroll Margin Inline
3011
+ * @see https://tailwindcss.com/docs/scroll-margin
3012
+ */
3013
+ "scroll-mx": [{ "scroll-mx": scaleUnambiguousSpacing() }],
3014
+ /**
3015
+ * Scroll Margin Block
3016
+ * @see https://tailwindcss.com/docs/scroll-margin
3017
+ */
3018
+ "scroll-my": [{ "scroll-my": scaleUnambiguousSpacing() }],
3019
+ /**
3020
+ * Scroll Margin Inline Start
3021
+ * @see https://tailwindcss.com/docs/scroll-margin
3022
+ */
3023
+ "scroll-ms": [{ "scroll-ms": scaleUnambiguousSpacing() }],
3024
+ /**
3025
+ * Scroll Margin Inline End
3026
+ * @see https://tailwindcss.com/docs/scroll-margin
3027
+ */
3028
+ "scroll-me": [{ "scroll-me": scaleUnambiguousSpacing() }],
3029
+ /**
3030
+ * Scroll Margin Block Start
3031
+ * @see https://tailwindcss.com/docs/scroll-margin
3032
+ */
3033
+ "scroll-mbs": [{ "scroll-mbs": scaleUnambiguousSpacing() }],
3034
+ /**
3035
+ * Scroll Margin Block End
3036
+ * @see https://tailwindcss.com/docs/scroll-margin
3037
+ */
3038
+ "scroll-mbe": [{ "scroll-mbe": scaleUnambiguousSpacing() }],
3039
+ /**
3040
+ * Scroll Margin Top
3041
+ * @see https://tailwindcss.com/docs/scroll-margin
3042
+ */
3043
+ "scroll-mt": [{ "scroll-mt": scaleUnambiguousSpacing() }],
3044
+ /**
3045
+ * Scroll Margin Right
3046
+ * @see https://tailwindcss.com/docs/scroll-margin
3047
+ */
3048
+ "scroll-mr": [{ "scroll-mr": scaleUnambiguousSpacing() }],
3049
+ /**
3050
+ * Scroll Margin Bottom
3051
+ * @see https://tailwindcss.com/docs/scroll-margin
3052
+ */
3053
+ "scroll-mb": [{ "scroll-mb": scaleUnambiguousSpacing() }],
3054
+ /**
3055
+ * Scroll Margin Left
3056
+ * @see https://tailwindcss.com/docs/scroll-margin
3057
+ */
3058
+ "scroll-ml": [{ "scroll-ml": scaleUnambiguousSpacing() }],
3059
+ /**
3060
+ * Scroll Padding
3061
+ * @see https://tailwindcss.com/docs/scroll-padding
3062
+ */
3063
+ "scroll-p": [{ "scroll-p": scaleUnambiguousSpacing() }],
3064
+ /**
3065
+ * Scroll Padding Inline
3066
+ * @see https://tailwindcss.com/docs/scroll-padding
3067
+ */
3068
+ "scroll-px": [{ "scroll-px": scaleUnambiguousSpacing() }],
3069
+ /**
3070
+ * Scroll Padding Block
3071
+ * @see https://tailwindcss.com/docs/scroll-padding
3072
+ */
3073
+ "scroll-py": [{ "scroll-py": scaleUnambiguousSpacing() }],
3074
+ /**
3075
+ * Scroll Padding Inline Start
3076
+ * @see https://tailwindcss.com/docs/scroll-padding
3077
+ */
3078
+ "scroll-ps": [{ "scroll-ps": scaleUnambiguousSpacing() }],
3079
+ /**
3080
+ * Scroll Padding Inline End
3081
+ * @see https://tailwindcss.com/docs/scroll-padding
3082
+ */
3083
+ "scroll-pe": [{ "scroll-pe": scaleUnambiguousSpacing() }],
3084
+ /**
3085
+ * Scroll Padding Block Start
3086
+ * @see https://tailwindcss.com/docs/scroll-padding
3087
+ */
3088
+ "scroll-pbs": [{ "scroll-pbs": scaleUnambiguousSpacing() }],
3089
+ /**
3090
+ * Scroll Padding Block End
3091
+ * @see https://tailwindcss.com/docs/scroll-padding
3092
+ */
3093
+ "scroll-pbe": [{ "scroll-pbe": scaleUnambiguousSpacing() }],
3094
+ /**
3095
+ * Scroll Padding Top
3096
+ * @see https://tailwindcss.com/docs/scroll-padding
3097
+ */
3098
+ "scroll-pt": [{ "scroll-pt": scaleUnambiguousSpacing() }],
3099
+ /**
3100
+ * Scroll Padding Right
3101
+ * @see https://tailwindcss.com/docs/scroll-padding
3102
+ */
3103
+ "scroll-pr": [{ "scroll-pr": scaleUnambiguousSpacing() }],
3104
+ /**
3105
+ * Scroll Padding Bottom
3106
+ * @see https://tailwindcss.com/docs/scroll-padding
3107
+ */
3108
+ "scroll-pb": [{ "scroll-pb": scaleUnambiguousSpacing() }],
3109
+ /**
3110
+ * Scroll Padding Left
3111
+ * @see https://tailwindcss.com/docs/scroll-padding
3112
+ */
3113
+ "scroll-pl": [{ "scroll-pl": scaleUnambiguousSpacing() }],
3114
+ /**
3115
+ * Scroll Snap Align
3116
+ * @see https://tailwindcss.com/docs/scroll-snap-align
3117
+ */
3118
+ "snap-align": [{ snap: [
3119
+ "start",
3120
+ "end",
3121
+ "center",
3122
+ "align-none"
3123
+ ] }],
3124
+ /**
3125
+ * Scroll Snap Stop
3126
+ * @see https://tailwindcss.com/docs/scroll-snap-stop
3127
+ */
3128
+ "snap-stop": [{ snap: ["normal", "always"] }],
3129
+ /**
3130
+ * Scroll Snap Type
3131
+ * @see https://tailwindcss.com/docs/scroll-snap-type
3132
+ */
3133
+ "snap-type": [{ snap: [
3134
+ "none",
3135
+ "x",
3136
+ "y",
3137
+ "both"
3138
+ ] }],
3139
+ /**
3140
+ * Scroll Snap Type Strictness
3141
+ * @see https://tailwindcss.com/docs/scroll-snap-type
3142
+ */
3143
+ "snap-strictness": [{ snap: ["mandatory", "proximity"] }],
3144
+ /**
3145
+ * Touch Action
3146
+ * @see https://tailwindcss.com/docs/touch-action
3147
+ */
3148
+ touch: [{ touch: [
3149
+ "auto",
3150
+ "none",
3151
+ "manipulation"
3152
+ ] }],
3153
+ /**
3154
+ * Touch Action X
3155
+ * @see https://tailwindcss.com/docs/touch-action
3156
+ */
3157
+ "touch-x": [{ "touch-pan": [
3158
+ "x",
3159
+ "left",
3160
+ "right"
3161
+ ] }],
3162
+ /**
3163
+ * Touch Action Y
3164
+ * @see https://tailwindcss.com/docs/touch-action
3165
+ */
3166
+ "touch-y": [{ "touch-pan": [
3167
+ "y",
3168
+ "up",
3169
+ "down"
3170
+ ] }],
3171
+ /**
3172
+ * Touch Action Pinch Zoom
3173
+ * @see https://tailwindcss.com/docs/touch-action
3174
+ */
3175
+ "touch-pz": ["touch-pinch-zoom"],
3176
+ /**
3177
+ * User Select
3178
+ * @see https://tailwindcss.com/docs/user-select
3179
+ */
3180
+ select: [{ select: [
3181
+ "none",
3182
+ "text",
3183
+ "all",
3184
+ "auto"
3185
+ ] }],
3186
+ /**
3187
+ * Will Change
3188
+ * @see https://tailwindcss.com/docs/will-change
3189
+ */
3190
+ "will-change": [{ "will-change": [
3191
+ "auto",
3192
+ "scroll",
3193
+ "contents",
3194
+ "transform",
3195
+ isArbitraryVariable,
3196
+ isArbitraryValue
3197
+ ] }],
3198
+ /**
3199
+ * Fill
3200
+ * @see https://tailwindcss.com/docs/fill
3201
+ */
3202
+ fill: [{ fill: ["none", ...scaleColor()] }],
3203
+ /**
3204
+ * Stroke Width
3205
+ * @see https://tailwindcss.com/docs/stroke-width
3206
+ */
3207
+ "stroke-w": [{ stroke: [
3208
+ isNumber,
3209
+ isArbitraryVariableLength,
3210
+ isArbitraryLength,
3211
+ isArbitraryNumber
3212
+ ] }],
3213
+ /**
3214
+ * Stroke
3215
+ * @see https://tailwindcss.com/docs/stroke
3216
+ */
3217
+ stroke: [{ stroke: ["none", ...scaleColor()] }],
3218
+ /**
3219
+ * Forced Color Adjust
3220
+ * @see https://tailwindcss.com/docs/forced-color-adjust
3221
+ */
3222
+ "forced-color-adjust": [{ "forced-color-adjust": ["auto", "none"] }]
3223
+ },
3224
+ conflictingClassGroups: {
3225
+ "container-named": ["container-type"],
3226
+ overflow: ["overflow-x", "overflow-y"],
3227
+ overscroll: ["overscroll-x", "overscroll-y"],
3228
+ inset: [
3229
+ "inset-x",
3230
+ "inset-y",
3231
+ "inset-bs",
3232
+ "inset-be",
3233
+ "start",
3234
+ "end",
3235
+ "top",
3236
+ "right",
3237
+ "bottom",
3238
+ "left"
3239
+ ],
3240
+ "inset-x": [
3241
+ "start",
3242
+ "end",
3243
+ "right",
3244
+ "left"
3245
+ ],
3246
+ "inset-y": [
3247
+ "inset-bs",
3248
+ "inset-be",
3249
+ "top",
3250
+ "bottom"
3251
+ ],
3252
+ flex: [
3253
+ "basis",
3254
+ "grow",
3255
+ "shrink"
3256
+ ],
3257
+ gap: ["gap-x", "gap-y"],
3258
+ p: [
3259
+ "px",
3260
+ "py",
3261
+ "ps",
3262
+ "pe",
3263
+ "pbs",
3264
+ "pbe",
3265
+ "pt",
3266
+ "pr",
3267
+ "pb",
3268
+ "pl"
3269
+ ],
3270
+ px: [
3271
+ "ps",
3272
+ "pe",
3273
+ "pr",
3274
+ "pl"
3275
+ ],
3276
+ py: [
3277
+ "pbs",
3278
+ "pbe",
3279
+ "pt",
3280
+ "pb"
3281
+ ],
3282
+ m: [
3283
+ "mx",
3284
+ "my",
3285
+ "ms",
3286
+ "me",
3287
+ "mbs",
3288
+ "mbe",
3289
+ "mt",
3290
+ "mr",
3291
+ "mb",
3292
+ "ml"
3293
+ ],
3294
+ mx: [
3295
+ "ms",
3296
+ "me",
3297
+ "mr",
3298
+ "ml"
3299
+ ],
3300
+ my: [
3301
+ "mbs",
3302
+ "mbe",
3303
+ "mt",
3304
+ "mb"
3305
+ ],
3306
+ size: ["w", "h"],
3307
+ "font-size": ["leading"],
3308
+ "fvn-normal": [
3309
+ "fvn-ordinal",
3310
+ "fvn-slashed-zero",
3311
+ "fvn-figure",
3312
+ "fvn-spacing",
3313
+ "fvn-fraction"
3314
+ ],
3315
+ "fvn-ordinal": ["fvn-normal"],
3316
+ "fvn-slashed-zero": ["fvn-normal"],
3317
+ "fvn-figure": ["fvn-normal"],
3318
+ "fvn-spacing": ["fvn-normal"],
3319
+ "fvn-fraction": ["fvn-normal"],
3320
+ "line-clamp": ["display", "overflow"],
3321
+ rounded: [
3322
+ "rounded-s",
3323
+ "rounded-e",
3324
+ "rounded-t",
3325
+ "rounded-r",
3326
+ "rounded-b",
3327
+ "rounded-l",
3328
+ "rounded-ss",
3329
+ "rounded-se",
3330
+ "rounded-ee",
3331
+ "rounded-es",
3332
+ "rounded-tl",
3333
+ "rounded-tr",
3334
+ "rounded-br",
3335
+ "rounded-bl"
3336
+ ],
3337
+ "rounded-s": ["rounded-ss", "rounded-es"],
3338
+ "rounded-e": ["rounded-se", "rounded-ee"],
3339
+ "rounded-t": ["rounded-tl", "rounded-tr"],
3340
+ "rounded-r": ["rounded-tr", "rounded-br"],
3341
+ "rounded-b": ["rounded-br", "rounded-bl"],
3342
+ "rounded-l": ["rounded-tl", "rounded-bl"],
3343
+ "border-spacing": ["border-spacing-x", "border-spacing-y"],
3344
+ "border-w": [
3345
+ "border-w-x",
3346
+ "border-w-y",
3347
+ "border-w-s",
3348
+ "border-w-e",
3349
+ "border-w-bs",
3350
+ "border-w-be",
3351
+ "border-w-t",
3352
+ "border-w-r",
3353
+ "border-w-b",
3354
+ "border-w-l"
3355
+ ],
3356
+ "border-w-x": [
3357
+ "border-w-s",
3358
+ "border-w-e",
3359
+ "border-w-r",
3360
+ "border-w-l"
3361
+ ],
3362
+ "border-w-y": [
3363
+ "border-w-bs",
3364
+ "border-w-be",
3365
+ "border-w-t",
3366
+ "border-w-b"
3367
+ ],
3368
+ "border-color": [
3369
+ "border-color-x",
3370
+ "border-color-y",
3371
+ "border-color-s",
3372
+ "border-color-e",
3373
+ "border-color-bs",
3374
+ "border-color-be",
3375
+ "border-color-t",
3376
+ "border-color-r",
3377
+ "border-color-b",
3378
+ "border-color-l"
3379
+ ],
3380
+ "border-color-x": [
3381
+ "border-color-s",
3382
+ "border-color-e",
3383
+ "border-color-r",
3384
+ "border-color-l"
3385
+ ],
3386
+ "border-color-y": [
3387
+ "border-color-bs",
3388
+ "border-color-be",
3389
+ "border-color-t",
3390
+ "border-color-b"
3391
+ ],
3392
+ translate: [
3393
+ "translate-x",
3394
+ "translate-y",
3395
+ "translate-none"
3396
+ ],
3397
+ "translate-none": [
3398
+ "translate",
3399
+ "translate-x",
3400
+ "translate-y",
3401
+ "translate-z"
3402
+ ],
3403
+ "scroll-m": [
3404
+ "scroll-mx",
3405
+ "scroll-my",
3406
+ "scroll-ms",
3407
+ "scroll-me",
3408
+ "scroll-mbs",
3409
+ "scroll-mbe",
3410
+ "scroll-mt",
3411
+ "scroll-mr",
3412
+ "scroll-mb",
3413
+ "scroll-ml"
3414
+ ],
3415
+ "scroll-mx": [
3416
+ "scroll-ms",
3417
+ "scroll-me",
3418
+ "scroll-mr",
3419
+ "scroll-ml"
3420
+ ],
3421
+ "scroll-my": [
3422
+ "scroll-mbs",
3423
+ "scroll-mbe",
3424
+ "scroll-mt",
3425
+ "scroll-mb"
3426
+ ],
3427
+ "scroll-p": [
3428
+ "scroll-px",
3429
+ "scroll-py",
3430
+ "scroll-ps",
3431
+ "scroll-pe",
3432
+ "scroll-pbs",
3433
+ "scroll-pbe",
3434
+ "scroll-pt",
3435
+ "scroll-pr",
3436
+ "scroll-pb",
3437
+ "scroll-pl"
3438
+ ],
3439
+ "scroll-px": [
3440
+ "scroll-ps",
3441
+ "scroll-pe",
3442
+ "scroll-pr",
3443
+ "scroll-pl"
3444
+ ],
3445
+ "scroll-py": [
3446
+ "scroll-pbs",
3447
+ "scroll-pbe",
3448
+ "scroll-pt",
3449
+ "scroll-pb"
3450
+ ],
3451
+ touch: [
3452
+ "touch-x",
3453
+ "touch-y",
3454
+ "touch-pz"
3455
+ ],
3456
+ "touch-x": ["touch"],
3457
+ "touch-y": ["touch"],
3458
+ "touch-pz": ["touch"]
3459
+ },
3460
+ conflictingClassGroupModifiers: { "font-size": ["leading"] },
3461
+ postfixLookupClassGroups: ["container-type"],
3462
+ orderSensitiveModifiers: [
3463
+ "*",
3464
+ "**",
3465
+ "after",
3466
+ "backdrop",
3467
+ "before",
3468
+ "details-content",
3469
+ "file",
3470
+ "first-letter",
3471
+ "first-line",
3472
+ "marker",
3473
+ "placeholder",
3474
+ "selection"
3475
+ ]
3476
+ };
3477
+ };
3478
+ const twMerge = /*#__PURE__*/ createTailwindMerge(getDefaultConfig);
3479
+ //#endregion
3480
+ //#region node_modules/@tangle-network/ui/dist/lib/utils.js
3481
+ function cn(...inputs) {
3482
+ return twMerge(clsx(inputs));
3483
+ }
3484
+ //#endregion
3485
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs
3486
+ /**
3487
+ * @license lucide-react v1.63.0 - ISC
3488
+ *
3489
+ * This source code is licensed under the ISC license.
3490
+ * See the LICENSE file in the root directory of this source tree.
3491
+ */
3492
+ const toKebabCase = (string) => string?.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
3493
+ //#endregion
3494
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs
3495
+ /**
3496
+ * @license lucide-react v1.63.0 - ISC
3497
+ *
3498
+ * This source code is licensed under the ISC license.
3499
+ * See the LICENSE file in the root directory of this source tree.
3500
+ */
3501
+ function toLucideIconData(iconName, iconNode, aliases = []) {
3502
+ if (iconNode == null) throw new Error("[lucide]: iconNode is required when icon name is used");
3503
+ return {
3504
+ name: toKebabCase(iconName),
3505
+ size: 24,
3506
+ node: iconNode,
3507
+ ...aliases.length > 0 ? { aliases } : {}
3508
+ };
3509
+ }
3510
+ //#endregion
3511
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs
3512
+ /**
3513
+ * @license lucide-react v1.63.0 - ISC
3514
+ *
3515
+ * This source code is licensed under the ISC license.
3516
+ * See the LICENSE file in the root directory of this source tree.
3517
+ */
3518
+ const toCamelCase = (string) => {
3519
+ let out = "";
3520
+ let upperNext = false;
3521
+ for (const ch of string) {
3522
+ if (ch === "-" || ch === "_" || ch <= " ") {
3523
+ upperNext = out.length > 0;
3524
+ continue;
3525
+ }
3526
+ if (out.length === 0) out += ch.toLowerCase();
3527
+ else out += upperNext ? ch.toUpperCase() : ch;
3528
+ upperNext = false;
3529
+ }
3530
+ return out;
3531
+ };
3532
+ //#endregion
3533
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs
3534
+ /**
3535
+ * @license lucide-react v1.63.0 - ISC
3536
+ *
3537
+ * This source code is licensed under the ISC license.
3538
+ * See the LICENSE file in the root directory of this source tree.
3539
+ */
3540
+ const toPascalCase = (string) => {
3541
+ const camelCase = toCamelCase(string);
3542
+ return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
3543
+ };
3544
+ //#endregion
3545
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs
3546
+ /**
3547
+ * @license lucide-react v1.63.0 - ISC
3548
+ *
3549
+ * This source code is licensed under the ISC license.
3550
+ * See the LICENSE file in the root directory of this source tree.
3551
+ */
3552
+ const mergeClasses = (...classes) => classes.filter((className, index, array) => {
3553
+ return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index;
3554
+ }).join(" ").trim();
3555
+ //#endregion
3556
+ //#region node_modules/lucide-react/dist/esm/shared/src/build/defaultAttributes.mjs
3557
+ /**
3558
+ * @license lucide-react v1.63.0 - ISC
3559
+ *
3560
+ * This source code is licensed under the ISC license.
3561
+ * See the LICENSE file in the root directory of this source tree.
3562
+ */
3563
+ const defaultAttributes = {
3564
+ xmlns: "http://www.w3.org/2000/svg",
3565
+ width: 24,
3566
+ height: 24,
3567
+ viewBox: "0 0 24 24",
3568
+ fill: "none",
3569
+ stroke: "currentColor",
3570
+ "stroke-width": 2,
3571
+ "stroke-linecap": "round",
3572
+ "stroke-linejoin": "round"
3573
+ };
3574
+ //#endregion
3575
+ //#region node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs
3576
+ /**
3577
+ * @license lucide-react v1.63.0 - ISC
3578
+ *
3579
+ * This source code is licensed under the ISC license.
3580
+ * See the LICENSE file in the root directory of this source tree.
3581
+ */
3582
+ function isDefined(value) {
3583
+ return value !== null && value !== void 0;
3584
+ }
3585
+ function buildLucideIconNode(icon, params = {}) {
3586
+ const attributeNames = params.attributeNames ?? {};
3587
+ const getAttributeName = (attributeName) => attributeNames[attributeName] ?? attributeName;
3588
+ const viewBoxWidth = icon.size ?? icon.width ?? defaultAttributes["width"];
3589
+ const viewBoxHeight = icon.size ?? icon.height ?? defaultAttributes["height"];
3590
+ const aliasClassNames = icon.aliases?.filter((alias) => typeof alias === "string" && alias.trim() !== "").map((alias) => `lucide-${alias}`) ?? [];
3591
+ const iconClassNames = [...icon.name ? [`lucide-${icon.name}`] : [], ...aliasClassNames];
3592
+ const classNamesFromClassName = params.className?.split(" ").filter(Boolean) ?? [];
3593
+ const className = params.includeDefaultClasses === false ? mergeClasses(...classNamesFromClassName) : mergeClasses("lucide", ...iconClassNames, ...classNamesFromClassName);
3594
+ const calculatedStrokeWidth = params.absoluteStrokeWidth ? Number(params.strokeWidth ?? defaultAttributes["stroke-width"]) * Number(icon.size ?? icon.width ?? defaultAttributes["width"]) / Number(params.size ?? params.width ?? defaultAttributes["width"]) : params.strokeWidth ?? defaultAttributes["stroke-width"];
3595
+ return [
3596
+ "svg",
3597
+ {
3598
+ ...Object.entries(defaultAttributes).reduce((attrs, [attrName, value]) => {
3599
+ attrs[getAttributeName(attrName)] = value;
3600
+ return attrs;
3601
+ }, {}),
3602
+ ..."color" in params && params.color && { [getAttributeName("stroke")]: params.color },
3603
+ ..."size" in params && isDefined(params.size) && {
3604
+ [getAttributeName("width")]: params.size,
3605
+ [getAttributeName("height")]: params.size
3606
+ },
3607
+ ..."width" in params && isDefined(params.width) && { [getAttributeName("width")]: params.width },
3608
+ ..."height" in params && isDefined(params.height) && { [getAttributeName("height")]: params.height },
3609
+ [getAttributeName("stroke-width")]: calculatedStrokeWidth,
3610
+ ...className && { [getAttributeName("class")]: className },
3611
+ [getAttributeName("viewBox")]: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,
3612
+ ...params.hasA11yProp === false ? { [getAttributeName("aria-hidden")]: "true" } : {},
3613
+ ..."attributes" in params && params.attributes
3614
+ },
3615
+ icon.node.map((child) => {
3616
+ const [name, attrs, children] = child;
3617
+ const nextAttrs = params.nonScalingStroke ? {
3618
+ [getAttributeName("vector-effect")]: "non-scaling-stroke",
3619
+ ...attrs
3620
+ } : attrs;
3621
+ return children ? [
3622
+ name,
3623
+ nextAttrs,
3624
+ children
3625
+ ] : [name, nextAttrs];
3626
+ })
3627
+ ];
3628
+ }
3629
+ //#endregion
3630
+ //#region node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs
3631
+ /**
3632
+ * @license lucide-react v1.63.0 - ISC
3633
+ *
3634
+ * This source code is licensed under the ISC license.
3635
+ * See the LICENSE file in the root directory of this source tree.
3636
+ */
3637
+ function buildLucideIconForReact(icon, params = {}) {
3638
+ return buildLucideIconNode(icon, {
3639
+ ...params,
3640
+ attributeNames: {
3641
+ ...params.attributeNames,
3642
+ class: "className",
3643
+ "stroke-width": "strokeWidth",
3644
+ "stroke-linecap": "strokeLinecap",
3645
+ "stroke-linejoin": "strokeLinejoin",
3646
+ "vector-effect": "vectorEffect"
3647
+ }
3648
+ });
3649
+ }
3650
+ //#endregion
3651
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs
3652
+ /**
3653
+ * @license lucide-react v1.63.0 - ISC
3654
+ *
3655
+ * This source code is licensed under the ISC license.
3656
+ * See the LICENSE file in the root directory of this source tree.
3657
+ */
3658
+ const hasA11yProp = (props) => {
3659
+ for (const prop in props) if (prop.startsWith("aria-") || prop === "role" || prop === "title") return true;
3660
+ return false;
3661
+ };
3662
+ //#endregion
3663
+ //#region node_modules/lucide-react/dist/esm/context.mjs
3664
+ /**
3665
+ * @license lucide-react v1.63.0 - ISC
3666
+ *
3667
+ * This source code is licensed under the ISC license.
3668
+ * See the LICENSE file in the root directory of this source tree.
3669
+ */
3670
+ const LucideContext = createContext({});
3671
+ const useLucideContext = () => useContext(LucideContext);
3672
+ //#endregion
3673
+ //#region node_modules/lucide-react/dist/esm/Icon.mjs
3674
+ /**
3675
+ * @license lucide-react v1.63.0 - ISC
3676
+ *
3677
+ * This source code is licensed under the ISC license.
3678
+ * See the LICENSE file in the root directory of this source tree.
3679
+ */
3680
+ const Icon = forwardRef(({ color, size, width, height, strokeWidth, absoluteStrokeWidth, nonScalingStroke, className = "", children, iconNode = [], icon = {
3681
+ node: iconNode,
3682
+ aliases: [],
3683
+ size: 24
3684
+ }, ...rest }, ref) => {
3685
+ const { size: contextSize = 24, strokeWidth: contextStrokeWidth = 2, absoluteStrokeWidth: contextAbsoluteStrokeWidth = false, nonScalingStroke: contextNonScalingStroke = false, color: contextColor = "currentColor", className: contextClass = "" } = useLucideContext() ?? {};
3686
+ const hasAccessibleProp = Boolean(children) || hasA11yProp(rest);
3687
+ const [name, svgAttributes, builtIconNode = []] = buildLucideIconForReact(icon, {
3688
+ color: color ?? contextColor,
3689
+ width: width ?? size ?? contextSize,
3690
+ height: height ?? size ?? contextSize,
3691
+ strokeWidth: strokeWidth ?? contextStrokeWidth,
3692
+ absoluteStrokeWidth: absoluteStrokeWidth ?? contextAbsoluteStrokeWidth,
3693
+ nonScalingStroke: nonScalingStroke ?? contextNonScalingStroke,
3694
+ className: mergeClasses(contextClass, className),
3695
+ hasA11yProp: hasAccessibleProp,
3696
+ attributes: rest
3697
+ });
3698
+ return createElement(name, {
3699
+ ref,
3700
+ ...svgAttributes
3701
+ }, [...builtIconNode.map(([tag, attrs]) => createElement(tag, attrs)), ...Array.isArray(children) ? children : [children]]);
3702
+ });
3703
+ //#endregion
3704
+ //#region node_modules/lucide-react/dist/esm/createLucideIcon.mjs
3705
+ /**
3706
+ * @license lucide-react v1.63.0 - ISC
3707
+ *
3708
+ * This source code is licensed under the ISC license.
3709
+ * See the LICENSE file in the root directory of this source tree.
3710
+ */
3711
+ function createLucideIcon(iconDataOrName, iconNode = [], aliases = []) {
3712
+ const iconData = typeof iconDataOrName === "string" ? toLucideIconData(iconDataOrName, iconNode, aliases) : iconDataOrName;
3713
+ const Component = forwardRef(({ className, ...props }, ref) => createElement(Icon, {
3714
+ ref,
3715
+ icon: iconData,
3716
+ className,
3717
+ ...props
3718
+ }));
3719
+ if (iconData.name) Component.displayName = toPascalCase(iconData.name);
3720
+ return Component;
3721
+ }
3722
+ //#endregion
3723
+ //#region node_modules/lucide-react/dist/esm/icons/circle-check.mjs
3724
+ /**
3725
+ * @license lucide-react v1.63.0 - ISC
3726
+ *
3727
+ * This source code is licensed under the ISC license.
3728
+ * See the LICENSE file in the root directory of this source tree.
3729
+ */
3730
+ const __iconData$7 = {
3731
+ name: "circle-check",
3732
+ size: 24,
3733
+ node: [["circle", {
3734
+ cx: "12",
3735
+ cy: "12",
3736
+ r: "10",
3737
+ key: "1mglay"
3738
+ }], ["path", {
3739
+ d: "m16 9-5.5 5.5L8 12",
3740
+ key: "xofnsj"
3741
+ }]],
3742
+ aliases: ["check-circle-2"]
3743
+ };
3744
+ __iconData$7.node;
3745
+ const CircleCheck = createLucideIcon(__iconData$7);
3746
+ //#endregion
3747
+ //#region node_modules/lucide-react/dist/esm/icons/circle-dashed.mjs
3748
+ /**
3749
+ * @license lucide-react v1.63.0 - ISC
3750
+ *
3751
+ * This source code is licensed under the ISC license.
3752
+ * See the LICENSE file in the root directory of this source tree.
3753
+ */
3754
+ const __iconData$6 = {
3755
+ name: "circle-dashed",
3756
+ size: 24,
3757
+ node: [
3758
+ ["path", {
3759
+ d: "M10.1 2.182a10 10 0 0 1 3.8 0",
3760
+ key: "5ilxe3"
3761
+ }],
3762
+ ["path", {
3763
+ d: "M13.9 21.818a10 10 0 0 1-3.8 0",
3764
+ key: "11zvb9"
3765
+ }],
3766
+ ["path", {
3767
+ d: "M17.609 3.721a10 10 0 0 1 2.69 2.7",
3768
+ key: "1iw5b2"
3769
+ }],
3770
+ ["path", {
3771
+ d: "M2.182 13.9a10 10 0 0 1 0-3.8",
3772
+ key: "c0bmvh"
3773
+ }],
3774
+ ["path", {
3775
+ d: "M20.279 17.609a10 10 0 0 1-2.7 2.69",
3776
+ key: "1ruxm7"
3777
+ }],
3778
+ ["path", {
3779
+ d: "M21.818 10.1a10 10 0 0 1 0 3.8",
3780
+ key: "qkgqxc"
3781
+ }],
3782
+ ["path", {
3783
+ d: "M3.721 6.391a10 10 0 0 1 2.7-2.69",
3784
+ key: "1mcia2"
3785
+ }],
3786
+ ["path", {
3787
+ d: "M6.391 20.279a10 10 0 0 1-2.69-2.7",
3788
+ key: "1fvljs"
3789
+ }]
3790
+ ]
3791
+ };
3792
+ __iconData$6.node;
3793
+ const CircleDashed = createLucideIcon(__iconData$6);
3794
+ //#endregion
3795
+ //#region node_modules/lucide-react/dist/esm/icons/circle-dot.mjs
3796
+ /**
3797
+ * @license lucide-react v1.63.0 - ISC
3798
+ *
3799
+ * This source code is licensed under the ISC license.
3800
+ * See the LICENSE file in the root directory of this source tree.
3801
+ */
3802
+ const __iconData$5 = {
3803
+ name: "circle-dot",
3804
+ size: 24,
3805
+ node: [["circle", {
3806
+ cx: "12",
3807
+ cy: "12",
3808
+ r: "1",
3809
+ key: "41hilf"
3810
+ }], ["circle", {
3811
+ cx: "12",
3812
+ cy: "12",
3813
+ r: "10",
3814
+ key: "1mglay"
3815
+ }]]
3816
+ };
3817
+ __iconData$5.node;
3818
+ const CircleDot = createLucideIcon(__iconData$5);
3819
+ //#endregion
3820
+ //#region node_modules/lucide-react/dist/esm/icons/circle-question-mark.mjs
3821
+ /**
3822
+ * @license lucide-react v1.63.0 - ISC
3823
+ *
3824
+ * This source code is licensed under the ISC license.
3825
+ * See the LICENSE file in the root directory of this source tree.
3826
+ */
3827
+ const __iconData$4 = {
3828
+ name: "circle-question-mark",
3829
+ size: 24,
3830
+ node: [
3831
+ ["circle", {
3832
+ cx: "12",
3833
+ cy: "12",
3834
+ r: "10",
3835
+ key: "1mglay"
3836
+ }],
3837
+ ["path", {
3838
+ d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",
3839
+ key: "1u773s"
3840
+ }],
3841
+ ["path", {
3842
+ d: "M12 17h.01",
3843
+ key: "p32p05"
3844
+ }]
3845
+ ],
3846
+ aliases: ["help-circle", "circle-help"]
3847
+ };
3848
+ __iconData$4.node;
3849
+ const CircleQuestionMark = createLucideIcon(__iconData$4);
3850
+ //#endregion
3851
+ //#region node_modules/lucide-react/dist/esm/icons/circle-stop.mjs
3852
+ /**
3853
+ * @license lucide-react v1.63.0 - ISC
3854
+ *
3855
+ * This source code is licensed under the ISC license.
3856
+ * See the LICENSE file in the root directory of this source tree.
3857
+ */
3858
+ const __iconData$3 = {
3859
+ name: "circle-stop",
3860
+ size: 24,
3861
+ node: [["circle", {
3862
+ cx: "12",
3863
+ cy: "12",
3864
+ r: "10",
3865
+ key: "1mglay"
3866
+ }], ["rect", {
3867
+ x: "9",
3868
+ y: "9",
3869
+ width: "6",
3870
+ height: "6",
3871
+ rx: "1",
3872
+ key: "1ssd4o"
3873
+ }]],
3874
+ aliases: ["stop-circle"]
3875
+ };
3876
+ __iconData$3.node;
3877
+ const CircleStop = createLucideIcon(__iconData$3);
3878
+ //#endregion
3879
+ //#region node_modules/lucide-react/dist/esm/icons/circle-x.mjs
3880
+ /**
3881
+ * @license lucide-react v1.63.0 - ISC
3882
+ *
3883
+ * This source code is licensed under the ISC license.
3884
+ * See the LICENSE file in the root directory of this source tree.
3885
+ */
3886
+ const __iconData$2 = {
3887
+ name: "circle-x",
3888
+ size: 24,
3889
+ node: [
3890
+ ["circle", {
3891
+ cx: "12",
3892
+ cy: "12",
3893
+ r: "10",
3894
+ key: "1mglay"
3895
+ }],
3896
+ ["path", {
3897
+ d: "m15 9-6 6",
3898
+ key: "1uzhvr"
3899
+ }],
3900
+ ["path", {
3901
+ d: "m9 9 6 6",
3902
+ key: "z0biqf"
3903
+ }]
3904
+ ],
3905
+ aliases: ["x-circle"]
3906
+ };
3907
+ __iconData$2.node;
3908
+ const CircleX = createLucideIcon(__iconData$2);
3909
+ //#endregion
3910
+ //#region node_modules/lucide-react/dist/esm/icons/hand.mjs
3911
+ /**
3912
+ * @license lucide-react v1.63.0 - ISC
3913
+ *
3914
+ * This source code is licensed under the ISC license.
3915
+ * See the LICENSE file in the root directory of this source tree.
3916
+ */
3917
+ const __iconData$1 = {
3918
+ name: "hand",
3919
+ size: 24,
3920
+ node: [
3921
+ ["path", {
3922
+ d: "M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2",
3923
+ key: "1fvzgz"
3924
+ }],
3925
+ ["path", {
3926
+ d: "M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2",
3927
+ key: "1kc0my"
3928
+ }],
3929
+ ["path", {
3930
+ d: "M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8",
3931
+ key: "10h0bg"
3932
+ }],
3933
+ ["path", {
3934
+ d: "M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15",
3935
+ key: "1s1gnw"
3936
+ }]
3937
+ ]
3938
+ };
3939
+ __iconData$1.node;
3940
+ const Hand = createLucideIcon(__iconData$1);
3941
+ //#endregion
3942
+ //#region node_modules/lucide-react/dist/esm/icons/hourglass.mjs
3943
+ /**
3944
+ * @license lucide-react v1.63.0 - ISC
3945
+ *
3946
+ * This source code is licensed under the ISC license.
3947
+ * See the LICENSE file in the root directory of this source tree.
3948
+ */
3949
+ const __iconData = {
3950
+ name: "hourglass",
3951
+ size: 24,
3952
+ node: [
3953
+ ["path", {
3954
+ d: "M5 22h14",
3955
+ key: "ehvnwv"
3956
+ }],
3957
+ ["path", {
3958
+ d: "M5 2h14",
3959
+ key: "pdyrp9"
3960
+ }],
3961
+ ["path", {
3962
+ d: "M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22",
3963
+ key: "1d314k"
3964
+ }],
3965
+ ["path", {
3966
+ d: "M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2",
3967
+ key: "1vvvr6"
3968
+ }]
3969
+ ]
3970
+ };
3971
+ __iconData.node;
3972
+ const Hourglass = createLucideIcon(__iconData);
3973
+ //#endregion
3974
+ //#region node_modules/@tangle-network/ui/dist/run/status-meta.js
3975
+ const META = {
3976
+ running: {
3977
+ label: "Running",
3978
+ icon: CircleDot,
3979
+ token: "--surface-info-text"
3980
+ },
3981
+ waiting: {
3982
+ label: "Waiting",
3983
+ icon: Hourglass,
3984
+ token: "--surface-neutral-text"
3985
+ },
3986
+ "needs-you": {
3987
+ label: "Needs you",
3988
+ icon: Hand,
3989
+ token: "--surface-warning-text"
3990
+ },
3991
+ done: {
3992
+ label: "Done",
3993
+ icon: CircleCheck,
3994
+ token: "--surface-success-text"
3995
+ },
3996
+ failed: {
3997
+ label: "Failed",
3998
+ icon: CircleX,
3999
+ token: "--surface-danger-text"
4000
+ },
4001
+ stopped: {
4002
+ label: "Stopped",
4003
+ icon: CircleStop,
4004
+ token: "--surface-neutral-text"
4005
+ },
4006
+ idle: {
4007
+ label: "Idle",
4008
+ icon: CircleDashed,
4009
+ token: "--surface-neutral-text"
4010
+ },
4011
+ unknown: {
4012
+ label: "Unknown",
4013
+ icon: CircleQuestionMark,
4014
+ token: "--surface-neutral-text"
4015
+ }
4016
+ };
4017
+ const ALIASES = {
4018
+ active: "running",
4019
+ in_progress: "running",
4020
+ "in-progress": "running",
4021
+ streaming: "running",
4022
+ pending: "waiting",
4023
+ queued: "waiting",
4024
+ blocked: "waiting",
4025
+ "attention-needed": "needs-you",
4026
+ needs_you: "needs-you",
4027
+ needs_input: "needs-you",
4028
+ awaiting_input: "needs-you",
4029
+ completed: "done",
4030
+ complete: "done",
4031
+ success: "done",
4032
+ succeeded: "done",
4033
+ shipped: "done",
4034
+ error: "failed",
4035
+ errored: "failed",
4036
+ cancelled: "stopped",
4037
+ canceled: "stopped",
4038
+ aborted: "stopped"
4039
+ };
4040
+ /** Any status string as a `RunStatus`; a value nothing names reads as Unknown, never as a guess. */
4041
+ function runStatus(status) {
4042
+ const key = status.trim().toLowerCase();
4043
+ if (Object.hasOwn(META, key)) return key;
4044
+ return Object.hasOwn(ALIASES, key) ? ALIASES[key] : "unknown";
4045
+ }
4046
+ /** The label, glyph and colour token for a status, in every surface. */
4047
+ function statusMeta(status) {
4048
+ return META[runStatus(status)];
4049
+ }
4050
+ /**
4051
+ * A status glyph on the icon grid, in its token colour and labelled with its
4052
+ * word. Pass `aria-hidden` where the label is already printed beside it.
4053
+ * Running breathes on `--motion-ambient`, the page's one loop period; the
4054
+ * breathe is opacity only, so it is the essential motion reduced motion keeps.
4055
+ */
4056
+ function RunStatusIcon({ status, className, style, ...props }) {
4057
+ const key = runStatus(status);
4058
+ const { label, icon: Icon, token } = META[key];
4059
+ const running = key === "running";
4060
+ return /* @__PURE__ */ jsx(Icon, {
4061
+ role: "img",
4062
+ "aria-label": label,
4063
+ size: 16,
4064
+ strokeWidth: 1.75,
4065
+ "data-run-status": key,
4066
+ "data-motion": running ? "essential" : void 0,
4067
+ className: cn("shrink-0", running && "animate-[tangle-breathe_var(--motion-ambient)_infinite]", className),
4068
+ style: {
4069
+ color: `var(${token})`,
4070
+ ...style
4071
+ },
4072
+ ...props
4073
+ });
4074
+ }
4075
+ //#endregion
4076
+ //#region src/react/flow-waterfall-model.ts
4077
+ const workKind = (mark) => mark.kind === "model" || mark.modelCall ? "model" : "tool";
4078
+ const toolOf = (name) => name?.split(" · ")[0];
4079
+ /** The CSS hue slot: 0 is the root agent's neutral, then five agent hues cycle. */
4080
+ const toneKey = (tone) => tone > 0 && tone <= 5 ? tone : 0;
4081
+ const spanFailed = (span) => span.status === "failed";
4082
+ const spanRunning = (span) => span.status === "running";
4083
+ const spanFact = (span, label) => new Map((span.facts ?? []).map((fact) => [fact.label.toLowerCase(), fact.value])).get(label.toLowerCase());
4084
+ const ordered = (span) => Number.isFinite(span.startMs) && Number.isFinite(span.endMs) && span.endMs >= span.startMs;
4085
+ /** 542ms, 6.9s, 23s, 1m 22s, 2h 05m: the precision a reader compares at each scale. */
4086
+ function formatSpanDuration(ms) {
4087
+ if (!Number.isFinite(ms) || ms < 0) return "—";
4088
+ if (ms < 1e3) return `${Math.round(ms)}ms`;
4089
+ if (ms < 1e4) return `${(ms / 1e3).toFixed(1)}s`;
4090
+ if (ms < 6e4) return `${Math.round(ms / 1e3)}s`;
4091
+ if (ms < 36e5) {
4092
+ const m = Math.floor(ms / 6e4), s = Math.round(ms % 6e4 / 1e3);
4093
+ return s === 60 ? `${m + 1}m` : s ? `${m}m ${s}s` : `${m}m`;
4094
+ }
4095
+ const h = Math.floor(ms / 36e5), m = Math.round(ms % 36e5 / 6e4);
4096
+ return m === 60 ? `${h + 1}h` : `${h}h ${String(m).padStart(2, "0")}m`;
4097
+ }
4098
+ /** $0.12, $0.005, $12.40; never rounds a recorded nonzero cost to $0.00. */
4099
+ function formatCost(usd) {
4100
+ if (finiteNumber(usd) === void 0) return "—";
4101
+ if (usd === 0) return "$0.00";
4102
+ if (usd < .01) return `$${usd.toPrecision(1).replace(/0+$/, "")}`;
4103
+ return `$${usd.toFixed(2)}`;
4104
+ }
4105
+ /** 9.8k, 754.4k, 1.2M with the exact count left to a title. */
4106
+ function formatCount(n) {
4107
+ if (reportedCount(n) === void 0) return "—";
4108
+ if (n < 1e3) return String(n);
4109
+ if (n < 1e6) return `${(n / 1e3).toFixed(1)}K`;
4110
+ return `${(n / 1e6).toFixed(1)}M`;
4111
+ }
4112
+ /** Merge marks closer than `gapMs` so a dense row stays a readable strip of at most `cap` marks. Marks narrower
4113
+ * than the gap merge across kinds and take the kind that covers more time; failures and retries stay distinct. */
4114
+ function mergeSegments(marks, gapMs, cap = 240) {
4115
+ marks.sort((a, b) => a.startMs - b.startMs);
4116
+ let gap = gapMs;
4117
+ for (let pass = 0; pass < 40; pass++, gap *= 2) {
4118
+ const out = [];
4119
+ const covered = /* @__PURE__ */ new Map();
4120
+ for (const mark of marks) {
4121
+ const last = out[out.length - 1];
4122
+ const width = Math.min(mark.endMs, mark.startMs + gap * 4) - mark.startMs;
4123
+ const distinct = (m) => m.retry || m.kind === "failed";
4124
+ const small = width < gap || last !== void 0 && last.endMs - last.startMs < gap;
4125
+ if (last && !distinct(last) && !distinct(mark) && last.tone === mark.tone && mark.startMs - last.endMs <= gap && (last.kind === mark.kind || small)) {
4126
+ const share = covered.get(last) ?? {
4127
+ model: last.kind === "model" ? last.endMs - last.startMs : 0,
4128
+ tool: last.kind === "tool" ? last.endMs - last.startMs : 0
4129
+ };
4130
+ share[mark.kind === "model" ? "model" : "tool"] += width;
4131
+ covered.set(last, share);
4132
+ last.endMs = Math.max(last.endMs, mark.endMs);
4133
+ last.count += mark.count;
4134
+ if (last.tool !== mark.tool) last.tool = void 0;
4135
+ if (mark.costUsd !== void 0) last.costUsd = (last.costUsd ?? 0) + mark.costUsd;
4136
+ last.kind = share.model >= share.tool ? "model" : "tool";
4137
+ } else out.push({ ...mark });
4138
+ }
4139
+ if (out.length <= cap) return out;
4140
+ }
4141
+ return marks;
4142
+ }
4143
+ /** Hierarchy only; presentation owns geometry.
4144
+ * Orphaned parents become roots; cycles are broken without dropping any span. */
4145
+ function flowWaterfallRows(trace, resolutionMs) {
4146
+ const ids = /* @__PURE__ */ new Set();
4147
+ const rows = [...trace.spans].map((recorded, i) => {
4148
+ const state = runStatus(recorded.status ?? "unknown");
4149
+ const outcome = {
4150
+ label: statusMeta(state).label,
4151
+ tone: state === "running" ? "live" : state === "done" ? "ok" : state === "needs-you" ? "warn" : state === "failed" ? "failed" : "neutral",
4152
+ ...state === "unknown" ? { ring: true } : {}
4153
+ };
4154
+ const span = {
4155
+ ...recorded,
4156
+ outcome: recorded.outcome ?? outcome,
4157
+ detail: spanFact(recorded, recorded.kind === "tool" ? "Provider" : "Model") ?? recorded.detail
4158
+ };
4159
+ return {
4160
+ span,
4161
+ key: span.id ?? `span-${i}`
4162
+ };
4163
+ }).sort((a, b) => a.span.startMs - b.span.startMs).map(({ span, key }, index) => {
4164
+ let id = key;
4165
+ let suffix = index;
4166
+ while (ids.has(id)) id = `${key}:${suffix++}`;
4167
+ ids.add(id);
4168
+ return {
4169
+ id,
4170
+ parentId: span.parentId,
4171
+ name: span.name,
4172
+ kind: span.kind,
4173
+ durationLabel: ordered(span) ? `${formatSpanDuration(span.endMs - span.startMs)}${span.approx ? "~" : ""}` : "—",
4174
+ approx: span.approx === true,
4175
+ ok: !spanFailed(span),
4176
+ depth: 0,
4177
+ hasChildren: false,
4178
+ span,
4179
+ tone: -1,
4180
+ descendants: 0,
4181
+ segments: [],
4182
+ own: [],
4183
+ retry: span.retryOf !== void 0,
4184
+ hasAgents: false,
4185
+ ...span.costBound === "lower" || span.costBound === void 0 && trace.costBound === "lower" ? { costFloor: true } : {}
4186
+ };
4187
+ });
4188
+ const byId = new Map(rows.map((row) => [row.id, row]));
4189
+ const children = /* @__PURE__ */ new Map();
4190
+ for (const row of rows) {
4191
+ const seen = /* @__PURE__ */ new Set([row.id]);
4192
+ let parent = row.parentId;
4193
+ while (parent && byId.has(parent)) {
4194
+ if (seen.has(parent)) {
4195
+ row.parentId = void 0;
4196
+ break;
4197
+ }
4198
+ seen.add(parent);
4199
+ parent = byId.get(parent)?.parentId;
4200
+ }
4201
+ if (row.parentId && !byId.has(row.parentId)) row.parentId = void 0;
4202
+ if (row.parentId) {
4203
+ const siblings = children.get(row.parentId) ?? [];
4204
+ siblings.push(row);
4205
+ children.set(row.parentId, siblings);
4206
+ }
4207
+ }
4208
+ const total = Math.max(1, Number.isFinite(trace.totalMs) ? trace.totalMs : 1);
4209
+ const gap = resolutionMs ?? total / 900;
4210
+ const ordered_ = [];
4211
+ let agents = 0;
4212
+ const visit = (row, depth, tone) => {
4213
+ row.depth = depth;
4214
+ row.tone = row.kind === "pipeline" ? agents++ : tone;
4215
+ const kids = children.get(row.id) ?? [];
4216
+ row.hasChildren = kids.length > 0;
4217
+ ordered_.push(row);
4218
+ const marks = [];
4219
+ const own = row.span.promptTokens !== void 0 || row.span.completionTokens !== void 0 || row.span.cachedTokens !== void 0;
4220
+ let cost = row.span.costUsd ?? 0;
4221
+ let costKnown = row.span.kind !== "model" || row.span.costUsd !== void 0;
4222
+ for (const child of kids) {
4223
+ for (const mark of visit(child, depth + 1, row.tone)) marks.push(mark);
4224
+ row.descendants += 1 + child.descendants;
4225
+ if (child.kind === "pipeline") row.hasAgents = true;
4226
+ const childCost = child.hasChildren ? child.rollupCostUsd : child.span.costUsd;
4227
+ if (childCost === void 0) {
4228
+ if (child.kind === "model" || child.hasChildren) costKnown = false;
4229
+ } else cost += childCost;
4230
+ if (child.kind !== "pipeline" && child.kind !== "waiting" && ordered(child.span)) row.own.push(segmentOf(child));
4231
+ }
4232
+ Object.assign(row, stepStats(kids));
4233
+ const tokens = own ? {
4234
+ prompt: reportedCount(row.span.promptTokens),
4235
+ completion: reportedCount(row.span.completionTokens),
4236
+ cached: reportedCount(row.span.cachedTokens)
4237
+ } : sumTokens(kids);
4238
+ if (tokens) row.tokens = tokens;
4239
+ if (row.hasChildren && costKnown) row.rollupCostUsd = cost;
4240
+ if (row.hasChildren) {
4241
+ row.segments = mergeSegments(marks.map((mark) => ({ ...mark })), gap);
4242
+ row.own = mergeSegments(row.own, gap);
4243
+ }
4244
+ if (row.kind === "pipeline" || row.kind === "waiting" || !ordered(row.span)) return marks;
4245
+ marks.push(segmentOf(row));
4246
+ return marks;
4247
+ };
4248
+ for (const row of rows) if (!row.parentId) visit(row, 0, -1);
4249
+ return ordered_;
4250
+ }
4251
+ /** What a row's direct steps add up to; nothing when it has none. */
4252
+ function stepStats(steps) {
4253
+ let counts;
4254
+ const modelMs = [];
4255
+ for (const step of steps) {
4256
+ if (step.kind === "pipeline" || step.kind === "waiting" || !ordered(step.span)) continue;
4257
+ counts ??= {
4258
+ model: 0,
4259
+ tool: 0,
4260
+ failed: 0,
4261
+ retried: 0,
4262
+ tools: {}
4263
+ };
4264
+ if (!step.ok) counts.failed++;
4265
+ if (step.retry) counts.retried++;
4266
+ if (step.kind === "model") {
4267
+ counts.model++;
4268
+ if (!spanRunning(step.span)) modelMs.push(step.span.endMs - step.span.startMs);
4269
+ } else {
4270
+ counts.tool++;
4271
+ const tool = toolOf(step.name) || step.kind;
4272
+ counts.tools[tool] = (counts.tools[tool] ?? 0) + 1;
4273
+ }
4274
+ }
4275
+ return counts ? {
4276
+ counts,
4277
+ modelMs: modelMs.sort((a, b) => a - b)
4278
+ } : {};
4279
+ }
4280
+ /** Several rows' steps as one: a family's members or a folded run. */
4281
+ function mergeStats(rows) {
4282
+ let counts;
4283
+ for (const row of rows) {
4284
+ if (!row.counts) continue;
4285
+ counts ??= {
4286
+ model: 0,
4287
+ tool: 0,
4288
+ failed: 0,
4289
+ retried: 0,
4290
+ tools: {}
4291
+ };
4292
+ counts.model += row.counts.model;
4293
+ counts.tool += row.counts.tool;
4294
+ counts.failed += row.counts.failed;
4295
+ counts.retried += row.counts.retried;
4296
+ for (const [tool, n] of Object.entries(row.counts.tools)) counts.tools[tool] = (counts.tools[tool] ?? 0) + n;
4297
+ }
4298
+ const tokens = sumTokens(rows);
4299
+ return {
4300
+ ...counts ? {
4301
+ counts,
4302
+ modelMs: rows.flatMap((row) => row.modelMs ?? []).sort((a, b) => a - b)
4303
+ } : {},
4304
+ ...tokens ? { tokens } : {}
4305
+ };
4306
+ }
4307
+ function sumTokens(rows) {
4308
+ let out;
4309
+ const sources = rows.filter((row) => row.kind === "model" || row.tokens !== void 0);
4310
+ for (const key of [
4311
+ "prompt",
4312
+ "completion",
4313
+ "cached"
4314
+ ]) {
4315
+ const total = sumReportedCounts(sources.map((row) => row.tokens?.[key]));
4316
+ if (total !== void 0) (out ??= {})[key] = total;
4317
+ }
4318
+ return out;
4319
+ }
4320
+ function segmentOf(row) {
4321
+ return {
4322
+ startMs: row.span.startMs,
4323
+ endMs: spanRunning(row.span) ? Number.POSITIVE_INFINITY : row.span.endMs,
4324
+ kind: !row.ok ? "failed" : row.kind === "model" ? "model" : "tool",
4325
+ tone: row.tone,
4326
+ id: row.id,
4327
+ count: 1,
4328
+ retry: row.retry,
4329
+ name: row.name,
4330
+ tool: toolOf(row.name),
4331
+ ...row.span.costUsd === void 0 ? {} : { costUsd: row.span.costUsd },
4332
+ ...!row.ok && row.kind === "model" ? { modelCall: true } : {}
4333
+ };
4334
+ }
4335
+ /** The rows a search term matches by themselves, before ancestor context is added. */
4336
+ function searchMatchIds(rows, query, matchSpan) {
4337
+ const term = query.trim();
4338
+ const lower = term.toLowerCase();
4339
+ return new Set(rows.filter((row) => matchSpan ? matchSpan(row.span, term) : `${row.name} ${row.span.detail ?? ""} ${row.kind} ${row.ok ? "" : "failed"} ${row.span.status ?? ""}`.toLowerCase().includes(lower)).map((row) => row.id));
4340
+ }
4341
+ /** Search keeps ancestor context and deliberately reveals matches inside collapsed branches. */
4342
+ function visibleFlowWaterfallRows(rows, query, collapsed, matchSpan) {
4343
+ const byId = new Map(rows.map((row) => [row.id, row]));
4344
+ if (query.trim()) {
4345
+ const matching = /* @__PURE__ */ new Set();
4346
+ for (const id of searchMatchIds(rows, query, matchSpan)) {
4347
+ let cursor = byId.get(id);
4348
+ while (cursor && !matching.has(cursor.id)) {
4349
+ matching.add(cursor.id);
4350
+ cursor = cursor.parentId ? byId.get(cursor.parentId) : void 0;
4351
+ }
4352
+ }
4353
+ return rows.filter((row) => matching.has(row.id));
4354
+ }
4355
+ const hidden = /* @__PURE__ */ new Set();
4356
+ return rows.filter((row) => {
4357
+ const isHidden = row.parentId !== void 0 && (collapsed.has(row.parentId) || hidden.has(row.parentId));
4358
+ if (isHidden) hidden.add(row.id);
4359
+ return !isHidden;
4360
+ });
4361
+ }
4362
+ /** The leaf a reader should look at first: the longest completed or running non-agent step. */
4363
+ function slowestRow(rows, clockMs) {
4364
+ let best;
4365
+ let bestMs = -1;
4366
+ for (const row of rows) {
4367
+ if (row.hasChildren || row.kind === "pipeline" || row.kind === "waiting" || row.durationLabel === "—") continue;
4368
+ if (row.span.startMs > clockMs) continue;
4369
+ const ms = (spanRunning(row.span) ? Math.max(row.span.endMs, clockMs) : Math.min(row.span.endMs, clockMs)) - row.span.startMs;
4370
+ if (ms > bestMs) {
4371
+ best = row;
4372
+ bestMs = ms;
4373
+ }
4374
+ }
4375
+ return best;
4376
+ }
4377
+ /** The chain of steps that gates the trace's end: from each root, descend into the latest-ending child until a leaf; the root whose
4378
+ * chain ends last wins. Cutting latency anywhere else leaves the trace's end unchanged. */
4379
+ function criticalPathIds(rows) {
4380
+ const children = /* @__PURE__ */ new Map();
4381
+ for (const row of rows) {
4382
+ if (!row.parentId) continue;
4383
+ const siblings = children.get(row.parentId);
4384
+ if (siblings) siblings.push(row);
4385
+ else children.set(row.parentId, [row]);
4386
+ }
4387
+ let best;
4388
+ for (const root of rows) {
4389
+ if (root.parentId) continue;
4390
+ const chain = [];
4391
+ let end = root.span.endMs;
4392
+ for (let cursor = root; cursor;) {
4393
+ chain.push(cursor.id);
4394
+ end = Math.max(end, cursor.span.endMs);
4395
+ cursor = children.get(cursor.id)?.reduce((latest, child) => !latest || child.span.endMs > latest.span.endMs ? child : latest, void 0);
4396
+ }
4397
+ if (!best || end > best.end) best = {
4398
+ end,
4399
+ chain
4400
+ };
4401
+ }
4402
+ return new Set(best?.chain);
4403
+ }
4404
+ /** The agents a reader should look at first: the longest one by the clock, and the costliest when two or more are priced. */
4405
+ function agentCallouts(agents, clockMs) {
4406
+ let slowest, slowestMs = -1, costliest, top = -1, priced = 0, timed = 0;
4407
+ for (const row of agents) {
4408
+ if (row.durationLabel === "—" || row.span.startMs > clockMs || row.kind !== "pipeline" || row.hasAgents || row.id.startsWith("family:") || row.id.startsWith("run:")) continue;
4409
+ const ms = (spanRunning(row.span) ? Math.max(row.span.endMs, clockMs) : Math.min(row.span.endMs, clockMs)) - row.span.startMs;
4410
+ if (spanFact(row.span, "Ran for") === void 0) {
4411
+ timed += 1;
4412
+ if (ms > slowestMs) {
4413
+ slowest = row;
4414
+ slowestMs = ms;
4415
+ }
4416
+ }
4417
+ const cost = spanFact(row.span, "Cost") === void 0 ? row.span.costUsd ?? row.rollupCostUsd : void 0;
4418
+ if (typeof cost !== "number" || !Number.isFinite(cost)) continue;
4419
+ priced += 1;
4420
+ if (cost > top) {
4421
+ costliest = row;
4422
+ top = cost;
4423
+ }
4424
+ }
4425
+ return {
4426
+ slowestId: timed > 1 ? slowest?.id : void 0,
4427
+ costliestId: priced > 1 && top > 0 ? costliest?.id : void 0
4428
+ };
4429
+ }
4430
+ /** Busy time per agent row: the union of its own work. Their sum over wall time is the parallel speedup. */
4431
+ function busyMs(row, clockMs) {
4432
+ let total = 0, end = -Infinity;
4433
+ for (const mark of row.own) {
4434
+ const a = Math.max(mark.startMs, end), b = Math.min(mark.endMs, clockMs);
4435
+ if (b > a) total += b - a;
4436
+ end = Math.max(end, Math.min(mark.endMs, clockMs));
4437
+ }
4438
+ return total;
4439
+ }
4440
+ /** Complete per-span usage drives playback; authoritative call/error counts remain trace totals. */
4441
+ function totalsAt(trace, clockMs) {
4442
+ let cost = 0;
4443
+ let costs = false, counted = false;
4444
+ const tokens = [];
4445
+ for (const span of trace.spans) {
4446
+ if (span.startMs > clockMs) continue;
4447
+ const aggregate = span.meta?.["cli_bridge.usage.scope"] === "sum_of_children";
4448
+ if (span.endMs > clockMs) continue;
4449
+ if (span.costUsd !== void 0) {
4450
+ cost += span.costUsd;
4451
+ costs = true;
4452
+ }
4453
+ if (!aggregate && (span.kind === "model" || span.promptTokens !== void 0 || span.completionTokens !== void 0)) {
4454
+ tokens.push(sumReportedCounts([span.promptTokens, span.completionTokens]));
4455
+ counted ||= span.promptTokens !== void 0 || span.completionTokens !== void 0;
4456
+ }
4457
+ }
4458
+ return {
4459
+ costUsd: trace.costUsd === void 0 ? void 0 : costs ? cost : trace.costUsd,
4460
+ tokens: counted ? sumReportedCounts(tokens) : sumReportedCounts([trace.promptTokens, trace.completionTokens]),
4461
+ modelCalls: reportedCount(trace.modelCalls),
4462
+ toolCalls: reportedCount(trace.toolCalls),
4463
+ errors: reportedCount(trace.errors)
4464
+ };
4465
+ }
4466
+ /** The cost a reader can rely on: a lower bound when some calls are unpriced, a dash only when nothing is priced. */
4467
+ function costSummary(costUsd, trace) {
4468
+ costUsd = finiteNumber(costUsd);
4469
+ const billedUsd = finiteNumber(trace.billedUsd);
4470
+ const list = trace.costBasis === "list";
4471
+ const label = list ? "Cost · list price" : "Cost";
4472
+ if (costUsd === void 0) return billedUsd !== void 0 ? {
4473
+ value: `${formatCost(billedUsd)} billed`,
4474
+ title: "No list price for these calls; billed is the seat charge",
4475
+ label
4476
+ } : {
4477
+ value: "—",
4478
+ title: "No cost source: the harness recorded no cost and no price catalog was given",
4479
+ label
4480
+ };
4481
+ const coverage = trace.costCoverage;
4482
+ const partial = coverage !== void 0 && coverage.priced < coverage.total;
4483
+ const upper = !partial && trace.costBound === "upper";
4484
+ return {
4485
+ value: `${partial || trace.costBound === "lower" ? "≥" : upper ? "≤" : list ? "≈" : ""}${formatCost(costUsd)}${billedUsd !== void 0 ? ` · ${formatCost(billedUsd)} billed` : ""}`,
4486
+ title: [
4487
+ partial ? `${coverage.priced} of ${coverage.total} model calls priced` : coverage ? `all ${coverage.total} model calls priced` : "",
4488
+ list ? "at the model catalog list price; not a bill" : "",
4489
+ upper ? "cached input is not split out, so it is priced as fresh input: at most this" : "",
4490
+ trace.costBound === "lower" ? "a floor: the producer reports at least this" : "",
4491
+ billedUsd !== void 0 ? `billed ${formatCost(billedUsd)} (the seat charge)` : ""
4492
+ ].filter(Boolean).join("; "),
4493
+ label
4494
+ };
4495
+ }
4496
+ /** The role an agent plays: its name without a trailing counter ("memscale-engineer-3", "Subagent 2"). */
4497
+ const roleOf = (name) => name.replace(/[-\s]\d+$/, "");
4498
+ /**
4499
+ * Agents sharing a role fold into one family row until opened: a 17-agent run reads as its few roles, and the bar of a
4500
+ * family carries every member's work in each member's hue. Members follow their opened family, marked with `family`.
4501
+ */
4502
+ /** The families open by default: all of them when every agent fits in `rows`, so a reader sees each agent and its steps (the
4503
+ * blind reviews preferred agent rows to `role ×N`); none on bigger runs. `flipped` holds the families the reader toggled. */
4504
+ function defaultOpenFamilies(agents, rows, flipped) {
4505
+ const unfold = agents.length <= rows;
4506
+ const ids = agentFamilies(agents, /* @__PURE__ */ new Set()).filter((row) => row.id.startsWith("family:")).map((row) => row.id);
4507
+ return new Set(ids.filter((id) => unfold !== flipped.has(id)));
4508
+ }
4509
+ function agentFamilies(agents, open) {
4510
+ const groups = /* @__PURE__ */ new Map();
4511
+ for (const row of agents) {
4512
+ const key = row.parentId === void 0 ? `root:${row.id}` : roleOf(row.name);
4513
+ groups.set(key, [...groups.get(key) ?? [], row]);
4514
+ }
4515
+ const out = [];
4516
+ let next = 0;
4517
+ const hue = (row) => row.tone <= 0 || ++next > 5 ? 0 : 1 + [...roleOf(row.name)].reduce((hash, c) => hash * 31 + c.charCodeAt(0) >>> 0, 0) % 5;
4518
+ for (const [role, members] of groups) {
4519
+ if (members.length < 2) {
4520
+ const row = members[0], tone = hue(row);
4521
+ out.push({
4522
+ ...row,
4523
+ tone,
4524
+ own: row.own.map((mark) => ({
4525
+ ...mark,
4526
+ tone
4527
+ }))
4528
+ });
4529
+ continue;
4530
+ }
4531
+ const tone = hue(members[0]);
4532
+ const id = `family:${role}`;
4533
+ const startMs = Math.min(...members.map((row) => row.span.startMs));
4534
+ const endMs = Math.max(...members.map((row) => row.span.endMs));
4535
+ const running = members.some((row) => spanRunning(row.span));
4536
+ const known = members.map((row) => row.span.costUsd ?? (spanFact(row.span, "Cost") === void 0 ? row.rollupCostUsd : void 0)).filter((cost) => cost !== void 0 && Number.isFinite(cost));
4537
+ const failed = members.filter((row) => row.span.outcome ? row.span.outcome.tone === "failed" : !row.ok).length;
4538
+ const outcome = members.every((row) => row.span.outcome && row.span.outcome.tone === members[0].span.outcome?.tone && !row.span.outcome.ring === !members[0].span.outcome?.ring) ? members[0].span.outcome : void 0;
4539
+ const facts = members.flatMap((row) => (row.span.facts ?? []).filter(({ label }) => [
4540
+ "model",
4541
+ "model calls",
4542
+ "tool calls",
4543
+ "model latency",
4544
+ "failures",
4545
+ "retries"
4546
+ ].includes(label.toLowerCase()) || label.toLowerCase() === "tokens" && ![
4547
+ row.span.promptTokens,
4548
+ row.span.completionTokens,
4549
+ row.span.cachedTokens
4550
+ ].some(Number.isFinite) || label.toLowerCase() === "cost" && known.length === 0)).map(({ label }) => ({
4551
+ label,
4552
+ value: "Not recorded"
4553
+ }));
4554
+ out.push({
4555
+ costFloor: known.length < members.length || members.some((row) => row.costFloor),
4556
+ id,
4557
+ parentId: members[0].parentId,
4558
+ name: role,
4559
+ kind: "pipeline",
4560
+ durationLabel: formatSpanDuration(endMs - startMs),
4561
+ approx: members.some((row) => row.approx),
4562
+ ok: failed === 0,
4563
+ depth: 0,
4564
+ hasChildren: true,
4565
+ tone,
4566
+ outcomes: [...new Map(members.map((row) => {
4567
+ const state = row.span.outcome ?? {
4568
+ tone: "neutral",
4569
+ label: "Unknown",
4570
+ ring: true
4571
+ };
4572
+ return [`${state.label}:${state.tone}:${state.ring}`, state];
4573
+ })).values()],
4574
+ descendants: members.length,
4575
+ segments: [],
4576
+ retry: false,
4577
+ hasAgents: false,
4578
+ own: members.flatMap((row, i) => row.own.map((mark) => ({
4579
+ ...mark,
4580
+ tone,
4581
+ alt: i % 2 === 1
4582
+ }))).sort((a, b) => a.startMs - b.startMs),
4583
+ ...known.length ? { rollupCostUsd: known.reduce((sum, cost) => sum + cost, 0) } : {},
4584
+ ...mergeStats(members),
4585
+ span: {
4586
+ id,
4587
+ kind: "pipeline",
4588
+ name: role,
4589
+ startMs,
4590
+ endMs,
4591
+ activityAt: members.flatMap((row) => row.span.activityAt ?? row.own.flatMap((mark) => [mark.startMs, mark.endMs])),
4592
+ status: running ? "running" : failed ? "failed" : "done",
4593
+ ...outcome ? { outcome } : {},
4594
+ detail: members.every((row) => row.span.detail === members[0].span.detail) ? members[0].span.detail : void 0,
4595
+ facts,
4596
+ meta: {
4597
+ failedAgents: failed,
4598
+ costPartial: known.length < members.length,
4599
+ members: members.map((row) => row.id)
4600
+ }
4601
+ }
4602
+ });
4603
+ if (open.has(id)) out.push(...members.map((row, i) => ({
4604
+ ...row,
4605
+ family: id,
4606
+ inset: 1,
4607
+ tone,
4608
+ own: row.own.map((mark) => ({
4609
+ ...mark,
4610
+ tone,
4611
+ alt: i % 2 === 1
4612
+ }))
4613
+ })));
4614
+ }
4615
+ return out;
4616
+ }
4617
+ /** The second line of an agent row in parts: how it ended and how much it did (failed, 3 model calls, 412 tool calls; 6 agents, 4 failed).
4618
+ * The row shows the parts in order and drops the last ones whole when the line is full, never half a word. */
4619
+ function agentSummary(row) {
4620
+ if (row.id.startsWith("family:")) {
4621
+ const failed = Number(row.span.meta?.failedAgents ?? 0);
4622
+ return [`${row.descendants} agents`, ...failed ? [`${failed} failed`] : []];
4623
+ }
4624
+ if (row.id.startsWith("run:")) {
4625
+ const failed = row.own.filter((mark) => mark.kind === "failed").length;
4626
+ return [failed ? `${failed} failed` : "all done"];
4627
+ }
4628
+ const facts = new Map((row.span.facts ?? []).map(({ label, value }) => [label.toLowerCase(), value]));
4629
+ const calls = [[
4630
+ "Model calls",
4631
+ row.counts?.model,
4632
+ "model"
4633
+ ], [
4634
+ "Tool calls",
4635
+ row.counts?.tool,
4636
+ "tool"
4637
+ ]].map(([label, count, kind]) => facts.has(label.toLowerCase()) ? `${label}: ${facts.get(label.toLowerCase())}` : count ? `${count} ${kind} ${count === 1 ? "call" : "calls"}` : "");
4638
+ return [row.span.outcome?.label ?? (spanRunning(row.span) ? "running" : !row.ok ? "failed" : row.kind === "pipeline" ? "" : "done"), ...calls].filter(Boolean);
4639
+ }
4640
+ /**
4641
+ * The agent view's rows: families folded until opened, and an opened agent's own steps (its turns and tool calls, not its
4642
+ * child agents) nested beneath it with their icons, durations and costs, as a reader drills from the run into one agent.
4643
+ */
4644
+ function agentViewRows(agents, rows, openFamilies, openSteps) {
4645
+ const base = agentFamilies(agents, openFamilies);
4646
+ if (openSteps.size === 0) return base;
4647
+ const steps = /* @__PURE__ */ new Map();
4648
+ for (const row of rows) {
4649
+ if (row.parentId === void 0 || !openSteps.has(row.parentId) || row.kind === "pipeline") continue;
4650
+ steps.set(row.parentId, [...steps.get(row.parentId) ?? [], row]);
4651
+ }
4652
+ return base.flatMap((row) => openSteps.has(row.id) ? [row, ...stepRuns(steps.get(row.id) ?? []).map((step) => ({
4653
+ ...step,
4654
+ stepOf: row.id,
4655
+ inset: (row.inset ?? 0) + 1,
4656
+ tone: row.tone,
4657
+ own: step.own.map((mark) => ({
4658
+ ...mark,
4659
+ tone: row.tone
4660
+ }))
4661
+ }))] : [row]);
4662
+ }
4663
+ /** Three or more consecutive steps of one kind and name read as one row ("15 model calls · 4h"), each a mark in its bar. */
4664
+ function stepRuns(steps) {
4665
+ const out = [];
4666
+ for (let i = 0; i < steps.length;) {
4667
+ let j = i;
4668
+ while (j < steps.length && steps[j].kind === steps[i].kind && steps[j].name === steps[i].name) j++;
4669
+ const run = steps.slice(i, j);
4670
+ if (run.length < 3) {
4671
+ out.push(...run);
4672
+ i = j;
4673
+ continue;
4674
+ }
4675
+ const first = run[0];
4676
+ const startMs = Math.min(...run.map((step) => step.span.startMs));
4677
+ const endMs = Math.max(...run.map((step) => step.span.endMs));
4678
+ const failed = run.filter((step) => !step.ok).length;
4679
+ const costs = run.map((step) => step.span.costUsd ?? step.rollupCostUsd).filter((cost) => cost !== void 0);
4680
+ const noun = first.kind === "model" ? "model calls" : first.kind === "tool" ? `${first.name} calls` : `${first.name} steps`;
4681
+ out.push({
4682
+ ...first,
4683
+ id: `run:${first.id}`,
4684
+ name: `${run.length} ${noun}`,
4685
+ durationLabel: formatSpanDuration(endMs - startMs),
4686
+ ok: failed === 0,
4687
+ hasChildren: false,
4688
+ descendants: 0,
4689
+ segments: [],
4690
+ ...stepStats(run),
4691
+ tokens: sumTokens(run),
4692
+ own: run.map((step) => ({
4693
+ ...segmentOf(step),
4694
+ tone: first.tone
4695
+ })),
4696
+ ...costs.length ? { rollupCostUsd: costs.reduce((sum, cost) => sum + cost, 0) } : {},
4697
+ span: {
4698
+ ...first.span,
4699
+ id: `run:${first.id}`,
4700
+ name: `${run.length} ${noun}`,
4701
+ startMs,
4702
+ endMs,
4703
+ status: failed ? "failed" : first.span.status,
4704
+ costUsd: void 0
4705
+ }
4706
+ });
4707
+ i = j;
4708
+ }
4709
+ return out;
4710
+ }
4711
+ /** A row as the view draws it: its drawn copy, or for a member of a folded family, itself in the family's hue. */
4712
+ function drawnRow(row, visible) {
4713
+ const drawn = visible.find((item) => item.id === row.id);
4714
+ if (drawn) return drawn;
4715
+ const family = visible.find((item) => (item.span.meta?.members)?.includes(row.id));
4716
+ return family ? {
4717
+ ...row,
4718
+ tone: family.tone
4719
+ } : row;
4720
+ }
4721
+ /** A row's cost as printed: "≥" when it is a floor. */
4722
+ const rowCostText = (row, cost) => spanFact(row.span, "Cost") ?? (cost === void 0 ? "" : `${row.costFloor ? "≥" : ""}${formatCost(cost)}`);
4723
+ /** Quiet is elapsed silence beyond both five minutes and three median event gaps. */
4724
+ function quietActivity(row, now) {
4725
+ const times = [...row.span.activityAt ?? row.own.flatMap((mark) => [mark.startMs, mark.endMs])].filter(Number.isFinite).sort((a, b) => a - b);
4726
+ const last = times.at(-1) ?? NaN;
4727
+ const gaps = times.slice(1).map((at, i) => at - times[i]).sort((a, b) => a - b);
4728
+ const middle = Math.floor(gaps.length / 2);
4729
+ const observedMedian = gaps.length ? gaps.length % 2 ? gaps[middle] : (gaps[middle - 1] + gaps[middle]) / 2 : 0;
4730
+ const supplied = row.span.medianEventGapMs;
4731
+ const gap = quietGap(last, typeof supplied === "number" && Number.isFinite(supplied) && supplied >= 0 ? supplied : observedMedian, now);
4732
+ return {
4733
+ last,
4734
+ ...gap,
4735
+ quiet: spanRunning(row.span) && gap.quiet
4736
+ };
4737
+ }
4738
+ /** The same elapsed-activity rule for graph cards and waterfall rows. */
4739
+ function quietGap(last, median, now) {
4740
+ const quietMs = Number.isFinite(last) ? Math.max(0, now - last) : 0;
4741
+ return {
4742
+ quietMs,
4743
+ quiet: Number.isFinite(last) && quietMs > Math.max(3e5, 3 * median)
4744
+ };
4745
+ }
4746
+ //#endregion
4747
+ export { visibleFlowWaterfallRows as C, statusMeta as D, runStatus as E, createLucideIcon as O, totalsAt as S, RunStatusIcon as T, slowestRow as _, costSummary as a, spanRunning as b, drawnRow as c, formatCount as d, formatSpanDuration as f, searchMatchIds as g, rowCostText as h, busyMs as i, flowWaterfallRows as l, quietGap as m, agentSummary as n, criticalPathIds as o, quietActivity as p, agentViewRows as r, defaultOpenFamilies as s, agentCallouts as t, formatCost as u, spanFact as v, workKind as w, toneKey as x, spanFailed as y };