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