@alikhalilll/a-skeleton 1.0.0

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